@silmaril-security/sdk 0.8.0 → 0.8.1

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 CHANGED
@@ -1,5 +1,14 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.8.1
4
+
5
+ - Preserve native thread defaults and config factories on runnables configured
6
+ before `protectLangChainRunnable()`. Install the protection boundary inside
7
+ existing native bindings so defaults, invocation overrides, callbacks and
8
+ config factories resolve once before conversation identity is captured.
9
+ - Verify pre-bound invoke, batch and streaming behavior and native override
10
+ precedence in source tests and the built ESM/CJS package release gate.
11
+
3
12
  ## 0.8.0
4
13
 
5
14
  - Use each invocation’s native framework thread ID for LangChain, LangGraph,
package/README.md CHANGED
@@ -34,10 +34,10 @@ This SDK is distributed as an npm package.
34
34
  npm install @silmaril-security/sdk
35
35
  ```
36
36
 
37
- After publication, pin version 0.8.0 for reproducible installs:
37
+ After publication, pin version 0.8.1 for reproducible installs:
38
38
 
39
39
  ```sh
40
- npm install @silmaril-security/sdk@0.8.0
40
+ npm install @silmaril-security/sdk@0.8.1
41
41
  ```
42
42
 
43
43
  Requires Node 20 or later.
@@ -610,8 +610,9 @@ await model.invoke("A different conversation", { configurable: { thread_id: "con
610
610
  ```
611
611
 
612
612
  The wrapper captures the actual native config for each invocation, including
613
- per-item batch configs, streams, and child calls with their own thread override.
614
- Caller callbacks are preserved. Bind model tools before wrapping; this generic
613
+ preconfigured runnable defaults, per-item batch configs, streams, and child calls
614
+ with their own thread override. Existing native config factories run once before
615
+ identity is captured. Caller callbacks are preserved. Bind model tools before wrapping; this generic
615
616
  runnable wrapper does not expose model-specific methods such as `bindTools()`.
616
617
  Use the protected constructor below for Deep Agents.
617
618
 
@@ -696,7 +697,7 @@ Classification errors allow model and tool execution by default; set
696
697
  `silmaril: { failOpen: false }` to require a successful classification. Already
697
698
  emitted streaming text cannot be recalled.
698
699
 
699
- ## Migrating to 0.8.0
700
+ ## Migrating to 0.8.1
700
701
 
701
702
  Remove `conversationId` / `conversation_id` from LangChain handler options and
702
703
  Deep Agents `silmaril` middleware options. These removed options raise a
@@ -755,6 +756,6 @@ IDs must be non-empty; MCP tools also require their canonical server parent ID.
755
756
  The compatibility metadata copy remains attribution only. Caller agent metadata
756
757
  does not supply an authenticated principal.
757
758
 
758
- This source prepares version 0.8.0. Its registry install command becomes
759
+ This source prepares version 0.8.1. Its registry install command becomes
759
760
  available after the authorized main-branch release workflow publishes the package.
760
761
  Confirm registry publication before installing this version.
@@ -693,7 +693,34 @@ async function protectLangChainRunnable(firewall, runnable, options = {}) {
693
693
  });
694
694
  }
695
695
  }
696
- return new ProtectedBinding({ bound: runnable, config: {}, configFactories });
696
+ const bindings = /* @__PURE__ */ new Set();
697
+ const installBoundary = (candidate) => {
698
+ if (!RunnableBinding.isRunnableBinding(candidate)) {
699
+ return new ProtectedBinding({ bound: candidate, config: {}, configFactories });
700
+ }
701
+ if (bindings.has(candidate)) throw new TypeError("Cannot protect cyclic runnable bindings");
702
+ bindings.add(candidate);
703
+ const binding = candidate;
704
+ const Binding = binding.constructor;
705
+ return new Binding({ ...binding, bound: installBoundary(binding.bound) });
706
+ };
707
+ class ComposableBinding extends RunnableBinding {
708
+ withConfig(config) {
709
+ return new ComposableBinding({ bound: this.bound, config: mergeConfigs(this.config, config) });
710
+ }
711
+ withListeners(fields) {
712
+ return new RunnableBinding({ bound: this, config: {} }).withListeners(fields);
713
+ }
714
+ withRetry(fields) {
715
+ return new RunnableRetry({
716
+ bound: this,
717
+ config: {},
718
+ ...fields?.stopAfterAttempt === void 0 ? {} : { maxAttemptNumber: fields.stopAfterAttempt },
719
+ ...fields?.onFailedAttempt === void 0 ? {} : { onFailedAttempt: fields.onFailedAttempt }
720
+ });
721
+ }
722
+ }
723
+ return new ComposableBinding({ bound: installBoundary(runnable), config: {} });
697
724
  }
698
725
  // Annotate the CommonJS export names for ESM import in node:
699
726
  0 && (module.exports = {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/adapters/langchain.ts","../../src/exceptions.ts","../../src/hooks.ts","../../src/modes.ts","../../src/utils/extract.ts","../../src/adapters/thread-identity.ts"],"sourcesContent":["// Copyright (c) 2024-2025 Silmaril Security Inc. All rights reserved.\n// PROPRIETARY AND CONFIDENTIAL\n\nimport type { Runnable, RunnableBinding as RunnableBindingType, RunnableConfig } from \"@langchain/core/runnables\";\nimport type { Serialized } from \"@langchain/core/load/serializable\";\nimport type { BaseTracer as BaseTracerType, Run } from \"@langchain/core/tracers/base\";\nimport type { BaseCallbackHandler } from \"@langchain/core/callbacks/base\";\n\nimport type { Firewall } from \"../firewall.js\";\nimport {\n FirewallBlockedException,\n isReviewCompatibilityError,\n} from \"../exceptions.js\";\nimport {\n FIREWALL_HOOK_TO_LABEL,\n FirewallHook,\n HookLabel,\n resolveHooks,\n} from \"../hooks.js\";\nimport type { BlockResult, ClassifyEvent, LangChainAdapterOptions } from \"../types.js\";\nimport { validateMode } from \"../modes.js\";\nimport {\n extractTextFromDocuments,\n extractTextFromLLMResult,\n extractTextFromPrompts,\n extractTextFromToolInput,\n} from \"../utils/extract.js\";\n\nimport { rejectConversationOptions, RunThreadIdentity, validThreadId } from \"./thread-identity.js\";\n\nconst handlerCleanups = new WeakMap<object, () => void>();\n\nconst USER_ROLES: ReadonlySet<string> = new Set([\"human\", \"user\"]);\n\ninterface LangChainDucktypedMessage {\n role?: string;\n type?: string;\n getType?: () => string;\n _getType?: () => string;\n content?: string | ReadonlyArray<string | { type?: string; text?: string }>;\n}\n\nfunction getMessageRole(message: LangChainDucktypedMessage): string {\n if (typeof message.role === \"string\") {\n return message.role.toLowerCase();\n }\n if (typeof message.type === \"string\") {\n return message.type.toLowerCase();\n }\n const legacyType = message.getType?.() ?? message._getType?.();\n return typeof legacyType === \"string\" ? legacyType.toLowerCase() : \"\";\n}\n\nfunction extractMessageText(content: LangChainDucktypedMessage[\"content\"]): string {\n if (content === undefined) {\n return \"\";\n }\n if (typeof content === \"string\") {\n return content;\n }\n const parts: string[] = [];\n for (const block of content) {\n if (typeof block === \"string\") {\n parts.push(block);\n } else if (block && block.type === \"text\") {\n parts.push(block.text ?? \"\");\n }\n }\n return parts.join(\" \");\n}\n\nfunction findLastUserMessage(\n messages: ReadonlyArray<LangChainDucktypedMessage>,\n): LangChainDucktypedMessage | undefined {\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i]!;\n if (USER_ROLES.has(getMessageRole(msg))) {\n return msg;\n }\n }\n return undefined;\n}\n\nexport async function createLangChainHandler(\n firewall: Firewall,\n options: LangChainAdapterOptions = {},\n): Promise<BaseCallbackHandler> {\n return buildLangChainHandler(firewall, options);\n}\n\nasync function buildLangChainHandler(\n firewall: Firewall, options: LangChainAdapterOptions,\n boundIdentity?: { threadId: string | undefined },\n): Promise<BaseCallbackHandler> {\n rejectConversationOptions(options);\n const { ensureConfig } = await import(\"@langchain/core/runnables\");\n const threads = new RunThreadIdentity(boundIdentity, () => ensureConfig());\n const { BaseTracer } = await import(\"@langchain/core/tracers/base\");\n let finishRun = (runId: string): void => { threads.finish(runId); };\n\n const enabledHooks = resolveHooks(options.hooks);\n // includeSystem remains inert for the user-only chat-model scan.\n // includeTool still controls the explicit tool start and end callbacks.\n const includeTool = options.includeTool ?? true;\n const failOpen = options.failOpen ?? true;\n const logger =\n options.logger ??\n ((message: string, error: unknown): void => {\n // eslint-disable-next-line no-console\n console.warn(`silmaril.firewall: ${message}`, error);\n });\n const requestedMode = validateMode(options.mode) ?? (\n options.shadowMode === undefined\n ? firewall.mode\n : options.shadowMode ? \"shadow\" : \"block\"\n );\n const onClassify = options.onClassify;\n\n const fireOnClassify = (event: ClassifyEvent): void => {\n if (!onClassify) {\n return;\n }\n try {\n onClassify(event);\n } catch (err) {\n logger(\"onClassify callback threw\", err);\n }\n };\n\n const classifyEvent = async (\n text: string,\n hookLabel: HookLabel,\n runId: string,\n toolName?: string,\n ): Promise<void> => {\n let result: BlockResult;\n try {\n result = await firewall.classify(text, {\n hook: hookLabel,\n metadata: {\n langgraph: { run_id: runId },\n ...(threads.get(runId) === undefined ? {} : { conversationId: threads.get(runId) }),\n },\n ...(requestedMode !== undefined ? { mode: requestedMode } : {}),\n ...(toolName !== undefined ? { toolName } : {}),\n });\n } catch (err) {\n if (isReviewCompatibilityError(err)) {\n throw err;\n }\n if (!failOpen) {\n throw err;\n }\n logger(\"classification failed, allowing prompt through\", err);\n return;\n }\n const threshold = result.threshold;\n const blocked = result.prediction === \"MALICIOUS\" || result.governance?.action === \"block\";\n const effectiveMode = requestedMode ?? result.mode ?? \"block\";\n const commonEventFields = {\n hook: hookLabel,\n ...(toolName !== undefined ? { toolName } : {}),\n runId,\n text,\n result,\n };\n fireOnClassify({\n ...commonEventFields,\n blocked,\n mode: effectiveMode,\n shadowMode: effectiveMode === \"shadow\",\n });\n if (!blocked || effectiveMode !== \"block\") {\n return;\n }\n\n throw new FirewallBlockedException({\n score: result.score,\n threshold,\n promptText: text,\n runId,\n hook: hookLabel,\n ...(toolName !== undefined ? { toolName } : {}),\n result,\n });\n };\n\n const classify = async (text: string, hook: HookLabel, runId: string, toolName?: string): Promise<void> => {\n try {\n await classifyEvent(text, hook, runId, toolName);\n } catch (error) {\n finishRun(runId);\n throw error;\n }\n };\n\n function serialized(value: unknown, name: string): Serialized {\n if (value && typeof value === \"object\" && \"id\" in value && Array.isArray(value.id)) return value as Serialized;\n return { lc: 1, type: \"not_implemented\", id: [name] };\n }\n\n class SilmarilFirewallHandler extends BaseTracer {\n override name = \"silmaril_firewall_handler\";\n override raiseError = true;\n override awaitHandlers = true;\n\n // LangChain clears runnable context inside ordinary callbacks. Its synchronous\n // tracer pre-start hooks capture native config before that boundary. Runs are\n // memory-only and every terminal path discards both native tracer maps.\n protected override async persistRun(): Promise<void> {}\n protected override getRunById(runId?: string): Run | undefined {\n return runId === undefined ? undefined : this.runMap.get(runId);\n }\n\n // Only lifecycle identity is needed. Do not retain prompts, outputs, token\n // events, or completed children when upstream omits a cancellation callback.\n override _addRunToRunMap(run: Run) {\n return super._addRunToRunMap({ ...run, inputs: {}, extra: {}, serialized: {},\n tags: [], child_runs: [], events: [],\n });\n }\n protected override _addChildRun(): void {}\n protected override async _endTrace(run: Run): Promise<void> {\n try { await super._endTrace(run); } finally {\n run.inputs = {};\n delete run.outputs;\n delete run.error;\n run.extra = {};\n run.events = [];\n run.child_runs = [];\n }\n }\n override async handleText(): Promise<void> {}\n override async handleAgentAction(): Promise<void> {}\n override async handleAgentEnd(): Promise<void> {}\n override async handleLLMNewToken(_token: string, _idx: unknown, runId: string): Promise<Run> {\n return this.getRunById(runId) ?? this._createRunForLLMStart(serialized(undefined, \"llm\"), [], runId);\n }\n\n capture(runId: string, parentRunId?: string, metadata?: unknown): void {\n for (const id of threads.start(runId, parentRunId, metadata)) {\n this.runMap.delete(id);\n this.runTreeMap?.delete(id);\n }\n }\n\n finishAll(): void {\n for (const id of [...this.runMap.keys()]) this.finishRun(id);\n this.runTreeMap?.clear();\n }\n\n finishRun(runId: string): void {\n for (const id of threads.finish(runId)) {\n this.runMap.delete(id);\n this.runTreeMap?.delete(id);\n }\n }\n\n override _createRunForLLMStart(...args: Parameters<BaseTracerType[\"_createRunForLLMStart\"]>) {\n this.capture(args[2], args[3], args[6]);\n return super._createRunForLLMStart(...args);\n }\n\n override _createRunForChatModelStart(...args: Parameters<BaseTracerType[\"_createRunForChatModelStart\"]>) {\n this.capture(args[2], args[3], args[6]);\n return super._createRunForChatModelStart(...args);\n }\n\n override _createRunForChainStart(...args: Parameters<BaseTracerType[\"_createRunForChainStart\"]>) {\n this.capture(args[2], args[3], args[5]);\n return super._createRunForChainStart(...args);\n }\n\n override _createRunForToolStart(...args: Parameters<BaseTracerType[\"_createRunForToolStart\"]>) {\n this.capture(args[2], args[3], args[5]);\n return super._createRunForToolStart(...args);\n }\n\n override _createRunForRetrieverStart(...args: Parameters<BaseTracerType[\"_createRunForRetrieverStart\"]>) {\n this.capture(args[2], args[3], args[5]);\n return super._createRunForRetrieverStart(...args);\n }\n\n override async handleChatModelStart(\n llm: unknown, messages: unknown, runId: string, parentRunId?: string,\n extraParams?: Record<string, unknown>, tags?: string[], metadata?: Record<string, unknown>,\n ): Promise<Run> {\n const batches = messages as ReadonlyArray<ReadonlyArray<LangChainDucktypedMessage>>;\n const run = this.getRunById(runId) ?? this._createRunForChatModelStart(\n serialized(llm, \"chat_model\"), messages as Parameters<BaseTracerType[\"_createRunForChatModelStart\"]>[1], runId,\n parentRunId, extraParams, tags, metadata,\n );\n if (enabledHooks.has(FirewallHook.CHAT_MODEL_START)) {\n const lastUser = findLastUserMessage(batches.flat());\n const text = lastUser ? extractMessageText(lastUser.content).trim() : \"\";\n if (text) await classify(text, FIREWALL_HOOK_TO_LABEL[FirewallHook.CHAT_MODEL_START], runId);\n }\n return run;\n }\n\n override async handleLLMStart(\n llm: unknown, prompts: string[], runId: string, parentRunId?: string,\n extraParams?: Record<string, unknown>, tags?: string[], metadata?: Record<string, unknown>,\n ): Promise<Run> {\n const run = this.getRunById(runId) ?? this._createRunForLLMStart(\n serialized(llm, \"llm\"), prompts, runId, parentRunId, extraParams, tags, metadata,\n );\n if (enabledHooks.has(FirewallHook.LLM_START)) {\n const text = extractTextFromPrompts(prompts);\n if (text) await classify(text, FIREWALL_HOOK_TO_LABEL[FirewallHook.LLM_START], runId);\n }\n return run;\n }\n\n override async handleToolStart(\n tool: { name?: string } | undefined, inputStr: string, runId: string, parentRunId?: string,\n tags?: string[], metadata?: Record<string, unknown>,\n ): Promise<Run> {\n const run = this.getRunById(runId) ?? this._createRunForToolStart(\n serialized(tool, tool?.name ?? \"tool\"), inputStr, runId, parentRunId, tags, metadata,\n );\n if (includeTool && enabledHooks.has(FirewallHook.TOOL_START)) {\n const text = extractTextFromToolInput(inputStr);\n if (text) await classify(text, FIREWALL_HOOK_TO_LABEL[FirewallHook.TOOL_START], runId, tool?.name);\n }\n return run;\n }\n\n override async handleRetrieverStart(\n retriever: unknown, query: string, runId: string, parentRunId?: string,\n tags?: string[], metadata?: Record<string, unknown>,\n ): Promise<Run> {\n const run = this.getRunById(runId) ?? this._createRunForRetrieverStart(\n serialized(retriever, \"retriever\"), query, runId, parentRunId, tags, metadata,\n );\n if (enabledHooks.has(FirewallHook.RETRIEVER_START) && query.trim()) {\n await classify(query.trim(), FIREWALL_HOOK_TO_LABEL[FirewallHook.RETRIEVER_START], runId);\n }\n return run;\n }\n\n override async handleLLMEnd(output: unknown, runId: string): Promise<Run> {\n try {\n if (!this.getRunById(runId)) this._createRunForLLMStart(serialized(undefined, \"llm\"), [], runId);\n if (enabledHooks.has(FirewallHook.LLM_END)) {\n const text = extractTextFromLLMResult(output as Parameters<typeof extractTextFromLLMResult>[0]);\n if (text) await classify(text, FIREWALL_HOOK_TO_LABEL[FirewallHook.LLM_END], runId);\n }\n return await super.handleLLMEnd(output as Parameters<BaseTracerType[\"handleLLMEnd\"]>[0], runId);\n } finally {\n finishRun(runId);\n }\n }\n\n override async handleToolEnd(\n output: unknown, runId: string, _parentRunId?: string, _tags?: string[], kwargs?: { name?: string },\n ): Promise<Run> {\n try {\n if (!this.getRunById(runId)) this._createRunForToolStart(serialized(undefined, \"tool\"), \"\", runId);\n if (includeTool && enabledHooks.has(FirewallHook.TOOL_END)) {\n const text = String(output).trim();\n if (text) await classify(text, FIREWALL_HOOK_TO_LABEL[FirewallHook.TOOL_END], runId, kwargs?.name);\n }\n return await super.handleToolEnd(output, runId);\n } finally {\n finishRun(runId);\n }\n }\n\n override async handleRetrieverEnd(documents: ReadonlyArray<{ pageContent?: string }>, runId: string): Promise<Run> {\n try {\n if (!this.getRunById(runId)) this._createRunForRetrieverStart(serialized(undefined, \"retriever\"), \"\", runId);\n if (enabledHooks.has(FirewallHook.RETRIEVER_END)) {\n const text = extractTextFromDocuments(documents);\n if (text) await classify(text, FIREWALL_HOOK_TO_LABEL[FirewallHook.RETRIEVER_END], runId);\n }\n return await super.handleRetrieverEnd(documents as Parameters<BaseTracerType[\"handleRetrieverEnd\"]>[0], runId);\n } finally {\n finishRun(runId);\n }\n }\n\n override async handleChainStart(\n chain: unknown, inputs: Record<string, unknown>, runId: string, parentRunId?: string,\n tags?: string[], metadata?: Record<string, unknown>, runType?: string, name?: string,\n ): Promise<Run> {\n return super.handleChainStart(serialized(chain, \"chain\"), inputs, runId, parentRunId, tags, metadata, runType, name);\n }\n\n override async handleChainEnd(...args: Parameters<BaseTracerType[\"handleChainEnd\"]>): Promise<Run> {\n if (!this.getRunById(args[1])) this._createRunForChainStart(serialized(undefined, \"chain\"), {}, args[1]);\n try { return await super.handleChainEnd(...args); } finally { finishRun(args[1]); }\n }\n\n override async handleChainError(...args: Parameters<BaseTracerType[\"handleChainError\"]>): Promise<Run> {\n if (!this.getRunById(args[1])) this._createRunForChainStart(serialized(undefined, \"chain\"), {}, args[1]);\n try { return await super.handleChainError(...args); } finally { finishRun(args[1]); }\n }\n\n override async handleLLMError(...args: Parameters<BaseTracerType[\"handleLLMError\"]>): Promise<Run> {\n if (!this.getRunById(args[1])) this._createRunForLLMStart(serialized(undefined, \"llm\"), [], args[1]);\n try { return await super.handleLLMError(...args); } finally { finishRun(args[1]); }\n }\n\n override async handleToolError(...args: Parameters<BaseTracerType[\"handleToolError\"]>): Promise<Run> {\n if (!this.getRunById(args[1])) this._createRunForToolStart(serialized(undefined, \"tool\"), \"\", args[1]);\n try { return await super.handleToolError(...args); } finally { finishRun(args[1]); }\n }\n\n override async handleRetrieverError(...args: Parameters<BaseTracerType[\"handleRetrieverError\"]>): Promise<Run> {\n if (!this.getRunById(args[1])) this._createRunForRetrieverStart(serialized(undefined, \"retriever\"), \"\", args[1]);\n try { return await super.handleRetrieverError(...args); } finally { finishRun(args[1]); }\n }\n }\n\n const handler = new SilmarilFirewallHandler();\n finishRun = (runId: string): void => { handler.finishRun(runId); };\n handlerCleanups.set(handler, () => handler.finishAll());\n return handler;\n}\n\n\n/** Protect a runnable using its actual invocation config, including direct model/tool calls. */\nexport async function protectLangChainRunnable<RunInput, RunOutput, CallOptions extends RunnableConfig = RunnableConfig>(\n firewall: Firewall,\n runnable: Runnable<RunInput, RunOutput, CallOptions>,\n options: LangChainAdapterOptions = {},\n): Promise<RunnableBindingType<RunInput, RunOutput, CallOptions>> {\n rejectConversationOptions(options);\n const { RunnableBinding, RunnableRetry, ensureConfig, mergeConfigs } = await import(\"@langchain/core/runnables\");\n const { IterableReadableStream } = await import(\"@langchain/core/utils/stream\");\n const configFactories = [async (config: RunnableConfig): Promise<RunnableConfig> => {\n const effective = ensureConfig(config);\n const handler = await buildLangChainHandler(firewall, options, {\n threadId: validThreadId(effective.configurable?.thread_id),\n });\n return { callbacks: [handler] };\n }];\n // Upstream withConfig/withRetry reconstruct a binding without its factories.\n // Retain ours so normal runnable composition cannot drop protection.\n class ProtectedBinding extends RunnableBinding<RunInput, RunOutput, CallOptions> {\n async scopedConfig(...configs: Parameters<RunnableBindingType<RunInput, RunOutput, CallOptions>[\"_mergeConfig\"]>) {\n const created: BaseCallbackHandler[] = [];\n const scopedFactories = configFactories.map((factory) => async (config: RunnableConfig) => {\n const update = await factory(config);\n // This factory returns exactly its fresh handler. Never dispose inherited\n // caller/parent handlers from a merged callback manager.\n if (Array.isArray(update.callbacks)) created.push(...update.callbacks as BaseCallbackHandler[]);\n return update;\n });\n const scoped = new RunnableBinding({ bound: this.bound, config: this.config, configFactories: scopedFactories });\n const config = await scoped._mergeConfig(...configs);\n return { config, dispose: () => { for (const handler of created) handlerCleanups.get(handler)?.(); } };\n }\n override async invoke(input: RunInput, options?: Partial<CallOptions>): Promise<RunOutput> {\n const scoped = await this.scopedConfig(options, this.kwargs);\n try { return await this.bound.invoke(input, scoped.config); } finally { scoped.dispose(); }\n }\n override async stream(input: RunInput, options?: Partial<CallOptions>) {\n const scoped = await this.scopedConfig(ensureConfig(options as RunnableConfig | undefined), this.kwargs);\n let upstream;\n try { upstream = await this.bound.stream(input, scoped.config); } catch (error) { scoped.dispose(); throw error; }\n const managed = async function* () {\n try { yield* upstream; } finally { scoped.dispose(); }\n };\n return IterableReadableStream.fromAsyncGenerator(managed());\n }\n override async *_streamIterator(input: RunInput, options?: Partial<CallOptions>) {\n const stream = await this.stream(input, options);\n yield* stream;\n }\n override withConfig(config: Partial<CallOptions>) {\n return new ProtectedBinding({ bound: this.bound, config: mergeConfigs(this.config, config as RunnableConfig), configFactories });\n }\n override withListeners(fields: Parameters<RunnableBindingType<RunInput, RunOutput, CallOptions>[\"withListeners\"]>[0]): ReturnType<RunnableBindingType<RunInput, RunOutput, CallOptions>[\"withListeners\"]> {\n return new RunnableBinding({ bound: this, config: {} }).withListeners(fields);\n }\n override withRetry(fields?: Parameters<RunnableBindingType<RunInput, RunOutput, CallOptions>[\"withRetry\"]>[0]): ReturnType<RunnableBindingType<RunInput, RunOutput, CallOptions>[\"withRetry\"]> {\n return new RunnableRetry({ bound: this, config: {},\n ...(fields?.stopAfterAttempt === undefined ? {} : { maxAttemptNumber: fields.stopAfterAttempt }),\n ...(fields?.onFailedAttempt === undefined ? {} : { onFailedAttempt: fields.onFailedAttempt }),\n });\n }\n }\n return new ProtectedBinding({ bound: runnable, config: {}, configFactories });\n}\n","// Copyright (c) 2024-2025 Silmaril Security Inc. All rights reserved.\n// PROPRIETARY AND CONFIDENTIAL\n\nimport type { HookLabel } from \"./hooks.js\";\nimport type { BlockResult, ReviewLevel } from \"./types.js\";\n\nconst MAX_PROMPT_DISPLAY_LEN = 100;\n\nexport interface MalformedInputDetails {\n field?: string;\n inputIndex?: number;\n charOffset?: number;\n malformedToken?: string;\n codePoint?: string;\n reason?: string;\n}\n\nexport class FirewallBlockedException extends Error {\n readonly score: number;\n readonly threshold: number;\n readonly promptText: string;\n readonly runId: string | undefined;\n readonly hook: HookLabel | undefined;\n readonly toolName: string | undefined;\n readonly toolCallId: string | undefined;\n readonly result: BlockResult | undefined;\n\n constructor(params: {\n score: number;\n threshold: number;\n promptText: string;\n runId?: string;\n hook?: HookLabel;\n toolName?: string;\n toolCallId?: string;\n result?: BlockResult;\n }) {\n super(FirewallBlockedException.formatMessage(params));\n this.name = \"FirewallBlockedException\";\n this.score = params.score;\n this.threshold = params.threshold;\n this.promptText = params.promptText;\n this.runId = params.runId;\n this.hook = params.hook;\n this.toolName = params.toolName;\n this.toolCallId = params.toolCallId;\n this.result = params.result;\n Object.setPrototypeOf(this, FirewallBlockedException.prototype);\n }\n\n private static formatMessage(params: {\n score: number;\n threshold: number;\n promptText: string;\n result?: BlockResult;\n }): string {\n const truncated =\n params.promptText.length > MAX_PROMPT_DISPLAY_LEN\n ? `${params.promptText.slice(0, MAX_PROMPT_DISPLAY_LEN)}...`\n : params.promptText;\n if (\n params.result?.prediction !== \"MALICIOUS\" &&\n params.result?.governance?.action === \"block\"\n ) {\n return `Request blocked by Silmaril Firewall governance policy: '${truncated}'`;\n }\n return (\n `Request blocked by Silmaril Firewall ` +\n `(score=${params.score.toFixed(4)}, threshold=${params.threshold.toFixed(4)}): ` +\n `'${truncated}'`\n );\n }\n}\n\n/** @deprecated Use FirewallBlockedException instead. */\nexport const PromptBlockedException = FirewallBlockedException;\n/** @deprecated Use FirewallBlockedException instead. */\nexport type PromptBlockedException = FirewallBlockedException;\n\nconst REVIEW_COMPATIBILITY_ERROR_BRAND = Symbol.for(\n \"@silmaril-security/sdk/ReviewCompatibilityError\",\n);\n\nexport class ReviewCompatibilityError extends Error {\n readonly requestedReview: ReviewLevel;\n readonly acknowledgedReview: unknown;\n\n constructor(requestedReview: ReviewLevel, acknowledgedReview: unknown) {\n const detail = acknowledgedReview === undefined\n ? \"the response omitted its acknowledgement\"\n : \"the response acknowledgement did not match\";\n super(`Silmaril review compatibility error: ${detail} for requested ${requestedReview} review`);\n this.name = \"ReviewCompatibilityError\";\n this.requestedReview = requestedReview;\n this.acknowledgedReview = acknowledgedReview;\n Object.defineProperty(this, REVIEW_COMPATIBILITY_ERROR_BRAND, {\n value: true,\n enumerable: false,\n configurable: false,\n writable: false,\n });\n Object.setPrototypeOf(this, ReviewCompatibilityError.prototype);\n }\n}\n\nexport function isReviewCompatibilityError(error: unknown): error is ReviewCompatibilityError {\n if ((typeof error !== \"object\" && typeof error !== \"function\") || error === null) {\n return false;\n }\n try {\n return Object.getOwnPropertyDescriptor(\n error,\n REVIEW_COMPATIBILITY_ERROR_BRAND,\n )?.value === true;\n } catch {\n return false;\n }\n}\n\nexport class SilmarilApiError extends Error {\n readonly status: number;\n readonly statusText: string;\n readonly body: string;\n readonly details: MalformedInputDetails | undefined;\n readonly error: string | undefined;\n readonly apiMessage: string | undefined;\n\n constructor(params: {\n status: number;\n statusText: string;\n body: string;\n details?: MalformedInputDetails;\n error?: string;\n apiMessage?: string;\n }) {\n const statusText = params.statusText ? ` ${params.statusText}` : \"\";\n super(`Silmaril API error ${params.status}${statusText}`);\n this.name = \"SilmarilApiError\";\n this.status = params.status;\n this.statusText = params.statusText;\n this.body = params.body;\n const parsed = parseErrorBody(params.body);\n this.details = params.details ?? parsed.details;\n this.error = params.error ?? parsed.error;\n this.apiMessage = params.apiMessage ?? parsed.apiMessage;\n Object.setPrototypeOf(this, SilmarilApiError.prototype);\n }\n}\n\nfunction parseErrorBody(body: string): {\n details: MalformedInputDetails | undefined;\n error: string | undefined;\n apiMessage: string | undefined;\n} {\n try {\n const parsed = JSON.parse(body) as unknown;\n if (!parsed || typeof parsed !== \"object\") {\n return { details: undefined, error: undefined, apiMessage: undefined };\n }\n const data = parsed as Record<string, unknown>;\n return {\n details:\n data.details && typeof data.details === \"object\"\n ? (data.details as MalformedInputDetails)\n : undefined,\n error: typeof data.error === \"string\" ? data.error : undefined,\n apiMessage: typeof data.message === \"string\" ? data.message : undefined,\n };\n } catch {\n return { details: undefined, error: undefined, apiMessage: undefined };\n }\n}\n","// Copyright (c) 2024-2025 Silmaril Security Inc. All rights reserved.\n// PROPRIETARY AND CONFIDENTIAL\n\nexport const HookLabel = {\n USER_INPUT: \"user_input\",\n SYSTEM_PROMPT: \"system_prompt\",\n TOOL_CALL: \"tool_call\",\n TOOL_RESPONSE: \"tool_response\",\n LLM_OUTPUT: \"llm_output\",\n UNKNOWN: \"unknown\",\n} as const;\n\nexport type HookLabel = (typeof HookLabel)[keyof typeof HookLabel];\n\nexport const FirewallHook = {\n LLM_START: \"on_llm_start\",\n CHAT_MODEL_START: \"on_chat_model_start\",\n TOOL_START: \"on_tool_start\",\n RETRIEVER_START: \"on_retriever_start\",\n LLM_END: \"on_llm_end\",\n TOOL_END: \"on_tool_end\",\n RETRIEVER_END: \"on_retriever_end\",\n} as const;\n\nexport type FirewallHook = (typeof FirewallHook)[keyof typeof FirewallHook];\n\nexport const DEFAULT_HOOKS: ReadonlySet<FirewallHook> = new Set<FirewallHook>([\n FirewallHook.LLM_START,\n FirewallHook.CHAT_MODEL_START,\n FirewallHook.TOOL_START,\n FirewallHook.TOOL_END,\n]);\n\nexport const INPUT_HOOKS: ReadonlySet<FirewallHook> = new Set<FirewallHook>([\n FirewallHook.LLM_START,\n FirewallHook.CHAT_MODEL_START,\n FirewallHook.TOOL_START,\n FirewallHook.RETRIEVER_START,\n]);\n\nexport const OUTPUT_HOOKS: ReadonlySet<FirewallHook> = new Set<FirewallHook>([\n FirewallHook.LLM_END,\n FirewallHook.TOOL_END,\n FirewallHook.RETRIEVER_END,\n]);\n\nexport const ALL_HOOKS: ReadonlySet<FirewallHook> = new Set<FirewallHook>([\n ...INPUT_HOOKS,\n ...OUTPUT_HOOKS,\n]);\n\nexport const FIREWALL_HOOK_TO_LABEL: Readonly<Record<FirewallHook, HookLabel>> = {\n [FirewallHook.CHAT_MODEL_START]: HookLabel.USER_INPUT,\n [FirewallHook.LLM_START]: HookLabel.USER_INPUT,\n [FirewallHook.TOOL_START]: HookLabel.TOOL_CALL,\n [FirewallHook.TOOL_END]: HookLabel.TOOL_RESPONSE,\n [FirewallHook.RETRIEVER_START]: HookLabel.TOOL_CALL,\n [FirewallHook.RETRIEVER_END]: HookLabel.TOOL_RESPONSE,\n [FirewallHook.LLM_END]: HookLabel.LLM_OUTPUT,\n};\n\nconst FIREWALL_HOOK_VALUES: ReadonlySet<string> = new Set(Object.values(FirewallHook));\n\nexport function resolveHooks(\n hooks: Iterable<FirewallHook | string> | undefined,\n): ReadonlySet<FirewallHook> {\n if (hooks === undefined) {\n return DEFAULT_HOOKS;\n }\n const resolved = new Set<FirewallHook>();\n for (const h of hooks) {\n if (!FIREWALL_HOOK_VALUES.has(h)) {\n throw new Error(`Invalid FirewallHook value: ${String(h)}`);\n }\n resolved.add(h as FirewallHook);\n }\n return resolved;\n}\n\nexport function prependHook(text: string, hook: HookLabel | string | undefined | null): string {\n if (hook === undefined || hook === null) {\n return text;\n }\n if (hook === HookLabel.UNKNOWN) {\n return text;\n }\n return `[HOOK:${hook}] ${text}`;\n}\n\nexport function prependToolName(text: string, toolName: string | undefined | null): string {\n if (toolName === undefined || toolName === null) {\n return text;\n }\n return `[TOOL:${toolName}] ${text}`;\n}\n","import type { FirewallMode } from \"./types.js\";\n\n/** Validate JavaScript/configuration inputs before any fail-open adapter path. */\nexport function validateMode(value: unknown): FirewallMode | undefined {\n if (value === undefined || value === \"shadow\" || value === \"warn\" || value === \"block\") {\n return value;\n }\n throw new Error(\"Firewall: mode must be shadow, warn, or block\");\n}\n","// Copyright (c) 2024-2025 Silmaril Security Inc. All rights reserved.\n// PROPRIETARY AND CONFIDENTIAL\n\nconst SKIP_ROLES: ReadonlySet<string> = new Set([\"ai\", \"assistant\"]);\nconst SYSTEM_ROLES: ReadonlySet<string> = new Set([\"system\"]);\nconst TOOL_ROLES: ReadonlySet<string> = new Set([\"tool\", \"function\"]);\n\ntype MessageContent = string | ReadonlyArray<string | { type?: string; text?: string }>;\n\ninterface DucktypedMessage {\n role?: string;\n type?: string;\n content?: MessageContent;\n}\n\ninterface DucktypedGeneration {\n text?: string;\n}\n\ninterface DucktypedLLMResult {\n generations?: ReadonlyArray<ReadonlyArray<DucktypedGeneration>>;\n}\n\ninterface DucktypedDocument {\n pageContent?: string;\n}\n\nfunction extractContentText(content: MessageContent | undefined): string {\n if (typeof content === \"string\") {\n return content;\n }\n if (Array.isArray(content)) {\n const parts: string[] = [];\n for (const block of content) {\n if (typeof block === \"string\") {\n parts.push(block);\n } else if (block && typeof block === \"object\" && block.type === \"text\") {\n parts.push(block.text ?? \"\");\n }\n }\n return parts.join(\" \");\n }\n return \"\";\n}\n\nfunction getRole(message: DucktypedMessage): string {\n if (message.role !== undefined) {\n return message.role.toLowerCase();\n }\n if (typeof message.type === \"string\") {\n return message.type.toLowerCase();\n }\n return \"\";\n}\n\nexport function extractTextFromMessages(\n messages: ReadonlyArray<DucktypedMessage>,\n options: { includeSystem?: boolean; includeTool?: boolean } = {},\n): string {\n const includeSystem = options.includeSystem ?? true;\n const includeTool = options.includeTool ?? true;\n const parts: string[] = [];\n for (const message of messages) {\n const role = getRole(message);\n if (SKIP_ROLES.has(role)) {\n continue;\n }\n if (!includeSystem && SYSTEM_ROLES.has(role)) {\n continue;\n }\n if (!includeTool && TOOL_ROLES.has(role)) {\n continue;\n }\n const text = extractContentText(message.content);\n const stripped = text.trim();\n if (stripped) {\n parts.push(stripped);\n }\n }\n return parts.join(\"\\n\");\n}\n\nexport function extractTextFromPrompts(prompts: readonly string[]): string {\n return prompts\n .map((p) => p.trim())\n .filter((p) => p.length > 0)\n .join(\"\\n\");\n}\n\nexport function extractTextFromToolInput(inputStr: string): string {\n return inputStr.trim();\n}\n\nexport function extractTextFromLLMResult(response: DucktypedLLMResult): string {\n const parts: string[] = [];\n for (const genList of response.generations ?? []) {\n for (const gen of genList) {\n const text = (gen.text ?? \"\").trim();\n if (text) {\n parts.push(text);\n }\n }\n }\n return parts.join(\"\\n\");\n}\n\nexport function extractTextFromDocuments(documents: ReadonlyArray<DucktypedDocument>): string {\n const parts: string[] = [];\n for (const doc of documents) {\n const text = (doc.pageContent ?? \"\").trim();\n if (text) {\n parts.push(text);\n }\n }\n return parts.join(\"\\n\");\n}\n","// Copyright (c) 2026 Silmaril Security Inc. All rights reserved.\n\nfunction record(value: unknown): Record<string, unknown> | undefined {\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? value as Record<string, unknown> : undefined;\n}\n\nexport function validThreadId(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim().length > 0 ? value : undefined;\n}\n\n/** Native config is authoritative, including an explicitly invalid/empty ID. */\nexport function nativeThreadId(runtime?: unknown, metadata?: unknown, inherited?: string, currentConfig?: unknown): string | undefined {\n const explicit = record(record(runtime)?.configurable);\n const current = record(record(currentConfig)?.configurable);\n for (const candidate of [explicit, current, record(metadata)]) {\n if (candidate && Object.prototype.hasOwnProperty.call(candidate, \"thread_id\")) {\n return validThreadId(candidate.thread_id);\n }\n }\n return inherited;\n}\n\nexport function rejectConversationOptions(options: object): void {\n if (\"conversationId\" in options || \"conversation_id\" in options) {\n throw new TypeError(\"conversationId/conversation_id was removed. Pass the native configurable.thread_id when invoking the agent or runnable instead.\");\n }\n}\n\ninterface RunIdentity {\n threadId: string | undefined;\n parentRunId: string | undefined;\n}\n\n/** State belongs to callback runs, never to a reusable agent or current user. */\nexport class RunThreadIdentity {\n private readonly runs = new Map<string, RunIdentity>();\n private readonly children = new Map<string, Set<string>>();\n\n constructor(\n private readonly boundIdentity?: { threadId: string | undefined },\n private readonly currentConfig: () => unknown = () => undefined,\n ) {}\n\n start(runId: string, parentRunId?: string, metadata?: unknown): string[] {\n const discarded = this.finish(runId);\n if (this.runs.size >= 4096) {\n const oldestRoot = [...this.runs].find(([, run]) => run.parentRunId === undefined || !this.runs.has(run.parentRunId))?.[0] ?? this.runs.keys().next().value;\n if (oldestRoot !== undefined) discarded.push(...this.finish(oldestRoot));\n }\n const inherited = parentRunId === undefined ? undefined : this.runs.get(parentRunId)?.threadId;\n const exposed = record(metadata);\n // Ordinary callbacks may see a parent's ambient config while a child has a\n // hidden per-call override. Only graph-tagged metadata proves that context.\n const threadId = this.boundIdentity && (parentRunId === undefined || !this.runs.has(parentRunId)) ? this.boundIdentity.threadId\n : exposed && Object.prototype.hasOwnProperty.call(exposed, \"thread_id\")\n ? typeof exposed.langgraph_node === \"string\"\n ? nativeThreadId(undefined, exposed, inherited, this.currentConfig())\n : validThreadId(exposed.thread_id)\n : inherited;\n this.runs.set(runId, { threadId, parentRunId });\n if (parentRunId !== undefined && parentRunId !== runId) {\n const children = this.children.get(parentRunId) ?? new Set<string>();\n children.add(runId);\n this.children.set(parentRunId, children);\n }\n return discarded;\n }\n\n get(runId: string): string | undefined {\n const run = this.runs.get(runId);\n return run ? run.threadId : this.boundIdentity?.threadId;\n }\n\n finish(runId: string): string[] {\n const pending = [runId];\n const seen = new Set<string>();\n while (pending.length) {\n const id = pending.pop()!;\n if (seen.has(id)) continue;\n seen.add(id);\n pending.push(...this.children.get(id) ?? []);\n this.children.delete(id);\n const parent = this.runs.get(id)?.parentRunId;\n this.runs.delete(id);\n if (parent !== undefined) {\n const siblings = this.children.get(parent);\n siblings?.delete(id);\n if (siblings?.size === 0) this.children.delete(parent);\n }\n }\n return [...seen];\n }\n}\n"],"mappings":"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","names":["config","options"]}
1
+ {"version":3,"sources":["../../src/adapters/langchain.ts","../../src/exceptions.ts","../../src/hooks.ts","../../src/modes.ts","../../src/utils/extract.ts","../../src/adapters/thread-identity.ts"],"sourcesContent":["// Copyright (c) 2024-2025 Silmaril Security Inc. All rights reserved.\n// PROPRIETARY AND CONFIDENTIAL\n\nimport type { Runnable, RunnableBinding as RunnableBindingType, RunnableConfig } from \"@langchain/core/runnables\";\nimport type { Serialized } from \"@langchain/core/load/serializable\";\nimport type { BaseTracer as BaseTracerType, Run } from \"@langchain/core/tracers/base\";\nimport type { BaseCallbackHandler } from \"@langchain/core/callbacks/base\";\n\nimport type { Firewall } from \"../firewall.js\";\nimport {\n FirewallBlockedException,\n isReviewCompatibilityError,\n} from \"../exceptions.js\";\nimport {\n FIREWALL_HOOK_TO_LABEL,\n FirewallHook,\n HookLabel,\n resolveHooks,\n} from \"../hooks.js\";\nimport type { BlockResult, ClassifyEvent, LangChainAdapterOptions } from \"../types.js\";\nimport { validateMode } from \"../modes.js\";\nimport {\n extractTextFromDocuments,\n extractTextFromLLMResult,\n extractTextFromPrompts,\n extractTextFromToolInput,\n} from \"../utils/extract.js\";\n\nimport { rejectConversationOptions, RunThreadIdentity, validThreadId } from \"./thread-identity.js\";\n\nconst handlerCleanups = new WeakMap<object, () => void>();\n\nconst USER_ROLES: ReadonlySet<string> = new Set([\"human\", \"user\"]);\n\ninterface LangChainDucktypedMessage {\n role?: string;\n type?: string;\n getType?: () => string;\n _getType?: () => string;\n content?: string | ReadonlyArray<string | { type?: string; text?: string }>;\n}\n\nfunction getMessageRole(message: LangChainDucktypedMessage): string {\n if (typeof message.role === \"string\") {\n return message.role.toLowerCase();\n }\n if (typeof message.type === \"string\") {\n return message.type.toLowerCase();\n }\n const legacyType = message.getType?.() ?? message._getType?.();\n return typeof legacyType === \"string\" ? legacyType.toLowerCase() : \"\";\n}\n\nfunction extractMessageText(content: LangChainDucktypedMessage[\"content\"]): string {\n if (content === undefined) {\n return \"\";\n }\n if (typeof content === \"string\") {\n return content;\n }\n const parts: string[] = [];\n for (const block of content) {\n if (typeof block === \"string\") {\n parts.push(block);\n } else if (block && block.type === \"text\") {\n parts.push(block.text ?? \"\");\n }\n }\n return parts.join(\" \");\n}\n\nfunction findLastUserMessage(\n messages: ReadonlyArray<LangChainDucktypedMessage>,\n): LangChainDucktypedMessage | undefined {\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i]!;\n if (USER_ROLES.has(getMessageRole(msg))) {\n return msg;\n }\n }\n return undefined;\n}\n\nexport async function createLangChainHandler(\n firewall: Firewall,\n options: LangChainAdapterOptions = {},\n): Promise<BaseCallbackHandler> {\n return buildLangChainHandler(firewall, options);\n}\n\nasync function buildLangChainHandler(\n firewall: Firewall, options: LangChainAdapterOptions,\n boundIdentity?: { threadId: string | undefined },\n): Promise<BaseCallbackHandler> {\n rejectConversationOptions(options);\n const { ensureConfig } = await import(\"@langchain/core/runnables\");\n const threads = new RunThreadIdentity(boundIdentity, () => ensureConfig());\n const { BaseTracer } = await import(\"@langchain/core/tracers/base\");\n let finishRun = (runId: string): void => { threads.finish(runId); };\n\n const enabledHooks = resolveHooks(options.hooks);\n // includeSystem remains inert for the user-only chat-model scan.\n // includeTool still controls the explicit tool start and end callbacks.\n const includeTool = options.includeTool ?? true;\n const failOpen = options.failOpen ?? true;\n const logger =\n options.logger ??\n ((message: string, error: unknown): void => {\n // eslint-disable-next-line no-console\n console.warn(`silmaril.firewall: ${message}`, error);\n });\n const requestedMode = validateMode(options.mode) ?? (\n options.shadowMode === undefined\n ? firewall.mode\n : options.shadowMode ? \"shadow\" : \"block\"\n );\n const onClassify = options.onClassify;\n\n const fireOnClassify = (event: ClassifyEvent): void => {\n if (!onClassify) {\n return;\n }\n try {\n onClassify(event);\n } catch (err) {\n logger(\"onClassify callback threw\", err);\n }\n };\n\n const classifyEvent = async (\n text: string,\n hookLabel: HookLabel,\n runId: string,\n toolName?: string,\n ): Promise<void> => {\n let result: BlockResult;\n try {\n result = await firewall.classify(text, {\n hook: hookLabel,\n metadata: {\n langgraph: { run_id: runId },\n ...(threads.get(runId) === undefined ? {} : { conversationId: threads.get(runId) }),\n },\n ...(requestedMode !== undefined ? { mode: requestedMode } : {}),\n ...(toolName !== undefined ? { toolName } : {}),\n });\n } catch (err) {\n if (isReviewCompatibilityError(err)) {\n throw err;\n }\n if (!failOpen) {\n throw err;\n }\n logger(\"classification failed, allowing prompt through\", err);\n return;\n }\n const threshold = result.threshold;\n const blocked = result.prediction === \"MALICIOUS\" || result.governance?.action === \"block\";\n const effectiveMode = requestedMode ?? result.mode ?? \"block\";\n const commonEventFields = {\n hook: hookLabel,\n ...(toolName !== undefined ? { toolName } : {}),\n runId,\n text,\n result,\n };\n fireOnClassify({\n ...commonEventFields,\n blocked,\n mode: effectiveMode,\n shadowMode: effectiveMode === \"shadow\",\n });\n if (!blocked || effectiveMode !== \"block\") {\n return;\n }\n\n throw new FirewallBlockedException({\n score: result.score,\n threshold,\n promptText: text,\n runId,\n hook: hookLabel,\n ...(toolName !== undefined ? { toolName } : {}),\n result,\n });\n };\n\n const classify = async (text: string, hook: HookLabel, runId: string, toolName?: string): Promise<void> => {\n try {\n await classifyEvent(text, hook, runId, toolName);\n } catch (error) {\n finishRun(runId);\n throw error;\n }\n };\n\n function serialized(value: unknown, name: string): Serialized {\n if (value && typeof value === \"object\" && \"id\" in value && Array.isArray(value.id)) return value as Serialized;\n return { lc: 1, type: \"not_implemented\", id: [name] };\n }\n\n class SilmarilFirewallHandler extends BaseTracer {\n override name = \"silmaril_firewall_handler\";\n override raiseError = true;\n override awaitHandlers = true;\n\n // LangChain clears runnable context inside ordinary callbacks. Its synchronous\n // tracer pre-start hooks capture native config before that boundary. Runs are\n // memory-only and every terminal path discards both native tracer maps.\n protected override async persistRun(): Promise<void> {}\n protected override getRunById(runId?: string): Run | undefined {\n return runId === undefined ? undefined : this.runMap.get(runId);\n }\n\n // Only lifecycle identity is needed. Do not retain prompts, outputs, token\n // events, or completed children when upstream omits a cancellation callback.\n override _addRunToRunMap(run: Run) {\n return super._addRunToRunMap({ ...run, inputs: {}, extra: {}, serialized: {},\n tags: [], child_runs: [], events: [],\n });\n }\n protected override _addChildRun(): void {}\n protected override async _endTrace(run: Run): Promise<void> {\n try { await super._endTrace(run); } finally {\n run.inputs = {};\n delete run.outputs;\n delete run.error;\n run.extra = {};\n run.events = [];\n run.child_runs = [];\n }\n }\n override async handleText(): Promise<void> {}\n override async handleAgentAction(): Promise<void> {}\n override async handleAgentEnd(): Promise<void> {}\n override async handleLLMNewToken(_token: string, _idx: unknown, runId: string): Promise<Run> {\n return this.getRunById(runId) ?? this._createRunForLLMStart(serialized(undefined, \"llm\"), [], runId);\n }\n\n capture(runId: string, parentRunId?: string, metadata?: unknown): void {\n for (const id of threads.start(runId, parentRunId, metadata)) {\n this.runMap.delete(id);\n this.runTreeMap?.delete(id);\n }\n }\n\n finishAll(): void {\n for (const id of [...this.runMap.keys()]) this.finishRun(id);\n this.runTreeMap?.clear();\n }\n\n finishRun(runId: string): void {\n for (const id of threads.finish(runId)) {\n this.runMap.delete(id);\n this.runTreeMap?.delete(id);\n }\n }\n\n override _createRunForLLMStart(...args: Parameters<BaseTracerType[\"_createRunForLLMStart\"]>) {\n this.capture(args[2], args[3], args[6]);\n return super._createRunForLLMStart(...args);\n }\n\n override _createRunForChatModelStart(...args: Parameters<BaseTracerType[\"_createRunForChatModelStart\"]>) {\n this.capture(args[2], args[3], args[6]);\n return super._createRunForChatModelStart(...args);\n }\n\n override _createRunForChainStart(...args: Parameters<BaseTracerType[\"_createRunForChainStart\"]>) {\n this.capture(args[2], args[3], args[5]);\n return super._createRunForChainStart(...args);\n }\n\n override _createRunForToolStart(...args: Parameters<BaseTracerType[\"_createRunForToolStart\"]>) {\n this.capture(args[2], args[3], args[5]);\n return super._createRunForToolStart(...args);\n }\n\n override _createRunForRetrieverStart(...args: Parameters<BaseTracerType[\"_createRunForRetrieverStart\"]>) {\n this.capture(args[2], args[3], args[5]);\n return super._createRunForRetrieverStart(...args);\n }\n\n override async handleChatModelStart(\n llm: unknown, messages: unknown, runId: string, parentRunId?: string,\n extraParams?: Record<string, unknown>, tags?: string[], metadata?: Record<string, unknown>,\n ): Promise<Run> {\n const batches = messages as ReadonlyArray<ReadonlyArray<LangChainDucktypedMessage>>;\n const run = this.getRunById(runId) ?? this._createRunForChatModelStart(\n serialized(llm, \"chat_model\"), messages as Parameters<BaseTracerType[\"_createRunForChatModelStart\"]>[1], runId,\n parentRunId, extraParams, tags, metadata,\n );\n if (enabledHooks.has(FirewallHook.CHAT_MODEL_START)) {\n const lastUser = findLastUserMessage(batches.flat());\n const text = lastUser ? extractMessageText(lastUser.content).trim() : \"\";\n if (text) await classify(text, FIREWALL_HOOK_TO_LABEL[FirewallHook.CHAT_MODEL_START], runId);\n }\n return run;\n }\n\n override async handleLLMStart(\n llm: unknown, prompts: string[], runId: string, parentRunId?: string,\n extraParams?: Record<string, unknown>, tags?: string[], metadata?: Record<string, unknown>,\n ): Promise<Run> {\n const run = this.getRunById(runId) ?? this._createRunForLLMStart(\n serialized(llm, \"llm\"), prompts, runId, parentRunId, extraParams, tags, metadata,\n );\n if (enabledHooks.has(FirewallHook.LLM_START)) {\n const text = extractTextFromPrompts(prompts);\n if (text) await classify(text, FIREWALL_HOOK_TO_LABEL[FirewallHook.LLM_START], runId);\n }\n return run;\n }\n\n override async handleToolStart(\n tool: { name?: string } | undefined, inputStr: string, runId: string, parentRunId?: string,\n tags?: string[], metadata?: Record<string, unknown>,\n ): Promise<Run> {\n const run = this.getRunById(runId) ?? this._createRunForToolStart(\n serialized(tool, tool?.name ?? \"tool\"), inputStr, runId, parentRunId, tags, metadata,\n );\n if (includeTool && enabledHooks.has(FirewallHook.TOOL_START)) {\n const text = extractTextFromToolInput(inputStr);\n if (text) await classify(text, FIREWALL_HOOK_TO_LABEL[FirewallHook.TOOL_START], runId, tool?.name);\n }\n return run;\n }\n\n override async handleRetrieverStart(\n retriever: unknown, query: string, runId: string, parentRunId?: string,\n tags?: string[], metadata?: Record<string, unknown>,\n ): Promise<Run> {\n const run = this.getRunById(runId) ?? this._createRunForRetrieverStart(\n serialized(retriever, \"retriever\"), query, runId, parentRunId, tags, metadata,\n );\n if (enabledHooks.has(FirewallHook.RETRIEVER_START) && query.trim()) {\n await classify(query.trim(), FIREWALL_HOOK_TO_LABEL[FirewallHook.RETRIEVER_START], runId);\n }\n return run;\n }\n\n override async handleLLMEnd(output: unknown, runId: string): Promise<Run> {\n try {\n if (!this.getRunById(runId)) this._createRunForLLMStart(serialized(undefined, \"llm\"), [], runId);\n if (enabledHooks.has(FirewallHook.LLM_END)) {\n const text = extractTextFromLLMResult(output as Parameters<typeof extractTextFromLLMResult>[0]);\n if (text) await classify(text, FIREWALL_HOOK_TO_LABEL[FirewallHook.LLM_END], runId);\n }\n return await super.handleLLMEnd(output as Parameters<BaseTracerType[\"handleLLMEnd\"]>[0], runId);\n } finally {\n finishRun(runId);\n }\n }\n\n override async handleToolEnd(\n output: unknown, runId: string, _parentRunId?: string, _tags?: string[], kwargs?: { name?: string },\n ): Promise<Run> {\n try {\n if (!this.getRunById(runId)) this._createRunForToolStart(serialized(undefined, \"tool\"), \"\", runId);\n if (includeTool && enabledHooks.has(FirewallHook.TOOL_END)) {\n const text = String(output).trim();\n if (text) await classify(text, FIREWALL_HOOK_TO_LABEL[FirewallHook.TOOL_END], runId, kwargs?.name);\n }\n return await super.handleToolEnd(output, runId);\n } finally {\n finishRun(runId);\n }\n }\n\n override async handleRetrieverEnd(documents: ReadonlyArray<{ pageContent?: string }>, runId: string): Promise<Run> {\n try {\n if (!this.getRunById(runId)) this._createRunForRetrieverStart(serialized(undefined, \"retriever\"), \"\", runId);\n if (enabledHooks.has(FirewallHook.RETRIEVER_END)) {\n const text = extractTextFromDocuments(documents);\n if (text) await classify(text, FIREWALL_HOOK_TO_LABEL[FirewallHook.RETRIEVER_END], runId);\n }\n return await super.handleRetrieverEnd(documents as Parameters<BaseTracerType[\"handleRetrieverEnd\"]>[0], runId);\n } finally {\n finishRun(runId);\n }\n }\n\n override async handleChainStart(\n chain: unknown, inputs: Record<string, unknown>, runId: string, parentRunId?: string,\n tags?: string[], metadata?: Record<string, unknown>, runType?: string, name?: string,\n ): Promise<Run> {\n return super.handleChainStart(serialized(chain, \"chain\"), inputs, runId, parentRunId, tags, metadata, runType, name);\n }\n\n override async handleChainEnd(...args: Parameters<BaseTracerType[\"handleChainEnd\"]>): Promise<Run> {\n if (!this.getRunById(args[1])) this._createRunForChainStart(serialized(undefined, \"chain\"), {}, args[1]);\n try { return await super.handleChainEnd(...args); } finally { finishRun(args[1]); }\n }\n\n override async handleChainError(...args: Parameters<BaseTracerType[\"handleChainError\"]>): Promise<Run> {\n if (!this.getRunById(args[1])) this._createRunForChainStart(serialized(undefined, \"chain\"), {}, args[1]);\n try { return await super.handleChainError(...args); } finally { finishRun(args[1]); }\n }\n\n override async handleLLMError(...args: Parameters<BaseTracerType[\"handleLLMError\"]>): Promise<Run> {\n if (!this.getRunById(args[1])) this._createRunForLLMStart(serialized(undefined, \"llm\"), [], args[1]);\n try { return await super.handleLLMError(...args); } finally { finishRun(args[1]); }\n }\n\n override async handleToolError(...args: Parameters<BaseTracerType[\"handleToolError\"]>): Promise<Run> {\n if (!this.getRunById(args[1])) this._createRunForToolStart(serialized(undefined, \"tool\"), \"\", args[1]);\n try { return await super.handleToolError(...args); } finally { finishRun(args[1]); }\n }\n\n override async handleRetrieverError(...args: Parameters<BaseTracerType[\"handleRetrieverError\"]>): Promise<Run> {\n if (!this.getRunById(args[1])) this._createRunForRetrieverStart(serialized(undefined, \"retriever\"), \"\", args[1]);\n try { return await super.handleRetrieverError(...args); } finally { finishRun(args[1]); }\n }\n }\n\n const handler = new SilmarilFirewallHandler();\n finishRun = (runId: string): void => { handler.finishRun(runId); };\n handlerCleanups.set(handler, () => handler.finishAll());\n return handler;\n}\n\n\n/** Protect a runnable using its actual invocation config, including direct model/tool calls. */\nexport async function protectLangChainRunnable<RunInput, RunOutput, CallOptions extends RunnableConfig = RunnableConfig>(\n firewall: Firewall,\n runnable: Runnable<RunInput, RunOutput, CallOptions>,\n options: LangChainAdapterOptions = {},\n): Promise<RunnableBindingType<RunInput, RunOutput, CallOptions>> {\n rejectConversationOptions(options);\n const { RunnableBinding, RunnableRetry, ensureConfig, mergeConfigs } = await import(\"@langchain/core/runnables\");\n const { IterableReadableStream } = await import(\"@langchain/core/utils/stream\");\n const configFactories = [async (config: RunnableConfig): Promise<RunnableConfig> => {\n const effective = ensureConfig(config);\n const handler = await buildLangChainHandler(firewall, options, {\n threadId: validThreadId(effective.configurable?.thread_id),\n });\n return { callbacks: [handler] };\n }];\n // Upstream withConfig/withRetry reconstruct a binding without its factories.\n // Retain ours so normal runnable composition cannot drop protection.\n class ProtectedBinding extends RunnableBinding<RunInput, RunOutput, CallOptions> {\n async scopedConfig(...configs: Parameters<RunnableBindingType<RunInput, RunOutput, CallOptions>[\"_mergeConfig\"]>) {\n const created: BaseCallbackHandler[] = [];\n const scopedFactories = configFactories.map((factory) => async (config: RunnableConfig) => {\n const update = await factory(config);\n // This factory returns exactly its fresh handler. Never dispose inherited\n // caller/parent handlers from a merged callback manager.\n if (Array.isArray(update.callbacks)) created.push(...update.callbacks as BaseCallbackHandler[]);\n return update;\n });\n const scoped = new RunnableBinding({ bound: this.bound, config: this.config, configFactories: scopedFactories });\n const config = await scoped._mergeConfig(...configs);\n return { config, dispose: () => { for (const handler of created) handlerCleanups.get(handler)?.(); } };\n }\n override async invoke(input: RunInput, options?: Partial<CallOptions>): Promise<RunOutput> {\n const scoped = await this.scopedConfig(options, this.kwargs);\n try { return await this.bound.invoke(input, scoped.config); } finally { scoped.dispose(); }\n }\n override async stream(input: RunInput, options?: Partial<CallOptions>) {\n const scoped = await this.scopedConfig(ensureConfig(options as RunnableConfig | undefined), this.kwargs);\n let upstream;\n try { upstream = await this.bound.stream(input, scoped.config); } catch (error) { scoped.dispose(); throw error; }\n const managed = async function* () {\n try { yield* upstream; } finally { scoped.dispose(); }\n };\n return IterableReadableStream.fromAsyncGenerator(managed());\n }\n override async *_streamIterator(input: RunInput, options?: Partial<CallOptions>) {\n const stream = await this.stream(input, options);\n yield* stream;\n }\n override withConfig(config: Partial<CallOptions>) {\n return new ProtectedBinding({ bound: this.bound, config: mergeConfigs(this.config, config as RunnableConfig), configFactories });\n }\n override withListeners(fields: Parameters<RunnableBindingType<RunInput, RunOutput, CallOptions>[\"withListeners\"]>[0]): ReturnType<RunnableBindingType<RunInput, RunOutput, CallOptions>[\"withListeners\"]> {\n return new RunnableBinding({ bound: this, config: {} }).withListeners(fields);\n }\n override withRetry(fields?: Parameters<RunnableBindingType<RunInput, RunOutput, CallOptions>[\"withRetry\"]>[0]): ReturnType<RunnableBindingType<RunInput, RunOutput, CallOptions>[\"withRetry\"]> {\n return new RunnableRetry({ bound: this, config: {},\n ...(fields?.stopAfterAttempt === undefined ? {} : { maxAttemptNumber: fields.stopAfterAttempt }),\n ...(fields?.onFailedAttempt === undefined ? {} : { onFailedAttempt: fields.onFailedAttempt }),\n });\n }\n }\n const bindings = new Set<Runnable<RunInput, RunOutput, CallOptions>>();\n const installBoundary = (candidate: Runnable<RunInput, RunOutput, CallOptions>): RunnableBindingType<RunInput, RunOutput, CallOptions> => {\n if (!RunnableBinding.isRunnableBinding(candidate)) {\n return new ProtectedBinding({ bound: candidate, config: {}, configFactories });\n }\n if (bindings.has(candidate)) throw new TypeError(\"Cannot protect cyclic runnable bindings\");\n bindings.add(candidate);\n const binding = candidate as RunnableBindingType<RunInput, RunOutput, CallOptions>;\n const Binding = binding.constructor as new (fields: Record<string, unknown>) => RunnableBindingType<RunInput, RunOutput, CallOptions>;\n // Keep native defaults, kwargs, retry settings and config factories outside\n // our boundary. They resolve exactly once before we capture the final config.\n // Reconstruct rather than mutate a runnable owned by the caller.\n return new Binding({ ...binding, bound: installBoundary(binding.bound) });\n };\n // Keep original native layers inside a stable composition shell. Native\n // binding helpers can otherwise reconstruct themselves without their factories.\n class ComposableBinding extends RunnableBinding<RunInput, RunOutput, CallOptions> {\n override withConfig(config: Partial<CallOptions>) {\n return new ComposableBinding({ bound: this.bound, config: mergeConfigs(this.config, config as RunnableConfig) });\n }\n override withListeners(fields: Parameters<RunnableBindingType<RunInput, RunOutput, CallOptions>[\"withListeners\"]>[0]): ReturnType<RunnableBindingType<RunInput, RunOutput, CallOptions>[\"withListeners\"]> {\n return new RunnableBinding({ bound: this, config: {} }).withListeners(fields);\n }\n override withRetry(fields?: Parameters<RunnableBindingType<RunInput, RunOutput, CallOptions>[\"withRetry\"]>[0]): ReturnType<RunnableBindingType<RunInput, RunOutput, CallOptions>[\"withRetry\"]> {\n return new RunnableRetry({ bound: this, config: {},\n ...(fields?.stopAfterAttempt === undefined ? {} : { maxAttemptNumber: fields.stopAfterAttempt }),\n ...(fields?.onFailedAttempt === undefined ? {} : { onFailedAttempt: fields.onFailedAttempt }),\n });\n }\n }\n return new ComposableBinding({ bound: installBoundary(runnable), config: {} });\n}\n","// Copyright (c) 2024-2025 Silmaril Security Inc. All rights reserved.\n// PROPRIETARY AND CONFIDENTIAL\n\nimport type { HookLabel } from \"./hooks.js\";\nimport type { BlockResult, ReviewLevel } from \"./types.js\";\n\nconst MAX_PROMPT_DISPLAY_LEN = 100;\n\nexport interface MalformedInputDetails {\n field?: string;\n inputIndex?: number;\n charOffset?: number;\n malformedToken?: string;\n codePoint?: string;\n reason?: string;\n}\n\nexport class FirewallBlockedException extends Error {\n readonly score: number;\n readonly threshold: number;\n readonly promptText: string;\n readonly runId: string | undefined;\n readonly hook: HookLabel | undefined;\n readonly toolName: string | undefined;\n readonly toolCallId: string | undefined;\n readonly result: BlockResult | undefined;\n\n constructor(params: {\n score: number;\n threshold: number;\n promptText: string;\n runId?: string;\n hook?: HookLabel;\n toolName?: string;\n toolCallId?: string;\n result?: BlockResult;\n }) {\n super(FirewallBlockedException.formatMessage(params));\n this.name = \"FirewallBlockedException\";\n this.score = params.score;\n this.threshold = params.threshold;\n this.promptText = params.promptText;\n this.runId = params.runId;\n this.hook = params.hook;\n this.toolName = params.toolName;\n this.toolCallId = params.toolCallId;\n this.result = params.result;\n Object.setPrototypeOf(this, FirewallBlockedException.prototype);\n }\n\n private static formatMessage(params: {\n score: number;\n threshold: number;\n promptText: string;\n result?: BlockResult;\n }): string {\n const truncated =\n params.promptText.length > MAX_PROMPT_DISPLAY_LEN\n ? `${params.promptText.slice(0, MAX_PROMPT_DISPLAY_LEN)}...`\n : params.promptText;\n if (\n params.result?.prediction !== \"MALICIOUS\" &&\n params.result?.governance?.action === \"block\"\n ) {\n return `Request blocked by Silmaril Firewall governance policy: '${truncated}'`;\n }\n return (\n `Request blocked by Silmaril Firewall ` +\n `(score=${params.score.toFixed(4)}, threshold=${params.threshold.toFixed(4)}): ` +\n `'${truncated}'`\n );\n }\n}\n\n/** @deprecated Use FirewallBlockedException instead. */\nexport const PromptBlockedException = FirewallBlockedException;\n/** @deprecated Use FirewallBlockedException instead. */\nexport type PromptBlockedException = FirewallBlockedException;\n\nconst REVIEW_COMPATIBILITY_ERROR_BRAND = Symbol.for(\n \"@silmaril-security/sdk/ReviewCompatibilityError\",\n);\n\nexport class ReviewCompatibilityError extends Error {\n readonly requestedReview: ReviewLevel;\n readonly acknowledgedReview: unknown;\n\n constructor(requestedReview: ReviewLevel, acknowledgedReview: unknown) {\n const detail = acknowledgedReview === undefined\n ? \"the response omitted its acknowledgement\"\n : \"the response acknowledgement did not match\";\n super(`Silmaril review compatibility error: ${detail} for requested ${requestedReview} review`);\n this.name = \"ReviewCompatibilityError\";\n this.requestedReview = requestedReview;\n this.acknowledgedReview = acknowledgedReview;\n Object.defineProperty(this, REVIEW_COMPATIBILITY_ERROR_BRAND, {\n value: true,\n enumerable: false,\n configurable: false,\n writable: false,\n });\n Object.setPrototypeOf(this, ReviewCompatibilityError.prototype);\n }\n}\n\nexport function isReviewCompatibilityError(error: unknown): error is ReviewCompatibilityError {\n if ((typeof error !== \"object\" && typeof error !== \"function\") || error === null) {\n return false;\n }\n try {\n return Object.getOwnPropertyDescriptor(\n error,\n REVIEW_COMPATIBILITY_ERROR_BRAND,\n )?.value === true;\n } catch {\n return false;\n }\n}\n\nexport class SilmarilApiError extends Error {\n readonly status: number;\n readonly statusText: string;\n readonly body: string;\n readonly details: MalformedInputDetails | undefined;\n readonly error: string | undefined;\n readonly apiMessage: string | undefined;\n\n constructor(params: {\n status: number;\n statusText: string;\n body: string;\n details?: MalformedInputDetails;\n error?: string;\n apiMessage?: string;\n }) {\n const statusText = params.statusText ? ` ${params.statusText}` : \"\";\n super(`Silmaril API error ${params.status}${statusText}`);\n this.name = \"SilmarilApiError\";\n this.status = params.status;\n this.statusText = params.statusText;\n this.body = params.body;\n const parsed = parseErrorBody(params.body);\n this.details = params.details ?? parsed.details;\n this.error = params.error ?? parsed.error;\n this.apiMessage = params.apiMessage ?? parsed.apiMessage;\n Object.setPrototypeOf(this, SilmarilApiError.prototype);\n }\n}\n\nfunction parseErrorBody(body: string): {\n details: MalformedInputDetails | undefined;\n error: string | undefined;\n apiMessage: string | undefined;\n} {\n try {\n const parsed = JSON.parse(body) as unknown;\n if (!parsed || typeof parsed !== \"object\") {\n return { details: undefined, error: undefined, apiMessage: undefined };\n }\n const data = parsed as Record<string, unknown>;\n return {\n details:\n data.details && typeof data.details === \"object\"\n ? (data.details as MalformedInputDetails)\n : undefined,\n error: typeof data.error === \"string\" ? data.error : undefined,\n apiMessage: typeof data.message === \"string\" ? data.message : undefined,\n };\n } catch {\n return { details: undefined, error: undefined, apiMessage: undefined };\n }\n}\n","// Copyright (c) 2024-2025 Silmaril Security Inc. All rights reserved.\n// PROPRIETARY AND CONFIDENTIAL\n\nexport const HookLabel = {\n USER_INPUT: \"user_input\",\n SYSTEM_PROMPT: \"system_prompt\",\n TOOL_CALL: \"tool_call\",\n TOOL_RESPONSE: \"tool_response\",\n LLM_OUTPUT: \"llm_output\",\n UNKNOWN: \"unknown\",\n} as const;\n\nexport type HookLabel = (typeof HookLabel)[keyof typeof HookLabel];\n\nexport const FirewallHook = {\n LLM_START: \"on_llm_start\",\n CHAT_MODEL_START: \"on_chat_model_start\",\n TOOL_START: \"on_tool_start\",\n RETRIEVER_START: \"on_retriever_start\",\n LLM_END: \"on_llm_end\",\n TOOL_END: \"on_tool_end\",\n RETRIEVER_END: \"on_retriever_end\",\n} as const;\n\nexport type FirewallHook = (typeof FirewallHook)[keyof typeof FirewallHook];\n\nexport const DEFAULT_HOOKS: ReadonlySet<FirewallHook> = new Set<FirewallHook>([\n FirewallHook.LLM_START,\n FirewallHook.CHAT_MODEL_START,\n FirewallHook.TOOL_START,\n FirewallHook.TOOL_END,\n]);\n\nexport const INPUT_HOOKS: ReadonlySet<FirewallHook> = new Set<FirewallHook>([\n FirewallHook.LLM_START,\n FirewallHook.CHAT_MODEL_START,\n FirewallHook.TOOL_START,\n FirewallHook.RETRIEVER_START,\n]);\n\nexport const OUTPUT_HOOKS: ReadonlySet<FirewallHook> = new Set<FirewallHook>([\n FirewallHook.LLM_END,\n FirewallHook.TOOL_END,\n FirewallHook.RETRIEVER_END,\n]);\n\nexport const ALL_HOOKS: ReadonlySet<FirewallHook> = new Set<FirewallHook>([\n ...INPUT_HOOKS,\n ...OUTPUT_HOOKS,\n]);\n\nexport const FIREWALL_HOOK_TO_LABEL: Readonly<Record<FirewallHook, HookLabel>> = {\n [FirewallHook.CHAT_MODEL_START]: HookLabel.USER_INPUT,\n [FirewallHook.LLM_START]: HookLabel.USER_INPUT,\n [FirewallHook.TOOL_START]: HookLabel.TOOL_CALL,\n [FirewallHook.TOOL_END]: HookLabel.TOOL_RESPONSE,\n [FirewallHook.RETRIEVER_START]: HookLabel.TOOL_CALL,\n [FirewallHook.RETRIEVER_END]: HookLabel.TOOL_RESPONSE,\n [FirewallHook.LLM_END]: HookLabel.LLM_OUTPUT,\n};\n\nconst FIREWALL_HOOK_VALUES: ReadonlySet<string> = new Set(Object.values(FirewallHook));\n\nexport function resolveHooks(\n hooks: Iterable<FirewallHook | string> | undefined,\n): ReadonlySet<FirewallHook> {\n if (hooks === undefined) {\n return DEFAULT_HOOKS;\n }\n const resolved = new Set<FirewallHook>();\n for (const h of hooks) {\n if (!FIREWALL_HOOK_VALUES.has(h)) {\n throw new Error(`Invalid FirewallHook value: ${String(h)}`);\n }\n resolved.add(h as FirewallHook);\n }\n return resolved;\n}\n\nexport function prependHook(text: string, hook: HookLabel | string | undefined | null): string {\n if (hook === undefined || hook === null) {\n return text;\n }\n if (hook === HookLabel.UNKNOWN) {\n return text;\n }\n return `[HOOK:${hook}] ${text}`;\n}\n\nexport function prependToolName(text: string, toolName: string | undefined | null): string {\n if (toolName === undefined || toolName === null) {\n return text;\n }\n return `[TOOL:${toolName}] ${text}`;\n}\n","import type { FirewallMode } from \"./types.js\";\n\n/** Validate JavaScript/configuration inputs before any fail-open adapter path. */\nexport function validateMode(value: unknown): FirewallMode | undefined {\n if (value === undefined || value === \"shadow\" || value === \"warn\" || value === \"block\") {\n return value;\n }\n throw new Error(\"Firewall: mode must be shadow, warn, or block\");\n}\n","// Copyright (c) 2024-2025 Silmaril Security Inc. All rights reserved.\n// PROPRIETARY AND CONFIDENTIAL\n\nconst SKIP_ROLES: ReadonlySet<string> = new Set([\"ai\", \"assistant\"]);\nconst SYSTEM_ROLES: ReadonlySet<string> = new Set([\"system\"]);\nconst TOOL_ROLES: ReadonlySet<string> = new Set([\"tool\", \"function\"]);\n\ntype MessageContent = string | ReadonlyArray<string | { type?: string; text?: string }>;\n\ninterface DucktypedMessage {\n role?: string;\n type?: string;\n content?: MessageContent;\n}\n\ninterface DucktypedGeneration {\n text?: string;\n}\n\ninterface DucktypedLLMResult {\n generations?: ReadonlyArray<ReadonlyArray<DucktypedGeneration>>;\n}\n\ninterface DucktypedDocument {\n pageContent?: string;\n}\n\nfunction extractContentText(content: MessageContent | undefined): string {\n if (typeof content === \"string\") {\n return content;\n }\n if (Array.isArray(content)) {\n const parts: string[] = [];\n for (const block of content) {\n if (typeof block === \"string\") {\n parts.push(block);\n } else if (block && typeof block === \"object\" && block.type === \"text\") {\n parts.push(block.text ?? \"\");\n }\n }\n return parts.join(\" \");\n }\n return \"\";\n}\n\nfunction getRole(message: DucktypedMessage): string {\n if (message.role !== undefined) {\n return message.role.toLowerCase();\n }\n if (typeof message.type === \"string\") {\n return message.type.toLowerCase();\n }\n return \"\";\n}\n\nexport function extractTextFromMessages(\n messages: ReadonlyArray<DucktypedMessage>,\n options: { includeSystem?: boolean; includeTool?: boolean } = {},\n): string {\n const includeSystem = options.includeSystem ?? true;\n const includeTool = options.includeTool ?? true;\n const parts: string[] = [];\n for (const message of messages) {\n const role = getRole(message);\n if (SKIP_ROLES.has(role)) {\n continue;\n }\n if (!includeSystem && SYSTEM_ROLES.has(role)) {\n continue;\n }\n if (!includeTool && TOOL_ROLES.has(role)) {\n continue;\n }\n const text = extractContentText(message.content);\n const stripped = text.trim();\n if (stripped) {\n parts.push(stripped);\n }\n }\n return parts.join(\"\\n\");\n}\n\nexport function extractTextFromPrompts(prompts: readonly string[]): string {\n return prompts\n .map((p) => p.trim())\n .filter((p) => p.length > 0)\n .join(\"\\n\");\n}\n\nexport function extractTextFromToolInput(inputStr: string): string {\n return inputStr.trim();\n}\n\nexport function extractTextFromLLMResult(response: DucktypedLLMResult): string {\n const parts: string[] = [];\n for (const genList of response.generations ?? []) {\n for (const gen of genList) {\n const text = (gen.text ?? \"\").trim();\n if (text) {\n parts.push(text);\n }\n }\n }\n return parts.join(\"\\n\");\n}\n\nexport function extractTextFromDocuments(documents: ReadonlyArray<DucktypedDocument>): string {\n const parts: string[] = [];\n for (const doc of documents) {\n const text = (doc.pageContent ?? \"\").trim();\n if (text) {\n parts.push(text);\n }\n }\n return parts.join(\"\\n\");\n}\n","// Copyright (c) 2026 Silmaril Security Inc. All rights reserved.\n\nfunction record(value: unknown): Record<string, unknown> | undefined {\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? value as Record<string, unknown> : undefined;\n}\n\nexport function validThreadId(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim().length > 0 ? value : undefined;\n}\n\n/** Native config is authoritative, including an explicitly invalid/empty ID. */\nexport function nativeThreadId(runtime?: unknown, metadata?: unknown, inherited?: string, currentConfig?: unknown): string | undefined {\n const explicit = record(record(runtime)?.configurable);\n const current = record(record(currentConfig)?.configurable);\n for (const candidate of [explicit, current, record(metadata)]) {\n if (candidate && Object.prototype.hasOwnProperty.call(candidate, \"thread_id\")) {\n return validThreadId(candidate.thread_id);\n }\n }\n return inherited;\n}\n\nexport function rejectConversationOptions(options: object): void {\n if (\"conversationId\" in options || \"conversation_id\" in options) {\n throw new TypeError(\"conversationId/conversation_id was removed. Pass the native configurable.thread_id when invoking the agent or runnable instead.\");\n }\n}\n\ninterface RunIdentity {\n threadId: string | undefined;\n parentRunId: string | undefined;\n}\n\n/** State belongs to callback runs, never to a reusable agent or current user. */\nexport class RunThreadIdentity {\n private readonly runs = new Map<string, RunIdentity>();\n private readonly children = new Map<string, Set<string>>();\n\n constructor(\n private readonly boundIdentity?: { threadId: string | undefined },\n private readonly currentConfig: () => unknown = () => undefined,\n ) {}\n\n start(runId: string, parentRunId?: string, metadata?: unknown): string[] {\n const discarded = this.finish(runId);\n if (this.runs.size >= 4096) {\n const oldestRoot = [...this.runs].find(([, run]) => run.parentRunId === undefined || !this.runs.has(run.parentRunId))?.[0] ?? this.runs.keys().next().value;\n if (oldestRoot !== undefined) discarded.push(...this.finish(oldestRoot));\n }\n const inherited = parentRunId === undefined ? undefined : this.runs.get(parentRunId)?.threadId;\n const exposed = record(metadata);\n // Ordinary callbacks may see a parent's ambient config while a child has a\n // hidden per-call override. Only graph-tagged metadata proves that context.\n const threadId = this.boundIdentity && (parentRunId === undefined || !this.runs.has(parentRunId)) ? this.boundIdentity.threadId\n : exposed && Object.prototype.hasOwnProperty.call(exposed, \"thread_id\")\n ? typeof exposed.langgraph_node === \"string\"\n ? nativeThreadId(undefined, exposed, inherited, this.currentConfig())\n : validThreadId(exposed.thread_id)\n : inherited;\n this.runs.set(runId, { threadId, parentRunId });\n if (parentRunId !== undefined && parentRunId !== runId) {\n const children = this.children.get(parentRunId) ?? new Set<string>();\n children.add(runId);\n this.children.set(parentRunId, children);\n }\n return discarded;\n }\n\n get(runId: string): string | undefined {\n const run = this.runs.get(runId);\n return run ? run.threadId : this.boundIdentity?.threadId;\n }\n\n finish(runId: string): string[] {\n const pending = [runId];\n const seen = new Set<string>();\n while (pending.length) {\n const id = pending.pop()!;\n if (seen.has(id)) continue;\n seen.add(id);\n pending.push(...this.children.get(id) ?? []);\n this.children.delete(id);\n const parent = this.runs.get(id)?.parentRunId;\n this.runs.delete(id);\n if (parent !== undefined) {\n const siblings = this.children.get(parent);\n siblings?.delete(id);\n if (siblings?.size === 0) this.children.delete(parent);\n }\n }\n return [...seen];\n }\n}\n"],"mappings":"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","names":["config","options"]}
@@ -656,7 +656,34 @@ async function protectLangChainRunnable(firewall, runnable, options = {}) {
656
656
  });
657
657
  }
658
658
  }
659
- return new ProtectedBinding({ bound: runnable, config: {}, configFactories });
659
+ const bindings = /* @__PURE__ */ new Set();
660
+ const installBoundary = (candidate) => {
661
+ if (!RunnableBinding.isRunnableBinding(candidate)) {
662
+ return new ProtectedBinding({ bound: candidate, config: {}, configFactories });
663
+ }
664
+ if (bindings.has(candidate)) throw new TypeError("Cannot protect cyclic runnable bindings");
665
+ bindings.add(candidate);
666
+ const binding = candidate;
667
+ const Binding = binding.constructor;
668
+ return new Binding({ ...binding, bound: installBoundary(binding.bound) });
669
+ };
670
+ class ComposableBinding extends RunnableBinding {
671
+ withConfig(config) {
672
+ return new ComposableBinding({ bound: this.bound, config: mergeConfigs(this.config, config) });
673
+ }
674
+ withListeners(fields) {
675
+ return new RunnableBinding({ bound: this, config: {} }).withListeners(fields);
676
+ }
677
+ withRetry(fields) {
678
+ return new RunnableRetry({
679
+ bound: this,
680
+ config: {},
681
+ ...fields?.stopAfterAttempt === void 0 ? {} : { maxAttemptNumber: fields.stopAfterAttempt },
682
+ ...fields?.onFailedAttempt === void 0 ? {} : { onFailedAttempt: fields.onFailedAttempt }
683
+ });
684
+ }
685
+ }
686
+ return new ComposableBinding({ bound: installBoundary(runnable), config: {} });
660
687
  }
661
688
  export {
662
689
  createLangChainHandler,