@ablehi/error-contract 0.0.2 → 0.0.4

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.
Files changed (2) hide show
  1. package/dist/index.js +1 -1
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- var R="ablehi.error.digest.v1",N="INTERNAL_ERROR",T=new Set(["content-type","retry-after","x-request-id","request-id","x-correlation-id"]),O=new Set(["ablehi-server","ablehi-cf-execution-runtime","agentIntegrations"]),h=new Set(["api_request","flow_run","flow_step","integration_invocation","native_runtime"]),U=new Set(["validation","auth","permission","not_found","rate_limit","provider","network","runtime","internal","canceled"]),k=new Set(["info","warning","error"]),S=["workspaceId","flowId","flowVersionId","flowRunId","stepId","nodeId","integrationId","actionId","toolRef","connectionId","requestId","traceRef"],j=["workspaceId","flowId","flowVersionId","flowRunId","stepId","nodeId","integrationId","actionId","connectionId"],w=[o(N,{category:"internal",severity:"error",retryable:!1,displayTone:"error",titleKey:"errors.generic.title",bodyKey:"errors.generic.body",actionHints:[{type:"contact_support"}],repairability:"internal_only",issues:"always"}),o("VALIDATION_ERROR",{category:"validation",severity:"warning",retryable:!1,displayTone:"warning",titleKey:"errors.validation.title",bodyKey:"errors.validation.body",actionHints:[],repairability:"user_action",issues:"never"}),o("AUTH_INVALID",A("errors.auth.invalid.title","errors.auth.invalid.body")),o("AUTH_EXPIRED",A("errors.auth.expired.title","errors.auth.expired.body")),o("PERMISSION_DENIED",{category:"permission",severity:"warning",retryable:!1,displayTone:"warning",titleKey:"errors.permissionDenied.title",bodyKey:"errors.permissionDenied.body",actionHints:[],repairability:"user_action",issues:"never"}),o("NOT_FOUND",{category:"not_found",severity:"warning",retryable:!1,displayTone:"warning",titleKey:"errors.notFound.title",bodyKey:"errors.notFound.body",actionHints:[],repairability:"user_action",issues:"never"}),o("RATE_LIMITED",{category:"rate_limit",severity:"warning",retryable:!0,displayTone:"warning",titleKey:"errors.rateLimited.title",bodyKey:"errors.rateLimited.body",actionHints:[{type:"retry"}],repairability:"retryable",issues:"never"}),o("PROVIDER_ERROR",m("errors.provider.title","errors.provider.body")),o("NETWORK_UNREACHABLE",m("errors.network.title","errors.network.body")),o("HTTP_REQUEST_FAILED",m("errors.httpRequestFailed.title","errors.httpRequestFailed.body")),o("TOOL_NOT_FOUND",a("errors.toolNotFound.title","errors.toolNotFound.body")),o("FILE_NOT_FOUND",a("errors.fileNotFound.title","errors.fileNotFound.body")),o("FILE_RUNTIME_UNAVAILABLE",y("errors.fileRuntimeUnavailable.title","errors.fileRuntimeUnavailable.body")),o("FILE_TOO_LARGE",a("errors.fileTooLarge.title","errors.fileTooLarge.body")),o("FILE_STORE_QUOTA_EXCEEDED",a("errors.fileQuota.title","errors.fileQuota.body")),o("TOOL_RUNTIME_UNAVAILABLE",y("errors.toolRuntimeUnavailable.title","errors.toolRuntimeUnavailable.body")),o("TOOL_EXECUTION_FAILED",m("errors.toolExecutionFailed.title","errors.toolExecutionFailed.body")),o("HTTP_RUNTIME_UNAVAILABLE",y("errors.httpRuntimeUnavailable.title","errors.httpRuntimeUnavailable.body")),o("FLOW_RUN_CONNECTION_AUTH_MISMATCH",d("errors.connection.authMismatch.title","errors.connection.authMismatch.body")),o("CONNECTION_AUTH_PROFILE_UNSUPPORTED",d("errors.connection.profileUnsupported.title","errors.connection.profileUnsupported.body")),o("RUNTIME_CREDENTIAL_AUTH_MISMATCH",d("errors.connection.runtimeAuthMismatch.title","errors.connection.runtimeAuthMismatch.body")),o("EGRESS_GRANT_AUTH_MISMATCH",d("errors.connection.egressAuthMismatch.title","errors.connection.egressAuthMismatch.body")),o("RUNTIME_CREDENTIAL_REFRESH_FAILED",d("errors.connection.refreshFailed.title","errors.connection.refreshFailed.body")),o("CONNECTION_NOT_FOUND",d("errors.connection.notFound.title","errors.connection.notFound.body")),o("AMBIGUOUS_CONNECTION",d("errors.connection.ambiguous.title","errors.connection.ambiguous.body")),o("CREDENTIAL_UNAVAILABLE",d("errors.connection.credentialUnavailable.title","errors.connection.credentialUnavailable.body")),o("TRUSTED_SDK_CREDENTIAL_UNAVAILABLE",d("errors.connection.trustedCredentialUnavailable.title","errors.connection.trustedCredentialUnavailable.body")),o("TRUSTED_SDK_CREDENTIAL_FORBIDDEN",d("errors.connection.trustedCredentialForbidden.title","errors.connection.trustedCredentialForbidden.body")),o("TRUSTED_SDK_CREDENTIAL_RESOLUTION_FAILED",d("errors.connection.trustedCredentialResolutionFailed.title","errors.connection.trustedCredentialResolutionFailed.body")),o("REQUEST_MULTIPART_FILE_INVALID",a("errors.requestMultipartFileInvalid.title","errors.requestMultipartFileInvalid.body")),o("REQUEST_PATH_BINDING_INVALID",a("errors.requestPathBindingInvalid.title","errors.requestPathBindingInvalid.body")),o("REQUEST_PLAN_INVALID",a("errors.requestPlanInvalid.title","errors.requestPlanInvalid.body")),o("INTERPRETER_DATA_REF_UNRESOLVED",a("errors.interpreterDataRefUnresolved.title","errors.interpreterDataRefUnresolved.body")),o("FLOW_NODE_UNSUPPORTED",a("errors.flowNodeUnsupported.title","errors.flowNodeUnsupported.body")),o("FLOW_INTERPRETER_INVALID_IR",a("errors.flowInterpreterInvalidIr.title","errors.flowInterpreterInvalidIr.body")),o("FLOW_ACTION_OUTPUT_PROJECTION_FAILED",a("errors.flowActionOutputProjectionFailed.title","errors.flowActionOutputProjectionFailed.body")),o("INBOX_MESSAGE_IDEMPOTENCY_KEY_INVALID",a("errors.inboxMessage.invalid.title","errors.inboxMessage.invalid.body")),o("INBOX_MESSAGE_PAYLOAD_INVALID",a("errors.inboxMessage.invalid.title","errors.inboxMessage.invalid.body")),o("INBOX_MESSAGE_PAYLOAD_TOO_LARGE",a("errors.inboxMessage.invalid.title","errors.inboxMessage.invalid.body")),o("INBOX_MESSAGE_RENDER_INVALID",a("errors.inboxMessage.invalid.title","errors.inboxMessage.invalid.body")),o("INBOX_MESSAGE_CONTENT_TOO_LARGE",a("errors.inboxMessage.invalid.title","errors.inboxMessage.invalid.body")),o("INBOX_MESSAGE_ATTACHMENT_INVALID",a("errors.inboxMessage.invalid.title","errors.inboxMessage.invalid.body")),o("INBOX_MESSAGE_ATTACHMENT_UNAVAILABLE",a("errors.inboxMessage.attachmentUnavailable.title","errors.inboxMessage.attachmentUnavailable.body")),o("FLOW_INBOX_MESSAGE_INVALID",a("errors.inboxMessage.invalid.title","errors.inboxMessage.invalid.body")),o("EXECUTION_LEASE_INVALID",x("errors.executionLeaseInvalid.title","errors.executionLeaseInvalid.body")),o("EXECUTION_LEASE_SUPERSEDED",_("errors.executionLeaseSuperseded.title","errors.executionLeaseSuperseded.body")),o("AUTOMATION_APP_INSTALLATION_DISABLED",_("errors.inboxMessage.deliveryClosed.title","errors.inboxMessage.deliveryClosed.body")),o("INBOX_MESSAGE_EMISSION_WINDOW_CLOSED",_("errors.inboxMessage.deliveryClosed.title","errors.inboxMessage.deliveryClosed.body")),o("INBOX_MESSAGE_EMISSION_CONFLICT",a("errors.inboxMessage.conflict.title","errors.inboxMessage.conflict.body")),o("INBOX_MESSAGE_EMISSION_UNAVAILABLE",y("errors.inboxMessage.deliveryUnavailable.title","errors.inboxMessage.deliveryUnavailable.body")),o("INTERPRETER_SERVER_CALLBACK_FAILED",y("errors.serverCallbackFailed.title","errors.serverCallbackFailed.body")),o("INTERPRETER_CONTRACT_VERSION_UNSUPPORTED",{category:"internal",severity:"error",retryable:!1,displayTone:"error",titleKey:"errors.interpreterContractVersionUnsupported.title",bodyKey:"errors.interpreterContractVersionUnsupported.body",actionHints:[{type:"contact_support"}],repairability:"internal_only",issues:"always"}),o("CF_RUNTIME_UNKNOWN_FAILURE",y("errors.cfRuntimeUnknownFailure.title","errors.cfRuntimeUnknownFailure.body")),o("RUN_DISPATCH_UNAVAILABLE",y("errors.runDispatchUnavailable.title","errors.runDispatchUnavailable.body")),o("WFP_SCRIPT_NOT_READY",y("errors.wfpScriptNotReady.title","errors.wfpScriptNotReady.body")),o("FLOW_RUN_NOT_FOUND",a("errors.flowRunNotFound.title","errors.flowRunNotFound.body")),o("WORKSPACE_NOT_FOUND",a("errors.workspaceNotFound.title","errors.workspaceNotFound.body"))],I=new Map(w.map(e=>[e.code,e])),D=I.get(N);function C(e){return P(I.get(e)??D)}function fe(){return w.map(e=>P(e))}function pe(e){let r=I.get(e.code??"")??D,t=F(e.source),n=K(e.scope),s=B(e.subject),u=W("attempt"in e?e.attempt:void 0),b=oe(e.occurredAt),E=z(e.evidence),f={schemaVersion:R,errorId:ae({scope:n,subject:q(s),attempt:u?.number??"__none__",code:r.code}),code:r.code,category:r.category,severity:r.severity,retryable:r.retryable,source:t,scope:n,subject:s,occurredAt:b};return u!==void 0&&(f.attempt=u),E!==void 0&&(f.evidence=E),f}function ge(e){return M(e).ok}function M(e){if(!c(e))return i("digest must be a JSON object");let r=g(e,["schemaVersion","errorId","code","category","severity","retryable","source","scope","subject","attempt","occurredAt","evidence"]);if(r!==void 0)return i(`digest does not accept the "${r}" field`);if(e.schemaVersion!==R)return i("digest schemaVersion is invalid");if(typeof e.errorId!="string"||e.errorId.length===0)return i("digest errorId must be a non-empty string");let t=typeof e.code=="string"?I.get(e.code):void 0;if(t===void 0)return i("digest code is not registered");if(!ye(e.category))return i("digest category is invalid");if(!le(e.severity))return i("digest severity is invalid");if(typeof e.retryable!="boolean")return i("digest retryable must be boolean");if(e.category!==t.category||e.severity!==t.severity||e.retryable!==t.retryable)return i("digest machine semantics do not match its registered code");let n=H(e.source);if(!n.ok)return n;let s=V(e.scope);if(!s.ok)return s;let u=G(e.subject);if(!u.ok)return u;let b;if(e.attempt!==void 0){let p=X(e.attempt);if(!p.ok)return p;b=p.value}if(typeof e.occurredAt!="string"||!L(e.occurredAt))return i("digest occurredAt must be an ISO timestamp");let E;if(e.evidence!==void 0){let p=J(e.evidence);if(!p.ok)return p;E=p.value}let f={schemaVersion:R,errorId:e.errorId,code:t.code,category:e.category,severity:e.severity,retryable:e.retryable,source:n.value,scope:s.value,subject:u.value,occurredAt:e.occurredAt};return b!==void 0&&(f.attempt=b),E!==void 0&&(f.evidence=E),{ok:!0,value:f}}function Ee(e){let r=C(e.code),t=te(e);return{errorId:e.errorId,code:r.code,category:r.category,retryable:r.retryable,displayTone:r.displayTone,message:{titleKey:r.publicMessage.titleKey,bodyKey:r.publicMessage.bodyKey,...Object.keys(t).length===0?{}:{params:t}},actionHints:r.actionHints.map(n=>n.type==="reconnect"&&e.subject.connectionId!==void 0?{...n,connectionId:e.subject.connectionId}:{...n})}}function be(e){let r=C(e.code),t={errorId:e.errorId,code:r.code,category:r.category,retryable:r.retryable,repairability:r.repairability,scope:e.scope,subject:{...e.subject}};return e.evidence!==void 0&&(t.evidence=ne(e.evidence)),t}function o(e,r){return{code:e,category:r.category,severity:r.severity,retryable:r.retryable,displayTone:r.displayTone,publicMessage:{titleKey:r.titleKey,bodyKey:r.bodyKey},actionHints:r.actionHints,repairability:r.repairability,sentryDiagnostics:{logs:"always",issues:r.issues}}}function A(e,r){return{category:"auth",severity:"warning",retryable:!1,displayTone:"warning",titleKey:e,bodyKey:r,actionHints:[],repairability:"user_action",issues:"never"}}function d(e,r){return{category:"auth",severity:"warning",retryable:!1,displayTone:"warning",titleKey:e,bodyKey:r,actionHints:[{type:"reconnect"}],repairability:"connection_reauth",issues:"never"}}function a(e,r){return{category:"validation",severity:"warning",retryable:!1,displayTone:"warning",titleKey:e,bodyKey:r,actionHints:[{type:"edit_flow"}],repairability:"edit_flow",issues:"never"}}function m(e,r){return{category:"provider",severity:"warning",retryable:!0,displayTone:"warning",titleKey:e,bodyKey:r,actionHints:[{type:"retry"}],repairability:"retryable",issues:"never"}}function y(e,r){return{category:"runtime",severity:"error",retryable:!0,displayTone:"error",titleKey:e,bodyKey:r,actionHints:[{type:"retry"}],repairability:"retryable",issues:"always"}}function x(e,r){return{category:"runtime",severity:"error",retryable:!1,displayTone:"error",titleKey:e,bodyKey:r,actionHints:[{type:"contact_support"}],repairability:"internal_only",issues:"always"}}function _(e,r){return{category:"canceled",severity:"warning",retryable:!1,displayTone:"neutral",titleKey:e,bodyKey:r,actionHints:[],repairability:"none",issues:"never"}}function P(e){return{...e,publicMessage:{...e.publicMessage},actionHints:e.actionHints.map(r=>({...r})),sentryDiagnostics:{...e.sentryDiagnostics}}}function F(e){return{project:O.has(e.project)?e.project:"ablehi-server",component:l(e.component,"unknown")}}function H(e){if(!c(e))return i("digest source must be a JSON object");let r=g(e,["project","component"]);return r!==void 0?i(`digest source does not accept the "${r}" field`):de(e.project)?typeof e.component!="string"||e.component.length===0?i("digest source component must be a non-empty string"):{ok:!0,value:{project:e.project,component:e.component}}:i("digest source project is invalid")}function K(e){return h.has(e)?e:"native_runtime"}function V(e){return ue(e)?{ok:!0,value:e}:i("digest scope is invalid")}function B(e){let r={};for(let t of S){let n=e[t];typeof n=="string"&&n.length>0&&(r[t]=l(n,n))}return r}function q(e){let r={};for(let t of j){let n=e[t];n!==void 0&&(r[t]=n)}return r}function G(e){if(!c(e))return i("digest subject must be a JSON object");let r=g(e,S);if(r!==void 0)return i(`digest subject does not accept the "${r}" field`);let t={};for(let n of S){let s=e[n];if(s!==void 0){if(typeof s!="string"||s.length===0)return i(`digest subject ${n} must be a non-empty string`);t[n]=s}}return{ok:!0,value:t}}function W(e){if(!(e===void 0||typeof e.number!="number"||!Number.isInteger(e.number)||e.number<=0))return{number:e.number}}function X(e){if(!c(e))return i("digest attempt must be a JSON object");let r=g(e,["number"]);return r!==void 0?i(`digest attempt does not accept the "${r}" field`):typeof e.number!="number"||!Number.isInteger(e.number)||e.number<=0?i("digest attempt number must be a positive integer"):{ok:!0,value:{number:e.number}}}function z(e){if(!c(e))return;let r={},t=$(e.issues);t!==void 0&&(r.issues=t);let n=Q(e.provider);return n!==void 0&&(r.provider=n),e.truncated===!0&&(r.truncated=!0),Object.keys(r).length===0?void 0:r}function J(e){if(!c(e))return i("digest evidence must be a JSON object");let r=g(e,["issues","provider","truncated"]);if(r!==void 0)return i(`digest evidence does not accept the "${r}" field`);let t={};if(e.issues!==void 0){let n=Y(e.issues);if(!n.ok)return n;t.issues=n.value}if(e.provider!==void 0){let n=Z(e.provider);if(!n.ok)return n;t.provider=n.value}if(e.truncated!==void 0){if(e.truncated!==!0)return i("digest evidence truncated must be true when present");t.truncated=!0}return{ok:!0,value:t}}function $(e){if(!Array.isArray(e))return;let r=[];for(let t of e.slice(0,10)){if(!c(t)||typeof t.code!="string")continue;let n={code:l(t.code,"issue")};if(Array.isArray(t.path)&&(n.path=t.path.filter(s=>typeof s=="string"&&s.length>0).slice(0,8)),typeof t.messageKey=="string"&&t.messageKey.length>0&&(n.messageKey=l(t.messageKey,t.messageKey)),c(t.params)){let s=ie(t.params);s!==void 0&&(n.params=s)}r.push(n)}return r.length===0?void 0:r}function Y(e){if(!Array.isArray(e))return i("digest evidence issues must be an array");if(e.length>10)return i("digest evidence issues exceeds the item limit");let r=[];for(let t of e){if(!c(t))return i("digest evidence issue must be a JSON object");let n=g(t,["code","path","messageKey","params"]);if(n!==void 0)return i(`digest evidence issue does not accept the "${n}" field`);if(typeof t.code!="string"||t.code.length===0)return i("digest evidence issue code must be a non-empty string");let s={code:t.code};if(t.path!==void 0){if(!Array.isArray(t.path)||t.path.some(u=>typeof u!="string"||u.length===0))return i("digest evidence issue path must be a string array");s.path=[...t.path]}if(t.messageKey!==void 0){if(typeof t.messageKey!="string"||t.messageKey.length===0)return i("digest evidence issue messageKey must be a non-empty string");s.messageKey=t.messageKey}if(t.params!==void 0){if(!c(t.params)||!se(t.params))return i("digest evidence issue params must be scalar");s.params={...t.params}}r.push(s)}return{ok:!0,value:r}}function Q(e){if(!c(e))return;let r={};typeof e.httpStatus=="number"&&Number.isInteger(e.httpStatus)&&(r.httpStatus=e.httpStatus),typeof e.effectiveStatus=="string"&&e.effectiveStatus.length>0&&(r.effectiveStatus=l(e.effectiveStatus,e.effectiveStatus)),typeof e.providerCode=="string"&&e.providerCode.length>0&&(r.providerCode=l(e.providerCode,e.providerCode)),typeof e.requestId=="string"&&e.requestId.length>0&&(r.requestId=l(e.requestId,e.requestId));let t=ee(e.responseHeaders);return t!==void 0&&(r.responseHeaders=t),e.truncated===!0&&(r.truncated=!0),Object.keys(r).length===0?void 0:r}function Z(e){if(!c(e))return i("digest provider evidence must be a JSON object");let r=g(e,["httpStatus","effectiveStatus","providerCode","requestId","responseHeaders","truncated"]);if(r!==void 0)return i(`digest provider evidence does not accept the "${r}" field`);let t={};if(e.httpStatus!==void 0){if(typeof e.httpStatus!="number"||!Number.isInteger(e.httpStatus))return i("digest provider httpStatus must be an integer");t.httpStatus=e.httpStatus}if(e.effectiveStatus!==void 0){if(typeof e.effectiveStatus!="string"||e.effectiveStatus.length===0)return i("digest provider effectiveStatus must be a non-empty string");t.effectiveStatus=e.effectiveStatus}if(e.providerCode!==void 0){if(typeof e.providerCode!="string"||e.providerCode.length===0)return i("digest provider providerCode must be a non-empty string");t.providerCode=e.providerCode}if(e.requestId!==void 0){if(typeof e.requestId!="string"||e.requestId.length===0)return i("digest provider requestId must be a non-empty string");t.requestId=e.requestId}if(e.responseHeaders!==void 0){let n=re(e.responseHeaders);if(!n.ok)return n;t.responseHeaders=n.value}if(e.truncated!==void 0){if(e.truncated!==!0)return i("digest provider truncated must be true when present");t.truncated=!0}return{ok:!0,value:t}}function ee(e){if(!c(e))return;let r={};for(let[t,n]of Object.entries(e)){let s=t.toLowerCase();T.has(s)&&typeof n=="string"&&(r[s]=l(n,n))}return Object.keys(r).length===0?void 0:r}function re(e){if(!c(e))return i("digest provider responseHeaders must be a JSON object");let r={};for(let[t,n]of Object.entries(e)){if(!T.has(t))return i(`digest provider responseHeaders does not accept "${t}"`);if(typeof n!="string")return i("digest provider responseHeaders values must be strings");r[t]=n}return{ok:!0,value:r}}function te(e){let r={},t=e.evidence?.issues?.length??0;t>0&&(r.issueCount=t);let n=e.evidence?.provider?.responseHeaders?.["retry-after"];return n!==void 0&&n.length>0&&(r.retryAfter=n),r}function ne(e){return{...e.issues===void 0?{}:{issues:e.issues.map(r=>({...r,...r.path===void 0?{}:{path:[...r.path]},...r.params===void 0?{}:{params:{...r.params}}}))},...e.provider===void 0?{}:{provider:{...e.provider,...e.provider.responseHeaders===void 0?{}:{responseHeaders:{...e.provider.responseHeaders}}}},...e.truncated===!0?{truncated:!0}:{}}}function oe(e){return L(e)?e:"1970-01-01T00:00:00.000Z"}function L(e){let r=Date.parse(e);return Number.isFinite(r)&&new Date(r).toISOString()===e}function l(e,r){let t=e.trim(),n=t.length===0?r:t;return n.length<=200?n:n.slice(0,200)}function ie(e){let r={};for(let[t,n]of Object.entries(e))(n===null||typeof n=="string"||typeof n=="number"||typeof n=="boolean")&&(r[t]=n);return Object.keys(r).length===0?void 0:r}function se(e){return Object.values(e).every(r=>r===null||typeof r=="string"||typeof r=="number"||typeof r=="boolean")}function ae(e){return`err_${ce(v(e))}`}function v(e){if(e===null||typeof e!="object")return JSON.stringify(e);if(Array.isArray(e))return`[${e.map(t=>v(t)).join(",")}]`;let r=e;return`{${Object.keys(r).filter(t=>r[t]!==void 0).sort().map(t=>`${JSON.stringify(t)}:${v(r[t])}`).join(",")}}`}function ce(e){let r=0xcbf29ce484222325n,t=0x100000001b3n,n=0xffffffffffffffffn;for(let s=0;s<e.length;s+=1)r^=BigInt(e.charCodeAt(s)),r=r*t&n;return r.toString(36)}function i(e){return{ok:!1,reason:e}}function c(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function g(e,r){return Object.keys(e).find(t=>!r.includes(t))}function de(e){return typeof e=="string"&&O.has(e)}function ue(e){return typeof e=="string"&&h.has(e)}function ye(e){return typeof e=="string"&&U.has(e)}function le(e){return typeof e=="string"&&k.has(e)}export{R as ABLEHI_ERROR_DIGEST_SCHEMA_VERSION,N as GENERIC_ERROR_CODE,ge as isAblehiErrorDigest,fe as listErrorRegistryEntries,C as lookupErrorRegistryEntry,pe as normalizeErrorDigest,M as parseAblehiErrorDigest,be as projectAgentErrorView,Ee as projectPublicErrorView};
1
+ var R="ablehi.error.digest.v1",T="INTERNAL_ERROR",O=new Set(["content-type","retry-after","x-request-id","request-id","x-correlation-id"]),h=new Set(["ablehi-server","ablehi-cf-execution-runtime","agentIntegrations"]),w=new Set(["api_request","flow_run","flow_step","integration_invocation","native_runtime"]),k=new Set(["validation","auth","permission","not_found","rate_limit","provider","network","runtime","internal","canceled"]),j=new Set(["info","warning","error"]),S=["workspaceId","flowId","flowVersionId","flowRunId","stepId","nodeId","integrationId","actionId","toolRef","connectionId","requestId","traceRef"],M=["workspaceId","flowId","flowVersionId","flowRunId","stepId","nodeId","integrationId","actionId","connectionId"],C=[o(T,{category:"internal",severity:"error",retryable:!1,displayTone:"error",titleKey:"errors.generic.title",bodyKey:"errors.generic.body",actionHints:[{type:"contact_support"}],repairability:"internal_only",issues:"always"}),o("VALIDATION_ERROR",{category:"validation",severity:"warning",retryable:!1,displayTone:"warning",titleKey:"errors.validation.title",bodyKey:"errors.validation.body",actionHints:[],repairability:"user_action",issues:"never"}),o("AUTH_INVALID",A("errors.auth.invalid.title","errors.auth.invalid.body")),o("AUTH_EXPIRED",A("errors.auth.expired.title","errors.auth.expired.body")),o("PERMISSION_DENIED",{category:"permission",severity:"warning",retryable:!1,displayTone:"warning",titleKey:"errors.permissionDenied.title",bodyKey:"errors.permissionDenied.body",actionHints:[],repairability:"user_action",issues:"never"}),o("NOT_FOUND",{category:"not_found",severity:"warning",retryable:!1,displayTone:"warning",titleKey:"errors.notFound.title",bodyKey:"errors.notFound.body",actionHints:[],repairability:"user_action",issues:"never"}),o("RATE_LIMITED",{category:"rate_limit",severity:"warning",retryable:!0,displayTone:"warning",titleKey:"errors.rateLimited.title",bodyKey:"errors.rateLimited.body",actionHints:[{type:"retry"}],repairability:"retryable",issues:"never"}),o("PROVIDER_ERROR",m("errors.provider.title","errors.provider.body")),o("NETWORK_UNREACHABLE",m("errors.network.title","errors.network.body")),o("HTTP_REQUEST_FAILED",m("errors.httpRequestFailed.title","errors.httpRequestFailed.body")),o("TOOL_NOT_FOUND",a("errors.toolNotFound.title","errors.toolNotFound.body")),o("FILE_NOT_FOUND",a("errors.fileNotFound.title","errors.fileNotFound.body")),o("FILE_RUNTIME_UNAVAILABLE",y("errors.fileRuntimeUnavailable.title","errors.fileRuntimeUnavailable.body")),o("FILE_TOO_LARGE",a("errors.fileTooLarge.title","errors.fileTooLarge.body")),o("FILE_STORE_QUOTA_EXCEEDED",a("errors.fileQuota.title","errors.fileQuota.body")),o("TOOL_RUNTIME_UNAVAILABLE",y("errors.toolRuntimeUnavailable.title","errors.toolRuntimeUnavailable.body")),o("TOOL_EXECUTION_FAILED",m("errors.toolExecutionFailed.title","errors.toolExecutionFailed.body")),o("HTTP_RUNTIME_UNAVAILABLE",y("errors.httpRuntimeUnavailable.title","errors.httpRuntimeUnavailable.body")),o("FLOW_RUN_CONNECTION_AUTH_MISMATCH",d("errors.connection.authMismatch.title","errors.connection.authMismatch.body")),o("CONNECTION_AUTH_PROFILE_UNSUPPORTED",d("errors.connection.profileUnsupported.title","errors.connection.profileUnsupported.body")),o("RUNTIME_CREDENTIAL_AUTH_MISMATCH",d("errors.connection.runtimeAuthMismatch.title","errors.connection.runtimeAuthMismatch.body")),o("EGRESS_GRANT_AUTH_MISMATCH",d("errors.connection.egressAuthMismatch.title","errors.connection.egressAuthMismatch.body")),o("RUNTIME_CREDENTIAL_REFRESH_FAILED",d("errors.connection.refreshFailed.title","errors.connection.refreshFailed.body")),o("CONNECTION_NOT_FOUND",d("errors.connection.notFound.title","errors.connection.notFound.body")),o("AMBIGUOUS_CONNECTION",d("errors.connection.ambiguous.title","errors.connection.ambiguous.body")),o("CREDENTIAL_UNAVAILABLE",d("errors.connection.credentialUnavailable.title","errors.connection.credentialUnavailable.body")),o("TRUSTED_SDK_CREDENTIAL_UNAVAILABLE",d("errors.connection.trustedCredentialUnavailable.title","errors.connection.trustedCredentialUnavailable.body")),o("TRUSTED_SDK_CREDENTIAL_FORBIDDEN",d("errors.connection.trustedCredentialForbidden.title","errors.connection.trustedCredentialForbidden.body")),o("TRUSTED_SDK_CREDENTIAL_RESOLUTION_FAILED",d("errors.connection.trustedCredentialResolutionFailed.title","errors.connection.trustedCredentialResolutionFailed.body")),o("REQUEST_MULTIPART_FILE_INVALID",a("errors.requestMultipartFileInvalid.title","errors.requestMultipartFileInvalid.body")),o("REQUEST_PATH_BINDING_INVALID",a("errors.requestPathBindingInvalid.title","errors.requestPathBindingInvalid.body")),o("REQUEST_PLAN_INVALID",a("errors.requestPlanInvalid.title","errors.requestPlanInvalid.body")),o("INTERPRETER_DATA_REF_UNRESOLVED",a("errors.interpreterDataRefUnresolved.title","errors.interpreterDataRefUnresolved.body")),o("FLOW_NODE_UNSUPPORTED",a("errors.flowNodeUnsupported.title","errors.flowNodeUnsupported.body")),o("FLOW_INTERPRETER_INVALID_IR",a("errors.flowInterpreterInvalidIr.title","errors.flowInterpreterInvalidIr.body")),o("FLOW_ACTION_OUTPUT_PROJECTION_FAILED",a("errors.flowActionOutputProjectionFailed.title","errors.flowActionOutputProjectionFailed.body")),o("ACTION_TRANSFORM_BINDING_MISMATCH",I("errors.generic.title","errors.generic.body")),o("ACTION_TRANSFORM_VALUE_INVALID",I("errors.generic.title","errors.generic.body")),o("ACTION_TRANSFORM_FAILED",I("errors.generic.title","errors.generic.body")),o("ACTION_TRANSFORM_UNAVAILABLE",y("errors.generic.title","errors.generic.body")),o("INBOX_MESSAGE_IDEMPOTENCY_KEY_INVALID",a("errors.inboxMessage.invalid.title","errors.inboxMessage.invalid.body")),o("INBOX_MESSAGE_PAYLOAD_INVALID",a("errors.inboxMessage.invalid.title","errors.inboxMessage.invalid.body")),o("INBOX_MESSAGE_PAYLOAD_TOO_LARGE",a("errors.inboxMessage.invalid.title","errors.inboxMessage.invalid.body")),o("INBOX_MESSAGE_RENDER_INVALID",a("errors.inboxMessage.invalid.title","errors.inboxMessage.invalid.body")),o("INBOX_MESSAGE_CONTENT_TOO_LARGE",a("errors.inboxMessage.invalid.title","errors.inboxMessage.invalid.body")),o("INBOX_MESSAGE_ATTACHMENT_INVALID",a("errors.inboxMessage.invalid.title","errors.inboxMessage.invalid.body")),o("INBOX_MESSAGE_ATTACHMENT_UNAVAILABLE",a("errors.inboxMessage.attachmentUnavailable.title","errors.inboxMessage.attachmentUnavailable.body")),o("FLOW_INBOX_MESSAGE_INVALID",a("errors.inboxMessage.invalid.title","errors.inboxMessage.invalid.body")),o("EXECUTION_LEASE_INVALID",I("errors.executionLeaseInvalid.title","errors.executionLeaseInvalid.body")),o("EXECUTION_LEASE_SUPERSEDED",N("errors.executionLeaseSuperseded.title","errors.executionLeaseSuperseded.body")),o("INBOX_MESSAGE_EMISSION_WINDOW_CLOSED",N("errors.inboxMessage.deliveryClosed.title","errors.inboxMessage.deliveryClosed.body")),o("INBOX_MESSAGE_EMISSION_CONFLICT",a("errors.inboxMessage.conflict.title","errors.inboxMessage.conflict.body")),o("INBOX_MESSAGE_EMISSION_UNAVAILABLE",y("errors.inboxMessage.deliveryUnavailable.title","errors.inboxMessage.deliveryUnavailable.body")),o("INTERPRETER_SERVER_CALLBACK_FAILED",y("errors.serverCallbackFailed.title","errors.serverCallbackFailed.body")),o("INTERPRETER_CONTRACT_VERSION_UNSUPPORTED",{category:"internal",severity:"error",retryable:!1,displayTone:"error",titleKey:"errors.interpreterContractVersionUnsupported.title",bodyKey:"errors.interpreterContractVersionUnsupported.body",actionHints:[{type:"contact_support"}],repairability:"internal_only",issues:"always"}),o("CF_RUNTIME_UNKNOWN_FAILURE",y("errors.cfRuntimeUnknownFailure.title","errors.cfRuntimeUnknownFailure.body")),o("RUN_DISPATCH_UNAVAILABLE",y("errors.runDispatchUnavailable.title","errors.runDispatchUnavailable.body")),o("WFP_SCRIPT_NOT_READY",y("errors.wfpScriptNotReady.title","errors.wfpScriptNotReady.body")),o("FLOW_RUN_NOT_FOUND",a("errors.flowRunNotFound.title","errors.flowRunNotFound.body")),o("WORKSPACE_NOT_FOUND",a("errors.workspaceNotFound.title","errors.workspaceNotFound.body"))],_=new Map(C.map(e=>[e.code,e])),D=_.get(T);function L(e){return U(_.get(e)??D)}function fe(){return C.map(e=>U(e))}function pe(e){let r=_.get(e.code??"")??D,t=F(e.source),n=K(e.scope),s=B(e.subject),u=W("attempt"in e?e.attempt:void 0),b=oe(e.occurredAt),E=z(e.evidence),f={schemaVersion:R,errorId:ae({scope:n,subject:q(s),attempt:u?.number??"__none__",code:r.code}),code:r.code,category:r.category,severity:r.severity,retryable:r.retryable,source:t,scope:n,subject:s,occurredAt:b};return u!==void 0&&(f.attempt=u),E!==void 0&&(f.evidence=E),f}function ge(e){return x(e).ok}function x(e){if(!c(e))return i("digest must be a JSON object");let r=g(e,["schemaVersion","errorId","code","category","severity","retryable","source","scope","subject","attempt","occurredAt","evidence"]);if(r!==void 0)return i(`digest does not accept the "${r}" field`);if(e.schemaVersion!==R)return i("digest schemaVersion is invalid");if(typeof e.errorId!="string"||e.errorId.length===0)return i("digest errorId must be a non-empty string");let t=typeof e.code=="string"?_.get(e.code):void 0;if(t===void 0)return i("digest code is not registered");if(!ye(e.category))return i("digest category is invalid");if(!le(e.severity))return i("digest severity is invalid");if(typeof e.retryable!="boolean")return i("digest retryable must be boolean");if(e.category!==t.category||e.severity!==t.severity||e.retryable!==t.retryable)return i("digest machine semantics do not match its registered code");let n=H(e.source);if(!n.ok)return n;let s=V(e.scope);if(!s.ok)return s;let u=G(e.subject);if(!u.ok)return u;let b;if(e.attempt!==void 0){let p=X(e.attempt);if(!p.ok)return p;b=p.value}if(typeof e.occurredAt!="string"||!P(e.occurredAt))return i("digest occurredAt must be an ISO timestamp");let E;if(e.evidence!==void 0){let p=J(e.evidence);if(!p.ok)return p;E=p.value}let f={schemaVersion:R,errorId:e.errorId,code:t.code,category:e.category,severity:e.severity,retryable:e.retryable,source:n.value,scope:s.value,subject:u.value,occurredAt:e.occurredAt};return b!==void 0&&(f.attempt=b),E!==void 0&&(f.evidence=E),{ok:!0,value:f}}function Ee(e){let r=L(e.code),t=te(e);return{errorId:e.errorId,code:r.code,category:r.category,retryable:r.retryable,displayTone:r.displayTone,message:{titleKey:r.publicMessage.titleKey,bodyKey:r.publicMessage.bodyKey,...Object.keys(t).length===0?{}:{params:t}},actionHints:r.actionHints.map(n=>n.type==="reconnect"&&e.subject.connectionId!==void 0?{...n,connectionId:e.subject.connectionId}:{...n})}}function be(e){let r=L(e.code),t={errorId:e.errorId,code:r.code,category:r.category,retryable:r.retryable,repairability:r.repairability,scope:e.scope,subject:{...e.subject}};return e.evidence!==void 0&&(t.evidence=ne(e.evidence)),t}function o(e,r){return{code:e,category:r.category,severity:r.severity,retryable:r.retryable,displayTone:r.displayTone,publicMessage:{titleKey:r.titleKey,bodyKey:r.bodyKey},actionHints:r.actionHints,repairability:r.repairability,sentryDiagnostics:{logs:"always",issues:r.issues}}}function A(e,r){return{category:"auth",severity:"warning",retryable:!1,displayTone:"warning",titleKey:e,bodyKey:r,actionHints:[],repairability:"user_action",issues:"never"}}function d(e,r){return{category:"auth",severity:"warning",retryable:!1,displayTone:"warning",titleKey:e,bodyKey:r,actionHints:[{type:"reconnect"}],repairability:"connection_reauth",issues:"never"}}function a(e,r){return{category:"validation",severity:"warning",retryable:!1,displayTone:"warning",titleKey:e,bodyKey:r,actionHints:[{type:"edit_flow"}],repairability:"edit_flow",issues:"never"}}function m(e,r){return{category:"provider",severity:"warning",retryable:!0,displayTone:"warning",titleKey:e,bodyKey:r,actionHints:[{type:"retry"}],repairability:"retryable",issues:"never"}}function y(e,r){return{category:"runtime",severity:"error",retryable:!0,displayTone:"error",titleKey:e,bodyKey:r,actionHints:[{type:"retry"}],repairability:"retryable",issues:"always"}}function I(e,r){return{category:"runtime",severity:"error",retryable:!1,displayTone:"error",titleKey:e,bodyKey:r,actionHints:[{type:"contact_support"}],repairability:"internal_only",issues:"always"}}function N(e,r){return{category:"canceled",severity:"warning",retryable:!1,displayTone:"neutral",titleKey:e,bodyKey:r,actionHints:[],repairability:"none",issues:"never"}}function U(e){return{...e,publicMessage:{...e.publicMessage},actionHints:e.actionHints.map(r=>({...r})),sentryDiagnostics:{...e.sentryDiagnostics}}}function F(e){return{project:h.has(e.project)?e.project:"ablehi-server",component:l(e.component,"unknown")}}function H(e){if(!c(e))return i("digest source must be a JSON object");let r=g(e,["project","component"]);return r!==void 0?i(`digest source does not accept the "${r}" field`):de(e.project)?typeof e.component!="string"||e.component.length===0?i("digest source component must be a non-empty string"):{ok:!0,value:{project:e.project,component:e.component}}:i("digest source project is invalid")}function K(e){return w.has(e)?e:"native_runtime"}function V(e){return ue(e)?{ok:!0,value:e}:i("digest scope is invalid")}function B(e){let r={};for(let t of S){let n=e[t];typeof n=="string"&&n.length>0&&(r[t]=l(n,n))}return r}function q(e){let r={};for(let t of M){let n=e[t];n!==void 0&&(r[t]=n)}return r}function G(e){if(!c(e))return i("digest subject must be a JSON object");let r=g(e,S);if(r!==void 0)return i(`digest subject does not accept the "${r}" field`);let t={};for(let n of S){let s=e[n];if(s!==void 0){if(typeof s!="string"||s.length===0)return i(`digest subject ${n} must be a non-empty string`);t[n]=s}}return{ok:!0,value:t}}function W(e){if(!(e===void 0||typeof e.number!="number"||!Number.isInteger(e.number)||e.number<=0))return{number:e.number}}function X(e){if(!c(e))return i("digest attempt must be a JSON object");let r=g(e,["number"]);return r!==void 0?i(`digest attempt does not accept the "${r}" field`):typeof e.number!="number"||!Number.isInteger(e.number)||e.number<=0?i("digest attempt number must be a positive integer"):{ok:!0,value:{number:e.number}}}function z(e){if(!c(e))return;let r={},t=$(e.issues);t!==void 0&&(r.issues=t);let n=Q(e.provider);return n!==void 0&&(r.provider=n),e.truncated===!0&&(r.truncated=!0),Object.keys(r).length===0?void 0:r}function J(e){if(!c(e))return i("digest evidence must be a JSON object");let r=g(e,["issues","provider","truncated"]);if(r!==void 0)return i(`digest evidence does not accept the "${r}" field`);let t={};if(e.issues!==void 0){let n=Y(e.issues);if(!n.ok)return n;t.issues=n.value}if(e.provider!==void 0){let n=Z(e.provider);if(!n.ok)return n;t.provider=n.value}if(e.truncated!==void 0){if(e.truncated!==!0)return i("digest evidence truncated must be true when present");t.truncated=!0}return{ok:!0,value:t}}function $(e){if(!Array.isArray(e))return;let r=[];for(let t of e.slice(0,10)){if(!c(t)||typeof t.code!="string")continue;let n={code:l(t.code,"issue")};if(Array.isArray(t.path)&&(n.path=t.path.filter(s=>typeof s=="string"&&s.length>0).slice(0,8)),typeof t.messageKey=="string"&&t.messageKey.length>0&&(n.messageKey=l(t.messageKey,t.messageKey)),c(t.params)){let s=ie(t.params);s!==void 0&&(n.params=s)}r.push(n)}return r.length===0?void 0:r}function Y(e){if(!Array.isArray(e))return i("digest evidence issues must be an array");if(e.length>10)return i("digest evidence issues exceeds the item limit");let r=[];for(let t of e){if(!c(t))return i("digest evidence issue must be a JSON object");let n=g(t,["code","path","messageKey","params"]);if(n!==void 0)return i(`digest evidence issue does not accept the "${n}" field`);if(typeof t.code!="string"||t.code.length===0)return i("digest evidence issue code must be a non-empty string");let s={code:t.code};if(t.path!==void 0){if(!Array.isArray(t.path)||t.path.some(u=>typeof u!="string"||u.length===0))return i("digest evidence issue path must be a string array");s.path=[...t.path]}if(t.messageKey!==void 0){if(typeof t.messageKey!="string"||t.messageKey.length===0)return i("digest evidence issue messageKey must be a non-empty string");s.messageKey=t.messageKey}if(t.params!==void 0){if(!c(t.params)||!se(t.params))return i("digest evidence issue params must be scalar");s.params={...t.params}}r.push(s)}return{ok:!0,value:r}}function Q(e){if(!c(e))return;let r={};typeof e.httpStatus=="number"&&Number.isInteger(e.httpStatus)&&(r.httpStatus=e.httpStatus),typeof e.effectiveStatus=="string"&&e.effectiveStatus.length>0&&(r.effectiveStatus=l(e.effectiveStatus,e.effectiveStatus)),typeof e.providerCode=="string"&&e.providerCode.length>0&&(r.providerCode=l(e.providerCode,e.providerCode)),typeof e.requestId=="string"&&e.requestId.length>0&&(r.requestId=l(e.requestId,e.requestId));let t=ee(e.responseHeaders);return t!==void 0&&(r.responseHeaders=t),e.truncated===!0&&(r.truncated=!0),Object.keys(r).length===0?void 0:r}function Z(e){if(!c(e))return i("digest provider evidence must be a JSON object");let r=g(e,["httpStatus","effectiveStatus","providerCode","requestId","responseHeaders","truncated"]);if(r!==void 0)return i(`digest provider evidence does not accept the "${r}" field`);let t={};if(e.httpStatus!==void 0){if(typeof e.httpStatus!="number"||!Number.isInteger(e.httpStatus))return i("digest provider httpStatus must be an integer");t.httpStatus=e.httpStatus}if(e.effectiveStatus!==void 0){if(typeof e.effectiveStatus!="string"||e.effectiveStatus.length===0)return i("digest provider effectiveStatus must be a non-empty string");t.effectiveStatus=e.effectiveStatus}if(e.providerCode!==void 0){if(typeof e.providerCode!="string"||e.providerCode.length===0)return i("digest provider providerCode must be a non-empty string");t.providerCode=e.providerCode}if(e.requestId!==void 0){if(typeof e.requestId!="string"||e.requestId.length===0)return i("digest provider requestId must be a non-empty string");t.requestId=e.requestId}if(e.responseHeaders!==void 0){let n=re(e.responseHeaders);if(!n.ok)return n;t.responseHeaders=n.value}if(e.truncated!==void 0){if(e.truncated!==!0)return i("digest provider truncated must be true when present");t.truncated=!0}return{ok:!0,value:t}}function ee(e){if(!c(e))return;let r={};for(let[t,n]of Object.entries(e)){let s=t.toLowerCase();O.has(s)&&typeof n=="string"&&(r[s]=l(n,n))}return Object.keys(r).length===0?void 0:r}function re(e){if(!c(e))return i("digest provider responseHeaders must be a JSON object");let r={};for(let[t,n]of Object.entries(e)){if(!O.has(t))return i(`digest provider responseHeaders does not accept "${t}"`);if(typeof n!="string")return i("digest provider responseHeaders values must be strings");r[t]=n}return{ok:!0,value:r}}function te(e){let r={},t=e.evidence?.issues?.length??0;t>0&&(r.issueCount=t);let n=e.evidence?.provider?.responseHeaders?.["retry-after"];return n!==void 0&&n.length>0&&(r.retryAfter=n),r}function ne(e){return{...e.issues===void 0?{}:{issues:e.issues.map(r=>({...r,...r.path===void 0?{}:{path:[...r.path]},...r.params===void 0?{}:{params:{...r.params}}}))},...e.provider===void 0?{}:{provider:{...e.provider,...e.provider.responseHeaders===void 0?{}:{responseHeaders:{...e.provider.responseHeaders}}}},...e.truncated===!0?{truncated:!0}:{}}}function oe(e){return P(e)?e:"1970-01-01T00:00:00.000Z"}function P(e){let r=Date.parse(e);return Number.isFinite(r)&&new Date(r).toISOString()===e}function l(e,r){let t=e.trim(),n=t.length===0?r:t;return n.length<=200?n:n.slice(0,200)}function ie(e){let r={};for(let[t,n]of Object.entries(e))(n===null||typeof n=="string"||typeof n=="number"||typeof n=="boolean")&&(r[t]=n);return Object.keys(r).length===0?void 0:r}function se(e){return Object.values(e).every(r=>r===null||typeof r=="string"||typeof r=="number"||typeof r=="boolean")}function ae(e){return`err_${ce(v(e))}`}function v(e){if(e===null||typeof e!="object")return JSON.stringify(e);if(Array.isArray(e))return`[${e.map(t=>v(t)).join(",")}]`;let r=e;return`{${Object.keys(r).filter(t=>r[t]!==void 0).sort().map(t=>`${JSON.stringify(t)}:${v(r[t])}`).join(",")}}`}function ce(e){let r=0xcbf29ce484222325n,t=0x100000001b3n,n=0xffffffffffffffffn;for(let s=0;s<e.length;s+=1)r^=BigInt(e.charCodeAt(s)),r=r*t&n;return r.toString(36)}function i(e){return{ok:!1,reason:e}}function c(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function g(e,r){return Object.keys(e).find(t=>!r.includes(t))}function de(e){return typeof e=="string"&&h.has(e)}function ue(e){return typeof e=="string"&&w.has(e)}function ye(e){return typeof e=="string"&&k.has(e)}function le(e){return typeof e=="string"&&j.has(e)}export{R as ABLEHI_ERROR_DIGEST_SCHEMA_VERSION,T as GENERIC_ERROR_CODE,ge as isAblehiErrorDigest,fe as listErrorRegistryEntries,L as lookupErrorRegistryEntry,pe as normalizeErrorDigest,x as parseAblehiErrorDigest,be as projectAgentErrorView,Ee as projectPublicErrorView};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ablehi/error-contract",
3
- "version": "0.0.2",
3
+ "version": "0.0.4",
4
4
  "description": "Ablehi normalized system error contract.",
5
5
  "license": "Apache-2.0",
6
6
  "publishConfig": {