@silmaril-security/sdk 0.7.9 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +20 -0
- package/README.md +59 -11
- package/dist/adapters/deepagents.cjs +37 -8
- package/dist/adapters/deepagents.cjs.map +1 -1
- package/dist/adapters/deepagents.d.cts +1 -3
- package/dist/adapters/deepagents.d.ts +1 -3
- package/dist/adapters/deepagents.js +37 -8
- package/dist/adapters/deepagents.js.map +1 -1
- package/dist/adapters/langchain.cjs +382 -68
- package/dist/adapters/langchain.cjs.map +1 -1
- package/dist/adapters/langchain.d.cts +5 -2
- package/dist/adapters/langchain.d.ts +5 -2
- package/dist/adapters/langchain.js +380 -67
- package/dist/adapters/langchain.js.map +1 -1
- package/dist/adapters/vercel.d.cts +1 -1
- package/dist/adapters/vercel.d.ts +1 -1
- package/dist/{firewall-DqjD6aXD.d.cts → firewall-Bv5y03P0.d.cts} +0 -2
- package/dist/{firewall-DqjD6aXD.d.ts → firewall-Bv5y03P0.d.ts} +0 -2
- package/dist/index.cjs +406 -71
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +406 -71
- package/dist/index.js.map +1 -1
- package/package.json +6 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/exceptions.ts","../../src/hooks.ts","../../src/modes.ts","../../src/utils/extract.ts","../../src/adapters/langchain.ts"],"sourcesContent":["// 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) 2024-2025 Silmaril Security Inc. All rights reserved.\n// PROPRIETARY AND CONFIDENTIAL\n\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\nconst USER_ROLES: ReadonlySet<string> = new Set([\"human\", \"user\"]);\n\ninterface LangChainDucktypedMessage {\n role?: string;\n type?: 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 return \"\";\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 const { BaseCallbackHandler } = await import(\"@langchain/core/callbacks/base\");\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 classify = 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 ...(options.conversationId === undefined ? {} : { conversationId: options.conversationId }),\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 class SilmarilFirewallHandler extends BaseCallbackHandler {\n override name = \"silmaril_firewall_handler\";\n override raiseError = true;\n override awaitHandlers = true;\n\n override async handleChatModelStart(\n _llm: unknown,\n messages: unknown,\n runId: string,\n ): Promise<void> {\n if (!enabledHooks.has(FirewallHook.CHAT_MODEL_START)) {\n return;\n }\n const batches = messages as ReadonlyArray<ReadonlyArray<LangChainDucktypedMessage>>;\n const flat: LangChainDucktypedMessage[] = [];\n for (const batch of batches) {\n for (const m of batch) {\n flat.push(m);\n }\n }\n const lastUser = findLastUserMessage(flat);\n if (!lastUser) {\n return;\n }\n const text = extractMessageText(lastUser.content).trim();\n if (!text) {\n return;\n }\n await classify(text, FIREWALL_HOOK_TO_LABEL[FirewallHook.CHAT_MODEL_START], runId);\n }\n\n override async handleLLMStart(\n _llm: unknown,\n prompts: string[],\n runId: string,\n ): Promise<void> {\n if (!enabledHooks.has(FirewallHook.LLM_START)) {\n return;\n }\n const text = extractTextFromPrompts(prompts);\n if (!text) {\n return;\n }\n await classify(text, FIREWALL_HOOK_TO_LABEL[FirewallHook.LLM_START], runId);\n }\n\n override async handleToolStart(\n tool: { name?: string } | undefined,\n inputStr: string,\n runId: string,\n ): Promise<void> {\n if (!includeTool || !enabledHooks.has(FirewallHook.TOOL_START)) {\n return;\n }\n const text = extractTextFromToolInput(inputStr);\n if (!text) {\n return;\n }\n const toolName = tool?.name;\n await classify(text, FIREWALL_HOOK_TO_LABEL[FirewallHook.TOOL_START], runId, toolName);\n }\n\n override async handleRetrieverStart(\n _retriever: unknown,\n query: string,\n runId: string,\n ): Promise<void> {\n if (!enabledHooks.has(FirewallHook.RETRIEVER_START)) {\n return;\n }\n const text = query.trim();\n if (!text) {\n return;\n }\n await classify(text, FIREWALL_HOOK_TO_LABEL[FirewallHook.RETRIEVER_START], runId);\n }\n\n override async handleLLMEnd(output: unknown, runId: string): Promise<void> {\n if (!enabledHooks.has(FirewallHook.LLM_END)) {\n return;\n }\n const text = extractTextFromLLMResult(output as { generations?: ReadonlyArray<ReadonlyArray<{ text?: string }>> });\n if (!text) {\n return;\n }\n await classify(text, FIREWALL_HOOK_TO_LABEL[FirewallHook.LLM_END], runId);\n }\n\n override async handleToolEnd(\n output: unknown,\n runId: string,\n _parentRunId?: string,\n _tags?: string[],\n _kwargs?: { name?: string },\n ): Promise<void> {\n if (!includeTool || !enabledHooks.has(FirewallHook.TOOL_END)) {\n return;\n }\n const text = String(output).trim();\n if (!text) {\n return;\n }\n const toolName = _kwargs?.name;\n await classify(text, FIREWALL_HOOK_TO_LABEL[FirewallHook.TOOL_END], runId, toolName);\n }\n\n override async handleRetrieverEnd(\n documents: ReadonlyArray<{ pageContent?: string }>,\n runId: string,\n ): Promise<void> {\n if (!enabledHooks.has(FirewallHook.RETRIEVER_END)) {\n return;\n }\n const text = extractTextFromDocuments(documents);\n if (!text) {\n return;\n }\n await classify(text, FIREWALL_HOOK_TO_LABEL[FirewallHook.RETRIEVER_END], runId);\n }\n }\n\n return new SilmarilFirewallHandler();\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/exceptions.ts","../../src/hooks.ts","../../src/modes.ts","../../src/utils/extract.ts","../../src/adapters/thread-identity.ts","../../src/adapters/langchain.ts"],"sourcesContent":["// 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","// 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"],"mappings":"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","names":["config","options"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { g as FirewallMiddleware, Q as createMiddleware } from '../firewall-
|
|
1
|
+
export { g as FirewallMiddleware, Q as createMiddleware } from '../firewall-Bv5y03P0.cjs';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { g as FirewallMiddleware, Q as createMiddleware } from '../firewall-
|
|
1
|
+
export { g as FirewallMiddleware, Q as createMiddleware } from '../firewall-Bv5y03P0.js';
|
|
@@ -156,8 +156,6 @@ interface ClassifyBatchOptions {
|
|
|
156
156
|
}
|
|
157
157
|
interface LangChainAdapterOptions {
|
|
158
158
|
hooks?: ReadonlySet<FirewallHook>;
|
|
159
|
-
/** Caller-provided backend sequence identity. Never inferred from runId. */
|
|
160
|
-
conversationId?: string;
|
|
161
159
|
includeSystem?: boolean;
|
|
162
160
|
includeTool?: boolean;
|
|
163
161
|
failOpen?: boolean;
|
|
@@ -156,8 +156,6 @@ interface ClassifyBatchOptions {
|
|
|
156
156
|
}
|
|
157
157
|
interface LangChainAdapterOptions {
|
|
158
158
|
hooks?: ReadonlySet<FirewallHook>;
|
|
159
|
-
/** Caller-provided backend sequence identity. Never inferred from runId. */
|
|
160
|
-
conversationId?: string;
|
|
161
159
|
includeSystem?: boolean;
|
|
162
160
|
includeTool?: boolean;
|
|
163
161
|
failOpen?: boolean;
|