@lssm/lib.support-bot 0.4.0 → 1.41.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/README.md +1 -1
  2. package/dist/bot/auto-responder.js +1 -2
  3. package/dist/bot/feedback-loop.js +1 -2
  4. package/dist/bot/tools.js +1 -2
  5. package/dist/index.js +1 -1
  6. package/dist/node_modules/zod/v4/classic/errors.js +1 -0
  7. package/dist/node_modules/zod/v4/classic/iso.js +1 -0
  8. package/dist/node_modules/zod/v4/classic/parse.js +1 -0
  9. package/dist/node_modules/zod/v4/classic/schemas.js +1 -0
  10. package/dist/node_modules/zod/v4/core/api.js +1 -0
  11. package/dist/node_modules/zod/v4/core/checks.js +1 -0
  12. package/dist/node_modules/zod/v4/core/core.js +1 -0
  13. package/dist/node_modules/zod/v4/core/doc.js +3 -0
  14. package/dist/node_modules/zod/v4/core/errors.js +1 -0
  15. package/dist/node_modules/zod/v4/core/json-schema-processors.js +1 -0
  16. package/dist/node_modules/zod/v4/core/parse.js +1 -0
  17. package/dist/node_modules/zod/v4/core/regexes.js +1 -0
  18. package/dist/node_modules/zod/v4/core/registries.js +1 -0
  19. package/dist/node_modules/zod/v4/core/schemas.js +18 -0
  20. package/dist/node_modules/zod/v4/core/to-json-schema.js +3 -0
  21. package/dist/node_modules/zod/v4/core/util.js +1 -0
  22. package/dist/node_modules/zod/v4/core/versions.js +1 -0
  23. package/dist/rag/ticket-resolver.js +1 -2
  24. package/dist/spec.js +1 -2
  25. package/dist/tickets/classifier.js +1 -2
  26. package/package.json +32 -18
  27. package/dist/ai-agent/dist/approval/index.js +0 -1
  28. package/dist/ai-agent/dist/approval/workflow.js +0 -1
  29. package/dist/ai-agent/dist/index.js +0 -1
  30. package/dist/ai-agent/dist/memory/in-memory.js +0 -1
  31. package/dist/ai-agent/dist/memory/index.js +0 -1
  32. package/dist/ai-agent/dist/memory/manager.js +0 -1
  33. package/dist/ai-agent/dist/runner.js +0 -1
  34. package/dist/ai-agent/dist/spec.js +0 -2
  35. package/dist/ai-agent/dist/spec.js.map +0 -1
  36. package/dist/ai-agent/dist/tools/executor.js +0 -1
  37. package/dist/ai-agent/dist/tools/index.js +0 -1
  38. package/dist/bot/auto-responder.d.ts +0 -26
  39. package/dist/bot/auto-responder.d.ts.map +0 -1
  40. package/dist/bot/auto-responder.js.map +0 -1
  41. package/dist/bot/feedback-loop.d.ts +0 -20
  42. package/dist/bot/feedback-loop.d.ts.map +0 -1
  43. package/dist/bot/feedback-loop.js.map +0 -1
  44. package/dist/bot/index.d.ts +0 -4
  45. package/dist/bot/tools.d.ts +0 -15
  46. package/dist/bot/tools.d.ts.map +0 -1
  47. package/dist/bot/tools.js.map +0 -1
  48. package/dist/index.d.ts +0 -8
  49. package/dist/rag/index.d.ts +0 -2
  50. package/dist/rag/ticket-resolver.d.ts +0 -25
  51. package/dist/rag/ticket-resolver.d.ts.map +0 -1
  52. package/dist/rag/ticket-resolver.js.map +0 -1
  53. package/dist/spec.d.ts +0 -13
  54. package/dist/spec.d.ts.map +0 -1
  55. package/dist/spec.js.map +0 -1
  56. package/dist/tickets/classifier.d.ts +0 -25
  57. package/dist/tickets/classifier.d.ts.map +0 -1
  58. package/dist/tickets/classifier.js.map +0 -1
  59. package/dist/tickets/index.d.ts +0 -2
  60. package/dist/types.d.ts +0 -76
  61. package/dist/types.d.ts.map +0 -1
package/README.md CHANGED
@@ -43,4 +43,4 @@ const outcome = await runner.run({
43
43
  });
44
44
  ```
45
45
 
46
- See `/packages/contractspec/examples/ai-support-bot` for an end-to-end integration with ticket ingestion, review queues, and analytics.
46
+ See `/packages/examples/ai-support-bot` for an end-to-end integration with ticket ingestion, review queues, and analytics.
@@ -15,5 +15,4 @@ ${this.renderCitations(t)}
15
15
  ${this.closing}
16
16
 
17
17
  — ContractSpec Support`;return this.buildDraft(e,t,n,r)}buildDraft(e,t,n,r){return{ticketId:e.id,subject:e.subject.startsWith(`Re:`)?e.subject:`Re: ${e.subject}`,body:r,confidence:Math.min(t.confidence,n.confidence),requiresEscalation:t.actions.some(e=>e.type===`escalate`)||!!n.escalationRequired,citations:t.citations}}renderCategoryIntro(e){switch(e.category){case`billing`:return`I understand billing issues can be stressful, so let me clarify the situation.`;case`technical`:return`I see you encountered a technical issue. Here is what happened and how to fix it.`;case`product`:return`Thanks for sharing feedback about the product. Here are the next steps.`;case`account`:return`Account access is critical, so let me walk you through the resolution.`;case`compliance`:return`Compliance questions require precision. See the policy-aligned answer below.`;default:return`Here is what we found after reviewing your request.`}}renderCitations(e){return e.citations.length?`References:\n${e.citations.map((e,t)=>`- ${e.label||`Source ${t+1}`}${e.url?` (${e.url})`:``}`).join(`
18
- `)}`:``}};export{e as AutoResponder};
19
- //# sourceMappingURL=auto-responder.js.map
18
+ `)}`:``}};export{e as AutoResponder};
@@ -1,3 +1,2 @@
1
1
  var e=class{history=[];responseTimes=new Map;recordResolution(e,t){this.history.push(e),t!=null&&this.responseTimes.set(e.ticket.id,t)}metrics(){let e=this.history.length,t=this.history.filter(e=>!e.resolution.actions.some(e=>e.type===`escalate`)).length,n=e-t,r=e===0?0:this.history.reduce((e,t)=>e+t.resolution.confidence,0)/e,i=this.responseTimes.size===0?0:[...this.responseTimes.values()].reduce((e,t)=>e+t,0)/this.responseTimes.size;return{totalTickets:e,autoResolved:t,escalated:n,avgConfidence:Number(r.toFixed(2)),avgResponseTimeMs:Math.round(i)}}feedbackSummary(e=5){let t=this.history.slice(-e);return t.length?t.map(e=>{let t=e.resolution.actions.some(e=>e.type===`escalate`)?`Escalated`:`Auto-resolved`;return`${e.ticket.subject} – ${t} (confidence: ${e.resolution.confidence})`}).join(`
2
- `):`No feedback recorded yet.`}};export{e as SupportFeedbackLoop};
3
- //# sourceMappingURL=feedback-loop.js.map
2
+ `):`No feedback recorded yet.`}};export{e as SupportFeedbackLoop};
package/dist/bot/tools.js CHANGED
@@ -1,2 +1 @@
1
- function e(e){return[{definition:{name:`support_classify_ticket`,description:`Classify a ticket for priority, sentiment, and category`,inputSchema:{type:`object`,required:[`ticket`],properties:{ticket:t}}},handler:async t=>{let r=n(t),i=await e.classifier.classify(r);return{content:JSON.stringify(i),metadata:{ticketId:r.id}}}},{definition:{name:`support_resolve_ticket`,description:`Generate a knowledge-grounded resolution for a ticket`,inputSchema:{type:`object`,required:[`ticket`],properties:{ticket:t}}},handler:async t=>{let r=n(t),i=await e.resolver.resolve(r);return{content:JSON.stringify(i),metadata:{ticketId:r.id}}}},{definition:{name:`support_draft_response`,description:`Draft a user-facing reply based on resolution + classification`,inputSchema:{type:`object`,required:[`ticket`,`resolution`,`classification`],properties:{ticket:t,resolution:{type:`object`},classification:{type:`object`}}}},handler:async t=>{let a=n(t),o=r(t),s=i(t);if(!o||!s)throw Error(`resolution and classification are required`);let c=await e.responder.draft(a,o,s);return{content:JSON.stringify(c),metadata:{ticketId:a.id}}}}]}const t={type:`object`,required:[`id`,`subject`,`body`,`channel`],properties:{id:{type:`string`},subject:{type:`string`},body:{type:`string`},channel:{type:`string`,enum:[`email`,`chat`,`phone`,`portal`]},customerName:{type:`string`},customerEmail:{type:`string`},metadata:{type:`object`}}};function n(e){if(!e||typeof e!=`object`||!(`ticket`in e))throw Error(`Input must include ticket`);let t=e.ticket;if(!t?.id)throw Error(`Ticket is missing id`);return t}function r(e){if(!(!e||typeof e!=`object`||!(`resolution`in e)))return e.resolution}function i(e){if(!(!e||typeof e!=`object`||!(`classification`in e)))return e.classification}export{e as createSupportTools};
2
- //# sourceMappingURL=tools.js.map
1
+ import{_enum as e,array as t,boolean as n,number as r,object as i,record as a,string as o}from"../node_modules/zod/v4/classic/schemas.js";const s=i({id:o(),subject:o(),body:o(),channel:e([`email`,`chat`,`phone`,`portal`]),customerName:o().optional(),customerEmail:o().optional(),metadata:i().optional()}),c=i({label:o(),url:o().optional(),snippet:o().optional(),score:r().optional()}),l=i({type:e([`respond`,`escalate`,`refund`,`manual`]),label:o(),payload:a(o(),o())}),u=i({ticketId:o(),answer:o(),confidence:r(),citations:c.array(),actions:l.array(),escalationReason:o().optional(),knowledgeUpdates:t(o()).optional()}),d=i({ticketId:o(),category:e([`billing`,`technical`,`product`,`account`,`compliance`,`other`]),priority:e([`urgent`,`high`,`medium`,`low`]),sentiment:e([`positive`,`neutral`,`negative`,`frustrated`]),intents:t(o()),tags:t(o()),confidence:r(),escalationRequired:n().optional()});function f(e){if(!e||typeof e!=`object`||!(`ticket`in e))throw Error(`Input must include ticket`);let t=e.ticket;if(!t?.id)throw Error(`Ticket is missing id`);return t}function p(e){if(!(!e||typeof e!=`object`||!(`resolution`in e)))return e.resolution}function m(e){if(!(!e||typeof e!=`object`||!(`classification`in e)))return e.classification}function h(e){return[{title:`support_classify_ticket`,description:`Classify a ticket for priority, sentiment, and category`,inputSchema:i({ticket:s}),execute:async t=>{let n=f(t),r=await e.classifier.classify(n);return{content:JSON.stringify(r),metadata:{ticketId:n.id}}}},{title:`support_resolve_ticket`,description:`Generate a knowledge-grounded resolution for a ticket`,inputSchema:i({ticket:s}),execute:async t=>{let n=f(t),r=await e.resolver.resolve(n);return{content:JSON.stringify(r),metadata:{ticketId:n.id}}}},{title:`support_draft_response`,description:`Draft a user-facing reply based on resolution + classification`,inputSchema:i({ticket:s,resolution:u,classification:d}),execute:async t=>{let n=f(t),r=p(t),i=m(t);if(!r||!i)throw Error(`resolution and classification are required`);let a=await e.responder.draft(n,r,i);return{content:JSON.stringify(a),metadata:{ticketId:n.id}}}}]}export{h as createSupportTools};
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import{defineSupportBot as e}from"./spec.js";import{TicketResolver as t}from"./rag/ticket-resolver.js";import{TicketClassifier as n}from"./tickets/classifier.js";import{AutoResponder as r}from"./bot/auto-responder.js";import{SupportFeedbackLoop as i}from"./bot/feedback-loop.js";import{createSupportTools as a}from"./bot/tools.js";export{r as AutoResponder,i as SupportFeedbackLoop,n as TicketClassifier,t as TicketResolver,a as createSupportTools,e as defineSupportBot};
1
+ import{defineSupportBot as e}from"./spec.js";import{TicketResolver as t}from"./rag/ticket-resolver.js";import{TicketClassifier as n}from"./tickets/classifier.js";import{AutoResponder as r}from"./bot/auto-responder.js";import{SupportFeedbackLoop as i}from"./bot/feedback-loop.js";import{createSupportTools as a}from"./bot/tools.js";import"./bot/index.js";export{r as AutoResponder,i as SupportFeedbackLoop,n as TicketClassifier,t as TicketResolver,a as createSupportTools,e as defineSupportBot};
@@ -0,0 +1 @@
1
+ import{$constructor as e}from"../core/core.js";import{jsonStringifyReplacer as t}from"../core/util.js";import{$ZodError as n,flattenError as r,formatError as i}from"../core/errors.js";const a=(e,a)=>{n.init(e,a),e.name=`ZodError`,Object.defineProperties(e,{format:{value:t=>i(e,t)},flatten:{value:t=>r(e,t)},addIssue:{value:n=>{e.issues.push(n),e.message=JSON.stringify(e.issues,t,2)}},addIssues:{value:n=>{e.issues.push(...n),e.message=JSON.stringify(e.issues,t,2)}},isEmpty:{get(){return e.issues.length===0}}})};e(`ZodError`,a);const o=e(`ZodError`,a,{Parent:Error});export{o as ZodRealError};
@@ -0,0 +1 @@
1
+ import{$constructor as e}from"../core/core.js";import{$ZodISODate as t,$ZodISODateTime as n,$ZodISODuration as r,$ZodISOTime as i}from"../core/schemas.js";import{_isoDate as a,_isoDateTime as o,_isoDuration as s,_isoTime as c}from"../core/api.js";import{ZodStringFormat as l}from"./schemas.js";const u=e(`ZodISODateTime`,(e,t)=>{n.init(e,t),l.init(e,t)});function d(e){return o(u,e)}const f=e(`ZodISODate`,(e,n)=>{t.init(e,n),l.init(e,n)});function p(e){return a(f,e)}const m=e(`ZodISOTime`,(e,t)=>{i.init(e,t),l.init(e,t)});function h(e){return c(m,e)}const g=e(`ZodISODuration`,(e,t)=>{r.init(e,t),l.init(e,t)});function _(e){return s(g,e)}export{p as date,d as datetime,_ as duration,h as time};
@@ -0,0 +1 @@
1
+ import{_decode as e,_decodeAsync as t,_encode as n,_encodeAsync as r,_parse as i,_parseAsync as a,_safeDecode as o,_safeDecodeAsync as s,_safeEncode as c,_safeEncodeAsync as l,_safeParse as u,_safeParseAsync as d}from"../core/parse.js";import{ZodRealError as f}from"./errors.js";const p=i(f),m=a(f),h=u(f),g=d(f),_=n(f),v=e(f),y=r(f),b=t(f),x=c(f),S=o(f),C=l(f),w=s(f);export{v as decode,b as decodeAsync,_ as encode,y as encodeAsync,p as parse,m as parseAsync,S as safeDecode,w as safeDecodeAsync,x as safeEncode,C as safeEncodeAsync,h as safeParse,g as safeParseAsync};
@@ -0,0 +1 @@
1
+ import{$ZodEncodeError as e,$constructor as t}from"../core/core.js";import{clone as n,defineLazy as r,extend as i,issue as a,merge as o,mergeDefs as ee,normalizeParams as s,omit as c,partial as te,pick as ne,required as re,safeExtend as ie,shallowClone as l}from"../core/util.js";import{$ZodArray as ae,$ZodBase64 as oe,$ZodBase64URL as se,$ZodBoolean as ce,$ZodCIDRv4 as le,$ZodCIDRv6 as ue,$ZodCUID as de,$ZodCUID2 as fe,$ZodCatch as pe,$ZodCustom as me,$ZodDefault as he,$ZodE164 as ge,$ZodEmail as _e,$ZodEmoji as ve,$ZodEnum as ye,$ZodGUID as be,$ZodIPv4 as xe,$ZodIPv6 as Se,$ZodIntersection as Ce,$ZodJWT as we,$ZodKSUID as Te,$ZodNanoID as Ee,$ZodNever as De,$ZodNonOptional as Oe,$ZodNullable as u,$ZodNumber as d,$ZodNumberFormat as f,$ZodObjectJIT as p,$ZodOptional as m,$ZodPipe as h,$ZodPrefault as g,$ZodReadonly as _,$ZodRecord as v,$ZodString as y,$ZodStringFormat as b,$ZodTransform as x,$ZodType as S,$ZodULID as C,$ZodURL as w,$ZodUUID as T,$ZodUnion as ke,$ZodUnknown as Ae,$ZodXID as je}from"../core/schemas.js";import{globalRegistry as E}from"../core/registries.js";import{_array as Me,_base64 as Ne,_base64url as Pe,_boolean as Fe,_cidrv4 as Ie,_cidrv6 as Le,_cuid as Re,_cuid2 as ze,_e164 as Be,_email as Ve,_emoji as He,_endsWith as Ue,_gt as D,_gte as O,_guid as k,_includes as We,_int as Ge,_ipv4 as Ke,_ipv6 as qe,_jwt as Je,_ksuid as Ye,_length as A,_lowercase as Xe,_lt as j,_lte as M,_maxLength as N,_minLength as P,_multipleOf as F,_nanoid as Ze,_never as Qe,_normalize as $e,_number as et,_overwrite as tt,_refine as nt,_regex as rt,_slugify as it,_startsWith as at,_string as ot,_superRefine as st,_toLowerCase as ct,_toUpperCase as lt,_trim as ut,_ulid as dt,_unknown as ft,_uppercase as pt,_url as mt,_uuid as ht,_uuidv4 as gt,_uuidv6 as _t,_uuidv7 as vt,_xid as yt,describe as bt,meta as xt}from"../core/api.js";import{createStandardJSONSchemaMethod as I,createToJSONSchemaMethod as St}from"../core/to-json-schema.js";import{arrayProcessor as Ct,booleanProcessor as wt,catchProcessor as Tt,customProcessor as Et,defaultProcessor as Dt,enumProcessor as Ot,intersectionProcessor as L,neverProcessor as kt,nonoptionalProcessor as At,nullableProcessor as jt,numberProcessor as Mt,objectProcessor as Nt,optionalProcessor as Pt,pipeProcessor as Ft,prefaultProcessor as It,readonlyProcessor as Lt,recordProcessor as Rt,stringProcessor as zt,transformProcessor as Bt,unionProcessor as Vt,unknownProcessor as Ht}from"../core/json-schema-processors.js";import{date as Ut,datetime as Wt,duration as Gt,time as Kt}from"./iso.js";import{decode as qt,decodeAsync as Jt,encode as Yt,encodeAsync as Xt,parse as Zt,parseAsync as Qt,safeDecode as $t,safeDecodeAsync as en,safeEncode as tn,safeEncodeAsync as nn,safeParse as rn,safeParseAsync as an}from"./parse.js";const R=t(`ZodType`,(e,t)=>(S.init(e,t),Object.assign(e[`~standard`],{jsonSchema:{input:I(e,`input`),output:I(e,`output`)}}),e.toJSONSchema=St(e,{}),e.def=t,e.type=t.type,Object.defineProperty(e,`_def`,{value:t}),e.check=(...n)=>e.clone(ee(t,{checks:[...t.checks??[],...n.map(e=>typeof e==`function`?{_zod:{check:e,def:{check:`custom`},onattach:[]}}:e)]})),e.clone=(t,r)=>n(e,t,r),e.brand=()=>e,e.register=((t,n)=>(t.add(e,n),e)),e.parse=(t,n)=>Zt(e,t,n,{callee:e.parse}),e.safeParse=(t,n)=>rn(e,t,n),e.parseAsync=async(t,n)=>Qt(e,t,n,{callee:e.parseAsync}),e.safeParseAsync=async(t,n)=>an(e,t,n),e.spa=e.safeParseAsync,e.encode=(t,n)=>Yt(e,t,n),e.decode=(t,n)=>qt(e,t,n),e.encodeAsync=async(t,n)=>Xt(e,t,n),e.decodeAsync=async(t,n)=>Jt(e,t,n),e.safeEncode=(t,n)=>tn(e,t,n),e.safeDecode=(t,n)=>$t(e,t,n),e.safeEncodeAsync=async(t,n)=>nn(e,t,n),e.safeDecodeAsync=async(t,n)=>en(e,t,n),e.refine=(t,n)=>e.check(tr(t,n)),e.superRefine=t=>e.check(nr(t)),e.overwrite=t=>e.check(tt(t)),e.optional=()=>X(e),e.nullable=()=>Z(e),e.nullish=()=>X(Z(e)),e.nonoptional=t=>Jn(e,t),e.array=()=>K(e),e.or=t=>In([e,t]),e.and=t=>Rn(e,t),e.transform=t=>$(e,Hn(t)),e.default=t=>Gn(e,t),e.prefault=t=>qn(e,t),e.catch=t=>Xn(e,t),e.pipe=t=>$(e,t),e.readonly=()=>$n(e),e.describe=t=>{let n=e.clone();return E.add(n,{description:t}),n},Object.defineProperty(e,`description`,{get(){return E.get(e)?.description},configurable:!0}),e.meta=(...t)=>{if(t.length===0)return E.get(e);let n=e.clone();return E.add(n,t[0]),n},e.isOptional=()=>e.safeParse(void 0).success,e.isNullable=()=>e.safeParse(null).success,e)),z=t(`_ZodString`,(e,t)=>{y.init(e,t),R.init(e,t),e._zod.processJSONSchema=(t,n,r)=>zt(e,t,n,r);let n=e._zod.bag;e.format=n.format??null,e.minLength=n.minimum??null,e.maxLength=n.maximum??null,e.regex=(...t)=>e.check(rt(...t)),e.includes=(...t)=>e.check(We(...t)),e.startsWith=(...t)=>e.check(at(...t)),e.endsWith=(...t)=>e.check(Ue(...t)),e.min=(...t)=>e.check(P(...t)),e.max=(...t)=>e.check(N(...t)),e.length=(...t)=>e.check(A(...t)),e.nonempty=(...t)=>e.check(P(1,...t)),e.lowercase=t=>e.check(Xe(t)),e.uppercase=t=>e.check(pt(t)),e.trim=()=>e.check(ut()),e.normalize=(...t)=>e.check($e(...t)),e.toLowerCase=()=>e.check(ct()),e.toUpperCase=()=>e.check(lt()),e.slugify=()=>e.check(it())}),on=t(`ZodString`,(e,t)=>{y.init(e,t),z.init(e,t),e.email=t=>e.check(Ve(cn,t)),e.url=t=>e.check(mt(ln,t)),e.jwt=t=>e.check(Je(wn,t)),e.emoji=t=>e.check(He(un,t)),e.guid=t=>e.check(k(V,t)),e.uuid=t=>e.check(ht(H,t)),e.uuidv4=t=>e.check(gt(H,t)),e.uuidv6=t=>e.check(_t(H,t)),e.uuidv7=t=>e.check(vt(H,t)),e.nanoid=t=>e.check(Ze(dn,t)),e.guid=t=>e.check(k(V,t)),e.cuid=t=>e.check(Re(fn,t)),e.cuid2=t=>e.check(ze(pn,t)),e.ulid=t=>e.check(dt(mn,t)),e.base64=t=>e.check(Ne(xn,t)),e.base64url=t=>e.check(Pe(Sn,t)),e.xid=t=>e.check(yt(hn,t)),e.ksuid=t=>e.check(Ye(gn,t)),e.ipv4=t=>e.check(Ke(_n,t)),e.ipv6=t=>e.check(qe(vn,t)),e.cidrv4=t=>e.check(Ie(yn,t)),e.cidrv6=t=>e.check(Le(bn,t)),e.e164=t=>e.check(Be(Cn,t)),e.datetime=t=>e.check(Wt(t)),e.date=t=>e.check(Ut(t)),e.time=t=>e.check(Kt(t)),e.duration=t=>e.check(Gt(t))});function sn(e){return ot(on,e)}const B=t(`ZodStringFormat`,(e,t)=>{b.init(e,t),z.init(e,t)}),cn=t(`ZodEmail`,(e,t)=>{_e.init(e,t),B.init(e,t)}),V=t(`ZodGUID`,(e,t)=>{be.init(e,t),B.init(e,t)}),H=t(`ZodUUID`,(e,t)=>{T.init(e,t),B.init(e,t)}),ln=t(`ZodURL`,(e,t)=>{w.init(e,t),B.init(e,t)}),un=t(`ZodEmoji`,(e,t)=>{ve.init(e,t),B.init(e,t)}),dn=t(`ZodNanoID`,(e,t)=>{Ee.init(e,t),B.init(e,t)}),fn=t(`ZodCUID`,(e,t)=>{de.init(e,t),B.init(e,t)}),pn=t(`ZodCUID2`,(e,t)=>{fe.init(e,t),B.init(e,t)}),mn=t(`ZodULID`,(e,t)=>{C.init(e,t),B.init(e,t)}),hn=t(`ZodXID`,(e,t)=>{je.init(e,t),B.init(e,t)}),gn=t(`ZodKSUID`,(e,t)=>{Te.init(e,t),B.init(e,t)}),_n=t(`ZodIPv4`,(e,t)=>{xe.init(e,t),B.init(e,t)}),vn=t(`ZodIPv6`,(e,t)=>{Se.init(e,t),B.init(e,t)}),yn=t(`ZodCIDRv4`,(e,t)=>{le.init(e,t),B.init(e,t)}),bn=t(`ZodCIDRv6`,(e,t)=>{ue.init(e,t),B.init(e,t)}),xn=t(`ZodBase64`,(e,t)=>{oe.init(e,t),B.init(e,t)}),Sn=t(`ZodBase64URL`,(e,t)=>{se.init(e,t),B.init(e,t)}),Cn=t(`ZodE164`,(e,t)=>{ge.init(e,t),B.init(e,t)}),wn=t(`ZodJWT`,(e,t)=>{we.init(e,t),B.init(e,t)}),U=t(`ZodNumber`,(e,t)=>{d.init(e,t),R.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Mt(e,t,n,r),e.gt=(t,n)=>e.check(D(t,n)),e.gte=(t,n)=>e.check(O(t,n)),e.min=(t,n)=>e.check(O(t,n)),e.lt=(t,n)=>e.check(j(t,n)),e.lte=(t,n)=>e.check(M(t,n)),e.max=(t,n)=>e.check(M(t,n)),e.int=t=>e.check(W(t)),e.safe=t=>e.check(W(t)),e.positive=t=>e.check(D(0,t)),e.nonnegative=t=>e.check(O(0,t)),e.negative=t=>e.check(j(0,t)),e.nonpositive=t=>e.check(M(0,t)),e.multipleOf=(t,n)=>e.check(F(t,n)),e.step=(t,n)=>e.check(F(t,n)),e.finite=()=>e;let n=e._zod.bag;e.minValue=Math.max(n.minimum??-1/0,n.exclusiveMinimum??-1/0)??null,e.maxValue=Math.min(n.maximum??1/0,n.exclusiveMaximum??1/0)??null,e.isInt=(n.format??``).includes(`int`)||Number.isSafeInteger(n.multipleOf??.5),e.isFinite=!0,e.format=n.format??null});function Tn(e){return et(U,e)}const En=t(`ZodNumberFormat`,(e,t)=>{f.init(e,t),U.init(e,t)});function W(e){return Ge(En,e)}const Dn=t(`ZodBoolean`,(e,t)=>{ce.init(e,t),R.init(e,t),e._zod.processJSONSchema=(t,n,r)=>wt(e,t,n,r)});function On(e){return Fe(Dn,e)}const kn=t(`ZodUnknown`,(e,t)=>{Ae.init(e,t),R.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Ht(e,t,n,r)});function G(){return ft(kn)}const An=t(`ZodNever`,(e,t)=>{De.init(e,t),R.init(e,t),e._zod.processJSONSchema=(t,n,r)=>kt(e,t,n,r)});function jn(e){return Qe(An,e)}const Mn=t(`ZodArray`,(e,t)=>{ae.init(e,t),R.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Ct(e,t,n,r),e.element=t.element,e.min=(t,n)=>e.check(P(t,n)),e.nonempty=t=>e.check(P(1,t)),e.max=(t,n)=>e.check(N(t,n)),e.length=(t,n)=>e.check(A(t,n)),e.unwrap=()=>e.element});function K(e,t){return Me(Mn,e,t)}const Nn=t(`ZodObject`,(e,t)=>{p.init(e,t),R.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Nt(e,t,n,r),r(e,`shape`,()=>t.shape),e.keyof=()=>J(Object.keys(e._zod.def.shape)),e.catchall=t=>e.clone({...e._zod.def,catchall:t}),e.passthrough=()=>e.clone({...e._zod.def,catchall:G()}),e.loose=()=>e.clone({...e._zod.def,catchall:G()}),e.strict=()=>e.clone({...e._zod.def,catchall:jn()}),e.strip=()=>e.clone({...e._zod.def,catchall:void 0}),e.extend=t=>i(e,t),e.safeExtend=t=>ie(e,t),e.merge=t=>o(e,t),e.pick=t=>ne(e,t),e.omit=t=>c(e,t),e.partial=(...t)=>te(Y,e,t[0]),e.required=(...t)=>re(Q,e,t[0])});function Pn(e,t){return new Nn({type:`object`,shape:e??{},...s(t)})}const Fn=t(`ZodUnion`,(e,t)=>{ke.init(e,t),R.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Vt(e,t,n,r),e.options=t.options});function In(e,t){return new Fn({type:`union`,options:e,...s(t)})}const Ln=t(`ZodIntersection`,(e,t)=>{Ce.init(e,t),R.init(e,t),e._zod.processJSONSchema=(t,n,r)=>L(e,t,n,r)});function Rn(e,t){return new Ln({type:`intersection`,left:e,right:t})}const zn=t(`ZodRecord`,(e,t)=>{v.init(e,t),R.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Rt(e,t,n,r),e.keyType=t.keyType,e.valueType=t.valueType});function Bn(e,t,n){return new zn({type:`record`,keyType:e,valueType:t,...s(n)})}const q=t(`ZodEnum`,(e,t)=>{ye.init(e,t),R.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Ot(e,t,n,r),e.enum=t.entries,e.options=Object.values(t.entries);let n=new Set(Object.keys(t.entries));e.extract=(e,r)=>{let i={};for(let r of e)if(n.has(r))i[r]=t.entries[r];else throw Error(`Key ${r} not found in enum`);return new q({...t,checks:[],...s(r),entries:i})},e.exclude=(e,r)=>{let i={...t.entries};for(let t of e)if(n.has(t))delete i[t];else throw Error(`Key ${t} not found in enum`);return new q({...t,checks:[],...s(r),entries:i})}});function J(e,t){return new q({type:`enum`,entries:Array.isArray(e)?Object.fromEntries(e.map(e=>[e,e])):e,...s(t)})}const Vn=t(`ZodTransform`,(t,n)=>{x.init(t,n),R.init(t,n),t._zod.processJSONSchema=(e,n,r)=>Bt(t,e,n,r),t._zod.parse=(r,i)=>{if(i.direction===`backward`)throw new e(t.constructor.name);r.addIssue=e=>{if(typeof e==`string`)r.issues.push(a(e,r.value,n));else{let n=e;n.fatal&&(n.continue=!1),n.code??=`custom`,n.input??=r.value,n.inst??=t,r.issues.push(a(n))}};let o=n.transform(r.value,r);return o instanceof Promise?o.then(e=>(r.value=e,r)):(r.value=o,r)}});function Hn(e){return new Vn({type:`transform`,transform:e})}const Y=t(`ZodOptional`,(e,t)=>{m.init(e,t),R.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Pt(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function X(e){return new Y({type:`optional`,innerType:e})}const Un=t(`ZodNullable`,(e,t)=>{u.init(e,t),R.init(e,t),e._zod.processJSONSchema=(t,n,r)=>jt(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function Z(e){return new Un({type:`nullable`,innerType:e})}const Wn=t(`ZodDefault`,(e,t)=>{he.init(e,t),R.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Dt(e,t,n,r),e.unwrap=()=>e._zod.def.innerType,e.removeDefault=e.unwrap});function Gn(e,t){return new Wn({type:`default`,innerType:e,get defaultValue(){return typeof t==`function`?t():l(t)}})}const Kn=t(`ZodPrefault`,(e,t)=>{g.init(e,t),R.init(e,t),e._zod.processJSONSchema=(t,n,r)=>It(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function qn(e,t){return new Kn({type:`prefault`,innerType:e,get defaultValue(){return typeof t==`function`?t():l(t)}})}const Q=t(`ZodNonOptional`,(e,t)=>{Oe.init(e,t),R.init(e,t),e._zod.processJSONSchema=(t,n,r)=>At(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function Jn(e,t){return new Q({type:`nonoptional`,innerType:e,...s(t)})}const Yn=t(`ZodCatch`,(e,t)=>{pe.init(e,t),R.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Tt(e,t,n,r),e.unwrap=()=>e._zod.def.innerType,e.removeCatch=e.unwrap});function Xn(e,t){return new Yn({type:`catch`,innerType:e,catchValue:typeof t==`function`?t:()=>t})}const Zn=t(`ZodPipe`,(e,t)=>{h.init(e,t),R.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Ft(e,t,n,r),e.in=t.in,e.out=t.out});function $(e,t){return new Zn({type:`pipe`,in:e,out:t})}const Qn=t(`ZodReadonly`,(e,t)=>{_.init(e,t),R.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Lt(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function $n(e){return new Qn({type:`readonly`,innerType:e})}const er=t(`ZodCustom`,(e,t)=>{me.init(e,t),R.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Et(e,t,n,r)});function tr(e,t={}){return nt(er,e,t)}function nr(e){return st(e)}export{B as ZodStringFormat,J as _enum,K as array,On as boolean,Tn as number,Pn as object,Bn as record,sn as string};
@@ -0,0 +1 @@
1
+ import{issue as e,normalizeParams as t,slugify as n}from"./util.js";import{$ZodCheck as r,$ZodCheckEndsWith as i,$ZodCheckGreaterThan as a,$ZodCheckIncludes as ee,$ZodCheckLengthEquals as o,$ZodCheckLessThan as s,$ZodCheckLowerCase as te,$ZodCheckMaxLength as c,$ZodCheckMinLength as l,$ZodCheckMultipleOf as u,$ZodCheckOverwrite as d,$ZodCheckRegex as f,$ZodCheckStartsWith as p,$ZodCheckUpperCase as m}from"./checks.js";import{globalRegistry as h}from"./registries.js";function g(e,n){return new e({type:`string`,...t(n)})}function _(e,n){return new e({type:`string`,format:`email`,check:`string_format`,abort:!1,...t(n)})}function v(e,n){return new e({type:`string`,format:`guid`,check:`string_format`,abort:!1,...t(n)})}function y(e,n){return new e({type:`string`,format:`uuid`,check:`string_format`,abort:!1,...t(n)})}function b(e,n){return new e({type:`string`,format:`uuid`,check:`string_format`,abort:!1,version:`v4`,...t(n)})}function x(e,n){return new e({type:`string`,format:`uuid`,check:`string_format`,abort:!1,version:`v6`,...t(n)})}function S(e,n){return new e({type:`string`,format:`uuid`,check:`string_format`,abort:!1,version:`v7`,...t(n)})}function C(e,n){return new e({type:`string`,format:`url`,check:`string_format`,abort:!1,...t(n)})}function w(e,n){return new e({type:`string`,format:`emoji`,check:`string_format`,abort:!1,...t(n)})}function T(e,n){return new e({type:`string`,format:`nanoid`,check:`string_format`,abort:!1,...t(n)})}function E(e,n){return new e({type:`string`,format:`cuid`,check:`string_format`,abort:!1,...t(n)})}function D(e,n){return new e({type:`string`,format:`cuid2`,check:`string_format`,abort:!1,...t(n)})}function O(e,n){return new e({type:`string`,format:`ulid`,check:`string_format`,abort:!1,...t(n)})}function k(e,n){return new e({type:`string`,format:`xid`,check:`string_format`,abort:!1,...t(n)})}function A(e,n){return new e({type:`string`,format:`ksuid`,check:`string_format`,abort:!1,...t(n)})}function j(e,n){return new e({type:`string`,format:`ipv4`,check:`string_format`,abort:!1,...t(n)})}function M(e,n){return new e({type:`string`,format:`ipv6`,check:`string_format`,abort:!1,...t(n)})}function N(e,n){return new e({type:`string`,format:`cidrv4`,check:`string_format`,abort:!1,...t(n)})}function P(e,n){return new e({type:`string`,format:`cidrv6`,check:`string_format`,abort:!1,...t(n)})}function F(e,n){return new e({type:`string`,format:`base64`,check:`string_format`,abort:!1,...t(n)})}function I(e,n){return new e({type:`string`,format:`base64url`,check:`string_format`,abort:!1,...t(n)})}function L(e,n){return new e({type:`string`,format:`e164`,check:`string_format`,abort:!1,...t(n)})}function R(e,n){return new e({type:`string`,format:`jwt`,check:`string_format`,abort:!1,...t(n)})}function z(e,n){return new e({type:`string`,format:`datetime`,check:`string_format`,offset:!1,local:!1,precision:null,...t(n)})}function B(e,n){return new e({type:`string`,format:`date`,check:`string_format`,...t(n)})}function V(e,n){return new e({type:`string`,format:`time`,check:`string_format`,precision:null,...t(n)})}function H(e,n){return new e({type:`string`,format:`duration`,check:`string_format`,...t(n)})}function U(e,n){return new e({type:`number`,checks:[],...t(n)})}function ne(e,n){return new e({type:`number`,check:`number_format`,abort:!1,format:`safeint`,...t(n)})}function W(e,n){return new e({type:`boolean`,...t(n)})}function G(e){return new e({type:`unknown`})}function K(e,n){return new e({type:`never`,...t(n)})}function q(e,n){return new s({check:`less_than`,...t(n),value:e,inclusive:!1})}function J(e,n){return new s({check:`less_than`,...t(n),value:e,inclusive:!0})}function Y(e,n){return new a({check:`greater_than`,...t(n),value:e,inclusive:!1})}function X(e,n){return new a({check:`greater_than`,...t(n),value:e,inclusive:!0})}function Z(e,n){return new u({check:`multiple_of`,...t(n),value:e})}function re(e,n){return new c({check:`max_length`,...t(n),maximum:e})}function ie(e,n){return new l({check:`min_length`,...t(n),minimum:e})}function ae(e,n){return new o({check:`length_equals`,...t(n),length:e})}function oe(e,n){return new f({check:`string_format`,format:`regex`,...t(n),pattern:e})}function se(e){return new te({check:`string_format`,format:`lowercase`,...t(e)})}function ce(e){return new m({check:`string_format`,format:`uppercase`,...t(e)})}function le(e,n){return new ee({check:`string_format`,format:`includes`,...t(n),includes:e})}function ue(e,n){return new p({check:`string_format`,format:`starts_with`,...t(n),prefix:e})}function de(e,n){return new i({check:`string_format`,format:`ends_with`,...t(n),suffix:e})}function Q(e){return new d({check:`overwrite`,tx:e})}function fe(e){return Q(t=>t.normalize(e))}function pe(){return Q(e=>e.trim())}function $(){return Q(e=>e.toLowerCase())}function me(){return Q(e=>e.toUpperCase())}function he(){return Q(e=>n(e))}function ge(e,n,r){return new e({type:`array`,element:n,...t(r)})}function _e(e,n,r){return new e({type:`custom`,check:`custom`,fn:n,...t(r)})}function ve(t){let n=ye(r=>(r.addIssue=t=>{if(typeof t==`string`)r.issues.push(e(t,r.value,n._zod.def));else{let i=t;i.fatal&&(i.continue=!1),i.code??=`custom`,i.input??=r.value,i.inst??=n,i.continue??=!n._zod.def.abort,r.issues.push(e(i))}},t(r.value,r)));return n}function ye(e,n){let i=new r({check:`custom`,...t(n)});return i._zod.check=e,i}function be(e){let t=new r({check:`describe`});return t._zod.onattach=[t=>{let n=h.get(t)??{};h.add(t,{...n,description:e})}],t._zod.check=()=>{},t}function xe(e){let t=new r({check:`meta`});return t._zod.onattach=[t=>{let n=h.get(t)??{};h.add(t,{...n,...e})}],t._zod.check=()=>{},t}export{ge as _array,F as _base64,I as _base64url,W as _boolean,N as _cidrv4,P as _cidrv6,E as _cuid,D as _cuid2,L as _e164,_ as _email,w as _emoji,de as _endsWith,Y as _gt,X as _gte,v as _guid,le as _includes,ne as _int,j as _ipv4,M as _ipv6,B as _isoDate,z as _isoDateTime,H as _isoDuration,V as _isoTime,R as _jwt,A as _ksuid,ae as _length,se as _lowercase,q as _lt,J as _lte,re as _maxLength,ie as _minLength,Z as _multipleOf,T as _nanoid,K as _never,fe as _normalize,U as _number,Q as _overwrite,_e as _refine,oe as _regex,he as _slugify,ue as _startsWith,g as _string,ve as _superRefine,$ as _toLowerCase,me as _toUpperCase,pe as _trim,O as _ulid,G as _unknown,ce as _uppercase,C as _url,y as _uuid,b as _uuidv4,x as _uuidv6,S as _uuidv7,k as _xid,be as describe,xe as meta};
@@ -0,0 +1 @@
1
+ import{$constructor as e}from"./core.js";import{NUMBER_FORMAT_RANGES as t,escapeRegex as n,floatSafeRemainder as r,getLengthableOrigin as i,nullish as a}from"./util.js";import{integer as o,lowercase as s,uppercase as c}from"./regexes.js";const l=e(`$ZodCheck`,(e,t)=>{var n;e._zod??={},e._zod.def=t,(n=e._zod).onattach??(n.onattach=[])}),u={number:`number`,bigint:`bigint`,object:`date`},d=e(`$ZodCheckLessThan`,(e,t)=>{l.init(e,t);let n=u[typeof t.value];e._zod.onattach.push(e=>{let n=e._zod.bag,r=(t.inclusive?n.maximum:n.exclusiveMaximum)??1/0;t.value<r&&(t.inclusive?n.maximum=t.value:n.exclusiveMaximum=t.value)}),e._zod.check=r=>{(t.inclusive?r.value<=t.value:r.value<t.value)||r.issues.push({origin:n,code:`too_big`,maximum:t.value,input:r.value,inclusive:t.inclusive,inst:e,continue:!t.abort})}}),f=e(`$ZodCheckGreaterThan`,(e,t)=>{l.init(e,t);let n=u[typeof t.value];e._zod.onattach.push(e=>{let n=e._zod.bag,r=(t.inclusive?n.minimum:n.exclusiveMinimum)??-1/0;t.value>r&&(t.inclusive?n.minimum=t.value:n.exclusiveMinimum=t.value)}),e._zod.check=r=>{(t.inclusive?r.value>=t.value:r.value>t.value)||r.issues.push({origin:n,code:`too_small`,minimum:t.value,input:r.value,inclusive:t.inclusive,inst:e,continue:!t.abort})}}),p=e(`$ZodCheckMultipleOf`,(e,t)=>{l.init(e,t),e._zod.onattach.push(e=>{var n;(n=e._zod.bag).multipleOf??(n.multipleOf=t.value)}),e._zod.check=n=>{if(typeof n.value!=typeof t.value)throw Error(`Cannot mix number and bigint in multiple_of check.`);(typeof n.value==`bigint`?n.value%t.value===BigInt(0):r(n.value,t.value)===0)||n.issues.push({origin:typeof n.value,code:`not_multiple_of`,divisor:t.value,input:n.value,inst:e,continue:!t.abort})}}),m=e(`$ZodCheckNumberFormat`,(e,n)=>{l.init(e,n),n.format=n.format||`float64`;let r=n.format?.includes(`int`),i=r?`int`:`number`,[a,s]=t[n.format];e._zod.onattach.push(e=>{let t=e._zod.bag;t.format=n.format,t.minimum=a,t.maximum=s,r&&(t.pattern=o)}),e._zod.check=t=>{let o=t.value;if(r){if(!Number.isInteger(o)){t.issues.push({expected:i,format:n.format,code:`invalid_type`,continue:!1,input:o,inst:e});return}if(!Number.isSafeInteger(o)){o>0?t.issues.push({input:o,code:`too_big`,maximum:2**53-1,note:`Integers must be within the safe integer range.`,inst:e,origin:i,continue:!n.abort}):t.issues.push({input:o,code:`too_small`,minimum:-(2**53-1),note:`Integers must be within the safe integer range.`,inst:e,origin:i,continue:!n.abort});return}}o<a&&t.issues.push({origin:`number`,input:o,code:`too_small`,minimum:a,inclusive:!0,inst:e,continue:!n.abort}),o>s&&t.issues.push({origin:`number`,input:o,code:`too_big`,maximum:s,inst:e})}}),h=e(`$ZodCheckMaxLength`,(e,t)=>{var n;l.init(e,t),(n=e._zod.def).when??(n.when=e=>{let t=e.value;return!a(t)&&t.length!==void 0}),e._zod.onattach.push(e=>{let n=e._zod.bag.maximum??1/0;t.maximum<n&&(e._zod.bag.maximum=t.maximum)}),e._zod.check=n=>{let r=n.value;if(r.length<=t.maximum)return;let a=i(r);n.issues.push({origin:a,code:`too_big`,maximum:t.maximum,inclusive:!0,input:r,inst:e,continue:!t.abort})}}),g=e(`$ZodCheckMinLength`,(e,t)=>{var n;l.init(e,t),(n=e._zod.def).when??(n.when=e=>{let t=e.value;return!a(t)&&t.length!==void 0}),e._zod.onattach.push(e=>{let n=e._zod.bag.minimum??-1/0;t.minimum>n&&(e._zod.bag.minimum=t.minimum)}),e._zod.check=n=>{let r=n.value;if(r.length>=t.minimum)return;let a=i(r);n.issues.push({origin:a,code:`too_small`,minimum:t.minimum,inclusive:!0,input:r,inst:e,continue:!t.abort})}}),_=e(`$ZodCheckLengthEquals`,(e,t)=>{var n;l.init(e,t),(n=e._zod.def).when??(n.when=e=>{let t=e.value;return!a(t)&&t.length!==void 0}),e._zod.onattach.push(e=>{let n=e._zod.bag;n.minimum=t.length,n.maximum=t.length,n.length=t.length}),e._zod.check=n=>{let r=n.value,a=r.length;if(a===t.length)return;let o=i(r),s=a>t.length;n.issues.push({origin:o,...s?{code:`too_big`,maximum:t.length}:{code:`too_small`,minimum:t.length},inclusive:!0,exact:!0,input:n.value,inst:e,continue:!t.abort})}}),v=e(`$ZodCheckStringFormat`,(e,t)=>{var n,r;l.init(e,t),e._zod.onattach.push(e=>{let n=e._zod.bag;n.format=t.format,t.pattern&&(n.patterns??=new Set,n.patterns.add(t.pattern))}),t.pattern?(n=e._zod).check??(n.check=n=>{t.pattern.lastIndex=0,!t.pattern.test(n.value)&&n.issues.push({origin:`string`,code:`invalid_format`,format:t.format,input:n.value,...t.pattern?{pattern:t.pattern.toString()}:{},inst:e,continue:!t.abort})}):(r=e._zod).check??(r.check=()=>{})}),y=e(`$ZodCheckRegex`,(e,t)=>{v.init(e,t),e._zod.check=n=>{t.pattern.lastIndex=0,!t.pattern.test(n.value)&&n.issues.push({origin:`string`,code:`invalid_format`,format:`regex`,input:n.value,pattern:t.pattern.toString(),inst:e,continue:!t.abort})}}),b=e(`$ZodCheckLowerCase`,(e,t)=>{t.pattern??=s,v.init(e,t)}),x=e(`$ZodCheckUpperCase`,(e,t)=>{t.pattern??=c,v.init(e,t)}),S=e(`$ZodCheckIncludes`,(e,t)=>{l.init(e,t);let r=n(t.includes),i=new RegExp(typeof t.position==`number`?`^.{${t.position}}${r}`:r);t.pattern=i,e._zod.onattach.push(e=>{let t=e._zod.bag;t.patterns??=new Set,t.patterns.add(i)}),e._zod.check=n=>{n.value.includes(t.includes,t.position)||n.issues.push({origin:`string`,code:`invalid_format`,format:`includes`,includes:t.includes,input:n.value,inst:e,continue:!t.abort})}}),C=e(`$ZodCheckStartsWith`,(e,t)=>{l.init(e,t);let r=RegExp(`^${n(t.prefix)}.*`);t.pattern??=r,e._zod.onattach.push(e=>{let t=e._zod.bag;t.patterns??=new Set,t.patterns.add(r)}),e._zod.check=n=>{n.value.startsWith(t.prefix)||n.issues.push({origin:`string`,code:`invalid_format`,format:`starts_with`,prefix:t.prefix,input:n.value,inst:e,continue:!t.abort})}}),w=e(`$ZodCheckEndsWith`,(e,t)=>{l.init(e,t);let r=RegExp(`.*${n(t.suffix)}$`);t.pattern??=r,e._zod.onattach.push(e=>{let t=e._zod.bag;t.patterns??=new Set,t.patterns.add(r)}),e._zod.check=n=>{n.value.endsWith(t.suffix)||n.issues.push({origin:`string`,code:`invalid_format`,format:`ends_with`,suffix:t.suffix,input:n.value,inst:e,continue:!t.abort})}}),T=e(`$ZodCheckOverwrite`,(e,t)=>{l.init(e,t),e._zod.check=e=>{e.value=t.tx(e.value)}});export{l as $ZodCheck,w as $ZodCheckEndsWith,f as $ZodCheckGreaterThan,S as $ZodCheckIncludes,_ as $ZodCheckLengthEquals,d as $ZodCheckLessThan,b as $ZodCheckLowerCase,h as $ZodCheckMaxLength,g as $ZodCheckMinLength,p as $ZodCheckMultipleOf,m as $ZodCheckNumberFormat,T as $ZodCheckOverwrite,y as $ZodCheckRegex,C as $ZodCheckStartsWith,v as $ZodCheckStringFormat,x as $ZodCheckUpperCase};
@@ -0,0 +1 @@
1
+ Object.freeze({status:`aborted`});function e(e,t,n){function r(n,r){if(n._zod||Object.defineProperty(n,`_zod`,{value:{def:r,constr:o,traits:new Set},enumerable:!1}),n._zod.traits.has(e))return;n._zod.traits.add(e),t(n,r);let i=o.prototype,a=Object.keys(i);for(let e=0;e<a.length;e++){let t=a[e];t in n||(n[t]=i[t].bind(n))}}let i=n?.Parent??Object;class a extends i{}Object.defineProperty(a,`name`,{value:e});function o(e){var t;let i=n?.Parent?new a:this;r(i,e),(t=i._zod).deferred??(t.deferred=[]);for(let e of i._zod.deferred)e();return i}return Object.defineProperty(o,`init`,{value:r}),Object.defineProperty(o,Symbol.hasInstance,{value:t=>n?.Parent&&t instanceof n.Parent?!0:t?._zod?.traits?.has(e)}),Object.defineProperty(o,`name`,{value:e}),o}var t=class extends Error{constructor(){super(`Encountered Promise during synchronous parse. Use .parseAsync() instead.`)}},n=class extends Error{constructor(e){super(`Encountered unidirectional transform during encode: ${e}`),this.name=`ZodEncodeError`}};const r={};function i(e){return e&&Object.assign(r,e),r}export{t as $ZodAsyncError,n as $ZodEncodeError,e as $constructor,i as config,r as globalConfig};
@@ -0,0 +1,3 @@
1
+ var e=class{constructor(e=[]){this.content=[],this.indent=0,this&&(this.args=e)}indented(e){this.indent+=1,e(this),--this.indent}write(e){if(typeof e==`function`){e(this,{execution:`sync`}),e(this,{execution:`async`});return}let t=e.split(`
2
+ `).filter(e=>e),n=Math.min(...t.map(e=>e.length-e.trimStart().length)),r=t.map(e=>e.slice(n)).map(e=>` `.repeat(this.indent*2)+e);for(let e of r)this.content.push(e)}compile(){let e=Function,t=this?.args,n=[...(this?.content??[``]).map(e=>` ${e}`)];return new e(...t,n.join(`
3
+ `))}};export{e as Doc};
@@ -0,0 +1 @@
1
+ import{$constructor as e}from"./core.js";import{jsonStringifyReplacer as t}from"./util.js";const n=(e,n)=>{e.name=`$ZodError`,Object.defineProperty(e,`_zod`,{value:e._zod,enumerable:!1}),Object.defineProperty(e,`issues`,{value:n,enumerable:!1}),e.message=JSON.stringify(n,t,2),Object.defineProperty(e,`toString`,{value:()=>e.message,enumerable:!1})},r=e(`$ZodError`,n),i=e(`$ZodError`,n,{Parent:Error});function a(e,t=e=>e.message){let n={},r=[];for(let i of e.issues)i.path.length>0?(n[i.path[0]]=n[i.path[0]]||[],n[i.path[0]].push(t(i))):r.push(t(i));return{formErrors:r,fieldErrors:n}}function o(e,t=e=>e.message){let n={_errors:[]},r=e=>{for(let i of e.issues)if(i.code===`invalid_union`&&i.errors.length)i.errors.map(e=>r({issues:e}));else if(i.code===`invalid_key`)r({issues:i.issues});else if(i.code===`invalid_element`)r({issues:i.issues});else if(i.path.length===0)n._errors.push(t(i));else{let e=n,r=0;for(;r<i.path.length;){let n=i.path[r];r===i.path.length-1?(e[n]=e[n]||{_errors:[]},e[n]._errors.push(t(i))):e[n]=e[n]||{_errors:[]},e=e[n],r++}}};return r(e),n}export{r as $ZodError,i as $ZodRealError,a as flattenError,o as formatError};
@@ -0,0 +1 @@
1
+ import{getEnumValues as e}from"./util.js";import{process as t}from"./to-json-schema.js";const n={guid:`uuid`,url:`uri`,datetime:`date-time`,json_string:`json-string`,regex:``},r=(e,t,r,i)=>{let a=r;a.type=`string`;let{minimum:o,maximum:s,format:c,patterns:l,contentEncoding:u}=e._zod.bag;if(typeof o==`number`&&(a.minLength=o),typeof s==`number`&&(a.maxLength=s),c&&(a.format=n[c]??c,a.format===``&&delete a.format),u&&(a.contentEncoding=u),l&&l.size>0){let e=[...l];e.length===1?a.pattern=e[0].source:e.length>1&&(a.allOf=[...e.map(e=>({...t.target===`draft-07`||t.target===`draft-04`||t.target===`openapi-3.0`?{type:`string`}:{},pattern:e.source}))])}},i=(e,t,n,r)=>{let i=n,{minimum:a,maximum:o,format:s,multipleOf:c,exclusiveMaximum:l,exclusiveMinimum:u}=e._zod.bag;typeof s==`string`&&s.includes(`int`)?i.type=`integer`:i.type=`number`,typeof u==`number`&&(t.target===`draft-04`||t.target===`openapi-3.0`?(i.minimum=u,i.exclusiveMinimum=!0):i.exclusiveMinimum=u),typeof a==`number`&&(i.minimum=a,typeof u==`number`&&t.target!==`draft-04`&&(u>=a?delete i.minimum:delete i.exclusiveMinimum)),typeof l==`number`&&(t.target===`draft-04`||t.target===`openapi-3.0`?(i.maximum=l,i.exclusiveMaximum=!0):i.exclusiveMaximum=l),typeof o==`number`&&(i.maximum=o,typeof l==`number`&&t.target!==`draft-04`&&(l<=o?delete i.maximum:delete i.exclusiveMaximum)),typeof c==`number`&&(i.multipleOf=c)},a=(e,t,n,r)=>{n.type=`boolean`},o=(e,t,n,r)=>{n.not={}},s=(e,t,n,r)=>{},c=(t,n,r,i)=>{let a=t._zod.def,o=e(a.entries);o.every(e=>typeof e==`number`)&&(r.type=`number`),o.every(e=>typeof e==`string`)&&(r.type=`string`),r.enum=o},l=(e,t,n,r)=>{if(t.unrepresentable===`throw`)throw Error(`Custom types cannot be represented in JSON Schema`)},u=(e,t,n,r)=>{if(t.unrepresentable===`throw`)throw Error(`Transforms cannot be represented in JSON Schema`)},d=(e,n,r,i)=>{let a=r,o=e._zod.def,{minimum:s,maximum:c}=e._zod.bag;typeof s==`number`&&(a.minItems=s),typeof c==`number`&&(a.maxItems=c),a.type=`array`,a.items=t(o.element,n,{...i,path:[...i.path,`items`]})},f=(e,n,r,i)=>{let a=r,o=e._zod.def;a.type=`object`,a.properties={};let s=o.shape;for(let e in s)a.properties[e]=t(s[e],n,{...i,path:[...i.path,`properties`,e]});let c=new Set(Object.keys(s)),l=new Set([...c].filter(e=>{let t=o.shape[e]._zod;return n.io===`input`?t.optin===void 0:t.optout===void 0}));l.size>0&&(a.required=Array.from(l)),o.catchall?._zod.def.type===`never`?a.additionalProperties=!1:o.catchall?o.catchall&&(a.additionalProperties=t(o.catchall,n,{...i,path:[...i.path,`additionalProperties`]})):n.io===`output`&&(a.additionalProperties=!1)},p=(e,n,r,i)=>{let a=e._zod.def,o=a.inclusive===!1,s=a.options.map((e,r)=>t(e,n,{...i,path:[...i.path,o?`oneOf`:`anyOf`,r]}));o?r.oneOf=s:r.anyOf=s},m=(e,n,r,i)=>{let a=e._zod.def,o=t(a.left,n,{...i,path:[...i.path,`allOf`,0]}),s=t(a.right,n,{...i,path:[...i.path,`allOf`,1]}),c=e=>`allOf`in e&&Object.keys(e).length===1;r.allOf=[...c(o)?o.allOf:[o],...c(s)?s.allOf:[s]]},h=(e,n,r,i)=>{let a=r,o=e._zod.def;a.type=`object`,(n.target===`draft-07`||n.target===`draft-2020-12`)&&(a.propertyNames=t(o.keyType,n,{...i,path:[...i.path,`propertyNames`]})),a.additionalProperties=t(o.valueType,n,{...i,path:[...i.path,`additionalProperties`]})},g=(e,n,r,i)=>{let a=e._zod.def,o=t(a.innerType,n,i),s=n.seen.get(e);n.target===`openapi-3.0`?(s.ref=a.innerType,r.nullable=!0):r.anyOf=[o,{type:`null`}]},_=(e,n,r,i)=>{let a=e._zod.def;t(a.innerType,n,i);let o=n.seen.get(e);o.ref=a.innerType},v=(e,n,r,i)=>{let a=e._zod.def;t(a.innerType,n,i);let o=n.seen.get(e);o.ref=a.innerType,r.default=JSON.parse(JSON.stringify(a.defaultValue))},y=(e,n,r,i)=>{let a=e._zod.def;t(a.innerType,n,i);let o=n.seen.get(e);o.ref=a.innerType,n.io===`input`&&(r._prefault=JSON.parse(JSON.stringify(a.defaultValue)))},b=(e,n,r,i)=>{let a=e._zod.def;t(a.innerType,n,i);let o=n.seen.get(e);o.ref=a.innerType;let s;try{s=a.catchValue(void 0)}catch{throw Error(`Dynamic catch values are not supported in JSON Schema`)}r.default=s},x=(e,n,r,i)=>{let a=e._zod.def,o=n.io===`input`?a.in._zod.def.type===`transform`?a.out:a.in:a.out;t(o,n,i);let s=n.seen.get(e);s.ref=o},S=(e,n,r,i)=>{let a=e._zod.def;t(a.innerType,n,i);let o=n.seen.get(e);o.ref=a.innerType,r.readOnly=!0},C=(e,n,r,i)=>{let a=e._zod.def;t(a.innerType,n,i);let o=n.seen.get(e);o.ref=a.innerType};export{d as arrayProcessor,a as booleanProcessor,b as catchProcessor,l as customProcessor,v as defaultProcessor,c as enumProcessor,m as intersectionProcessor,o as neverProcessor,_ as nonoptionalProcessor,g as nullableProcessor,i as numberProcessor,f as objectProcessor,C as optionalProcessor,x as pipeProcessor,y as prefaultProcessor,S as readonlyProcessor,h as recordProcessor,r as stringProcessor,u as transformProcessor,p as unionProcessor,s as unknownProcessor};
@@ -0,0 +1 @@
1
+ import{$ZodAsyncError as e,config as t}from"./core.js";import{captureStackTrace as n,finalizeIssue as r}from"./util.js";import{$ZodError as i,$ZodRealError as a}from"./errors.js";const o=i=>(a,o,s,c)=>{let l=s?Object.assign(s,{async:!1}):{async:!1},u=a._zod.run({value:o,issues:[]},l);if(u instanceof Promise)throw new e;if(u.issues.length){let e=new(c?.Err??i)(u.issues.map(e=>r(e,l,t())));throw n(e,c?.callee),e}return u.value},s=e=>async(i,a,o,s)=>{let c=o?Object.assign(o,{async:!0}):{async:!0},l=i._zod.run({value:a,issues:[]},c);if(l instanceof Promise&&(l=await l),l.issues.length){let i=new(s?.Err??e)(l.issues.map(e=>r(e,c,t())));throw n(i,s?.callee),i}return l.value},c=n=>(a,o,s)=>{let c=s?{...s,async:!1}:{async:!1},l=a._zod.run({value:o,issues:[]},c);if(l instanceof Promise)throw new e;return l.issues.length?{success:!1,error:new(n??i)(l.issues.map(e=>r(e,c,t())))}:{success:!0,data:l.value}},l=c(a),u=e=>async(n,i,a)=>{let o=a?Object.assign(a,{async:!0}):{async:!0},s=n._zod.run({value:i,issues:[]},o);return s instanceof Promise&&(s=await s),s.issues.length?{success:!1,error:new e(s.issues.map(e=>r(e,o,t())))}:{success:!0,data:s.value}},d=u(a),f=e=>(t,n,r)=>{let i=r?Object.assign(r,{direction:`backward`}):{direction:`backward`};return o(e)(t,n,i)},p=e=>(t,n,r)=>o(e)(t,n,r),m=e=>async(t,n,r)=>{let i=r?Object.assign(r,{direction:`backward`}):{direction:`backward`};return s(e)(t,n,i)},h=e=>async(t,n,r)=>s(e)(t,n,r),g=e=>(t,n,r)=>{let i=r?Object.assign(r,{direction:`backward`}):{direction:`backward`};return c(e)(t,n,i)},_=e=>(t,n,r)=>c(e)(t,n,r),v=e=>async(t,n,r)=>{let i=r?Object.assign(r,{direction:`backward`}):{direction:`backward`};return u(e)(t,n,i)},y=e=>async(t,n,r)=>u(e)(t,n,r);export{p as _decode,h as _decodeAsync,f as _encode,m as _encodeAsync,o as _parse,s as _parseAsync,_ as _safeDecode,y as _safeDecodeAsync,g as _safeEncode,v as _safeEncodeAsync,c as _safeParse,u as _safeParseAsync,l as safeParse,d as safeParseAsync};
@@ -0,0 +1 @@
1
+ const e=/^[cC][^\s-]{8,}$/,t=/^[0-9a-z]+$/,n=/^[0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{26}$/,r=/^[0-9a-vA-V]{20}$/,i=/^[A-Za-z0-9]{27}$/,a=/^[a-zA-Z0-9_-]{21}$/,o=/^P(?:(\d+W)|(?!.*W)(?=\d|T\d)(\d+Y)?(\d+M)?(\d+D)?(T(?=\d)(\d+H)?(\d+M)?(\d+([.,]\d+)?S)?)?)$/,s=/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$/,c=e=>e?RegExp(`^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-${e}[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$`):/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/,l=/^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$/;function u(){return RegExp(`^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$`,`u`)}const d=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,f=/^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))$/,p=/^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/([0-9]|[1-2][0-9]|3[0-2])$/,m=/^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,h=/^$|^(?:[0-9a-zA-Z+/]{4})*(?:(?:[0-9a-zA-Z+/]{2}==)|(?:[0-9a-zA-Z+/]{3}=))?$/,g=/^[A-Za-z0-9_-]*$/,_=/^\+(?:[0-9]){6,14}[0-9]$/,v=`(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))`,y=RegExp(`^${v}$`);function b(e){let t=`(?:[01]\\d|2[0-3]):[0-5]\\d`;return typeof e.precision==`number`?e.precision===-1?`${t}`:e.precision===0?`${t}:[0-5]\\d`:`${t}:[0-5]\\d\\.\\d{${e.precision}}`:`${t}(?::[0-5]\\d(?:\\.\\d+)?)?`}function x(e){return RegExp(`^${b(e)}$`)}function S(e){let t=b({precision:e.precision}),n=[`Z`];e.local&&n.push(``),e.offset&&n.push(`([+-](?:[01]\\d|2[0-3]):[0-5]\\d)`);let r=`${t}(?:${n.join(`|`)})`;return RegExp(`^${v}T(?:${r})$`)}const C=e=>{let t=e?`[\\s\\S]{${e?.minimum??0},${e?.maximum??``}}`:`[\\s\\S]*`;return RegExp(`^${t}$`)},w=/^-?\d+$/,T=/^-?\d+(?:\.\d+)?/,E=/^(?:true|false)$/i,D=/^[^A-Z]*$/,O=/^[^a-z]*$/;export{h as base64,g as base64url,E as boolean,p as cidrv4,m as cidrv6,e as cuid,t as cuid2,y as date,S as datetime,o as duration,_ as e164,l as email,u as emoji,s as guid,w as integer,d as ipv4,f as ipv6,i as ksuid,D as lowercase,a as nanoid,T as number,C as string,x as time,n as ulid,O as uppercase,c as uuid,r as xid};
@@ -0,0 +1 @@
1
+ var e,t=class{constructor(){this._map=new WeakMap,this._idmap=new Map}add(e,...t){let n=t[0];if(this._map.set(e,n),n&&typeof n==`object`&&`id`in n){if(this._idmap.has(n.id))throw Error(`ID ${n.id} already exists in the registry`);this._idmap.set(n.id,e)}return this}clear(){return this._map=new WeakMap,this._idmap=new Map,this}remove(e){let t=this._map.get(e);return t&&typeof t==`object`&&`id`in t&&this._idmap.delete(t.id),this._map.delete(e),this}get(e){let t=e._zod.parent;if(t){let n={...this.get(t)??{}};delete n.id;let r={...n,...this._map.get(e)};return Object.keys(r).length?r:void 0}return this._map.get(e)}has(e){return this._map.has(e)}};function n(){return new t}(e=globalThis).__zod_globalRegistry??(e.__zod_globalRegistry=n());const r=globalThis.__zod_globalRegistry;export{r as globalRegistry};
@@ -0,0 +1,18 @@
1
+ import{$ZodAsyncError as e,$ZodEncodeError as t,$constructor as n,config as r,globalConfig as i}from"./core.js";import{aborted as a,allowsEval as o,cached as s,cleanRegex as c,clone as l,defineLazy as u,esc as d,escapeRegex as f,finalizeIssue as p,getEnumValues as m,isObject as h,isPlainObject as g,issue as _,optionalKeys as ee,prefixIssues as v,propertyKeyTypes as y}from"./util.js";import{safeParse as b,safeParseAsync as x}from"./parse.js";import{base64 as te,base64url as S,boolean as ne,cidrv4 as re,cidrv6 as ie,cuid as ae,cuid2 as oe,date as se,datetime as ce,duration as le,e164 as ue,email as de,emoji as fe,guid as pe,ipv4 as me,ipv6 as he,ksuid as ge,nanoid as C,number as w,string as T,time as E,ulid as D,uuid as O,xid as k}from"./regexes.js";import{$ZodCheck as A,$ZodCheckNumberFormat as j,$ZodCheckStringFormat as M}from"./checks.js";import{Doc as N}from"./doc.js";import{version as P}from"./versions.js";const F=n(`$ZodType`,(t,n)=>{var r;t??={},t._zod.def=n,t._zod.bag=t._zod.bag||{},t._zod.version=P;let i=[...t._zod.def.checks??[]];t._zod.traits.has(`$ZodCheck`)&&i.unshift(t);for(let e of i)for(let n of e._zod.onattach)n(t);if(i.length===0)(r=t._zod).deferred??(r.deferred=[]),t._zod.deferred?.push(()=>{t._zod.run=t._zod.parse});else{let n=(t,n,r)=>{let i=a(t),o;for(let s of n){if(s._zod.def.when){if(!s._zod.def.when(t))continue}else if(i)continue;let n=t.issues.length,c=s._zod.check(t);if(c instanceof Promise&&r?.async===!1)throw new e;if(o||c instanceof Promise)o=(o??Promise.resolve()).then(async()=>{await c,t.issues.length!==n&&(i||=a(t,n))});else{if(t.issues.length===n)continue;i||=a(t,n)}}return o?o.then(()=>t):t},r=(r,o,s)=>{if(a(r))return r.aborted=!0,r;let c=n(o,i,s);if(c instanceof Promise){if(s.async===!1)throw new e;return c.then(e=>t._zod.parse(e,s))}return t._zod.parse(c,s)};t._zod.run=(a,o)=>{if(o.skipChecks)return t._zod.parse(a,o);if(o.direction===`backward`){let e=t._zod.parse({value:a.value,issues:[]},{...o,skipChecks:!0});return e instanceof Promise?e.then(e=>r(e,a,o)):r(e,a,o)}let s=t._zod.parse(a,o);if(s instanceof Promise){if(o.async===!1)throw new e;return s.then(e=>n(e,i,o))}return n(s,i,o)}}t[`~standard`]={validate:e=>{try{let n=b(t,e);return n.success?{value:n.data}:{issues:n.error?.issues}}catch{return x(t,e).then(e=>e.success?{value:e.data}:{issues:e.error?.issues})}},vendor:`zod`,version:1}}),I=n(`$ZodString`,(e,t)=>{F.init(e,t),e._zod.pattern=[...e?._zod.bag?.patterns??[]].pop()??T(e._zod.bag),e._zod.parse=(n,r)=>{if(t.coerce)try{n.value=String(n.value)}catch{}return typeof n.value==`string`||n.issues.push({expected:`string`,code:`invalid_type`,input:n.value,inst:e}),n}}),L=n(`$ZodStringFormat`,(e,t)=>{M.init(e,t),I.init(e,t)}),_e=n(`$ZodGUID`,(e,t)=>{t.pattern??=pe,L.init(e,t)}),ve=n(`$ZodUUID`,(e,t)=>{if(t.version){let e={v1:1,v2:2,v3:3,v4:4,v5:5,v6:6,v7:7,v8:8}[t.version];if(e===void 0)throw Error(`Invalid UUID version: "${t.version}"`);t.pattern??=O(e)}else t.pattern??=O();L.init(e,t)}),ye=n(`$ZodEmail`,(e,t)=>{t.pattern??=de,L.init(e,t)}),be=n(`$ZodURL`,(e,t)=>{L.init(e,t),e._zod.check=n=>{try{let r=n.value.trim(),i=new URL(r);t.hostname&&(t.hostname.lastIndex=0,t.hostname.test(i.hostname)||n.issues.push({code:`invalid_format`,format:`url`,note:`Invalid hostname`,pattern:t.hostname.source,input:n.value,inst:e,continue:!t.abort})),t.protocol&&(t.protocol.lastIndex=0,t.protocol.test(i.protocol.endsWith(`:`)?i.protocol.slice(0,-1):i.protocol)||n.issues.push({code:`invalid_format`,format:`url`,note:`Invalid protocol`,pattern:t.protocol.source,input:n.value,inst:e,continue:!t.abort})),t.normalize?n.value=i.href:n.value=r;return}catch{n.issues.push({code:`invalid_format`,format:`url`,input:n.value,inst:e,continue:!t.abort})}}}),xe=n(`$ZodEmoji`,(e,t)=>{t.pattern??=fe(),L.init(e,t)}),Se=n(`$ZodNanoID`,(e,t)=>{t.pattern??=C,L.init(e,t)}),Ce=n(`$ZodCUID`,(e,t)=>{t.pattern??=ae,L.init(e,t)}),we=n(`$ZodCUID2`,(e,t)=>{t.pattern??=oe,L.init(e,t)}),Te=n(`$ZodULID`,(e,t)=>{t.pattern??=D,L.init(e,t)}),Ee=n(`$ZodXID`,(e,t)=>{t.pattern??=k,L.init(e,t)}),De=n(`$ZodKSUID`,(e,t)=>{t.pattern??=ge,L.init(e,t)}),Oe=n(`$ZodISODateTime`,(e,t)=>{t.pattern??=ce(t),L.init(e,t)}),ke=n(`$ZodISODate`,(e,t)=>{t.pattern??=se,L.init(e,t)}),Ae=n(`$ZodISOTime`,(e,t)=>{t.pattern??=E(t),L.init(e,t)}),je=n(`$ZodISODuration`,(e,t)=>{t.pattern??=le,L.init(e,t)}),Me=n(`$ZodIPv4`,(e,t)=>{t.pattern??=me,L.init(e,t),e._zod.bag.format=`ipv4`}),Ne=n(`$ZodIPv6`,(e,t)=>{t.pattern??=he,L.init(e,t),e._zod.bag.format=`ipv6`,e._zod.check=n=>{try{new URL(`http://[${n.value}]`)}catch{n.issues.push({code:`invalid_format`,format:`ipv6`,input:n.value,inst:e,continue:!t.abort})}}}),Pe=n(`$ZodCIDRv4`,(e,t)=>{t.pattern??=re,L.init(e,t)}),Fe=n(`$ZodCIDRv6`,(e,t)=>{t.pattern??=ie,L.init(e,t),e._zod.check=n=>{let r=n.value.split(`/`);try{if(r.length!==2)throw Error();let[e,t]=r;if(!t)throw Error();let n=Number(t);if(`${n}`!==t||n<0||n>128)throw Error();new URL(`http://[${e}]`)}catch{n.issues.push({code:`invalid_format`,format:`cidrv6`,input:n.value,inst:e,continue:!t.abort})}}});function R(e){if(e===``)return!0;if(e.length%4!=0)return!1;try{return atob(e),!0}catch{return!1}}const Ie=n(`$ZodBase64`,(e,t)=>{t.pattern??=te,L.init(e,t),e._zod.bag.contentEncoding=`base64`,e._zod.check=n=>{R(n.value)||n.issues.push({code:`invalid_format`,format:`base64`,input:n.value,inst:e,continue:!t.abort})}});function Le(e){if(!S.test(e))return!1;let t=e.replace(/[-_]/g,e=>e===`-`?`+`:`/`);return R(t.padEnd(Math.ceil(t.length/4)*4,`=`))}const Re=n(`$ZodBase64URL`,(e,t)=>{t.pattern??=S,L.init(e,t),e._zod.bag.contentEncoding=`base64url`,e._zod.check=n=>{Le(n.value)||n.issues.push({code:`invalid_format`,format:`base64url`,input:n.value,inst:e,continue:!t.abort})}}),ze=n(`$ZodE164`,(e,t)=>{t.pattern??=ue,L.init(e,t)});function Be(e,t=null){try{let n=e.split(`.`);if(n.length!==3)return!1;let[r]=n;if(!r)return!1;let i=JSON.parse(atob(r));return!(`typ`in i&&i?.typ!==`JWT`||!i.alg||t&&(!(`alg`in i)||i.alg!==t))}catch{return!1}}const Ve=n(`$ZodJWT`,(e,t)=>{L.init(e,t),e._zod.check=n=>{Be(n.value,t.alg)||n.issues.push({code:`invalid_format`,format:`jwt`,input:n.value,inst:e,continue:!t.abort})}}),z=n(`$ZodNumber`,(e,t)=>{F.init(e,t),e._zod.pattern=e._zod.bag.pattern??w,e._zod.parse=(n,r)=>{if(t.coerce)try{n.value=Number(n.value)}catch{}let i=n.value;if(typeof i==`number`&&!Number.isNaN(i)&&Number.isFinite(i))return n;let a=typeof i==`number`?Number.isNaN(i)?`NaN`:Number.isFinite(i)?void 0:`Infinity`:void 0;return n.issues.push({expected:`number`,code:`invalid_type`,input:i,inst:e,...a?{received:a}:{}}),n}}),He=n(`$ZodNumberFormat`,(e,t)=>{j.init(e,t),z.init(e,t)}),Ue=n(`$ZodBoolean`,(e,t)=>{F.init(e,t),e._zod.pattern=ne,e._zod.parse=(n,r)=>{if(t.coerce)try{n.value=!!n.value}catch{}let i=n.value;return typeof i==`boolean`||n.issues.push({expected:`boolean`,code:`invalid_type`,input:i,inst:e}),n}}),We=n(`$ZodUnknown`,(e,t)=>{F.init(e,t),e._zod.parse=e=>e}),Ge=n(`$ZodNever`,(e,t)=>{F.init(e,t),e._zod.parse=(t,n)=>(t.issues.push({expected:`never`,code:`invalid_type`,input:t.value,inst:e}),t)});function B(e,t,n){e.issues.length&&t.issues.push(...v(n,e.issues)),t.value[n]=e.value}const Ke=n(`$ZodArray`,(e,t)=>{F.init(e,t),e._zod.parse=(n,r)=>{let i=n.value;if(!Array.isArray(i))return n.issues.push({expected:`array`,code:`invalid_type`,input:i,inst:e}),n;n.value=Array(i.length);let a=[];for(let e=0;e<i.length;e++){let o=i[e],s=t.element._zod.run({value:o,issues:[]},r);s instanceof Promise?a.push(s.then(t=>B(t,n,e))):B(s,n,e)}return a.length?Promise.all(a).then(()=>n):n}});function V(e,t,n,r){e.issues.length&&t.issues.push(...v(n,e.issues)),e.value===void 0?n in r&&(t.value[n]=void 0):t.value[n]=e.value}function H(e){let t=Object.keys(e.shape);for(let n of t)if(!e.shape?.[n]?._zod?.traits?.has(`$ZodType`))throw Error(`Invalid element at key "${n}": expected a Zod schema`);let n=ee(e.shape);return{...e,keys:t,keySet:new Set(t),numKeys:t.length,optionalKeys:new Set(n)}}function U(e,t,n,r,i,a){let o=[],s=i.keySet,c=i.catchall._zod,l=c.def.type;for(let i in t){if(s.has(i))continue;if(l===`never`){o.push(i);continue}let a=c.run({value:t[i],issues:[]},r);a instanceof Promise?e.push(a.then(e=>V(e,n,i,t))):V(a,n,i,t)}return o.length&&n.issues.push({code:`unrecognized_keys`,keys:o,input:t,inst:a}),e.length?Promise.all(e).then(()=>n):n}const qe=n(`$ZodObject`,(e,t)=>{if(F.init(e,t),!Object.getOwnPropertyDescriptor(t,`shape`)?.get){let e=t.shape;Object.defineProperty(t,`shape`,{get:()=>{let n={...e};return Object.defineProperty(t,`shape`,{value:n}),n}})}let n=s(()=>H(t));u(e._zod,`propValues`,()=>{let e=t.shape,n={};for(let t in e){let r=e[t]._zod;if(r.values){n[t]??(n[t]=new Set);for(let e of r.values)n[t].add(e)}}return n});let r=h,i=t.catchall,a;e._zod.parse=(t,o)=>{a??=n.value;let s=t.value;if(!r(s))return t.issues.push({expected:`object`,code:`invalid_type`,input:s,inst:e}),t;t.value={};let c=[],l=a.shape;for(let e of a.keys){let n=l[e]._zod.run({value:s[e],issues:[]},o);n instanceof Promise?c.push(n.then(n=>V(n,t,e,s))):V(n,t,e,s)}return i?U(c,s,t,o,n.value,e):c.length?Promise.all(c).then(()=>t):t}}),Je=n(`$ZodObjectJIT`,(e,t)=>{qe.init(e,t);let n=e._zod.parse,r=s(()=>H(t)),a=e=>{let t=new N([`shape`,`payload`,`ctx`]),n=r.value,i=e=>{let t=d(e);return`shape[${t}]._zod.run({ value: input[${t}], issues: [] }, ctx)`};t.write(`const input = payload.value;`);let a=Object.create(null),o=0;for(let e of n.keys)a[e]=`key_${o++}`;t.write(`const newResult = {};`);for(let e of n.keys){let n=a[e],r=d(e);t.write(`const ${n} = ${i(e)};`),t.write(`
2
+ if (${n}.issues.length) {
3
+ payload.issues = payload.issues.concat(${n}.issues.map(iss => ({
4
+ ...iss,
5
+ path: iss.path ? [${r}, ...iss.path] : [${r}]
6
+ })));
7
+ }
8
+
9
+
10
+ if (${n}.value === undefined) {
11
+ if (${r} in input) {
12
+ newResult[${r}] = undefined;
13
+ }
14
+ } else {
15
+ newResult[${r}] = ${n}.value;
16
+ }
17
+
18
+ `)}t.write(`payload.value = newResult;`),t.write(`return payload;`);let s=t.compile();return(t,n)=>s(e,t,n)},c,l=h,u=!i.jitless,f=u&&o.value,p=t.catchall,m;e._zod.parse=(i,o)=>{m??=r.value;let s=i.value;return l(s)?u&&f&&o?.async===!1&&o.jitless!==!0?(c||=a(t.shape),i=c(i,o),p?U([],s,i,o,m,e):i):n(i,o):(i.issues.push({expected:`object`,code:`invalid_type`,input:s,inst:e}),i)}});function W(e,t,n,i){for(let n of e)if(n.issues.length===0)return t.value=n.value,t;let o=e.filter(e=>!a(e));return o.length===1?(t.value=o[0].value,o[0]):(t.issues.push({code:`invalid_union`,input:t.value,inst:n,errors:e.map(e=>e.issues.map(e=>p(e,i,r())))}),t)}const Ye=n(`$ZodUnion`,(e,t)=>{F.init(e,t),u(e._zod,`optin`,()=>t.options.some(e=>e._zod.optin===`optional`)?`optional`:void 0),u(e._zod,`optout`,()=>t.options.some(e=>e._zod.optout===`optional`)?`optional`:void 0),u(e._zod,`values`,()=>{if(t.options.every(e=>e._zod.values))return new Set(t.options.flatMap(e=>Array.from(e._zod.values)))}),u(e._zod,`pattern`,()=>{if(t.options.every(e=>e._zod.pattern)){let e=t.options.map(e=>e._zod.pattern);return RegExp(`^(${e.map(e=>c(e.source)).join(`|`)})$`)}});let n=t.options.length===1,r=t.options[0]._zod.run;e._zod.parse=(i,a)=>{if(n)return r(i,a);let o=!1,s=[];for(let e of t.options){let t=e._zod.run({value:i.value,issues:[]},a);if(t instanceof Promise)s.push(t),o=!0;else{if(t.issues.length===0)return t;s.push(t)}}return o?Promise.all(s).then(t=>W(t,i,e,a)):W(s,i,e,a)}}),Xe=n(`$ZodIntersection`,(e,t)=>{F.init(e,t),e._zod.parse=(e,n)=>{let r=e.value,i=t.left._zod.run({value:r,issues:[]},n),a=t.right._zod.run({value:r,issues:[]},n);return i instanceof Promise||a instanceof Promise?Promise.all([i,a]).then(([t,n])=>K(e,t,n)):K(e,i,a)}});function G(e,t){if(e===t||e instanceof Date&&t instanceof Date&&+e==+t)return{valid:!0,data:e};if(g(e)&&g(t)){let n=Object.keys(t),r=Object.keys(e).filter(e=>n.indexOf(e)!==-1),i={...e,...t};for(let n of r){let r=G(e[n],t[n]);if(!r.valid)return{valid:!1,mergeErrorPath:[n,...r.mergeErrorPath]};i[n]=r.data}return{valid:!0,data:i}}if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return{valid:!1,mergeErrorPath:[]};let n=[];for(let r=0;r<e.length;r++){let i=e[r],a=t[r],o=G(i,a);if(!o.valid)return{valid:!1,mergeErrorPath:[r,...o.mergeErrorPath]};n.push(o.data)}return{valid:!0,data:n}}return{valid:!1,mergeErrorPath:[]}}function K(e,t,n){if(t.issues.length&&e.issues.push(...t.issues),n.issues.length&&e.issues.push(...n.issues),a(e))return e;let r=G(t.value,n.value);if(!r.valid)throw Error(`Unmergable intersection. Error path: ${JSON.stringify(r.mergeErrorPath)}`);return e.value=r.data,e}const Ze=n(`$ZodRecord`,(e,t)=>{F.init(e,t),e._zod.parse=(n,i)=>{let a=n.value;if(!g(a))return n.issues.push({expected:`record`,code:`invalid_type`,input:a,inst:e}),n;let o=[],s=t.keyType._zod.values;if(s){n.value={};let r=new Set;for(let e of s)if(typeof e==`string`||typeof e==`number`||typeof e==`symbol`){r.add(typeof e==`number`?e.toString():e);let s=t.valueType._zod.run({value:a[e],issues:[]},i);s instanceof Promise?o.push(s.then(t=>{t.issues.length&&n.issues.push(...v(e,t.issues)),n.value[e]=t.value})):(s.issues.length&&n.issues.push(...v(e,s.issues)),n.value[e]=s.value)}let c;for(let e in a)r.has(e)||(c??=[],c.push(e));c&&c.length>0&&n.issues.push({code:`unrecognized_keys`,input:a,inst:e,keys:c})}else{n.value={};for(let s of Reflect.ownKeys(a)){if(s===`__proto__`)continue;let c=t.keyType._zod.run({value:s,issues:[]},i);if(c instanceof Promise)throw Error(`Async schemas not supported in object keys currently`);if(c.issues.length){t.mode===`loose`?n.value[s]=a[s]:n.issues.push({code:`invalid_key`,origin:`record`,issues:c.issues.map(e=>p(e,i,r())),input:s,path:[s],inst:e});continue}let l=t.valueType._zod.run({value:a[s],issues:[]},i);l instanceof Promise?o.push(l.then(e=>{e.issues.length&&n.issues.push(...v(s,e.issues)),n.value[c.value]=e.value})):(l.issues.length&&n.issues.push(...v(s,l.issues)),n.value[c.value]=l.value)}}return o.length?Promise.all(o).then(()=>n):n}}),Qe=n(`$ZodEnum`,(e,t)=>{F.init(e,t);let n=m(t.entries),r=new Set(n);e._zod.values=r,e._zod.pattern=RegExp(`^(${n.filter(e=>y.has(typeof e)).map(e=>typeof e==`string`?f(e):e.toString()).join(`|`)})$`),e._zod.parse=(t,i)=>{let a=t.value;return r.has(a)||t.issues.push({code:`invalid_value`,values:n,input:a,inst:e}),t}}),$e=n(`$ZodTransform`,(n,r)=>{F.init(n,r),n._zod.parse=(i,a)=>{if(a.direction===`backward`)throw new t(n.constructor.name);let o=r.transform(i.value,i);if(a.async)return(o instanceof Promise?o:Promise.resolve(o)).then(e=>(i.value=e,i));if(o instanceof Promise)throw new e;return i.value=o,i}});function q(e,t){return e.issues.length&&t===void 0?{issues:[],value:void 0}:e}const J=n(`$ZodOptional`,(e,t)=>{F.init(e,t),e._zod.optin=`optional`,e._zod.optout=`optional`,u(e._zod,`values`,()=>t.innerType._zod.values?new Set([...t.innerType._zod.values,void 0]):void 0),u(e._zod,`pattern`,()=>{let e=t.innerType._zod.pattern;return e?RegExp(`^(${c(e.source)})?$`):void 0}),e._zod.parse=(e,n)=>{if(t.innerType._zod.optin===`optional`){let r=t.innerType._zod.run(e,n);return r instanceof Promise?r.then(t=>q(t,e.value)):q(r,e.value)}return e.value===void 0?e:t.innerType._zod.run(e,n)}}),et=n(`$ZodNullable`,(e,t)=>{F.init(e,t),u(e._zod,`optin`,()=>t.innerType._zod.optin),u(e._zod,`optout`,()=>t.innerType._zod.optout),u(e._zod,`pattern`,()=>{let e=t.innerType._zod.pattern;return e?RegExp(`^(${c(e.source)}|null)$`):void 0}),u(e._zod,`values`,()=>t.innerType._zod.values?new Set([...t.innerType._zod.values,null]):void 0),e._zod.parse=(e,n)=>e.value===null?e:t.innerType._zod.run(e,n)}),tt=n(`$ZodDefault`,(e,t)=>{F.init(e,t),e._zod.optin=`optional`,u(e._zod,`values`,()=>t.innerType._zod.values),e._zod.parse=(e,n)=>{if(n.direction===`backward`)return t.innerType._zod.run(e,n);if(e.value===void 0)return e.value=t.defaultValue,e;let r=t.innerType._zod.run(e,n);return r instanceof Promise?r.then(e=>Y(e,t)):Y(r,t)}});function Y(e,t){return e.value===void 0&&(e.value=t.defaultValue),e}const nt=n(`$ZodPrefault`,(e,t)=>{F.init(e,t),e._zod.optin=`optional`,u(e._zod,`values`,()=>t.innerType._zod.values),e._zod.parse=(e,n)=>(n.direction===`backward`||e.value===void 0&&(e.value=t.defaultValue),t.innerType._zod.run(e,n))}),rt=n(`$ZodNonOptional`,(e,t)=>{F.init(e,t),u(e._zod,`values`,()=>{let e=t.innerType._zod.values;return e?new Set([...e].filter(e=>e!==void 0)):void 0}),e._zod.parse=(n,r)=>{let i=t.innerType._zod.run(n,r);return i instanceof Promise?i.then(t=>X(t,e)):X(i,e)}});function X(e,t){return!e.issues.length&&e.value===void 0&&e.issues.push({code:`invalid_type`,expected:`nonoptional`,input:e.value,inst:t}),e}const it=n(`$ZodCatch`,(e,t)=>{F.init(e,t),u(e._zod,`optin`,()=>t.innerType._zod.optin),u(e._zod,`optout`,()=>t.innerType._zod.optout),u(e._zod,`values`,()=>t.innerType._zod.values),e._zod.parse=(e,n)=>{if(n.direction===`backward`)return t.innerType._zod.run(e,n);let i=t.innerType._zod.run(e,n);return i instanceof Promise?i.then(i=>(e.value=i.value,i.issues.length&&(e.value=t.catchValue({...e,error:{issues:i.issues.map(e=>p(e,n,r()))},input:e.value}),e.issues=[]),e)):(e.value=i.value,i.issues.length&&(e.value=t.catchValue({...e,error:{issues:i.issues.map(e=>p(e,n,r()))},input:e.value}),e.issues=[]),e)}}),at=n(`$ZodPipe`,(e,t)=>{F.init(e,t),u(e._zod,`values`,()=>t.in._zod.values),u(e._zod,`optin`,()=>t.in._zod.optin),u(e._zod,`optout`,()=>t.out._zod.optout),u(e._zod,`propValues`,()=>t.in._zod.propValues),e._zod.parse=(e,n)=>{if(n.direction===`backward`){let r=t.out._zod.run(e,n);return r instanceof Promise?r.then(e=>Z(e,t.in,n)):Z(r,t.in,n)}let r=t.in._zod.run(e,n);return r instanceof Promise?r.then(e=>Z(e,t.out,n)):Z(r,t.out,n)}});function Z(e,t,n){return e.issues.length?(e.aborted=!0,e):t._zod.run({value:e.value,issues:e.issues},n)}const ot=n(`$ZodReadonly`,(e,t)=>{F.init(e,t),u(e._zod,`propValues`,()=>t.innerType._zod.propValues),u(e._zod,`values`,()=>t.innerType._zod.values),u(e._zod,`optin`,()=>t.innerType?._zod?.optin),u(e._zod,`optout`,()=>t.innerType?._zod?.optout),e._zod.parse=(e,n)=>{if(n.direction===`backward`)return t.innerType._zod.run(e,n);let r=t.innerType._zod.run(e,n);return r instanceof Promise?r.then(Q):Q(r)}});function Q(e){return e.value=Object.freeze(e.value),e}const st=n(`$ZodCustom`,(e,t)=>{A.init(e,t),F.init(e,t),e._zod.parse=(e,t)=>e,e._zod.check=n=>{let r=n.value,i=t.fn(r);if(i instanceof Promise)return i.then(t=>$(t,n,r,e));$(i,n,r,e)}});function $(e,t,n,r){if(!e){let e={code:`custom`,input:n,inst:r,path:[...r._zod.def.path??[]],continue:!r._zod.def.abort};r._zod.def.params&&(e.params=r._zod.def.params),t.issues.push(_(e))}}export{Ke as $ZodArray,Ie as $ZodBase64,Re as $ZodBase64URL,Ue as $ZodBoolean,Pe as $ZodCIDRv4,Fe as $ZodCIDRv6,Ce as $ZodCUID,we as $ZodCUID2,it as $ZodCatch,st as $ZodCustom,tt as $ZodDefault,ze as $ZodE164,ye as $ZodEmail,xe as $ZodEmoji,Qe as $ZodEnum,_e as $ZodGUID,Me as $ZodIPv4,Ne as $ZodIPv6,ke as $ZodISODate,Oe as $ZodISODateTime,je as $ZodISODuration,Ae as $ZodISOTime,Xe as $ZodIntersection,Ve as $ZodJWT,De as $ZodKSUID,Se as $ZodNanoID,Ge as $ZodNever,rt as $ZodNonOptional,et as $ZodNullable,z as $ZodNumber,He as $ZodNumberFormat,Je as $ZodObjectJIT,J as $ZodOptional,at as $ZodPipe,nt as $ZodPrefault,ot as $ZodReadonly,Ze as $ZodRecord,I as $ZodString,L as $ZodStringFormat,$e as $ZodTransform,F as $ZodType,Te as $ZodULID,be as $ZodURL,ve as $ZodUUID,Ye as $ZodUnion,We as $ZodUnknown,Ee as $ZodXID};
@@ -0,0 +1,3 @@
1
+ import{globalRegistry as e}from"./registries.js";function t(t){let n=t?.target??`draft-2020-12`;return n===`draft-4`&&(n=`draft-04`),n===`draft-7`&&(n=`draft-07`),{processors:t.processors??{},metadataRegistry:t?.metadata??e,target:n,unrepresentable:t?.unrepresentable??`throw`,override:t?.override??(()=>{}),io:t?.io??`output`,counter:0,seen:new Map,cycles:t?.cycles??`ref`,reused:t?.reused??`inline`,external:t?.external??void 0}}function n(e,t,r={path:[],schemaPath:[]}){var i;let o=e._zod.def,s=t.seen.get(e);if(s)return s.count++,r.schemaPath.includes(e)&&(s.cycle=r.path),s.schema;let c={schema:{},count:1,cycle:void 0,path:r.path};t.seen.set(e,c);let l=e._zod.toJSONSchema?.();if(l)c.schema=l;else{let i={...r,schemaPath:[...r.schemaPath,e],path:r.path},a=e._zod.parent;if(a)c.ref=a,n(a,t,i),t.seen.get(a).isParent=!0;else if(e._zod.processJSONSchema)e._zod.processJSONSchema(t,c.schema,i);else{let n=c.schema,r=t.processors[o.type];if(!r)throw Error(`[toJSONSchema]: Non-representable type encountered: ${o.type}`);r(e,t,n,i)}}let u=t.metadataRegistry.get(e);return u&&Object.assign(c.schema,u),t.io===`input`&&a(e)&&(delete c.schema.examples,delete c.schema.default),t.io===`input`&&c.schema._prefault&&((i=c.schema).default??(i.default=c.schema._prefault)),delete c.schema._prefault,t.seen.get(e).schema}function r(e,t){let n=e.seen.get(t);if(!n)throw Error(`Unprocessed schema. This is a bug in Zod.`);let r=t=>{let r=e.target===`draft-2020-12`?`$defs`:`definitions`;if(e.external){let n=e.external.registry.get(t[0])?.id,i=e.external.uri??(e=>e);if(n)return{ref:i(n)};let a=t[1].defId??t[1].schema.id??`schema${e.counter++}`;return t[1].defId=a,{defId:a,ref:`${i(`__shared`)}#/${r}/${a}`}}if(t[1]===n)return{ref:`#`};let i=`#/${r}/`,a=t[1].schema.id??`__schema${e.counter++}`;return{defId:a,ref:i+a}},i=e=>{if(e[1].schema.$ref)return;let t=e[1],{ref:n,defId:i}=r(e);t.def={...t.schema},i&&(t.defId=i);let a=t.schema;for(let e in a)delete a[e];a.$ref=n};if(e.cycles===`throw`)for(let t of e.seen.entries()){let e=t[1];if(e.cycle)throw Error(`Cycle detected: #/${e.cycle?.join(`/`)}/<root>
2
+
3
+ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.`)}for(let n of e.seen.entries()){let r=n[1];if(t===n[0]){i(n);continue}if(e.external){let r=e.external.registry.get(n[0])?.id;if(t!==n[0]&&r){i(n);continue}}if(e.metadataRegistry.get(n[0])?.id){i(n);continue}if(r.cycle){i(n);continue}if(r.count>1&&e.reused===`ref`){i(n);continue}}}function i(e,t){let n=e.seen.get(t);if(!n)throw Error(`Unprocessed schema. This is a bug in Zod.`);let r=t=>{let n=e.seen.get(t),i=n.def??n.schema,a={...i};if(n.ref===null)return;let o=n.ref;if(n.ref=null,o){r(o);let t=e.seen.get(o).schema;t.$ref&&(e.target===`draft-07`||e.target===`draft-04`||e.target===`openapi-3.0`)?(i.allOf=i.allOf??[],i.allOf.push(t)):(Object.assign(i,t),Object.assign(i,a))}n.isParent||e.override({zodSchema:t,jsonSchema:i,path:n.path??[]})};for(let t of[...e.seen.entries()].reverse())r(t[0]);let i={};if(e.target===`draft-2020-12`?i.$schema=`https://json-schema.org/draft/2020-12/schema`:e.target===`draft-07`?i.$schema=`http://json-schema.org/draft-07/schema#`:e.target===`draft-04`?i.$schema=`http://json-schema.org/draft-04/schema#`:e.target,e.external?.uri){let n=e.external.registry.get(t)?.id;if(!n)throw Error("Schema is missing an `id` property");i.$id=e.external.uri(n)}Object.assign(i,n.def??n.schema);let a=e.external?.defs??{};for(let t of e.seen.entries()){let e=t[1];e.def&&e.defId&&(a[e.defId]=e.def)}e.external||Object.keys(a).length>0&&(e.target===`draft-2020-12`?i.$defs=a:i.definitions=a);try{let e=JSON.parse(JSON.stringify(i));return Object.defineProperty(e,`~standard`,{value:{...t[`~standard`],jsonSchema:{input:s(t,`input`),output:s(t,`output`)}},enumerable:!1,writable:!1}),e}catch{throw Error(`Error converting schema to JSON.`)}}function a(e,t){let n=t??{seen:new Set};if(n.seen.has(e))return!1;n.seen.add(e);let r=e._zod.def;if(r.type===`transform`)return!0;if(r.type===`array`)return a(r.element,n);if(r.type===`set`)return a(r.valueType,n);if(r.type===`lazy`)return a(r.getter(),n);if(r.type===`promise`||r.type===`optional`||r.type===`nonoptional`||r.type===`nullable`||r.type===`readonly`||r.type===`default`||r.type===`prefault`)return a(r.innerType,n);if(r.type===`intersection`)return a(r.left,n)||a(r.right,n);if(r.type===`record`||r.type===`map`)return a(r.keyType,n)||a(r.valueType,n);if(r.type===`pipe`)return a(r.in,n)||a(r.out,n);if(r.type===`object`){for(let e in r.shape)if(a(r.shape[e],n))return!0;return!1}if(r.type===`union`){for(let e of r.options)if(a(e,n))return!0;return!1}if(r.type===`tuple`){for(let e of r.items)if(a(e,n))return!0;return!!(r.rest&&a(r.rest,n))}return!1}const o=(e,a={})=>o=>{let s=t({...o,processors:a});return n(e,s),r(s,e),i(s,e)},s=(e,a)=>o=>{let{libraryOptions:s,target:c}=o??{},l=t({...s??{},target:c,io:a,processors:{}});return n(e,l),r(l,e),i(l,e)};export{s as createStandardJSONSchemaMethod,o as createToJSONSchemaMethod,n as process};
@@ -0,0 +1 @@
1
+ function e(e){let t=Object.values(e).filter(e=>typeof e==`number`);return Object.entries(e).filter(([e,n])=>t.indexOf(+e)===-1).map(([e,t])=>t)}function t(e,t){return typeof t==`bigint`?t.toString():t}function n(e){return{get value(){{let t=e();return Object.defineProperty(this,`value`,{value:t}),t}throw Error(`cached value already set`)}}}function r(e){return e==null}function i(e){let t=e.startsWith(`^`)?1:0,n=e.endsWith(`$`)?e.length-1:e.length;return e.slice(t,n)}function a(e,t){let n=(e.toString().split(`.`)[1]||``).length,r=t.toString(),i=(r.split(`.`)[1]||``).length;if(i===0&&/\d?e-\d?/.test(r)){let e=r.match(/\d?e-(\d?)/);e?.[1]&&(i=Number.parseInt(e[1]))}let a=n>i?n:i;return Number.parseInt(e.toFixed(a).replace(`.`,``))%Number.parseInt(t.toFixed(a).replace(`.`,``))/10**a}const o=Symbol(`evaluating`);function s(e,t,n){let r;Object.defineProperty(e,t,{get(){if(r!==o)return r===void 0&&(r=o,r=n()),r},set(n){Object.defineProperty(e,t,{value:n})},configurable:!0})}function c(e,t,n){Object.defineProperty(e,t,{value:n,writable:!0,enumerable:!0,configurable:!0})}function l(...e){let t={};for(let n of e){let e=Object.getOwnPropertyDescriptors(n);Object.assign(t,e)}return Object.defineProperties({},t)}function u(e){return JSON.stringify(e)}function d(e){return e.toLowerCase().trim().replace(/[^\w\s-]/g,``).replace(/[\s_-]+/g,`-`).replace(/^-+|-+$/g,``)}const f=`captureStackTrace`in Error?Error.captureStackTrace:(...e)=>{};function p(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}const m=n(()=>{if(typeof navigator<`u`&&navigator?.userAgent?.includes(`Cloudflare`))return!1;try{return Function(``),!0}catch{return!1}});function h(e){if(p(e)===!1)return!1;let t=e.constructor;if(t===void 0||typeof t!=`function`)return!0;let n=t.prototype;return!(p(n)===!1||Object.prototype.hasOwnProperty.call(n,`isPrototypeOf`)===!1)}function g(e){return h(e)?{...e}:Array.isArray(e)?[...e]:e}const _=new Set([`string`,`number`,`symbol`]);function v(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function y(e,t,n){let r=new e._zod.constr(t??e._zod.def);return(!t||n?.parent)&&(r._zod.parent=e),r}function b(e){let t=e;if(!t)return{};if(typeof t==`string`)return{error:()=>t};if(t?.message!==void 0){if(t?.error!==void 0)throw Error("Cannot specify both `message` and `error` params");t.error=t.message}return delete t.message,typeof t.error==`string`?{...t,error:()=>t.error}:t}function x(e){return Object.keys(e).filter(t=>e[t]._zod.optin===`optional`&&e[t]._zod.optout===`optional`)}const S={safeint:[-(2**53-1),2**53-1],int32:[-2147483648,2147483647],uint32:[0,4294967295],float32:[-34028234663852886e22,34028234663852886e22],float64:[-Number.MAX_VALUE,Number.MAX_VALUE]};function C(e,t){let n=e._zod.def;return y(e,l(e._zod.def,{get shape(){let e={};for(let r in t){if(!(r in n.shape))throw Error(`Unrecognized key: "${r}"`);t[r]&&(e[r]=n.shape[r])}return c(this,`shape`,e),e},checks:[]}))}function w(e,t){let n=e._zod.def;return y(e,l(e._zod.def,{get shape(){let r={...e._zod.def.shape};for(let e in t){if(!(e in n.shape))throw Error(`Unrecognized key: "${e}"`);t[e]&&delete r[e]}return c(this,`shape`,r),r},checks:[]}))}function T(e,t){if(!h(t))throw Error(`Invalid input to extend: expected a plain object`);let n=e._zod.def.checks;if(n&&n.length>0)throw Error("Object schemas containing refinements cannot be extended. Use `.safeExtend()` instead.");return y(e,l(e._zod.def,{get shape(){let n={...e._zod.def.shape,...t};return c(this,`shape`,n),n},checks:[]}))}function E(e,t){if(!h(t))throw Error(`Invalid input to safeExtend: expected a plain object`);return y(e,{...e._zod.def,get shape(){let n={...e._zod.def.shape,...t};return c(this,`shape`,n),n},checks:e._zod.def.checks})}function D(e,t){return y(e,l(e._zod.def,{get shape(){let n={...e._zod.def.shape,...t._zod.def.shape};return c(this,`shape`,n),n},get catchall(){return t._zod.def.catchall},checks:[]}))}function O(e,t,n){return y(t,l(t._zod.def,{get shape(){let r=t._zod.def.shape,i={...r};if(n)for(let t in n){if(!(t in r))throw Error(`Unrecognized key: "${t}"`);n[t]&&(i[t]=e?new e({type:`optional`,innerType:r[t]}):r[t])}else for(let t in r)i[t]=e?new e({type:`optional`,innerType:r[t]}):r[t];return c(this,`shape`,i),i},checks:[]}))}function k(e,t,n){return y(t,l(t._zod.def,{get shape(){let r=t._zod.def.shape,i={...r};if(n)for(let t in n){if(!(t in i))throw Error(`Unrecognized key: "${t}"`);n[t]&&(i[t]=new e({type:`nonoptional`,innerType:r[t]}))}else for(let t in r)i[t]=new e({type:`nonoptional`,innerType:r[t]});return c(this,`shape`,i),i},checks:[]}))}function A(e,t=0){if(e.aborted===!0)return!0;for(let n=t;n<e.issues.length;n++)if(e.issues[n]?.continue!==!0)return!0;return!1}function j(e,t){return t.map(t=>{var n;return(n=t).path??(n.path=[]),t.path.unshift(e),t})}function M(e){return typeof e==`string`?e:e?.message}function N(e,t,n){let r={...e,path:e.path??[]};return e.message||(r.message=M(e.inst?._zod.def?.error?.(e))??M(t?.error?.(e))??M(n.customError?.(e))??M(n.localeError?.(e))??`Invalid input`),delete r.inst,delete r.continue,t?.reportInput||delete r.input,r}function P(e){return Array.isArray(e)?`array`:typeof e==`string`?`string`:`unknown`}function F(...e){let[t,n,r]=e;return typeof t==`string`?{message:t,code:`custom`,input:n,inst:r}:{...t}}export{S as NUMBER_FORMAT_RANGES,A as aborted,m as allowsEval,n as cached,f as captureStackTrace,i as cleanRegex,y as clone,s as defineLazy,u as esc,v as escapeRegex,T as extend,N as finalizeIssue,a as floatSafeRemainder,e as getEnumValues,P as getLengthableOrigin,p as isObject,h as isPlainObject,F as issue,t as jsonStringifyReplacer,D as merge,l as mergeDefs,b as normalizeParams,r as nullish,w as omit,x as optionalKeys,O as partial,C as pick,j as prefixIssues,_ as propertyKeyTypes,k as required,E as safeExtend,g as shallowClone,d as slugify};
@@ -0,0 +1 @@
1
+ const e={major:4,minor:2,patch:1};export{e as version};
@@ -1,4 +1,3 @@
1
1
  var e=class{knowledge;minConfidence;prependPrompt;constructor(e){this.knowledge=e.knowledge,this.minConfidence=e.minConfidence??.65,this.prependPrompt=e.prependPrompt}async resolve(e){let t=this.buildQuestion(e),n=await this.knowledge.query(t);return this.toResolution(e,n)}buildQuestion(e){let t=[`Subject: ${e.subject}`,`Channel: ${e.channel}`];return e.customerName&&t.push(`Customer: ${e.customerName}`),[this.prependPrompt,t.join(`
2
2
  `),`---`,e.body].filter(Boolean).join(`
3
- `)}toResolution(e,t){let n=t.references.map(e=>({label:typeof e.payload?.title==`string`?e.payload.title:typeof e.payload?.documentId==`string`?e.payload.documentId:e.id,url:typeof e.payload?.url==`string`?e.payload.url:void 0,snippet:typeof e.payload?.text==`string`?e.payload.text.slice(0,280):void 0,score:e.score})),r=this.deriveConfidence(t),i=r<this.minConfidence||n.length===0;return{ticketId:e.id,answer:t.answer,confidence:r,citations:n,actions:[i?{type:`escalate`,label:`Escalate for human review`}:{type:`respond`,label:`Send automated response`}],escalationReason:i?`Insufficient confidence or missing knowledge references`:void 0,knowledgeUpdates:i?[e.body.slice(0,200)]:void 0}}deriveConfidence(e){if(!e.references.length)return .3;let t=e.references[0]?.score??.4,n=Math.min(1,Math.max(0,t)),r=e.usage?.completionTokens?Math.min(e.usage.completionTokens/1e3,.2):0;return Number((n-r).toFixed(2))}};export{e as TicketResolver};
4
- //# sourceMappingURL=ticket-resolver.js.map
3
+ `)}toResolution(e,t){let n=t.references.map(e=>({label:typeof e.payload?.title==`string`?e.payload.title:typeof e.payload?.documentId==`string`?e.payload.documentId:e.id,url:typeof e.payload?.url==`string`?e.payload.url:void 0,snippet:typeof e.payload?.text==`string`?e.payload.text.slice(0,280):void 0,score:e.score})),r=this.deriveConfidence(t),i=r<this.minConfidence||n.length===0;return{ticketId:e.id,answer:t.answer,confidence:r,citations:n,actions:[i?{type:`escalate`,label:`Escalate for human review`}:{type:`respond`,label:`Send automated response`}],escalationReason:i?`Insufficient confidence or missing knowledge references`:void 0,knowledgeUpdates:i?[e.body.slice(0,200)]:void 0}}deriveConfidence(e){if(!e.references.length)return .3;let t=e.references[0]?.score??.4,n=Math.min(1,Math.max(0,t)),r=e.usage?.completionTokens?Math.min(e.usage.completionTokens/1e3,.2):0;return Number((n-r).toFixed(2))}};export{e as TicketResolver};
package/dist/spec.js CHANGED
@@ -1,2 +1 @@
1
- import{t as e}from"./ai-agent/dist/spec.js";import"./ai-agent/dist/index.js";function t(t){return{...e({...t.base,policy:{...t.base.policy,confidence:{min:t.base.policy?.confidence?.min??.7,default:t.base.policy?.confidence?.default??.6},escalation:{confidenceThreshold:t.autoEscalateThreshold??t.base.policy?.escalation?.confidenceThreshold??t.base.policy?.confidence?.min??.7,...t.base.policy?.escalation}},memory:t.base.memory??{maxEntries:120,ttlMinutes:120},tools:t.tools??t.base.tools,instructions:`${t.base.instructions}\n\nAlways cite support knowledge sources and flag compliance/billing issues for human review when unsure.`}),thresholds:{autoResolveMinConfidence:t.autoEscalateThreshold??.75,maxIterations:6}}}export{t as defineSupportBot};
2
- //# sourceMappingURL=spec.js.map
1
+ import{defineAgent as e}from"@lssm/lib.ai-agent";function t(t){return{...e({...t.base,policy:{...t.base.policy,confidence:{min:t.base.policy?.confidence?.min??.7,default:t.base.policy?.confidence?.default??.6},escalation:{confidenceThreshold:t.autoEscalateThreshold??t.base.policy?.escalation?.confidenceThreshold??t.base.policy?.confidence?.min??.7,...t.base.policy?.escalation}},memory:t.base.memory??{maxEntries:120,ttlMinutes:120},tools:t.tools??t.base.tools,instructions:`${t.base.instructions}\n\nAlways cite support knowledge sources and flag compliance/billing issues for human review when unsure.`}),thresholds:{autoResolveMinConfidence:t.autoEscalateThreshold??.75,maxIterations:6}}}export{t as defineSupportBot};
@@ -1,2 +1 @@
1
- const e={billing:[`invoice`,`payout`,`refund`,`charge`,`billing`,`payment`],technical:[`bug`,`error`,`crash`,`issue`,`failed`,`timeout`],product:[`feature`,`roadmap`,`idea`,`request`,`feedback`],account:[`login`,`password`,`2fa`,`account`,`profile`,`email change`],compliance:[`kyc`,`aml`,`compliance`,`regulation`,`gdpr`],other:[]},t={urgent:[`urgent`,`asap`,`immediately`,`today`,`right away`],high:[`high priority`,`blocking`,`major`,`critical`],medium:[`soon`,`next few days`],low:[`nice to have`,`when possible`,`later`]},n={positive:[`love`,`great`,`awesome`,`thank you`],neutral:[`question`,`wonder`,`curious`],negative:[`unhappy`,`bad`,`terrible`,`awful`,`angry`],frustrated:[`furious`,`frustrated`,`fed up`,`ridiculous`]};var r=class{keywords;llm;llmModel;constructor(t){this.keywords={...e,...t?.keywords??{}},this.llm=t?.llm,this.llmModel=t?.llmModel}async classify(e){let t=this.heuristicClassification(e);if(!this.llm)return t;try{let n=(await this.llm.chat([{role:`system`,content:[{type:`text`,text:`Classify the support ticket.`}]},{role:`user`,content:[{type:`text`,text:JSON.stringify({subject:e.subject,body:e.body,channel:e.channel})}]}],{responseFormat:`json`,model:this.llmModel})).message.content.find(e=>`text`in e);if(n&&`text`in n){let e=JSON.parse(n.text);return{...t,...e,intents:e.intents??t.intents,tags:e.tags??t.tags}}}catch{}return t}heuristicClassification(e){let t=`${e.subject}\n${e.body}`.toLowerCase(),n=this.detectCategory(t),r=this.detectPriority(t),i=this.detectSentiment(t),a=this.extractIntents(t),o=a.slice(0,3),s=this.estimateConfidence(n,r,i);return{ticketId:e.id,category:n,priority:r,sentiment:i,intents:a,tags:o,confidence:s,escalationRequired:r===`urgent`||n===`compliance`}}detectCategory(e){for(let[t,n]of Object.entries(this.keywords))if(n.some(t=>e.includes(t)))return t;return`other`}detectPriority(e){for(let n of[`urgent`,`high`,`medium`,`low`])if(t[n].some(t=>e.includes(t)))return n;return`medium`}detectSentiment(e){for(let t of[`frustrated`,`negative`,`neutral`,`positive`])if(n[t].some(t=>e.includes(t)))return t;return`neutral`}extractIntents(e){let t=[];return(e.includes(`refund`)||e.includes(`chargeback`))&&t.push(`refund`),e.includes(`payout`)&&t.push(`payout`),e.includes(`login`)&&t.push(`login-help`),e.includes(`feature`)&&t.push(`feature-request`),(e.includes(`bug`)||e.includes(`error`))&&t.push(`bug-report`),t.length?t:[`general`]}estimateConfidence(e,t,n){let r=.6;return e!==`other`&&(r+=.1),(t===`urgent`||t===`low`)&&(r+=.05),n===`frustrated`&&(r-=.05),Math.min(.95,Math.max(.4,Number(r.toFixed(2))))}};export{r as TicketClassifier};
2
- //# sourceMappingURL=classifier.js.map
1
+ const e={billing:[`invoice`,`payout`,`refund`,`charge`,`billing`,`payment`],technical:[`bug`,`error`,`crash`,`issue`,`failed`,`timeout`],product:[`feature`,`roadmap`,`idea`,`request`,`feedback`],account:[`login`,`password`,`2fa`,`account`,`profile`,`email change`],compliance:[`kyc`,`aml`,`compliance`,`regulation`,`gdpr`],other:[]},t={urgent:[`urgent`,`asap`,`immediately`,`today`,`right away`],high:[`high priority`,`blocking`,`major`,`critical`],medium:[`soon`,`next few days`],low:[`nice to have`,`when possible`,`later`]},n={positive:[`love`,`great`,`awesome`,`thank you`],neutral:[`question`,`wonder`,`curious`],negative:[`unhappy`,`bad`,`terrible`,`awful`,`angry`],frustrated:[`furious`,`frustrated`,`fed up`,`ridiculous`]};var r=class{keywords;llm;llmModel;constructor(t){this.keywords={...e,...t?.keywords??{}},this.llm=t?.llm,this.llmModel=t?.llmModel}async classify(e){let t=this.heuristicClassification(e);if(!this.llm)return t;try{let n=(await this.llm.chat([{role:`system`,content:[{type:`text`,text:`Classify the support ticket.`}]},{role:`user`,content:[{type:`text`,text:JSON.stringify({subject:e.subject,body:e.body,channel:e.channel})}]}],{responseFormat:`json`,model:this.llmModel})).message.content.find(e=>`text`in e);if(n&&`text`in n){let e=JSON.parse(n.text);return{...t,...e,intents:e.intents??t.intents,tags:e.tags??t.tags}}}catch{}return t}heuristicClassification(e){let t=`${e.subject}\n${e.body}`.toLowerCase(),n=this.detectCategory(t),r=this.detectPriority(t),i=this.detectSentiment(t),a=this.extractIntents(t),o=a.slice(0,3),s=this.estimateConfidence(n,r,i);return{ticketId:e.id,category:n,priority:r,sentiment:i,intents:a,tags:o,confidence:s,escalationRequired:r===`urgent`||n===`compliance`}}detectCategory(e){for(let[t,n]of Object.entries(this.keywords))if(n.some(t=>e.includes(t)))return t;return`other`}detectPriority(e){for(let n of[`urgent`,`high`,`medium`,`low`])if(t[n].some(t=>e.includes(t)))return n;return`medium`}detectSentiment(e){for(let t of[`frustrated`,`negative`,`neutral`,`positive`])if(n[t].some(t=>e.includes(t)))return t;return`neutral`}extractIntents(e){let t=[];return(e.includes(`refund`)||e.includes(`chargeback`))&&t.push(`refund`),e.includes(`payout`)&&t.push(`payout`),e.includes(`login`)&&t.push(`login-help`),e.includes(`feature`)&&t.push(`feature-request`),(e.includes(`bug`)||e.includes(`error`))&&t.push(`bug-report`),t.length?t:[`general`]}estimateConfidence(e,t,n){let r=.6;return e!==`other`&&(r+=.1),(t===`urgent`||t===`low`)&&(r+=.05),n===`frustrated`&&(r-=.05),Math.min(.95,Math.max(.4,Number(r.toFixed(2))))}};export{r as TicketClassifier};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lssm/lib.support-bot",
3
- "version": "0.4.0",
3
+ "version": "1.41.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",
@@ -22,30 +22,44 @@
22
22
  "test": "bun run"
23
23
  },
24
24
  "dependencies": {
25
- "@lssm/lib.ai-agent": "^0.4.0",
26
- "@lssm/lib.contracts": "^1.11.0"
25
+ "@lssm/lib.ai-agent": "workspace:*",
26
+ "@lssm/lib.contracts": "workspace:*"
27
27
  },
28
28
  "devDependencies": {
29
- "@lssm/tool.tsdown": "0.12.0",
30
- "@lssm/tool.typescript": "0.11.0",
31
- "tsdown": "^0.16.6",
29
+ "@lssm/tool.tsdown": "workspace:*",
30
+ "@lssm/tool.typescript": "workspace:*",
31
+ "tsdown": "^0.17.4",
32
32
  "typescript": "^5.9.3"
33
33
  },
34
34
  "exports": {
35
- ".": "./dist/index.js",
36
- "./bot": "./dist/bot/index.js",
37
- "./bot/auto-responder": "./dist/bot/auto-responder.js",
38
- "./bot/feedback-loop": "./dist/bot/feedback-loop.js",
39
- "./bot/tools": "./dist/bot/tools.js",
40
- "./rag": "./dist/rag/index.js",
41
- "./rag/ticket-resolver": "./dist/rag/ticket-resolver.js",
42
- "./spec": "./dist/spec.js",
43
- "./tickets": "./dist/tickets/index.js",
44
- "./tickets/classifier": "./dist/tickets/classifier.js",
45
- "./types": "./dist/types.js",
35
+ ".": "./src/index.ts",
36
+ "./bot": "./src/bot/index.ts",
37
+ "./bot/auto-responder": "./src/bot/auto-responder.ts",
38
+ "./bot/feedback-loop": "./src/bot/feedback-loop.ts",
39
+ "./bot/tools": "./src/bot/tools.ts",
40
+ "./rag": "./src/rag/index.ts",
41
+ "./rag/ticket-resolver": "./src/rag/ticket-resolver.ts",
42
+ "./spec": "./src/spec.ts",
43
+ "./tickets": "./src/tickets/index.ts",
44
+ "./tickets/classifier": "./src/tickets/classifier.ts",
45
+ "./types": "./src/types.ts",
46
46
  "./*": "./*"
47
47
  },
48
48
  "publishConfig": {
49
- "access": "public"
49
+ "access": "public",
50
+ "exports": {
51
+ ".": "./dist/index.js",
52
+ "./bot": "./dist/bot/index.js",
53
+ "./bot/auto-responder": "./dist/bot/auto-responder.js",
54
+ "./bot/feedback-loop": "./dist/bot/feedback-loop.js",
55
+ "./bot/tools": "./dist/bot/tools.js",
56
+ "./rag": "./dist/rag/index.js",
57
+ "./rag/ticket-resolver": "./dist/rag/ticket-resolver.js",
58
+ "./spec": "./dist/spec.js",
59
+ "./tickets": "./dist/tickets/index.js",
60
+ "./tickets/classifier": "./dist/tickets/classifier.js",
61
+ "./types": "./dist/types.js",
62
+ "./*": "./*"
63
+ }
50
64
  }
51
65
  }
@@ -1 +0,0 @@
1
- import"./workflow.js";
@@ -1 +0,0 @@
1
- import"node:crypto";
@@ -1 +0,0 @@
1
- import{t as e}from"./spec.js";import"./tools/executor.js";import"./memory/manager.js";import"./runner.js";import"./memory/in-memory.js";import"./memory/index.js";import"./tools/index.js";import"./approval/workflow.js";import"./approval/index.js";
@@ -1 +0,0 @@
1
- import"./manager.js";
@@ -1 +0,0 @@
1
- import"./manager.js";import"./in-memory.js";
@@ -1 +0,0 @@
1
- import"node:crypto";
@@ -1 +0,0 @@
1
- import"./tools/executor.js";import"./memory/manager.js";import"node:crypto";
@@ -1,2 +0,0 @@
1
- function e(e){if(!e.meta?.name)throw Error(`Agent name is required`);if(!Number.isFinite(e.meta.version))throw Error(`Agent ${e.meta.name} is missing a numeric version`);if(!e.instructions?.trim())throw Error(`Agent ${e.meta.name} requires instructions`);if(!e.tools?.length)throw Error(`Agent ${e.meta.name} must expose at least one tool`);return Object.freeze(e)}export{e as t};
2
- //# sourceMappingURL=spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"spec.js","names":[],"sources":["../../../../ai-agent/dist/spec.js"],"sourcesContent":["const e=e=>`${e.name}.v${e.version}`;function t(e){if(!e.meta?.name)throw Error(`Agent name is required`);if(!Number.isFinite(e.meta.version))throw Error(`Agent ${e.meta.name} is missing a numeric version`);if(!e.instructions?.trim())throw Error(`Agent ${e.meta.name} requires instructions`);if(!e.tools?.length)throw Error(`Agent ${e.meta.name} must expose at least one tool`);return Object.freeze(e)}var n=class{specs=new Map;register(t){let n=e(t.meta);if(this.specs.has(n))throw Error(`Duplicate agent spec registered for ${n}`);return this.specs.set(n,t),this}list(){return[...this.specs.values()]}get(e,t){if(t!=null)return this.specs.get(`${e}.v${t}`);let n,r=-1/0;for(let t of this.specs.values())t.meta.name===e&&t.meta.version>r&&(n=t,r=t.meta.version);return n}require(e,t){let n=this.get(e,t);if(!n)throw Error(`Agent spec not found for ${e}${t?`.v${t}`:``}`);return n}};export{n as AgentRegistry,t as defineAgent};\n//# sourceMappingURL=spec.js.map"],"mappings":"AAAqC,SAAS,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,KAAK,MAAM,MAAM,yBAAyB,CAAC,GAAG,CAAC,OAAO,SAAS,EAAE,KAAK,QAAQ,CAAC,MAAM,MAAM,SAAS,EAAE,KAAK,KAAK,+BAA+B,CAAC,GAAG,CAAC,EAAE,cAAc,MAAM,CAAC,MAAM,MAAM,SAAS,EAAE,KAAK,KAAK,wBAAwB,CAAC,GAAG,CAAC,EAAE,OAAO,OAAO,MAAM,MAAM,SAAS,EAAE,KAAK,KAAK,gCAAgC,CAAC,OAAO,OAAO,OAAO,EAAE"}
@@ -1 +0,0 @@
1
- import"node:timers/promises";
@@ -1 +0,0 @@
1
- import"./executor.js";
@@ -1,26 +0,0 @@
1
- import { SupportResolution, SupportResponseDraft, SupportTicket, TicketClassification } from "../types.js";
2
- import { LLMProvider } from "@lssm/lib.contracts/integrations/providers/llm";
3
-
4
- //#region src/bot/auto-responder.d.ts
5
- interface AutoResponderOptions {
6
- llm?: LLMProvider;
7
- model?: string;
8
- tone?: 'friendly' | 'formal';
9
- closing?: string;
10
- }
11
- declare class AutoResponder {
12
- private readonly llm?;
13
- private readonly model?;
14
- private readonly tone;
15
- private readonly closing;
16
- constructor(options?: AutoResponderOptions);
17
- draft(ticket: SupportTicket, resolution: SupportResolution, classification: TicketClassification): Promise<SupportResponseDraft>;
18
- private generateWithLLM;
19
- private generateTemplate;
20
- private buildDraft;
21
- private renderCategoryIntro;
22
- private renderCitations;
23
- }
24
- //#endregion
25
- export { AutoResponder, AutoResponderOptions };
26
- //# sourceMappingURL=auto-responder.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auto-responder.d.ts","names":[],"sources":["../../src/bot/auto-responder.ts"],"sourcesContent":[],"mappings":";;;;UAQiB,oBAAA;QACT;EADS,KAAA,CAAA,EAAA,MAAA;EAOJ,IAAA,CAAA,EAAA,UAAa,GAAA,QAAA;EAMF,OAAA,CAAA,EAAA,MAAA;;AAaR,cAnBH,aAAA,CAmBG;EACI,iBAAA,GAAA;EACP,iBAAA,KAAA;EAAR,iBAAA,IAAA;EAAO,iBAAA,OAAA;wBAfY;gBAYZ,2BACI,mCACI,uBACf,QAAQ"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"auto-responder.js","names":[],"sources":["../../src/bot/auto-responder.ts"],"sourcesContent":["import type { LLMProvider } from '@lssm/lib.contracts/integrations/providers/llm';\nimport type {\n SupportResponseDraft,\n SupportResolution,\n SupportTicket,\n TicketClassification,\n} from '../types';\n\nexport interface AutoResponderOptions {\n llm?: LLMProvider;\n model?: string;\n tone?: 'friendly' | 'formal';\n closing?: string;\n}\n\nexport class AutoResponder {\n private readonly llm?: LLMProvider;\n private readonly model?: string;\n private readonly tone: 'friendly' | 'formal';\n private readonly closing: string;\n\n constructor(options?: AutoResponderOptions) {\n this.llm = options?.llm;\n this.model = options?.model;\n this.tone = options?.tone ?? 'friendly';\n this.closing =\n options?.closing ??\n (this.tone === 'friendly'\n ? 'We remain available if you need anything else.'\n : 'Please let us know if you require additional assistance.');\n }\n\n async draft(\n ticket: SupportTicket,\n resolution: SupportResolution,\n classification: TicketClassification\n ): Promise<SupportResponseDraft> {\n if (this.llm) {\n return this.generateWithLLM(ticket, resolution, classification);\n }\n return this.generateTemplate(ticket, resolution, classification);\n }\n\n private async generateWithLLM(\n ticket: SupportTicket,\n resolution: SupportResolution,\n classification: TicketClassification\n ): Promise<SupportResponseDraft> {\n const prompt = `You are a ${this.tone} support agent. Draft an email response.\nTicket Subject: ${ticket.subject}\nTicket Body: ${ticket.body}\nDetected Category: ${classification.category}\nDetected Priority: ${classification.priority}\nResolution:\n${resolution.answer}\nCitations: ${resolution.citations.map((c) => c.label).join(', ')}`;\n\n const response = await this.llm!.chat(\n [\n {\n role: 'system',\n content: [\n {\n type: 'text',\n text: 'Write empathetic, accurate support replies that cite sources when relevant.',\n },\n ],\n },\n {\n role: 'user',\n content: [{ type: 'text', text: prompt }],\n },\n ],\n { model: this.model }\n );\n\n const body = response.message.content\n .map((part) => ('text' in part ? part.text : ''))\n .join('')\n .trim();\n\n return this.buildDraft(ticket, resolution, classification, body);\n }\n\n private generateTemplate(\n ticket: SupportTicket,\n resolution: SupportResolution,\n classification: TicketClassification\n ): SupportResponseDraft {\n const greeting = ticket.customerName\n ? `Hi ${ticket.customerName},`\n : 'Hi there,';\n const body = `${greeting}\n\nThanks for contacting us about \"${ticket.subject}\". ${this.renderCategoryIntro(\n classification\n )}\n\n${resolution.answer}\n\n${this.renderCitations(resolution)}\n${this.closing}\n\n— ContractSpec Support`;\n\n return this.buildDraft(ticket, resolution, classification, body);\n }\n\n private buildDraft(\n ticket: SupportTicket,\n resolution: SupportResolution,\n classification: TicketClassification,\n body: string\n ): SupportResponseDraft {\n return {\n ticketId: ticket.id,\n subject: ticket.subject.startsWith('Re:')\n ? ticket.subject\n : `Re: ${ticket.subject}`,\n body,\n confidence: Math.min(resolution.confidence, classification.confidence),\n requiresEscalation:\n resolution.actions.some((action) => action.type === 'escalate') ||\n Boolean(classification.escalationRequired),\n citations: resolution.citations,\n };\n }\n\n private renderCategoryIntro(classification: TicketClassification) {\n switch (classification.category) {\n case 'billing':\n return 'I understand billing issues can be stressful, so let me clarify the situation.';\n case 'technical':\n return 'I see you encountered a technical issue. Here is what happened and how to fix it.';\n case 'product':\n return 'Thanks for sharing feedback about the product. Here are the next steps.';\n case 'account':\n return 'Account access is critical, so let me walk you through the resolution.';\n case 'compliance':\n return 'Compliance questions require precision. See the policy-aligned answer below.';\n default:\n return 'Here is what we found after reviewing your request.';\n }\n }\n\n private renderCitations(resolution: SupportResolution) {\n if (!resolution.citations.length) return '';\n const lines = resolution.citations.map((citation, index) => {\n const label = citation.label || `Source ${index + 1}`;\n const link = citation.url ? ` (${citation.url})` : '';\n return `- ${label}${link}`;\n });\n return `References:\\n${lines.join('\\n')}`;\n }\n}\n"],"mappings":"AAeA,IAAa,EAAb,KAA2B,CACzB,IACA,MACA,KACA,QAEA,YAAY,EAAgC,CAC1C,KAAK,IAAM,GAAS,IACpB,KAAK,MAAQ,GAAS,MACtB,KAAK,KAAO,GAAS,MAAQ,WAC7B,KAAK,QACH,GAAS,UACR,KAAK,OAAS,WACX,iDACA,4DAGR,MAAM,MACJ,EACA,EACA,EAC+B,CAI/B,OAHI,KAAK,IACA,KAAK,gBAAgB,EAAQ,EAAY,EAAe,CAE1D,KAAK,iBAAiB,EAAQ,EAAY,EAAe,CAGlE,MAAc,gBACZ,EACA,EACA,EAC+B,CAC/B,IAAM,EAAS,aAAa,KAAK,KAAK;kBACxB,EAAO,QAAQ;eAClB,EAAO,KAAK;qBACN,EAAe,SAAS;qBACxB,EAAe,SAAS;;EAE3C,EAAW,OAAO;aACP,EAAW,UAAU,IAAK,GAAM,EAAE,MAAM,CAAC,KAAK,KAAK,GAqBtD,GAnBW,MAAM,KAAK,IAAK,KAC/B,CACE,CACE,KAAM,SACN,QAAS,CACP,CACE,KAAM,OACN,KAAM,8EACP,CACF,CACF,CACD,CACE,KAAM,OACN,QAAS,CAAC,CAAE,KAAM,OAAQ,KAAM,EAAQ,CAAC,CAC1C,CACF,CACD,CAAE,MAAO,KAAK,MAAO,CACtB,EAEqB,QAAQ,QAC3B,IAAK,GAAU,SAAU,EAAO,EAAK,KAAO,GAAI,CAChD,KAAK,GAAG,CACR,MAAM,CAET,OAAO,KAAK,WAAW,EAAQ,EAAY,EAAgB,EAAK,CAGlE,iBACE,EACA,EACA,EACsB,CAItB,IAAM,EAAO,GAHI,EAAO,aACpB,MAAM,EAAO,aAAa,GAC1B,YACqB;;kCAEK,EAAO,QAAQ,KAAK,KAAK,oBACrD,EACD,CAAC;;EAEJ,EAAW,OAAO;;EAElB,KAAK,gBAAgB,EAAW,CAAC;EACjC,KAAK,QAAQ;;wBAIX,OAAO,KAAK,WAAW,EAAQ,EAAY,EAAgB,EAAK,CAGlE,WACE,EACA,EACA,EACA,EACsB,CACtB,MAAO,CACL,SAAU,EAAO,GACjB,QAAS,EAAO,QAAQ,WAAW,MAAM,CACrC,EAAO,QACP,OAAO,EAAO,UAClB,OACA,WAAY,KAAK,IAAI,EAAW,WAAY,EAAe,WAAW,CACtE,mBACE,EAAW,QAAQ,KAAM,GAAW,EAAO,OAAS,WAAW,EAC/D,EAAQ,EAAe,mBACzB,UAAW,EAAW,UACvB,CAGH,oBAA4B,EAAsC,CAChE,OAAQ,EAAe,SAAvB,CACE,IAAK,UACH,MAAO,iFACT,IAAK,YACH,MAAO,oFACT,IAAK,UACH,MAAO,0EACT,IAAK,UACH,MAAO,yEACT,IAAK,aACH,MAAO,+EACT,QACE,MAAO,uDAIb,gBAAwB,EAA+B,CAOrD,OANK,EAAW,UAAU,OAMnB,gBALO,EAAW,UAAU,KAAK,EAAU,IAGzC,KAFO,EAAS,OAAS,UAAU,EAAQ,MACrC,EAAS,IAAM,KAAK,EAAS,IAAI,GAAK,KAEnD,CAC2B,KAAK;EAAK,GANE"}
@@ -1,20 +0,0 @@
1
- import { ResolutionResultPayload } from "../types.js";
2
-
3
- //#region src/bot/feedback-loop.d.ts
4
- interface FeedbackMetrics {
5
- totalTickets: number;
6
- autoResolved: number;
7
- escalated: number;
8
- avgConfidence: number;
9
- avgResponseTimeMs: number;
10
- }
11
- declare class SupportFeedbackLoop {
12
- private readonly history;
13
- private readonly responseTimes;
14
- recordResolution(payload: ResolutionResultPayload, responseTimeMs?: number): void;
15
- metrics(): FeedbackMetrics;
16
- feedbackSummary(limit?: number): string;
17
- }
18
- //#endregion
19
- export { FeedbackMetrics, SupportFeedbackLoop };
20
- //# sourceMappingURL=feedback-loop.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"feedback-loop.d.ts","names":[],"sources":["../../src/bot/feedback-loop.ts"],"sourcesContent":[],"mappings":";;;UAEiB,eAAA;;EAAA,YAAA,EAAA,MAAe;EAQnB,SAAA,EAAA,MAAA;;;;cAAA,mBAAA;;;4BAIe;aAOf"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"feedback-loop.js","names":[],"sources":["../../src/bot/feedback-loop.ts"],"sourcesContent":["import type { ResolutionResultPayload } from '../types';\n\nexport interface FeedbackMetrics {\n totalTickets: number;\n autoResolved: number;\n escalated: number;\n avgConfidence: number;\n avgResponseTimeMs: number;\n}\n\nexport class SupportFeedbackLoop {\n private readonly history: ResolutionResultPayload[] = [];\n private readonly responseTimes = new Map<string, number>();\n\n recordResolution(payload: ResolutionResultPayload, responseTimeMs?: number) {\n this.history.push(payload);\n if (responseTimeMs != null) {\n this.responseTimes.set(payload.ticket.id, responseTimeMs);\n }\n }\n\n metrics(): FeedbackMetrics {\n const total = this.history.length;\n const autoResolved = this.history.filter(\n (entry) =>\n !entry.resolution.actions.some((action) => action.type === 'escalate')\n ).length;\n const escalated = total - autoResolved;\n const avgConfidence =\n total === 0\n ? 0\n : this.history.reduce(\n (sum, entry) => sum + entry.resolution.confidence,\n 0\n ) / total;\n const avgResponseTimeMs =\n this.responseTimes.size === 0\n ? 0\n : [...this.responseTimes.values()].reduce((a, b) => a + b, 0) /\n this.responseTimes.size;\n\n return {\n totalTickets: total,\n autoResolved,\n escalated,\n avgConfidence: Number(avgConfidence.toFixed(2)),\n avgResponseTimeMs: Math.round(avgResponseTimeMs),\n };\n }\n\n feedbackSummary(limit = 5): string {\n const recent = this.history.slice(-limit);\n if (!recent.length) return 'No feedback recorded yet.';\n return recent\n .map((entry) => {\n const status = entry.resolution.actions.some(\n (action) => action.type === 'escalate'\n )\n ? 'Escalated'\n : 'Auto-resolved';\n return `${entry.ticket.subject} – ${status} (confidence: ${entry.resolution.confidence})`;\n })\n .join('\\n');\n }\n}\n"],"mappings":"AAUA,IAAa,EAAb,KAAiC,CAC/B,QAAsD,EAAE,CACxD,cAAiC,IAAI,IAErC,iBAAiB,EAAkC,EAAyB,CAC1E,KAAK,QAAQ,KAAK,EAAQ,CACtB,GAAkB,MACpB,KAAK,cAAc,IAAI,EAAQ,OAAO,GAAI,EAAe,CAI7D,SAA2B,CACzB,IAAM,EAAQ,KAAK,QAAQ,OACrB,EAAe,KAAK,QAAQ,OAC/B,GACC,CAAC,EAAM,WAAW,QAAQ,KAAM,GAAW,EAAO,OAAS,WAAW,CACzE,CAAC,OACI,EAAY,EAAQ,EACpB,EACJ,IAAU,EACN,EACA,KAAK,QAAQ,QACV,EAAK,IAAU,EAAM,EAAM,WAAW,WACvC,EACD,CAAG,EACJ,EACJ,KAAK,cAAc,OAAS,EACxB,EACA,CAAC,GAAG,KAAK,cAAc,QAAQ,CAAC,CAAC,QAAQ,EAAG,IAAM,EAAI,EAAG,EAAE,CAC3D,KAAK,cAAc,KAEzB,MAAO,CACL,aAAc,EACd,eACA,YACA,cAAe,OAAO,EAAc,QAAQ,EAAE,CAAC,CAC/C,kBAAmB,KAAK,MAAM,EAAkB,CACjD,CAGH,gBAAgB,EAAQ,EAAW,CACjC,IAAM,EAAS,KAAK,QAAQ,MAAM,CAAC,EAAM,CAEzC,OADK,EAAO,OACL,EACJ,IAAK,GAAU,CACd,IAAM,EAAS,EAAM,WAAW,QAAQ,KACrC,GAAW,EAAO,OAAS,WAC7B,CACG,YACA,gBACJ,MAAO,GAAG,EAAM,OAAO,QAAQ,KAAK,EAAO,gBAAgB,EAAM,WAAW,WAAW,IACvF,CACD,KAAK;EAAK,CAVc"}
@@ -1,4 +0,0 @@
1
- import { AutoResponder, AutoResponderOptions } from "./auto-responder.js";
2
- import { FeedbackMetrics, SupportFeedbackLoop } from "./feedback-loop.js";
3
- import { SupportToolsetOptions, createSupportTools } from "./tools.js";
4
- export { AutoResponder, AutoResponderOptions, FeedbackMetrics, SupportFeedbackLoop, SupportToolsetOptions, createSupportTools };
@@ -1,15 +0,0 @@
1
- import { AutoResponder } from "./auto-responder.js";
2
- import { TicketResolver } from "../rag/ticket-resolver.js";
3
- import { TicketClassifier } from "../tickets/classifier.js";
4
- import { AgentToolDefinitionWithHandler } from "@lssm/lib.ai-agent";
5
-
6
- //#region src/bot/tools.d.ts
7
- interface SupportToolsetOptions {
8
- resolver: TicketResolver;
9
- classifier: TicketClassifier;
10
- responder: AutoResponder;
11
- }
12
- declare function createSupportTools(options: SupportToolsetOptions): AgentToolDefinitionWithHandler[];
13
- //#endregion
14
- export { SupportToolsetOptions, createSupportTools };
15
- //# sourceMappingURL=tools.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tools.d.ts","names":[],"sources":["../../src/bot/tools.ts"],"sourcesContent":[],"mappings":";;;;;;UAUiB,qBAAA;YACL;EADK,UAAA,EAEH,gBAFwB;EAC1B,SAAA,EAEC,aAFD;;AAEC,iBAGG,kBAAA,CAHH,OAAA,EAIF,qBAJE,CAAA,EAKV,8BALU,EAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"tools.js","names":[],"sources":["../../src/bot/tools.ts"],"sourcesContent":["import type { AgentToolDefinitionWithHandler } from '@lssm/lib.ai-agent';\nimport type { TicketResolver } from '../rag/ticket-resolver';\nimport type { TicketClassifier } from '../tickets/classifier';\nimport type { AutoResponder } from './auto-responder';\nimport type {\n SupportTicket,\n SupportResolution,\n TicketClassification,\n} from '../types';\n\nexport interface SupportToolsetOptions {\n resolver: TicketResolver;\n classifier: TicketClassifier;\n responder: AutoResponder;\n}\n\nexport function createSupportTools(\n options: SupportToolsetOptions\n): AgentToolDefinitionWithHandler[] {\n const classifyTool: AgentToolDefinitionWithHandler = {\n definition: {\n name: 'support_classify_ticket',\n description: 'Classify a ticket for priority, sentiment, and category',\n inputSchema: {\n type: 'object',\n required: ['ticket'],\n properties: {\n ticket: ticketSchema,\n },\n },\n },\n handler: async (input: unknown) => {\n const ticket = ensureTicket(input);\n const classification = await options.classifier.classify(ticket);\n return {\n content: JSON.stringify(classification),\n metadata: { ticketId: ticket.id },\n };\n },\n };\n\n const resolveTool: AgentToolDefinitionWithHandler = {\n definition: {\n name: 'support_resolve_ticket',\n description: 'Generate a knowledge-grounded resolution for a ticket',\n inputSchema: {\n type: 'object',\n required: ['ticket'],\n properties: {\n ticket: ticketSchema,\n },\n },\n },\n handler: async (input: unknown) => {\n const ticket = ensureTicket(input);\n const resolution = await options.resolver.resolve(ticket);\n return {\n content: JSON.stringify(resolution),\n metadata: { ticketId: ticket.id },\n };\n },\n };\n\n const responderTool: AgentToolDefinitionWithHandler = {\n definition: {\n name: 'support_draft_response',\n description:\n 'Draft a user-facing reply based on resolution + classification',\n inputSchema: {\n type: 'object',\n required: ['ticket', 'resolution', 'classification'],\n properties: {\n ticket: ticketSchema,\n resolution: { type: 'object' },\n classification: { type: 'object' },\n },\n },\n },\n handler: async (input: unknown) => {\n const ticket = ensureTicket(input);\n const resolution = extractResolution(input);\n const classification = extractClassification(input);\n if (!resolution || !classification) {\n throw new Error('resolution and classification are required');\n }\n const draft = await options.responder.draft(\n ticket,\n resolution,\n classification\n );\n return {\n content: JSON.stringify(draft),\n metadata: { ticketId: ticket.id },\n };\n },\n };\n\n return [classifyTool, resolveTool, responderTool];\n}\n\nconst ticketSchema = {\n type: 'object',\n required: ['id', 'subject', 'body', 'channel'],\n properties: {\n id: { type: 'string' },\n subject: { type: 'string' },\n body: { type: 'string' },\n channel: { type: 'string', enum: ['email', 'chat', 'phone', 'portal'] },\n customerName: { type: 'string' },\n customerEmail: { type: 'string' },\n metadata: { type: 'object' },\n },\n};\n\nfunction ensureTicket(input: unknown): SupportTicket {\n if (!input || typeof input !== 'object' || !('ticket' in input)) {\n throw new Error('Input must include ticket');\n }\n const ticket = (input as { ticket: SupportTicket }).ticket;\n if (!ticket?.id) throw new Error('Ticket is missing id');\n return ticket;\n}\n\nfunction extractResolution(input: unknown): SupportResolution | undefined {\n if (!input || typeof input !== 'object' || !('resolution' in input))\n return undefined;\n return (input as { resolution?: SupportResolution }).resolution;\n}\n\nfunction extractClassification(\n input: unknown\n): TicketClassification | undefined {\n if (!input || typeof input !== 'object' || !('classification' in input))\n return undefined;\n return (input as { classification?: TicketClassification }).classification;\n}\n"],"mappings":"AAgBA,SAAgB,EACd,EACkC,CA+ElC,MAAO,CA9E8C,CACnD,WAAY,CACV,KAAM,0BACN,YAAa,0DACb,YAAa,CACX,KAAM,SACN,SAAU,CAAC,SAAS,CACpB,WAAY,CACV,OAAQ,EACT,CACF,CACF,CACD,QAAS,KAAO,IAAmB,CACjC,IAAM,EAAS,EAAa,EAAM,CAC5B,EAAiB,MAAM,EAAQ,WAAW,SAAS,EAAO,CAChE,MAAO,CACL,QAAS,KAAK,UAAU,EAAe,CACvC,SAAU,CAAE,SAAU,EAAO,GAAI,CAClC,EAEJ,CAEmD,CAClD,WAAY,CACV,KAAM,yBACN,YAAa,wDACb,YAAa,CACX,KAAM,SACN,SAAU,CAAC,SAAS,CACpB,WAAY,CACV,OAAQ,EACT,CACF,CACF,CACD,QAAS,KAAO,IAAmB,CACjC,IAAM,EAAS,EAAa,EAAM,CAC5B,EAAa,MAAM,EAAQ,SAAS,QAAQ,EAAO,CACzD,MAAO,CACL,QAAS,KAAK,UAAU,EAAW,CACnC,SAAU,CAAE,SAAU,EAAO,GAAI,CAClC,EAEJ,CAEqD,CACpD,WAAY,CACV,KAAM,yBACN,YACE,iEACF,YAAa,CACX,KAAM,SACN,SAAU,CAAC,SAAU,aAAc,iBAAiB,CACpD,WAAY,CACV,OAAQ,EACR,WAAY,CAAE,KAAM,SAAU,CAC9B,eAAgB,CAAE,KAAM,SAAU,CACnC,CACF,CACF,CACD,QAAS,KAAO,IAAmB,CACjC,IAAM,EAAS,EAAa,EAAM,CAC5B,EAAa,EAAkB,EAAM,CACrC,EAAiB,EAAsB,EAAM,CACnD,GAAI,CAAC,GAAc,CAAC,EAClB,MAAU,MAAM,6CAA6C,CAE/D,IAAM,EAAQ,MAAM,EAAQ,UAAU,MACpC,EACA,EACA,EACD,CACD,MAAO,CACL,QAAS,KAAK,UAAU,EAAM,CAC9B,SAAU,CAAE,SAAU,EAAO,GAAI,CAClC,EAEJ,CAEgD,CAGnD,MAAM,EAAe,CACnB,KAAM,SACN,SAAU,CAAC,KAAM,UAAW,OAAQ,UAAU,CAC9C,WAAY,CACV,GAAI,CAAE,KAAM,SAAU,CACtB,QAAS,CAAE,KAAM,SAAU,CAC3B,KAAM,CAAE,KAAM,SAAU,CACxB,QAAS,CAAE,KAAM,SAAU,KAAM,CAAC,QAAS,OAAQ,QAAS,SAAS,CAAE,CACvE,aAAc,CAAE,KAAM,SAAU,CAChC,cAAe,CAAE,KAAM,SAAU,CACjC,SAAU,CAAE,KAAM,SAAU,CAC7B,CACF,CAED,SAAS,EAAa,EAA+B,CACnD,GAAI,CAAC,GAAS,OAAO,GAAU,UAAY,EAAE,WAAY,GACvD,MAAU,MAAM,4BAA4B,CAE9C,IAAM,EAAU,EAAoC,OACpD,GAAI,CAAC,GAAQ,GAAI,MAAU,MAAM,uBAAuB,CACxD,OAAO,EAGT,SAAS,EAAkB,EAA+C,CACpE,MAAC,GAAS,OAAO,GAAU,UAAY,EAAE,eAAgB,IAE7D,OAAQ,EAA6C,WAGvD,SAAS,EACP,EACkC,CAC9B,MAAC,GAAS,OAAO,GAAU,UAAY,EAAE,mBAAoB,IAEjE,OAAQ,EAAoD"}
package/dist/index.d.ts DELETED
@@ -1,8 +0,0 @@
1
- import { ClassificationResultPayload, ResolutionResultPayload, SupportAction, SupportBotSpec, SupportCitation, SupportResolution, SupportResponseDraft, SupportTicket, TicketCategory, TicketChannel, TicketClassification, TicketPriority, TicketSentiment } from "./types.js";
2
- import { AutoResponder, AutoResponderOptions } from "./bot/auto-responder.js";
3
- import { FeedbackMetrics, SupportFeedbackLoop } from "./bot/feedback-loop.js";
4
- import { KnowledgeRetriever, TicketResolver, TicketResolverOptions } from "./rag/ticket-resolver.js";
5
- import { TicketClassifier, TicketClassifierOptions } from "./tickets/classifier.js";
6
- import { SupportToolsetOptions, createSupportTools } from "./bot/tools.js";
7
- import { SupportBotDefinition, defineSupportBot } from "./spec.js";
8
- export { AutoResponder, AutoResponderOptions, ClassificationResultPayload, FeedbackMetrics, KnowledgeRetriever, ResolutionResultPayload, SupportAction, SupportBotDefinition, SupportBotSpec, SupportCitation, SupportFeedbackLoop, SupportResolution, SupportResponseDraft, SupportTicket, SupportToolsetOptions, TicketCategory, TicketChannel, TicketClassification, TicketClassifier, TicketClassifierOptions, TicketPriority, TicketResolver, TicketResolverOptions, TicketSentiment, createSupportTools, defineSupportBot };
@@ -1,2 +0,0 @@
1
- import { KnowledgeRetriever, TicketResolver, TicketResolverOptions } from "./ticket-resolver.js";
2
- export { KnowledgeRetriever, TicketResolver, TicketResolverOptions };
@@ -1,25 +0,0 @@
1
- import { SupportResolution, SupportTicket } from "../types.js";
2
- import { KnowledgeAnswer } from "@lssm/lib.contracts/knowledge/query/service";
3
-
4
- //#region src/rag/ticket-resolver.d.ts
5
- interface KnowledgeRetriever {
6
- query(question: string): Promise<KnowledgeAnswer>;
7
- }
8
- interface TicketResolverOptions {
9
- knowledge: KnowledgeRetriever;
10
- minConfidence?: number;
11
- prependPrompt?: string;
12
- }
13
- declare class TicketResolver {
14
- private readonly knowledge;
15
- private readonly minConfidence;
16
- private readonly prependPrompt?;
17
- constructor(options: TicketResolverOptions);
18
- resolve(ticket: SupportTicket): Promise<SupportResolution>;
19
- private buildQuestion;
20
- private toResolution;
21
- private deriveConfidence;
22
- }
23
- //#endregion
24
- export { KnowledgeRetriever, TicketResolver, TicketResolverOptions };
25
- //# sourceMappingURL=ticket-resolver.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ticket-resolver.d.ts","names":[],"sources":["../../src/rag/ticket-resolver.ts"],"sourcesContent":[],"mappings":";;;;UAGiB,kBAAA;2BACU,QAAQ;AADnC;AAIiB,UAAA,qBAAA,CAAqB;EAMzB,SAAA,EALA,kBAKc;EAKJ,aAAA,CAAA,EAAA,MAAA;EAMC,aAAA,CAAA,EAAA,MAAA;;AAAgB,cAX3B,cAAA,CAW2B;EAAO,iBAAA,SAAA;;;uBANxB;kBAMC,gBAAgB,QAAQ"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ticket-resolver.js","names":[],"sources":["../../src/rag/ticket-resolver.ts"],"sourcesContent":["import type { KnowledgeAnswer } from '@lssm/lib.contracts/knowledge/query/service';\nimport type { SupportResolution, SupportTicket } from '../types';\n\nexport interface KnowledgeRetriever {\n query(question: string): Promise<KnowledgeAnswer>;\n}\n\nexport interface TicketResolverOptions {\n knowledge: KnowledgeRetriever;\n minConfidence?: number;\n prependPrompt?: string;\n}\n\nexport class TicketResolver {\n private readonly knowledge: KnowledgeRetriever;\n private readonly minConfidence: number;\n private readonly prependPrompt?: string;\n\n constructor(options: TicketResolverOptions) {\n this.knowledge = options.knowledge;\n this.minConfidence = options.minConfidence ?? 0.65;\n this.prependPrompt = options.prependPrompt;\n }\n\n async resolve(ticket: SupportTicket): Promise<SupportResolution> {\n const question = this.buildQuestion(ticket);\n const answer = await this.knowledge.query(question);\n return this.toResolution(ticket, answer);\n }\n\n private buildQuestion(ticket: SupportTicket): string {\n const header = [`Subject: ${ticket.subject}`, `Channel: ${ticket.channel}`];\n if (ticket.customerName) header.push(`Customer: ${ticket.customerName}`);\n const sections = [\n this.prependPrompt,\n header.join('\\n'),\n '---',\n ticket.body,\n ].filter(Boolean);\n return sections.join('\\n');\n }\n\n private toResolution(\n ticket: SupportTicket,\n answer: KnowledgeAnswer\n ): SupportResolution {\n const citations = answer.references.map((ref) => {\n const label =\n typeof ref.payload?.title === 'string'\n ? ref.payload.title\n : typeof ref.payload?.documentId === 'string'\n ? ref.payload.documentId\n : ref.id;\n return {\n label,\n url: typeof ref.payload?.url === 'string' ? ref.payload.url : undefined,\n snippet:\n typeof ref.payload?.text === 'string'\n ? ref.payload.text.slice(0, 280)\n : undefined,\n score: ref.score,\n };\n });\n\n const confidence = this.deriveConfidence(answer);\n const escalate = confidence < this.minConfidence || citations.length === 0;\n\n return {\n ticketId: ticket.id,\n answer: answer.answer,\n confidence,\n citations,\n actions: [\n escalate\n ? { type: 'escalate', label: 'Escalate for human review' }\n : { type: 'respond', label: 'Send automated response' },\n ],\n escalationReason: escalate\n ? 'Insufficient confidence or missing knowledge references'\n : undefined,\n knowledgeUpdates: escalate ? [ticket.body.slice(0, 200)] : undefined,\n };\n }\n\n private deriveConfidence(answer: KnowledgeAnswer): number {\n if (!answer.references.length) return 0.3;\n const topScore = answer.references[0]?.score ?? 0.4;\n const normalized = Math.min(1, Math.max(0, topScore));\n const tokenPenalty = answer.usage?.completionTokens\n ? Math.min(answer.usage.completionTokens / 1000, 0.2)\n : 0;\n return Number((normalized - tokenPenalty).toFixed(2));\n }\n}\n"],"mappings":"AAaA,IAAa,EAAb,KAA4B,CAC1B,UACA,cACA,cAEA,YAAY,EAAgC,CAC1C,KAAK,UAAY,EAAQ,UACzB,KAAK,cAAgB,EAAQ,eAAiB,IAC9C,KAAK,cAAgB,EAAQ,cAG/B,MAAM,QAAQ,EAAmD,CAC/D,IAAM,EAAW,KAAK,cAAc,EAAO,CACrC,EAAS,MAAM,KAAK,UAAU,MAAM,EAAS,CACnD,OAAO,KAAK,aAAa,EAAQ,EAAO,CAG1C,cAAsB,EAA+B,CACnD,IAAM,EAAS,CAAC,YAAY,EAAO,UAAW,YAAY,EAAO,UAAU,CAQ3E,OAPI,EAAO,cAAc,EAAO,KAAK,aAAa,EAAO,eAAe,CACvD,CACf,KAAK,cACL,EAAO,KAAK;EAAK,CACjB,MACA,EAAO,KACR,CAAC,OAAO,QAAQ,CACD,KAAK;EAAK,CAG5B,aACE,EACA,EACmB,CACnB,IAAM,EAAY,EAAO,WAAW,IAAK,IAOhC,CACL,MANA,OAAO,EAAI,SAAS,OAAU,SAC1B,EAAI,QAAQ,MACZ,OAAO,EAAI,SAAS,YAAe,SACjC,EAAI,QAAQ,WACZ,EAAI,GAGV,IAAK,OAAO,EAAI,SAAS,KAAQ,SAAW,EAAI,QAAQ,IAAM,IAAA,GAC9D,QACE,OAAO,EAAI,SAAS,MAAS,SACzB,EAAI,QAAQ,KAAK,MAAM,EAAG,IAAI,CAC9B,IAAA,GACN,MAAO,EAAI,MACZ,EACD,CAEI,EAAa,KAAK,iBAAiB,EAAO,CAC1C,EAAW,EAAa,KAAK,eAAiB,EAAU,SAAW,EAEzE,MAAO,CACL,SAAU,EAAO,GACjB,OAAQ,EAAO,OACf,aACA,YACA,QAAS,CACP,EACI,CAAE,KAAM,WAAY,MAAO,4BAA6B,CACxD,CAAE,KAAM,UAAW,MAAO,0BAA2B,CAC1D,CACD,iBAAkB,EACd,0DACA,IAAA,GACJ,iBAAkB,EAAW,CAAC,EAAO,KAAK,MAAM,EAAG,IAAI,CAAC,CAAG,IAAA,GAC5D,CAGH,iBAAyB,EAAiC,CACxD,GAAI,CAAC,EAAO,WAAW,OAAQ,MAAO,IACtC,IAAM,EAAW,EAAO,WAAW,IAAI,OAAS,GAC1C,EAAa,KAAK,IAAI,EAAG,KAAK,IAAI,EAAG,EAAS,CAAC,CAC/C,EAAe,EAAO,OAAO,iBAC/B,KAAK,IAAI,EAAO,MAAM,iBAAmB,IAAM,GAAI,CACnD,EACJ,OAAO,QAAQ,EAAa,GAAc,QAAQ,EAAE,CAAC"}
package/dist/spec.d.ts DELETED
@@ -1,13 +0,0 @@
1
- import { SupportBotSpec } from "./types.js";
2
- import { AgentSpec, AgentToolConfig } from "@lssm/lib.ai-agent";
3
-
4
- //#region src/spec.d.ts
5
- interface SupportBotDefinition {
6
- base: AgentSpec;
7
- tools?: AgentToolConfig[];
8
- autoEscalateThreshold?: number;
9
- }
10
- declare function defineSupportBot(definition: SupportBotDefinition): SupportBotSpec;
11
- //#endregion
12
- export { SupportBotDefinition, defineSupportBot };
13
- //# sourceMappingURL=spec.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"spec.d.ts","names":[],"sources":["../src/spec.ts"],"sourcesContent":[],"mappings":";;;;UAIiB,oBAAA;QACT;EADS,KAAA,CAAA,EAEP,eAF2B,EAAA;EAMrB,qBAAgB,CAAA,EAAA,MAClB;;iBADE,gBAAA,aACF,uBACX"}
package/dist/spec.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"spec.js","names":["defineAgent"],"sources":["../src/spec.ts"],"sourcesContent":["import type { AgentSpec, AgentToolConfig } from '@lssm/lib.ai-agent';\nimport { defineAgent } from '@lssm/lib.ai-agent';\nimport type { SupportBotSpec } from './types';\n\nexport interface SupportBotDefinition {\n base: AgentSpec;\n tools?: AgentToolConfig[];\n autoEscalateThreshold?: number;\n}\n\nexport function defineSupportBot(\n definition: SupportBotDefinition\n): SupportBotSpec {\n const base = defineAgent({\n ...definition.base,\n policy: {\n ...definition.base.policy,\n confidence: {\n min: definition.base.policy?.confidence?.min ?? 0.7,\n default: definition.base.policy?.confidence?.default ?? 0.6,\n },\n escalation: {\n confidenceThreshold:\n definition.autoEscalateThreshold ??\n definition.base.policy?.escalation?.confidenceThreshold ??\n definition.base.policy?.confidence?.min ??\n 0.7,\n ...definition.base.policy?.escalation,\n },\n },\n memory: definition.base.memory ?? { maxEntries: 120, ttlMinutes: 120 },\n tools: definition.tools ?? definition.base.tools,\n instructions: `${definition.base.instructions}\\n\\nAlways cite support knowledge sources and flag compliance/billing issues for human review when unsure.`,\n });\n\n return {\n ...base,\n thresholds: {\n autoResolveMinConfidence: definition.autoEscalateThreshold ?? 0.75,\n maxIterations: 6,\n },\n };\n}\n"],"mappings":"6EAUA,SAAgB,EACd,EACgB,CAuBhB,MAAO,CACL,GAvBWA,EAAY,CACvB,GAAG,EAAW,KACd,OAAQ,CACN,GAAG,EAAW,KAAK,OACnB,WAAY,CACV,IAAK,EAAW,KAAK,QAAQ,YAAY,KAAO,GAChD,QAAS,EAAW,KAAK,QAAQ,YAAY,SAAW,GACzD,CACD,WAAY,CACV,oBACE,EAAW,uBACX,EAAW,KAAK,QAAQ,YAAY,qBACpC,EAAW,KAAK,QAAQ,YAAY,KACpC,GACF,GAAG,EAAW,KAAK,QAAQ,WAC5B,CACF,CACD,OAAQ,EAAW,KAAK,QAAU,CAAE,WAAY,IAAK,WAAY,IAAK,CACtE,MAAO,EAAW,OAAS,EAAW,KAAK,MAC3C,aAAc,GAAG,EAAW,KAAK,aAAa,4GAC/C,CAAC,CAIA,WAAY,CACV,yBAA0B,EAAW,uBAAyB,IAC9D,cAAe,EAChB,CACF"}
@@ -1,25 +0,0 @@
1
- import { SupportTicket, TicketCategory, TicketClassification } from "../types.js";
2
- import { LLMProvider } from "@lssm/lib.contracts/integrations/providers/llm";
3
-
4
- //#region src/tickets/classifier.d.ts
5
- interface TicketClassifierOptions {
6
- keywords?: Partial<Record<TicketCategory, string[]>>;
7
- llm?: LLMProvider;
8
- llmModel?: string;
9
- }
10
- declare class TicketClassifier {
11
- private readonly keywords;
12
- private readonly llm?;
13
- private readonly llmModel?;
14
- constructor(options?: TicketClassifierOptions);
15
- classify(ticket: SupportTicket): Promise<TicketClassification>;
16
- private heuristicClassification;
17
- private detectCategory;
18
- private detectPriority;
19
- private detectSentiment;
20
- private extractIntents;
21
- private estimateConfidence;
22
- }
23
- //#endregion
24
- export { TicketClassifier, TicketClassifierOptions };
25
- //# sourceMappingURL=classifier.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"classifier.d.ts","names":[],"sources":["../../src/tickets/classifier.ts"],"sourcesContent":[],"mappings":";;;;UAgCiB,uBAAA;aACJ,QAAQ,OAAO;EADX,GAAA,CAAA,EAET,WAFS;EACW,QAAA,CAAA,EAAA,MAAA;;AAAf,cAKA,gBAAA,CALA;EACL,iBAAA,QAAA;EAAW,iBAAA,GAAA;EAIN,iBAAA,QAAgB;EAKL,WAAA,CAAA,OAAA,CAAA,EAAA,uBAAA;EASC,QAAA,CAAA,MAAA,EAAA,aAAA,CAAA,EAAgB,OAAhB,CAAwB,oBAAxB,CAAA;EAAwB,QAAA,uBAAA;EAAR,QAAA,cAAA;EAAO,QAAA,cAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"classifier.js","names":["CATEGORY_KEYWORDS: Record<TicketCategory, string[]>","PRIORITY_HINTS: Record<TicketPriority, string[]>","SENTIMENT_HINTS: Record<TicketSentiment, string[]>","intents: string[]"],"sources":["../../src/tickets/classifier.ts"],"sourcesContent":["import type { LLMProvider } from '@lssm/lib.contracts/integrations/providers/llm';\nimport type {\n SupportTicket,\n TicketCategory,\n TicketPriority,\n TicketSentiment,\n TicketClassification,\n} from '../types';\n\nconst CATEGORY_KEYWORDS: Record<TicketCategory, string[]> = {\n billing: ['invoice', 'payout', 'refund', 'charge', 'billing', 'payment'],\n technical: ['bug', 'error', 'crash', 'issue', 'failed', 'timeout'],\n product: ['feature', 'roadmap', 'idea', 'request', 'feedback'],\n account: ['login', 'password', '2fa', 'account', 'profile', 'email change'],\n compliance: ['kyc', 'aml', 'compliance', 'regulation', 'gdpr'],\n other: [],\n};\n\nconst PRIORITY_HINTS: Record<TicketPriority, string[]> = {\n urgent: ['urgent', 'asap', 'immediately', 'today', 'right away'],\n high: ['high priority', 'blocking', 'major', 'critical'],\n medium: ['soon', 'next few days'],\n low: ['nice to have', 'when possible', 'later'],\n};\n\nconst SENTIMENT_HINTS: Record<TicketSentiment, string[]> = {\n positive: ['love', 'great', 'awesome', 'thank you'],\n neutral: ['question', 'wonder', 'curious'],\n negative: ['unhappy', 'bad', 'terrible', 'awful', 'angry'],\n frustrated: ['furious', 'frustrated', 'fed up', 'ridiculous'],\n};\n\nexport interface TicketClassifierOptions {\n keywords?: Partial<Record<TicketCategory, string[]>>;\n llm?: LLMProvider;\n llmModel?: string;\n}\n\nexport class TicketClassifier {\n private readonly keywords: Record<TicketCategory, string[]>;\n private readonly llm?: LLMProvider;\n private readonly llmModel?: string;\n\n constructor(options?: TicketClassifierOptions) {\n this.keywords = {\n ...CATEGORY_KEYWORDS,\n ...(options?.keywords ?? {}),\n } as Record<TicketCategory, string[]>;\n this.llm = options?.llm;\n this.llmModel = options?.llmModel;\n }\n\n async classify(ticket: SupportTicket): Promise<TicketClassification> {\n const heuristics = this.heuristicClassification(ticket);\n if (!this.llm) return heuristics;\n\n try {\n const llmResult = await this.llm.chat(\n [\n {\n role: 'system',\n content: [{ type: 'text', text: 'Classify the support ticket.' }],\n },\n {\n role: 'user',\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n subject: ticket.subject,\n body: ticket.body,\n channel: ticket.channel,\n }),\n },\n ],\n },\n ],\n {\n responseFormat: 'json',\n model: this.llmModel,\n }\n );\n const content = llmResult.message.content.find((part) => 'text' in part);\n if (content && 'text' in content) {\n const parsed = JSON.parse(\n content.text\n ) as Partial<TicketClassification>;\n return {\n ...heuristics,\n ...parsed,\n intents: parsed.intents ?? heuristics.intents,\n tags: parsed.tags ?? heuristics.tags,\n };\n }\n } catch {\n // fallback to heuristics\n }\n\n return heuristics;\n }\n\n private heuristicClassification(ticket: SupportTicket): TicketClassification {\n const text = `${ticket.subject}\\n${ticket.body}`.toLowerCase();\n const category = this.detectCategory(text);\n const priority = this.detectPriority(text);\n const sentiment = this.detectSentiment(text);\n const intents = this.extractIntents(text);\n const tags = intents.slice(0, 3);\n const confidence = this.estimateConfidence(category, priority, sentiment);\n\n return {\n ticketId: ticket.id,\n category,\n priority,\n sentiment,\n intents,\n tags,\n confidence,\n escalationRequired: priority === 'urgent' || category === 'compliance',\n };\n }\n\n private detectCategory(text: string): TicketCategory {\n for (const [category, keywords] of Object.entries(this.keywords) as [\n TicketCategory,\n string[],\n ][]) {\n if (keywords.some((keyword) => text.includes(keyword))) {\n return category;\n }\n }\n return 'other';\n }\n\n private detectPriority(text: string): TicketPriority {\n for (const priority of [\n 'urgent',\n 'high',\n 'medium',\n 'low',\n ] as TicketPriority[]) {\n if (PRIORITY_HINTS[priority].some((word) => text.includes(word))) {\n return priority;\n }\n }\n return 'medium';\n }\n\n private detectSentiment(text: string): TicketSentiment {\n for (const sentiment of [\n 'frustrated',\n 'negative',\n 'neutral',\n 'positive',\n ] as TicketSentiment[]) {\n if (SENTIMENT_HINTS[sentiment].some((word) => text.includes(word))) {\n return sentiment;\n }\n }\n return 'neutral';\n }\n\n private extractIntents(text: string): string[] {\n const intents: string[] = [];\n if (text.includes('refund') || text.includes('chargeback'))\n intents.push('refund');\n if (text.includes('payout')) intents.push('payout');\n if (text.includes('login')) intents.push('login-help');\n if (text.includes('feature')) intents.push('feature-request');\n if (text.includes('bug') || text.includes('error'))\n intents.push('bug-report');\n return intents.length ? intents : ['general'];\n }\n\n private estimateConfidence(\n category: TicketCategory,\n priority: TicketPriority,\n sentiment: TicketSentiment\n ): number {\n let base = 0.6;\n if (category !== 'other') base += 0.1;\n if (priority === 'urgent' || priority === 'low') base += 0.05;\n if (sentiment === 'frustrated') base -= 0.05;\n return Math.min(0.95, Math.max(0.4, Number(base.toFixed(2))));\n }\n}\n"],"mappings":"AASA,MAAMA,EAAsD,CAC1D,QAAS,CAAC,UAAW,SAAU,SAAU,SAAU,UAAW,UAAU,CACxE,UAAW,CAAC,MAAO,QAAS,QAAS,QAAS,SAAU,UAAU,CAClE,QAAS,CAAC,UAAW,UAAW,OAAQ,UAAW,WAAW,CAC9D,QAAS,CAAC,QAAS,WAAY,MAAO,UAAW,UAAW,eAAe,CAC3E,WAAY,CAAC,MAAO,MAAO,aAAc,aAAc,OAAO,CAC9D,MAAO,EAAE,CACV,CAEKC,EAAmD,CACvD,OAAQ,CAAC,SAAU,OAAQ,cAAe,QAAS,aAAa,CAChE,KAAM,CAAC,gBAAiB,WAAY,QAAS,WAAW,CACxD,OAAQ,CAAC,OAAQ,gBAAgB,CACjC,IAAK,CAAC,eAAgB,gBAAiB,QAAQ,CAChD,CAEKC,EAAqD,CACzD,SAAU,CAAC,OAAQ,QAAS,UAAW,YAAY,CACnD,QAAS,CAAC,WAAY,SAAU,UAAU,CAC1C,SAAU,CAAC,UAAW,MAAO,WAAY,QAAS,QAAQ,CAC1D,WAAY,CAAC,UAAW,aAAc,SAAU,aAAa,CAC9D,CAQD,IAAa,EAAb,KAA8B,CAC5B,SACA,IACA,SAEA,YAAY,EAAmC,CAC7C,KAAK,SAAW,CACd,GAAG,EACH,GAAI,GAAS,UAAY,EAAE,CAC5B,CACD,KAAK,IAAM,GAAS,IACpB,KAAK,SAAW,GAAS,SAG3B,MAAM,SAAS,EAAsD,CACnE,IAAM,EAAa,KAAK,wBAAwB,EAAO,CACvD,GAAI,CAAC,KAAK,IAAK,OAAO,EAEtB,GAAI,CA0BF,IAAM,GAzBY,MAAM,KAAK,IAAI,KAC/B,CACE,CACE,KAAM,SACN,QAAS,CAAC,CAAE,KAAM,OAAQ,KAAM,+BAAgC,CAAC,CAClE,CACD,CACE,KAAM,OACN,QAAS,CACP,CACE,KAAM,OACN,KAAM,KAAK,UAAU,CACnB,QAAS,EAAO,QAChB,KAAM,EAAO,KACb,QAAS,EAAO,QACjB,CAAC,CACH,CACF,CACF,CACF,CACD,CACE,eAAgB,OAChB,MAAO,KAAK,SACb,CACF,EACyB,QAAQ,QAAQ,KAAM,GAAS,SAAU,EAAK,CACxE,GAAI,GAAW,SAAU,EAAS,CAChC,IAAM,EAAS,KAAK,MAClB,EAAQ,KACT,CACD,MAAO,CACL,GAAG,EACH,GAAG,EACH,QAAS,EAAO,SAAW,EAAW,QACtC,KAAM,EAAO,MAAQ,EAAW,KACjC,OAEG,EAIR,OAAO,EAGT,wBAAgC,EAA6C,CAC3E,IAAM,EAAO,GAAG,EAAO,QAAQ,IAAI,EAAO,OAAO,aAAa,CACxD,EAAW,KAAK,eAAe,EAAK,CACpC,EAAW,KAAK,eAAe,EAAK,CACpC,EAAY,KAAK,gBAAgB,EAAK,CACtC,EAAU,KAAK,eAAe,EAAK,CACnC,EAAO,EAAQ,MAAM,EAAG,EAAE,CAC1B,EAAa,KAAK,mBAAmB,EAAU,EAAU,EAAU,CAEzE,MAAO,CACL,SAAU,EAAO,GACjB,WACA,WACA,YACA,UACA,OACA,aACA,mBAAoB,IAAa,UAAY,IAAa,aAC3D,CAGH,eAAuB,EAA8B,CACnD,IAAK,GAAM,CAAC,EAAU,KAAa,OAAO,QAAQ,KAAK,SAAS,CAI9D,GAAI,EAAS,KAAM,GAAY,EAAK,SAAS,EAAQ,CAAC,CACpD,OAAO,EAGX,MAAO,QAGT,eAAuB,EAA8B,CACnD,IAAK,IAAM,IAAY,CACrB,SACA,OACA,SACA,MACD,CACC,GAAI,EAAe,GAAU,KAAM,GAAS,EAAK,SAAS,EAAK,CAAC,CAC9D,OAAO,EAGX,MAAO,SAGT,gBAAwB,EAA+B,CACrD,IAAK,IAAM,IAAa,CACtB,aACA,WACA,UACA,WACD,CACC,GAAI,EAAgB,GAAW,KAAM,GAAS,EAAK,SAAS,EAAK,CAAC,CAChE,OAAO,EAGX,MAAO,UAGT,eAAuB,EAAwB,CAC7C,IAAMC,EAAoB,EAAE,CAQ5B,OAPI,EAAK,SAAS,SAAS,EAAI,EAAK,SAAS,aAAa,GACxD,EAAQ,KAAK,SAAS,CACpB,EAAK,SAAS,SAAS,EAAE,EAAQ,KAAK,SAAS,CAC/C,EAAK,SAAS,QAAQ,EAAE,EAAQ,KAAK,aAAa,CAClD,EAAK,SAAS,UAAU,EAAE,EAAQ,KAAK,kBAAkB,EACzD,EAAK,SAAS,MAAM,EAAI,EAAK,SAAS,QAAQ,GAChD,EAAQ,KAAK,aAAa,CACrB,EAAQ,OAAS,EAAU,CAAC,UAAU,CAG/C,mBACE,EACA,EACA,EACQ,CACR,IAAI,EAAO,GAIX,OAHI,IAAa,UAAS,GAAQ,KAC9B,IAAa,UAAY,IAAa,SAAO,GAAQ,KACrD,IAAc,eAAc,GAAQ,KACjC,KAAK,IAAI,IAAM,KAAK,IAAI,GAAK,OAAO,EAAK,QAAQ,EAAE,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- import { TicketClassifier, TicketClassifierOptions } from "./classifier.js";
2
- export { TicketClassifier, TicketClassifierOptions };
package/dist/types.d.ts DELETED
@@ -1,76 +0,0 @@
1
- import { AgentSpec } from "@lssm/lib.ai-agent";
2
-
3
- //#region src/types.d.ts
4
- type TicketPriority = 'low' | 'medium' | 'high' | 'urgent';
5
- type TicketCategory = 'billing' | 'technical' | 'product' | 'account' | 'compliance' | 'other';
6
- type TicketChannel = 'email' | 'chat' | 'phone' | 'portal';
7
- type TicketSentiment = 'positive' | 'neutral' | 'negative' | 'frustrated';
8
- interface SupportTicket {
9
- id: string;
10
- subject: string;
11
- body: string;
12
- channel: TicketChannel;
13
- locale?: string;
14
- customerEmail?: string;
15
- customerName?: string;
16
- metadata?: Record<string, string>;
17
- }
18
- interface TicketClassification {
19
- ticketId: string;
20
- category: TicketCategory;
21
- priority: TicketPriority;
22
- sentiment: TicketSentiment;
23
- intents: string[];
24
- tags: string[];
25
- confidence: number;
26
- escalationRequired?: boolean;
27
- }
28
- interface SupportCitation {
29
- label: string;
30
- url?: string;
31
- snippet?: string;
32
- score?: number;
33
- }
34
- interface SupportAction {
35
- type: 'respond' | 'escalate' | 'refund' | 'manual';
36
- label: string;
37
- payload?: Record<string, string>;
38
- }
39
- interface SupportResolution {
40
- ticketId: string;
41
- answer: string;
42
- confidence: number;
43
- citations: SupportCitation[];
44
- actions: SupportAction[];
45
- escalationReason?: string;
46
- knowledgeUpdates?: string[];
47
- }
48
- interface SupportResponseDraft {
49
- ticketId: string;
50
- subject: string;
51
- body: string;
52
- confidence: number;
53
- requiresEscalation: boolean;
54
- citations: SupportCitation[];
55
- }
56
- interface SupportBotSpec extends AgentSpec {
57
- thresholds?: {
58
- autoResolveMinConfidence?: number;
59
- maxIterations?: number;
60
- };
61
- review?: {
62
- queueName?: string;
63
- approvalWorkflow?: string;
64
- };
65
- }
66
- interface ClassificationResultPayload {
67
- ticket: SupportTicket;
68
- classification: TicketClassification;
69
- }
70
- interface ResolutionResultPayload extends ClassificationResultPayload {
71
- resolution: SupportResolution;
72
- draft: SupportResponseDraft;
73
- }
74
- //#endregion
75
- export { ClassificationResultPayload, ResolutionResultPayload, SupportAction, SupportBotSpec, SupportCitation, SupportResolution, SupportResponseDraft, SupportTicket, TicketCategory, TicketChannel, TicketClassification, TicketPriority, TicketSentiment };
76
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","names":[],"sources":["../src/types.ts"],"sourcesContent":[],"mappings":";;;KAEY,cAAA;KACA,cAAA;AADA,KAQA,aAAA,GARc,OAAA,GAAA,MAAA,GAAA,OAAA,GAAA,QAAA;AACd,KAQA,eAAA,GARc,UAAA,GAAA,SAAA,GAAA,UAAA,GAAA,YAAA;AAOd,UAOK,aAAA,CAPQ;EACb,EAAA,EAAA,MAAA;EAMK,OAAA,EAAA,MAAA;EAWA,IAAA,EAAA,MAAA;EAEL,OAAA,EATD,aASC;EACA,MAAA,CAAA,EAAA,MAAA;EACC,aAAA,CAAA,EAAA,MAAA;EAAe,YAAA,CAAA,EAAA,MAAA;EAOX,QAAA,CAAA,EAdJ,MAcI,CAAe,MAAA,EAAA,MAAA,CAAA;AAOhC;AAMiB,UAxBA,oBAAA,CA4BJ;EAMI,QAAA,EAAA,MAAA;EASA,QAAA,EAzCL,cAyCoB;EAWf,QAAA,EAnDL,cAmDK;EAKA,SAAA,EAvDJ,eAuD4B;EAC3B,OAAA,EAAA,MAAA,EAAA;EACL,IAAA,EAAA,MAAA,EAAA;EAFwC,UAAA,EAAA,MAAA;EAA2B,kBAAA,CAAA,EAAA,OAAA;;UAhD3D,eAAA;;;;;;UAOA,aAAA;;;YAGL;;UAGK,iBAAA;;;;aAIJ;WACF;;;;UAKM,oBAAA;;;;;;aAMJ;;UAGI,cAAA,SAAuB;;;;;;;;;;UAWvB,2BAAA;UACP;kBACQ;;UAGD,uBAAA,SAAgC;cACnC;SACL"}