@modainteract/moda-interact-shared 5.12.0 → 5.12.2
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/README.md +6 -0
- package/dist/{chunk-WONND3OK.js → chunk-FDLZJHK7.js} +15 -1
- package/dist/chunk-FDLZJHK7.js.map +1 -0
- package/dist/commerce/model/node.d.ts +1 -1
- package/dist/commerce/model/node.js +1 -1
- package/dist/commerce/outreach/index.d.ts +1 -1
- package/dist/commerce/outreach/index.js +1 -1
- package/dist/commerce/runner/index.d.ts +2 -2
- package/dist/commerce/runner/index.js +13 -5
- package/dist/commerce/runner/index.js.map +1 -1
- package/dist/{types-CxiCD8Pw.d.ts → types-CZeBh6OR.d.ts} +3 -1
- package/package.json +1 -1
- package/dist/chunk-WONND3OK.js.map +0 -1
package/README.md
CHANGED
|
@@ -298,6 +298,12 @@ details schema. `finalResponseToolSchema(definition)` produces the host-local
|
|
|
298
298
|
finalization Tool's input schema. `verifyResponseContract` checks the definition
|
|
299
299
|
against its hash using the caller's digest implementation.
|
|
300
300
|
|
|
301
|
+
When a product-bearing answer omits its structured selections, the runner allows
|
|
302
|
+
one bounded correction using the existing observations and model-step/deadline
|
|
303
|
+
budget. Only `finalResponse` is available during correction: no provider reads
|
|
304
|
+
are repeated. An unsuccessful correction returns `INVALID_FINAL` with
|
|
305
|
+
`FINAL_PRODUCT_SELECTION_MISSING` to both Studio and Background.
|
|
306
|
+
|
|
301
307
|
An ANSWER requires null referral reason; a REFER_TO_STORE response requires the
|
|
302
308
|
appropriate reason, empty evidence IDs and empty details. Language detection
|
|
303
309
|
fields are either both null or a valid pair. Only reply text is customer-facing;
|
|
@@ -68,6 +68,7 @@ var explanations = {
|
|
|
68
68
|
TOOL_RESULT_MISSING: ["The tool execution loop ended without receiving a result.", "Inspect tool execution lifecycle and retry completion."],
|
|
69
69
|
TOOL_STALE_TURN: ["The tool reported that the conversation turn is no longer current.", "Inspect conversation versioning and abandon this obsolete turn."],
|
|
70
70
|
EVIDENCE_INVALID: ["Tool evidence failed its integrity, grant or freshness checks.", "Inspect tool evidence generation and turn/grant correlation."],
|
|
71
|
+
FINAL_PRODUCT_SELECTION_MISSING: ["The model did not return the required observed product selections during its bounded final-response correction.", "Inspect the pinned response schema and model output; reuse verified product results rather than repeating provider searches."],
|
|
71
72
|
FINAL_SCHEMA_INVALID: ["The model's finalResponse failed runtime schema validation.", "Inspect issueCodes and issuePaths; correct response formatting or tool instructions."],
|
|
72
73
|
FINAL_LANGUAGE_MISMATCH: ["The final answer included language detection despite an explicit customer language.", "Check model instructions governing language metadata."],
|
|
73
74
|
FINAL_REFERRAL_REQUIRED: ["The model did not produce the mandatory store referral after a denied or failed tool.", "Check final-response referral rules and the recorded tool outcome."],
|
|
@@ -209,6 +210,7 @@ var RUNNER_DIAGNOSTIC_REASONS = [
|
|
|
209
210
|
"TOOL_RESULT_MISSING",
|
|
210
211
|
"TOOL_STALE_TURN",
|
|
211
212
|
"EVIDENCE_INVALID",
|
|
213
|
+
"FINAL_PRODUCT_SELECTION_MISSING",
|
|
212
214
|
"FINAL_SCHEMA_INVALID",
|
|
213
215
|
"FINAL_LANGUAGE_MISMATCH",
|
|
214
216
|
"FINAL_REFERRAL_REQUIRED",
|
|
@@ -313,6 +315,8 @@ function safeRunnerDiagnostic(diagnostic) {
|
|
|
313
315
|
stage: stages.has(diagnostic.stage) ? diagnostic.stage : "graph.execute",
|
|
314
316
|
reasonCode: reasons.has(diagnostic.reasonCode) ? diagnostic.reasonCode : "UNEXPECTED_EXCEPTION",
|
|
315
317
|
...recognizedTransportCodes.has(diagnostic.transportCode ?? "") ? { transportCode: diagnostic.transportCode } : {},
|
|
318
|
+
...["schema", "selection", "observations"].includes(diagnostic.validationPhase ?? "") ? { validationPhase: diagnostic.validationPhase } : {},
|
|
319
|
+
...Array.isArray(diagnostic.exceptionFrames) ? { exceptionFrames: diagnostic.exceptionFrames.filter((frame) => typeof frame === "string" && frame.length <= 240 && /^[a-zA-Z0-9_./:@<> -]+$/.test(frame)).slice(0, 6) } : {},
|
|
316
320
|
...recognizedExceptionNames.has(diagnostic.exceptionName ?? "") ? { exceptionName: diagnostic.exceptionName } : {},
|
|
317
321
|
...boundedInt(diagnostic.statusCode, 100, 599) === void 0 ? {} : { statusCode: diagnostic.statusCode },
|
|
318
322
|
...boundedInt(diagnostic.providerCode, 0, 999999) === void 0 ? {} : { providerCode: diagnostic.providerCode },
|
|
@@ -340,9 +344,18 @@ function safeRunnerCauseMetadata(error) {
|
|
|
340
344
|
let current = error;
|
|
341
345
|
let transportCode;
|
|
342
346
|
let exceptionName;
|
|
347
|
+
let exceptionFrames = [];
|
|
343
348
|
for (let depth = 0; depth < 6 && current instanceof Error && !visited.has(current); depth += 1) {
|
|
344
349
|
visited.add(current);
|
|
345
350
|
try {
|
|
351
|
+
if (!exceptionFrames.length && typeof current.stack === "string") {
|
|
352
|
+
exceptionFrames = current.stack.split("\n").slice(1).flatMap((line) => {
|
|
353
|
+
const match = line.match(/(?:^|[/\\])((?:[^/\\() ]+\/)*(?:[^/\\() ]+\.(?:[cm]?js|tsx?)):\d+:\d+)\)?$/);
|
|
354
|
+
if (!match) return [];
|
|
355
|
+
const location = match[1].split("/").slice(-4).join("/");
|
|
356
|
+
return /^[a-zA-Z0-9_./:@<> -]{1,240}$/.test(location) ? [location] : [];
|
|
357
|
+
}).slice(0, 6);
|
|
358
|
+
}
|
|
346
359
|
const code = current.code;
|
|
347
360
|
if (typeof code === "string" && recognizedTransportCodes.has(code))
|
|
348
361
|
transportCode = code;
|
|
@@ -353,6 +366,7 @@ function safeRunnerCauseMetadata(error) {
|
|
|
353
366
|
}
|
|
354
367
|
}
|
|
355
368
|
return {
|
|
369
|
+
...exceptionFrames.length ? { exceptionFrames } : {},
|
|
356
370
|
...transportCode ? { transportCode } : {},
|
|
357
371
|
...exceptionName ? { exceptionName } : {}
|
|
358
372
|
};
|
|
@@ -414,4 +428,4 @@ export {
|
|
|
414
428
|
CommerceModelInvocationFailure,
|
|
415
429
|
mapRunnerFailure
|
|
416
430
|
};
|
|
417
|
-
//# sourceMappingURL=chunk-
|
|
431
|
+
//# sourceMappingURL=chunk-FDLZJHK7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commerce/runner/diagnostic-messages.ts","../src/commerce/runner/diagnostics.ts","../src/commerce/runner/failure.ts"],"sourcesContent":["import type { RunnerDiagnosticReason, RunnerTransportCode } from \"./diagnostics.js\";\n\ntype Explanation = Readonly<{ message: string; action: string }>;\n\n/** Fixed operator-facing explanations. No provider-supplied or customer-supplied text is interpolated. */\nconst explanations = {\n MODEL_OUTPUT_TOKENS_EXHAUSTED: [\"The provider exhausted output tokens without visible text or tool calls.\", \"Inspect token usage and provider response; do not fabricate a reply or retry silently.\"],\n CANCELLED_BY_CALLER: [\"The calling service cancelled this conversation turn.\", \"Inspect caller cancellation and superseded-message handling.\"],\n TURN_DEADLINE_EXCEEDED: [\"The conversation turn exceeded its overall deadline.\", \"Inspect elapsed time across the model and tool calls.\"],\n OPERATION_TIMEOUT: [\"One model or tool operation exceeded its per-operation time limit.\", \"Inspect the operation stage, provider latency and timeout configuration.\"],\n UPSTREAM_OPERATION_FAILED: [\"A model or tool operation threw an exception before returning a usable result.\", \"Inspect the stage, exceptionName and transportCode; check upstream service health.\"],\n UNEXPECTED_EXCEPTION: [\"The runner encountered an unexpected exception.\", \"Inspect the failing stage and exceptionName; investigate the owning service.\"],\n INPUT_TOO_LARGE: [\"The manifest or conversation grant exceeded the allowed payload size.\", \"Reduce the manifest or grant size and check the producer's limits.\"],\n TURN_INVALID: [\"The supplied conversation-turn identity failed schema validation.\", \"Inspect the reported schema issue paths and the turn producer.\"],\n GRANT_INVALID: [\"The supplied conversation grant failed schema validation.\", \"Inspect the reported schema issue paths and grant issuer.\"],\n MANIFEST_INVALID: [\"The supplied capability manifest failed schema validation.\", \"Verify manifest version and schema fields against the published contract.\"],\n GRANT_MISMATCH: [\"The turn identity, grant and manifest do not belong to the same authorised conversation.\", \"Check shop, conversation, grant and inbound-version correlation; do not bypass authorization.\"],\n RUNNER_VERSION_INCOMPATIBLE: [\"The release manifest requires a different runner version.\", \"Align the deployed Shared runner version with the release's compatibility range.\"],\n RESPONSE_CONTRACT_INVALID: [\"The trusted final-response contract failed integrity or compatibility verification.\", \"Recheck the published release and contract digest.\"],\n LANGUAGE_INVALID: [\"The supplied conversation language or language-source fields are invalid.\", \"Check the host language configuration and supported locale values.\"],\n BUDGET_INVALID: [\"A configured model, remote-call, deadline or token budget is invalid.\", \"Supply positive safe integers for each budget; the caller owns budget policy.\"],\n CONTEXT_INVALID: [\"The trusted instructions, history or context failed size or shape constraints.\", \"Inspect context construction and trim oversized history or instructions.\"],\n TOOL_REGISTRATION_INVALID: [\"The host registered duplicate or otherwise invalid tools.\", \"Check the tool registry supplied to the runner.\"],\n MODEL_STEP_BUDGET_EXHAUSTED: [\"The model used every allowed reasoning step without reaching a valid final answer.\", \"Inspect model routing and tool-call loops; reassess the configured step budget.\"],\n MODEL_INVOCATION_FAILED: [\"The model invocation failed without a provider-specific diagnostic.\", \"Inspect the model host and preserve a typed provider failure at its boundary.\"],\n MODEL_STEP_NOT_OBJECT: [\"The model step was not a non-null object.\", \"Check the model adapter's returned step type.\"],\n MODEL_STEP_CALLS_MISSING: [\"The model step did not contain a calls field.\", \"Ensure the model adapter returns a calls array, even when empty.\"],\n MODEL_STEP_CALLS_NOT_ARRAY: [\"The model step's calls field was not an array.\", \"Ensure the model adapter maps provider tool calls to an array.\"],\n MODEL_OUTPUT_TOKENS_MISSING: [\"The model step did not contain an outputTokens field.\", \"Ensure the adapter includes the provider's output-token usage count.\"],\n MODEL_OUTPUT_TOKENS_NOT_SAFE_INTEGER: [\"The model step's outputTokens was not a safe integer.\", \"Ensure the adapter returns a finite, whole-number output token count.\"],\n MODEL_OUTPUT_TOKENS_NEGATIVE: [\"The model step's outputTokens was negative.\", \"Correct the model adapter's token-usage mapping; token counts cannot be negative.\"],\n MODEL_OUTPUT_TOKENS_OVER_BUDGET: [\"The model step's outputTokens exceeded the configured output-token budget.\", \"Inspect the model's maxOutputTokens enforcement and returned usage count.\"],\n MODEL_TOOL_CALL_LIMIT_EXCEEDED: [\"The model step contained more than 32 tool calls.\", \"Limit provider tool-call output to the runner's maximum of 32 calls.\"],\n MODEL_TOOL_CALL_NULL: [\"The model returned a null tool-call entry.\", \"Check the model adapter's tool-call conversion; each entry must have a name and arguments object.\"],\n MODEL_TOOL_CALL_NOT_OBJECT: [\"The model returned a tool-call entry that was not an object.\", \"Check the model adapter's tool-call conversion; arrays and primitive entries are invalid.\"],\n MODEL_TOOL_CALL_NAME_MISSING: [\"The model returned a tool call without a name field.\", \"Include a non-empty name string in every model tool call.\"],\n MODEL_TOOL_CALL_NAME_NOT_STRING: [\"The model returned a tool call whose name was not a string.\", \"Ensure the tool-call name is a string in the model adapter.\"],\n MODEL_TOOL_CALL_NAME_EMPTY: [\"The model returned a tool call with an empty name.\", \"Check provider tool naming and model adapter normalization.\"],\n MODEL_TOOL_CALL_NAME_TOO_LONG: [\"The model returned a tool-call name longer than 128 characters.\", \"Limit each tool-call name to 128 characters in the model adapter.\"],\n MODEL_TOOL_CALL_ARGUMENTS_MISSING: [\"The model returned a tool call without an arguments field.\", \"Include an arguments object for every model tool call.\"],\n MODEL_TOOL_CALL_ARGUMENTS_NULL: [\"The model returned a tool call with null arguments.\", \"Return an object, including an empty object when appropriate, instead of null arguments.\"],\n MODEL_TOOL_CALL_ARGUMENTS_NOT_OBJECT: [\"The model returned tool-call arguments that were not an object.\", \"Convert provider tool-call arguments to a non-array object in the model adapter.\"],\n MODEL_TEXT_NOT_STRING: [\"The model's candidate reply was not text.\", \"Check the model adapter's conversion of the provider response content.\"],\n MODEL_TEXT_TOO_LONG: [\"The model's candidate reply exceeded 4096 characters.\", \"Limit the natural-language reply to the response contract's maximum length.\"],\n MODEL_STEP_TOO_LARGE: [\"The model step exceeded the 262144-byte serialized payload limit.\", \"Reduce tool-call argument payload size before returning the model step.\"],\n MODEL_STEP_NOT_SERIALIZABLE: [\"The model step could not be encoded as canonical JSON.\", \"Inspect model-step data for cycles, invalid Unicode or unsupported JSON values.\"],\n MODEL_STEP_VALIDATION_FAILED: [\"The runner threw an exception while reading or checking the model step.\", \"Inspect the safe exception metadata and model-step adapter implementation.\"],\n MODEL_CALL_ROUTE_INVALID: [\"The model produced neither a usable reply nor an allowed tool-call route, or mixed finalResponse with other calls.\", \"Inspect provider finish conditions, reply content and tool-call routing.\"],\n MODEL_RESULT_MISSING: [\"The runner graph finished without producing a final response.\", \"Inspect graph termination and the preceding model/tool steps.\"],\n REQUEST_INVALID: [\"The model adapter received an invalid invocation request.\", \"Inspect the model request construction and trusted payload validation.\"],\n MODEL_REQUEST_HISTORY_INVALID: [\"A history entry sent to the model was malformed or exceeded its text limit.\", \"Inspect the history formatter and permitted role/text shape.\"],\n MODEL_REQUEST_TOOL_RESULT_INVALID: [\"A tool-result message sent to the model failed the expected contract.\", \"Inspect the tool-result formatter and CommerceToolResult schema.\"],\n MODEL_CONFIGURATION_INVALID: [\"The configured model provider, model ID, options or schema version is invalid.\", \"Correct model selection and published configuration before invoking the model.\"],\n MODEL_CREDENTIAL_INVALID: [\"The model adapter received an empty or invalid credential value.\", \"Check secret resolution, credential availability and injection into the model host.\"],\n MODEL_ADAPTER_INITIALIZATION_FAILED: [\"The model client could not be constructed from its validated configuration.\", \"Inspect model SDK initialization and dependency compatibility.\"],\n MODEL_REQUEST_CANCELLED: [\"The model request was cancelled before invocation.\", \"Inspect caller cancellation; do not interpret this as provider downtime.\"],\n TOOL_BIND_FAILED: [\"The model client rejected the supplied tool definitions during binding.\", \"Check provider tool-calling support and function schemas.\"],\n PROVIDER_AUTH_FAILED: [\"The model provider rejected authentication or access to the requested resource.\", \"Check the provider credential, permissions and selected model.\"],\n PROVIDER_RATE_LIMITED: [\"The model provider returned HTTP 429: requests are being rate-limited or the quota is exhausted.\", \"Check provider usage, billing/quota and any Retry-After guidance; use bounded backoff.\"],\n PROVIDER_HTTP_ERROR: [\"The model provider returned an unsuccessful HTTP response.\", \"Inspect statusCode and check provider availability, model access and request compatibility.\"],\n PROVIDER_REQUEST_FAILED: [\"The model provider request failed before a usable HTTP response was received.\", \"Inspect transportCode and exceptionName; check DNS, connectivity, TLS and provider availability.\"],\n PROVIDER_RESPONSE_INVALID: [\"The model provider returned a response that the adapter cannot interpret.\", \"Check the provider SDK response shape and model adapter compatibility.\"],\n PROVIDER_RESPONSE_USAGE_INVALID: [\"The model response is missing a valid output-token usage count.\", \"Inspect provider usage_metadata.output_tokens and SDK response mapping.\"],\n PROVIDER_RESPONSE_TOOL_CALL_INVALID: [\"The model response contains a malformed tool call name or arguments object.\", \"Inspect provider tool-call formatting and SDK response mapping.\"],\n TOOL_DESCRIPTOR_MISMATCH: [\"The requested tool does not match an authorised published tool descriptor.\", \"Check published tool revisions and descriptor hashes.\"],\n TOOL_AUTHORIZATION_FAILED: [\"The host failed while checking whether a requested tool remains authorised.\", \"Inspect authorization-service availability and the requested tool.\"],\n TOOL_INPUT_INVALID: [\"The model supplied tool arguments that do not satisfy the tool input schema.\", \"Inspect issuePaths and the model's tool schema; do not invoke the tool.\"],\n TOOL_CALL_BUDGET_EXHAUSTED: [\"The turn exhausted its remote-call allowance before the next tool request.\", \"Inspect repeated tool calls, retry attempts and budget settings.\"],\n TOOL_EXECUTION_FAILED: [\"An authorised tool threw an exception during execution.\", \"Inspect the toolName, attempt, transportCode and owning tool service.\"],\n TOOL_RESULT_TOO_LARGE: [\"A tool returned more data than the runner permits.\", \"Reduce or paginate tool output before returning it to the runner.\"],\n TOOL_RESULT_INVALID: [\"A tool returned a result that failed serialization or schema validation.\", \"Inspect issuePaths and the tool adapter's CommerceToolResult output.\"],\n TOOL_RESULT_MISSING: [\"The tool execution loop ended without receiving a result.\", \"Inspect tool execution lifecycle and retry completion.\"],\n TOOL_STALE_TURN: [\"The tool reported that the conversation turn is no longer current.\", \"Inspect conversation versioning and abandon this obsolete turn.\"],\n EVIDENCE_INVALID: [\"Tool evidence failed its integrity, grant or freshness checks.\", \"Inspect tool evidence generation and turn/grant correlation.\"],\n FINAL_PRODUCT_SELECTION_MISSING: [\"The model did not return the required observed product selections during its bounded final-response correction.\", \"Inspect the pinned response schema and model output; reuse verified product results rather than repeating provider searches.\"],\n FINAL_SCHEMA_INVALID: [\"The model's finalResponse failed runtime schema validation.\", \"Inspect issueCodes and issuePaths; correct response formatting or tool instructions.\"],\n FINAL_LANGUAGE_MISMATCH: [\"The final answer included language detection despite an explicit customer language.\", \"Check model instructions governing language metadata.\"],\n FINAL_REFERRAL_REQUIRED: [\"The model did not produce the mandatory store referral after a denied or failed tool.\", \"Check final-response referral rules and the recorded tool outcome.\"],\n FINAL_EVIDENCE_INVALID: [\"The final answer cited absent, unqualified or incorrectly scoped evidence.\", \"Inspect evidence identity, qualification and answer construction.\"],\n FINAL_EVIDENCE_EXPIRED: [\"The final answer cited evidence that expired during the turn.\", \"Refresh evidence and reconsider the turn's remaining deadline.\"],\n EVIDENCE_RESERVATION_EXCEEDED: [\"The final answer cited more evidence than the remaining remote-call reservation allows.\", \"Inspect evidence references and the remote-call budget reservation contract.\"],\n} as const satisfies Record<RunnerDiagnosticReason, readonly [string, string]>;\n\nconst transports = {\n ENOTFOUND: [\"The provider hostname could not be resolved by DNS.\", \"Check the configured hostname and DNS resolver.\"],\n EAI_AGAIN: [\"The provider DNS lookup temporarily failed.\", \"Check DNS availability and retry after a short delay.\"],\n ECONNREFUSED: [\"The provider connection was actively refused.\", \"Check the host, port and service listener.\"],\n ECONNRESET: [\"The provider connection was reset before the request finished.\", \"Check upstream restarts, proxies and connection stability.\"],\n ETIMEDOUT: [\"The network connection to the provider timed out.\", \"Check network reachability and upstream latency.\"],\n ENETUNREACH: [\"The network route to the provider is unreachable.\", \"Check egress routes, firewall and network configuration.\"],\n EHOSTUNREACH: [\"The provider host is unreachable.\", \"Check provider host, routing and firewall rules.\"],\n EPIPE: [\"The network connection closed while data was being written.\", \"Check upstream connection stability and proxy timeouts.\"],\n UND_ERR_CONNECT_TIMEOUT: [\"The HTTP client timed out establishing a provider connection.\", \"Check egress connectivity and provider latency.\"],\n UND_ERR_HEADERS_TIMEOUT: [\"The HTTP client timed out waiting for provider response headers.\", \"Check provider availability and response latency.\"],\n UND_ERR_SOCKET: [\"The HTTP client reported a socket failure.\", \"Check network and upstream connection stability.\"],\n CERT_HAS_EXPIRED: [\"The remote TLS certificate has expired.\", \"Check the certificate chain and provider endpoint.\"],\n UNABLE_TO_VERIFY_LEAF_SIGNATURE: [\"TLS certificate chain verification failed.\", \"Check trusted roots and certificate chain; do not disable TLS validation.\"],\n DEPTH_ZERO_SELF_SIGNED_CERT: [\"TLS rejected an untrusted self-signed certificate.\", \"Check trusted roots and proxy certificates; do not disable TLS validation.\"],\n ERR_TLS_CERT_ALTNAME_INVALID: [\"The provider TLS certificate does not match its hostname.\", \"Check endpoint hostname and certificate SANs.\"],\n} as const satisfies Record<RunnerTransportCode, readonly [string, string]>;\n\n/** HTTP descriptions are based on status alone and make no claims about hidden provider response bodies. */\nconst httpDetails: Readonly<Record<number, Explanation>> = {\n 400: { message: \"The provider rejected the request as invalid (HTTP 400).\", action: \"Check request parameters and provider model capabilities.\" },\n 402: { message: \"The provider returned HTTP 402 (payment or credits required).\", action: \"Check provider billing, available credits and account limits.\" },\n 404: { message: \"The provider returned HTTP 404 (endpoint or model not found).\", action: \"Check provider model ID, permissions and API route.\" },\n 413: { message: \"The provider rejected an oversized request (HTTP 413).\", action: \"Reduce request size and review model context limits.\" },\n 422: { message: \"The provider could not process the request parameters (HTTP 422).\", action: \"Check model input and tool schema compatibility.\" },\n 500: { message: \"The provider returned an internal server error (HTTP 500).\", action: \"Check provider status and use bounded retries.\" },\n 502: { message: \"The provider gateway reported an upstream error (HTTP 502).\", action: \"Check provider status, gateway health and bounded retries.\" },\n 503: { message: \"The provider is temporarily unavailable (HTTP 503).\", action: \"Check provider availability and backoff guidance.\" },\n 504: { message: \"The provider gateway timed out (HTTP 504).\", action: \"Check upstream latency and provider availability.\" },\n};\n\nexport function describeRunnerDiagnostic(input: {\n reasonCode: RunnerDiagnosticReason;\n statusCode?: number;\n transportCode?: RunnerTransportCode;\n callIndex?: number;\n}): Explanation {\n if (\n input.transportCode &&\n [\"PROVIDER_REQUEST_FAILED\", \"UPSTREAM_OPERATION_FAILED\", \"MODEL_INVOCATION_FAILED\", \"TOOL_EXECUTION_FAILED\", \"TOOL_AUTHORIZATION_FAILED\"].includes(input.reasonCode)\n ) {\n const explanation = transports[input.transportCode];\n return { message: `${explanation[0]} (${input.transportCode})`, action: explanation[1] };\n }\n if (input.reasonCode === \"PROVIDER_HTTP_ERROR\" && input.statusCode !== undefined && httpDetails[input.statusCode])\n return httpDetails[input.statusCode];\n const explanation = explanations[input.reasonCode];\n if (input.reasonCode === \"MODEL_TOOL_CALL_NULL\" && input.callIndex !== undefined)\n return {\n message: `The model returned a null tool-call entry at index ${input.callIndex}. Each tool call must contain a non-empty name and an arguments object.`,\n action: explanation[1],\n };\n if (input.reasonCode.startsWith(\"MODEL_TOOL_CALL_\") && input.callIndex !== undefined)\n return { message: `${explanation[0].replace(/\\.$/, \"\")} (index ${input.callIndex}).`, action: explanation[1] };\n return { message: explanation[0], action: explanation[1] };\n}\n","import type { ZodError } from \"zod\";\nimport { describeRunnerDiagnostic } from \"./diagnostic-messages.js\";\n\n/** Finite, non-customer-facing failure taxonomy for Commerce hosts and logs. */\nexport const RUNNER_DIAGNOSTIC_STAGES = [\n \"preflight.validate\", \"preflight.contract\", \"runtime.cancellation\", \"runtime.deadline\",\n \"runtime.operation\", \"tools.resolve\", \"model.invoke\", \"model.validate\", \"model.route\",\n \"tool.authorize\", \"tool.validate\", \"tool.execute\", \"tool.result\", \"evidence.validate\",\n \"final.validate\", \"graph.execute\",\n] as const;\nexport type RunnerDiagnosticStage = typeof RUNNER_DIAGNOSTIC_STAGES[number];\n\nexport const RUNNER_DIAGNOSTIC_REASONS = [\n \"CANCELLED_BY_CALLER\", \"TURN_DEADLINE_EXCEEDED\", \"OPERATION_TIMEOUT\",\n \"UPSTREAM_OPERATION_FAILED\", \"UNEXPECTED_EXCEPTION\",\n \"INPUT_TOO_LARGE\", \"TURN_INVALID\", \"GRANT_INVALID\", \"MANIFEST_INVALID\",\n \"GRANT_MISMATCH\", \"RUNNER_VERSION_INCOMPATIBLE\", \"RESPONSE_CONTRACT_INVALID\",\n \"LANGUAGE_INVALID\", \"BUDGET_INVALID\", \"CONTEXT_INVALID\", \"TOOL_REGISTRATION_INVALID\",\n \"MODEL_STEP_BUDGET_EXHAUSTED\", \"MODEL_INVOCATION_FAILED\",\n \"MODEL_STEP_NOT_OBJECT\", \"MODEL_STEP_CALLS_MISSING\", \"MODEL_STEP_CALLS_NOT_ARRAY\",\n \"MODEL_OUTPUT_TOKENS_MISSING\", \"MODEL_OUTPUT_TOKENS_NOT_SAFE_INTEGER\",\n \"MODEL_OUTPUT_TOKENS_EXHAUSTED\", \"MODEL_OUTPUT_TOKENS_NEGATIVE\", \"MODEL_OUTPUT_TOKENS_OVER_BUDGET\",\n \"MODEL_TOOL_CALL_LIMIT_EXCEEDED\", \"MODEL_TOOL_CALL_NULL\", \"MODEL_TOOL_CALL_NOT_OBJECT\",\n \"MODEL_TOOL_CALL_NAME_MISSING\", \"MODEL_TOOL_CALL_NAME_NOT_STRING\", \"MODEL_TOOL_CALL_NAME_EMPTY\",\n \"MODEL_TOOL_CALL_NAME_TOO_LONG\", \"MODEL_TOOL_CALL_ARGUMENTS_MISSING\",\n \"MODEL_TOOL_CALL_ARGUMENTS_NULL\", \"MODEL_TOOL_CALL_ARGUMENTS_NOT_OBJECT\",\n \"MODEL_TEXT_NOT_STRING\", \"MODEL_TEXT_TOO_LONG\",\n \"MODEL_STEP_TOO_LARGE\", \"MODEL_STEP_NOT_SERIALIZABLE\", \"MODEL_STEP_VALIDATION_FAILED\",\n \"MODEL_CALL_ROUTE_INVALID\", \"MODEL_RESULT_MISSING\",\n \"REQUEST_INVALID\", \"MODEL_REQUEST_HISTORY_INVALID\", \"MODEL_REQUEST_TOOL_RESULT_INVALID\",\n \"MODEL_CONFIGURATION_INVALID\", \"MODEL_CREDENTIAL_INVALID\", \"MODEL_ADAPTER_INITIALIZATION_FAILED\",\n \"MODEL_REQUEST_CANCELLED\", \"TOOL_BIND_FAILED\", \"PROVIDER_AUTH_FAILED\", \"PROVIDER_RATE_LIMITED\",\n \"PROVIDER_HTTP_ERROR\", \"PROVIDER_REQUEST_FAILED\", \"PROVIDER_RESPONSE_INVALID\",\n \"PROVIDER_RESPONSE_USAGE_INVALID\", \"PROVIDER_RESPONSE_TOOL_CALL_INVALID\",\n \"TOOL_DESCRIPTOR_MISMATCH\", \"TOOL_AUTHORIZATION_FAILED\", \"TOOL_INPUT_INVALID\",\n \"TOOL_CALL_BUDGET_EXHAUSTED\", \"TOOL_EXECUTION_FAILED\", \"TOOL_RESULT_TOO_LARGE\",\n \"TOOL_RESULT_INVALID\", \"TOOL_RESULT_MISSING\", \"TOOL_STALE_TURN\",\n \"EVIDENCE_INVALID\", \"FINAL_PRODUCT_SELECTION_MISSING\", \"FINAL_SCHEMA_INVALID\", \"FINAL_LANGUAGE_MISMATCH\",\n \"FINAL_REFERRAL_REQUIRED\", \"FINAL_EVIDENCE_INVALID\", \"FINAL_EVIDENCE_EXPIRED\",\n \"EVIDENCE_RESERVATION_EXCEEDED\",\n] as const;\nexport type RunnerDiagnosticReason = typeof RUNNER_DIAGNOSTIC_REASONS[number];\n\n/** Recognised transport failures, never arbitrary OS/provider error codes. */\nexport const RUNNER_TRANSPORT_CODES = [\n \"ENOTFOUND\", \"EAI_AGAIN\", \"ECONNREFUSED\", \"ECONNRESET\", \"ETIMEDOUT\",\n \"ENETUNREACH\", \"EHOSTUNREACH\", \"EPIPE\", \"UND_ERR_CONNECT_TIMEOUT\",\n \"UND_ERR_HEADERS_TIMEOUT\", \"UND_ERR_SOCKET\", \"CERT_HAS_EXPIRED\",\n \"UNABLE_TO_VERIFY_LEAF_SIGNATURE\", \"DEPTH_ZERO_SELF_SIGNED_CERT\",\n \"ERR_TLS_CERT_ALTNAME_INVALID\",\n] as const;\nexport type RunnerTransportCode = typeof RUNNER_TRANSPORT_CODES[number];\n\nconst recognizedExceptionNames = new Set([\n \"TypeError\", \"ReferenceError\", \"SyntaxError\", \"RangeError\", \"URIError\",\n \"EvalError\", \"AggregateError\", \"AbortError\", \"TimeoutError\",\n]);\nconst recognizedTransportCodes = new Set<string>(RUNNER_TRANSPORT_CODES);\n\n\n/** All optional fields are allowlisted; never include free-form provider or exception text. */\nexport type RunnerDiagnostic = Readonly<{\n stage: RunnerDiagnosticStage;\n reasonCode: RunnerDiagnosticReason;\n /** Fixed, safe operator explanation; computed from the validated code and detail. */\n reasonMessage?: string;\n /** Fixed, safe next step for the operator; never provider-supplied. */\n operatorAction?: string;\n /** Transport/exception details are from a fixed allowlist, not error.message. */\n transportCode?: RunnerTransportCode;\n exceptionName?: string;\n validationPhase?: \"schema\" | \"selection\" | \"observations\";\n exceptionFrames?: readonly string[];\n statusCode?: number;\n providerCode?: number;\n providerStage?: \"request\" | \"binding\" | \"provider\" | \"response\";\n modelStep?: number;\n /** Zero-based index for a rejected tool call. Never includes user content. */\n callIndex?: number;\n remoteCallNumber?: number;\n attempt?: number;\n toolName?: string;\n issueCount?: number;\n issueCodes?: readonly string[];\n issuePaths?: readonly string[];\n}>;\n\nconst stages = new Set<string>(RUNNER_DIAGNOSTIC_STAGES);\nconst reasons = new Set<string>(RUNNER_DIAGNOSTIC_REASONS);\nconst issueCodes = new Set([\n \"invalid_type\", \"too_big\", \"too_small\", \"invalid_format\", \"invalid_value\",\n \"unrecognized_keys\", \"invalid_union\", \"invalid_key\", \"invalid_element\", \"custom\",\n]);\nconst knownPathParts = new Set([\n \"turn\", \"grant\", \"manifest\", \"shopId\", \"conversationId\", \"checkoutRecoveryId\",\n \"inboundVersion\", \"initialInboundVersion\", \"id\", \"releaseId\", \"responseContract\",\n \"responseContractHash\", \"runnerCompatibility\", \"grantedTools\", \"capabilities\",\n \"featureBehaviours\", \"language\", \"tag\", \"source\", \"budget\", \"modelSteps\",\n \"remoteCalls\", \"deadlineMs\", \"outputTokens\", \"history\", \"context\", \"instructions\",\n \"answerKind\", \"referralReason\", \"replyText\", \"detectedLanguageTag\", \"evidenceIds\",\n \"details\", \"contractVersion\", \"status\", \"data\", \"renderedText\", \"calls\",\n \"name\", \"arguments\", \"toolName\", \"toolId\", \"toolRevisionId\", \"definitionVersion\",\n]);\n\nfunction boundedInt(value: unknown, minimum: number, maximum: number): number | undefined {\n return Number.isSafeInteger(value) && (value as number) >= minimum && (value as number) <= maximum\n ? value as number\n : undefined;\n}\n\n/** Also sanitize internally constructed diagnostics before exposing them to hosts or logs. */\nexport function safeRunnerDiagnostic(diagnostic: RunnerDiagnostic): RunnerDiagnostic {\n const fields: RunnerDiagnostic = {\n stage: stages.has(diagnostic.stage) ? diagnostic.stage : \"graph.execute\",\n reasonCode: reasons.has(diagnostic.reasonCode) ? diagnostic.reasonCode : \"UNEXPECTED_EXCEPTION\",\n ...(recognizedTransportCodes.has(diagnostic.transportCode ?? \"\") ? { transportCode: diagnostic.transportCode } : {}),\n ...([\"schema\", \"selection\", \"observations\"].includes(diagnostic.validationPhase ?? \"\") ? { validationPhase: diagnostic.validationPhase } : {}),\n ...(Array.isArray(diagnostic.exceptionFrames) ? { exceptionFrames: diagnostic.exceptionFrames.filter(frame => typeof frame === \"string\" && frame.length <= 240 && /^[a-zA-Z0-9_./:@<> -]+$/.test(frame)).slice(0, 6) } : {}),\n ...(recognizedExceptionNames.has(diagnostic.exceptionName ?? \"\") ? { exceptionName: diagnostic.exceptionName } : {}),\n ...(boundedInt(diagnostic.statusCode, 100, 599) === undefined ? {} : { statusCode: diagnostic.statusCode }),\n ...(boundedInt(diagnostic.providerCode, 0, 999999) === undefined ? {} : { providerCode: diagnostic.providerCode }),\n ...([\"request\", \"binding\", \"provider\", \"response\"].includes(diagnostic.providerStage ?? \"\")\n ? { providerStage: diagnostic.providerStage } : {}),\n ...(boundedInt(diagnostic.modelStep, 1, 12) === undefined ? {} : { modelStep: diagnostic.modelStep }),\n ...(boundedInt(diagnostic.callIndex, 0, 31) === undefined ? {} : { callIndex: diagnostic.callIndex }),\n ...(boundedInt(diagnostic.remoteCallNumber, 1, 10) === undefined ? {} : { remoteCallNumber: diagnostic.remoteCallNumber }),\n ...(boundedInt(diagnostic.attempt, 1, 2) === undefined ? {} : { attempt: diagnostic.attempt }),\n ...(typeof diagnostic.toolName === \"string\" && /^[a-z][a-z0-9_]{0,127}$/.test(diagnostic.toolName)\n ? { toolName: diagnostic.toolName } : {}),\n ...(boundedInt(diagnostic.issueCount, 0, 10000) === undefined ? {} : { issueCount: diagnostic.issueCount }),\n ...(Array.isArray(diagnostic.issueCodes) ? {\n issueCodes: [...new Set(diagnostic.issueCodes.filter((code) => issueCodes.has(code)))].slice(0, 5),\n } : {}),\n ...(Array.isArray(diagnostic.issuePaths) ? {\n issuePaths: [...new Set(diagnostic.issuePaths.filter((path) =>\n typeof path === \"string\" && path.length <= 80 && path.split(\".\").every((part) => knownPathParts.has(part)),\n ))].slice(0, 5),\n } : {}),\n };\n const explanation = describeRunnerDiagnostic(fields);\n return Object.freeze({ ...fields, reasonMessage: explanation.message, operatorAction: explanation.action });\n}\n\n/** Extract only known error names and network codes from a bounded cause chain. */\nexport function safeRunnerCauseMetadata(error: unknown): Pick<RunnerDiagnostic, \"transportCode\" | \"exceptionName\" | \"exceptionFrames\"> {\n const visited = new Set<unknown>();\n let current = error;\n let transportCode: RunnerTransportCode | undefined;\n let exceptionName: string | undefined;\n let exceptionFrames: string[] = [];\n for (let depth = 0; depth < 6 && current instanceof Error && !visited.has(current); depth += 1) {\n visited.add(current);\n try {\n if (!exceptionFrames.length && typeof current.stack === \"string\") {\n // Keep code locations only, never the exception headline, arguments, URLs or query strings.\n exceptionFrames = current.stack.split(\"\\n\").slice(1).flatMap(line => {\n const match = line.match(/(?:^|[/\\\\])((?:[^/\\\\() ]+\\/)*(?:[^/\\\\() ]+\\.(?:[cm]?js|tsx?)):\\d+:\\d+)\\)?$/);\n if (!match) return [];\n const location = match[1].split('/').slice(-4).join('/');\n return /^[a-zA-Z0-9_./:@<> -]{1,240}$/.test(location) ? [location] : [];\n }).slice(0, 6);\n }\n const code = (current as Error & { code?: unknown }).code;\n if (typeof code === \"string\" && recognizedTransportCodes.has(code))\n transportCode = code as RunnerTransportCode;\n if (!exceptionName && recognizedExceptionNames.has(current.name)) exceptionName = current.name;\n current = current.cause;\n } catch {\n break; // A hostile error object/getter must not interrupt the original failure path.\n }\n }\n return {\n ...(exceptionFrames.length ? { exceptionFrames } : {}),\n ...(transportCode ? { transportCode } : {}),\n ...(exceptionName ? { exceptionName } : {}),\n };\n}\n\n/** Only static schema keys and Zod's finite issue-code vocabulary may leave this boundary. */\nexport function schemaIssueMetadata(error: ZodError): Pick<RunnerDiagnostic, \"issueCount\" | \"issueCodes\" | \"issuePaths\"> {\n const paths = error.issues.map((issue) =>\n issue.path.filter((part): part is string => typeof part === \"string\")\n .filter((part) => knownPathParts.has(part)).slice(0, 3).join(\".\"),\n ).filter(Boolean);\n return {\n issueCount: Math.min(error.issues.length, 10000),\n issueCodes: [...new Set(error.issues.map((issue) => issue.code).filter((code) => issueCodes.has(code)))].slice(0, 5),\n issuePaths: [...new Set(paths)].slice(0, 5),\n };\n}\n","import type { RunCommerceTurnInput, RunnerErrorCode, RunCommerceTurnResult } from \"./types.js\";\nimport { safeRunnerCauseMetadata, safeRunnerDiagnostic, type RunnerDiagnostic, type RunnerDiagnosticStage } from \"./diagnostics.js\";\n\nexport class RunnerFailure extends Error {\n readonly diagnostic: RunnerDiagnostic;\n\n constructor(readonly code: RunnerErrorCode, diagnostic: RunnerDiagnostic, cause?: unknown) {\n super(code, { cause });\n this.name = \"RunnerFailure\";\n this.diagnostic = safeRunnerDiagnostic({ ...safeRunnerCauseMetadata(cause), ...diagnostic });\n }\n}\n\n/** Typed, provider-independent cause that model invokers may throw. */\nexport class CommerceModelInvocationFailure extends Error {\n readonly diagnostic: RunnerDiagnostic;\n\n constructor(diagnostic: RunnerDiagnostic, cause?: unknown) {\n super(\"Commerce model unavailable\", { cause });\n this.name = \"CommerceModelInvocationFailure\";\n this.diagnostic = safeRunnerDiagnostic({ ...safeRunnerCauseMetadata(cause), ...diagnostic });\n }\n}\n\nfunction findRunnerFailure(error: unknown): RunnerFailure | undefined {\n const visited = new Set<unknown>();\n let current = error;\n for (let depth = 0; depth < 6 && current instanceof Error && !visited.has(current); depth += 1) {\n visited.add(current);\n if (current instanceof RunnerFailure) return current;\n current = current.cause;\n }\n return undefined;\n}\n\nexport function mapRunnerFailure(\n error: unknown, signal?: AbortSignal, fallbackStage: RunnerDiagnosticStage = \"graph.execute\",\n): RunCommerceTurnResult {\n const failure = findRunnerFailure(error);\n const code = failure?.code ?? (signal?.aborted ? \"CANCELLED\" : \"INVALID_INPUT\");\n const diagnostic = failure?.diagnostic ?? safeRunnerDiagnostic(signal?.aborted\n ? { stage: \"runtime.cancellation\", reasonCode: \"CANCELLED_BY_CALLER\" }\n : { stage: fallbackStage, reasonCode: \"UNEXPECTED_EXCEPTION\", ...safeRunnerCauseMetadata(error) });\n return {\n ok: false,\n error: { code, retryable: code === \"UNAVAILABLE\" || code === \"DEADLINE\", diagnostic },\n };\n}\n\nexport function failureCode(error: unknown): RunnerErrorCode {\n return findRunnerFailure(error)?.code ?? \"INVALID_INPUT\";\n}\n\nexport function inputSignal(input: RunCommerceTurnInput): AbortSignal {\n return input.signal;\n}\n"],"mappings":"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","names":["explanation"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { R as RunnerTransportCode, C as CommerceModelInvoker, M as ModelStep } from '../../types-
|
|
1
|
+
import { R as RunnerTransportCode, C as CommerceModelInvoker, M as ModelStep } from '../../types-CZeBh6OR.js';
|
|
2
2
|
import { CommerceModelProvider, CommerceProviderModelId } from './index.js';
|
|
3
3
|
import '../../product-context-D1Xfe1FX.js';
|
|
4
4
|
import '../../response-gHpvLkzy.js';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { g as CommerceToolInputs } from '../../response-gHpvLkzy.js';
|
|
3
|
-
import { C as CommerceModelInvoker } from '../../types-
|
|
3
|
+
import { C as CommerceModelInvoker } from '../../types-CZeBh6OR.js';
|
|
4
4
|
import { S as StructuredLogger } from '../../types-B32wDMLO.js';
|
|
5
5
|
import '../../product-context-D1Xfe1FX.js';
|
|
6
6
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { a as RunnerDiagnostic, b as RunCommerceTurnInput, c as RunCommerceTurnResult } from '../../types-
|
|
2
|
-
export { C as CommerceModelInvoker, d as ModelCall, e as ModelRequest, M as ModelStep, f as RunnerDiagnosticReason, g as RunnerDiagnosticStage, h as RunnerErrorCode, i as RunnerTool } from '../../types-
|
|
1
|
+
import { a as RunnerDiagnostic, b as RunCommerceTurnInput, c as RunCommerceTurnResult } from '../../types-CZeBh6OR.js';
|
|
2
|
+
export { C as CommerceModelInvoker, d as ModelCall, e as ModelRequest, M as ModelStep, f as RunnerDiagnosticReason, g as RunnerDiagnosticStage, h as RunnerErrorCode, i as RunnerTool } from '../../types-CZeBh6OR.js';
|
|
3
3
|
import '../../product-context-D1Xfe1FX.js';
|
|
4
4
|
import '../../response-gHpvLkzy.js';
|
|
5
5
|
import 'zod';
|
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
RunnerFailure,
|
|
9
9
|
mapRunnerFailure,
|
|
10
10
|
schemaIssueMetadata
|
|
11
|
-
} from "../../chunk-
|
|
11
|
+
} from "../../chunk-FDLZJHK7.js";
|
|
12
12
|
import {
|
|
13
13
|
mergeConversationProductContext
|
|
14
14
|
} from "../../chunk-JWX4ZVKK.js";
|
|
@@ -536,7 +536,7 @@ function invokeModelNode(execution) {
|
|
|
536
536
|
history: execution.input.history,
|
|
537
537
|
messages: state.runtimeMessages,
|
|
538
538
|
tools: [
|
|
539
|
-
...state.availableTools.map((descriptor) => ({
|
|
539
|
+
...(state.selectionRepairUsed ? [] : state.availableTools).map((descriptor) => ({
|
|
540
540
|
name: descriptor.name,
|
|
541
541
|
description: descriptor.description,
|
|
542
542
|
inputSchema: descriptor.inputSchema
|
|
@@ -563,6 +563,8 @@ function invokeModelNode(execution) {
|
|
|
563
563
|
step = validateModelStep(raw, execution.prepared.budgets.outputTokens);
|
|
564
564
|
observedStep = step;
|
|
565
565
|
routeModelStep(step);
|
|
566
|
+
if (state.selectionRepairUsed && (step.calls.length !== 1 || step.calls[0]?.name !== "finalResponse"))
|
|
567
|
+
throw new RunnerFailure("INVALID_FINAL", { stage: "final.validate", reasonCode: "FINAL_PRODUCT_SELECTION_MISSING", modelStep });
|
|
566
568
|
} catch (error) {
|
|
567
569
|
logModelInvalid(
|
|
568
570
|
execution.logger,
|
|
@@ -590,7 +592,7 @@ function resolveAvailableToolsNode(execution) {
|
|
|
590
592
|
execution.runtime.checkCancellationAndDeadline();
|
|
591
593
|
if (state.modelSteps >= execution.prepared.budgets.modelSteps)
|
|
592
594
|
throw new RunnerFailure("BUDGET_EXHAUSTED", { stage: "tools.resolve", reasonCode: "MODEL_STEP_BUDGET_EXHAUSTED" });
|
|
593
|
-
const availableTools = await resolveAvailableTools(execution.prepared, execution.runtime);
|
|
595
|
+
const availableTools = state.selectionRepairUsed ? [] : await resolveAvailableTools(execution.prepared, execution.runtime);
|
|
594
596
|
return { availableTools };
|
|
595
597
|
};
|
|
596
598
|
}
|
|
@@ -656,6 +658,7 @@ function validateFinalResponseNode(execution) {
|
|
|
656
658
|
return async (state) => {
|
|
657
659
|
if (!state.pendingStep)
|
|
658
660
|
throw new RunnerFailure("INVALID_FINAL", { stage: "final.validate", reasonCode: "MODEL_RESULT_MISSING" });
|
|
661
|
+
let validationPhase = "schema";
|
|
659
662
|
try {
|
|
660
663
|
const raw = state.pendingStep.calls.length === 0 ? {
|
|
661
664
|
answerKind: state.requiredReferral ? "REFER_TO_STORE" : "ANSWER",
|
|
@@ -676,22 +679,27 @@ function validateFinalResponseNode(execution) {
|
|
|
676
679
|
languageSource: execution.input.language.source,
|
|
677
680
|
checkCancellationAndDeadline: execution.runtime.checkCancellationAndDeadline
|
|
678
681
|
});
|
|
682
|
+
validationPhase = "selection";
|
|
679
683
|
const fields = execution.prepared.response.detailsSchema.properties ?? {};
|
|
680
684
|
const supportsSelections = ["productRecommendations", "productDetailSelections", "productOptionSelections"].some((key) => Object.hasOwn(fields, key));
|
|
681
685
|
const selected = ["productRecommendations", "productDetailSelections", "productOptionSelections"].some((key) => Array.isArray(final.details[key]) && final.details[key].length > 0);
|
|
686
|
+
validationPhase = "observations";
|
|
682
687
|
const observedProducts = state.runtimeMessages.some((message) => {
|
|
683
688
|
if (message.tool !== "commerce_search_products" && message.tool !== "commerce_get_product") return false;
|
|
684
689
|
const result = message.result;
|
|
685
690
|
return result?.status === "OK" && (Boolean(result.data?.product) || Boolean(result.data?.products?.length));
|
|
686
691
|
});
|
|
687
|
-
|
|
692
|
+
validationPhase = "selection";
|
|
693
|
+
if (!state.requiredReferral && final.answerKind === "ANSWER" && supportsSelections && observedProducts && !selected && final.details.responseDisposition !== "SHIPPING_INFORMATION_UNVERIFIED" && !final.details.shippingInformationSelection) {
|
|
694
|
+
if (state.selectionRepairUsed) throw new RunnerFailure("INVALID_FINAL", { stage: "final.validate", reasonCode: "FINAL_PRODUCT_SELECTION_MISSING", modelStep: state.modelSteps });
|
|
688
695
|
logModelInvalid(execution.logger, state.modelSteps, "MISSING_PRODUCT_SELECTION_REPAIR");
|
|
689
696
|
return { selectionRepairUsed: true, pendingStep: null, finalResult: null };
|
|
690
697
|
}
|
|
691
698
|
return { finalResult: final };
|
|
692
699
|
} catch (error) {
|
|
693
700
|
logModelInvalid(execution.logger, state.modelSteps, error instanceof RunnerFailure ? error.diagnostic.reasonCode : "UNEXPECTED_EXCEPTION");
|
|
694
|
-
throw error;
|
|
701
|
+
if (error instanceof RunnerFailure) throw error;
|
|
702
|
+
throw new RunnerFailure("INVALID_FINAL", { stage: "final.validate", reasonCode: "UNEXPECTED_EXCEPTION", modelStep: state.modelSteps, validationPhase }, error);
|
|
695
703
|
}
|
|
696
704
|
};
|
|
697
705
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/commerce/runner/graph/graph.ts","../../../src/commerce/runner/model-step.ts","../../../src/commerce/runner/graph/state.ts","../../../src/commerce/runner/version.ts","../../../src/commerce/runner/observability.ts","../../../src/commerce/runner/evidence.ts","../../../src/commerce/runner/tool-policy.ts","../../../src/commerce/runner/tool-execution.ts","../../../src/commerce/runner/graph/nodes/execute-tool-calls.ts","../../../src/commerce/runner/graph/nodes/invoke-model.ts","../../../src/commerce/runner/graph/nodes/resolve-available-tools.ts","../../../src/commerce/runner/final-response.ts","../../../src/commerce/runner/safe-referral-text.ts","../../../src/commerce/runner/graph/nodes/validate-final-response.ts","../../../src/commerce/runner/preflight.ts","../../../src/commerce/runner/runtime.ts","../../../src/commerce/runner/index.ts"],"sourcesContent":["import { END, START, StateGraph } from \"@langchain/langgraph\";\nimport { RunnerFailure } from \"../failure.js\";\nimport { routeModelStep } from \"../model-step.js\";\nimport type { CommerceTurnLogger } from \"../observability.js\";\nimport type { PreparedCommerceTurn } from \"../preflight.js\";\nimport type { CommerceTurnRuntime } from \"../runtime.js\";\nimport type { RunCommerceTurnInput } from \"../types.js\";\nimport {\n CommerceTurnGraphState,\n type CommerceTurnGraphStateValue,\n} from \"./state.js\";\nimport { executeToolCallsNode } from \"./nodes/execute-tool-calls.js\";\nimport { invokeModelNode } from \"./nodes/invoke-model.js\";\nimport { resolveAvailableToolsNode } from \"./nodes/resolve-available-tools.js\";\nimport { validateFinalResponseNode } from \"./nodes/validate-final-response.js\";\n\nexport const COMMERCE_TURN_GRAPH_RECURSION_LIMIT = 64;\n\n// Each model step can traverse resolveAvailableTools, invokeModel and\n// executeToolCalls; a final step validates the response instead. Keep the\n// original minimum for existing callers, but derive the ceiling from the\n// caller's requested model-step budget.\nexport function commerceTurnGraphRecursionLimit(modelSteps: number): number {\n return Math.max(COMMERCE_TURN_GRAPH_RECURSION_LIMIT, modelSteps * 3 + 4);\n}\n\nexport type CommerceTurnGraphExecution = {\n input: RunCommerceTurnInput;\n prepared: PreparedCommerceTurn;\n runtime: CommerceTurnRuntime;\n logger: CommerceTurnLogger;\n stats: { modelSteps: number; remoteCalls: number };\n};\n\nexport function createCommerceTurnGraph(execution: CommerceTurnGraphExecution) {\n return new StateGraph(CommerceTurnGraphState)\n .addNode(\"resolveAvailableTools\", resolveAvailableToolsNode(execution))\n .addNode(\"invokeModel\", invokeModelNode(execution))\n .addNode(\"executeToolCalls\", executeToolCallsNode(execution))\n .addNode(\"validateFinalResponse\", validateFinalResponseNode(execution))\n .addEdge(START, \"resolveAvailableTools\")\n .addEdge(\"resolveAvailableTools\", \"invokeModel\")\n .addConditionalEdges(\"invokeModel\", (state: CommerceTurnGraphStateValue) => {\n if (!state.pendingStep) throw new RunnerFailure(\"INVALID_FINAL\", { stage: \"graph.execute\", reasonCode: \"MODEL_RESULT_MISSING\" });\n return routeModelStep(state.pendingStep);\n }, {\n toolCalls: \"executeToolCalls\",\n finalResponse: \"validateFinalResponse\",\n textResponse: \"validateFinalResponse\",\n })\n .addEdge(\"executeToolCalls\", \"resolveAvailableTools\")\n .addConditionalEdges(\"validateFinalResponse\", (state: CommerceTurnGraphStateValue) => state.finalResult ? \"complete\" : \"repair\", { complete: END, repair: \"resolveAvailableTools\" })\n .compile();\n}","import { jsonBytes } from \"../canonical-json.js\";\nimport type { RunnerDiagnosticReason } from \"./diagnostics.js\";\nimport { RunnerFailure } from \"./failure.js\";\nimport type { ModelStep } from \"./types.js\";\n\nfunction invalidStep(reasonCode: RunnerDiagnosticReason, callIndex?: number, cause?: unknown): never {\n throw new RunnerFailure(\"INVALID_FINAL\", {\n stage: \"model.validate\", reasonCode,\n ...(callIndex === undefined ? {} : { callIndex }),\n }, cause);\n}\n\n/** Report the first violated invariant rather than grouping unrelated model-output failures. */\nexport function validateModelStep(step: unknown, outputTokenBudget: number): ModelStep {\n try {\n if (step === null || typeof step !== \"object\" || Array.isArray(step))\n invalidStep(\"MODEL_STEP_NOT_OBJECT\");\n const value = step as Record<string, unknown>;\n if (!Object.hasOwn(value, \"calls\")) invalidStep(\"MODEL_STEP_CALLS_MISSING\");\n if (!Array.isArray(value.calls)) invalidStep(\"MODEL_STEP_CALLS_NOT_ARRAY\");\n if (!Object.hasOwn(value, \"outputTokens\")) invalidStep(\"MODEL_OUTPUT_TOKENS_MISSING\");\n if (!Number.isSafeInteger(value.outputTokens)) invalidStep(\"MODEL_OUTPUT_TOKENS_NOT_SAFE_INTEGER\");\n const outputTokens = value.outputTokens as number;\n if (outputTokens < 0) invalidStep(\"MODEL_OUTPUT_TOKENS_NEGATIVE\");\n if (outputTokens > outputTokenBudget) invalidStep(\"MODEL_OUTPUT_TOKENS_OVER_BUDGET\");\n\n if (Object.hasOwn(value, \"text\")) {\n if (typeof value.text !== \"string\") invalidStep(\"MODEL_TEXT_NOT_STRING\");\n if (value.text.length > 4096) invalidStep(\"MODEL_TEXT_TOO_LONG\");\n }\n\n const calls = value.calls as unknown[];\n if (calls.length > 32) invalidStep(\"MODEL_TOOL_CALL_LIMIT_EXCEEDED\");\n for (let index = 0; index < calls.length; index += 1) {\n const call = calls[index];\n if (call === null) invalidStep(\"MODEL_TOOL_CALL_NULL\", index);\n if (typeof call !== \"object\" || Array.isArray(call)) invalidStep(\"MODEL_TOOL_CALL_NOT_OBJECT\", index);\n const fields = call as Record<string, unknown>;\n if (!Object.hasOwn(fields, \"name\")) invalidStep(\"MODEL_TOOL_CALL_NAME_MISSING\", index);\n if (typeof fields.name !== \"string\") invalidStep(\"MODEL_TOOL_CALL_NAME_NOT_STRING\", index);\n if (!fields.name.length) invalidStep(\"MODEL_TOOL_CALL_NAME_EMPTY\", index);\n if (fields.name.length > 128) invalidStep(\"MODEL_TOOL_CALL_NAME_TOO_LONG\", index);\n if (!Object.hasOwn(fields, \"arguments\")) invalidStep(\"MODEL_TOOL_CALL_ARGUMENTS_MISSING\", index);\n if (fields.arguments === null) invalidStep(\"MODEL_TOOL_CALL_ARGUMENTS_NULL\", index);\n if (typeof fields.arguments !== \"object\" || Array.isArray(fields.arguments))\n invalidStep(\"MODEL_TOOL_CALL_ARGUMENTS_NOT_OBJECT\", index);\n }\n\n let size: number;\n try {\n size = jsonBytes(step);\n } catch (error) {\n invalidStep(\"MODEL_STEP_NOT_SERIALIZABLE\", undefined, error);\n }\n if (size > 262144) invalidStep(\"MODEL_STEP_TOO_LARGE\");\n return step as ModelStep;\n } catch (error) {\n if (error instanceof RunnerFailure) throw error;\n invalidStep(\"MODEL_STEP_VALIDATION_FAILED\", undefined, error);\n }\n}\n\nexport function routeModelStep(step: ModelStep): \"toolCalls\" | \"finalResponse\" | \"textResponse\" {\n const finalCalls = step.calls.filter((call) => call.name === \"finalResponse\");\n if (finalCalls.length > 0) {\n if (finalCalls.length !== 1 || step.calls.length !== 1)\n throw new RunnerFailure(\"INVALID_FINAL\", { stage: \"model.route\", reasonCode: \"MODEL_CALL_ROUTE_INVALID\" });\n return \"finalResponse\";\n }\n if (step.calls.length === 0) {\n if (step.text?.trim()) return \"textResponse\";\n if(step.providerSummary?.finishReason === \"length\") throw new RunnerFailure(\"BUDGET_EXHAUSTED\", {stage:\"model.route\",reasonCode:\"MODEL_OUTPUT_TOKENS_EXHAUSTED\"});\n throw new RunnerFailure(\"INVALID_FINAL\", { stage: \"model.route\", reasonCode: \"MODEL_CALL_ROUTE_INVALID\" });\n }\n return \"toolCalls\";\n}\n","import { Annotation } from \"@langchain/langgraph\";\nimport type { CommerceFinalResponse } from \"../../response.js\";\nimport type { CommerceEvidence } from \"../../schemas.js\";\nimport type { ToolDescriptor } from \"../../definitions.js\";\nimport type { ModelStep } from \"../types.js\";\n\nexport type CommerceRuntimeMessage = Readonly<{ tool: string; result: unknown }>;\n\nexport const CommerceTurnGraphState = Annotation.Root({\n selectionRepairUsed: Annotation<boolean>(),\n modelSteps: Annotation<number>(),\n remoteCalls: Annotation<number>(),\n availableTools: Annotation<readonly ToolDescriptor[]>(),\n pendingStep: Annotation<ModelStep | null>(),\n runtimeMessages: Annotation<readonly CommerceRuntimeMessage[]>(),\n evidenceById: Annotation<Readonly<Record<string, CommerceEvidence>>>(),\n requiredReferral: Annotation<CommerceFinalResponse[\"referralReason\"]>(),\n finalResult: Annotation<CommerceFinalResponse | null>(),\n});\n\nexport type CommerceTurnGraphStateValue = typeof CommerceTurnGraphState.State;\n\nexport function initialCommerceTurnGraphState(): CommerceTurnGraphStateValue {\n return {\n selectionRepairUsed: false,\n modelSteps: 0,\n remoteCalls: 0,\n availableTools: [],\n pendingStep: null,\n runtimeMessages: [],\n evidenceById: {},\n requiredReferral: null,\n finalResult: null,\n };\n}","export const runnerVersion = \"1.1.0\";\n","import { runnerVersion } from \"./version.js\";\nimport type { LogFields, StructuredLogger } from \"../../logging/index.js\";\nimport type { PreparedCommerceTurn } from \"./preflight.js\";\nimport type { RunCommerceTurnInput, ModelResponseSummary } from \"./types.js\";\n\nexport type CommerceTurnLogger = StructuredLogger | undefined;\n\nexport function safeLog(\n logger: StructuredLogger | undefined,\n level: \"debug\" | \"info\" | \"warn\" | \"error\",\n event: string,\n fields: LogFields,\n): void {\n try {\n logger?.[level](event, fields);\n } catch {\n // Logging is an isolated diagnostic side effect.\n }\n}\n\nexport function createRootTurnLogger(input: RunCommerceTurnInput): CommerceTurnLogger {\n try { return input.dependencies.logger; } catch { return undefined; }\n}\n\nexport function createTurnLogger(\n input: RunCommerceTurnInput,\n prepared: PreparedCommerceTurn,\n): CommerceTurnLogger {\n try {\n const fields: Record<string, unknown> = {\n component: \"commerce-turn-runner\",\n runnerVersion,\n shopId: prepared.turn.shopId,\n conversationId: prepared.turn.conversationId,\n inboundVersion: prepared.turn.inboundVersion,\n grantId: prepared.grant.id,\n releaseId: prepared.grant.releaseId,\n };\n if (prepared.turn.checkoutRecoveryId !== undefined)\n fields.checkoutRecoveryId = prepared.turn.checkoutRecoveryId;\n return input.dependencies.logger?.child(fields) ?? createRootTurnLogger(input);\n } catch {\n return createRootTurnLogger(input);\n }\n}\n\nexport function elapsedDuration(input: RunCommerceTurnInput, startedAt: number): number {\n const elapsed = input.dependencies.now() - startedAt;\n if (!Number.isFinite(elapsed)) return 0;\n return Math.max(0, Math.min(90000, elapsed));\n}\n\nexport function logModelStarted(\n logger: CommerceTurnLogger,\n fields: { modelStep: number; availableToolCount: number },\n) {\n safeLog(logger, \"debug\", \"commerce.turn.model.started\", fields);\n}\n\n/** Defense in depth: log only finite, allowlisted telemetry even for custom invokers. */\nfunction safeProviderSummary(summary: ModelResponseSummary | undefined): LogFields {\n if (!summary || typeof summary !== \"object\" || Array.isArray(summary)) return {};\n const allowedReasons = [\"stop\", \"length\", \"tool_calls\", \"content_filter\", \"other\"];\n const allowedKinds = [\"missing\", \"plain_text\", \"typed_blocks\", \"non_text_blocks\"];\n return {\n ...(allowedReasons.includes(summary.finishReason ?? \"\") ? { providerFinishReason: summary.finishReason } : {}),\n ...(Number.isSafeInteger(summary.reasoningTokens) && summary.reasoningTokens! >= 0 && summary.reasoningTokens! <= 1_000_000_000\n ? { providerReasoningTokens: summary.reasoningTokens } : {}),\n ...(typeof summary.hasVisibleText === \"boolean\" ? { providerHasVisibleText: summary.hasVisibleText } : {}),\n ...(typeof summary.hasReasoningBlocks === \"boolean\" ? { providerHasReasoningBlocks: summary.hasReasoningBlocks } : {}),\n ...(allowedKinds.includes(summary.contentKind) ? { providerContentKind: summary.contentKind } : {}),\n };\n}\n\nexport function logModelCompleted(\n logger: CommerceTurnLogger,\n fields: {\n modelStep: number;\n requestedToolCount: number;\n finalResponseRequested: boolean;\n outputTokens: number;\n durationMs: number;\n providerSummary?: ModelResponseSummary;\n },\n) {\n const { providerSummary, ...ordinaryFields } = fields;\n safeLog(logger, \"debug\", \"commerce.turn.model.completed\", {\n ...ordinaryFields, ...safeProviderSummary(providerSummary),\n });\n}\n\nexport function logModelInvalid(\n logger: CommerceTurnLogger,\n modelStep: number,\n reasonCode: string,\n providerSummary?: ModelResponseSummary,\n) {\n safeLog(logger, \"warn\", \"commerce.turn.model.invalid\", {\n modelStep, reasonCode, ...safeProviderSummary(providerSummary),\n });\n}\n","import { canonicalJson } from \"../canonical-json.js\";\nimport { CommerceEvidenceSchema, type CommerceEvidence, type CommerceToolResult } from \"../schemas.js\";\nimport { RunnerFailure } from \"./failure.js\";\nimport { schemaIssueMetadata } from \"./diagnostics.js\";\nimport type { CommerceTurnRuntime } from \"./runtime.js\";\nimport type { PreparedCommerceTurn } from \"./preflight.js\";\nimport type { RunCommerceTurnInput, RunnerTool } from \"./types.js\";\nimport { safeLog, type CommerceTurnLogger } from \"./observability.js\";\n\nexport function collectVerifiedEvidence(input: {\n source: RunCommerceTurnInput;\n prepared: PreparedCommerceTurn;\n runtime: CommerceTurnRuntime;\n tool: RunnerTool;\n toolName: string;\n result: CommerceToolResult;\n modelStep: number;\n logger: CommerceTurnLogger;\n}): CommerceEvidence[] {\n const { result, tool } = input;\n if (\n result.status !== \"OK\" ||\n (result.data && typeof result.data === \"object\" && \"source\" in result.data &&\n result.data.source === \"SHOPIFY_STOREFRONT\")\n ) return [];\n const accepted: CommerceEvidence[] = [];\n for (const raw of tool.extractEvidence?.(result) ?? []) {\n const parsedEvidence = CommerceEvidenceSchema.safeParse(raw);\n if (!parsedEvidence.success) throw new RunnerFailure(\"INVALID_INPUT\", {\n stage: \"evidence.validate\", reasonCode: \"EVIDENCE_INVALID\", ...schemaIssueMetadata(parsedEvidence.error),\n }, parsedEvidence.error);\n const evidence = parsedEvidence.data;\n const { evidenceId, ...hashInput } = evidence;\n if (\n canonicalJson(evidence.turn) !== canonicalJson(input.prepared.turn) ||\n evidence.grantId !== input.prepared.grant.id ||\n evidence.releaseId !== input.prepared.grant.releaseId ||\n input.source.dependencies.digest(canonicalJson(hashInput)) !== evidenceId ||\n Date.parse(evidence.evaluatedAt) > input.source.dependencies.now()\n ) throw new RunnerFailure(\"INVALID_FINAL\", { stage: \"evidence.validate\", reasonCode: \"EVIDENCE_INVALID\" });\n accepted.push(evidence);\n }\n if (accepted.length > 0) {\n safeLog(input.logger, \"debug\", \"commerce.turn.evidence.accepted\", {\n modelStep: input.modelStep,\n toolName: input.toolName,\n evidenceCount: accepted.length,\n });\n }\n return accepted;\n}","import { canonicalJson } from \"../canonical-json.js\";\nimport { isBuiltInTool, type GrantedTool, type ToolDescriptor } from \"../definitions.js\";\nimport { RunnerFailure } from \"./failure.js\";\nimport type { CommerceTurnRuntime } from \"./runtime.js\";\nimport type { PreparedCommerceTurn } from \"./preflight.js\";\nimport type { RunnerTool } from \"./types.js\";\n\nexport type ToolDenialReason = \"INSUFFICIENT_TOOLS\" | \"TOOL_UNAVAILABLE\" | \"TOOL_REVOKED\";\n\nexport async function resolveAvailableTools(\n prepared: PreparedCommerceTurn,\n runtime: CommerceTurnRuntime,\n): Promise<ToolDescriptor[]> {\n const available: ToolDescriptor[] = [];\n for (const granted of prepared.grant.grantedTools) {\n if (prepared.executionPurpose && prepared.manifest.purposeProfile && !prepared.manifest.purposeProfile.capabilities.some(member =>\n !isBuiltInTool(granted) && member.toolId === granted.toolId && member.revisionId === granted.toolRevisionId && member.name === granted.toolName)) continue;\n const tool = prepared.registered.get(granted.toolName);\n const descriptor = isBuiltInTool(granted)\n ? prepared.manifest.builtInTools.find(candidate => candidate.name === granted.toolName &&\n candidate.definitionVersion === granted.definitionVersion)\n : prepared.manifest.capabilities.map(capability => capability.toolDescriptor)\n .find(candidate => candidate.toolId === granted.toolId);\n if (!tool || !descriptor) continue;\n if (canonicalJson(tool.descriptor) !== canonicalJson(descriptor))\n throw new RunnerFailure(\"INCOMPATIBLE_VERSION\", {\n stage: \"tools.resolve\", reasonCode: \"TOOL_DESCRIPTOR_MISMATCH\", toolName: granted.toolName,\n });\n if (await runtime.bounded((signal) => tool.isAuthorized(granted, signal), 10000, {\n stage: \"tool.authorize\", reasonCode: \"TOOL_AUTHORIZATION_FAILED\", toolName: granted.toolName,\n }))\n available.push(descriptor);\n }\n if (prepared.executionPurpose && prepared.manifest.purposeProfile) {\n const positions = new Map(prepared.manifest.purposeProfile.capabilities.map(member => [member.name, member.position]));\n available.sort((left, right) => positions.get(left.name)! - positions.get(right.name)!);\n }\n return available;\n}\n\nexport function resolveToolCall(\n name: string,\n prepared: PreparedCommerceTurn,\n availableTools: readonly ToolDescriptor[],\n): { grant: GrantedTool; tool: RunnerTool } | { denial: ToolDenialReason } {\n const grant = prepared.grant.grantedTools.find((entry) => entry.toolName === name);\n const tool = prepared.registered.get(name);\n if (!grant) return { denial: \"INSUFFICIENT_TOOLS\" };\n if (prepared.executionPurpose && !prepared.manifest.purposeProfile?.capabilities.some(member => !isBuiltInTool(grant) && member.toolId === grant.toolId && member.revisionId === grant.toolRevisionId && member.name === name)) return { denial: \"INSUFFICIENT_TOOLS\" };\n if (!tool) return { denial: \"TOOL_UNAVAILABLE\" };\n const pinned = availableTools.find(descriptor => descriptor.name === name);\n if (!pinned) return { denial: \"TOOL_REVOKED\" };\n if (canonicalJson(pinned) !== canonicalJson(tool.descriptor))\n throw new RunnerFailure(\"INCOMPATIBLE_VERSION\", {\n stage: \"tools.resolve\", reasonCode: \"TOOL_DESCRIPTOR_MISMATCH\", toolName: name,\n });\n return { grant, tool };\n}","import { CommerceProductSchema } from \"../schemas.js\";\nimport { isBuiltInTool } from \"../definitions.js\";\nimport { jsonBytes } from \"../canonical-json.js\";\nimport { CommerceToolResultSchema, CommerceToolOutputs, type CommerceEvidence } from \"../schemas.js\";\nimport type { CommerceFinalResponse } from \"../response.js\";\nimport { compileCommercePurposeOutputSchema } from \"../purpose-output.js\";\nimport { compileSubset } from \"../subset.js\";\nimport { RunnerFailure } from \"./failure.js\";\nimport { schemaIssueMetadata } from \"./diagnostics.js\";\nimport { collectVerifiedEvidence } from \"./evidence.js\";\nimport { elapsedDuration, safeLog, type CommerceTurnLogger } from \"./observability.js\";\nimport type { PreparedCommerceTurn } from \"./preflight.js\";\nimport type { CommerceTurnRuntime } from \"./runtime.js\";\nimport { resolveToolCall } from \"./tool-policy.js\";\nimport type { RunCommerceTurnInput, ModelStep } from \"./types.js\";\n\nexport type ToolExecutionResult = {\n remoteCalls: number;\n runtimeMessages: ReadonlyArray<{ tool: string; result: unknown }>;\n evidenceById: Readonly<Record<string, CommerceEvidence>>;\n requiredReferral: CommerceFinalResponse[\"referralReason\"];\n};\n\nexport async function executeToolCalls(input: {\n source: RunCommerceTurnInput;\n prepared: PreparedCommerceTurn;\n runtime: CommerceTurnRuntime;\n modelStep: number;\n step: ModelStep;\n availableTools: Parameters<typeof resolveToolCall>[2];\n remoteCalls: number;\n runtimeMessages: ReadonlyArray<{ tool: string; result: unknown }>;\n evidenceById: Readonly<Record<string, CommerceEvidence>>;\n requiredReferral: CommerceFinalResponse[\"referralReason\"];\n logger: CommerceTurnLogger;\n onRemoteCall?: (remoteCalls: number) => void;\n}): Promise<ToolExecutionResult> {\n let remoteCalls = input.remoteCalls;\n const runtimeMessages = [...input.runtimeMessages];\n const evidenceById = { ...input.evidenceById };\n let requiredReferral = input.requiredReferral;\n\n toolCalls: for (const call of input.step.calls) {\n input.runtime.checkCancellationAndDeadline();\n const policy = resolveToolCall(call.name, input.prepared, input.availableTools);\n if (\"denial\" in policy) {\n requiredReferral = requiredReferral === \"TOOL_REVOKED\" ? requiredReferral : policy.denial;\n safeLog(input.logger, \"warn\", \"commerce.turn.tool.denied\", {\n modelStep: input.modelStep,\n toolName: call.name,\n reasonCode: policy.denial,\n });\n runtimeMessages.push({\n tool: call.name,\n result: { contractVersion: \"commerce.v1\", status: \"ERROR\", code: \"DENIED\", retryable: false },\n });\n continue;\n }\n const { grant, tool } = policy;\n if (!(await input.runtime.bounded((signal) => tool.isAuthorized(grant, signal), 10000, {\n stage: \"tool.authorize\", reasonCode: \"TOOL_AUTHORIZATION_FAILED\", toolName: call.name, modelStep: input.modelStep,\n }))) {\n requiredReferral = \"TOOL_REVOKED\";\n safeLog(input.logger, \"warn\", \"commerce.turn.tool.denied\", {\n modelStep: input.modelStep,\n toolName: call.name,\n reasonCode: \"TOOL_REVOKED\",\n });\n runtimeMessages.push({\n tool: call.name,\n result: { contractVersion: \"commerce.v1\", status: \"ERROR\", code: \"DENIED\", retryable: false },\n });\n continue;\n }\n resolveToolCall(call.name, input.prepared, input.availableTools);\n const args = compileSubset(tool.descriptor.inputSchema, \"input\").safeParse(call.arguments);\n if (!args.success) {\n if(remoteCalls >= input.prepared.budgets.remoteCalls) throw new RunnerFailure(\"BUDGET_EXHAUSTED\",{stage:\"tool.validate\",reasonCode:\"TOOL_CALL_BUDGET_EXHAUSTED\"});\n remoteCalls++; input.onRemoteCall?.(remoteCalls);\n runtimeMessages.push({tool:call.name,result:{contractVersion:\"commerce.v1\",status:\"ERROR\",code:\"INVALID_INPUT\",retryable:false}});\n safeLog(input.logger,\"warn\",\"commerce.turn.tool.invalid_input\",{toolName:call.name,reasonCode:\"TOOL_INPUT_INVALID\",...schemaIssueMetadata(args.error)});\n continue;\n }\n\n let result: ReturnType<typeof CommerceToolResultSchema.parse> | undefined;\n for (let attempt = 1; attempt <= 2; attempt += 1) {\n if (remoteCalls >= input.prepared.budgets.remoteCalls)\n throw new RunnerFailure(\"BUDGET_EXHAUSTED\", {\n stage: \"tool.execute\", reasonCode: \"TOOL_CALL_BUDGET_EXHAUSTED\", toolName: call.name, modelStep: input.modelStep,\n });\n const remoteCallNumber = remoteCalls + 1;\n const startedAt = input.source.dependencies.now();\n safeLog(input.logger, \"debug\", \"commerce.turn.tool.started\", {\n modelStep: input.modelStep,\n toolName: call.name,\n attempt,\n remoteCallNumber,\n });\n remoteCalls += 1;\n input.onRemoteCall?.(remoteCalls);\n const raw = await input.runtime.bounded((signal) => tool.execute(args.data, signal), 10000, {\n stage: \"tool.execute\", reasonCode: \"TOOL_EXECUTION_FAILED\", toolName: call.name,\n modelStep: input.modelStep, attempt, remoteCallNumber,\n });\n let rawSize: number;\n try { rawSize = jsonBytes(raw); }\n catch (error) {\n throw new RunnerFailure(\"INVALID_INPUT\", { stage: \"tool.result\", reasonCode: \"TOOL_RESULT_INVALID\",\n toolName: call.name, modelStep: input.modelStep, attempt, remoteCallNumber }, error);\n }\n if (rawSize > 262144) throw new RunnerFailure(\"UNAVAILABLE\", {\n stage: \"tool.result\", reasonCode: \"TOOL_RESULT_TOO_LARGE\", toolName: call.name,\n modelStep: input.modelStep, attempt, remoteCallNumber,\n });\n const parsedResult = CommerceToolResultSchema.safeParse(raw);\n if (!parsedResult.success) throw new RunnerFailure(\"INVALID_INPUT\", {\n stage: \"tool.result\", reasonCode: \"TOOL_RESULT_INVALID\", toolName: call.name,\n modelStep: input.modelStep, attempt, remoteCallNumber, ...schemaIssueMetadata(parsedResult.error),\n }, parsedResult.error);\n result = parsedResult.data;\n if (result.status === \"OK\" && isBuiltInTool(grant)) {\n const output = CommerceToolOutputs[grant.toolName].safeParse(result.data);\n if (!output.success) throw new RunnerFailure(\"INVALID_INPUT\", {\n stage: \"tool.result\", reasonCode: \"TOOL_RESULT_INVALID\", toolName: call.name,\n modelStep: input.modelStep, ...schemaIssueMetadata(output.error),\n }, output.error);\n // Keep schema transformations: downstream policy, evidence and model\n // messages must consume the same validated bounded value.\n result = { ...result, data: output.data };\n }\n if (result.status === \"OK\" && [\"commerce_search_products\", \"commerce_get_product\"].includes(call.name)) {\n const data = result.data;\n if (!data || typeof data !== \"object\" || Array.isArray(data))\n throw new RunnerFailure(\"INVALID_INPUT\", {stage:\"tool.result\",reasonCode:\"TOOL_RESULT_INVALID\",toolName:call.name});\n const payload = data as Record<string, unknown>;\n const parsed = call.name === \"commerce_search_products\"\n ? CommerceProductSchema.array().max(20).safeParse(payload.products)\n : CommerceProductSchema.nullable().safeParse(payload.product);\n if (!parsed.success) throw new RunnerFailure(\"INVALID_INPUT\", {\n stage:\"tool.result\", reasonCode:\"TOOL_RESULT_INVALID\", toolName:call.name,\n modelStep:input.modelStep, ...schemaIssueMetadata(parsed.error),\n }, parsed.error);\n result = { ...result, data: { ...payload, [call.name === \"commerce_search_products\" ? \"products\" : \"product\"]: parsed.data } };\n }\n const purposeMember = input.prepared.executionPurpose && input.prepared.manifest.purposeProfile?.capabilities.find(member => member.name === call.name);\n if (purposeMember && result.status === \"OK\" && !compileCommercePurposeOutputSchema(purposeMember.outputSchema).safeParse(result.data).success)\n throw new RunnerFailure(\"INVALID_INPUT\", { stage: \"tool.result\", reasonCode: \"TOOL_RESULT_INVALID\", toolName: call.name, modelStep: input.modelStep });\n if (result.status === \"ERROR\" && result.code === \"STALE_TURN\")\n throw new RunnerFailure(\"STALE_TURN\", {\n stage: \"tool.result\", reasonCode: \"TOOL_STALE_TURN\", toolName: call.name, modelStep: input.modelStep,\n });\n if (!(await input.runtime.bounded(signal => tool.isAuthorized(grant, signal), 10000, {\n stage: \"tool.authorize\", reasonCode: \"TOOL_AUTHORIZATION_FAILED\", toolName: call.name, modelStep: input.modelStep,\n }))) {\n requiredReferral = \"TOOL_REVOKED\";\n runtimeMessages.push({tool: call.name, result: {contractVersion: \"commerce.v1\", status: \"ERROR\", code: \"DENIED\", retryable: false}});\n safeLog(input.logger, \"warn\", \"commerce.turn.tool.denied\", {toolName: call.name, reasonCode: \"TOOL_REVOKED\"});\n continue toolCalls;\n }\n resolveToolCall(call.name, input.prepared, input.availableTools);\n const durationMs = elapsedDuration(input.source, startedAt);\n safeLog(input.logger, \"debug\", \"commerce.turn.tool.completed\", {\n modelStep: input.modelStep,\n toolName: call.name,\n attempt,\n status: result.status,\n ...(result.status === \"ERROR\" ? { errorCode: result.code, retryable: result.retryable } : {}),\n durationMs,\n remoteCallNumber,\n });\n if(result.status === \"ERROR\" && ![\"INVALID_INPUT\",\"NOT_FOUND\"].includes(result.code))\n requiredReferral = result.code === \"DENIED\" || requiredReferral === \"TOOL_REVOKED\" ? \"TOOL_REVOKED\" : \"TOOL_UNAVAILABLE\";\n if (\n attempt === 1 && result.status === \"ERROR\" && result.retryable &&\n (result.code === \"UNAVAILABLE\" || result.code === \"THROTTLED\")\n ) {\n safeLog(input.logger, \"warn\", \"commerce.turn.tool.retry\", {\n modelStep: input.modelStep,\n toolName: call.name,\n attempt,\n errorCode: result.code,\n });\n continue;\n }\n break;\n }\n if (!result) throw new RunnerFailure(\"UNAVAILABLE\", {\n stage: \"tool.result\", reasonCode: \"TOOL_RESULT_MISSING\", toolName: call.name, modelStep: input.modelStep,\n });\n if (result.status === \"ERROR\") {\n if (result.code === \"STALE_TURN\") throw new RunnerFailure(\"STALE_TURN\", {\n stage: \"tool.result\", reasonCode: \"TOOL_STALE_TURN\", toolName: call.name, modelStep: input.modelStep,\n });\n if (![\"INVALID_INPUT\",\"NOT_FOUND\"].includes(result.code)) requiredReferral = result.code === \"DENIED\" || requiredReferral === \"TOOL_REVOKED\" ? \"TOOL_REVOKED\" : \"TOOL_UNAVAILABLE\";\n }\n for (const evidence of collectVerifiedEvidence({\n source: input.source,\n prepared: input.prepared,\n runtime: input.runtime,\n tool,\n toolName: call.name,\n result,\n modelStep: input.modelStep,\n logger: input.logger,\n })) evidenceById[evidence.evidenceId] = evidence;\n runtimeMessages.push({ tool: call.name, result });\n }\n\n return { remoteCalls, runtimeMessages, evidenceById, requiredReferral };\n}","import { RunnerFailure } from \"../../failure.js\";\nimport { executeToolCalls } from \"../../tool-execution.js\";\nimport type { CommerceTurnGraphExecution } from \"../graph.js\";\nimport type { CommerceTurnGraphStateValue } from \"../state.js\";\n\nexport function executeToolCallsNode(execution: CommerceTurnGraphExecution) {\n return async (state: CommerceTurnGraphStateValue) => {\n if (!state.pendingStep) throw new RunnerFailure(\"INVALID_FINAL\", { stage: \"graph.execute\", reasonCode: \"MODEL_RESULT_MISSING\" });\n const result = await executeToolCalls({\n source: execution.input,\n prepared: execution.prepared,\n runtime: execution.runtime,\n modelStep: state.modelSteps,\n step: state.pendingStep,\n availableTools: state.availableTools,\n remoteCalls: state.remoteCalls,\n runtimeMessages: state.runtimeMessages,\n evidenceById: state.evidenceById,\n requiredReferral: state.requiredReferral,\n logger: execution.logger,\n onRemoteCall: (remoteCalls) => { execution.stats.remoteCalls = remoteCalls; },\n });\n return { ...result, pendingStep: null };\n };\n}","import { finalResponseToolSchema } from \"../../../response.js\";\nimport { RunnerFailure } from \"../../failure.js\";\nimport { elapsedDuration, logModelCompleted, logModelInvalid, logModelStarted } from \"../../observability.js\";\nimport { validateModelStep, routeModelStep } from \"../../model-step.js\";\nimport type { CommerceTurnGraphExecution } from \"../graph.js\";\nimport type { CommerceTurnGraphStateValue } from \"../state.js\";\nimport type { ModelStep } from \"../../types.js\";\n\nexport function invokeModelNode(execution: CommerceTurnGraphExecution) {\n return async (state: CommerceTurnGraphStateValue) => {\n execution.runtime.checkCancellationAndDeadline();\n const modelStep = state.modelSteps + 1;\n execution.stats.modelSteps = modelStep;\n const startedAt = execution.input.dependencies.now();\n logModelStarted(execution.logger, { modelStep, availableToolCount: state.availableTools.length });\n let raw: unknown;\n try {\n raw = await execution.runtime.bounded((signal) => execution.input.dependencies.model.invoke({\n instructions: state.selectionRepairUsed ? [...execution.prepared.instructions,\n \"Your previous final answer omitted structured product selections even though product tools returned products. Correct the finalResponse now: put exact observed product/variant selections in the appropriate pinned details fields. Preserve the customer objective, select only relevant observed products, and never invent identifiers or promotions. Reuse current tool results; do not repeat searches merely to repair the response format.\"] : execution.prepared.instructions,\n context: { trustedRecovery: execution.input.context, language: execution.input.language, ...(execution.prepared.productContext?.references.length ? { productReferences: { trust: \"UNTRUSTED_REFERENCE_DATA_NOT_CURRENT_FACTS_OR_AUTHORITY\", references: execution.prepared.productContext.references, ...(execution.prepared.productContext.presentation?{presentation:execution.prepared.productContext.presentation}:{}) } } : {}) },\n history: execution.input.history,\n messages: state.runtimeMessages,\n tools: [\n ...state.availableTools.map((descriptor) => ({\n name: descriptor.name,\n description: descriptor.description,\n inputSchema: descriptor.inputSchema,\n })),\n {\n name: \"finalResponse\",\n description: \"Return a structured reply with pinned details selections when presenting retrieved products, product facts, options, evidence, metadata or a referral. Plain text is only for answers that need none of these selections.\",\n inputSchema: finalResponseToolSchema(execution.prepared.response),\n },\n ],\n maxOutputTokens: execution.prepared.budgets.outputTokens,\n }, signal), execution.prepared.budgets.deadlineMs, {\n stage: \"model.invoke\", reasonCode: \"MODEL_INVOCATION_FAILED\", modelStep,\n });\n } catch (error) {\n if (error instanceof RunnerFailure) throw error;\n throw new RunnerFailure(\"UNAVAILABLE\", { stage: \"model.invoke\", reasonCode: \"MODEL_INVOCATION_FAILED\", modelStep }, error);\n }\n let step: ModelStep;\n let observedStep: ModelStep | undefined;\n try {\n step = validateModelStep(raw, execution.prepared.budgets.outputTokens);\n observedStep = step;\n routeModelStep(step);\n } catch (error) {\n logModelInvalid(\n execution.logger, modelStep,\n error instanceof RunnerFailure ? error.diagnostic.reasonCode : \"UNEXPECTED_EXCEPTION\",\n observedStep?.providerSummary,\n );\n throw error;\n }\n logModelCompleted(execution.logger, {\n modelStep,\n requestedToolCount: step.calls.filter((call) => call.name !== \"finalResponse\").length,\n finalResponseRequested: step.calls.some((call) => call.name === \"finalResponse\"),\n outputTokens: step.outputTokens,\n durationMs: elapsedDuration(execution.input, startedAt),\n providerSummary: step.providerSummary,\n });\n return { modelSteps: modelStep, pendingStep: step };\n };\n}","import { RunnerFailure } from \"../../failure.js\";\nimport { resolveAvailableTools } from \"../../tool-policy.js\";\nimport type { CommerceTurnGraphExecution } from \"../graph.js\";\nimport type { CommerceTurnGraphStateValue } from \"../state.js\";\n\nexport function resolveAvailableToolsNode(execution: CommerceTurnGraphExecution) {\n return async (state: CommerceTurnGraphStateValue) => {\n execution.runtime.checkCancellationAndDeadline();\n if (state.modelSteps >= execution.prepared.budgets.modelSteps)\n throw new RunnerFailure(\"BUDGET_EXHAUSTED\", { stage: \"tools.resolve\", reasonCode: \"MODEL_STEP_BUDGET_EXHAUSTED\" });\n const availableTools = await resolveAvailableTools(execution.prepared, execution.runtime);\n return { availableTools };\n };\n}","import type { CommerceFinalResponse } from \"../response.js\";\nimport type { CommerceEvidence } from \"../schemas.js\";\nimport { RunnerFailure } from \"./failure.js\";\nimport { schemaIssueMetadata } from \"./diagnostics.js\";\nimport type { PreparedCommerceTurn } from \"./preflight.js\";\n\nexport function validateFinalResponse(input: {\n raw: unknown;\n prepared: PreparedCommerceTurn;\n evidenceById: Readonly<Record<string, CommerceEvidence>>;\n requiredReferral: CommerceFinalResponse[\"referralReason\"];\n languageSource: string | null;\n remoteCalls: number;\n now: () => number;\n checkCancellationAndDeadline(): void;\n}): CommerceFinalResponse {\n const parsed = input.prepared.finalSchema.safeParse(input.raw);\n if (!parsed.success) throw new RunnerFailure(\"INVALID_FINAL\", {\n stage: \"final.validate\", reasonCode: \"FINAL_SCHEMA_INVALID\", ...schemaIssueMetadata(parsed.error),\n }, parsed.error);\n const final = parsed.data;\n if (input.languageSource === \"customer-explicit\" && final.detectedLanguageTag !== null)\n throw new RunnerFailure(\"INVALID_FINAL\", { stage: \"final.validate\", reasonCode: \"FINAL_LANGUAGE_MISMATCH\" });\n if (input.requiredReferral && final.answerKind !== \"REFER_TO_STORE\")\n throw new RunnerFailure(\"INVALID_FINAL\", { stage: \"final.validate\", reasonCode: \"FINAL_REFERRAL_REQUIRED\" });\n if (input.remoteCalls + final.evidenceIds.length > input.prepared.budgets.remoteCalls)\n throw new RunnerFailure(\"BUDGET_EXHAUSTED\", {\n stage: \"final.validate\", reasonCode: \"EVIDENCE_RESERVATION_EXCEEDED\",\n });\n for (const evidenceId of final.evidenceIds) {\n const evidence = input.evidenceById[evidenceId];\n if (!evidence || evidence.outcome !== \"QUALIFIES_FOR_KNOWN_RULES\")\n throw new RunnerFailure(\"INVALID_FINAL\", { stage: \"final.validate\", reasonCode: \"FINAL_EVIDENCE_INVALID\" });\n if (Date.parse(evidence.expiresAt) <= input.now())\n throw new RunnerFailure(\"INVALID_FINAL\", { stage: \"final.validate\", reasonCode: \"FINAL_EVIDENCE_EXPIRED\" });\n }\n input.checkCancellationAndDeadline();\n return final;\n}\n","import {\n resolveModaConfigurationLocale,\n type ModaSupportedLanguageTag,\n} from \"../../internationalization.js\";\n\n/** Host-owned referral copy: never turn unverified model text into a factual claim. */\nconst SAFE_REFERRAL_TEXT: Readonly<Record<ModaSupportedLanguageTag, string>> = {\n \"zh-Hans\": \"我目前无法在这里核实或处理此请求。请直接联系商家寻求帮助。\",\n \"zh-Hant\": \"我目前無法在這裡核實或處理此請求。請直接聯絡商家尋求協助。\",\n cs: \"Tento požadavek nyní nemohu ověřit ani vyřídit. Obraťte se prosím přímo na obchod.\",\n da: \"Jeg kan ikke bekræfte eller behandle denne anmodning her lige nu. Kontakt venligst butikken direkte.\",\n nl: \"Ik kan dit verzoek hier momenteel niet verifiëren of afhandelen. Neem rechtstreeks contact op met de winkel.\",\n en: \"I can't verify or complete that request here right now. Please contact the store directly for help.\",\n fi: \"En voi tällä hetkellä vahvistaa tai käsitellä tätä pyyntöä täällä. Ota yhteyttä suoraan kauppaan.\",\n fr: \"Je ne peux pas vérifier ni traiter cette demande ici pour le moment. Veuillez contacter directement la boutique.\",\n de: \"Ich kann diese Anfrage hier derzeit nicht prüfen oder bearbeiten. Bitte wenden Sie sich direkt an den Shop.\",\n it: \"Al momento non posso verificare o gestire questa richiesta qui. Contatta direttamente il negozio.\",\n ja: \"現在、こちらではこのご依頼を確認または対応できません。店舗に直接お問い合わせください。\",\n ko: \"현재 여기서는 이 요청을 확인하거나 처리할 수 없습니다. 매장에 직접 문의해 주세요.\",\n nb: \"Jeg kan ikke bekrefte eller behandle denne forespørselen her nå. Kontakt butikken direkte.\",\n pl: \"Nie mogę teraz zweryfikować ani zrealizować tej prośby tutaj. Skontaktuj się bezpośrednio ze sklepem.\",\n \"pt-BR\": \"Não consigo verificar nem atender a esta solicitação por aqui no momento. Entre em contato diretamente com a loja.\",\n \"pt-PT\": \"Neste momento, não consigo verificar nem tratar este pedido aqui. Contacte diretamente a loja.\",\n es: \"No puedo verificar ni atender esta solicitud aquí en este momento. Ponte en contacto directamente con la tienda.\",\n sv: \"Jag kan inte verifiera eller hantera den här begäran här just nu. Kontakta butiken direkt.\",\n th: \"ขณะนี้ฉันไม่สามารถตรวจสอบหรือดำเนินการตามคำขอนี้ได้ กรุณาติดต่อร้านค้าโดยตรง\",\n tr: \"Şu anda bu talebi burada doğrulayamıyor veya işleme alamıyorum. Lütfen doğrudan mağazayla iletişime geçin.\",\n};\n\nexport function safeReferralText(languageTag: string | null): string {\n return SAFE_REFERRAL_TEXT[resolveModaConfigurationLocale(languageTag)];\n}\n","import { RunnerFailure } from \"../../failure.js\";\nimport { validateFinalResponse } from \"../../final-response.js\";\nimport { logModelInvalid } from \"../../observability.js\";\nimport { safeReferralText } from \"../../safe-referral-text.js\";\nimport type { CommerceTurnGraphExecution } from \"../graph.js\";\nimport type { CommerceTurnGraphStateValue } from \"../state.js\";\n\nexport function validateFinalResponseNode(execution: CommerceTurnGraphExecution) {\n return async (state: CommerceTurnGraphStateValue) => {\n if (!state.pendingStep)\n throw new RunnerFailure(\"INVALID_FINAL\", { stage: \"final.validate\", reasonCode: \"MODEL_RESULT_MISSING\" });\n try {\n // Natural text may finish a turn, but cannot override mandatory referral\n // after a failed/denied tool. Use trusted, localized host copy instead of\n // repeating potentially unsupported claims from the model.\n // The same pinned final schema validates both resulting envelopes.\n const raw = state.pendingStep.calls.length === 0\n ? {\n answerKind: state.requiredReferral ? \"REFER_TO_STORE\" : \"ANSWER\",\n replyText: state.requiredReferral\n ? safeReferralText(execution.input.language.tag)\n : state.pendingStep.text?.trim() ?? \"\",\n referralReason: state.requiredReferral,\n detectedLanguageTag: null,\n detectedLanguageConfidence: null,\n evidenceIds: [],\n details: {},\n }\n : state.pendingStep.calls.length === 1\n ? state.pendingStep.calls[0].arguments\n : undefined;\n const final = validateFinalResponse({\n raw,\n prepared: execution.prepared,\n evidenceById: state.evidenceById,\n requiredReferral: state.requiredReferral,\n remoteCalls: state.remoteCalls,\n now: execution.input.dependencies.now,\n languageSource: execution.input.language.source,\n checkCancellationAndDeadline: execution.runtime.checkCancellationAndDeadline,\n });\n const fields = execution.prepared.response.detailsSchema.properties ?? {};\n const supportsSelections = ['productRecommendations', 'productDetailSelections', 'productOptionSelections'].some(key => Object.hasOwn(fields, key));\n const selected = ['productRecommendations', 'productDetailSelections', 'productOptionSelections'].some(key => Array.isArray(final.details[key]) && final.details[key].length > 0);\n const observedProducts = state.runtimeMessages.some(message => {\n if (message.tool !== 'commerce_search_products' && message.tool !== 'commerce_get_product') return false;\n const result = message.result as { status?: string; data?: { products?: unknown[]; product?: unknown } };\n return result?.status === 'OK' && (Boolean(result.data?.product) || Boolean(result.data?.products?.length));\n });\n // One correction uses the existing model-step/deadline budget. Never guess\n // selections or replay provider calls on the model's behalf.\n if (!state.selectionRepairUsed && !state.requiredReferral && final.answerKind === 'ANSWER' && supportsSelections && observedProducts && !selected && final.details.responseDisposition !== 'SHIPPING_INFORMATION_UNVERIFIED' && !final.details.shippingInformationSelection) {\n logModelInvalid(execution.logger, state.modelSteps, 'MISSING_PRODUCT_SELECTION_REPAIR');\n return { selectionRepairUsed: true, pendingStep: null, finalResult: null };\n }\n return { finalResult: final };\n } catch (error) {\n logModelInvalid(execution.logger, state.modelSteps, error instanceof RunnerFailure ? error.diagnostic.reasonCode : \"UNEXPECTED_EXCEPTION\");\n throw error;\n }\n };\n}","import { mergeConversationProductContext, type CommerceConversationProductContext } from \"../product-context.js\";\nimport { ToolDescriptorSchema } from \"../definitions.js\";\nimport { satisfies } from \"semver\";\nimport { ZodError } from \"zod\";\n\nimport { LanguageSourceSchema } from \"../../internationalization.js\";\nimport { canonicalJson, jsonBytes } from \"../canonical-json.js\";\nimport { LanguageSchema } from \"../primitives.js\";\nimport { verifyResponseContract, finalResponseSchema } from \"../response.js\";\nimport {\n CommerceConversationGrantSchema,\n CommerceManifestSchema,\n CommerceTurnIdentitySchema,\n} from \"../schemas.js\";\nimport { manifestMatchesGrant } from \"../selection.js\";\nimport { composeTrustedInstructions } from \"./instructions.js\";\nimport { RunnerFailure } from \"./failure.js\";\nimport { schemaIssueMetadata, type RunnerDiagnosticReason } from \"./diagnostics.js\";\nimport { runnerVersion } from \"./version.js\";\nimport type { RunCommerceTurnInput, RunnerTool } from \"./types.js\";\n\nexport type CommerceTurnBudgets = {\n modelSteps: number;\n remoteCalls: number;\n deadlineMs: number;\n outputTokens: number;\n};\n\nexport type PreparedCommerceTurn = {\n productContext: CommerceConversationProductContext | null;\n executionPurpose?: RunCommerceTurnInput[\"executionPurpose\"];\n turn: ReturnType<typeof CommerceTurnIdentitySchema.parse>;\n grant: ReturnType<typeof CommerceConversationGrantSchema.parse>;\n manifest: NonNullable<ReturnType<typeof CommerceManifestSchema.safeParse>[\"data\"]>;\n response: ReturnType<typeof verifyResponseContract>;\n finalSchema: ReturnType<typeof finalResponseSchema>;\n budgets: CommerceTurnBudgets;\n instructions: readonly string[];\n registered: ReadonlyMap<string, RunnerTool>;\n};\n\nfunction validatePreflight<T>(parse: () => T, code: \"INVALID_INPUT\" | \"INCOMPATIBLE_VERSION\", reasonCode: RunnerDiagnosticReason): T {\n try { return parse(); }\n catch (error) {\n throw new RunnerFailure(code, {\n stage: \"preflight.validate\", reasonCode,\n ...(error instanceof ZodError ? schemaIssueMetadata(error) : {}),\n }, error);\n }\n}\n\nexport function prepareCommerceTurn(input: RunCommerceTurnInput): PreparedCommerceTurn {\n if (input.signal.aborted) throw new RunnerFailure(\"CANCELLED\", {\n stage: \"runtime.cancellation\", reasonCode: \"CANCELLED_BY_CALLER\",\n });\n if (jsonBytes(input.manifest) > 262144 || jsonBytes(input.grant) > 131072)\n throw new RunnerFailure(\"INVALID_INPUT\", { stage: \"preflight.validate\", reasonCode: \"INPUT_TOO_LARGE\" });\n const turn = validatePreflight(() => CommerceTurnIdentitySchema.parse(input.turn), \"INVALID_INPUT\", \"TURN_INVALID\");\n const grant = validatePreflight(() => CommerceConversationGrantSchema.parse(input.grant), \"INVALID_INPUT\", \"GRANT_INVALID\");\n const parsedManifest = CommerceManifestSchema.safeParse(input.manifest);\n if (!parsedManifest.success) throw new RunnerFailure(\"INCOMPATIBLE_VERSION\", {\n stage: \"preflight.validate\", reasonCode: \"MANIFEST_INVALID\", ...schemaIssueMetadata(parsedManifest.error),\n }, parsedManifest.error);\n const manifest = parsedManifest.data;\n if (input.executionPurpose !== undefined && (input.executionPurpose !== \"INITIAL_RECOVERY_OUTREACH\" || manifest.purposeProfile?.purpose !== input.executionPurpose))\n throw new RunnerFailure(\"DENIED\", { stage: \"preflight.contract\", reasonCode: \"GRANT_MISMATCH\" });\n if (\n !manifestMatchesGrant(manifest, grant) ||\n turn.shopId !== grant.shopId ||\n turn.conversationId !== grant.conversationId ||\n turn.inboundVersion < grant.initialInboundVersion\n ) throw new RunnerFailure(\"DENIED\", { stage: \"preflight.contract\", reasonCode: \"GRANT_MISMATCH\" });\n if (!satisfies(runnerVersion, manifest.runnerCompatibility))\n throw new RunnerFailure(\"INCOMPATIBLE_VERSION\", {\n stage: \"preflight.contract\", reasonCode: \"RUNNER_VERSION_INCOMPATIBLE\",\n });\n\n let response: ReturnType<typeof verifyResponseContract>;\n try {\n response = verifyResponseContract(\n manifest.responseContract,\n manifest.responseContractHash,\n input.dependencies.digest,\n );\n } catch (error) {\n throw new RunnerFailure(\"INCOMPATIBLE_VERSION\", {\n stage: \"preflight.contract\", reasonCode: \"RESPONSE_CONTRACT_INVALID\",\n }, error);\n }\n const finalSchema = finalResponseSchema(response);\n if (input.language.tag !== null)\n validatePreflight(() => LanguageSchema.parse(input.language.tag), \"INVALID_INPUT\", \"LANGUAGE_INVALID\");\n if (input.language.source !== null)\n validatePreflight(() => LanguageSourceSchema.parse(input.language.source), \"INVALID_INPUT\", \"LANGUAGE_INVALID\");\n if ((input.language.tag === null) !== (input.language.source === null))\n throw new RunnerFailure(\"INVALID_INPUT\", { stage: \"preflight.validate\", reasonCode: \"LANGUAGE_INVALID\" });\n\n const budgets: CommerceTurnBudgets = {\n modelSteps: 12,\n remoteCalls: 10,\n deadlineMs: 90000,\n outputTokens: 800,\n ...input.budgets,\n };\n // Budget policy belongs to the caller. Shared validates only that supplied\n // limits can be represented safely, then enforces them during execution.\n for (const key of [\"modelSteps\", \"remoteCalls\", \"deadlineMs\", \"outputTokens\"] as const) {\n if (!Number.isSafeInteger(budgets[key]) || budgets[key] < 1)\n throw new RunnerFailure(\"INVALID_INPUT\", { stage: \"preflight.validate\", reasonCode: \"BUDGET_INVALID\" });\n }\n if (\n input.hostInstructions.some((text) => typeof text !== \"string\") ||\n input.history.length > 20 ||\n Array.from(canonicalJson(input.history)).length > 32000 ||\n jsonBytes(input.context) + jsonBytes(input.history) > 131072\n ) throw new RunnerFailure(\"INVALID_INPUT\", { stage: \"preflight.validate\", reasonCode: \"CONTEXT_INVALID\" });\n let productContext: CommerceConversationProductContext | null = null;\n try {\n if(input.productContext && !input.platform) throw new Error(\"platform required\");\n if(input.platform) productContext = mergeConversationProductContext(input.productContext ?? null, [], {shopId:turn.shopId,conversationId:turn.conversationId,platform:input.platform,now:input.dependencies.now()});\n } catch(error) { throw new RunnerFailure(\"INVALID_INPUT\", {stage:\"preflight.validate\",reasonCode:\"CONTEXT_INVALID\"},error); }\n const instructions = composeTrustedInstructions(\n input.hostInstructions,\n response.instructions,\n input.executionPurpose ? [manifest.purposeProfile!.behaviourPrompt] : manifest.featureBehaviours.map((feature) => feature.behaviourPrompt),\n );\n if (instructions.join(\"\").length > 64000)\n throw new RunnerFailure(\"INVALID_INPUT\", { stage: \"preflight.validate\", reasonCode: \"CONTEXT_INVALID\" });\n\n const registered = new Map<string, RunnerTool>();\n if (input.dependencies.tools.length > 32)\n throw new RunnerFailure(\"INVALID_INPUT\", {stage: \"preflight.validate\", reasonCode: \"TOOL_REGISTRATION_INVALID\"});\n for (const tool of input.dependencies.tools) {\n const parsedDescriptor = ToolDescriptorSchema.safeParse(tool.descriptor);\n if (!parsedDescriptor.success || !grant.grantedTools.some(granted => granted.toolName === tool.descriptor.name) ||\n registered.has(tool.descriptor.name))\n throw new RunnerFailure(\"INVALID_INPUT\", { stage: \"preflight.validate\", reasonCode: \"TOOL_REGISTRATION_INVALID\" });\n registered.set(tool.descriptor.name, tool);\n }\n if (manifest.builtInTools.some(tool => !registered.has(tool.name)))\n throw new RunnerFailure(\"INCOMPATIBLE_VERSION\", {stage: \"preflight.validate\", reasonCode: \"TOOL_REGISTRATION_INVALID\"});\n return { productContext, ...(input.executionPurpose ? { executionPurpose: input.executionPurpose } : {}), turn, grant, manifest, response, finalSchema, budgets, instructions, registered };\n}\n","import { CommerceModelInvocationFailure, RunnerFailure } from \"./failure.js\";\nimport type { RunnerDiagnostic } from \"./diagnostics.js\";\n\ntype BoundedOperationContext = Pick<RunnerDiagnostic, \"stage\" | \"reasonCode\" | \"modelStep\" | \"toolName\" | \"attempt\" | \"remoteCallNumber\">;\n\n// Node/browser timers overflow above this delay. Schedule in segments rather\n// than silently shortening a caller-provided deadline to a few milliseconds.\nconst MAX_TIMEOUT_MS = 2_147_483_647;\nfunction scheduleTimeout(callback: () => void, delayMs: number): () => void {\n let timer: ReturnType<typeof setTimeout> | undefined;\n let cancelled = false;\n const schedule = (remainingMs: number) => {\n const interval = Math.min(remainingMs, MAX_TIMEOUT_MS);\n timer = setTimeout(() => {\n if (cancelled) return;\n const next = remainingMs - interval;\n if (next > 0) schedule(next);\n else callback();\n }, interval);\n };\n schedule(delayMs);\n return () => {\n cancelled = true;\n clearTimeout(timer);\n };\n}\n\nexport type CommerceTurnRuntime = {\n signal: AbortSignal;\n checkCancellationAndDeadline(): void;\n bounded<T>(operation: (signal: AbortSignal) => Promise<T>, timeoutMs: number, context?: BoundedOperationContext): Promise<T>;\n dispose(): void;\n};\n\nexport function createCommerceTurnRuntime(input: {\n callerSignal: AbortSignal;\n now: () => number;\n deadlineMs: number;\n}): CommerceTurnRuntime {\n const controller = new AbortController();\n const startedAt = input.now();\n const abortFromCaller = () => controller.abort();\n input.callerSignal.addEventListener(\"abort\", abortFromCaller, { once: true });\n if (input.callerSignal.aborted) controller.abort();\n const cancelDeadlineTimer = scheduleTimeout(() => controller.abort(), input.deadlineMs);\n\n const abortFailure = () => input.callerSignal.aborted\n ? new RunnerFailure(\"CANCELLED\", { stage: \"runtime.cancellation\", reasonCode: \"CANCELLED_BY_CALLER\" })\n : new RunnerFailure(\"DEADLINE\", { stage: \"runtime.deadline\", reasonCode: \"TURN_DEADLINE_EXCEEDED\" });\n const checkCancellationAndDeadline = () => {\n if (input.callerSignal.aborted || controller.signal.aborted || input.now() - startedAt >= input.deadlineMs)\n throw abortFailure();\n };\n\n return {\n signal: controller.signal,\n checkCancellationAndDeadline,\n async bounded<T>(\n operation: (signal: AbortSignal) => Promise<T>,\n timeoutMs: number,\n context?: BoundedOperationContext,\n ) {\n checkCancellationAndDeadline();\n const local = new AbortController();\n let cancelOperationTimer: (() => void) | undefined;\n let rejectAbort: (() => void) | undefined;\n const aborted = new Promise<never>((_, reject) => {\n rejectAbort = () => {\n local.abort();\n reject(abortFailure());\n };\n controller.signal.addEventListener(\"abort\", rejectAbort, { once: true });\n const remainingMs = input.deadlineMs - (input.now() - startedAt);\n const operationTimeout = timeoutMs < remainingMs;\n cancelOperationTimer = scheduleTimeout(() => {\n local.abort();\n reject(input.callerSignal.aborted || controller.signal.aborted || !operationTimeout\n ? abortFailure()\n : new RunnerFailure(\"DEADLINE\", {\n stage: \"runtime.operation\", reasonCode: \"OPERATION_TIMEOUT\",\n ...operationMetadata(context),\n }));\n }, Math.max(0, Math.min(timeoutMs, remainingMs)));\n });\n try {\n const value = await Promise.race([\n Promise.resolve().then(() => operation(local.signal)).catch((error) => {\n if (error instanceof RunnerFailure) throw error;\n if (error instanceof CommerceModelInvocationFailure)\n throw new RunnerFailure(\"UNAVAILABLE\", { ...error.diagnostic, ...operationMetadata(context) }, error);\n throw new RunnerFailure(\"UNAVAILABLE\", {\n stage: context?.stage ?? \"runtime.operation\",\n reasonCode: context?.reasonCode ?? \"UPSTREAM_OPERATION_FAILED\",\n ...operationMetadata(context),\n }, error);\n }),\n aborted,\n ]);\n checkCancellationAndDeadline();\n return value;\n } finally {\n cancelOperationTimer?.();\n if (rejectAbort) controller.signal.removeEventListener(\"abort\", rejectAbort);\n local.abort();\n }\n },\n dispose() {\n cancelDeadlineTimer();\n input.callerSignal.removeEventListener(\"abort\", abortFromCaller);\n controller.abort();\n },\n };\n}\n\nfunction operationMetadata(context?: BoundedOperationContext) {\n return {\n ...(context?.modelStep === undefined ? {} : { modelStep: context.modelStep }),\n ...(context?.toolName === undefined ? {} : { toolName: context.toolName }),\n ...(context?.attempt === undefined ? {} : { attempt: context.attempt }),\n ...(context?.remoteCallNumber === undefined ? {} : { remoteCallNumber: context.remoteCallNumber }),\n };\n}\n","import { mergeConversationProductContext, type CommerceProductObservation } from \"../product-context.js\";\nimport { RunnerFailure, mapRunnerFailure } from \"./failure.js\";\nimport { createCommerceTurnGraph, commerceTurnGraphRecursionLimit } from \"./graph/graph.js\";\nimport { initialCommerceTurnGraphState } from \"./graph/state.js\";\nimport {\n createRootTurnLogger,\n createTurnLogger,\n elapsedDuration,\n safeLog,\n type CommerceTurnLogger,\n} from \"./observability.js\";\nimport { prepareCommerceTurn } from \"./preflight.js\";\nimport { createCommerceTurnRuntime, type CommerceTurnRuntime } from \"./runtime.js\";\nimport type { RunnerDiagnosticStage } from \"./diagnostics.js\";\nimport type { RunCommerceTurnInput, RunCommerceTurnResult, RunnerErrorCode } from \"./types.js\";\n\nexport {\n PLATFORM_INSTRUCTIONS,\n RUNTIME_DATA_AUTHORITY_INSTRUCTION,\n composeTrustedInstructions,\n} from \"./instructions.js\";\nexport { CommerceModelInvocationFailure } from \"./failure.js\";\nexport type { RunnerDiagnostic, RunnerDiagnosticReason, RunnerDiagnosticStage } from \"./diagnostics.js\";\nexport { runnerVersion } from \"./version.js\";\nexport type {\n CommerceModelInvoker,\n ModelCall,\n ModelRequest,\n ModelStep,\n RunCommerceTurnInput,\n RunCommerceTurnResult,\n RunnerErrorCode,\n RunnerTool,\n} from \"./types.js\";\n\nexport async function runCommerceTurn(input: RunCommerceTurnInput): Promise<RunCommerceTurnResult> {\n let stage: RunnerDiagnosticStage = \"preflight.validate\";\n let runtime: CommerceTurnRuntime | undefined;\n let logger: CommerceTurnLogger = createRootTurnLogger(input);\n let modelSteps = 0;\n let remoteCalls = 0;\n const stats = { modelSteps: 0, remoteCalls: 0 };\n let startedAt: number | undefined;\n try {\n const prepared = prepareCommerceTurn(input);\n runtime = createCommerceTurnRuntime({\n callerSignal: input.signal,\n now: input.dependencies.now,\n deadlineMs: prepared.budgets.deadlineMs,\n });\n logger = createTurnLogger(input, prepared);\n stage = \"graph.execute\";\n startedAt = input.dependencies.now();\n safeLog(logger, \"info\", \"commerce.turn.started\", {\n modelStepBudget: prepared.budgets.modelSteps,\n remoteCallBudget: prepared.budgets.remoteCalls,\n deadlineMs: prepared.budgets.deadlineMs,\n outputTokenBudget: prepared.budgets.outputTokens,\n });\n\n const graph = createCommerceTurnGraph({ input, prepared, runtime, logger, stats });\n const state = await graph.invoke(initialCommerceTurnGraphState(), {\n recursionLimit: commerceTurnGraphRecursionLimit(prepared.budgets.modelSteps),\n });\n modelSteps = state.modelSteps;\n remoteCalls = state.remoteCalls;\n if (!state.finalResult) throw new RunnerFailure(\"INVALID_FINAL\", { stage: \"graph.execute\", reasonCode: \"MODEL_RESULT_MISSING\" });\n safeLog(logger, \"info\", \"commerce.turn.completed\", {\n answerKind: state.finalResult.answerKind,\n modelSteps,\n remoteCalls,\n evidenceCount: state.finalResult.evidenceIds.length,\n durationMs: elapsedDuration(input, startedAt),\n });\n return {\n ok: true,\n ...(() => {\n if(!input.platform) return {};\n const observations: CommerceProductObservation[] = [];\n for(const message of state.runtimeMessages) {\n if(![\"commerce_search_products\",\"commerce_get_product\"].includes(message.tool)) continue;\n const result=message.result as {status?:string;data?:{products?:CommerceProductObservation[\"products\"];product?:CommerceProductObservation[\"products\"][number]}};\n if(result.status !== \"OK\" || !result.data) continue;\n observations.push({toolName:message.tool,products:result.data.products ?? (result.data.product?[result.data.product]:[]),observedAt:new Date(input.dependencies.now()).toISOString()});\n }\n const context=mergeConversationProductContext(prepared.productContext,observations,{shopId:prepared.turn.shopId,conversationId:prepared.turn.conversationId,platform:input.platform,now:input.dependencies.now()});\n return context.references.length?{productContextUpdate:context}:{};\n })(),\n result: state.finalResult,\n usage: { modelSteps, remoteCalls },\n };\n } catch (error) {\n modelSteps = stats.modelSteps;\n remoteCalls = stats.remoteCalls;\n const result = mapRunnerFailure(error, input.signal, stage);\n if (!result.ok) {\n safeLog(logger, failureLevel(result.error.code), \"commerce.turn.failed\", {\n errorCode: result.error.code,\n retryable: result.error.retryable,\n ...result.error.diagnostic,\n modelSteps,\n remoteCalls,\n durationMs: safeFailureDuration(input, startedAt),\n });\n }\n return result;\n } finally {\n runtime?.dispose();\n }\n}\n\nfunction failureLevel(code: RunnerErrorCode): \"warn\" | \"error\" {\n return [\"CANCELLED\", \"DENIED\", \"STALE_TURN\", \"BUDGET_EXHAUSTED\"].includes(code)\n ? \"warn\"\n : \"error\";\n}\nfunction safeFailureDuration(input: RunCommerceTurnInput, startedAt?: number): number {\n if (startedAt === undefined) return 0;\n try { return elapsedDuration(input, startedAt); }\n catch { return 0; }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/commerce/runner/graph/graph.ts","../../../src/commerce/runner/model-step.ts","../../../src/commerce/runner/graph/state.ts","../../../src/commerce/runner/version.ts","../../../src/commerce/runner/observability.ts","../../../src/commerce/runner/evidence.ts","../../../src/commerce/runner/tool-policy.ts","../../../src/commerce/runner/tool-execution.ts","../../../src/commerce/runner/graph/nodes/execute-tool-calls.ts","../../../src/commerce/runner/graph/nodes/invoke-model.ts","../../../src/commerce/runner/graph/nodes/resolve-available-tools.ts","../../../src/commerce/runner/final-response.ts","../../../src/commerce/runner/safe-referral-text.ts","../../../src/commerce/runner/graph/nodes/validate-final-response.ts","../../../src/commerce/runner/preflight.ts","../../../src/commerce/runner/runtime.ts","../../../src/commerce/runner/index.ts"],"sourcesContent":["import { END, START, StateGraph } from \"@langchain/langgraph\";\nimport { RunnerFailure } from \"../failure.js\";\nimport { routeModelStep } from \"../model-step.js\";\nimport type { CommerceTurnLogger } from \"../observability.js\";\nimport type { PreparedCommerceTurn } from \"../preflight.js\";\nimport type { CommerceTurnRuntime } from \"../runtime.js\";\nimport type { RunCommerceTurnInput } from \"../types.js\";\nimport {\n CommerceTurnGraphState,\n type CommerceTurnGraphStateValue,\n} from \"./state.js\";\nimport { executeToolCallsNode } from \"./nodes/execute-tool-calls.js\";\nimport { invokeModelNode } from \"./nodes/invoke-model.js\";\nimport { resolveAvailableToolsNode } from \"./nodes/resolve-available-tools.js\";\nimport { validateFinalResponseNode } from \"./nodes/validate-final-response.js\";\n\nexport const COMMERCE_TURN_GRAPH_RECURSION_LIMIT = 64;\n\n// Each model step can traverse resolveAvailableTools, invokeModel and\n// executeToolCalls; a final step validates the response instead. Keep the\n// original minimum for existing callers, but derive the ceiling from the\n// caller's requested model-step budget.\nexport function commerceTurnGraphRecursionLimit(modelSteps: number): number {\n return Math.max(COMMERCE_TURN_GRAPH_RECURSION_LIMIT, modelSteps * 3 + 4);\n}\n\nexport type CommerceTurnGraphExecution = {\n input: RunCommerceTurnInput;\n prepared: PreparedCommerceTurn;\n runtime: CommerceTurnRuntime;\n logger: CommerceTurnLogger;\n stats: { modelSteps: number; remoteCalls: number };\n};\n\nexport function createCommerceTurnGraph(execution: CommerceTurnGraphExecution) {\n return new StateGraph(CommerceTurnGraphState)\n .addNode(\"resolveAvailableTools\", resolveAvailableToolsNode(execution))\n .addNode(\"invokeModel\", invokeModelNode(execution))\n .addNode(\"executeToolCalls\", executeToolCallsNode(execution))\n .addNode(\"validateFinalResponse\", validateFinalResponseNode(execution))\n .addEdge(START, \"resolveAvailableTools\")\n .addEdge(\"resolveAvailableTools\", \"invokeModel\")\n .addConditionalEdges(\"invokeModel\", (state: CommerceTurnGraphStateValue) => {\n if (!state.pendingStep) throw new RunnerFailure(\"INVALID_FINAL\", { stage: \"graph.execute\", reasonCode: \"MODEL_RESULT_MISSING\" });\n return routeModelStep(state.pendingStep);\n }, {\n toolCalls: \"executeToolCalls\",\n finalResponse: \"validateFinalResponse\",\n textResponse: \"validateFinalResponse\",\n })\n .addEdge(\"executeToolCalls\", \"resolveAvailableTools\")\n .addConditionalEdges(\"validateFinalResponse\", (state: CommerceTurnGraphStateValue) => state.finalResult ? \"complete\" : \"repair\", { complete: END, repair: \"resolveAvailableTools\" })\n .compile();\n}","import { jsonBytes } from \"../canonical-json.js\";\nimport type { RunnerDiagnosticReason } from \"./diagnostics.js\";\nimport { RunnerFailure } from \"./failure.js\";\nimport type { ModelStep } from \"./types.js\";\n\nfunction invalidStep(reasonCode: RunnerDiagnosticReason, callIndex?: number, cause?: unknown): never {\n throw new RunnerFailure(\"INVALID_FINAL\", {\n stage: \"model.validate\", reasonCode,\n ...(callIndex === undefined ? {} : { callIndex }),\n }, cause);\n}\n\n/** Report the first violated invariant rather than grouping unrelated model-output failures. */\nexport function validateModelStep(step: unknown, outputTokenBudget: number): ModelStep {\n try {\n if (step === null || typeof step !== \"object\" || Array.isArray(step))\n invalidStep(\"MODEL_STEP_NOT_OBJECT\");\n const value = step as Record<string, unknown>;\n if (!Object.hasOwn(value, \"calls\")) invalidStep(\"MODEL_STEP_CALLS_MISSING\");\n if (!Array.isArray(value.calls)) invalidStep(\"MODEL_STEP_CALLS_NOT_ARRAY\");\n if (!Object.hasOwn(value, \"outputTokens\")) invalidStep(\"MODEL_OUTPUT_TOKENS_MISSING\");\n if (!Number.isSafeInteger(value.outputTokens)) invalidStep(\"MODEL_OUTPUT_TOKENS_NOT_SAFE_INTEGER\");\n const outputTokens = value.outputTokens as number;\n if (outputTokens < 0) invalidStep(\"MODEL_OUTPUT_TOKENS_NEGATIVE\");\n if (outputTokens > outputTokenBudget) invalidStep(\"MODEL_OUTPUT_TOKENS_OVER_BUDGET\");\n\n if (Object.hasOwn(value, \"text\")) {\n if (typeof value.text !== \"string\") invalidStep(\"MODEL_TEXT_NOT_STRING\");\n if (value.text.length > 4096) invalidStep(\"MODEL_TEXT_TOO_LONG\");\n }\n\n const calls = value.calls as unknown[];\n if (calls.length > 32) invalidStep(\"MODEL_TOOL_CALL_LIMIT_EXCEEDED\");\n for (let index = 0; index < calls.length; index += 1) {\n const call = calls[index];\n if (call === null) invalidStep(\"MODEL_TOOL_CALL_NULL\", index);\n if (typeof call !== \"object\" || Array.isArray(call)) invalidStep(\"MODEL_TOOL_CALL_NOT_OBJECT\", index);\n const fields = call as Record<string, unknown>;\n if (!Object.hasOwn(fields, \"name\")) invalidStep(\"MODEL_TOOL_CALL_NAME_MISSING\", index);\n if (typeof fields.name !== \"string\") invalidStep(\"MODEL_TOOL_CALL_NAME_NOT_STRING\", index);\n if (!fields.name.length) invalidStep(\"MODEL_TOOL_CALL_NAME_EMPTY\", index);\n if (fields.name.length > 128) invalidStep(\"MODEL_TOOL_CALL_NAME_TOO_LONG\", index);\n if (!Object.hasOwn(fields, \"arguments\")) invalidStep(\"MODEL_TOOL_CALL_ARGUMENTS_MISSING\", index);\n if (fields.arguments === null) invalidStep(\"MODEL_TOOL_CALL_ARGUMENTS_NULL\", index);\n if (typeof fields.arguments !== \"object\" || Array.isArray(fields.arguments))\n invalidStep(\"MODEL_TOOL_CALL_ARGUMENTS_NOT_OBJECT\", index);\n }\n\n let size: number;\n try {\n size = jsonBytes(step);\n } catch (error) {\n invalidStep(\"MODEL_STEP_NOT_SERIALIZABLE\", undefined, error);\n }\n if (size > 262144) invalidStep(\"MODEL_STEP_TOO_LARGE\");\n return step as ModelStep;\n } catch (error) {\n if (error instanceof RunnerFailure) throw error;\n invalidStep(\"MODEL_STEP_VALIDATION_FAILED\", undefined, error);\n }\n}\n\nexport function routeModelStep(step: ModelStep): \"toolCalls\" | \"finalResponse\" | \"textResponse\" {\n const finalCalls = step.calls.filter((call) => call.name === \"finalResponse\");\n if (finalCalls.length > 0) {\n if (finalCalls.length !== 1 || step.calls.length !== 1)\n throw new RunnerFailure(\"INVALID_FINAL\", { stage: \"model.route\", reasonCode: \"MODEL_CALL_ROUTE_INVALID\" });\n return \"finalResponse\";\n }\n if (step.calls.length === 0) {\n if (step.text?.trim()) return \"textResponse\";\n if(step.providerSummary?.finishReason === \"length\") throw new RunnerFailure(\"BUDGET_EXHAUSTED\", {stage:\"model.route\",reasonCode:\"MODEL_OUTPUT_TOKENS_EXHAUSTED\"});\n throw new RunnerFailure(\"INVALID_FINAL\", { stage: \"model.route\", reasonCode: \"MODEL_CALL_ROUTE_INVALID\" });\n }\n return \"toolCalls\";\n}\n","import { Annotation } from \"@langchain/langgraph\";\nimport type { CommerceFinalResponse } from \"../../response.js\";\nimport type { CommerceEvidence } from \"../../schemas.js\";\nimport type { ToolDescriptor } from \"../../definitions.js\";\nimport type { ModelStep } from \"../types.js\";\n\nexport type CommerceRuntimeMessage = Readonly<{ tool: string; result: unknown }>;\n\nexport const CommerceTurnGraphState = Annotation.Root({\n selectionRepairUsed: Annotation<boolean>(),\n modelSteps: Annotation<number>(),\n remoteCalls: Annotation<number>(),\n availableTools: Annotation<readonly ToolDescriptor[]>(),\n pendingStep: Annotation<ModelStep | null>(),\n runtimeMessages: Annotation<readonly CommerceRuntimeMessage[]>(),\n evidenceById: Annotation<Readonly<Record<string, CommerceEvidence>>>(),\n requiredReferral: Annotation<CommerceFinalResponse[\"referralReason\"]>(),\n finalResult: Annotation<CommerceFinalResponse | null>(),\n});\n\nexport type CommerceTurnGraphStateValue = typeof CommerceTurnGraphState.State;\n\nexport function initialCommerceTurnGraphState(): CommerceTurnGraphStateValue {\n return {\n selectionRepairUsed: false,\n modelSteps: 0,\n remoteCalls: 0,\n availableTools: [],\n pendingStep: null,\n runtimeMessages: [],\n evidenceById: {},\n requiredReferral: null,\n finalResult: null,\n };\n}","export const runnerVersion = \"1.1.0\";\n","import { runnerVersion } from \"./version.js\";\nimport type { LogFields, StructuredLogger } from \"../../logging/index.js\";\nimport type { PreparedCommerceTurn } from \"./preflight.js\";\nimport type { RunCommerceTurnInput, ModelResponseSummary } from \"./types.js\";\n\nexport type CommerceTurnLogger = StructuredLogger | undefined;\n\nexport function safeLog(\n logger: StructuredLogger | undefined,\n level: \"debug\" | \"info\" | \"warn\" | \"error\",\n event: string,\n fields: LogFields,\n): void {\n try {\n logger?.[level](event, fields);\n } catch {\n // Logging is an isolated diagnostic side effect.\n }\n}\n\nexport function createRootTurnLogger(input: RunCommerceTurnInput): CommerceTurnLogger {\n try { return input.dependencies.logger; } catch { return undefined; }\n}\n\nexport function createTurnLogger(\n input: RunCommerceTurnInput,\n prepared: PreparedCommerceTurn,\n): CommerceTurnLogger {\n try {\n const fields: Record<string, unknown> = {\n component: \"commerce-turn-runner\",\n runnerVersion,\n shopId: prepared.turn.shopId,\n conversationId: prepared.turn.conversationId,\n inboundVersion: prepared.turn.inboundVersion,\n grantId: prepared.grant.id,\n releaseId: prepared.grant.releaseId,\n };\n if (prepared.turn.checkoutRecoveryId !== undefined)\n fields.checkoutRecoveryId = prepared.turn.checkoutRecoveryId;\n return input.dependencies.logger?.child(fields) ?? createRootTurnLogger(input);\n } catch {\n return createRootTurnLogger(input);\n }\n}\n\nexport function elapsedDuration(input: RunCommerceTurnInput, startedAt: number): number {\n const elapsed = input.dependencies.now() - startedAt;\n if (!Number.isFinite(elapsed)) return 0;\n return Math.max(0, Math.min(90000, elapsed));\n}\n\nexport function logModelStarted(\n logger: CommerceTurnLogger,\n fields: { modelStep: number; availableToolCount: number },\n) {\n safeLog(logger, \"debug\", \"commerce.turn.model.started\", fields);\n}\n\n/** Defense in depth: log only finite, allowlisted telemetry even for custom invokers. */\nfunction safeProviderSummary(summary: ModelResponseSummary | undefined): LogFields {\n if (!summary || typeof summary !== \"object\" || Array.isArray(summary)) return {};\n const allowedReasons = [\"stop\", \"length\", \"tool_calls\", \"content_filter\", \"other\"];\n const allowedKinds = [\"missing\", \"plain_text\", \"typed_blocks\", \"non_text_blocks\"];\n return {\n ...(allowedReasons.includes(summary.finishReason ?? \"\") ? { providerFinishReason: summary.finishReason } : {}),\n ...(Number.isSafeInteger(summary.reasoningTokens) && summary.reasoningTokens! >= 0 && summary.reasoningTokens! <= 1_000_000_000\n ? { providerReasoningTokens: summary.reasoningTokens } : {}),\n ...(typeof summary.hasVisibleText === \"boolean\" ? { providerHasVisibleText: summary.hasVisibleText } : {}),\n ...(typeof summary.hasReasoningBlocks === \"boolean\" ? { providerHasReasoningBlocks: summary.hasReasoningBlocks } : {}),\n ...(allowedKinds.includes(summary.contentKind) ? { providerContentKind: summary.contentKind } : {}),\n };\n}\n\nexport function logModelCompleted(\n logger: CommerceTurnLogger,\n fields: {\n modelStep: number;\n requestedToolCount: number;\n finalResponseRequested: boolean;\n outputTokens: number;\n durationMs: number;\n providerSummary?: ModelResponseSummary;\n },\n) {\n const { providerSummary, ...ordinaryFields } = fields;\n safeLog(logger, \"debug\", \"commerce.turn.model.completed\", {\n ...ordinaryFields, ...safeProviderSummary(providerSummary),\n });\n}\n\nexport function logModelInvalid(\n logger: CommerceTurnLogger,\n modelStep: number,\n reasonCode: string,\n providerSummary?: ModelResponseSummary,\n) {\n safeLog(logger, \"warn\", \"commerce.turn.model.invalid\", {\n modelStep, reasonCode, ...safeProviderSummary(providerSummary),\n });\n}\n","import { canonicalJson } from \"../canonical-json.js\";\nimport { CommerceEvidenceSchema, type CommerceEvidence, type CommerceToolResult } from \"../schemas.js\";\nimport { RunnerFailure } from \"./failure.js\";\nimport { schemaIssueMetadata } from \"./diagnostics.js\";\nimport type { CommerceTurnRuntime } from \"./runtime.js\";\nimport type { PreparedCommerceTurn } from \"./preflight.js\";\nimport type { RunCommerceTurnInput, RunnerTool } from \"./types.js\";\nimport { safeLog, type CommerceTurnLogger } from \"./observability.js\";\n\nexport function collectVerifiedEvidence(input: {\n source: RunCommerceTurnInput;\n prepared: PreparedCommerceTurn;\n runtime: CommerceTurnRuntime;\n tool: RunnerTool;\n toolName: string;\n result: CommerceToolResult;\n modelStep: number;\n logger: CommerceTurnLogger;\n}): CommerceEvidence[] {\n const { result, tool } = input;\n if (\n result.status !== \"OK\" ||\n (result.data && typeof result.data === \"object\" && \"source\" in result.data &&\n result.data.source === \"SHOPIFY_STOREFRONT\")\n ) return [];\n const accepted: CommerceEvidence[] = [];\n for (const raw of tool.extractEvidence?.(result) ?? []) {\n const parsedEvidence = CommerceEvidenceSchema.safeParse(raw);\n if (!parsedEvidence.success) throw new RunnerFailure(\"INVALID_INPUT\", {\n stage: \"evidence.validate\", reasonCode: \"EVIDENCE_INVALID\", ...schemaIssueMetadata(parsedEvidence.error),\n }, parsedEvidence.error);\n const evidence = parsedEvidence.data;\n const { evidenceId, ...hashInput } = evidence;\n if (\n canonicalJson(evidence.turn) !== canonicalJson(input.prepared.turn) ||\n evidence.grantId !== input.prepared.grant.id ||\n evidence.releaseId !== input.prepared.grant.releaseId ||\n input.source.dependencies.digest(canonicalJson(hashInput)) !== evidenceId ||\n Date.parse(evidence.evaluatedAt) > input.source.dependencies.now()\n ) throw new RunnerFailure(\"INVALID_FINAL\", { stage: \"evidence.validate\", reasonCode: \"EVIDENCE_INVALID\" });\n accepted.push(evidence);\n }\n if (accepted.length > 0) {\n safeLog(input.logger, \"debug\", \"commerce.turn.evidence.accepted\", {\n modelStep: input.modelStep,\n toolName: input.toolName,\n evidenceCount: accepted.length,\n });\n }\n return accepted;\n}","import { canonicalJson } from \"../canonical-json.js\";\nimport { isBuiltInTool, type GrantedTool, type ToolDescriptor } from \"../definitions.js\";\nimport { RunnerFailure } from \"./failure.js\";\nimport type { CommerceTurnRuntime } from \"./runtime.js\";\nimport type { PreparedCommerceTurn } from \"./preflight.js\";\nimport type { RunnerTool } from \"./types.js\";\n\nexport type ToolDenialReason = \"INSUFFICIENT_TOOLS\" | \"TOOL_UNAVAILABLE\" | \"TOOL_REVOKED\";\n\nexport async function resolveAvailableTools(\n prepared: PreparedCommerceTurn,\n runtime: CommerceTurnRuntime,\n): Promise<ToolDescriptor[]> {\n const available: ToolDescriptor[] = [];\n for (const granted of prepared.grant.grantedTools) {\n if (prepared.executionPurpose && prepared.manifest.purposeProfile && !prepared.manifest.purposeProfile.capabilities.some(member =>\n !isBuiltInTool(granted) && member.toolId === granted.toolId && member.revisionId === granted.toolRevisionId && member.name === granted.toolName)) continue;\n const tool = prepared.registered.get(granted.toolName);\n const descriptor = isBuiltInTool(granted)\n ? prepared.manifest.builtInTools.find(candidate => candidate.name === granted.toolName &&\n candidate.definitionVersion === granted.definitionVersion)\n : prepared.manifest.capabilities.map(capability => capability.toolDescriptor)\n .find(candidate => candidate.toolId === granted.toolId);\n if (!tool || !descriptor) continue;\n if (canonicalJson(tool.descriptor) !== canonicalJson(descriptor))\n throw new RunnerFailure(\"INCOMPATIBLE_VERSION\", {\n stage: \"tools.resolve\", reasonCode: \"TOOL_DESCRIPTOR_MISMATCH\", toolName: granted.toolName,\n });\n if (await runtime.bounded((signal) => tool.isAuthorized(granted, signal), 10000, {\n stage: \"tool.authorize\", reasonCode: \"TOOL_AUTHORIZATION_FAILED\", toolName: granted.toolName,\n }))\n available.push(descriptor);\n }\n if (prepared.executionPurpose && prepared.manifest.purposeProfile) {\n const positions = new Map(prepared.manifest.purposeProfile.capabilities.map(member => [member.name, member.position]));\n available.sort((left, right) => positions.get(left.name)! - positions.get(right.name)!);\n }\n return available;\n}\n\nexport function resolveToolCall(\n name: string,\n prepared: PreparedCommerceTurn,\n availableTools: readonly ToolDescriptor[],\n): { grant: GrantedTool; tool: RunnerTool } | { denial: ToolDenialReason } {\n const grant = prepared.grant.grantedTools.find((entry) => entry.toolName === name);\n const tool = prepared.registered.get(name);\n if (!grant) return { denial: \"INSUFFICIENT_TOOLS\" };\n if (prepared.executionPurpose && !prepared.manifest.purposeProfile?.capabilities.some(member => !isBuiltInTool(grant) && member.toolId === grant.toolId && member.revisionId === grant.toolRevisionId && member.name === name)) return { denial: \"INSUFFICIENT_TOOLS\" };\n if (!tool) return { denial: \"TOOL_UNAVAILABLE\" };\n const pinned = availableTools.find(descriptor => descriptor.name === name);\n if (!pinned) return { denial: \"TOOL_REVOKED\" };\n if (canonicalJson(pinned) !== canonicalJson(tool.descriptor))\n throw new RunnerFailure(\"INCOMPATIBLE_VERSION\", {\n stage: \"tools.resolve\", reasonCode: \"TOOL_DESCRIPTOR_MISMATCH\", toolName: name,\n });\n return { grant, tool };\n}","import { CommerceProductSchema } from \"../schemas.js\";\nimport { isBuiltInTool } from \"../definitions.js\";\nimport { jsonBytes } from \"../canonical-json.js\";\nimport { CommerceToolResultSchema, CommerceToolOutputs, type CommerceEvidence } from \"../schemas.js\";\nimport type { CommerceFinalResponse } from \"../response.js\";\nimport { compileCommercePurposeOutputSchema } from \"../purpose-output.js\";\nimport { compileSubset } from \"../subset.js\";\nimport { RunnerFailure } from \"./failure.js\";\nimport { schemaIssueMetadata } from \"./diagnostics.js\";\nimport { collectVerifiedEvidence } from \"./evidence.js\";\nimport { elapsedDuration, safeLog, type CommerceTurnLogger } from \"./observability.js\";\nimport type { PreparedCommerceTurn } from \"./preflight.js\";\nimport type { CommerceTurnRuntime } from \"./runtime.js\";\nimport { resolveToolCall } from \"./tool-policy.js\";\nimport type { RunCommerceTurnInput, ModelStep } from \"./types.js\";\n\nexport type ToolExecutionResult = {\n remoteCalls: number;\n runtimeMessages: ReadonlyArray<{ tool: string; result: unknown }>;\n evidenceById: Readonly<Record<string, CommerceEvidence>>;\n requiredReferral: CommerceFinalResponse[\"referralReason\"];\n};\n\nexport async function executeToolCalls(input: {\n source: RunCommerceTurnInput;\n prepared: PreparedCommerceTurn;\n runtime: CommerceTurnRuntime;\n modelStep: number;\n step: ModelStep;\n availableTools: Parameters<typeof resolveToolCall>[2];\n remoteCalls: number;\n runtimeMessages: ReadonlyArray<{ tool: string; result: unknown }>;\n evidenceById: Readonly<Record<string, CommerceEvidence>>;\n requiredReferral: CommerceFinalResponse[\"referralReason\"];\n logger: CommerceTurnLogger;\n onRemoteCall?: (remoteCalls: number) => void;\n}): Promise<ToolExecutionResult> {\n let remoteCalls = input.remoteCalls;\n const runtimeMessages = [...input.runtimeMessages];\n const evidenceById = { ...input.evidenceById };\n let requiredReferral = input.requiredReferral;\n\n toolCalls: for (const call of input.step.calls) {\n input.runtime.checkCancellationAndDeadline();\n const policy = resolveToolCall(call.name, input.prepared, input.availableTools);\n if (\"denial\" in policy) {\n requiredReferral = requiredReferral === \"TOOL_REVOKED\" ? requiredReferral : policy.denial;\n safeLog(input.logger, \"warn\", \"commerce.turn.tool.denied\", {\n modelStep: input.modelStep,\n toolName: call.name,\n reasonCode: policy.denial,\n });\n runtimeMessages.push({\n tool: call.name,\n result: { contractVersion: \"commerce.v1\", status: \"ERROR\", code: \"DENIED\", retryable: false },\n });\n continue;\n }\n const { grant, tool } = policy;\n if (!(await input.runtime.bounded((signal) => tool.isAuthorized(grant, signal), 10000, {\n stage: \"tool.authorize\", reasonCode: \"TOOL_AUTHORIZATION_FAILED\", toolName: call.name, modelStep: input.modelStep,\n }))) {\n requiredReferral = \"TOOL_REVOKED\";\n safeLog(input.logger, \"warn\", \"commerce.turn.tool.denied\", {\n modelStep: input.modelStep,\n toolName: call.name,\n reasonCode: \"TOOL_REVOKED\",\n });\n runtimeMessages.push({\n tool: call.name,\n result: { contractVersion: \"commerce.v1\", status: \"ERROR\", code: \"DENIED\", retryable: false },\n });\n continue;\n }\n resolveToolCall(call.name, input.prepared, input.availableTools);\n const args = compileSubset(tool.descriptor.inputSchema, \"input\").safeParse(call.arguments);\n if (!args.success) {\n if(remoteCalls >= input.prepared.budgets.remoteCalls) throw new RunnerFailure(\"BUDGET_EXHAUSTED\",{stage:\"tool.validate\",reasonCode:\"TOOL_CALL_BUDGET_EXHAUSTED\"});\n remoteCalls++; input.onRemoteCall?.(remoteCalls);\n runtimeMessages.push({tool:call.name,result:{contractVersion:\"commerce.v1\",status:\"ERROR\",code:\"INVALID_INPUT\",retryable:false}});\n safeLog(input.logger,\"warn\",\"commerce.turn.tool.invalid_input\",{toolName:call.name,reasonCode:\"TOOL_INPUT_INVALID\",...schemaIssueMetadata(args.error)});\n continue;\n }\n\n let result: ReturnType<typeof CommerceToolResultSchema.parse> | undefined;\n for (let attempt = 1; attempt <= 2; attempt += 1) {\n if (remoteCalls >= input.prepared.budgets.remoteCalls)\n throw new RunnerFailure(\"BUDGET_EXHAUSTED\", {\n stage: \"tool.execute\", reasonCode: \"TOOL_CALL_BUDGET_EXHAUSTED\", toolName: call.name, modelStep: input.modelStep,\n });\n const remoteCallNumber = remoteCalls + 1;\n const startedAt = input.source.dependencies.now();\n safeLog(input.logger, \"debug\", \"commerce.turn.tool.started\", {\n modelStep: input.modelStep,\n toolName: call.name,\n attempt,\n remoteCallNumber,\n });\n remoteCalls += 1;\n input.onRemoteCall?.(remoteCalls);\n const raw = await input.runtime.bounded((signal) => tool.execute(args.data, signal), 10000, {\n stage: \"tool.execute\", reasonCode: \"TOOL_EXECUTION_FAILED\", toolName: call.name,\n modelStep: input.modelStep, attempt, remoteCallNumber,\n });\n let rawSize: number;\n try { rawSize = jsonBytes(raw); }\n catch (error) {\n throw new RunnerFailure(\"INVALID_INPUT\", { stage: \"tool.result\", reasonCode: \"TOOL_RESULT_INVALID\",\n toolName: call.name, modelStep: input.modelStep, attempt, remoteCallNumber }, error);\n }\n if (rawSize > 262144) throw new RunnerFailure(\"UNAVAILABLE\", {\n stage: \"tool.result\", reasonCode: \"TOOL_RESULT_TOO_LARGE\", toolName: call.name,\n modelStep: input.modelStep, attempt, remoteCallNumber,\n });\n const parsedResult = CommerceToolResultSchema.safeParse(raw);\n if (!parsedResult.success) throw new RunnerFailure(\"INVALID_INPUT\", {\n stage: \"tool.result\", reasonCode: \"TOOL_RESULT_INVALID\", toolName: call.name,\n modelStep: input.modelStep, attempt, remoteCallNumber, ...schemaIssueMetadata(parsedResult.error),\n }, parsedResult.error);\n result = parsedResult.data;\n if (result.status === \"OK\" && isBuiltInTool(grant)) {\n const output = CommerceToolOutputs[grant.toolName].safeParse(result.data);\n if (!output.success) throw new RunnerFailure(\"INVALID_INPUT\", {\n stage: \"tool.result\", reasonCode: \"TOOL_RESULT_INVALID\", toolName: call.name,\n modelStep: input.modelStep, ...schemaIssueMetadata(output.error),\n }, output.error);\n // Keep schema transformations: downstream policy, evidence and model\n // messages must consume the same validated bounded value.\n result = { ...result, data: output.data };\n }\n if (result.status === \"OK\" && [\"commerce_search_products\", \"commerce_get_product\"].includes(call.name)) {\n const data = result.data;\n if (!data || typeof data !== \"object\" || Array.isArray(data))\n throw new RunnerFailure(\"INVALID_INPUT\", {stage:\"tool.result\",reasonCode:\"TOOL_RESULT_INVALID\",toolName:call.name});\n const payload = data as Record<string, unknown>;\n const parsed = call.name === \"commerce_search_products\"\n ? CommerceProductSchema.array().max(20).safeParse(payload.products)\n : CommerceProductSchema.nullable().safeParse(payload.product);\n if (!parsed.success) throw new RunnerFailure(\"INVALID_INPUT\", {\n stage:\"tool.result\", reasonCode:\"TOOL_RESULT_INVALID\", toolName:call.name,\n modelStep:input.modelStep, ...schemaIssueMetadata(parsed.error),\n }, parsed.error);\n result = { ...result, data: { ...payload, [call.name === \"commerce_search_products\" ? \"products\" : \"product\"]: parsed.data } };\n }\n const purposeMember = input.prepared.executionPurpose && input.prepared.manifest.purposeProfile?.capabilities.find(member => member.name === call.name);\n if (purposeMember && result.status === \"OK\" && !compileCommercePurposeOutputSchema(purposeMember.outputSchema).safeParse(result.data).success)\n throw new RunnerFailure(\"INVALID_INPUT\", { stage: \"tool.result\", reasonCode: \"TOOL_RESULT_INVALID\", toolName: call.name, modelStep: input.modelStep });\n if (result.status === \"ERROR\" && result.code === \"STALE_TURN\")\n throw new RunnerFailure(\"STALE_TURN\", {\n stage: \"tool.result\", reasonCode: \"TOOL_STALE_TURN\", toolName: call.name, modelStep: input.modelStep,\n });\n if (!(await input.runtime.bounded(signal => tool.isAuthorized(grant, signal), 10000, {\n stage: \"tool.authorize\", reasonCode: \"TOOL_AUTHORIZATION_FAILED\", toolName: call.name, modelStep: input.modelStep,\n }))) {\n requiredReferral = \"TOOL_REVOKED\";\n runtimeMessages.push({tool: call.name, result: {contractVersion: \"commerce.v1\", status: \"ERROR\", code: \"DENIED\", retryable: false}});\n safeLog(input.logger, \"warn\", \"commerce.turn.tool.denied\", {toolName: call.name, reasonCode: \"TOOL_REVOKED\"});\n continue toolCalls;\n }\n resolveToolCall(call.name, input.prepared, input.availableTools);\n const durationMs = elapsedDuration(input.source, startedAt);\n safeLog(input.logger, \"debug\", \"commerce.turn.tool.completed\", {\n modelStep: input.modelStep,\n toolName: call.name,\n attempt,\n status: result.status,\n ...(result.status === \"ERROR\" ? { errorCode: result.code, retryable: result.retryable } : {}),\n durationMs,\n remoteCallNumber,\n });\n if(result.status === \"ERROR\" && ![\"INVALID_INPUT\",\"NOT_FOUND\"].includes(result.code))\n requiredReferral = result.code === \"DENIED\" || requiredReferral === \"TOOL_REVOKED\" ? \"TOOL_REVOKED\" : \"TOOL_UNAVAILABLE\";\n if (\n attempt === 1 && result.status === \"ERROR\" && result.retryable &&\n (result.code === \"UNAVAILABLE\" || result.code === \"THROTTLED\")\n ) {\n safeLog(input.logger, \"warn\", \"commerce.turn.tool.retry\", {\n modelStep: input.modelStep,\n toolName: call.name,\n attempt,\n errorCode: result.code,\n });\n continue;\n }\n break;\n }\n if (!result) throw new RunnerFailure(\"UNAVAILABLE\", {\n stage: \"tool.result\", reasonCode: \"TOOL_RESULT_MISSING\", toolName: call.name, modelStep: input.modelStep,\n });\n if (result.status === \"ERROR\") {\n if (result.code === \"STALE_TURN\") throw new RunnerFailure(\"STALE_TURN\", {\n stage: \"tool.result\", reasonCode: \"TOOL_STALE_TURN\", toolName: call.name, modelStep: input.modelStep,\n });\n if (![\"INVALID_INPUT\",\"NOT_FOUND\"].includes(result.code)) requiredReferral = result.code === \"DENIED\" || requiredReferral === \"TOOL_REVOKED\" ? \"TOOL_REVOKED\" : \"TOOL_UNAVAILABLE\";\n }\n for (const evidence of collectVerifiedEvidence({\n source: input.source,\n prepared: input.prepared,\n runtime: input.runtime,\n tool,\n toolName: call.name,\n result,\n modelStep: input.modelStep,\n logger: input.logger,\n })) evidenceById[evidence.evidenceId] = evidence;\n runtimeMessages.push({ tool: call.name, result });\n }\n\n return { remoteCalls, runtimeMessages, evidenceById, requiredReferral };\n}","import { RunnerFailure } from \"../../failure.js\";\nimport { executeToolCalls } from \"../../tool-execution.js\";\nimport type { CommerceTurnGraphExecution } from \"../graph.js\";\nimport type { CommerceTurnGraphStateValue } from \"../state.js\";\n\nexport function executeToolCallsNode(execution: CommerceTurnGraphExecution) {\n return async (state: CommerceTurnGraphStateValue) => {\n if (!state.pendingStep) throw new RunnerFailure(\"INVALID_FINAL\", { stage: \"graph.execute\", reasonCode: \"MODEL_RESULT_MISSING\" });\n const result = await executeToolCalls({\n source: execution.input,\n prepared: execution.prepared,\n runtime: execution.runtime,\n modelStep: state.modelSteps,\n step: state.pendingStep,\n availableTools: state.availableTools,\n remoteCalls: state.remoteCalls,\n runtimeMessages: state.runtimeMessages,\n evidenceById: state.evidenceById,\n requiredReferral: state.requiredReferral,\n logger: execution.logger,\n onRemoteCall: (remoteCalls) => { execution.stats.remoteCalls = remoteCalls; },\n });\n return { ...result, pendingStep: null };\n };\n}","import { finalResponseToolSchema } from \"../../../response.js\";\nimport { RunnerFailure } from \"../../failure.js\";\nimport { elapsedDuration, logModelCompleted, logModelInvalid, logModelStarted } from \"../../observability.js\";\nimport { validateModelStep, routeModelStep } from \"../../model-step.js\";\nimport type { CommerceTurnGraphExecution } from \"../graph.js\";\nimport type { CommerceTurnGraphStateValue } from \"../state.js\";\nimport type { ModelStep } from \"../../types.js\";\n\nexport function invokeModelNode(execution: CommerceTurnGraphExecution) {\n return async (state: CommerceTurnGraphStateValue) => {\n execution.runtime.checkCancellationAndDeadline();\n const modelStep = state.modelSteps + 1;\n execution.stats.modelSteps = modelStep;\n const startedAt = execution.input.dependencies.now();\n logModelStarted(execution.logger, { modelStep, availableToolCount: state.availableTools.length });\n let raw: unknown;\n try {\n raw = await execution.runtime.bounded((signal) => execution.input.dependencies.model.invoke({\n instructions: state.selectionRepairUsed ? [...execution.prepared.instructions,\n \"Your previous final answer omitted structured product selections even though product tools returned products. Correct the finalResponse now: put exact observed product/variant selections in the appropriate pinned details fields. Preserve the customer objective, select only relevant observed products, and never invent identifiers or promotions. Reuse current tool results; do not repeat searches merely to repair the response format.\"] : execution.prepared.instructions,\n context: { trustedRecovery: execution.input.context, language: execution.input.language, ...(execution.prepared.productContext?.references.length ? { productReferences: { trust: \"UNTRUSTED_REFERENCE_DATA_NOT_CURRENT_FACTS_OR_AUTHORITY\", references: execution.prepared.productContext.references, ...(execution.prepared.productContext.presentation?{presentation:execution.prepared.productContext.presentation}:{}) } } : {}) },\n history: execution.input.history,\n messages: state.runtimeMessages,\n tools: [\n ...(state.selectionRepairUsed ? [] : state.availableTools).map((descriptor) => ({\n name: descriptor.name,\n description: descriptor.description,\n inputSchema: descriptor.inputSchema,\n })),\n {\n name: \"finalResponse\",\n description: \"Return a structured reply with pinned details selections when presenting retrieved products, product facts, options, evidence, metadata or a referral. Plain text is only for answers that need none of these selections.\",\n inputSchema: finalResponseToolSchema(execution.prepared.response),\n },\n ],\n maxOutputTokens: execution.prepared.budgets.outputTokens,\n }, signal), execution.prepared.budgets.deadlineMs, {\n stage: \"model.invoke\", reasonCode: \"MODEL_INVOCATION_FAILED\", modelStep,\n });\n } catch (error) {\n if (error instanceof RunnerFailure) throw error;\n throw new RunnerFailure(\"UNAVAILABLE\", { stage: \"model.invoke\", reasonCode: \"MODEL_INVOCATION_FAILED\", modelStep }, error);\n }\n let step: ModelStep;\n let observedStep: ModelStep | undefined;\n try {\n step = validateModelStep(raw, execution.prepared.budgets.outputTokens);\n observedStep = step;\n routeModelStep(step);\n if (state.selectionRepairUsed && (step.calls.length !== 1 || step.calls[0]?.name !== \"finalResponse\"))\n throw new RunnerFailure(\"INVALID_FINAL\", { stage: \"final.validate\", reasonCode: \"FINAL_PRODUCT_SELECTION_MISSING\", modelStep });\n } catch (error) {\n logModelInvalid(\n execution.logger, modelStep,\n error instanceof RunnerFailure ? error.diagnostic.reasonCode : \"UNEXPECTED_EXCEPTION\",\n observedStep?.providerSummary,\n );\n throw error;\n }\n logModelCompleted(execution.logger, {\n modelStep,\n requestedToolCount: step.calls.filter((call) => call.name !== \"finalResponse\").length,\n finalResponseRequested: step.calls.some((call) => call.name === \"finalResponse\"),\n outputTokens: step.outputTokens,\n durationMs: elapsedDuration(execution.input, startedAt),\n providerSummary: step.providerSummary,\n });\n return { modelSteps: modelStep, pendingStep: step };\n };\n}","import { RunnerFailure } from \"../../failure.js\";\nimport { resolveAvailableTools } from \"../../tool-policy.js\";\nimport type { CommerceTurnGraphExecution } from \"../graph.js\";\nimport type { CommerceTurnGraphStateValue } from \"../state.js\";\n\nexport function resolveAvailableToolsNode(execution: CommerceTurnGraphExecution) {\n return async (state: CommerceTurnGraphStateValue) => {\n execution.runtime.checkCancellationAndDeadline();\n if (state.modelSteps >= execution.prepared.budgets.modelSteps)\n throw new RunnerFailure(\"BUDGET_EXHAUSTED\", { stage: \"tools.resolve\", reasonCode: \"MODEL_STEP_BUDGET_EXHAUSTED\" });\n // A format correction consumes a model step, never another provider request.\n const availableTools = state.selectionRepairUsed ? [] : await resolveAvailableTools(execution.prepared, execution.runtime);\n return { availableTools };\n };\n}","import type { CommerceFinalResponse } from \"../response.js\";\nimport type { CommerceEvidence } from \"../schemas.js\";\nimport { RunnerFailure } from \"./failure.js\";\nimport { schemaIssueMetadata } from \"./diagnostics.js\";\nimport type { PreparedCommerceTurn } from \"./preflight.js\";\n\nexport function validateFinalResponse(input: {\n raw: unknown;\n prepared: PreparedCommerceTurn;\n evidenceById: Readonly<Record<string, CommerceEvidence>>;\n requiredReferral: CommerceFinalResponse[\"referralReason\"];\n languageSource: string | null;\n remoteCalls: number;\n now: () => number;\n checkCancellationAndDeadline(): void;\n}): CommerceFinalResponse {\n const parsed = input.prepared.finalSchema.safeParse(input.raw);\n if (!parsed.success) throw new RunnerFailure(\"INVALID_FINAL\", {\n stage: \"final.validate\", reasonCode: \"FINAL_SCHEMA_INVALID\", ...schemaIssueMetadata(parsed.error),\n }, parsed.error);\n const final = parsed.data;\n if (input.languageSource === \"customer-explicit\" && final.detectedLanguageTag !== null)\n throw new RunnerFailure(\"INVALID_FINAL\", { stage: \"final.validate\", reasonCode: \"FINAL_LANGUAGE_MISMATCH\" });\n if (input.requiredReferral && final.answerKind !== \"REFER_TO_STORE\")\n throw new RunnerFailure(\"INVALID_FINAL\", { stage: \"final.validate\", reasonCode: \"FINAL_REFERRAL_REQUIRED\" });\n if (input.remoteCalls + final.evidenceIds.length > input.prepared.budgets.remoteCalls)\n throw new RunnerFailure(\"BUDGET_EXHAUSTED\", {\n stage: \"final.validate\", reasonCode: \"EVIDENCE_RESERVATION_EXCEEDED\",\n });\n for (const evidenceId of final.evidenceIds) {\n const evidence = input.evidenceById[evidenceId];\n if (!evidence || evidence.outcome !== \"QUALIFIES_FOR_KNOWN_RULES\")\n throw new RunnerFailure(\"INVALID_FINAL\", { stage: \"final.validate\", reasonCode: \"FINAL_EVIDENCE_INVALID\" });\n if (Date.parse(evidence.expiresAt) <= input.now())\n throw new RunnerFailure(\"INVALID_FINAL\", { stage: \"final.validate\", reasonCode: \"FINAL_EVIDENCE_EXPIRED\" });\n }\n input.checkCancellationAndDeadline();\n return final;\n}\n","import {\n resolveModaConfigurationLocale,\n type ModaSupportedLanguageTag,\n} from \"../../internationalization.js\";\n\n/** Host-owned referral copy: never turn unverified model text into a factual claim. */\nconst SAFE_REFERRAL_TEXT: Readonly<Record<ModaSupportedLanguageTag, string>> = {\n \"zh-Hans\": \"我目前无法在这里核实或处理此请求。请直接联系商家寻求帮助。\",\n \"zh-Hant\": \"我目前無法在這裡核實或處理此請求。請直接聯絡商家尋求協助。\",\n cs: \"Tento požadavek nyní nemohu ověřit ani vyřídit. Obraťte se prosím přímo na obchod.\",\n da: \"Jeg kan ikke bekræfte eller behandle denne anmodning her lige nu. Kontakt venligst butikken direkte.\",\n nl: \"Ik kan dit verzoek hier momenteel niet verifiëren of afhandelen. Neem rechtstreeks contact op met de winkel.\",\n en: \"I can't verify or complete that request here right now. Please contact the store directly for help.\",\n fi: \"En voi tällä hetkellä vahvistaa tai käsitellä tätä pyyntöä täällä. Ota yhteyttä suoraan kauppaan.\",\n fr: \"Je ne peux pas vérifier ni traiter cette demande ici pour le moment. Veuillez contacter directement la boutique.\",\n de: \"Ich kann diese Anfrage hier derzeit nicht prüfen oder bearbeiten. Bitte wenden Sie sich direkt an den Shop.\",\n it: \"Al momento non posso verificare o gestire questa richiesta qui. Contatta direttamente il negozio.\",\n ja: \"現在、こちらではこのご依頼を確認または対応できません。店舗に直接お問い合わせください。\",\n ko: \"현재 여기서는 이 요청을 확인하거나 처리할 수 없습니다. 매장에 직접 문의해 주세요.\",\n nb: \"Jeg kan ikke bekrefte eller behandle denne forespørselen her nå. Kontakt butikken direkte.\",\n pl: \"Nie mogę teraz zweryfikować ani zrealizować tej prośby tutaj. Skontaktuj się bezpośrednio ze sklepem.\",\n \"pt-BR\": \"Não consigo verificar nem atender a esta solicitação por aqui no momento. Entre em contato diretamente com a loja.\",\n \"pt-PT\": \"Neste momento, não consigo verificar nem tratar este pedido aqui. Contacte diretamente a loja.\",\n es: \"No puedo verificar ni atender esta solicitud aquí en este momento. Ponte en contacto directamente con la tienda.\",\n sv: \"Jag kan inte verifiera eller hantera den här begäran här just nu. Kontakta butiken direkt.\",\n th: \"ขณะนี้ฉันไม่สามารถตรวจสอบหรือดำเนินการตามคำขอนี้ได้ กรุณาติดต่อร้านค้าโดยตรง\",\n tr: \"Şu anda bu talebi burada doğrulayamıyor veya işleme alamıyorum. Lütfen doğrudan mağazayla iletişime geçin.\",\n};\n\nexport function safeReferralText(languageTag: string | null): string {\n return SAFE_REFERRAL_TEXT[resolveModaConfigurationLocale(languageTag)];\n}\n","import { RunnerFailure } from \"../../failure.js\";\nimport { validateFinalResponse } from \"../../final-response.js\";\nimport { logModelInvalid } from \"../../observability.js\";\nimport { safeReferralText } from \"../../safe-referral-text.js\";\nimport type { CommerceTurnGraphExecution } from \"../graph.js\";\nimport type { CommerceTurnGraphStateValue } from \"../state.js\";\n\nexport function validateFinalResponseNode(execution: CommerceTurnGraphExecution) {\n return async (state: CommerceTurnGraphStateValue) => {\n if (!state.pendingStep)\n throw new RunnerFailure(\"INVALID_FINAL\", { stage: \"final.validate\", reasonCode: \"MODEL_RESULT_MISSING\" });\n let validationPhase: \"schema\" | \"selection\" | \"observations\" = \"schema\";\n try {\n // Natural text may finish a turn, but cannot override mandatory referral\n // after a failed/denied tool. Use trusted, localized host copy instead of\n // repeating potentially unsupported claims from the model.\n // The same pinned final schema validates both resulting envelopes.\n const raw = state.pendingStep.calls.length === 0\n ? {\n answerKind: state.requiredReferral ? \"REFER_TO_STORE\" : \"ANSWER\",\n replyText: state.requiredReferral\n ? safeReferralText(execution.input.language.tag)\n : state.pendingStep.text?.trim() ?? \"\",\n referralReason: state.requiredReferral,\n detectedLanguageTag: null,\n detectedLanguageConfidence: null,\n evidenceIds: [],\n details: {},\n }\n : state.pendingStep.calls.length === 1\n ? state.pendingStep.calls[0].arguments\n : undefined;\n const final = validateFinalResponse({\n raw,\n prepared: execution.prepared,\n evidenceById: state.evidenceById,\n requiredReferral: state.requiredReferral,\n remoteCalls: state.remoteCalls,\n now: execution.input.dependencies.now,\n languageSource: execution.input.language.source,\n checkCancellationAndDeadline: execution.runtime.checkCancellationAndDeadline,\n });\n validationPhase = \"selection\";\n const fields = execution.prepared.response.detailsSchema.properties ?? {};\n const supportsSelections = ['productRecommendations', 'productDetailSelections', 'productOptionSelections'].some(key => Object.hasOwn(fields, key));\n const selected = ['productRecommendations', 'productDetailSelections', 'productOptionSelections'].some(key => Array.isArray(final.details[key]) && final.details[key].length > 0);\n validationPhase = \"observations\";\n const observedProducts = state.runtimeMessages.some(message => {\n if (message.tool !== 'commerce_search_products' && message.tool !== 'commerce_get_product') return false;\n const result = message.result as { status?: string; data?: { products?: unknown[]; product?: unknown } };\n return result?.status === 'OK' && (Boolean(result.data?.product) || Boolean(result.data?.products?.length));\n });\n validationPhase = \"selection\";\n // One correction uses the existing model-step/deadline budget. Never guess\n // selections or replay provider calls on the model's behalf.\n if (!state.requiredReferral && final.answerKind === 'ANSWER' && supportsSelections && observedProducts && !selected && final.details.responseDisposition !== 'SHIPPING_INFORMATION_UNVERIFIED' && !final.details.shippingInformationSelection) {\n if (state.selectionRepairUsed) throw new RunnerFailure(\"INVALID_FINAL\", { stage: \"final.validate\", reasonCode: \"FINAL_PRODUCT_SELECTION_MISSING\", modelStep: state.modelSteps });\n logModelInvalid(execution.logger, state.modelSteps, 'MISSING_PRODUCT_SELECTION_REPAIR');\n return { selectionRepairUsed: true, pendingStep: null, finalResult: null };\n }\n return { finalResult: final };\n } catch (error) {\n logModelInvalid(execution.logger, state.modelSteps, error instanceof RunnerFailure ? error.diagnostic.reasonCode : \"UNEXPECTED_EXCEPTION\");\n if (error instanceof RunnerFailure) throw error;\n throw new RunnerFailure(\"INVALID_FINAL\", { stage: \"final.validate\", reasonCode: \"UNEXPECTED_EXCEPTION\", modelStep: state.modelSteps, validationPhase }, error);\n }\n };\n}","import { mergeConversationProductContext, type CommerceConversationProductContext } from \"../product-context.js\";\nimport { ToolDescriptorSchema } from \"../definitions.js\";\nimport { satisfies } from \"semver\";\nimport { ZodError } from \"zod\";\n\nimport { LanguageSourceSchema } from \"../../internationalization.js\";\nimport { canonicalJson, jsonBytes } from \"../canonical-json.js\";\nimport { LanguageSchema } from \"../primitives.js\";\nimport { verifyResponseContract, finalResponseSchema } from \"../response.js\";\nimport {\n CommerceConversationGrantSchema,\n CommerceManifestSchema,\n CommerceTurnIdentitySchema,\n} from \"../schemas.js\";\nimport { manifestMatchesGrant } from \"../selection.js\";\nimport { composeTrustedInstructions } from \"./instructions.js\";\nimport { RunnerFailure } from \"./failure.js\";\nimport { schemaIssueMetadata, type RunnerDiagnosticReason } from \"./diagnostics.js\";\nimport { runnerVersion } from \"./version.js\";\nimport type { RunCommerceTurnInput, RunnerTool } from \"./types.js\";\n\nexport type CommerceTurnBudgets = {\n modelSteps: number;\n remoteCalls: number;\n deadlineMs: number;\n outputTokens: number;\n};\n\nexport type PreparedCommerceTurn = {\n productContext: CommerceConversationProductContext | null;\n executionPurpose?: RunCommerceTurnInput[\"executionPurpose\"];\n turn: ReturnType<typeof CommerceTurnIdentitySchema.parse>;\n grant: ReturnType<typeof CommerceConversationGrantSchema.parse>;\n manifest: NonNullable<ReturnType<typeof CommerceManifestSchema.safeParse>[\"data\"]>;\n response: ReturnType<typeof verifyResponseContract>;\n finalSchema: ReturnType<typeof finalResponseSchema>;\n budgets: CommerceTurnBudgets;\n instructions: readonly string[];\n registered: ReadonlyMap<string, RunnerTool>;\n};\n\nfunction validatePreflight<T>(parse: () => T, code: \"INVALID_INPUT\" | \"INCOMPATIBLE_VERSION\", reasonCode: RunnerDiagnosticReason): T {\n try { return parse(); }\n catch (error) {\n throw new RunnerFailure(code, {\n stage: \"preflight.validate\", reasonCode,\n ...(error instanceof ZodError ? schemaIssueMetadata(error) : {}),\n }, error);\n }\n}\n\nexport function prepareCommerceTurn(input: RunCommerceTurnInput): PreparedCommerceTurn {\n if (input.signal.aborted) throw new RunnerFailure(\"CANCELLED\", {\n stage: \"runtime.cancellation\", reasonCode: \"CANCELLED_BY_CALLER\",\n });\n if (jsonBytes(input.manifest) > 262144 || jsonBytes(input.grant) > 131072)\n throw new RunnerFailure(\"INVALID_INPUT\", { stage: \"preflight.validate\", reasonCode: \"INPUT_TOO_LARGE\" });\n const turn = validatePreflight(() => CommerceTurnIdentitySchema.parse(input.turn), \"INVALID_INPUT\", \"TURN_INVALID\");\n const grant = validatePreflight(() => CommerceConversationGrantSchema.parse(input.grant), \"INVALID_INPUT\", \"GRANT_INVALID\");\n const parsedManifest = CommerceManifestSchema.safeParse(input.manifest);\n if (!parsedManifest.success) throw new RunnerFailure(\"INCOMPATIBLE_VERSION\", {\n stage: \"preflight.validate\", reasonCode: \"MANIFEST_INVALID\", ...schemaIssueMetadata(parsedManifest.error),\n }, parsedManifest.error);\n const manifest = parsedManifest.data;\n if (input.executionPurpose !== undefined && (input.executionPurpose !== \"INITIAL_RECOVERY_OUTREACH\" || manifest.purposeProfile?.purpose !== input.executionPurpose))\n throw new RunnerFailure(\"DENIED\", { stage: \"preflight.contract\", reasonCode: \"GRANT_MISMATCH\" });\n if (\n !manifestMatchesGrant(manifest, grant) ||\n turn.shopId !== grant.shopId ||\n turn.conversationId !== grant.conversationId ||\n turn.inboundVersion < grant.initialInboundVersion\n ) throw new RunnerFailure(\"DENIED\", { stage: \"preflight.contract\", reasonCode: \"GRANT_MISMATCH\" });\n if (!satisfies(runnerVersion, manifest.runnerCompatibility))\n throw new RunnerFailure(\"INCOMPATIBLE_VERSION\", {\n stage: \"preflight.contract\", reasonCode: \"RUNNER_VERSION_INCOMPATIBLE\",\n });\n\n let response: ReturnType<typeof verifyResponseContract>;\n try {\n response = verifyResponseContract(\n manifest.responseContract,\n manifest.responseContractHash,\n input.dependencies.digest,\n );\n } catch (error) {\n throw new RunnerFailure(\"INCOMPATIBLE_VERSION\", {\n stage: \"preflight.contract\", reasonCode: \"RESPONSE_CONTRACT_INVALID\",\n }, error);\n }\n const finalSchema = finalResponseSchema(response);\n if (input.language.tag !== null)\n validatePreflight(() => LanguageSchema.parse(input.language.tag), \"INVALID_INPUT\", \"LANGUAGE_INVALID\");\n if (input.language.source !== null)\n validatePreflight(() => LanguageSourceSchema.parse(input.language.source), \"INVALID_INPUT\", \"LANGUAGE_INVALID\");\n if ((input.language.tag === null) !== (input.language.source === null))\n throw new RunnerFailure(\"INVALID_INPUT\", { stage: \"preflight.validate\", reasonCode: \"LANGUAGE_INVALID\" });\n\n const budgets: CommerceTurnBudgets = {\n modelSteps: 12,\n remoteCalls: 10,\n deadlineMs: 90000,\n outputTokens: 800,\n ...input.budgets,\n };\n // Budget policy belongs to the caller. Shared validates only that supplied\n // limits can be represented safely, then enforces them during execution.\n for (const key of [\"modelSteps\", \"remoteCalls\", \"deadlineMs\", \"outputTokens\"] as const) {\n if (!Number.isSafeInteger(budgets[key]) || budgets[key] < 1)\n throw new RunnerFailure(\"INVALID_INPUT\", { stage: \"preflight.validate\", reasonCode: \"BUDGET_INVALID\" });\n }\n if (\n input.hostInstructions.some((text) => typeof text !== \"string\") ||\n input.history.length > 20 ||\n Array.from(canonicalJson(input.history)).length > 32000 ||\n jsonBytes(input.context) + jsonBytes(input.history) > 131072\n ) throw new RunnerFailure(\"INVALID_INPUT\", { stage: \"preflight.validate\", reasonCode: \"CONTEXT_INVALID\" });\n let productContext: CommerceConversationProductContext | null = null;\n try {\n if(input.productContext && !input.platform) throw new Error(\"platform required\");\n if(input.platform) productContext = mergeConversationProductContext(input.productContext ?? null, [], {shopId:turn.shopId,conversationId:turn.conversationId,platform:input.platform,now:input.dependencies.now()});\n } catch(error) { throw new RunnerFailure(\"INVALID_INPUT\", {stage:\"preflight.validate\",reasonCode:\"CONTEXT_INVALID\"},error); }\n const instructions = composeTrustedInstructions(\n input.hostInstructions,\n response.instructions,\n input.executionPurpose ? [manifest.purposeProfile!.behaviourPrompt] : manifest.featureBehaviours.map((feature) => feature.behaviourPrompt),\n );\n if (instructions.join(\"\").length > 64000)\n throw new RunnerFailure(\"INVALID_INPUT\", { stage: \"preflight.validate\", reasonCode: \"CONTEXT_INVALID\" });\n\n const registered = new Map<string, RunnerTool>();\n if (input.dependencies.tools.length > 32)\n throw new RunnerFailure(\"INVALID_INPUT\", {stage: \"preflight.validate\", reasonCode: \"TOOL_REGISTRATION_INVALID\"});\n for (const tool of input.dependencies.tools) {\n const parsedDescriptor = ToolDescriptorSchema.safeParse(tool.descriptor);\n if (!parsedDescriptor.success || !grant.grantedTools.some(granted => granted.toolName === tool.descriptor.name) ||\n registered.has(tool.descriptor.name))\n throw new RunnerFailure(\"INVALID_INPUT\", { stage: \"preflight.validate\", reasonCode: \"TOOL_REGISTRATION_INVALID\" });\n registered.set(tool.descriptor.name, tool);\n }\n if (manifest.builtInTools.some(tool => !registered.has(tool.name)))\n throw new RunnerFailure(\"INCOMPATIBLE_VERSION\", {stage: \"preflight.validate\", reasonCode: \"TOOL_REGISTRATION_INVALID\"});\n return { productContext, ...(input.executionPurpose ? { executionPurpose: input.executionPurpose } : {}), turn, grant, manifest, response, finalSchema, budgets, instructions, registered };\n}\n","import { CommerceModelInvocationFailure, RunnerFailure } from \"./failure.js\";\nimport type { RunnerDiagnostic } from \"./diagnostics.js\";\n\ntype BoundedOperationContext = Pick<RunnerDiagnostic, \"stage\" | \"reasonCode\" | \"modelStep\" | \"toolName\" | \"attempt\" | \"remoteCallNumber\">;\n\n// Node/browser timers overflow above this delay. Schedule in segments rather\n// than silently shortening a caller-provided deadline to a few milliseconds.\nconst MAX_TIMEOUT_MS = 2_147_483_647;\nfunction scheduleTimeout(callback: () => void, delayMs: number): () => void {\n let timer: ReturnType<typeof setTimeout> | undefined;\n let cancelled = false;\n const schedule = (remainingMs: number) => {\n const interval = Math.min(remainingMs, MAX_TIMEOUT_MS);\n timer = setTimeout(() => {\n if (cancelled) return;\n const next = remainingMs - interval;\n if (next > 0) schedule(next);\n else callback();\n }, interval);\n };\n schedule(delayMs);\n return () => {\n cancelled = true;\n clearTimeout(timer);\n };\n}\n\nexport type CommerceTurnRuntime = {\n signal: AbortSignal;\n checkCancellationAndDeadline(): void;\n bounded<T>(operation: (signal: AbortSignal) => Promise<T>, timeoutMs: number, context?: BoundedOperationContext): Promise<T>;\n dispose(): void;\n};\n\nexport function createCommerceTurnRuntime(input: {\n callerSignal: AbortSignal;\n now: () => number;\n deadlineMs: number;\n}): CommerceTurnRuntime {\n const controller = new AbortController();\n const startedAt = input.now();\n const abortFromCaller = () => controller.abort();\n input.callerSignal.addEventListener(\"abort\", abortFromCaller, { once: true });\n if (input.callerSignal.aborted) controller.abort();\n const cancelDeadlineTimer = scheduleTimeout(() => controller.abort(), input.deadlineMs);\n\n const abortFailure = () => input.callerSignal.aborted\n ? new RunnerFailure(\"CANCELLED\", { stage: \"runtime.cancellation\", reasonCode: \"CANCELLED_BY_CALLER\" })\n : new RunnerFailure(\"DEADLINE\", { stage: \"runtime.deadline\", reasonCode: \"TURN_DEADLINE_EXCEEDED\" });\n const checkCancellationAndDeadline = () => {\n if (input.callerSignal.aborted || controller.signal.aborted || input.now() - startedAt >= input.deadlineMs)\n throw abortFailure();\n };\n\n return {\n signal: controller.signal,\n checkCancellationAndDeadline,\n async bounded<T>(\n operation: (signal: AbortSignal) => Promise<T>,\n timeoutMs: number,\n context?: BoundedOperationContext,\n ) {\n checkCancellationAndDeadline();\n const local = new AbortController();\n let cancelOperationTimer: (() => void) | undefined;\n let rejectAbort: (() => void) | undefined;\n const aborted = new Promise<never>((_, reject) => {\n rejectAbort = () => {\n local.abort();\n reject(abortFailure());\n };\n controller.signal.addEventListener(\"abort\", rejectAbort, { once: true });\n const remainingMs = input.deadlineMs - (input.now() - startedAt);\n const operationTimeout = timeoutMs < remainingMs;\n cancelOperationTimer = scheduleTimeout(() => {\n local.abort();\n reject(input.callerSignal.aborted || controller.signal.aborted || !operationTimeout\n ? abortFailure()\n : new RunnerFailure(\"DEADLINE\", {\n stage: \"runtime.operation\", reasonCode: \"OPERATION_TIMEOUT\",\n ...operationMetadata(context),\n }));\n }, Math.max(0, Math.min(timeoutMs, remainingMs)));\n });\n try {\n const value = await Promise.race([\n Promise.resolve().then(() => operation(local.signal)).catch((error) => {\n if (error instanceof RunnerFailure) throw error;\n if (error instanceof CommerceModelInvocationFailure)\n throw new RunnerFailure(\"UNAVAILABLE\", { ...error.diagnostic, ...operationMetadata(context) }, error);\n throw new RunnerFailure(\"UNAVAILABLE\", {\n stage: context?.stage ?? \"runtime.operation\",\n reasonCode: context?.reasonCode ?? \"UPSTREAM_OPERATION_FAILED\",\n ...operationMetadata(context),\n }, error);\n }),\n aborted,\n ]);\n checkCancellationAndDeadline();\n return value;\n } finally {\n cancelOperationTimer?.();\n if (rejectAbort) controller.signal.removeEventListener(\"abort\", rejectAbort);\n local.abort();\n }\n },\n dispose() {\n cancelDeadlineTimer();\n input.callerSignal.removeEventListener(\"abort\", abortFromCaller);\n controller.abort();\n },\n };\n}\n\nfunction operationMetadata(context?: BoundedOperationContext) {\n return {\n ...(context?.modelStep === undefined ? {} : { modelStep: context.modelStep }),\n ...(context?.toolName === undefined ? {} : { toolName: context.toolName }),\n ...(context?.attempt === undefined ? {} : { attempt: context.attempt }),\n ...(context?.remoteCallNumber === undefined ? {} : { remoteCallNumber: context.remoteCallNumber }),\n };\n}\n","import { mergeConversationProductContext, type CommerceProductObservation } from \"../product-context.js\";\nimport { RunnerFailure, mapRunnerFailure } from \"./failure.js\";\nimport { createCommerceTurnGraph, commerceTurnGraphRecursionLimit } from \"./graph/graph.js\";\nimport { initialCommerceTurnGraphState } from \"./graph/state.js\";\nimport {\n createRootTurnLogger,\n createTurnLogger,\n elapsedDuration,\n safeLog,\n type CommerceTurnLogger,\n} from \"./observability.js\";\nimport { prepareCommerceTurn } from \"./preflight.js\";\nimport { createCommerceTurnRuntime, type CommerceTurnRuntime } from \"./runtime.js\";\nimport type { RunnerDiagnosticStage } from \"./diagnostics.js\";\nimport type { RunCommerceTurnInput, RunCommerceTurnResult, RunnerErrorCode } from \"./types.js\";\n\nexport {\n PLATFORM_INSTRUCTIONS,\n RUNTIME_DATA_AUTHORITY_INSTRUCTION,\n composeTrustedInstructions,\n} from \"./instructions.js\";\nexport { CommerceModelInvocationFailure } from \"./failure.js\";\nexport type { RunnerDiagnostic, RunnerDiagnosticReason, RunnerDiagnosticStage } from \"./diagnostics.js\";\nexport { runnerVersion } from \"./version.js\";\nexport type {\n CommerceModelInvoker,\n ModelCall,\n ModelRequest,\n ModelStep,\n RunCommerceTurnInput,\n RunCommerceTurnResult,\n RunnerErrorCode,\n RunnerTool,\n} from \"./types.js\";\n\nexport async function runCommerceTurn(input: RunCommerceTurnInput): Promise<RunCommerceTurnResult> {\n let stage: RunnerDiagnosticStage = \"preflight.validate\";\n let runtime: CommerceTurnRuntime | undefined;\n let logger: CommerceTurnLogger = createRootTurnLogger(input);\n let modelSteps = 0;\n let remoteCalls = 0;\n const stats = { modelSteps: 0, remoteCalls: 0 };\n let startedAt: number | undefined;\n try {\n const prepared = prepareCommerceTurn(input);\n runtime = createCommerceTurnRuntime({\n callerSignal: input.signal,\n now: input.dependencies.now,\n deadlineMs: prepared.budgets.deadlineMs,\n });\n logger = createTurnLogger(input, prepared);\n stage = \"graph.execute\";\n startedAt = input.dependencies.now();\n safeLog(logger, \"info\", \"commerce.turn.started\", {\n modelStepBudget: prepared.budgets.modelSteps,\n remoteCallBudget: prepared.budgets.remoteCalls,\n deadlineMs: prepared.budgets.deadlineMs,\n outputTokenBudget: prepared.budgets.outputTokens,\n });\n\n const graph = createCommerceTurnGraph({ input, prepared, runtime, logger, stats });\n const state = await graph.invoke(initialCommerceTurnGraphState(), {\n recursionLimit: commerceTurnGraphRecursionLimit(prepared.budgets.modelSteps),\n });\n modelSteps = state.modelSteps;\n remoteCalls = state.remoteCalls;\n if (!state.finalResult) throw new RunnerFailure(\"INVALID_FINAL\", { stage: \"graph.execute\", reasonCode: \"MODEL_RESULT_MISSING\" });\n safeLog(logger, \"info\", \"commerce.turn.completed\", {\n answerKind: state.finalResult.answerKind,\n modelSteps,\n remoteCalls,\n evidenceCount: state.finalResult.evidenceIds.length,\n durationMs: elapsedDuration(input, startedAt),\n });\n return {\n ok: true,\n ...(() => {\n if(!input.platform) return {};\n const observations: CommerceProductObservation[] = [];\n for(const message of state.runtimeMessages) {\n if(![\"commerce_search_products\",\"commerce_get_product\"].includes(message.tool)) continue;\n const result=message.result as {status?:string;data?:{products?:CommerceProductObservation[\"products\"];product?:CommerceProductObservation[\"products\"][number]}};\n if(result.status !== \"OK\" || !result.data) continue;\n observations.push({toolName:message.tool,products:result.data.products ?? (result.data.product?[result.data.product]:[]),observedAt:new Date(input.dependencies.now()).toISOString()});\n }\n const context=mergeConversationProductContext(prepared.productContext,observations,{shopId:prepared.turn.shopId,conversationId:prepared.turn.conversationId,platform:input.platform,now:input.dependencies.now()});\n return context.references.length?{productContextUpdate:context}:{};\n })(),\n result: state.finalResult,\n usage: { modelSteps, remoteCalls },\n };\n } catch (error) {\n modelSteps = stats.modelSteps;\n remoteCalls = stats.remoteCalls;\n const result = mapRunnerFailure(error, input.signal, stage);\n if (!result.ok) {\n safeLog(logger, failureLevel(result.error.code), \"commerce.turn.failed\", {\n errorCode: result.error.code,\n retryable: result.error.retryable,\n ...result.error.diagnostic,\n modelSteps,\n remoteCalls,\n durationMs: safeFailureDuration(input, startedAt),\n });\n }\n return result;\n } finally {\n runtime?.dispose();\n }\n}\n\nfunction failureLevel(code: RunnerErrorCode): \"warn\" | \"error\" {\n return [\"CANCELLED\", \"DENIED\", \"STALE_TURN\", \"BUDGET_EXHAUSTED\"].includes(code)\n ? \"warn\"\n : \"error\";\n}\nfunction safeFailureDuration(input: RunCommerceTurnInput, startedAt?: number): number {\n if (startedAt === undefined) return 0;\n try { return elapsedDuration(input, startedAt); }\n catch { return 0; }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -5,7 +5,7 @@ import { S as StructuredLogger } from './types-B32wDMLO.js';
|
|
|
5
5
|
/** Finite, non-customer-facing failure taxonomy for Commerce hosts and logs. */
|
|
6
6
|
declare const RUNNER_DIAGNOSTIC_STAGES: readonly ["preflight.validate", "preflight.contract", "runtime.cancellation", "runtime.deadline", "runtime.operation", "tools.resolve", "model.invoke", "model.validate", "model.route", "tool.authorize", "tool.validate", "tool.execute", "tool.result", "evidence.validate", "final.validate", "graph.execute"];
|
|
7
7
|
type RunnerDiagnosticStage = typeof RUNNER_DIAGNOSTIC_STAGES[number];
|
|
8
|
-
declare const RUNNER_DIAGNOSTIC_REASONS: readonly ["CANCELLED_BY_CALLER", "TURN_DEADLINE_EXCEEDED", "OPERATION_TIMEOUT", "UPSTREAM_OPERATION_FAILED", "UNEXPECTED_EXCEPTION", "INPUT_TOO_LARGE", "TURN_INVALID", "GRANT_INVALID", "MANIFEST_INVALID", "GRANT_MISMATCH", "RUNNER_VERSION_INCOMPATIBLE", "RESPONSE_CONTRACT_INVALID", "LANGUAGE_INVALID", "BUDGET_INVALID", "CONTEXT_INVALID", "TOOL_REGISTRATION_INVALID", "MODEL_STEP_BUDGET_EXHAUSTED", "MODEL_INVOCATION_FAILED", "MODEL_STEP_NOT_OBJECT", "MODEL_STEP_CALLS_MISSING", "MODEL_STEP_CALLS_NOT_ARRAY", "MODEL_OUTPUT_TOKENS_MISSING", "MODEL_OUTPUT_TOKENS_NOT_SAFE_INTEGER", "MODEL_OUTPUT_TOKENS_EXHAUSTED", "MODEL_OUTPUT_TOKENS_NEGATIVE", "MODEL_OUTPUT_TOKENS_OVER_BUDGET", "MODEL_TOOL_CALL_LIMIT_EXCEEDED", "MODEL_TOOL_CALL_NULL", "MODEL_TOOL_CALL_NOT_OBJECT", "MODEL_TOOL_CALL_NAME_MISSING", "MODEL_TOOL_CALL_NAME_NOT_STRING", "MODEL_TOOL_CALL_NAME_EMPTY", "MODEL_TOOL_CALL_NAME_TOO_LONG", "MODEL_TOOL_CALL_ARGUMENTS_MISSING", "MODEL_TOOL_CALL_ARGUMENTS_NULL", "MODEL_TOOL_CALL_ARGUMENTS_NOT_OBJECT", "MODEL_TEXT_NOT_STRING", "MODEL_TEXT_TOO_LONG", "MODEL_STEP_TOO_LARGE", "MODEL_STEP_NOT_SERIALIZABLE", "MODEL_STEP_VALIDATION_FAILED", "MODEL_CALL_ROUTE_INVALID", "MODEL_RESULT_MISSING", "REQUEST_INVALID", "MODEL_REQUEST_HISTORY_INVALID", "MODEL_REQUEST_TOOL_RESULT_INVALID", "MODEL_CONFIGURATION_INVALID", "MODEL_CREDENTIAL_INVALID", "MODEL_ADAPTER_INITIALIZATION_FAILED", "MODEL_REQUEST_CANCELLED", "TOOL_BIND_FAILED", "PROVIDER_AUTH_FAILED", "PROVIDER_RATE_LIMITED", "PROVIDER_HTTP_ERROR", "PROVIDER_REQUEST_FAILED", "PROVIDER_RESPONSE_INVALID", "PROVIDER_RESPONSE_USAGE_INVALID", "PROVIDER_RESPONSE_TOOL_CALL_INVALID", "TOOL_DESCRIPTOR_MISMATCH", "TOOL_AUTHORIZATION_FAILED", "TOOL_INPUT_INVALID", "TOOL_CALL_BUDGET_EXHAUSTED", "TOOL_EXECUTION_FAILED", "TOOL_RESULT_TOO_LARGE", "TOOL_RESULT_INVALID", "TOOL_RESULT_MISSING", "TOOL_STALE_TURN", "EVIDENCE_INVALID", "FINAL_SCHEMA_INVALID", "FINAL_LANGUAGE_MISMATCH", "FINAL_REFERRAL_REQUIRED", "FINAL_EVIDENCE_INVALID", "FINAL_EVIDENCE_EXPIRED", "EVIDENCE_RESERVATION_EXCEEDED"];
|
|
8
|
+
declare const RUNNER_DIAGNOSTIC_REASONS: readonly ["CANCELLED_BY_CALLER", "TURN_DEADLINE_EXCEEDED", "OPERATION_TIMEOUT", "UPSTREAM_OPERATION_FAILED", "UNEXPECTED_EXCEPTION", "INPUT_TOO_LARGE", "TURN_INVALID", "GRANT_INVALID", "MANIFEST_INVALID", "GRANT_MISMATCH", "RUNNER_VERSION_INCOMPATIBLE", "RESPONSE_CONTRACT_INVALID", "LANGUAGE_INVALID", "BUDGET_INVALID", "CONTEXT_INVALID", "TOOL_REGISTRATION_INVALID", "MODEL_STEP_BUDGET_EXHAUSTED", "MODEL_INVOCATION_FAILED", "MODEL_STEP_NOT_OBJECT", "MODEL_STEP_CALLS_MISSING", "MODEL_STEP_CALLS_NOT_ARRAY", "MODEL_OUTPUT_TOKENS_MISSING", "MODEL_OUTPUT_TOKENS_NOT_SAFE_INTEGER", "MODEL_OUTPUT_TOKENS_EXHAUSTED", "MODEL_OUTPUT_TOKENS_NEGATIVE", "MODEL_OUTPUT_TOKENS_OVER_BUDGET", "MODEL_TOOL_CALL_LIMIT_EXCEEDED", "MODEL_TOOL_CALL_NULL", "MODEL_TOOL_CALL_NOT_OBJECT", "MODEL_TOOL_CALL_NAME_MISSING", "MODEL_TOOL_CALL_NAME_NOT_STRING", "MODEL_TOOL_CALL_NAME_EMPTY", "MODEL_TOOL_CALL_NAME_TOO_LONG", "MODEL_TOOL_CALL_ARGUMENTS_MISSING", "MODEL_TOOL_CALL_ARGUMENTS_NULL", "MODEL_TOOL_CALL_ARGUMENTS_NOT_OBJECT", "MODEL_TEXT_NOT_STRING", "MODEL_TEXT_TOO_LONG", "MODEL_STEP_TOO_LARGE", "MODEL_STEP_NOT_SERIALIZABLE", "MODEL_STEP_VALIDATION_FAILED", "MODEL_CALL_ROUTE_INVALID", "MODEL_RESULT_MISSING", "REQUEST_INVALID", "MODEL_REQUEST_HISTORY_INVALID", "MODEL_REQUEST_TOOL_RESULT_INVALID", "MODEL_CONFIGURATION_INVALID", "MODEL_CREDENTIAL_INVALID", "MODEL_ADAPTER_INITIALIZATION_FAILED", "MODEL_REQUEST_CANCELLED", "TOOL_BIND_FAILED", "PROVIDER_AUTH_FAILED", "PROVIDER_RATE_LIMITED", "PROVIDER_HTTP_ERROR", "PROVIDER_REQUEST_FAILED", "PROVIDER_RESPONSE_INVALID", "PROVIDER_RESPONSE_USAGE_INVALID", "PROVIDER_RESPONSE_TOOL_CALL_INVALID", "TOOL_DESCRIPTOR_MISMATCH", "TOOL_AUTHORIZATION_FAILED", "TOOL_INPUT_INVALID", "TOOL_CALL_BUDGET_EXHAUSTED", "TOOL_EXECUTION_FAILED", "TOOL_RESULT_TOO_LARGE", "TOOL_RESULT_INVALID", "TOOL_RESULT_MISSING", "TOOL_STALE_TURN", "EVIDENCE_INVALID", "FINAL_PRODUCT_SELECTION_MISSING", "FINAL_SCHEMA_INVALID", "FINAL_LANGUAGE_MISMATCH", "FINAL_REFERRAL_REQUIRED", "FINAL_EVIDENCE_INVALID", "FINAL_EVIDENCE_EXPIRED", "EVIDENCE_RESERVATION_EXCEEDED"];
|
|
9
9
|
type RunnerDiagnosticReason = typeof RUNNER_DIAGNOSTIC_REASONS[number];
|
|
10
10
|
/** Recognised transport failures, never arbitrary OS/provider error codes. */
|
|
11
11
|
declare const RUNNER_TRANSPORT_CODES: readonly ["ENOTFOUND", "EAI_AGAIN", "ECONNREFUSED", "ECONNRESET", "ETIMEDOUT", "ENETUNREACH", "EHOSTUNREACH", "EPIPE", "UND_ERR_CONNECT_TIMEOUT", "UND_ERR_HEADERS_TIMEOUT", "UND_ERR_SOCKET", "CERT_HAS_EXPIRED", "UNABLE_TO_VERIFY_LEAF_SIGNATURE", "DEPTH_ZERO_SELF_SIGNED_CERT", "ERR_TLS_CERT_ALTNAME_INVALID"];
|
|
@@ -21,6 +21,8 @@ type RunnerDiagnostic = Readonly<{
|
|
|
21
21
|
/** Transport/exception details are from a fixed allowlist, not error.message. */
|
|
22
22
|
transportCode?: RunnerTransportCode;
|
|
23
23
|
exceptionName?: string;
|
|
24
|
+
validationPhase?: "schema" | "selection" | "observations";
|
|
25
|
+
exceptionFrames?: readonly string[];
|
|
24
26
|
statusCode?: number;
|
|
25
27
|
providerCode?: number;
|
|
26
28
|
providerStage?: "request" | "binding" | "provider" | "response";
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commerce/runner/diagnostic-messages.ts","../src/commerce/runner/diagnostics.ts","../src/commerce/runner/failure.ts"],"sourcesContent":["import type { RunnerDiagnosticReason, RunnerTransportCode } from \"./diagnostics.js\";\n\ntype Explanation = Readonly<{ message: string; action: string }>;\n\n/** Fixed operator-facing explanations. No provider-supplied or customer-supplied text is interpolated. */\nconst explanations = {\n MODEL_OUTPUT_TOKENS_EXHAUSTED: [\"The provider exhausted output tokens without visible text or tool calls.\", \"Inspect token usage and provider response; do not fabricate a reply or retry silently.\"],\n CANCELLED_BY_CALLER: [\"The calling service cancelled this conversation turn.\", \"Inspect caller cancellation and superseded-message handling.\"],\n TURN_DEADLINE_EXCEEDED: [\"The conversation turn exceeded its overall deadline.\", \"Inspect elapsed time across the model and tool calls.\"],\n OPERATION_TIMEOUT: [\"One model or tool operation exceeded its per-operation time limit.\", \"Inspect the operation stage, provider latency and timeout configuration.\"],\n UPSTREAM_OPERATION_FAILED: [\"A model or tool operation threw an exception before returning a usable result.\", \"Inspect the stage, exceptionName and transportCode; check upstream service health.\"],\n UNEXPECTED_EXCEPTION: [\"The runner encountered an unexpected exception.\", \"Inspect the failing stage and exceptionName; investigate the owning service.\"],\n INPUT_TOO_LARGE: [\"The manifest or conversation grant exceeded the allowed payload size.\", \"Reduce the manifest or grant size and check the producer's limits.\"],\n TURN_INVALID: [\"The supplied conversation-turn identity failed schema validation.\", \"Inspect the reported schema issue paths and the turn producer.\"],\n GRANT_INVALID: [\"The supplied conversation grant failed schema validation.\", \"Inspect the reported schema issue paths and grant issuer.\"],\n MANIFEST_INVALID: [\"The supplied capability manifest failed schema validation.\", \"Verify manifest version and schema fields against the published contract.\"],\n GRANT_MISMATCH: [\"The turn identity, grant and manifest do not belong to the same authorised conversation.\", \"Check shop, conversation, grant and inbound-version correlation; do not bypass authorization.\"],\n RUNNER_VERSION_INCOMPATIBLE: [\"The release manifest requires a different runner version.\", \"Align the deployed Shared runner version with the release's compatibility range.\"],\n RESPONSE_CONTRACT_INVALID: [\"The trusted final-response contract failed integrity or compatibility verification.\", \"Recheck the published release and contract digest.\"],\n LANGUAGE_INVALID: [\"The supplied conversation language or language-source fields are invalid.\", \"Check the host language configuration and supported locale values.\"],\n BUDGET_INVALID: [\"A configured model, remote-call, deadline or token budget is invalid.\", \"Supply positive safe integers for each budget; the caller owns budget policy.\"],\n CONTEXT_INVALID: [\"The trusted instructions, history or context failed size or shape constraints.\", \"Inspect context construction and trim oversized history or instructions.\"],\n TOOL_REGISTRATION_INVALID: [\"The host registered duplicate or otherwise invalid tools.\", \"Check the tool registry supplied to the runner.\"],\n MODEL_STEP_BUDGET_EXHAUSTED: [\"The model used every allowed reasoning step without reaching a valid final answer.\", \"Inspect model routing and tool-call loops; reassess the configured step budget.\"],\n MODEL_INVOCATION_FAILED: [\"The model invocation failed without a provider-specific diagnostic.\", \"Inspect the model host and preserve a typed provider failure at its boundary.\"],\n MODEL_STEP_NOT_OBJECT: [\"The model step was not a non-null object.\", \"Check the model adapter's returned step type.\"],\n MODEL_STEP_CALLS_MISSING: [\"The model step did not contain a calls field.\", \"Ensure the model adapter returns a calls array, even when empty.\"],\n MODEL_STEP_CALLS_NOT_ARRAY: [\"The model step's calls field was not an array.\", \"Ensure the model adapter maps provider tool calls to an array.\"],\n MODEL_OUTPUT_TOKENS_MISSING: [\"The model step did not contain an outputTokens field.\", \"Ensure the adapter includes the provider's output-token usage count.\"],\n MODEL_OUTPUT_TOKENS_NOT_SAFE_INTEGER: [\"The model step's outputTokens was not a safe integer.\", \"Ensure the adapter returns a finite, whole-number output token count.\"],\n MODEL_OUTPUT_TOKENS_NEGATIVE: [\"The model step's outputTokens was negative.\", \"Correct the model adapter's token-usage mapping; token counts cannot be negative.\"],\n MODEL_OUTPUT_TOKENS_OVER_BUDGET: [\"The model step's outputTokens exceeded the configured output-token budget.\", \"Inspect the model's maxOutputTokens enforcement and returned usage count.\"],\n MODEL_TOOL_CALL_LIMIT_EXCEEDED: [\"The model step contained more than 32 tool calls.\", \"Limit provider tool-call output to the runner's maximum of 32 calls.\"],\n MODEL_TOOL_CALL_NULL: [\"The model returned a null tool-call entry.\", \"Check the model adapter's tool-call conversion; each entry must have a name and arguments object.\"],\n MODEL_TOOL_CALL_NOT_OBJECT: [\"The model returned a tool-call entry that was not an object.\", \"Check the model adapter's tool-call conversion; arrays and primitive entries are invalid.\"],\n MODEL_TOOL_CALL_NAME_MISSING: [\"The model returned a tool call without a name field.\", \"Include a non-empty name string in every model tool call.\"],\n MODEL_TOOL_CALL_NAME_NOT_STRING: [\"The model returned a tool call whose name was not a string.\", \"Ensure the tool-call name is a string in the model adapter.\"],\n MODEL_TOOL_CALL_NAME_EMPTY: [\"The model returned a tool call with an empty name.\", \"Check provider tool naming and model adapter normalization.\"],\n MODEL_TOOL_CALL_NAME_TOO_LONG: [\"The model returned a tool-call name longer than 128 characters.\", \"Limit each tool-call name to 128 characters in the model adapter.\"],\n MODEL_TOOL_CALL_ARGUMENTS_MISSING: [\"The model returned a tool call without an arguments field.\", \"Include an arguments object for every model tool call.\"],\n MODEL_TOOL_CALL_ARGUMENTS_NULL: [\"The model returned a tool call with null arguments.\", \"Return an object, including an empty object when appropriate, instead of null arguments.\"],\n MODEL_TOOL_CALL_ARGUMENTS_NOT_OBJECT: [\"The model returned tool-call arguments that were not an object.\", \"Convert provider tool-call arguments to a non-array object in the model adapter.\"],\n MODEL_TEXT_NOT_STRING: [\"The model's candidate reply was not text.\", \"Check the model adapter's conversion of the provider response content.\"],\n MODEL_TEXT_TOO_LONG: [\"The model's candidate reply exceeded 4096 characters.\", \"Limit the natural-language reply to the response contract's maximum length.\"],\n MODEL_STEP_TOO_LARGE: [\"The model step exceeded the 262144-byte serialized payload limit.\", \"Reduce tool-call argument payload size before returning the model step.\"],\n MODEL_STEP_NOT_SERIALIZABLE: [\"The model step could not be encoded as canonical JSON.\", \"Inspect model-step data for cycles, invalid Unicode or unsupported JSON values.\"],\n MODEL_STEP_VALIDATION_FAILED: [\"The runner threw an exception while reading or checking the model step.\", \"Inspect the safe exception metadata and model-step adapter implementation.\"],\n MODEL_CALL_ROUTE_INVALID: [\"The model produced neither a usable reply nor an allowed tool-call route, or mixed finalResponse with other calls.\", \"Inspect provider finish conditions, reply content and tool-call routing.\"],\n MODEL_RESULT_MISSING: [\"The runner graph finished without producing a final response.\", \"Inspect graph termination and the preceding model/tool steps.\"],\n REQUEST_INVALID: [\"The model adapter received an invalid invocation request.\", \"Inspect the model request construction and trusted payload validation.\"],\n MODEL_REQUEST_HISTORY_INVALID: [\"A history entry sent to the model was malformed or exceeded its text limit.\", \"Inspect the history formatter and permitted role/text shape.\"],\n MODEL_REQUEST_TOOL_RESULT_INVALID: [\"A tool-result message sent to the model failed the expected contract.\", \"Inspect the tool-result formatter and CommerceToolResult schema.\"],\n MODEL_CONFIGURATION_INVALID: [\"The configured model provider, model ID, options or schema version is invalid.\", \"Correct model selection and published configuration before invoking the model.\"],\n MODEL_CREDENTIAL_INVALID: [\"The model adapter received an empty or invalid credential value.\", \"Check secret resolution, credential availability and injection into the model host.\"],\n MODEL_ADAPTER_INITIALIZATION_FAILED: [\"The model client could not be constructed from its validated configuration.\", \"Inspect model SDK initialization and dependency compatibility.\"],\n MODEL_REQUEST_CANCELLED: [\"The model request was cancelled before invocation.\", \"Inspect caller cancellation; do not interpret this as provider downtime.\"],\n TOOL_BIND_FAILED: [\"The model client rejected the supplied tool definitions during binding.\", \"Check provider tool-calling support and function schemas.\"],\n PROVIDER_AUTH_FAILED: [\"The model provider rejected authentication or access to the requested resource.\", \"Check the provider credential, permissions and selected model.\"],\n PROVIDER_RATE_LIMITED: [\"The model provider returned HTTP 429: requests are being rate-limited or the quota is exhausted.\", \"Check provider usage, billing/quota and any Retry-After guidance; use bounded backoff.\"],\n PROVIDER_HTTP_ERROR: [\"The model provider returned an unsuccessful HTTP response.\", \"Inspect statusCode and check provider availability, model access and request compatibility.\"],\n PROVIDER_REQUEST_FAILED: [\"The model provider request failed before a usable HTTP response was received.\", \"Inspect transportCode and exceptionName; check DNS, connectivity, TLS and provider availability.\"],\n PROVIDER_RESPONSE_INVALID: [\"The model provider returned a response that the adapter cannot interpret.\", \"Check the provider SDK response shape and model adapter compatibility.\"],\n PROVIDER_RESPONSE_USAGE_INVALID: [\"The model response is missing a valid output-token usage count.\", \"Inspect provider usage_metadata.output_tokens and SDK response mapping.\"],\n PROVIDER_RESPONSE_TOOL_CALL_INVALID: [\"The model response contains a malformed tool call name or arguments object.\", \"Inspect provider tool-call formatting and SDK response mapping.\"],\n TOOL_DESCRIPTOR_MISMATCH: [\"The requested tool does not match an authorised published tool descriptor.\", \"Check published tool revisions and descriptor hashes.\"],\n TOOL_AUTHORIZATION_FAILED: [\"The host failed while checking whether a requested tool remains authorised.\", \"Inspect authorization-service availability and the requested tool.\"],\n TOOL_INPUT_INVALID: [\"The model supplied tool arguments that do not satisfy the tool input schema.\", \"Inspect issuePaths and the model's tool schema; do not invoke the tool.\"],\n TOOL_CALL_BUDGET_EXHAUSTED: [\"The turn exhausted its remote-call allowance before the next tool request.\", \"Inspect repeated tool calls, retry attempts and budget settings.\"],\n TOOL_EXECUTION_FAILED: [\"An authorised tool threw an exception during execution.\", \"Inspect the toolName, attempt, transportCode and owning tool service.\"],\n TOOL_RESULT_TOO_LARGE: [\"A tool returned more data than the runner permits.\", \"Reduce or paginate tool output before returning it to the runner.\"],\n TOOL_RESULT_INVALID: [\"A tool returned a result that failed serialization or schema validation.\", \"Inspect issuePaths and the tool adapter's CommerceToolResult output.\"],\n TOOL_RESULT_MISSING: [\"The tool execution loop ended without receiving a result.\", \"Inspect tool execution lifecycle and retry completion.\"],\n TOOL_STALE_TURN: [\"The tool reported that the conversation turn is no longer current.\", \"Inspect conversation versioning and abandon this obsolete turn.\"],\n EVIDENCE_INVALID: [\"Tool evidence failed its integrity, grant or freshness checks.\", \"Inspect tool evidence generation and turn/grant correlation.\"],\n FINAL_SCHEMA_INVALID: [\"The model's finalResponse failed runtime schema validation.\", \"Inspect issueCodes and issuePaths; correct response formatting or tool instructions.\"],\n FINAL_LANGUAGE_MISMATCH: [\"The final answer included language detection despite an explicit customer language.\", \"Check model instructions governing language metadata.\"],\n FINAL_REFERRAL_REQUIRED: [\"The model did not produce the mandatory store referral after a denied or failed tool.\", \"Check final-response referral rules and the recorded tool outcome.\"],\n FINAL_EVIDENCE_INVALID: [\"The final answer cited absent, unqualified or incorrectly scoped evidence.\", \"Inspect evidence identity, qualification and answer construction.\"],\n FINAL_EVIDENCE_EXPIRED: [\"The final answer cited evidence that expired during the turn.\", \"Refresh evidence and reconsider the turn's remaining deadline.\"],\n EVIDENCE_RESERVATION_EXCEEDED: [\"The final answer cited more evidence than the remaining remote-call reservation allows.\", \"Inspect evidence references and the remote-call budget reservation contract.\"],\n} as const satisfies Record<RunnerDiagnosticReason, readonly [string, string]>;\n\nconst transports = {\n ENOTFOUND: [\"The provider hostname could not be resolved by DNS.\", \"Check the configured hostname and DNS resolver.\"],\n EAI_AGAIN: [\"The provider DNS lookup temporarily failed.\", \"Check DNS availability and retry after a short delay.\"],\n ECONNREFUSED: [\"The provider connection was actively refused.\", \"Check the host, port and service listener.\"],\n ECONNRESET: [\"The provider connection was reset before the request finished.\", \"Check upstream restarts, proxies and connection stability.\"],\n ETIMEDOUT: [\"The network connection to the provider timed out.\", \"Check network reachability and upstream latency.\"],\n ENETUNREACH: [\"The network route to the provider is unreachable.\", \"Check egress routes, firewall and network configuration.\"],\n EHOSTUNREACH: [\"The provider host is unreachable.\", \"Check provider host, routing and firewall rules.\"],\n EPIPE: [\"The network connection closed while data was being written.\", \"Check upstream connection stability and proxy timeouts.\"],\n UND_ERR_CONNECT_TIMEOUT: [\"The HTTP client timed out establishing a provider connection.\", \"Check egress connectivity and provider latency.\"],\n UND_ERR_HEADERS_TIMEOUT: [\"The HTTP client timed out waiting for provider response headers.\", \"Check provider availability and response latency.\"],\n UND_ERR_SOCKET: [\"The HTTP client reported a socket failure.\", \"Check network and upstream connection stability.\"],\n CERT_HAS_EXPIRED: [\"The remote TLS certificate has expired.\", \"Check the certificate chain and provider endpoint.\"],\n UNABLE_TO_VERIFY_LEAF_SIGNATURE: [\"TLS certificate chain verification failed.\", \"Check trusted roots and certificate chain; do not disable TLS validation.\"],\n DEPTH_ZERO_SELF_SIGNED_CERT: [\"TLS rejected an untrusted self-signed certificate.\", \"Check trusted roots and proxy certificates; do not disable TLS validation.\"],\n ERR_TLS_CERT_ALTNAME_INVALID: [\"The provider TLS certificate does not match its hostname.\", \"Check endpoint hostname and certificate SANs.\"],\n} as const satisfies Record<RunnerTransportCode, readonly [string, string]>;\n\n/** HTTP descriptions are based on status alone and make no claims about hidden provider response bodies. */\nconst httpDetails: Readonly<Record<number, Explanation>> = {\n 400: { message: \"The provider rejected the request as invalid (HTTP 400).\", action: \"Check request parameters and provider model capabilities.\" },\n 402: { message: \"The provider returned HTTP 402 (payment or credits required).\", action: \"Check provider billing, available credits and account limits.\" },\n 404: { message: \"The provider returned HTTP 404 (endpoint or model not found).\", action: \"Check provider model ID, permissions and API route.\" },\n 413: { message: \"The provider rejected an oversized request (HTTP 413).\", action: \"Reduce request size and review model context limits.\" },\n 422: { message: \"The provider could not process the request parameters (HTTP 422).\", action: \"Check model input and tool schema compatibility.\" },\n 500: { message: \"The provider returned an internal server error (HTTP 500).\", action: \"Check provider status and use bounded retries.\" },\n 502: { message: \"The provider gateway reported an upstream error (HTTP 502).\", action: \"Check provider status, gateway health and bounded retries.\" },\n 503: { message: \"The provider is temporarily unavailable (HTTP 503).\", action: \"Check provider availability and backoff guidance.\" },\n 504: { message: \"The provider gateway timed out (HTTP 504).\", action: \"Check upstream latency and provider availability.\" },\n};\n\nexport function describeRunnerDiagnostic(input: {\n reasonCode: RunnerDiagnosticReason;\n statusCode?: number;\n transportCode?: RunnerTransportCode;\n callIndex?: number;\n}): Explanation {\n if (\n input.transportCode &&\n [\"PROVIDER_REQUEST_FAILED\", \"UPSTREAM_OPERATION_FAILED\", \"MODEL_INVOCATION_FAILED\", \"TOOL_EXECUTION_FAILED\", \"TOOL_AUTHORIZATION_FAILED\"].includes(input.reasonCode)\n ) {\n const explanation = transports[input.transportCode];\n return { message: `${explanation[0]} (${input.transportCode})`, action: explanation[1] };\n }\n if (input.reasonCode === \"PROVIDER_HTTP_ERROR\" && input.statusCode !== undefined && httpDetails[input.statusCode])\n return httpDetails[input.statusCode];\n const explanation = explanations[input.reasonCode];\n if (input.reasonCode === \"MODEL_TOOL_CALL_NULL\" && input.callIndex !== undefined)\n return {\n message: `The model returned a null tool-call entry at index ${input.callIndex}. Each tool call must contain a non-empty name and an arguments object.`,\n action: explanation[1],\n };\n if (input.reasonCode.startsWith(\"MODEL_TOOL_CALL_\") && input.callIndex !== undefined)\n return { message: `${explanation[0].replace(/\\.$/, \"\")} (index ${input.callIndex}).`, action: explanation[1] };\n return { message: explanation[0], action: explanation[1] };\n}\n","import type { ZodError } from \"zod\";\nimport { describeRunnerDiagnostic } from \"./diagnostic-messages.js\";\n\n/** Finite, non-customer-facing failure taxonomy for Commerce hosts and logs. */\nexport const RUNNER_DIAGNOSTIC_STAGES = [\n \"preflight.validate\", \"preflight.contract\", \"runtime.cancellation\", \"runtime.deadline\",\n \"runtime.operation\", \"tools.resolve\", \"model.invoke\", \"model.validate\", \"model.route\",\n \"tool.authorize\", \"tool.validate\", \"tool.execute\", \"tool.result\", \"evidence.validate\",\n \"final.validate\", \"graph.execute\",\n] as const;\nexport type RunnerDiagnosticStage = typeof RUNNER_DIAGNOSTIC_STAGES[number];\n\nexport const RUNNER_DIAGNOSTIC_REASONS = [\n \"CANCELLED_BY_CALLER\", \"TURN_DEADLINE_EXCEEDED\", \"OPERATION_TIMEOUT\",\n \"UPSTREAM_OPERATION_FAILED\", \"UNEXPECTED_EXCEPTION\",\n \"INPUT_TOO_LARGE\", \"TURN_INVALID\", \"GRANT_INVALID\", \"MANIFEST_INVALID\",\n \"GRANT_MISMATCH\", \"RUNNER_VERSION_INCOMPATIBLE\", \"RESPONSE_CONTRACT_INVALID\",\n \"LANGUAGE_INVALID\", \"BUDGET_INVALID\", \"CONTEXT_INVALID\", \"TOOL_REGISTRATION_INVALID\",\n \"MODEL_STEP_BUDGET_EXHAUSTED\", \"MODEL_INVOCATION_FAILED\",\n \"MODEL_STEP_NOT_OBJECT\", \"MODEL_STEP_CALLS_MISSING\", \"MODEL_STEP_CALLS_NOT_ARRAY\",\n \"MODEL_OUTPUT_TOKENS_MISSING\", \"MODEL_OUTPUT_TOKENS_NOT_SAFE_INTEGER\",\n \"MODEL_OUTPUT_TOKENS_EXHAUSTED\", \"MODEL_OUTPUT_TOKENS_NEGATIVE\", \"MODEL_OUTPUT_TOKENS_OVER_BUDGET\",\n \"MODEL_TOOL_CALL_LIMIT_EXCEEDED\", \"MODEL_TOOL_CALL_NULL\", \"MODEL_TOOL_CALL_NOT_OBJECT\",\n \"MODEL_TOOL_CALL_NAME_MISSING\", \"MODEL_TOOL_CALL_NAME_NOT_STRING\", \"MODEL_TOOL_CALL_NAME_EMPTY\",\n \"MODEL_TOOL_CALL_NAME_TOO_LONG\", \"MODEL_TOOL_CALL_ARGUMENTS_MISSING\",\n \"MODEL_TOOL_CALL_ARGUMENTS_NULL\", \"MODEL_TOOL_CALL_ARGUMENTS_NOT_OBJECT\",\n \"MODEL_TEXT_NOT_STRING\", \"MODEL_TEXT_TOO_LONG\",\n \"MODEL_STEP_TOO_LARGE\", \"MODEL_STEP_NOT_SERIALIZABLE\", \"MODEL_STEP_VALIDATION_FAILED\",\n \"MODEL_CALL_ROUTE_INVALID\", \"MODEL_RESULT_MISSING\",\n \"REQUEST_INVALID\", \"MODEL_REQUEST_HISTORY_INVALID\", \"MODEL_REQUEST_TOOL_RESULT_INVALID\",\n \"MODEL_CONFIGURATION_INVALID\", \"MODEL_CREDENTIAL_INVALID\", \"MODEL_ADAPTER_INITIALIZATION_FAILED\",\n \"MODEL_REQUEST_CANCELLED\", \"TOOL_BIND_FAILED\", \"PROVIDER_AUTH_FAILED\", \"PROVIDER_RATE_LIMITED\",\n \"PROVIDER_HTTP_ERROR\", \"PROVIDER_REQUEST_FAILED\", \"PROVIDER_RESPONSE_INVALID\",\n \"PROVIDER_RESPONSE_USAGE_INVALID\", \"PROVIDER_RESPONSE_TOOL_CALL_INVALID\",\n \"TOOL_DESCRIPTOR_MISMATCH\", \"TOOL_AUTHORIZATION_FAILED\", \"TOOL_INPUT_INVALID\",\n \"TOOL_CALL_BUDGET_EXHAUSTED\", \"TOOL_EXECUTION_FAILED\", \"TOOL_RESULT_TOO_LARGE\",\n \"TOOL_RESULT_INVALID\", \"TOOL_RESULT_MISSING\", \"TOOL_STALE_TURN\",\n \"EVIDENCE_INVALID\", \"FINAL_SCHEMA_INVALID\", \"FINAL_LANGUAGE_MISMATCH\",\n \"FINAL_REFERRAL_REQUIRED\", \"FINAL_EVIDENCE_INVALID\", \"FINAL_EVIDENCE_EXPIRED\",\n \"EVIDENCE_RESERVATION_EXCEEDED\",\n] as const;\nexport type RunnerDiagnosticReason = typeof RUNNER_DIAGNOSTIC_REASONS[number];\n\n/** Recognised transport failures, never arbitrary OS/provider error codes. */\nexport const RUNNER_TRANSPORT_CODES = [\n \"ENOTFOUND\", \"EAI_AGAIN\", \"ECONNREFUSED\", \"ECONNRESET\", \"ETIMEDOUT\",\n \"ENETUNREACH\", \"EHOSTUNREACH\", \"EPIPE\", \"UND_ERR_CONNECT_TIMEOUT\",\n \"UND_ERR_HEADERS_TIMEOUT\", \"UND_ERR_SOCKET\", \"CERT_HAS_EXPIRED\",\n \"UNABLE_TO_VERIFY_LEAF_SIGNATURE\", \"DEPTH_ZERO_SELF_SIGNED_CERT\",\n \"ERR_TLS_CERT_ALTNAME_INVALID\",\n] as const;\nexport type RunnerTransportCode = typeof RUNNER_TRANSPORT_CODES[number];\n\nconst recognizedExceptionNames = new Set([\n \"TypeError\", \"ReferenceError\", \"SyntaxError\", \"RangeError\", \"URIError\",\n \"EvalError\", \"AggregateError\", \"AbortError\", \"TimeoutError\",\n]);\nconst recognizedTransportCodes = new Set<string>(RUNNER_TRANSPORT_CODES);\n\n\n/** All optional fields are allowlisted; never include free-form provider or exception text. */\nexport type RunnerDiagnostic = Readonly<{\n stage: RunnerDiagnosticStage;\n reasonCode: RunnerDiagnosticReason;\n /** Fixed, safe operator explanation; computed from the validated code and detail. */\n reasonMessage?: string;\n /** Fixed, safe next step for the operator; never provider-supplied. */\n operatorAction?: string;\n /** Transport/exception details are from a fixed allowlist, not error.message. */\n transportCode?: RunnerTransportCode;\n exceptionName?: string;\n statusCode?: number;\n providerCode?: number;\n providerStage?: \"request\" | \"binding\" | \"provider\" | \"response\";\n modelStep?: number;\n /** Zero-based index for a rejected tool call. Never includes user content. */\n callIndex?: number;\n remoteCallNumber?: number;\n attempt?: number;\n toolName?: string;\n issueCount?: number;\n issueCodes?: readonly string[];\n issuePaths?: readonly string[];\n}>;\n\nconst stages = new Set<string>(RUNNER_DIAGNOSTIC_STAGES);\nconst reasons = new Set<string>(RUNNER_DIAGNOSTIC_REASONS);\nconst issueCodes = new Set([\n \"invalid_type\", \"too_big\", \"too_small\", \"invalid_format\", \"invalid_value\",\n \"unrecognized_keys\", \"invalid_union\", \"invalid_key\", \"invalid_element\", \"custom\",\n]);\nconst knownPathParts = new Set([\n \"turn\", \"grant\", \"manifest\", \"shopId\", \"conversationId\", \"checkoutRecoveryId\",\n \"inboundVersion\", \"initialInboundVersion\", \"id\", \"releaseId\", \"responseContract\",\n \"responseContractHash\", \"runnerCompatibility\", \"grantedTools\", \"capabilities\",\n \"featureBehaviours\", \"language\", \"tag\", \"source\", \"budget\", \"modelSteps\",\n \"remoteCalls\", \"deadlineMs\", \"outputTokens\", \"history\", \"context\", \"instructions\",\n \"answerKind\", \"referralReason\", \"replyText\", \"detectedLanguageTag\", \"evidenceIds\",\n \"details\", \"contractVersion\", \"status\", \"data\", \"renderedText\", \"calls\",\n \"name\", \"arguments\", \"toolName\", \"toolId\", \"toolRevisionId\", \"definitionVersion\",\n]);\n\nfunction boundedInt(value: unknown, minimum: number, maximum: number): number | undefined {\n return Number.isSafeInteger(value) && (value as number) >= minimum && (value as number) <= maximum\n ? value as number\n : undefined;\n}\n\n/** Also sanitize internally constructed diagnostics before exposing them to hosts or logs. */\nexport function safeRunnerDiagnostic(diagnostic: RunnerDiagnostic): RunnerDiagnostic {\n const fields: RunnerDiagnostic = {\n stage: stages.has(diagnostic.stage) ? diagnostic.stage : \"graph.execute\",\n reasonCode: reasons.has(diagnostic.reasonCode) ? diagnostic.reasonCode : \"UNEXPECTED_EXCEPTION\",\n ...(recognizedTransportCodes.has(diagnostic.transportCode ?? \"\") ? { transportCode: diagnostic.transportCode } : {}),\n ...(recognizedExceptionNames.has(diagnostic.exceptionName ?? \"\") ? { exceptionName: diagnostic.exceptionName } : {}),\n ...(boundedInt(diagnostic.statusCode, 100, 599) === undefined ? {} : { statusCode: diagnostic.statusCode }),\n ...(boundedInt(diagnostic.providerCode, 0, 999999) === undefined ? {} : { providerCode: diagnostic.providerCode }),\n ...([\"request\", \"binding\", \"provider\", \"response\"].includes(diagnostic.providerStage ?? \"\")\n ? { providerStage: diagnostic.providerStage } : {}),\n ...(boundedInt(diagnostic.modelStep, 1, 12) === undefined ? {} : { modelStep: diagnostic.modelStep }),\n ...(boundedInt(diagnostic.callIndex, 0, 31) === undefined ? {} : { callIndex: diagnostic.callIndex }),\n ...(boundedInt(diagnostic.remoteCallNumber, 1, 10) === undefined ? {} : { remoteCallNumber: diagnostic.remoteCallNumber }),\n ...(boundedInt(diagnostic.attempt, 1, 2) === undefined ? {} : { attempt: diagnostic.attempt }),\n ...(typeof diagnostic.toolName === \"string\" && /^[a-z][a-z0-9_]{0,127}$/.test(diagnostic.toolName)\n ? { toolName: diagnostic.toolName } : {}),\n ...(boundedInt(diagnostic.issueCount, 0, 10000) === undefined ? {} : { issueCount: diagnostic.issueCount }),\n ...(Array.isArray(diagnostic.issueCodes) ? {\n issueCodes: [...new Set(diagnostic.issueCodes.filter((code) => issueCodes.has(code)))].slice(0, 5),\n } : {}),\n ...(Array.isArray(diagnostic.issuePaths) ? {\n issuePaths: [...new Set(diagnostic.issuePaths.filter((path) =>\n typeof path === \"string\" && path.length <= 80 && path.split(\".\").every((part) => knownPathParts.has(part)),\n ))].slice(0, 5),\n } : {}),\n };\n const explanation = describeRunnerDiagnostic(fields);\n return Object.freeze({ ...fields, reasonMessage: explanation.message, operatorAction: explanation.action });\n}\n\n/** Extract only known error names and network codes from a bounded cause chain. */\nexport function safeRunnerCauseMetadata(error: unknown): Pick<RunnerDiagnostic, \"transportCode\" | \"exceptionName\"> {\n const visited = new Set<unknown>();\n let current = error;\n let transportCode: RunnerTransportCode | undefined;\n let exceptionName: string | undefined;\n for (let depth = 0; depth < 6 && current instanceof Error && !visited.has(current); depth += 1) {\n visited.add(current);\n try {\n const code = (current as Error & { code?: unknown }).code;\n if (typeof code === \"string\" && recognizedTransportCodes.has(code))\n transportCode = code as RunnerTransportCode;\n if (!exceptionName && recognizedExceptionNames.has(current.name)) exceptionName = current.name;\n current = current.cause;\n } catch {\n break; // A hostile error object/getter must not interrupt the original failure path.\n }\n }\n return {\n ...(transportCode ? { transportCode } : {}),\n ...(exceptionName ? { exceptionName } : {}),\n };\n}\n\n/** Only static schema keys and Zod's finite issue-code vocabulary may leave this boundary. */\nexport function schemaIssueMetadata(error: ZodError): Pick<RunnerDiagnostic, \"issueCount\" | \"issueCodes\" | \"issuePaths\"> {\n const paths = error.issues.map((issue) =>\n issue.path.filter((part): part is string => typeof part === \"string\")\n .filter((part) => knownPathParts.has(part)).slice(0, 3).join(\".\"),\n ).filter(Boolean);\n return {\n issueCount: Math.min(error.issues.length, 10000),\n issueCodes: [...new Set(error.issues.map((issue) => issue.code).filter((code) => issueCodes.has(code)))].slice(0, 5),\n issuePaths: [...new Set(paths)].slice(0, 5),\n };\n}\n","import type { RunCommerceTurnInput, RunnerErrorCode, RunCommerceTurnResult } from \"./types.js\";\nimport { safeRunnerCauseMetadata, safeRunnerDiagnostic, type RunnerDiagnostic, type RunnerDiagnosticStage } from \"./diagnostics.js\";\n\nexport class RunnerFailure extends Error {\n readonly diagnostic: RunnerDiagnostic;\n\n constructor(readonly code: RunnerErrorCode, diagnostic: RunnerDiagnostic, cause?: unknown) {\n super(code, { cause });\n this.name = \"RunnerFailure\";\n this.diagnostic = safeRunnerDiagnostic({ ...safeRunnerCauseMetadata(cause), ...diagnostic });\n }\n}\n\n/** Typed, provider-independent cause that model invokers may throw. */\nexport class CommerceModelInvocationFailure extends Error {\n readonly diagnostic: RunnerDiagnostic;\n\n constructor(diagnostic: RunnerDiagnostic, cause?: unknown) {\n super(\"Commerce model unavailable\", { cause });\n this.name = \"CommerceModelInvocationFailure\";\n this.diagnostic = safeRunnerDiagnostic({ ...safeRunnerCauseMetadata(cause), ...diagnostic });\n }\n}\n\nfunction findRunnerFailure(error: unknown): RunnerFailure | undefined {\n const visited = new Set<unknown>();\n let current = error;\n for (let depth = 0; depth < 6 && current instanceof Error && !visited.has(current); depth += 1) {\n visited.add(current);\n if (current instanceof RunnerFailure) return current;\n current = current.cause;\n }\n return undefined;\n}\n\nexport function mapRunnerFailure(\n error: unknown, signal?: AbortSignal, fallbackStage: RunnerDiagnosticStage = \"graph.execute\",\n): RunCommerceTurnResult {\n const failure = findRunnerFailure(error);\n const code = failure?.code ?? (signal?.aborted ? \"CANCELLED\" : \"INVALID_INPUT\");\n const diagnostic = failure?.diagnostic ?? safeRunnerDiagnostic(signal?.aborted\n ? { stage: \"runtime.cancellation\", reasonCode: \"CANCELLED_BY_CALLER\" }\n : { stage: fallbackStage, reasonCode: \"UNEXPECTED_EXCEPTION\", ...safeRunnerCauseMetadata(error) });\n return {\n ok: false,\n error: { code, retryable: code === \"UNAVAILABLE\" || code === \"DEADLINE\", diagnostic },\n };\n}\n\nexport function failureCode(error: unknown): RunnerErrorCode {\n return findRunnerFailure(error)?.code ?? \"INVALID_INPUT\";\n}\n\nexport function inputSignal(input: RunCommerceTurnInput): AbortSignal {\n return input.signal;\n}\n"],"mappings":"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","names":["explanation"]}
|