@k-msg/provider 0.27.1 → 0.28.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.
@@ -0,0 +1,5 @@
1
+ var{defineProperty:j,getOwnPropertyNames:pe,getOwnPropertyDescriptor:ue}=Object,me=Object.prototype.hasOwnProperty;var J=new WeakMap,fe=(e)=>{var r=J.get(e),t;if(r)return r;if(r=j({},"__esModule",{value:!0}),e&&typeof e==="object"||typeof e==="function")pe(e).map((i)=>!me.call(r,i)&&j(r,i,{get:()=>e[i],enumerable:!(t=ue(e,i))||t.enumerable}));return J.set(e,r),r};var ge=(e,r)=>{for(var t in r)j(e,t,{get:r[t],enumerable:!0,configurable:!0,set:(i)=>r[t]=()=>i})};var Re={};ge(Re,{updateTemplate:()=>U,requestTemplateInspection:()=>V,listTemplates:()=>F,getTemplate:()=>S,deleteTemplate:()=>q,createTemplate:()=>L,createDefaultAligoTemplateProvider:()=>Y,createAligoTemplateProvider:()=>se,AligoTemplateProviderFactory:()=>G,AligoTemplateProvider:()=>_});module.exports=fe(Re);var p=require("@k-msg/core"),$=require("@k-msg/template/send");function v(e){return typeof e==="object"&&e!==null&&!Array.isArray(e)}var y=require("@k-msg/core");function k(e,r){if(e instanceof y.KMsgError)return e;return new y.KMsgError(y.KMsgErrorCode.PROVIDER_ERROR,e instanceof Error?e.message:String(e),{providerId:r})}function M(e,r){if(e instanceof y.KMsgError)return e;let t=v(e)?e:{},i=t.result_code,n=i!==void 0&&i!==null?String(i):"UNKNOWN",a=typeof t.message==="string"&&t.message.length>0?t.message:typeof t.msg==="string"&&t.msg.length>0?t.msg:e instanceof Error?e.message:"Unknown Aligo error",s=y.KMsgErrorCode.PROVIDER_ERROR;switch(n){case"-100":case"-101":s=y.KMsgErrorCode.AUTHENTICATION_FAILED;break;case"-102":case"-201":s=y.KMsgErrorCode.INSUFFICIENT_BALANCE;break;case"-103":case"-105":s=y.KMsgErrorCode.INVALID_REQUEST;break;case"-501":s=y.KMsgErrorCode.TEMPLATE_NOT_FOUND;break;default:s=y.KMsgErrorCode.PROVIDER_ERROR}return new y.KMsgError(s,`${a} (code: ${n})`,{providerId:r,resultCode:n})}var R=require("@k-msg/core");var E=require("@k-msg/core");function ce(e,r){if(!e)return"";return e.replace(/#\{([^}]+)\}/g,(t,i)=>{let n=r[i];return n===void 0||n===null?t:String(n)})}function H(e){let r=typeof e.imageUrl==="string"&&e.imageUrl.trim().length>0?e.imageUrl.trim():void 0;if(r)return r;let t=e.media?.image;if(!t)return;if("ref"in t){let i=t.ref.trim();return i.length>0?i:void 0}throw new E.KMsgError(E.KMsgErrorCode.INVALID_REQUEST,"Aligo MMS/FriendTalk image requires `options.imageUrl` or `options.media.image.ref` (url/path).",{providerId:e.providerId})}function O(e,r){switch(e){case"sendSMS":return"/send/";case"sendAlimTalk":return"/akv10/alimtalk/send/";case"sendFriendTalk":return r.friendtalkEndpoint||"/akv10/friendtalk/send/";default:return"/"}}function D(e){let r=e.getFullYear(),t=String(e.getMonth()+1).padStart(2,"0"),i=String(e.getDate()).padStart(2,"0"),n=String(e.getHours()).padStart(2,"0"),a=String(e.getMinutes()).padStart(2,"0");return{date:`${r}${t}${i}`,time:`${n}${a}`}}function z(e){if(typeof e==="number"&&Number.isFinite(e))return e;if(typeof e==="string"){let r=e.trim();if(!r)return;let t=Number(r);if(Number.isFinite(t))return t}return}function T(e,r){let t=(typeof r?.kakaoChannelSenderKey==="string"&&r.kakaoChannelSenderKey.trim().length>0?r.kakaoChannelSenderKey.trim():e.config.senderKey)||"";if(!t)throw new E.KMsgError(E.KMsgErrorCode.INVALID_REQUEST,"kakao channel senderKey is required (ctx.kakaoChannelSenderKey or config.senderKey)",{providerId:e.providerId});return t}function P(e){switch(typeof e.inspStatus==="string"?e.inspStatus.trim().toUpperCase():""){case"APR":return"APPROVED";case"REJ":return"REJECTED";case"REQ":case"REG":return"INSPECTION";default:return"PENDING"}}function c(e){if(typeof e!=="string")return;let r=e.trim();if(!r)return;let t=/^(\d{4})-(\d{2})-(\d{2})\s+(\d{2}):(\d{2}):(\d{2})$/.exec(r);if(!t)return;let i=Number(t[1]),n=Number(t[2]),a=Number(t[3]),s=Number(t[4]),l=Number(t[5]),d=Number(t[6]),o=new Date(i,n-1,a,s,l,d);return Number.isNaN(o.getTime())?void 0:o}function X(e,r){if(!e)return"";let t=e._full_text;if(t!==void 0&&t!==null)return String(t);if(!r)return Object.values(e).map(String).join(`
2
+ `);return ce(r,e)}async function g(e){let r=new FormData;for(let[i,n]of Object.entries(e.data))if(n!==void 0&&n!==null)r.append(i,String(n));let t=await fetch(`${e.host}${e.endpoint}`,{method:"POST",body:r});if(!t.ok)throw new R.KMsgError(R.KMsgErrorCode.NETWORK_ERROR,`HTTP error! status: ${t.status}`,{providerId:e.providerId});return await t.json()}function A(e){let{providerId:r,response:t,fallbackMessage:i}=e,n=t.code,a=z(n);if(a===0)return R.ok(void 0);let s=typeof t.message==="string"&&t.message.length>0?t.message:i,l=a===509||a===-99?R.KMsgErrorCode.INVALID_REQUEST:R.KMsgErrorCode.PROVIDER_ERROR;return R.fail(new R.KMsgError(l,s,{providerId:r,originalCode:n,raw:t}))}var Z=require("@k-msg/template/send");function B(e){if(!Array.isArray(e)||e.length===0)return;let r=JSON.parse(Z.ButtonParser.serializeButtons(e));return JSON.stringify({button:r})}function x(e,r){return new p.KMsgError(e.code,e.message,{providerId:r,...e.details??{}})}async function L(e,r,t){try{let i=T(e,t),n=$.validateTemplatePayload(r,{requireName:!0,requireContent:!0});if(n.isFailure)return p.fail(x(n.error,e.providerId));let a={apikey:e.config.apiKey,userid:e.config.userId,senderkey:i,tpl_name:n.value.name??r.name,tpl_content:n.value.content??r.content},s=B(n.value.buttons);if(s)a.tpl_button=s;let l=await g({host:e.alimtalkHost,endpoint:"/akv10/template/add/",data:a,providerId:e.providerId}),d=A({providerId:e.providerId,response:l,fallbackMessage:"template create failed"});if(d.isFailure)return d;let o=v(l.data)?l.data:{},m=String(o.templtCode??"");if(!m)return p.fail(new p.KMsgError(p.KMsgErrorCode.PROVIDER_ERROR,"template create did not return templtCode",{providerId:e.providerId,raw:l}));let I=c(o.cdate)??new Date,b=c(o.udate)??c(o.cdate)??I;return p.ok({id:m,code:m,name:String(o.templtName??n.value.name??r.name),content:String(o.templtContent??n.value.content??r.content),category:r.category,status:P(o),buttons:Array.isArray(o.buttons)?o.buttons:n.value.buttons,variables:r.variables,createdAt:I,updatedAt:b})}catch(i){return p.fail(k(i,e.providerId))}}async function S(e,r,t){try{let i=T(e,t),n=r.trim();if(!n)return p.fail(new p.KMsgError(p.KMsgErrorCode.INVALID_REQUEST,"code is required",{providerId:e.providerId}));let a=await g({host:e.alimtalkHost,endpoint:"/akv10/template/list/",data:{apikey:e.config.apiKey,userid:e.config.userId,senderkey:i,tpl_code:n},providerId:e.providerId}),s=A({providerId:e.providerId,response:a,fallbackMessage:"template get failed"});if(s.isFailure)return s;let l=a.list,o=(Array.isArray(l)?l:[]).find(v);if(!o)return p.fail(new p.KMsgError(p.KMsgErrorCode.TEMPLATE_NOT_FOUND,"Template not found",{providerId:e.providerId,templateCode:n}));let m=String(o.templtCode??n),I=c(o.cdate)??new Date,b=c(o.udate)??c(o.cdate)??I;return p.ok({id:m,code:m,name:String(o.templtName??""),content:String(o.templtContent??""),status:P(o),buttons:Array.isArray(o.buttons)?o.buttons:void 0,createdAt:I,updatedAt:b})}catch(i){return p.fail(k(i,e.providerId))}}async function U(e,r,t,i){try{let n=T(e,i),a=r.trim();if(!a)return p.fail(new p.KMsgError(p.KMsgErrorCode.INVALID_REQUEST,"code is required",{providerId:e.providerId}));let s=await S(e,a,{kakaoChannelSenderKey:n});if(s.isFailure)return s;let l=s.value,d=typeof t.name==="string"&&t.name.trim().length>0?t.name.trim():l.name,o=typeof t.content==="string"&&t.content.trim().length>0?t.content:l.content,m=$.validateTemplatePayload({name:d,content:o,buttons:t.buttons!==void 0?t.buttons:l.buttons},{requireName:!0,requireContent:!0});if(m.isFailure)return p.fail(x(m.error,e.providerId));let I={apikey:e.config.apiKey,userid:e.config.userId,senderkey:n,tpl_code:a,tpl_name:m.value.name??d,tpl_content:m.value.content??o},b=B(m.value.buttons);if(b)I.tpl_button=b;let C=await g({host:e.alimtalkHost,endpoint:"/akv10/template/modify/",data:I,providerId:e.providerId}),w=A({providerId:e.providerId,response:C,fallbackMessage:"template update failed"});if(w.isFailure)return w;let K=await S(e,a,{kakaoChannelSenderKey:n});if(K.isSuccess)return K;return p.ok({...l,name:m.value.name??d,content:m.value.content??o,...t.category!==void 0?{category:t.category}:{},...t.variables!==void 0?{variables:t.variables}:{},...t.buttons!==void 0?{buttons:m.value.buttons}:{},updatedAt:new Date})}catch(n){return p.fail(k(n,e.providerId))}}async function q(e,r,t){try{let i=T(e,t),n=r.trim();if(!n)return p.fail(new p.KMsgError(p.KMsgErrorCode.INVALID_REQUEST,"code is required",{providerId:e.providerId}));let a=await g({host:e.alimtalkHost,endpoint:"/akv10/template/del/",data:{apikey:e.config.apiKey,userid:e.config.userId,senderkey:i,tpl_code:n},providerId:e.providerId}),s=A({providerId:e.providerId,response:a,fallbackMessage:"template delete failed"});if(s.isFailure)return s;return p.ok(void 0)}catch(i){return p.fail(k(i,e.providerId))}}async function F(e,r,t){try{let i=T(e,t),n=await g({host:e.alimtalkHost,endpoint:"/akv10/template/list/",data:{apikey:e.config.apiKey,userid:e.config.userId,senderkey:i},providerId:e.providerId}),a=A({providerId:e.providerId,response:n,fallbackMessage:"template list failed"});if(a.isFailure)return a;let s=n.list,d=(Array.isArray(s)?s:[]).filter(v).map((o)=>{let m=String(o.templtCode??""),I=c(o.cdate)??new Date,b=c(o.udate)??c(o.cdate)??I;return{id:m,code:m,name:String(o.templtName??""),content:String(o.templtContent??""),status:P(o),buttons:Array.isArray(o.buttons)?o.buttons:void 0,createdAt:I,updatedAt:b}}).filter((o)=>o.code.length>0);if(r?.status){let o=r.status.trim().toUpperCase();return p.ok(d.filter((m)=>m.status===o))}return p.ok(d)}catch(i){return p.fail(k(i,e.providerId))}}async function V(e,r,t){try{let i=T(e,t),n=r.trim();if(!n)return p.fail(new p.KMsgError(p.KMsgErrorCode.INVALID_REQUEST,"code is required",{providerId:e.providerId}));let a=await g({host:e.alimtalkHost,endpoint:"/akv10/template/request/",data:{apikey:e.config.apiKey,userid:e.config.userId,senderkey:i,tpl_code:n},providerId:e.providerId}),s=A({providerId:e.providerId,response:a,fallbackMessage:"template inspection request failed"});if(s.isFailure)return s;return p.ok(void 0)}catch(i){return p.fail(k(i,e.providerId))}}var h=require("@k-msg/core");var ee={iwinv:{providerId:"iwinv",providerName:"IWINV Messaging Provider",channelOnboarding:"manual",templateLifecycleApi:"available",plusIdPolicy:"optional",plusIdInference:"unsupported",liveTestSupport:"supported",checks:[{id:"channel_registered_in_console",title:"Kakao channel is registered in IWINV console",description:"IWINV channel onboarding is manual. Confirm channel registration and approval in console.",kind:"manual",severity:"blocker",scopes:["doctor","preflight"]},{id:"iwinv_config_required",title:"IWINV config has required keys",kind:"config",severity:"blocker",scopes:["doctor","preflight"],configKeys:["apiKey"]},{id:"template_capability_available",title:"Template lifecycle APIs are available",kind:"capability",severity:"warning",scopes:["doctor","preflight"],capabilityMethods:["listTemplates","getTemplate","createTemplate","updateTemplate","deleteTemplate"]},{id:"template_list_probe",title:"Template list API probe",kind:"api_probe",severity:"warning",scopes:["doctor","preflight"],probeOperation:"list_templates"}],notes:["Channel add/auth is not available via IWINV public API in current integration.","Template APIs are available and can be probed."]},aligo:{providerId:"aligo",providerName:"Aligo Smart SMS",channelOnboarding:"api",templateLifecycleApi:"available",plusIdPolicy:"required_if_no_inference",plusIdInference:"supported",liveTestSupport:"supported",checks:[{id:"aligo_config_required",title:"Aligo config has required keys",kind:"config",severity:"blocker",scopes:["doctor","preflight"],configKeys:["apiKey","userId"]},{id:"channel_api_capability_available",title:"Kakao channel APIs are available",kind:"capability",severity:"warning",scopes:["doctor","preflight"],capabilityMethods:["listKakaoChannels","requestKakaoChannelAuth","addKakaoChannel"]},{id:"channel_list_probe",title:"Kakao channel list API probe",kind:"api_probe",severity:"warning",scopes:["doctor","preflight"],probeOperation:"list_kakao_channels"},{id:"template_list_probe",title:"Template list API probe",kind:"api_probe",severity:"warning",scopes:["doctor","preflight"],probeOperation:"list_templates"}]},solapi:{providerId:"solapi",providerName:"SOLAPI Messaging Provider",channelOnboarding:"none",templateLifecycleApi:"unavailable",plusIdPolicy:"required_if_no_inference",plusIdInference:"unsupported",liveTestSupport:"partial",checks:[{id:"solapi_config_required",title:"SOLAPI config has required keys",kind:"config",severity:"blocker",scopes:["doctor","preflight"],configKeys:["apiKey","apiSecret"]}],notes:["SOLAPI ALIMTALK requires kakao profileId/pfId, but plusId inference is not available in current integration."]},mock:{providerId:"mock",providerName:"Mock Provider",channelOnboarding:"api",templateLifecycleApi:"available",plusIdPolicy:"optional",plusIdInference:"supported",liveTestSupport:"none",checks:[{id:"mock_template_capability_available",title:"Mock template APIs are available",kind:"capability",severity:"info",scopes:["doctor","preflight"],capabilityMethods:["listTemplates","getTemplate","createTemplate"]}]}};function re(e){return ee[e]}function Ue(){return Object.values(ee)}var f=require("@k-msg/core");async function te(e,r){try{let t={apikey:e.config.apiKey,userid:e.config.userId,...typeof r?.plusId==="string"&&r.plusId.trim().length>0?{plusid:r.plusId.trim()}:{},...typeof r?.senderKey==="string"&&r.senderKey.trim().length>0?{senderkey:r.senderKey.trim()}:{}},i=await g({host:e.alimtalkHost,endpoint:"/akv10/profile/list/",data:t,providerId:e.providerId}),n=A({providerId:e.providerId,response:i,fallbackMessage:"channel list failed"});if(n.isFailure)return n;let a=i.list,l=(Array.isArray(a)?a:[]).filter(v).map((d)=>({providerId:e.providerId,senderKey:String(d.senderKey??""),plusId:typeof d.uuid==="string"?d.uuid:void 0,name:typeof d.name==="string"?d.name:void 0,status:typeof d.status==="string"?d.status:void 0,createdAt:c(d.cdate),updatedAt:c(d.udate),raw:d})).filter((d)=>d.senderKey.length>0);return f.ok(l)}catch(t){return f.fail(k(t,e.providerId))}}async function ne(e){try{let r=await g({host:e.alimtalkHost,endpoint:"/akv10/category/",data:{apikey:e.config.apiKey,userid:e.config.userId},providerId:e.providerId}),t=A({providerId:e.providerId,response:r,fallbackMessage:"category list failed"});if(t.isFailure)return t;let i=v(r.data)?r.data:{},n=(a)=>{return(Array.isArray(a)?a:[]).filter(v).map((l)=>({code:String(l.code??""),name:String(l.name??""),parentCode:typeof l.parentCode==="string"&&l.parentCode.length>0?l.parentCode:void 0})).filter((l)=>l.code.length>0)};return f.ok({first:n(i.firstBusinessType),second:n(i.secondBusinessType),third:n(i.thirdBusinessType)})}catch(r){return f.fail(k(r,e.providerId))}}async function ie(e,r){try{let t=r.plusId.trim(),i=r.phoneNumber.trim();if(!t||!i)return f.fail(new f.KMsgError(f.KMsgErrorCode.INVALID_REQUEST,"plusId and phoneNumber are required",{providerId:e.providerId}));let n=await g({host:e.alimtalkHost,endpoint:"/akv10/profile/auth/",data:{apikey:e.config.apiKey,userid:e.config.userId,plusid:t,phonenumber:i},providerId:e.providerId}),a=A({providerId:e.providerId,response:n,fallbackMessage:"channel auth failed"});if(a.isFailure)return a;return f.ok(void 0)}catch(t){return f.fail(k(t,e.providerId))}}async function oe(e,r){try{let t=r.plusId.trim(),i=r.authNum.trim(),n=r.phoneNumber.trim(),a=r.categoryCode.trim();if(!t||!i||!n||!a)return f.fail(new f.KMsgError(f.KMsgErrorCode.INVALID_REQUEST,"plusId, authNum, phoneNumber, categoryCode are required",{providerId:e.providerId}));let s=await g({host:e.alimtalkHost,endpoint:"/akv10/profile/add/",data:{apikey:e.config.apiKey,userid:e.config.userId,plusid:t,authnum:i,phonenumber:n,categorycode:a},providerId:e.providerId}),l=A({providerId:e.providerId,response:s,fallbackMessage:"channel add failed"});if(l.isFailure)return l;let d=s.data,o=Array.isArray(d)?d.find(v):v(d)?d:void 0;if(!o)return f.fail(new f.KMsgError(f.KMsgErrorCode.PROVIDER_ERROR,"channel add returned empty data",{providerId:e.providerId,raw:s}));let m=String(o.senderKey??"");if(!m)return f.fail(new f.KMsgError(f.KMsgErrorCode.PROVIDER_ERROR,"channel add did not return senderKey",{providerId:e.providerId,raw:o}));return f.ok({providerId:e.providerId,senderKey:m,plusId:typeof o.uuid==="string"?o.uuid:t,name:typeof o.name==="string"?o.name:void 0,status:typeof o.status==="string"?o.status:void 0,createdAt:c(o.cdate),updatedAt:c(o.udate),raw:o})}catch(t){return f.fail(k(t,e.providerId))}}var u=require("@k-msg/core");function Ie(e,r){if(e.type!=="ALIMTALK")return;if(e.failover?.enabled!==!0)return;return[{code:"FAILOVER_PARTIAL_PROVIDER",message:"Aligo failover mapping is partial. API-level fallback may be attempted for non-Kakao-user failures.",details:{providerId:r,mappedFields:["failover","fmessage_1","fsubject_1"],unsupportedFields:["fallbackChannel"]}}]}async function ye(e,r){let t=r.from||e.config.sender||"";if(!t)return u.fail(new u.KMsgError(u.KMsgErrorCode.INVALID_REQUEST,"from is required for SMS/LMS/MMS (options.from or config.sender)",{providerId:e.providerId}));let i={key:e.config.apiKey,user_id:e.config.userId,sender:t,receiver:r.to,msg:r.text,msg_type:r.type,title:r.subject,testmode_yn:e.config.testMode?"Y":"N"},n=r.options?.scheduledAt;if(n instanceof Date&&!Number.isNaN(n.getTime())){let{date:s,time:l}=D(n);i.rdate=s,i.rtime=l}if(r.type==="MMS"){let s=H({imageUrl:r.imageUrl,media:r.media,providerId:e.providerId});if(!s)return u.fail(new u.KMsgError(u.KMsgErrorCode.INVALID_REQUEST,"image is required for MMS (options.imageUrl or options.media.image.ref)",{providerId:e.providerId}));i.image=s}let a=await g({host:e.smsHost,endpoint:O("sendSMS",e.config),data:i,providerId:e.providerId});if(a.result_code!=="1")return u.fail(M(a,e.providerId));return u.ok({messageId:r.messageId||crypto.randomUUID(),providerId:e.providerId,providerMessageId:a.msg_id,status:"PENDING",type:r.type,to:r.to,raw:a})}async function ve(e,r){let t=Ie(r,e.providerId),i=(typeof r.kakao?.profileId==="string"?r.kakao.profileId:e.config.senderKey)||"";if(!i)return u.fail(new u.KMsgError(u.KMsgErrorCode.INVALID_REQUEST,"kakao profileId is required (options.kakao.profileId or config.senderKey)",{providerId:e.providerId}));let n=r.from||e.config.sender||"";if(!n)return u.fail(new u.KMsgError(u.KMsgErrorCode.INVALID_REQUEST,"from is required for ALIMTALK (options.from or config.sender)",{providerId:e.providerId}));let{variables:a,templateId:s}=r;if(!s||s.length===0)return u.fail(new u.KMsgError(u.KMsgErrorCode.INVALID_REQUEST,"templateId is required for ALIMTALK",{providerId:e.providerId}));let l=typeof r.providerOptions?.templateContent==="string"?r.providerOptions.templateContent:void 0,d={apikey:e.config.apiKey,userid:e.config.userId,senderkey:i,tpl_code:s,sender:n,receiver_1:r.to,subject_1:"알림톡",message_1:X(a,l),testMode:e.config.testMode?"Y":"N"},o=typeof r.providerOptions?.failover==="string"?r.providerOptions.failover.trim().toUpperCase():"",m=o==="Y"||o==="N"?o:void 0,I=r.failover?.enabled===!0?"Y":r.failover?.enabled===!1?"N":void 0,b=m??I,C=typeof r.providerOptions?.fsubject_1==="string"&&r.providerOptions.fsubject_1.trim().length>0?r.providerOptions.fsubject_1.trim():typeof r.failover?.fallbackTitle==="string"&&r.failover.fallbackTitle.trim().length>0?r.failover.fallbackTitle.trim():void 0,w=typeof r.providerOptions?.fmessage_1==="string"&&r.providerOptions.fmessage_1.trim().length>0?r.providerOptions.fmessage_1.trim():typeof r.failover?.fallbackContent==="string"&&r.failover.fallbackContent.trim().length>0?r.failover.fallbackContent.trim():void 0;if(b)d.failover=b;if(C)d.fsubject_1=C;if(w)d.fmessage_1=w;let K=r.options?.scheduledAt;if(K instanceof Date&&!Number.isNaN(K.getTime())){let{date:de,time:le}=D(K);d.reserve="Y",d.reserve_date=de,d.reserve_time=le}let N=await g({host:e.alimtalkHost,endpoint:O("sendAlimTalk",e.config),data:d,providerId:e.providerId});if(N.result_code!=="0")return u.fail(M(N,e.providerId));return u.ok({messageId:r.messageId||crypto.randomUUID(),providerId:e.providerId,providerMessageId:N.msg_id,status:"PENDING",type:r.type,to:r.to,...Array.isArray(t)&&t.length>0?{warnings:t}:{},raw:N})}async function ke(e,r){let t=(typeof r.kakao?.profileId==="string"?r.kakao.profileId:e.config.senderKey)||"";if(!t)return u.fail(new u.KMsgError(u.KMsgErrorCode.INVALID_REQUEST,"kakao profileId is required (options.kakao.profileId or config.senderKey)",{providerId:e.providerId}));let i=r.from||e.config.sender||"";if(!i)return u.fail(new u.KMsgError(u.KMsgErrorCode.INVALID_REQUEST,"from is required for FRIENDTALK (options.from or config.sender)",{providerId:e.providerId}));let n={apikey:e.config.apiKey,userid:e.config.userId,senderkey:t,sender:i,receiver_1:r.to,subject_1:"친구톡",message_1:r.text,testMode:e.config.testMode?"Y":"N"},a=H({imageUrl:r.imageUrl,media:r.media,providerId:e.providerId});if(a)n.image_1=a;let s=Array.isArray(r.kakao?.buttons)?r.kakao.buttons:r.buttons;if(s)n.button_1=JSON.stringify(s);let l=r.options?.scheduledAt;if(l instanceof Date&&!Number.isNaN(l.getTime())){let{date:o,time:m}=D(l);n.reserve="Y",n.reserve_date=o,n.reserve_time=m}let d=await g({host:e.alimtalkHost,endpoint:O("sendFriendTalk",e.config),data:n,providerId:e.providerId});if(d.result_code!=="0")return u.fail(M(d,e.providerId));return u.ok({messageId:r.messageId||crypto.randomUUID(),providerId:e.providerId,providerMessageId:d.msg_id,status:"PENDING",type:r.type,to:r.to,raw:d})}async function ae(e,r){try{switch(r.type){case"ALIMTALK":return await ve(e,r);case"FRIENDTALK":return await ke(e,r);case"SMS":case"LMS":case"MMS":return await ye(e,r);default:return u.fail(new u.KMsgError(u.KMsgErrorCode.INVALID_REQUEST,`AligoProvider does not support type ${r.type}`,{providerId:e.providerId,type:r.type}))}}catch(t){return u.fail(M(t,e.providerId))}}function W(){return{apiKey:h.readRuntimeEnv("ALIGO_API_KEY")||"",userId:h.readRuntimeEnv("ALIGO_USER_ID")||"",senderKey:h.readRuntimeEnv("ALIGO_SENDER_KEY")||"",sender:h.readRuntimeEnv("ALIGO_SENDER")||"",friendtalkEndpoint:h.readRuntimeEnv("ALIGO_FRIENDTALK_ENDPOINT"),testMode:h.readRuntimeEnv("NODE_ENV")!=="production",debug:h.readRuntimeEnv("NODE_ENV")==="development"}}class Q{id="aligo";name="Aligo Smart SMS";supportedTypes=["ALIMTALK","FRIENDTALK","SMS","LMS","MMS"];config;smsHost;alimtalkHost;getOnboardingSpec(){let e=re(this.id);if(!e)throw Error(`Onboarding spec missing for provider: ${this.id}`);return e}constructor(e){if(!e||typeof e!=="object")throw Error("AligoProvider requires a config object");if(!e.apiKey||e.apiKey.length===0)throw Error("AligoProvider requires `apiKey`");if(!e.userId||e.userId.length===0)throw Error("AligoProvider requires `userId`");this.config=e,this.smsHost=e.smsBaseUrl||"https://apis.aligo.in",this.alimtalkHost=e.alimtalkBaseUrl||"https://kakaoapi.aligo.in"}getRuntimeContext(){return{providerId:this.id,config:this.config,smsHost:this.smsHost,alimtalkHost:this.alimtalkHost}}async healthCheck(){let e=Date.now(),r=[];try{if(!this.config.apiKey)r.push("Missing apiKey");if(!this.config.userId)r.push("Missing userId");if(!this.config.sender)r.push("Missing sender (default from)");try{new URL(this.smsHost)}catch{r.push("Invalid smsBaseUrl")}try{new URL(this.alimtalkHost)}catch{r.push("Invalid alimtalkBaseUrl")}return{healthy:r.length===0,issues:r,latencyMs:Date.now()-e,data:{provider:this.id,smsBaseUrl:this.smsHost,alimtalkBaseUrl:this.alimtalkHost}}}catch(t){return r.push(t instanceof Error?t.message:String(t)),{healthy:!1,issues:r,latencyMs:Date.now()-e}}}async send(e){let r=e.messageId||crypto.randomUUID(),t={...e,messageId:r};return ae(this.getRuntimeContext(),t)}async listKakaoChannels(e){return te(this.getRuntimeContext(),e)}async listKakaoChannelCategories(){return ne(this.getRuntimeContext())}async requestKakaoChannelAuth(e){return ie(this.getRuntimeContext(),e)}async addKakaoChannel(e){return oe(this.getRuntimeContext(),e)}}var Xe=(e)=>new Q(e),Ae=()=>{let e=W();if(!e.apiKey||!e.userId)throw Error("ALIGO_API_KEY and ALIGO_USER_ID are required");return new Q(e)};class be{static create(e){return new Q(e)}static createDefault(){return Ae()}}class _{id="aligo";config;smsHost;alimtalkHost;constructor(e){if(!e||typeof e!=="object")throw Error("AligoTemplateProvider requires a config object");if(!e.apiKey||e.apiKey.length===0)throw Error("AligoTemplateProvider requires `apiKey`");if(!e.userId||e.userId.length===0)throw Error("AligoTemplateProvider requires `userId`");this.config=e,this.smsHost=e.smsBaseUrl||"https://apis.aligo.in",this.alimtalkHost=e.alimtalkBaseUrl||"https://kakaoapi.aligo.in"}getRuntimeContext(){return{providerId:this.id,config:this.config,smsHost:this.smsHost,alimtalkHost:this.alimtalkHost}}async createTemplate(e,r){return L(this.getRuntimeContext(),e,r)}async updateTemplate(e,r,t){return U(this.getRuntimeContext(),e,r,t)}async deleteTemplate(e,r){return q(this.getRuntimeContext(),e,r)}async getTemplate(e,r){return S(this.getRuntimeContext(),e,r)}async listTemplates(e,r){return F(this.getRuntimeContext(),e,r)}async requestTemplateInspection(e,r){return V(this.getRuntimeContext(),e,r)}}var se=(e)=>new _(e),Y=()=>{let e=W();if(!e.apiKey||!e.userId)throw Error("ALIGO_API_KEY and ALIGO_USER_ID are required");return new _(e)};class G{static create(e){return new _(e)}static createDefault(){return Y()}}
3
+
4
+ //# debugId=5811635F8E1D265164756E2164756E21
5
+ //# sourceMappingURL=template.js.map
@@ -0,0 +1,5 @@
1
+ import{fail as f,KMsgError as K,KMsgErrorCode as w,ok as E}from"@k-msg/core";import{validateTemplatePayload as oe}from"@k-msg/template/send";function c(e){return typeof e==="object"&&e!==null&&!Array.isArray(e)}import{KMsgError as L,KMsgErrorCode as h}from"@k-msg/core";function I(e,r){if(e instanceof L)return e;return new L(h.PROVIDER_ERROR,e instanceof Error?e.message:String(e),{providerId:r})}function C(e,r){if(e instanceof L)return e;let t=c(e)?e:{},i=t.result_code,n=i!==void 0&&i!==null?String(i):"UNKNOWN",a=typeof t.message==="string"&&t.message.length>0?t.message:typeof t.msg==="string"&&t.msg.length>0?t.msg:e instanceof Error?e.message:"Unknown Aligo error",s=h.PROVIDER_ERROR;switch(n){case"-100":case"-101":s=h.AUTHENTICATION_FAILED;break;case"-102":case"-201":s=h.INSUFFICIENT_BALANCE;break;case"-103":case"-105":s=h.INVALID_REQUEST;break;case"-501":s=h.TEMPLATE_NOT_FOUND;break;default:s=h.PROVIDER_ERROR}return new L(s,`${a} (code: ${n})`,{providerId:r,resultCode:n})}import{fail as ke,KMsgError as ie,KMsgErrorCode as $,ok as Ae}from"@k-msg/core";import{KMsgError as ee,KMsgErrorCode as re}from"@k-msg/core";function ve(e,r){if(!e)return"";return e.replace(/#\{([^}]+)\}/g,(t,i)=>{let n=r[i];return n===void 0||n===null?t:String(n)})}function B(e){let r=typeof e.imageUrl==="string"&&e.imageUrl.trim().length>0?e.imageUrl.trim():void 0;if(r)return r;let t=e.media?.image;if(!t)return;if("ref"in t){let i=t.ref.trim();return i.length>0?i:void 0}throw new ee(re.INVALID_REQUEST,"Aligo MMS/FriendTalk image requires `options.imageUrl` or `options.media.image.ref` (url/path).",{providerId:e.providerId})}function U(e,r){switch(e){case"sendSMS":return"/send/";case"sendAlimTalk":return"/akv10/alimtalk/send/";case"sendFriendTalk":return r.friendtalkEndpoint||"/akv10/friendtalk/send/";default:return"/"}}function q(e){let r=e.getFullYear(),t=String(e.getMonth()+1).padStart(2,"0"),i=String(e.getDate()).padStart(2,"0"),n=String(e.getHours()).padStart(2,"0"),a=String(e.getMinutes()).padStart(2,"0");return{date:`${r}${t}${i}`,time:`${n}${a}`}}function te(e){if(typeof e==="number"&&Number.isFinite(e))return e;if(typeof e==="string"){let r=e.trim();if(!r)return;let t=Number(r);if(Number.isFinite(t))return t}return}function T(e,r){let t=(typeof r?.kakaoChannelSenderKey==="string"&&r.kakaoChannelSenderKey.trim().length>0?r.kakaoChannelSenderKey.trim():e.config.senderKey)||"";if(!t)throw new ee(re.INVALID_REQUEST,"kakao channel senderKey is required (ctx.kakaoChannelSenderKey or config.senderKey)",{providerId:e.providerId});return t}function F(e){switch(typeof e.inspStatus==="string"?e.inspStatus.trim().toUpperCase():""){case"APR":return"APPROVED";case"REJ":return"REJECTED";case"REQ":case"REG":return"INSPECTION";default:return"PENDING"}}function m(e){if(typeof e!=="string")return;let r=e.trim();if(!r)return;let t=/^(\d{4})-(\d{2})-(\d{2})\s+(\d{2}):(\d{2}):(\d{2})$/.exec(r);if(!t)return;let i=Number(t[1]),n=Number(t[2]),a=Number(t[3]),s=Number(t[4]),l=Number(t[5]),d=Number(t[6]),o=new Date(i,n-1,a,s,l,d);return Number.isNaN(o.getTime())?void 0:o}function ne(e,r){if(!e)return"";let t=e._full_text;if(t!==void 0&&t!==null)return String(t);if(!r)return Object.values(e).map(String).join(`
2
+ `);return ve(r,e)}async function u(e){let r=new FormData;for(let[i,n]of Object.entries(e.data))if(n!==void 0&&n!==null)r.append(i,String(n));let t=await fetch(`${e.host}${e.endpoint}`,{method:"POST",body:r});if(!t.ok)throw new ie($.NETWORK_ERROR,`HTTP error! status: ${t.status}`,{providerId:e.providerId});return await t.json()}function y(e){let{providerId:r,response:t,fallbackMessage:i}=e,n=t.code,a=te(n);if(a===0)return Ae(void 0);let s=typeof t.message==="string"&&t.message.length>0?t.message:i,l=a===509||a===-99?$.INVALID_REQUEST:$.PROVIDER_ERROR;return ke(new ie(l,s,{providerId:r,originalCode:n,raw:t}))}import{ButtonParser as be}from"@k-msg/template/send";function W(e){if(!Array.isArray(e)||e.length===0)return;let r=JSON.parse(be.serializeButtons(e));return JSON.stringify({button:r})}function ae(e,r){return new K(e.code,e.message,{providerId:r,...e.details??{}})}async function Y(e,r,t){try{let i=T(e,t),n=oe(r,{requireName:!0,requireContent:!0});if(n.isFailure)return f(ae(n.error,e.providerId));let a={apikey:e.config.apiKey,userid:e.config.userId,senderkey:i,tpl_name:n.value.name??r.name,tpl_content:n.value.content??r.content},s=W(n.value.buttons);if(s)a.tpl_button=s;let l=await u({host:e.alimtalkHost,endpoint:"/akv10/template/add/",data:a,providerId:e.providerId}),d=y({providerId:e.providerId,response:l,fallbackMessage:"template create failed"});if(d.isFailure)return d;let o=c(l.data)?l.data:{},p=String(o.templtCode??"");if(!p)return f(new K(w.PROVIDER_ERROR,"template create did not return templtCode",{providerId:e.providerId,raw:l}));let g=m(o.cdate)??new Date,k=m(o.udate)??m(o.cdate)??g;return E({id:p,code:p,name:String(o.templtName??n.value.name??r.name),content:String(o.templtContent??n.value.content??r.content),category:r.category,status:F(o),buttons:Array.isArray(o.buttons)?o.buttons:n.value.buttons,variables:r.variables,createdAt:g,updatedAt:k})}catch(i){return f(I(i,e.providerId))}}async function N(e,r,t){try{let i=T(e,t),n=r.trim();if(!n)return f(new K(w.INVALID_REQUEST,"code is required",{providerId:e.providerId}));let a=await u({host:e.alimtalkHost,endpoint:"/akv10/template/list/",data:{apikey:e.config.apiKey,userid:e.config.userId,senderkey:i,tpl_code:n},providerId:e.providerId}),s=y({providerId:e.providerId,response:a,fallbackMessage:"template get failed"});if(s.isFailure)return s;let l=a.list,o=(Array.isArray(l)?l:[]).find(c);if(!o)return f(new K(w.TEMPLATE_NOT_FOUND,"Template not found",{providerId:e.providerId,templateCode:n}));let p=String(o.templtCode??n),g=m(o.cdate)??new Date,k=m(o.udate)??m(o.cdate)??g;return E({id:p,code:p,name:String(o.templtName??""),content:String(o.templtContent??""),status:F(o),buttons:Array.isArray(o.buttons)?o.buttons:void 0,createdAt:g,updatedAt:k})}catch(i){return f(I(i,e.providerId))}}async function G(e,r,t,i){try{let n=T(e,i),a=r.trim();if(!a)return f(new K(w.INVALID_REQUEST,"code is required",{providerId:e.providerId}));let s=await N(e,a,{kakaoChannelSenderKey:n});if(s.isFailure)return s;let l=s.value,d=typeof t.name==="string"&&t.name.trim().length>0?t.name.trim():l.name,o=typeof t.content==="string"&&t.content.trim().length>0?t.content:l.content,p=oe({name:d,content:o,buttons:t.buttons!==void 0?t.buttons:l.buttons},{requireName:!0,requireContent:!0});if(p.isFailure)return f(ae(p.error,e.providerId));let g={apikey:e.config.apiKey,userid:e.config.userId,senderkey:n,tpl_code:a,tpl_name:p.value.name??d,tpl_content:p.value.content??o},k=W(p.value.buttons);if(k)g.tpl_button=k;let D=await u({host:e.alimtalkHost,endpoint:"/akv10/template/modify/",data:g,providerId:e.providerId}),M=y({providerId:e.providerId,response:D,fallbackMessage:"template update failed"});if(M.isFailure)return M;let _=await N(e,a,{kakaoChannelSenderKey:n});if(_.isSuccess)return _;return E({...l,name:p.value.name??d,content:p.value.content??o,...t.category!==void 0?{category:t.category}:{},...t.variables!==void 0?{variables:t.variables}:{},...t.buttons!==void 0?{buttons:p.value.buttons}:{},updatedAt:new Date})}catch(n){return f(I(n,e.providerId))}}async function J(e,r,t){try{let i=T(e,t),n=r.trim();if(!n)return f(new K(w.INVALID_REQUEST,"code is required",{providerId:e.providerId}));let a=await u({host:e.alimtalkHost,endpoint:"/akv10/template/del/",data:{apikey:e.config.apiKey,userid:e.config.userId,senderkey:i,tpl_code:n},providerId:e.providerId}),s=y({providerId:e.providerId,response:a,fallbackMessage:"template delete failed"});if(s.isFailure)return s;return E(void 0)}catch(i){return f(I(i,e.providerId))}}async function z(e,r,t){try{let i=T(e,t),n=await u({host:e.alimtalkHost,endpoint:"/akv10/template/list/",data:{apikey:e.config.apiKey,userid:e.config.userId,senderkey:i},providerId:e.providerId}),a=y({providerId:e.providerId,response:n,fallbackMessage:"template list failed"});if(a.isFailure)return a;let s=n.list,d=(Array.isArray(s)?s:[]).filter(c).map((o)=>{let p=String(o.templtCode??""),g=m(o.cdate)??new Date,k=m(o.udate)??m(o.cdate)??g;return{id:p,code:p,name:String(o.templtName??""),content:String(o.templtContent??""),status:F(o),buttons:Array.isArray(o.buttons)?o.buttons:void 0,createdAt:g,updatedAt:k}}).filter((o)=>o.code.length>0);if(r?.status){let o=r.status.trim().toUpperCase();return E(d.filter((p)=>p.status===o))}return E(d)}catch(i){return f(I(i,e.providerId))}}async function X(e,r,t){try{let i=T(e,t),n=r.trim();if(!n)return f(new K(w.INVALID_REQUEST,"code is required",{providerId:e.providerId}));let a=await u({host:e.alimtalkHost,endpoint:"/akv10/template/request/",data:{apikey:e.config.apiKey,userid:e.config.userId,senderkey:i,tpl_code:n},providerId:e.providerId}),s=y({providerId:e.providerId,response:a,fallbackMessage:"template inspection request failed"});if(s.isFailure)return s;return E(void 0)}catch(i){return f(I(i,e.providerId))}}import{readRuntimeEnv as S}from"@k-msg/core";var se={iwinv:{providerId:"iwinv",providerName:"IWINV Messaging Provider",channelOnboarding:"manual",templateLifecycleApi:"available",plusIdPolicy:"optional",plusIdInference:"unsupported",liveTestSupport:"supported",checks:[{id:"channel_registered_in_console",title:"Kakao channel is registered in IWINV console",description:"IWINV channel onboarding is manual. Confirm channel registration and approval in console.",kind:"manual",severity:"blocker",scopes:["doctor","preflight"]},{id:"iwinv_config_required",title:"IWINV config has required keys",kind:"config",severity:"blocker",scopes:["doctor","preflight"],configKeys:["apiKey"]},{id:"template_capability_available",title:"Template lifecycle APIs are available",kind:"capability",severity:"warning",scopes:["doctor","preflight"],capabilityMethods:["listTemplates","getTemplate","createTemplate","updateTemplate","deleteTemplate"]},{id:"template_list_probe",title:"Template list API probe",kind:"api_probe",severity:"warning",scopes:["doctor","preflight"],probeOperation:"list_templates"}],notes:["Channel add/auth is not available via IWINV public API in current integration.","Template APIs are available and can be probed."]},aligo:{providerId:"aligo",providerName:"Aligo Smart SMS",channelOnboarding:"api",templateLifecycleApi:"available",plusIdPolicy:"required_if_no_inference",plusIdInference:"supported",liveTestSupport:"supported",checks:[{id:"aligo_config_required",title:"Aligo config has required keys",kind:"config",severity:"blocker",scopes:["doctor","preflight"],configKeys:["apiKey","userId"]},{id:"channel_api_capability_available",title:"Kakao channel APIs are available",kind:"capability",severity:"warning",scopes:["doctor","preflight"],capabilityMethods:["listKakaoChannels","requestKakaoChannelAuth","addKakaoChannel"]},{id:"channel_list_probe",title:"Kakao channel list API probe",kind:"api_probe",severity:"warning",scopes:["doctor","preflight"],probeOperation:"list_kakao_channels"},{id:"template_list_probe",title:"Template list API probe",kind:"api_probe",severity:"warning",scopes:["doctor","preflight"],probeOperation:"list_templates"}]},solapi:{providerId:"solapi",providerName:"SOLAPI Messaging Provider",channelOnboarding:"none",templateLifecycleApi:"unavailable",plusIdPolicy:"required_if_no_inference",plusIdInference:"unsupported",liveTestSupport:"partial",checks:[{id:"solapi_config_required",title:"SOLAPI config has required keys",kind:"config",severity:"blocker",scopes:["doctor","preflight"],configKeys:["apiKey","apiSecret"]}],notes:["SOLAPI ALIMTALK requires kakao profileId/pfId, but plusId inference is not available in current integration."]},mock:{providerId:"mock",providerName:"Mock Provider",channelOnboarding:"api",templateLifecycleApi:"available",plusIdPolicy:"optional",plusIdInference:"supported",liveTestSupport:"none",checks:[{id:"mock_template_capability_available",title:"Mock template APIs are available",kind:"capability",severity:"info",scopes:["doctor","preflight"],capabilityMethods:["listTemplates","getTemplate","createTemplate"]}]}};function de(e){return se[e]}function Ge(){return Object.values(se)}import{fail as A,KMsgError as V,KMsgErrorCode as Q,ok as j}from"@k-msg/core";async function le(e,r){try{let t={apikey:e.config.apiKey,userid:e.config.userId,...typeof r?.plusId==="string"&&r.plusId.trim().length>0?{plusid:r.plusId.trim()}:{},...typeof r?.senderKey==="string"&&r.senderKey.trim().length>0?{senderkey:r.senderKey.trim()}:{}},i=await u({host:e.alimtalkHost,endpoint:"/akv10/profile/list/",data:t,providerId:e.providerId}),n=y({providerId:e.providerId,response:i,fallbackMessage:"channel list failed"});if(n.isFailure)return n;let a=i.list,l=(Array.isArray(a)?a:[]).filter(c).map((d)=>({providerId:e.providerId,senderKey:String(d.senderKey??""),plusId:typeof d.uuid==="string"?d.uuid:void 0,name:typeof d.name==="string"?d.name:void 0,status:typeof d.status==="string"?d.status:void 0,createdAt:m(d.cdate),updatedAt:m(d.udate),raw:d})).filter((d)=>d.senderKey.length>0);return j(l)}catch(t){return A(I(t,e.providerId))}}async function pe(e){try{let r=await u({host:e.alimtalkHost,endpoint:"/akv10/category/",data:{apikey:e.config.apiKey,userid:e.config.userId},providerId:e.providerId}),t=y({providerId:e.providerId,response:r,fallbackMessage:"category list failed"});if(t.isFailure)return t;let i=c(r.data)?r.data:{},n=(a)=>{return(Array.isArray(a)?a:[]).filter(c).map((l)=>({code:String(l.code??""),name:String(l.name??""),parentCode:typeof l.parentCode==="string"&&l.parentCode.length>0?l.parentCode:void 0})).filter((l)=>l.code.length>0)};return j({first:n(i.firstBusinessType),second:n(i.secondBusinessType),third:n(i.thirdBusinessType)})}catch(r){return A(I(r,e.providerId))}}async function ue(e,r){try{let t=r.plusId.trim(),i=r.phoneNumber.trim();if(!t||!i)return A(new V(Q.INVALID_REQUEST,"plusId and phoneNumber are required",{providerId:e.providerId}));let n=await u({host:e.alimtalkHost,endpoint:"/akv10/profile/auth/",data:{apikey:e.config.apiKey,userid:e.config.userId,plusid:t,phonenumber:i},providerId:e.providerId}),a=y({providerId:e.providerId,response:n,fallbackMessage:"channel auth failed"});if(a.isFailure)return a;return j(void 0)}catch(t){return A(I(t,e.providerId))}}async function me(e,r){try{let t=r.plusId.trim(),i=r.authNum.trim(),n=r.phoneNumber.trim(),a=r.categoryCode.trim();if(!t||!i||!n||!a)return A(new V(Q.INVALID_REQUEST,"plusId, authNum, phoneNumber, categoryCode are required",{providerId:e.providerId}));let s=await u({host:e.alimtalkHost,endpoint:"/akv10/profile/add/",data:{apikey:e.config.apiKey,userid:e.config.userId,plusid:t,authnum:i,phonenumber:n,categorycode:a},providerId:e.providerId}),l=y({providerId:e.providerId,response:s,fallbackMessage:"channel add failed"});if(l.isFailure)return l;let d=s.data,o=Array.isArray(d)?d.find(c):c(d)?d:void 0;if(!o)return A(new V(Q.PROVIDER_ERROR,"channel add returned empty data",{providerId:e.providerId,raw:s}));let p=String(o.senderKey??"");if(!p)return A(new V(Q.PROVIDER_ERROR,"channel add did not return senderKey",{providerId:e.providerId,raw:o}));return j({providerId:e.providerId,senderKey:p,plusId:typeof o.uuid==="string"?o.uuid:t,name:typeof o.name==="string"?o.name:void 0,status:typeof o.status==="string"?o.status:void 0,createdAt:m(o.cdate),updatedAt:m(o.udate),raw:o})}catch(t){return A(I(t,e.providerId))}}import{fail as v,KMsgError as b,KMsgErrorCode as R,ok as Z}from"@k-msg/core";function Re(e,r){if(e.type!=="ALIMTALK")return;if(e.failover?.enabled!==!0)return;return[{code:"FAILOVER_PARTIAL_PROVIDER",message:"Aligo failover mapping is partial. API-level fallback may be attempted for non-Kakao-user failures.",details:{providerId:r,mappedFields:["failover","fmessage_1","fsubject_1"],unsupportedFields:["fallbackChannel"]}}]}async function he(e,r){let t=r.from||e.config.sender||"";if(!t)return v(new b(R.INVALID_REQUEST,"from is required for SMS/LMS/MMS (options.from or config.sender)",{providerId:e.providerId}));let i={key:e.config.apiKey,user_id:e.config.userId,sender:t,receiver:r.to,msg:r.text,msg_type:r.type,title:r.subject,testmode_yn:e.config.testMode?"Y":"N"},n=r.options?.scheduledAt;if(n instanceof Date&&!Number.isNaN(n.getTime())){let{date:s,time:l}=q(n);i.rdate=s,i.rtime=l}if(r.type==="MMS"){let s=B({imageUrl:r.imageUrl,media:r.media,providerId:e.providerId});if(!s)return v(new b(R.INVALID_REQUEST,"image is required for MMS (options.imageUrl or options.media.image.ref)",{providerId:e.providerId}));i.image=s}let a=await u({host:e.smsHost,endpoint:U("sendSMS",e.config),data:i,providerId:e.providerId});if(a.result_code!=="1")return v(C(a,e.providerId));return Z({messageId:r.messageId||crypto.randomUUID(),providerId:e.providerId,providerMessageId:a.msg_id,status:"PENDING",type:r.type,to:r.to,raw:a})}async function Te(e,r){let t=Re(r,e.providerId),i=(typeof r.kakao?.profileId==="string"?r.kakao.profileId:e.config.senderKey)||"";if(!i)return v(new b(R.INVALID_REQUEST,"kakao profileId is required (options.kakao.profileId or config.senderKey)",{providerId:e.providerId}));let n=r.from||e.config.sender||"";if(!n)return v(new b(R.INVALID_REQUEST,"from is required for ALIMTALK (options.from or config.sender)",{providerId:e.providerId}));let{variables:a,templateId:s}=r;if(!s||s.length===0)return v(new b(R.INVALID_REQUEST,"templateId is required for ALIMTALK",{providerId:e.providerId}));let l=typeof r.providerOptions?.templateContent==="string"?r.providerOptions.templateContent:void 0,d={apikey:e.config.apiKey,userid:e.config.userId,senderkey:i,tpl_code:s,sender:n,receiver_1:r.to,subject_1:"알림톡",message_1:ne(a,l),testMode:e.config.testMode?"Y":"N"},o=typeof r.providerOptions?.failover==="string"?r.providerOptions.failover.trim().toUpperCase():"",p=o==="Y"||o==="N"?o:void 0,g=r.failover?.enabled===!0?"Y":r.failover?.enabled===!1?"N":void 0,k=p??g,D=typeof r.providerOptions?.fsubject_1==="string"&&r.providerOptions.fsubject_1.trim().length>0?r.providerOptions.fsubject_1.trim():typeof r.failover?.fallbackTitle==="string"&&r.failover.fallbackTitle.trim().length>0?r.failover.fallbackTitle.trim():void 0,M=typeof r.providerOptions?.fmessage_1==="string"&&r.providerOptions.fmessage_1.trim().length>0?r.providerOptions.fmessage_1.trim():typeof r.failover?.fallbackContent==="string"&&r.failover.fallbackContent.trim().length>0?r.failover.fallbackContent.trim():void 0;if(k)d.failover=k;if(D)d.fsubject_1=D;if(M)d.fmessage_1=M;let _=r.options?.scheduledAt;if(_ instanceof Date&&!Number.isNaN(_.getTime())){let{date:Ie,time:ye}=q(_);d.reserve="Y",d.reserve_date=Ie,d.reserve_time=ye}let P=await u({host:e.alimtalkHost,endpoint:U("sendAlimTalk",e.config),data:d,providerId:e.providerId});if(P.result_code!=="0")return v(C(P,e.providerId));return Z({messageId:r.messageId||crypto.randomUUID(),providerId:e.providerId,providerMessageId:P.msg_id,status:"PENDING",type:r.type,to:r.to,...Array.isArray(t)&&t.length>0?{warnings:t}:{},raw:P})}async function Ke(e,r){let t=(typeof r.kakao?.profileId==="string"?r.kakao.profileId:e.config.senderKey)||"";if(!t)return v(new b(R.INVALID_REQUEST,"kakao profileId is required (options.kakao.profileId or config.senderKey)",{providerId:e.providerId}));let i=r.from||e.config.sender||"";if(!i)return v(new b(R.INVALID_REQUEST,"from is required for FRIENDTALK (options.from or config.sender)",{providerId:e.providerId}));let n={apikey:e.config.apiKey,userid:e.config.userId,senderkey:t,sender:i,receiver_1:r.to,subject_1:"친구톡",message_1:r.text,testMode:e.config.testMode?"Y":"N"},a=B({imageUrl:r.imageUrl,media:r.media,providerId:e.providerId});if(a)n.image_1=a;let s=Array.isArray(r.kakao?.buttons)?r.kakao.buttons:r.buttons;if(s)n.button_1=JSON.stringify(s);let l=r.options?.scheduledAt;if(l instanceof Date&&!Number.isNaN(l.getTime())){let{date:o,time:p}=q(l);n.reserve="Y",n.reserve_date=o,n.reserve_time=p}let d=await u({host:e.alimtalkHost,endpoint:U("sendFriendTalk",e.config),data:n,providerId:e.providerId});if(d.result_code!=="0")return v(C(d,e.providerId));return Z({messageId:r.messageId||crypto.randomUUID(),providerId:e.providerId,providerMessageId:d.msg_id,status:"PENDING",type:r.type,to:r.to,raw:d})}async function fe(e,r){try{switch(r.type){case"ALIMTALK":return await Te(e,r);case"FRIENDTALK":return await Ke(e,r);case"SMS":case"LMS":case"MMS":return await he(e,r);default:return v(new b(R.INVALID_REQUEST,`AligoProvider does not support type ${r.type}`,{providerId:e.providerId,type:r.type}))}}catch(t){return v(C(t,e.providerId))}}function x(){return{apiKey:S("ALIGO_API_KEY")||"",userId:S("ALIGO_USER_ID")||"",senderKey:S("ALIGO_SENDER_KEY")||"",sender:S("ALIGO_SENDER")||"",friendtalkEndpoint:S("ALIGO_FRIENDTALK_ENDPOINT"),testMode:S("NODE_ENV")!=="production",debug:S("NODE_ENV")==="development"}}class H{id="aligo";name="Aligo Smart SMS";supportedTypes=["ALIMTALK","FRIENDTALK","SMS","LMS","MMS"];config;smsHost;alimtalkHost;getOnboardingSpec(){let e=de(this.id);if(!e)throw Error(`Onboarding spec missing for provider: ${this.id}`);return e}constructor(e){if(!e||typeof e!=="object")throw Error("AligoProvider requires a config object");if(!e.apiKey||e.apiKey.length===0)throw Error("AligoProvider requires `apiKey`");if(!e.userId||e.userId.length===0)throw Error("AligoProvider requires `userId`");this.config=e,this.smsHost=e.smsBaseUrl||"https://apis.aligo.in",this.alimtalkHost=e.alimtalkBaseUrl||"https://kakaoapi.aligo.in"}getRuntimeContext(){return{providerId:this.id,config:this.config,smsHost:this.smsHost,alimtalkHost:this.alimtalkHost}}async healthCheck(){let e=Date.now(),r=[];try{if(!this.config.apiKey)r.push("Missing apiKey");if(!this.config.userId)r.push("Missing userId");if(!this.config.sender)r.push("Missing sender (default from)");try{new URL(this.smsHost)}catch{r.push("Invalid smsBaseUrl")}try{new URL(this.alimtalkHost)}catch{r.push("Invalid alimtalkBaseUrl")}return{healthy:r.length===0,issues:r,latencyMs:Date.now()-e,data:{provider:this.id,smsBaseUrl:this.smsHost,alimtalkBaseUrl:this.alimtalkHost}}}catch(t){return r.push(t instanceof Error?t.message:String(t)),{healthy:!1,issues:r,latencyMs:Date.now()-e}}}async send(e){let r=e.messageId||crypto.randomUUID(),t={...e,messageId:r};return fe(this.getRuntimeContext(),t)}async listKakaoChannels(e){return le(this.getRuntimeContext(),e)}async listKakaoChannelCategories(){return pe(this.getRuntimeContext())}async requestKakaoChannelAuth(e){return ue(this.getRuntimeContext(),e)}async addKakaoChannel(e){return me(this.getRuntimeContext(),e)}}var ur=(e)=>new H(e),Ee=()=>{let e=x();if(!e.apiKey||!e.userId)throw Error("ALIGO_API_KEY and ALIGO_USER_ID are required");return new H(e)};class Se{static create(e){return new H(e)}static createDefault(){return Ee()}}class O{id="aligo";config;smsHost;alimtalkHost;constructor(e){if(!e||typeof e!=="object")throw Error("AligoTemplateProvider requires a config object");if(!e.apiKey||e.apiKey.length===0)throw Error("AligoTemplateProvider requires `apiKey`");if(!e.userId||e.userId.length===0)throw Error("AligoTemplateProvider requires `userId`");this.config=e,this.smsHost=e.smsBaseUrl||"https://apis.aligo.in",this.alimtalkHost=e.alimtalkBaseUrl||"https://kakaoapi.aligo.in"}getRuntimeContext(){return{providerId:this.id,config:this.config,smsHost:this.smsHost,alimtalkHost:this.alimtalkHost}}async createTemplate(e,r){return Y(this.getRuntimeContext(),e,r)}async updateTemplate(e,r,t){return G(this.getRuntimeContext(),e,r,t)}async deleteTemplate(e,r){return J(this.getRuntimeContext(),e,r)}async getTemplate(e,r){return N(this.getRuntimeContext(),e,r)}async listTemplates(e,r){return z(this.getRuntimeContext(),e,r)}async requestTemplateInspection(e,r){return X(this.getRuntimeContext(),e,r)}}var _e=(e)=>new O(e),ge=()=>{let e=x();if(!e.apiKey||!e.userId)throw Error("ALIGO_API_KEY and ALIGO_USER_ID are required");return new O(e)};class ce{static create(e){return new O(e)}static createDefault(){return ge()}}export{G as updateTemplate,X as requestTemplateInspection,z as listTemplates,N as getTemplate,J as deleteTemplate,Y as createTemplate,ge as createDefaultAligoTemplateProvider,_e as createAligoTemplateProvider,ce as AligoTemplateProviderFactory,O as AligoTemplateProvider};
3
+
4
+ //# debugId=0AE10D7A5509AC4C64756E2164756E21
5
+ //# sourceMappingURL=template.mjs.map
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
- var{defineProperty:Ne,getOwnPropertyNames:ht,getOwnPropertyDescriptor:Ct}=Object,_t=Object.prototype.hasOwnProperty;var We=new WeakMap,Dt=(e)=>{var t=We.get(e),r;if(t)return t;if(t=Ne({},"__esModule",{value:!0}),e&&typeof e==="object"||typeof e==="function")ht(e).map((n)=>!_t.call(t,n)&&Ne(t,n,{get:()=>e[n],enumerable:!(r=Ct(e,n))||r.enumerable}));return We.set(e,t),t};var Ot=(e,t)=>{for(var r in t)Ne(e,r,{get:t[r],enumerable:!0,configurable:!0,set:(n)=>t[r]=()=>n})};var qt={};Ot(qt,{providerOnboardingSpecs:()=>me,providerConfigFieldSpecs:()=>ot,providerCliMetadata:()=>wt,listProviderOnboardingSpecs:()=>xe,initializeIWINV:()=>Et,initializeAligo:()=>it,getProviderOnboardingSpec:()=>X,createIWINVProvider:()=>Tt,createDefaultIWINVProvider:()=>Ue,createDefaultAligoProvider:()=>ke,createAligoProvider:()=>nt,MockProvider:()=>He,IWINVProviderFactory:()=>qe,IWINVProvider:()=>pe,AligoProviderFactory:()=>he,AligoProvider:()=>de});module.exports=Dt(qt);var Z=require("@k-msg/core");var me={iwinv:{providerId:"iwinv",providerName:"IWINV Messaging Provider",channelOnboarding:"manual",templateLifecycleApi:"available",plusIdPolicy:"optional",plusIdInference:"unsupported",liveTestSupport:"supported",checks:[{id:"channel_registered_in_console",title:"Kakao channel is registered in IWINV console",description:"IWINV channel onboarding is manual. Confirm channel registration and approval in console.",kind:"manual",severity:"blocker",scopes:["doctor","preflight"]},{id:"iwinv_config_required",title:"IWINV config has required keys",kind:"config",severity:"blocker",scopes:["doctor","preflight"],configKeys:["apiKey"]},{id:"template_capability_available",title:"Template lifecycle APIs are available",kind:"capability",severity:"warning",scopes:["doctor","preflight"],capabilityMethods:["listTemplates","getTemplate","createTemplate","updateTemplate","deleteTemplate"]},{id:"template_list_probe",title:"Template list API probe",kind:"api_probe",severity:"warning",scopes:["doctor","preflight"],probeOperation:"list_templates"}],notes:["Channel add/auth is not available via IWINV public API in current integration.","Template APIs are available and can be probed."]},aligo:{providerId:"aligo",providerName:"Aligo Smart SMS",channelOnboarding:"api",templateLifecycleApi:"available",plusIdPolicy:"required_if_no_inference",plusIdInference:"supported",liveTestSupport:"supported",checks:[{id:"aligo_config_required",title:"Aligo config has required keys",kind:"config",severity:"blocker",scopes:["doctor","preflight"],configKeys:["apiKey","userId"]},{id:"channel_api_capability_available",title:"Kakao channel APIs are available",kind:"capability",severity:"warning",scopes:["doctor","preflight"],capabilityMethods:["listKakaoChannels","requestKakaoChannelAuth","addKakaoChannel"]},{id:"channel_list_probe",title:"Kakao channel list API probe",kind:"api_probe",severity:"warning",scopes:["doctor","preflight"],probeOperation:"list_kakao_channels"},{id:"template_list_probe",title:"Template list API probe",kind:"api_probe",severity:"warning",scopes:["doctor","preflight"],probeOperation:"list_templates"}]},solapi:{providerId:"solapi",providerName:"SOLAPI Messaging Provider",channelOnboarding:"none",templateLifecycleApi:"unavailable",plusIdPolicy:"required_if_no_inference",plusIdInference:"unsupported",liveTestSupport:"partial",checks:[{id:"solapi_config_required",title:"SOLAPI config has required keys",kind:"config",severity:"blocker",scopes:["doctor","preflight"],configKeys:["apiKey","apiSecret"]}],notes:["SOLAPI ALIMTALK requires kakao profileId/pfId, but plusId inference is not available in current integration."]},mock:{providerId:"mock",providerName:"Mock Provider",channelOnboarding:"api",templateLifecycleApi:"available",plusIdPolicy:"optional",plusIdInference:"supported",liveTestSupport:"none",checks:[{id:"mock_template_capability_available",title:"Mock template APIs are available",kind:"capability",severity:"info",scopes:["doctor","preflight"],capabilityMethods:["listTemplates","getTemplate","createTemplate"]}]}};function X(e){return me[e]}function xe(){return Object.values(me)}var C=require("@k-msg/core");function w(e){return typeof e==="object"&&e!==null&&!Array.isArray(e)}var V=require("@k-msg/core");function U(e,t){if(e instanceof V.KMsgError)return e;return new V.KMsgError(V.KMsgErrorCode.PROVIDER_ERROR,e instanceof Error?e.message:String(e),{providerId:t})}function ue(e,t){if(e instanceof V.KMsgError)return e;let r=w(e)?e:{},n=r.result_code,i=n!==void 0&&n!==null?String(n):"UNKNOWN",o=typeof r.message==="string"&&r.message.length>0?r.message:typeof r.msg==="string"&&r.msg.length>0?r.msg:e instanceof Error?e.message:"Unknown Aligo error",l=V.KMsgErrorCode.PROVIDER_ERROR;switch(i){case"-100":case"-101":l=V.KMsgErrorCode.AUTHENTICATION_FAILED;break;case"-102":case"-201":l=V.KMsgErrorCode.INSUFFICIENT_BALANCE;break;case"-103":case"-105":l=V.KMsgErrorCode.INVALID_REQUEST;break;case"-501":l=V.KMsgErrorCode.TEMPLATE_NOT_FOUND;break;default:l=V.KMsgErrorCode.PROVIDER_ERROR}return new V.KMsgError(l,`${o} (code: ${i})`,{providerId:t,resultCode:i})}var ae=require("@k-msg/core"),ye=require("@k-msg/template");function Te(e){let t=typeof e.imageUrl==="string"&&e.imageUrl.trim().length>0?e.imageUrl.trim():void 0;if(t)return t;let r=e.media?.image;if(!r)return;if("ref"in r){let n=r.ref.trim();return n.length>0?n:void 0}throw new ae.KMsgError(ae.KMsgErrorCode.INVALID_REQUEST,"Aligo MMS/FriendTalk image requires `options.imageUrl` or `options.media.image.ref` (url/path).",{providerId:e.providerId})}function Ie(e,t){switch(e){case"sendSMS":return"/send/";case"sendAlimTalk":return"/akv10/alimtalk/send/";case"sendFriendTalk":return t.friendtalkEndpoint||"/akv10/friendtalk/send/";default:return"/"}}function Se(e){let t=e.getFullYear(),r=String(e.getMonth()+1).padStart(2,"0"),n=String(e.getDate()).padStart(2,"0"),i=String(e.getHours()).padStart(2,"0"),o=String(e.getMinutes()).padStart(2,"0");return{date:`${t}${r}${n}`,time:`${i}${o}`}}function Be(e){if(typeof e==="number"&&Number.isFinite(e))return e;if(typeof e==="string"){let t=e.trim();if(!t)return;let r=Number(t);if(Number.isFinite(r))return r}return}function ne(e,t){let r=(typeof t?.kakaoChannelSenderKey==="string"&&t.kakaoChannelSenderKey.trim().length>0?t.kakaoChannelSenderKey.trim():e.config.senderKey)||"";if(!r)throw new ae.KMsgError(ae.KMsgErrorCode.INVALID_REQUEST,"kakao channel senderKey is required (ctx.kakaoChannelSenderKey or config.senderKey)",{providerId:e.providerId});return r}function Ee(e){if(!Array.isArray(e)||e.length===0)return;let t=JSON.parse(ye.ButtonParser.serializeButtons(e));return JSON.stringify({button:t})}function ve(e){switch(typeof e.inspStatus==="string"?e.inspStatus.trim().toUpperCase():""){case"APR":return"APPROVED";case"REJ":return"REJECTED";case"REQ":case"REG":return"INSPECTION";default:return"PENDING"}}function K(e){if(typeof e!=="string")return;let t=e.trim();if(!t)return;let r=/^(\d{4})-(\d{2})-(\d{2})\s+(\d{2}):(\d{2}):(\d{2})$/.exec(t);if(!r)return;let n=Number(r[1]),i=Number(r[2]),o=Number(r[3]),l=Number(r[4]),d=Number(r[5]),a=Number(r[6]),s=new Date(n,i-1,o,l,d,a);return Number.isNaN(s.getTime())?void 0:s}function Qe(e,t){if(!e)return"";let r=e._full_text;if(r!==void 0&&r!==null)return String(r);if(!t)return Object.values(e).map(String).join(`
2
- `);return ye.interpolate(t,e)}var Q=require("@k-msg/core");async function L(e){let t=new FormData;for(let[n,i]of Object.entries(e.data))if(i!==void 0&&i!==null)t.append(n,String(i));let r=await fetch(`${e.host}${e.endpoint}`,{method:"POST",body:t});if(!r.ok)throw new Q.KMsgError(Q.KMsgErrorCode.NETWORK_ERROR,`HTTP error! status: ${r.status}`,{providerId:e.providerId});return await r.json()}function q(e){let{providerId:t,response:r,fallbackMessage:n}=e,i=r.code,o=Be(i);if(o===0)return Q.ok(void 0);let l=typeof r.message==="string"&&r.message.length>0?r.message:n,d=o===509||o===-99?Q.KMsgErrorCode.INVALID_REQUEST:Q.KMsgErrorCode.PROVIDER_ERROR;return Q.fail(new Q.KMsgError(d,l,{providerId:t,originalCode:i,raw:r}))}async function ze(e,t){try{let r={apikey:e.config.apiKey,userid:e.config.userId,...typeof t?.plusId==="string"&&t.plusId.trim().length>0?{plusid:t.plusId.trim()}:{},...typeof t?.senderKey==="string"&&t.senderKey.trim().length>0?{senderkey:t.senderKey.trim()}:{}},n=await L({host:e.alimtalkHost,endpoint:"/akv10/profile/list/",data:r,providerId:e.providerId}),i=q({providerId:e.providerId,response:n,fallbackMessage:"channel list failed"});if(i.isFailure)return i;let o=n.list,d=(Array.isArray(o)?o:[]).filter(w).map((a)=>({providerId:e.providerId,senderKey:String(a.senderKey??""),plusId:typeof a.uuid==="string"?a.uuid:void 0,name:typeof a.name==="string"?a.name:void 0,status:typeof a.status==="string"?a.status:void 0,createdAt:K(a.cdate),updatedAt:K(a.udate),raw:a})).filter((a)=>a.senderKey.length>0);return C.ok(d)}catch(r){return C.fail(U(r,e.providerId))}}async function $e(e){try{let t=await L({host:e.alimtalkHost,endpoint:"/akv10/category/",data:{apikey:e.config.apiKey,userid:e.config.userId},providerId:e.providerId}),r=q({providerId:e.providerId,response:t,fallbackMessage:"category list failed"});if(r.isFailure)return r;let n=w(t.data)?t.data:{},i=(o)=>{return(Array.isArray(o)?o:[]).filter(w).map((d)=>({code:String(d.code??""),name:String(d.name??""),parentCode:typeof d.parentCode==="string"&&d.parentCode.length>0?d.parentCode:void 0})).filter((d)=>d.code.length>0)};return C.ok({first:i(n.firstBusinessType),second:i(n.secondBusinessType),third:i(n.thirdBusinessType)})}catch(t){return C.fail(U(t,e.providerId))}}async function je(e,t){try{let r=t.plusId.trim(),n=t.phoneNumber.trim();if(!r||!n)return C.fail(new C.KMsgError(C.KMsgErrorCode.INVALID_REQUEST,"plusId and phoneNumber are required",{providerId:e.providerId}));let i=await L({host:e.alimtalkHost,endpoint:"/akv10/profile/auth/",data:{apikey:e.config.apiKey,userid:e.config.userId,plusid:r,phonenumber:n},providerId:e.providerId}),o=q({providerId:e.providerId,response:i,fallbackMessage:"channel auth failed"});if(o.isFailure)return o;return C.ok(void 0)}catch(r){return C.fail(U(r,e.providerId))}}async function Ye(e,t){try{let r=t.plusId.trim(),n=t.authNum.trim(),i=t.phoneNumber.trim(),o=t.categoryCode.trim();if(!r||!n||!i||!o)return C.fail(new C.KMsgError(C.KMsgErrorCode.INVALID_REQUEST,"plusId, authNum, phoneNumber, categoryCode are required",{providerId:e.providerId}));let l=await L({host:e.alimtalkHost,endpoint:"/akv10/profile/add/",data:{apikey:e.config.apiKey,userid:e.config.userId,plusid:r,authnum:n,phonenumber:i,categorycode:o},providerId:e.providerId}),d=q({providerId:e.providerId,response:l,fallbackMessage:"channel add failed"});if(d.isFailure)return d;let a=l.data,s=Array.isArray(a)?a.find(w):w(a)?a:void 0;if(!s)return C.fail(new C.KMsgError(C.KMsgErrorCode.PROVIDER_ERROR,"channel add returned empty data",{providerId:e.providerId,raw:l}));let p=String(s.senderKey??"");if(!p)return C.fail(new C.KMsgError(C.KMsgErrorCode.PROVIDER_ERROR,"channel add did not return senderKey",{providerId:e.providerId,raw:s}));return C.ok({providerId:e.providerId,senderKey:p,plusId:typeof s.uuid==="string"?s.uuid:r,name:typeof s.name==="string"?s.name:void 0,status:typeof s.status==="string"?s.status:void 0,createdAt:K(s.cdate),updatedAt:K(s.udate),raw:s})}catch(r){return C.fail(U(r,e.providerId))}}var N=require("@k-msg/core");function Mt(e,t){if(e.type!=="ALIMTALK")return;if(e.failover?.enabled!==!0)return;return[{code:"FAILOVER_PARTIAL_PROVIDER",message:"Aligo failover mapping is partial. API-level fallback may be attempted for non-Kakao-user failures.",details:{providerId:t,mappedFields:["failover","fmessage_1","fsubject_1"],unsupportedFields:["fallbackChannel"]}}]}async function Pt(e,t){let r=t.from||e.config.sender||"";if(!r)return N.fail(new N.KMsgError(N.KMsgErrorCode.INVALID_REQUEST,"from is required for SMS/LMS/MMS (options.from or config.sender)",{providerId:e.providerId}));let n={key:e.config.apiKey,user_id:e.config.userId,sender:r,receiver:t.to,msg:t.text,msg_type:t.type,title:t.subject,testmode_yn:e.config.testMode?"Y":"N"},i=t.options?.scheduledAt;if(i instanceof Date&&!Number.isNaN(i.getTime())){let{date:l,time:d}=Se(i);n.rdate=l,n.rtime=d}if(t.type==="MMS"){let l=Te({imageUrl:t.imageUrl,media:t.media,providerId:e.providerId});if(!l)return N.fail(new N.KMsgError(N.KMsgErrorCode.INVALID_REQUEST,"image is required for MMS (options.imageUrl or options.media.image.ref)",{providerId:e.providerId}));n.image=l}let o=await L({host:e.smsHost,endpoint:Ie("sendSMS",e.config),data:n,providerId:e.providerId});if(o.result_code!=="1")return N.fail(ue(o,e.providerId));return N.ok({messageId:t.messageId||crypto.randomUUID(),providerId:e.providerId,providerMessageId:o.msg_id,status:"PENDING",type:t.type,to:t.to,raw:o})}async function Lt(e,t){let r=Mt(t,e.providerId),n=(typeof t.kakao?.profileId==="string"?t.kakao.profileId:e.config.senderKey)||"";if(!n)return N.fail(new N.KMsgError(N.KMsgErrorCode.INVALID_REQUEST,"kakao profileId is required (options.kakao.profileId or config.senderKey)",{providerId:e.providerId}));let i=t.from||e.config.sender||"";if(!i)return N.fail(new N.KMsgError(N.KMsgErrorCode.INVALID_REQUEST,"from is required for ALIMTALK (options.from or config.sender)",{providerId:e.providerId}));let{variables:o,templateId:l}=t;if(!l||l.length===0)return N.fail(new N.KMsgError(N.KMsgErrorCode.INVALID_REQUEST,"templateId is required for ALIMTALK",{providerId:e.providerId}));let d=typeof t.providerOptions?.templateContent==="string"?t.providerOptions.templateContent:void 0,a={apikey:e.config.apiKey,userid:e.config.userId,senderkey:n,tpl_code:l,sender:i,receiver_1:t.to,subject_1:"알림톡",message_1:Qe(o,d),testMode:e.config.testMode?"Y":"N"},s=typeof t.providerOptions?.failover==="string"?t.providerOptions.failover.trim().toUpperCase():"",p=s==="Y"||s==="N"?s:void 0,b=t.failover?.enabled===!0?"Y":t.failover?.enabled===!1?"N":void 0,u=p??b,S=typeof t.providerOptions?.fsubject_1==="string"&&t.providerOptions.fsubject_1.trim().length>0?t.providerOptions.fsubject_1.trim():typeof t.failover?.fallbackTitle==="string"&&t.failover.fallbackTitle.trim().length>0?t.failover.fallbackTitle.trim():void 0,E=typeof t.providerOptions?.fmessage_1==="string"&&t.providerOptions.fmessage_1.trim().length>0?t.providerOptions.fmessage_1.trim():typeof t.failover?.fallbackContent==="string"&&t.failover.fallbackContent.trim().length>0?t.failover.fallbackContent.trim():void 0;if(u)a.failover=u;if(S)a.fsubject_1=S;if(E)a.fmessage_1=E;let y=t.options?.scheduledAt;if(y instanceof Date&&!Number.isNaN(y.getTime())){let{date:k,time:I}=Se(y);a.reserve="Y",a.reserve_date=k,a.reserve_time=I}let R=await L({host:e.alimtalkHost,endpoint:Ie("sendAlimTalk",e.config),data:a,providerId:e.providerId});if(R.result_code!=="0")return N.fail(ue(R,e.providerId));return N.ok({messageId:t.messageId||crypto.randomUUID(),providerId:e.providerId,providerMessageId:R.msg_id,status:"PENDING",type:t.type,to:t.to,...Array.isArray(r)&&r.length>0?{warnings:r}:{},raw:R})}async function Kt(e,t){let r=(typeof t.kakao?.profileId==="string"?t.kakao.profileId:e.config.senderKey)||"";if(!r)return N.fail(new N.KMsgError(N.KMsgErrorCode.INVALID_REQUEST,"kakao profileId is required (options.kakao.profileId or config.senderKey)",{providerId:e.providerId}));let n=t.from||e.config.sender||"";if(!n)return N.fail(new N.KMsgError(N.KMsgErrorCode.INVALID_REQUEST,"from is required for FRIENDTALK (options.from or config.sender)",{providerId:e.providerId}));let i={apikey:e.config.apiKey,userid:e.config.userId,senderkey:r,sender:n,receiver_1:t.to,subject_1:"친구톡",message_1:t.text,testMode:e.config.testMode?"Y":"N"},o=Te({imageUrl:t.imageUrl,media:t.media,providerId:e.providerId});if(o)i.image_1=o;let l=Array.isArray(t.kakao?.buttons)?t.kakao.buttons:t.buttons;if(l)i.button_1=JSON.stringify(l);let d=t.options?.scheduledAt;if(d instanceof Date&&!Number.isNaN(d.getTime())){let{date:s,time:p}=Se(d);i.reserve="Y",i.reserve_date=s,i.reserve_time=p}let a=await L({host:e.alimtalkHost,endpoint:Ie("sendFriendTalk",e.config),data:i,providerId:e.providerId});if(a.result_code!=="0")return N.fail(ue(a,e.providerId));return N.ok({messageId:t.messageId||crypto.randomUUID(),providerId:e.providerId,providerMessageId:a.msg_id,status:"PENDING",type:t.type,to:t.to,raw:a})}async function Je(e,t){try{switch(t.type){case"ALIMTALK":return await Lt(e,t);case"FRIENDTALK":return await Kt(e,t);case"SMS":case"LMS":case"MMS":return await Pt(e,t);default:return N.fail(new N.KMsgError(N.KMsgErrorCode.INVALID_REQUEST,`AligoProvider does not support type ${t.type}`,{providerId:e.providerId,type:t.type}))}}catch(r){return N.fail(ue(r,e.providerId))}}var A=require("@k-msg/core"),we=require("@k-msg/template");function Ge(e,t){return new A.KMsgError(e.code,e.message,{providerId:t,...e.details??{}})}async function Xe(e,t,r){try{let n=ne(e,r),i=we.validateTemplatePayload(t,{requireName:!0,requireContent:!0});if(i.isFailure)return A.fail(Ge(i.error,e.providerId));let o={apikey:e.config.apiKey,userid:e.config.userId,senderkey:n,tpl_name:i.value.name??t.name,tpl_content:i.value.content??t.content},l=Ee(i.value.buttons);if(l)o.tpl_button=l;let d=await L({host:e.alimtalkHost,endpoint:"/akv10/template/add/",data:o,providerId:e.providerId}),a=q({providerId:e.providerId,response:d,fallbackMessage:"template create failed"});if(a.isFailure)return a;let s=w(d.data)?d.data:{},p=String(s.templtCode??"");if(!p)return A.fail(new A.KMsgError(A.KMsgErrorCode.PROVIDER_ERROR,"template create did not return templtCode",{providerId:e.providerId,raw:d}));let b=K(s.cdate)??new Date,u=K(s.udate)??K(s.cdate)??b;return A.ok({id:p,code:p,name:String(s.templtName??i.value.name??t.name),content:String(s.templtContent??i.value.content??t.content),category:t.category,status:ve(s),buttons:Array.isArray(s.buttons)?s.buttons:i.value.buttons,variables:t.variables,createdAt:b,updatedAt:u})}catch(n){return A.fail(U(n,e.providerId))}}async function be(e,t,r){try{let n=ne(e,r),i=t.trim();if(!i)return A.fail(new A.KMsgError(A.KMsgErrorCode.INVALID_REQUEST,"code is required",{providerId:e.providerId}));let o=await L({host:e.alimtalkHost,endpoint:"/akv10/template/list/",data:{apikey:e.config.apiKey,userid:e.config.userId,senderkey:n,tpl_code:i},providerId:e.providerId}),l=q({providerId:e.providerId,response:o,fallbackMessage:"template get failed"});if(l.isFailure)return l;let d=o.list,s=(Array.isArray(d)?d:[]).find(w);if(!s)return A.fail(new A.KMsgError(A.KMsgErrorCode.TEMPLATE_NOT_FOUND,"Template not found",{providerId:e.providerId,templateCode:i}));let p=String(s.templtCode??i),b=K(s.cdate)??new Date,u=K(s.udate)??K(s.cdate)??b;return A.ok({id:p,code:p,name:String(s.templtName??""),content:String(s.templtContent??""),status:ve(s),buttons:Array.isArray(s.buttons)?s.buttons:void 0,createdAt:b,updatedAt:u})}catch(n){return A.fail(U(n,e.providerId))}}async function Ze(e,t,r,n){try{let i=ne(e,n),o=t.trim();if(!o)return A.fail(new A.KMsgError(A.KMsgErrorCode.INVALID_REQUEST,"code is required",{providerId:e.providerId}));let l=await be(e,o,{kakaoChannelSenderKey:i});if(l.isFailure)return l;let d=l.value,a=typeof r.name==="string"&&r.name.trim().length>0?r.name.trim():d.name,s=typeof r.content==="string"&&r.content.trim().length>0?r.content:d.content,p=we.validateTemplatePayload({name:a,content:s,buttons:r.buttons!==void 0?r.buttons:d.buttons},{requireName:!0,requireContent:!0});if(p.isFailure)return A.fail(Ge(p.error,e.providerId));let b={apikey:e.config.apiKey,userid:e.config.userId,senderkey:i,tpl_code:o,tpl_name:p.value.name??a,tpl_content:p.value.content??s},u=Ee(p.value.buttons);if(u)b.tpl_button=u;let S=await L({host:e.alimtalkHost,endpoint:"/akv10/template/modify/",data:b,providerId:e.providerId}),E=q({providerId:e.providerId,response:S,fallbackMessage:"template update failed"});if(E.isFailure)return E;let y=await be(e,o,{kakaoChannelSenderKey:i});if(y.isSuccess)return y;return A.ok({...d,name:p.value.name??a,content:p.value.content??s,...r.category!==void 0?{category:r.category}:{},...r.variables!==void 0?{variables:r.variables}:{},...r.buttons!==void 0?{buttons:p.value.buttons}:{},updatedAt:new Date})}catch(i){return A.fail(U(i,e.providerId))}}async function et(e,t,r){try{let n=ne(e,r),i=t.trim();if(!i)return A.fail(new A.KMsgError(A.KMsgErrorCode.INVALID_REQUEST,"code is required",{providerId:e.providerId}));let o=await L({host:e.alimtalkHost,endpoint:"/akv10/template/del/",data:{apikey:e.config.apiKey,userid:e.config.userId,senderkey:n,tpl_code:i},providerId:e.providerId}),l=q({providerId:e.providerId,response:o,fallbackMessage:"template delete failed"});if(l.isFailure)return l;return A.ok(void 0)}catch(n){return A.fail(U(n,e.providerId))}}async function tt(e,t,r){try{let n=ne(e,r),i=await L({host:e.alimtalkHost,endpoint:"/akv10/template/list/",data:{apikey:e.config.apiKey,userid:e.config.userId,senderkey:n},providerId:e.providerId}),o=q({providerId:e.providerId,response:i,fallbackMessage:"template list failed"});if(o.isFailure)return o;let l=i.list,a=(Array.isArray(l)?l:[]).filter(w).map((s)=>{let p=String(s.templtCode??""),b=K(s.cdate)??new Date,u=K(s.udate)??K(s.cdate)??b;return{id:p,code:p,name:String(s.templtName??""),content:String(s.templtContent??""),status:ve(s),buttons:Array.isArray(s.buttons)?s.buttons:void 0,createdAt:b,updatedAt:u}}).filter((s)=>s.code.length>0);if(t?.status){let s=t.status.trim().toUpperCase();return A.ok(a.filter((p)=>p.status===s))}return A.ok(a)}catch(n){return A.fail(U(n,e.providerId))}}async function rt(e,t,r){try{let n=ne(e,r),i=t.trim();if(!i)return A.fail(new A.KMsgError(A.KMsgErrorCode.INVALID_REQUEST,"code is required",{providerId:e.providerId}));let o=await L({host:e.alimtalkHost,endpoint:"/akv10/template/request/",data:{apikey:e.config.apiKey,userid:e.config.userId,senderkey:n,tpl_code:i},providerId:e.providerId}),l=q({providerId:e.providerId,response:o,fallbackMessage:"template inspection request failed"});if(l.isFailure)return l;return A.ok(void 0)}catch(n){return A.fail(U(n,e.providerId))}}class de{config;id="aligo";name="Aligo Smart SMS";supportedTypes=["ALIMTALK","FRIENDTALK","SMS","LMS","MMS"];smsHost;alimtalkHost;getOnboardingSpec(){let e=X(this.id);if(!e)throw Error(`Onboarding spec missing for provider: ${this.id}`);return e}constructor(e){this.config=e;if(!e||typeof e!=="object")throw Error("AligoProvider requires a config object");if(!e.apiKey||e.apiKey.length===0)throw Error("AligoProvider requires `apiKey`");if(!e.userId||e.userId.length===0)throw Error("AligoProvider requires `userId`");this.smsHost=e.smsBaseUrl||"https://apis.aligo.in",this.alimtalkHost=e.alimtalkBaseUrl||"https://kakaoapi.aligo.in"}getRuntimeContext(){return{providerId:this.id,config:this.config,smsHost:this.smsHost,alimtalkHost:this.alimtalkHost}}async healthCheck(){let e=Date.now(),t=[];try{if(!this.config.apiKey)t.push("Missing apiKey");if(!this.config.userId)t.push("Missing userId");if(!this.config.sender)t.push("Missing sender (default from)");try{new URL(this.smsHost)}catch{t.push("Invalid smsBaseUrl")}try{new URL(this.alimtalkHost)}catch{t.push("Invalid alimtalkBaseUrl")}return{healthy:t.length===0,issues:t,latencyMs:Date.now()-e,data:{provider:this.id,smsBaseUrl:this.smsHost,alimtalkBaseUrl:this.alimtalkHost}}}catch(r){return t.push(r instanceof Error?r.message:String(r)),{healthy:!1,issues:t,latencyMs:Date.now()-e}}}async send(e){let t=e.messageId||crypto.randomUUID(),r={...e,messageId:t};return Je(this.getRuntimeContext(),r)}async listKakaoChannels(e){return ze(this.getRuntimeContext(),e)}async listKakaoChannelCategories(){return $e(this.getRuntimeContext())}async requestKakaoChannelAuth(e){return je(this.getRuntimeContext(),e)}async addKakaoChannel(e){return Ye(this.getRuntimeContext(),e)}async createTemplate(e,t){return Xe(this.getRuntimeContext(),e,t)}async updateTemplate(e,t,r){return Ze(this.getRuntimeContext(),e,t,r)}async deleteTemplate(e,t){return et(this.getRuntimeContext(),e,t)}async getTemplate(e,t){return be(this.getRuntimeContext(),e,t)}async listTemplates(e,t){return tt(this.getRuntimeContext(),e,t)}async requestTemplateInspection(e,t){return rt(this.getRuntimeContext(),e,t)}}var nt=(e)=>new de(e),ke=()=>{let e={apiKey:Z.readRuntimeEnv("ALIGO_API_KEY")||"",userId:Z.readRuntimeEnv("ALIGO_USER_ID")||"",senderKey:Z.readRuntimeEnv("ALIGO_SENDER_KEY")||"",sender:Z.readRuntimeEnv("ALIGO_SENDER")||"",friendtalkEndpoint:Z.readRuntimeEnv("ALIGO_FRIENDTALK_ENDPOINT"),testMode:Z.readRuntimeEnv("NODE_ENV")!=="production",debug:Z.readRuntimeEnv("NODE_ENV")==="development"};if(!e.apiKey||!e.userId)throw Error("ALIGO_API_KEY and ALIGO_USER_ID are required");return new de(e)};class he{static create(e){return new de(e)}static createDefault(){return ke()}}function it(){}var ot={mock:{},aligo:{apiKey:{type:"string",required:!0,description:"Aligo API key",defaultValue:"env:ALIGO_API_KEY"},userId:{type:"string",required:!0,description:"Aligo user id",defaultValue:"env:ALIGO_USER_ID"},senderKey:{type:"string",description:"Default Kakao sender key",defaultValue:"env:ALIGO_SENDER_KEY"},sender:{type:"string",description:"Default SMS/LMS sender number",defaultValue:"env:ALIGO_SENDER"},testMode:{type:"boolean",description:"Enable Aligo test mode"},debug:{type:"boolean",description:"Enable debug logging"},smsBaseUrl:{type:"string",description:"Override SMS API base URL"},alimtalkBaseUrl:{type:"string",description:"Override AlimTalk API base URL"},friendtalkEndpoint:{type:"string",description:"Override FriendTalk endpoint path"}},iwinv:{apiKey:{type:"string",required:!0,description:"IWINV AlimTalk API key (AUTH header)",defaultValue:"env:IWINV_API_KEY"},smsApiKey:{type:"string",description:"IWINV SMS API key",defaultValue:"env:IWINV_SMS_API_KEY"},smsAuthKey:{type:"string",description:"IWINV SMS auth key",defaultValue:"env:IWINV_SMS_AUTH_KEY"},smsCompanyId:{type:"string",description:"IWINV SMS company id",defaultValue:"env:IWINV_SMS_COMPANY_ID"},senderNumber:{type:"string",description:"Default sender number",defaultValue:"env:IWINV_SENDER_NUMBER"},smsSenderNumber:{type:"string",description:"SMS/LMS sender number override"},sendEndpoint:{type:"string",description:"Override IWINV send endpoint path"},xForwardedFor:{type:"string",description:"X-Forwarded-For header override"},extraHeaders:{type:"stringRecord",description:"Additional HTTP headers"},ipRetryCount:{type:"number",description:"IP-restriction retry count"},ipRetryDelayMs:{type:"number",description:"IP-restriction retry delay in ms"},ipAlertWebhookUrl:{type:"string",description:"Webhook URL for IP restriction alerts"},debug:{type:"boolean",description:"Enable debug logging"}},solapi:{apiKey:{type:"string",required:!0,description:"SOLAPI API key",defaultValue:"env:SOLAPI_API_KEY"},apiSecret:{type:"string",required:!0,description:"SOLAPI API secret",defaultValue:"env:SOLAPI_API_SECRET"},defaultFrom:{type:"string",description:"Default sender number",defaultValue:"env:SOLAPI_DEFAULT_FROM"},kakaoPfId:{type:"string",description:"Default Kakao PF ID",defaultValue:"env:SOLAPI_KAKAO_PF_ID"},rcsBrandId:{type:"string",description:"Default RCS brand id"},naverTalkId:{type:"string",description:"Default Naver Talk id"},appId:{type:"string",description:"SOLAPI app id"},defaultCountry:{type:"string",description:"Default country code"},baseUrl:{type:"string",description:"Override SOLAPI API base URL"},debug:{type:"boolean",description:"Enable debug logging"}}};var g=require("@k-msg/core");function H(e){if(!e)return{};try{return JSON.parse(e)}catch{return e}}function ee(e,t){return w(e)?e:t}var j=require("@k-msg/core");function Vt(e){let t="",r=0;while(r<e.length){let n=e[r++]??0,i=e[r++]??0,o=e[r++]??0,l=n<<16|i<<8|o;t+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[l>>18&63],t+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[l>>12&63],t+=r-2<e.length?"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[l>>6&63]:"=",t+=r-1<e.length?"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[l&63]:"="}return t}function fe(e){return Vt(new TextEncoder().encode(e))}function st(e){let t=e.sendEndpoint||"/api/v2/send/";return t.startsWith("/")?t:`/${t}`}function W(e){let r={AUTH:fe(e.apiKey),"Content-Type":"application/json;charset=UTF-8"};if(typeof e.xForwardedFor==="string"&&e.xForwardedFor.length>0)r["X-Forwarded-For"]=e.xForwardedFor;if(e.extraHeaders&&typeof e.extraHeaders==="object")return{...r,...e.extraHeaders};return r}function x(e){switch(e){case 201:case 206:case 401:case 403:return j.KMsgErrorCode.AUTHENTICATION_FAILED;case 429:return j.KMsgErrorCode.RATE_LIMIT_EXCEEDED;case 519:return j.KMsgErrorCode.INSUFFICIENT_BALANCE;case 404:case 501:return j.KMsgErrorCode.TEMPLATE_NOT_FOUND;case 502:case 503:case 504:case 505:case 506:case 507:case 508:case 509:case 510:case 511:case 512:case 513:case 514:case 515:case 516:case 517:case 540:return j.KMsgErrorCode.INVALID_REQUEST;case 518:return j.KMsgErrorCode.PROVIDER_ERROR;default:if(e>=500)return j.KMsgErrorCode.PROVIDER_ERROR;return j.KMsgErrorCode.INVALID_REQUEST}}function z(e){if(typeof e==="number"&&Number.isFinite(e))return e;if(typeof e==="string"){let t=e.trim();if(t.length===0)return;let r=Number(t);if(Number.isFinite(r))return r}return}function at(e){if(typeof e!=="string")return;let t=e.trim().toUpperCase();if(!t)return;switch(t){case"Y":case"APPROVED":return"Y";case"I":case"INSPECTION":return"I";case"R":case"REJECTED":return"R";case"PENDING":return"I";default:return}}function Ce(e){switch(typeof e==="string"?e.trim().toUpperCase():""){case"Y":return"APPROVED";case"I":return"INSPECTION";case"R":return"REJECTED";default:return"PENDING"}}var dt="https://alimtalk.bizservice.iwinv.kr",lt="https://sms.bizservice.iwinv.kr";var v=require("@k-msg/core");var le=require("@k-msg/core");function Y(e){return e.replace(/[^0-9]/g,"")}function J(){return lt}function te(e){if(e.smsApiKey&&e.smsAuthKey)return fe(`${e.smsApiKey}&${e.smsAuthKey}`);let t=e.smsAuthKey||e.smsApiKey;if(!t)return"";return fe(`${e.apiKey}&${t}`)}function ie(e){return te(e).length>0}function _e(e){if(typeof e==="number"&&Number.isFinite(e))return e.toString();if(typeof e==="string")return e.trim();return""}function De(e,t){return{"0":"전송 성공","1":"메시지가 전송되지 않았습니다.","11":"운영 중인 서비스가 아닙니다.","12":"요금제 충전 중입니다. 잠시 후 다시 시도해 보시기 바랍니다.","13":"등록되지 않은 발신번호입니다.","14":"인증 요청이 올바르지 않습니다.","15":"등록하지 않은 IP에서는 발송되지 않습니다.","21":"장문 메시지는 2000 Bytes까지만 입력이 가능합니다.","22":"제목 입력 가능 문자가 올바르지 않습니다.","23":"제목은 40 Byte까지만 입력이 가능합니다.","31":"파일 업로드는 100KB까지 가능합니다.","32":"허용되지 않는 파일 확장자입니다.","33":"이미지 업로드에 실패했습니다.","41":"수신 번호를 입력하여 주세요.","42":"예약 전송 가능 시간이 아닙니다.","43":"날짜와 시간 표현 형식에 맞춰 입력하여 주십시오.","44":"최대 1000건 전송 가능합니다.","50":"SMS 자동 충전 한도를 초과하였습니다.","202":"SMS API 인증 실패 또는 SMS 서비스 권한이 없습니다.","206":"등록하지 않은 IP에서는 발송되지 않습니다."}[e]||t}function Oe(e,t){if(e==="14"||e==="15"||e==="202"||e==="206")return le.KMsgErrorCode.AUTHENTICATION_FAILED;if(e==="50")return le.KMsgErrorCode.INSUFFICIENT_BALANCE;if(e==="13"||e==="21"||e==="22"||e==="23"||e==="31"||e==="32"||e==="33"||e==="41"||e==="42"||e==="43"||e==="44")return le.KMsgErrorCode.INVALID_REQUEST;if(!t)return le.KMsgErrorCode.NETWORK_ERROR;return le.KMsgErrorCode.PROVIDER_ERROR}function Me(e,t){if(t&&t.trim().length>0)return t.trim();return e.slice(0,20)}function pt(e,t){if(e==="06")return"DELIVERED";if(e==="1000")return"DELIVERED";if(typeof t==="string"){if(t.includes("전송 성공"))return"DELIVERED";if(t.includes("대기")||t.includes("처리중"))return"PENDING"}if(e==="00"||e==="01")return"PENDING";if(!e&&!t)return"UNKNOWN";return"FAILED"}function Pe(e,t){return new Date(e.getTime()+t*24*60*60*1000)}function Le(e){let t=(r)=>r.toString().padStart(2,"0");return`${e.getFullYear()}-${t(e.getMonth()+1)}-${t(e.getDate())}`}function oe(e){if(typeof e!=="string")return;let t=e.trim();if(!t)return;let r=/^(\d{4})-(\d{2})-(\d{2})\s+(\d{2}):(\d{2}):(\d{2})$/.exec(t);if(!r)return;let n=Number(r[1]),i=Number(r[2]),o=Number(r[3]),l=Number(r[4]),d=Number(r[5]),a=Number(r[6]);if(!Number.isFinite(n)||!Number.isFinite(i)||!Number.isFinite(o)||!Number.isFinite(l)||!Number.isFinite(d)||!Number.isFinite(a))return;let s=new Date(n,i-1,o,l,d,a);if(Number.isNaN(s.getTime()))return;return s}function ce(e){let t=(r)=>r.toString().padStart(2,"0");return`${e.getFullYear()}-${t(e.getMonth()+1)}-${t(e.getDate())} ${t(e.getHours())}:${t(e.getMinutes())}:${t(e.getSeconds())}`}function Ke(e){let t=(r)=>r.toString().padStart(2,"0");return`${e.getFullYear()}-${t(e.getMonth()+1)}-${t(e.getDate())} ${t(e.getHours())}:${t(e.getMinutes())}:${t(e.getSeconds())}`}async function ut(e){let{providerId:t,config:r,query:n}=e,i=n.providerMessageId.trim();if(!i)return v.fail(new v.KMsgError(v.KMsgErrorCode.INVALID_REQUEST,"providerMessageId is required",{providerId:t}));let o=Y(n.to);if(!o)return v.fail(new v.KMsgError(v.KMsgErrorCode.INVALID_REQUEST,"to is required",{providerId:t}));let l=Number(i),d=Number.isFinite(l)?l:void 0,a=ce(Pe(n.requestedAt,-1)),s=ce(new Date),p={pageNum:1,pageSize:15,phone:o,startDate:a,endDate:s,...d!==void 0?{seqNo:d}:{},...n.scheduledAt instanceof Date&&!Number.isNaN(n.scheduledAt.getTime())?{reserve:"Y"}:{}},b=`${r.baseUrl}/api/history/`;try{let u=await fetch(b,{method:"POST",headers:W(r),body:JSON.stringify(p)}),S=await u.text(),E=H(S),y=ee(E,{}),R=y.code,k=typeof R==="number"?R:void 0,I=typeof y.message==="string"&&y.message.length>0?y.message:"IWINV history query failed";if(!u.ok||k!==200)return v.fail(new v.KMsgError(x(k??z(E)??u.status),I,{providerId:t,originalCode:R??u.status}));let h=y.list,D=Array.isArray(h)?h:[];if(D.length===0)return v.ok(null);let T=(()=>{if(d===void 0)return D[0];return D.find((_)=>w(_)&&_.seqNo===d)??D[0]})();if(!w(T))return v.ok(null);let M=typeof T.statusCode==="string"?T.statusCode:void 0,P=typeof T.statusCodeName==="string"?T.statusCodeName:void 0,O=oe(T.sendDate),G=oe(T.receiveDate),$=M==="OK"||typeof P==="string"&&P.includes("성공");return v.ok({providerId:t,providerMessageId:i,status:$?"DELIVERED":O?"FAILED":"PENDING",statusCode:M,statusMessage:P,sentAt:O,deliveredAt:$?G||O:void 0,failedAt:!$&&O?O:void 0,raw:T})}catch(u){return v.fail(new v.KMsgError(v.KMsgErrorCode.NETWORK_ERROR,u instanceof Error?u.message:String(u),{providerId:t}))}}async function ft(e){let{providerId:t,config:r,query:n}=e;if(!ie(r))return v.fail(new v.KMsgError(v.KMsgErrorCode.INVALID_REQUEST,"SMS v2 configuration missing (smsApiKey/smsAuthKey)",{providerId:t}));if(!r.smsCompanyId||r.smsCompanyId.length===0)return v.fail(new v.KMsgError(v.KMsgErrorCode.INVALID_REQUEST,"smsCompanyId required for history (config.smsCompanyId)",{providerId:t}));let i=n.providerMessageId.trim();if(!i)return v.fail(new v.KMsgError(v.KMsgErrorCode.INVALID_REQUEST,"providerMessageId is required",{providerId:t}));let o=Y(n.to);if(!o)return v.fail(new v.KMsgError(v.KMsgErrorCode.INVALID_REQUEST,"to is required",{providerId:t}));let l=Pe(n.requestedAt,-1),d=new Date;if(d.getTime()-l.getTime()>7776000000)return v.fail(new v.KMsgError(v.KMsgErrorCode.INVALID_REQUEST,"SMS history date range must be within 90 days",{providerId:t}));let p={version:"1.0",companyid:r.smsCompanyId,startDate:Le(l),endDate:Le(d),requestNo:i,pageNum:1,pageSize:15,phone:o},u={"Content-Type":"application/json;charset=UTF-8",secret:te(r)};if(typeof r.xForwardedFor==="string"&&r.xForwardedFor.length>0)u["X-Forwarded-For"]=r.xForwardedFor;let S=r.extraHeaders&&typeof r.extraHeaders==="object"?{...u,...r.extraHeaders}:u,E=`${J()}/api/history/`;try{let y=await fetch(E,{method:"POST",headers:S,body:JSON.stringify(p)}),R=await y.text(),k=H(R),I=ee(k,{}),h=I.resultCode,D=typeof h==="number"?h:typeof h==="string"?Number(h):NaN,T=typeof I.message==="string"&&I.message.length>0?I.message:"IWINV SMS history query failed";if(!y.ok||D!==0)return v.fail(new v.KMsgError(v.KMsgErrorCode.PROVIDER_ERROR,T,{providerId:t,originalCode:h??y.status}));let M=I.list,P=Array.isArray(M)?M:[];if(P.length===0)return v.ok(null);let O=(()=>{return P.find((re)=>{if(!w(re))return!1;let B=re.requestNo;return B!==void 0&&B!==null?String(B)===i:!1})??P[0]})();if(!w(O))return v.ok(null);let G=typeof O.sendStatusCode==="string"?O.sendStatusCode:void 0,$=typeof O.sendStatusMsg==="string"?O.sendStatusMsg:typeof O.sendStatus==="string"?O.sendStatus:void 0,se=oe(O.sendDate),_=pt(G,$);return v.ok({providerId:t,providerMessageId:i,status:_,statusCode:G,statusMessage:$,sentAt:se,deliveredAt:_==="DELIVERED"?se:void 0,failedAt:_==="FAILED"?se:void 0,raw:O})}catch(y){return v.fail(new v.KMsgError(v.KMsgErrorCode.NETWORK_ERROR,y instanceof Error?y.message:String(y),{providerId:t}))}}var f=require("@k-msg/core");var F=require("@k-msg/core");function ct(e){let t=e.split(/[?#]/,1)[0]??e,r=t.lastIndexOf(".");if(r<=0||r===t.length-1)return"";return t.slice(r).toLowerCase()}function Ve(e){switch(ct(e)){case".jpg":case".jpeg":return"image/jpeg";case".png":return"image/png";case".gif":return"image/gif";case".webp":return"image/webp";default:return}}function gt(e,t){let r=e&&typeof e==="object"?e:{},i=(r.media&&typeof r.media==="object"?r.media:void 0)?.image;if(i&&typeof i==="object"){if(i.bytes instanceof Uint8Array)return F.ok({bytes:i.bytes,filename:typeof i.filename==="string"?i.filename:void 0,contentType:typeof i.contentType==="string"?i.contentType:void 0});if(i.blob instanceof Blob)return F.ok({blob:i.blob,filename:typeof i.filename==="string"?i.filename:void 0,contentType:typeof i.contentType==="string"?i.contentType:void 0});if(typeof i.ref==="string"&&i.ref.trim().length>0)return F.fail(new F.KMsgError(F.KMsgErrorCode.INVALID_REQUEST,"IWINV MMS caller must provide blob/bytes in options.media.image",{providerId:t,field:"media.image.ref"}))}let o=r.imageUrl;if(typeof o==="string"&&o.trim().length>0)return F.fail(new F.KMsgError(F.KMsgErrorCode.INVALID_REQUEST,"IWINV MMS caller must provide blob/bytes in options.media.image",{providerId:t,field:"imageUrl"}));return F.ok(void 0)}async function mt(e){if("blob"in e){let o=e.contentType||e.blob.type||"application/octet-stream",l=e.filename||"image",d=e.contentType&&e.contentType!==e.blob.type?new Blob([await e.blob.arrayBuffer()],{type:o}):e.blob;return{blob:d,filename:l,contentType:o,size:d.size}}let t=e.contentType||"application/octet-stream",r=new Uint8Array(e.bytes.byteLength);r.set(e.bytes);let n=new Blob([r],{type:t}),i=e.filename||"image";return{blob:n,filename:i,contentType:t,size:n.size}}function yt(e){if(ct(e.filename).length>0)return e.filename;let r=Ve(e.filename)==="image/png"?".png":Ve(e.filename)==="image/gif"?".gif":Ve(e.filename)==="image/webp"?".webp":e.contentType==="image/png"?".png":e.contentType==="image/gif"?".gif":e.contentType==="image/webp"?".webp":".jpg";return`${e.filename}${r}`}async function It(e){let{providerId:t,config:r,options:n}=e,i=n.templateId;if(!i||i.length===0)return f.fail(new f.KMsgError(f.KMsgErrorCode.INVALID_REQUEST,"templateId is required for ALIMTALK",{providerId:t}));let o=n.options?.scheduledAt,l=o instanceof Date&&!Number.isNaN(o.getTime()),d=l?"Y":"N",a=l?ce(o):void 0,s=Y(n.to);if(!s)return f.fail(new f.KMsgError(f.KMsgErrorCode.INVALID_REQUEST,"to is required",{providerId:t}));let p=n.providerOptions?.templateParam,b=Array.isArray(p)?p.map((_)=>_===null||_===void 0?"":String(_)):Object.values(n.variables||{}).map((_)=>_===null||_===void 0?"":String(_)),u=n.failover,S=(typeof n.from==="string"&&n.from.length>0?n.from:r.senderNumber||r.smsSenderNumber)||"",E=S?Y(S):"",y=typeof n.providerOptions?.reSend==="string"?n.providerOptions.reSend.trim().toUpperCase():"",R=y==="Y"||y==="N"?y:void 0,k=u?.enabled===!0?"Y":u?.enabled===!1?"N":void 0,I=R??k??(E?"Y":"N"),D=(typeof n.providerOptions?.resendCallback==="string"?Y(n.providerOptions.resendCallback):"")||E;if(I==="Y"&&!D)return f.fail(new f.KMsgError(f.KMsgErrorCode.INVALID_REQUEST,"resendCallback is required when reSend is 'Y' (options.from or providerOptions.resendCallback)",{providerId:t}));let T=typeof n.providerOptions?.resendType==="string"?n.providerOptions.resendType.trim().toUpperCase():"",M=T==="Y"||T==="N"?T:void 0;if(typeof n.providerOptions?.resendType==="string"&&n.providerOptions.resendType.length>0&&!M)return f.fail(new f.KMsgError(f.KMsgErrorCode.INVALID_REQUEST,"resendType must be 'Y' or 'N'",{providerId:t}));let P=u?.fallbackChannel==="lms"?"Y":u?.fallbackChannel==="sms"?"N":void 0,O=typeof n.providerOptions?.resendTitle==="string"&&n.providerOptions.resendTitle.trim().length>0?n.providerOptions.resendTitle.trim():typeof u?.fallbackTitle==="string"&&u.fallbackTitle.trim().length>0?u.fallbackTitle.trim():void 0,G=typeof n.providerOptions?.resendContent==="string"&&n.providerOptions.resendContent.trim().length>0?n.providerOptions.resendContent.trim():typeof u?.fallbackContent==="string"&&u.fallbackContent.trim().length>0?u.fallbackContent.trim():void 0,$={templateCode:i,reserve:d,...a?{sendDate:a}:{},list:[{phone:s,templateParam:b.length>0?b:void 0}],reSend:I,...D?{resendCallback:D}:{},...M??P?{resendType:M??P}:{},...O?{resendTitle:O}:{},...G?{resendContent:G}:{}},se=`${r.baseUrl}${st(r)}`;try{let _=await fetch(se,{method:"POST",headers:W(r),body:JSON.stringify($)}),Re=await _.text(),re=H(Re),B=w(re)?re:{code:z(re)??_.status,message:Re||String(re||"")};if(!_.ok||B.code!==200)return f.fail(new f.KMsgError(x(B.code),B.message||"IWINV send failed",{providerId:t,originalCode:B.code}));return f.ok({messageId:n.messageId||crypto.randomUUID(),providerId:t,providerMessageId:typeof B.seqNo==="number"?String(B.seqNo):void 0,status:l?"PENDING":"SENT",type:n.type,to:n.to,raw:B})}catch(_){return f.fail(new f.KMsgError(f.KMsgErrorCode.NETWORK_ERROR,_ instanceof Error?_.message:String(_),{providerId:t}))}}async function Ft(e){let{providerId:t,config:r,options:n,to:i,from:o,text:l,scheduledAtValid:d,scheduledAt:a}=e;if(n.type!=="MMS")return f.fail(new f.KMsgError(f.KMsgErrorCode.INVALID_REQUEST,"IWINVProvider: MMS handler called with non-MMS options",{providerId:t,type:n.type}));let s=Me(l,n.subject),p=gt(n,t);if(p.isFailure)return p;let b=p.value;if(!b)return f.fail(new f.KMsgError(f.KMsgErrorCode.INVALID_REQUEST,"image is required for MMS; caller must provide options.media.image.blob or bytes",{providerId:t}));let u;try{u=await mt(b)}catch(I){return f.fail(I instanceof f.KMsgError?I:new f.KMsgError(f.KMsgErrorCode.NETWORK_ERROR,I instanceof Error?I.message:String(I),{providerId:t}))}if(u.size>102400)return f.fail(new f.KMsgError(f.KMsgErrorCode.INVALID_REQUEST,"MMS image must be <= 100KB",{providerId:t,bytes:u.size}));let S=new FormData;if(S.append("version","1.0"),S.append("from",o),S.append("to",i),S.append("title",s),S.append("text",l),d&&a)S.append("date",Ke(a));S.append("image",u.blob,yt(u));let y={secret:te(r)};if(typeof r.xForwardedFor==="string"&&r.xForwardedFor.length>0)y["X-Forwarded-For"]=r.xForwardedFor;let R={...y};if(r.extraHeaders&&typeof r.extraHeaders==="object")for(let[I,h]of Object.entries(r.extraHeaders)){if(I.toLowerCase()==="content-type")continue;R[I]=h}let k=`${J()}/api/v2/send/`;try{let I=await fetch(k,{method:"POST",headers:R,body:S}),h=await I.text(),D=H(h),T=w(D)?D:{resultCode:D},M=T.resultCode??T.code,P=_e(M),O=typeof T.message==="string"&&T.message.length>0?T.message:De(P,"MMS send failed");if(!(I.ok&&P==="0"))return f.fail(new f.KMsgError(Oe(P,I.ok),O,{providerId:t,originalCode:M}));let $=typeof T.requestNo==="string"&&T.requestNo.length>0?T.requestNo:typeof T.msgid==="string"&&T.msgid.length>0?T.msgid:void 0;return f.ok({messageId:n.messageId||crypto.randomUUID(),providerId:t,providerMessageId:$,status:d?"PENDING":"SENT",type:n.type,to:n.to,raw:T})}catch(I){return f.fail(new f.KMsgError(f.KMsgErrorCode.NETWORK_ERROR,I instanceof Error?I.message:String(I),{providerId:t}))}}async function St(e){let{providerId:t,config:r,options:n}=e;if(!ie(r))return f.fail(new f.KMsgError(f.KMsgErrorCode.INVALID_REQUEST,"SMS v2 configuration missing (smsApiKey/smsAuthKey)",{providerId:t}));let i=Y(n.to);if(!i)return f.fail(new f.KMsgError(f.KMsgErrorCode.INVALID_REQUEST,"to is required",{providerId:t}));let o=n.text;if(!o||o.trim().length===0)return f.fail(new f.KMsgError(f.KMsgErrorCode.INVALID_REQUEST,"text is required for SMS/LMS/MMS",{providerId:t}));let l=(typeof n.from==="string"&&n.from.length>0?n.from:r.smsSenderNumber||r.senderNumber)||"",d=l?Y(l):"";if(!d)return f.fail(new f.KMsgError(f.KMsgErrorCode.INVALID_REQUEST,"from is required for SMS/LMS/MMS (options.from or config.smsSenderNumber)",{providerId:t}));let a=n.options?.scheduledAt,s=a instanceof Date&&!Number.isNaN(a.getTime());if(n.type==="MMS")return await Ft({providerId:t,config:r,options:n,to:i,from:d,text:o,scheduledAtValid:s,scheduledAt:s?a:void 0});let p={version:"1.0",from:d,to:[i],text:o};if(n.type==="LMS")p.title=Me(o,n.subject);else{let y=typeof n.providerOptions?.msgType==="string"&&n.providerOptions.msgType.trim().length>0?n.providerOptions.msgType.trim():void 0;p.msgType=y||n.type}if(s)p.date=Ke(a);let u={"Content-Type":"application/json;charset=UTF-8",secret:te(r)};if(typeof r.xForwardedFor==="string"&&r.xForwardedFor.length>0)u["X-Forwarded-For"]=r.xForwardedFor;let S=r.extraHeaders&&typeof r.extraHeaders==="object"?{...u,...r.extraHeaders}:u,E=`${J()}/api/v2/send/`;try{let y=await fetch(E,{method:"POST",headers:S,body:JSON.stringify(p)}),R=await y.text(),k=H(R),I=w(k)?k:{resultCode:k},h=I.resultCode??I.code,D=_e(h),T=typeof I.message==="string"&&I.message.length>0?I.message:De(D,"SMS send failed");if(!(y.ok&&D==="0"))return f.fail(new f.KMsgError(Oe(D,y.ok),T,{providerId:t,originalCode:h}));let P=typeof I.requestNo==="string"&&I.requestNo.length>0?I.requestNo:typeof I.msgid==="string"&&I.msgid.length>0?I.msgid:void 0;return f.ok({messageId:n.messageId||crypto.randomUUID(),providerId:t,providerMessageId:P,status:s?"PENDING":"SENT",type:n.type,to:n.to,raw:I})}catch(y){return f.fail(new f.KMsgError(f.KMsgErrorCode.NETWORK_ERROR,y instanceof Error?y.message:String(y),{providerId:t}))}}var c=require("@k-msg/core"),Fe=require("@k-msg/template");async function ge(e){let t=await e.text(),r=H(t);return ee(r,{code:z(r)??e.status,message:t||String(r||"")})}function vt(e,t){return new c.KMsgError(e.code,e.message,{providerId:t,...e.details??{}})}async function bt(e){let{providerId:t,config:r,input:n}=e;if(!n||typeof n!=="object")return c.fail(new c.KMsgError(c.KMsgErrorCode.INVALID_REQUEST,"Template input is required",{providerId:t}));let i=Fe.validateTemplatePayload(n,{requireName:!0,requireContent:!0});if(i.isFailure)return c.fail(vt(i.error,t));let o=`${r.baseUrl}/api/template/add/`,l={templateName:i.value.name??n.name,templateContent:i.value.content??n.content,...i.value.buttons?{buttons:i.value.buttons}:{}};try{let d=await fetch(o,{method:"POST",headers:W(r),body:JSON.stringify(l)}),a=await ge(d),s=z(a.code)??d.status,p=typeof a.message==="string"&&a.message.length>0?a.message:"IWINV template create failed";if(!d.ok||s!==200)return c.fail(new c.KMsgError(x(s),p,{providerId:t,originalCode:s}));let b=a.templateCode,u=typeof b==="string"&&b.trim().length>0?b.trim():"";if(!u)return c.fail(new c.KMsgError(c.KMsgErrorCode.PROVIDER_ERROR,"IWINV template create did not return templateCode",{providerId:t,raw:a}));let S=new Date;return c.ok({id:u,code:u,name:i.value.name??n.name,content:i.value.content??n.content,category:n.category,status:"INSPECTION",buttons:i.value.buttons,variables:n.variables,createdAt:S,updatedAt:S})}catch(d){return c.fail(new c.KMsgError(c.KMsgErrorCode.NETWORK_ERROR,d instanceof Error?d.message:String(d),{providerId:t}))}}async function At(e){let{providerId:t,config:r,code:n,patch:i,ctx:o}=e,l=typeof n==="string"?n.trim():"";if(!l)return c.fail(new c.KMsgError(c.KMsgErrorCode.INVALID_REQUEST,"code is required",{providerId:t}));let d=await Ae({providerId:t,config:r,code:l,ctx:o});if(d.isFailure)return d;let a=d.value,s=typeof i.name==="string"&&i.name.trim().length>0?i.name.trim():a.name,p=typeof i.content==="string"&&i.content.trim().length>0?i.content:a.content,b=i.buttons!==void 0?i.buttons:a.buttons,u=Fe.validateTemplatePayload({name:s,content:p,buttons:b},{requireName:!0,requireContent:!0});if(u.isFailure)return c.fail(vt(u.error,t));let S=`${r.baseUrl}/api/template/modify/`,E={templateCode:l,templateName:u.value.name??s,templateContent:u.value.content??p,...u.value.buttons?{buttons:u.value.buttons}:{}};try{let y=await fetch(S,{method:"POST",headers:W(r),body:JSON.stringify(E)}),R=await ge(y),k=z(R.code)??y.status,I=typeof R.message==="string"&&R.message.length>0?R.message:"IWINV template update failed";if(!y.ok||k!==200)return c.fail(new c.KMsgError(x(k),I,{providerId:t,originalCode:k}));let h=await Ae({providerId:t,config:r,code:l,ctx:o});if(h.isSuccess)return h;return c.ok({...a,name:u.value.name??s,content:u.value.content??p,...i.category!==void 0?{category:i.category}:{},...i.variables!==void 0?{variables:i.variables}:{},...i.buttons!==void 0?{buttons:u.value.buttons}:{},updatedAt:new Date})}catch(y){return c.fail(new c.KMsgError(c.KMsgErrorCode.NETWORK_ERROR,y instanceof Error?y.message:String(y),{providerId:t}))}}async function Rt(e){let{providerId:t,config:r,code:n}=e,i=typeof n==="string"?n.trim():"";if(!i)return c.fail(new c.KMsgError(c.KMsgErrorCode.INVALID_REQUEST,"code is required",{providerId:t}));let o=`${r.baseUrl}/api/template/delete/`,l={templateCode:i};try{let d=await fetch(o,{method:"POST",headers:W(r),body:JSON.stringify(l)}),a=await ge(d),s=z(a.code)??d.status,p=typeof a.message==="string"&&a.message.length>0?a.message:typeof a.messgae==="string"&&a.messgae.length>0?a.messgae:"IWINV template delete failed";if(!d.ok||s!==200)return c.fail(new c.KMsgError(x(s),p,{providerId:t,originalCode:s}));return c.ok(void 0)}catch(d){return c.fail(new c.KMsgError(c.KMsgErrorCode.NETWORK_ERROR,d instanceof Error?d.message:String(d),{providerId:t}))}}async function Ae(e){let{providerId:t,config:r,code:n}=e,i=typeof n==="string"?n.trim():"";if(!i)return c.fail(new c.KMsgError(c.KMsgErrorCode.INVALID_REQUEST,"code is required",{providerId:t}));let o={pageNum:"1",pageSize:"15",templateCode:i},l=`${r.baseUrl}/api/template/`;try{let d=await fetch(l,{method:"POST",headers:W(r),body:JSON.stringify(o)}),a=await ge(d),s=z(a.code)??d.status,p=typeof a.message==="string"&&a.message.length>0?a.message:"IWINV template get failed";if(!d.ok||s!==200)return c.fail(new c.KMsgError(x(s),p,{providerId:t,originalCode:s}));let b=a.list,S=(Array.isArray(b)?b:[]).find(w);if(!S)return c.fail(new c.KMsgError(c.KMsgErrorCode.TEMPLATE_NOT_FOUND,"Template not found",{providerId:t,templateCode:i}));let E=S.templateCode,y=typeof E==="string"?E:String(E??""),R=typeof S.templateName==="string"?S.templateName:"",k=typeof S.templateContent==="string"?S.templateContent:"",I=Ce(S.status),h=oe(S.createDate)??new Date;return c.ok({id:y,code:y,name:R,content:k,status:I,buttons:Array.isArray(S.buttons)?S.buttons:void 0,createdAt:h,updatedAt:h})}catch(d){return c.fail(new c.KMsgError(c.KMsgErrorCode.NETWORK_ERROR,d instanceof Error?d.message:String(d),{providerId:t}))}}async function Nt(e){let{providerId:t,config:r,query:n}=e,i=typeof n?.page==="number"&&n.page>0?Math.floor(n.page):1,o=typeof n?.limit==="number"&&n.limit>0?Math.floor(n.limit):15,l=at(n?.status),d={pageNum:String(i),pageSize:String(o),...l?{templateStatus:l}:{}},a=`${r.baseUrl}/api/template/`;try{let s=await fetch(a,{method:"POST",headers:W(r),body:JSON.stringify(d)}),p=await ge(s),b=z(p.code)??s.status,u=typeof p.message==="string"&&p.message.length>0?p.message:"IWINV template list failed";if(!s.ok||b!==200)return c.fail(new c.KMsgError(x(b),u,{providerId:t,originalCode:b}));let S=p.list,y=(Array.isArray(S)?S:[]).filter(w).map((R)=>{let k=R.templateCode,I=typeof k==="string"?k:String(k??""),h=typeof R.templateName==="string"?R.templateName:"",D=typeof R.templateContent==="string"?R.templateContent:"",T=Ce(R.status),M=oe(R.createDate)??new Date;return{id:I,code:I,name:h,content:D,status:T,buttons:Array.isArray(R.buttons)?R.buttons:void 0,createdAt:M,updatedAt:M}}).filter((R)=>R.code.length>0);return c.ok(y)}catch(s){return c.fail(new c.KMsgError(c.KMsgErrorCode.NETWORK_ERROR,s instanceof Error?s.message:String(s),{providerId:t}))}}class pe{id="iwinv";name="IWINV Messaging Provider";supportedTypes;config;getOnboardingSpec(){let e=X(this.id);if(!e)throw new g.KMsgError(g.KMsgErrorCode.INVALID_REQUEST,`Onboarding spec missing for provider: ${this.id}`,{providerId:this.id});return e}constructor(e){if(!e||typeof e!=="object")throw new g.KMsgError(g.KMsgErrorCode.INVALID_REQUEST,"IWINVProvider requires a config object",{providerId:this.id});if(!e.apiKey||e.apiKey.length===0)throw new g.KMsgError(g.KMsgErrorCode.INVALID_REQUEST,"IWINVProvider requires `apiKey` configuration",{providerId:this.id});this.config={...e,baseUrl:dt,sendEndpoint:e.sendEndpoint||"/api/v2/send/"};let t=["ALIMTALK"];if(ie(this.config))t.push("SMS","LMS","MMS");this.supportedTypes=t}async healthCheck(){let e=Date.now(),t=[];try{try{new URL(this.config.baseUrl)}catch{t.push("Invalid baseUrl")}if(ie(this.config))try{new URL(J())}catch{t.push("Invalid smsBaseUrl")}return{healthy:t.length===0,issues:t,latencyMs:Date.now()-e,data:{provider:this.id,baseUrl:this.config.baseUrl,smsBaseUrl:J()}}}catch(r){return t.push(r instanceof Error?r.message:String(r)),{healthy:!1,issues:t,latencyMs:Date.now()-e}}}async send(e){let t=e.messageId||crypto.randomUUID(),r={...e,messageId:t};switch(r.type){case"ALIMTALK":return It({providerId:this.id,config:this.config,options:r});case"SMS":case"LMS":case"MMS":return St({providerId:this.id,config:this.config,options:r});default:return g.fail(new g.KMsgError(g.KMsgErrorCode.INVALID_REQUEST,`IWINVProvider does not support type ${r.type}`,{providerId:this.id,type:r.type}))}}async getDeliveryStatus(e){switch(e.type){case"ALIMTALK":return ut({providerId:this.id,config:this.config,query:e});case"SMS":case"LMS":case"MMS":return ft({providerId:this.id,config:this.config,query:e});default:return g.fail(new g.KMsgError(g.KMsgErrorCode.INVALID_REQUEST,`IWINVProvider does not support type ${e.type}`,{providerId:this.id,type:e.type}))}}async getBalance(e){let t=e?.channel??"ALIMTALK";switch(t){case"ALIMTALK":return this.getAlimTalkBalance(t);case"SMS":case"LMS":case"MMS":return this.getSmsBalance(t);default:return g.fail(new g.KMsgError(g.KMsgErrorCode.INVALID_REQUEST,`IWINVProvider does not support balance query for type ${t}`,{providerId:this.id,type:t}))}}async getAlimTalkBalance(e){let t=`${this.config.baseUrl}/api/charge/`;try{let r=await fetch(t,{method:"POST",headers:W(this.config),body:JSON.stringify({})}),n=await r.text(),i=H(n),o=ee(i,{}),l=o.code,d=typeof l==="string"?Number(l):void 0,a=typeof l==="number"?l:typeof d==="number"&&Number.isFinite(d)?d:void 0,s=typeof o.message==="string"&&o.message.length>0?o.message:"IWINV AlimTalk charge query failed";if(!r.ok||a!==200)return g.fail(new g.KMsgError(x(a??r.status),s,{providerId:this.id,originalCode:l??r.status}));let p=o.charge,b=typeof p==="number"?p:typeof p==="string"?Number(p):NaN;if(!Number.isFinite(b))return g.fail(new g.KMsgError(g.KMsgErrorCode.PROVIDER_ERROR,"Invalid charge value from IWINV AlimTalk charge API",{providerId:this.id,raw:o}));return g.ok({providerId:this.id,channel:e,amount:b,currency:"KRW",raw:o})}catch(r){return g.fail(new g.KMsgError(g.KMsgErrorCode.NETWORK_ERROR,r instanceof Error?r.message:String(r),{providerId:this.id}))}}async getSmsBalance(e){if(!this.config.smsApiKey||!this.config.smsAuthKey)return g.fail(new g.KMsgError(g.KMsgErrorCode.INVALID_REQUEST,"smsApiKey and smsAuthKey are required for SMS/LMS/MMS balance query",{providerId:this.id}));let r={"Content-Type":"application/json;charset=UTF-8",secret:te(this.config)};if(typeof this.config.xForwardedFor==="string"&&this.config.xForwardedFor.length>0)r["X-Forwarded-For"]=this.config.xForwardedFor;let n=this.config.extraHeaders&&typeof this.config.extraHeaders==="object"?{...r,...this.config.extraHeaders}:r,i=`${J()}/api/charge/`;try{let o=await fetch(i,{method:"POST",headers:n,body:JSON.stringify({version:"1.0"})}),l=await o.text(),d=H(l),a=ee(d,{}),s=a.code??a.resultCode,p=typeof s==="string"?Number(s):void 0,b=typeof s==="number"?s:typeof p==="number"&&Number.isFinite(p)?p:NaN,u=typeof a.message==="string"&&a.message.length>0?a.message:"IWINV SMS charge query failed";if(!o.ok||b!==0)return g.fail(new g.KMsgError(g.KMsgErrorCode.PROVIDER_ERROR,u,{providerId:this.id,originalCode:s??o.status}));let S=a.charge,E=typeof S==="number"?S:typeof S==="string"?Number(S):NaN;if(!Number.isFinite(E))return g.fail(new g.KMsgError(g.KMsgErrorCode.PROVIDER_ERROR,"Invalid charge value from IWINV SMS charge API",{providerId:this.id,raw:a}));return g.ok({providerId:this.id,channel:e,amount:E,currency:"KRW",raw:a})}catch(o){return g.fail(new g.KMsgError(g.KMsgErrorCode.NETWORK_ERROR,o instanceof Error?o.message:String(o),{providerId:this.id}))}}async createTemplate(e,t){return bt({providerId:this.id,config:this.config,input:e})}async updateTemplate(e,t,r){return At({providerId:this.id,config:this.config,code:e,patch:t,ctx:r})}async deleteTemplate(e,t){return Rt({providerId:this.id,config:this.config,code:e})}async getTemplate(e,t){return Ae({providerId:this.id,config:this.config,code:e,ctx:t})}async listTemplates(e,t){return Nt({providerId:this.id,config:this.config,query:e,ctx:t})}}var Tt=(e)=>new pe(e),Ue=()=>{let e={apiKey:g.readRuntimeEnv("IWINV_API_KEY")||"",smsApiKey:g.readRuntimeEnv("IWINV_SMS_API_KEY"),smsAuthKey:g.readRuntimeEnv("IWINV_SMS_AUTH_KEY"),smsCompanyId:g.readRuntimeEnv("IWINV_SMS_COMPANY_ID"),senderNumber:g.readRuntimeEnv("IWINV_SENDER_NUMBER")||g.readRuntimeEnv("IWINV_SMS_SENDER_NUMBER"),smsSenderNumber:g.readRuntimeEnv("IWINV_SMS_SENDER_NUMBER"),sendEndpoint:g.readRuntimeEnv("IWINV_SEND_ENDPOINT")||"/api/v2/send/",xForwardedFor:g.readRuntimeEnv("IWINV_X_FORWARDED_FOR"),debug:g.readRuntimeEnv("NODE_ENV")==="development"};if(!e.apiKey)throw new g.KMsgError(g.KMsgErrorCode.INVALID_REQUEST,"IWINV_API_KEY environment variable is required",{providerId:"iwinv"});return new pe(e)};class qe{static create(e){return new pe(e)}static createDefault(){return Ue()}}function Et(){}var wt={mock:{label:"Mock (local test)",routingSeedTypes:["ALIMTALK","FRIENDTALK","SMS","LMS","MMS","NSA","VOICE","FAX","RCS_SMS","RCS_LMS","RCS_MMS","RCS_TPL","RCS_ITPL","RCS_LTPL"],defaultKakaoSenderKey:"env:MOCK_SENDER_KEY"},aligo:{label:"Aligo",routingSeedTypes:["ALIMTALK","FRIENDTALK","SMS","LMS","MMS"],defaultKakaoSenderKey:"env:ALIGO_SENDER_KEY"},iwinv:{label:"IWINV",routingSeedTypes:["ALIMTALK","SMS","LMS","MMS"]},solapi:{label:"SOLAPI",routingSeedTypes:["ALIMTALK","FRIENDTALK","SMS","LMS","MMS","NSA","VOICE","FAX","RCS_SMS","RCS_LMS","RCS_MMS","RCS_TPL","RCS_ITPL","RCS_LTPL"],defaultKakaoSenderKey:"env:SOLAPI_KAKAO_PF_ID"}};var m=require("@k-msg/core");var kt=(e)=>new Promise((t)=>{setTimeout(t,Math.max(0,Math.floor(e)))}),Ut=(e)=>{if(e===m.KMsgErrorCode.INVALID_REQUEST||e===m.KMsgErrorCode.AUTHENTICATION_FAILED||e===m.KMsgErrorCode.INSUFFICIENT_BALANCE||e===m.KMsgErrorCode.TEMPLATE_NOT_FOUND||e===m.KMsgErrorCode.RATE_LIMIT_EXCEEDED||e===m.KMsgErrorCode.NETWORK_ERROR||e===m.KMsgErrorCode.NETWORK_TIMEOUT||e===m.KMsgErrorCode.NETWORK_SERVICE_UNAVAILABLE||e===m.KMsgErrorCode.PROVIDER_ERROR||e===m.KMsgErrorCode.MESSAGE_SEND_FAILED||e===m.KMsgErrorCode.UNKNOWN_ERROR)return e;return m.KMsgErrorCode.PROVIDER_ERROR};class He{id="mock";name="Mock Provider";supportedTypes=["ALIMTALK","FRIENDTALK","SMS","LMS","MMS","NSA","VOICE","FAX","RCS_SMS","RCS_LMS","RCS_MMS","RCS_TPL","RCS_ITPL","RCS_LTPL"];calls=[];failureCount=0;scenario=[];scenarioCursor=0;templates=new Map;templateSeq=0;channelSeq=0;kakaoChannels=new Map;getOnboardingSpec(){let e=X(this.id);if(!e)throw Error(`Onboarding spec missing for provider: ${this.id}`);return e}constructor(){let e=new Date,t={id:"MOCK_TPL_SEED",code:"MOCK_TPL_SEED",name:"Mock Seed Template",content:"Hello #{name}",status:"APPROVED",createdAt:e,updatedAt:e};this.templates.set(t.code,t);let r={providerId:this.id,senderKey:"mock-sender-seed",plusId:"@mock",name:"Mock Seed Channel",status:"A",createdAt:e,updatedAt:e};this.kakaoChannels.set(r.senderKey,r)}async healthCheck(){return{healthy:!0,issues:[]}}async send(e){this.calls.push(e);let t=this.nextScenarioOutcome();while(t.outcome==="delay")await kt(t.durationMs??0),t=this.nextScenarioOutcome();if(t.outcome==="timeout")return await kt(t.durationMs??0),m.fail(new m.KMsgError(m.KMsgErrorCode.NETWORK_TIMEOUT,t.message??"Mock provider simulated timeout",{provider:this.id},{providerErrorCode:t.providerErrorCode??"TIMEOUT",providerErrorText:t.providerErrorText,httpStatus:t.httpStatus,retryAfterMs:t.retryAfterMs}));if(t.outcome==="failure"){let n=Ut(t.code);return m.fail(new m.KMsgError(n,t.message??"Mock provider simulated failure",{provider:this.id},{providerErrorCode:t.providerErrorCode,providerErrorText:t.providerErrorText,httpStatus:t.httpStatus,retryAfterMs:t.retryAfterMs,causeChain:t.causeChain}))}if(t.outcome!=="success")return m.fail(new m.KMsgError(m.KMsgErrorCode.UNKNOWN_ERROR,`Unsupported mock outcome: ${String(t.outcome)}`,{provider:this.id}));let r={messageId:e.messageId||crypto.randomUUID(),status:"SENT",providerId:this.id,providerMessageId:`mock-${Date.now()}-${Math.random().toString(36).substring(2,11)}`,type:e.type,to:e.to,...e.type==="ALIMTALK"&&e.failover?.enabled===!0?{warnings:[{code:"FAILOVER_UNSUPPORTED_PROVIDER",message:"Mock provider does not support native ALIMTALK failover.",details:{providerId:this.id}}]}:{}};return m.ok(r)}mockSuccess(){this.failureCount=0,this.clearScenario()}mockFailure(e){this.failureCount=e,this.clearScenario()}mockScenario(e){this.scenario=Array.isArray(e)?e.slice():[],this.scenarioCursor=0}clearScenario(){this.scenario=[],this.scenarioCursor=0}nextScenarioOutcome(){if(this.scenarioCursor<this.scenario.length){let e=this.scenario[this.scenarioCursor];return this.scenarioCursor+=1,e}if(this.failureCount>0)return this.failureCount-=1,{outcome:"failure",code:m.KMsgErrorCode.PROVIDER_ERROR,message:"Mock provider simulated failure"};return{outcome:"success"}}getHistory(){return this.calls}clearHistory(){this.calls=[]}async createTemplate(e,t){this.templateSeq+=1;let r=`MOCK_TPL_${this.templateSeq}`,n={id:r,code:r,name:e.name,content:e.content,category:e.category,buttons:e.buttons,variables:e.variables,status:"APPROVED",createdAt:new Date,updatedAt:new Date};return this.templates.set(n.code,n),m.ok(n)}async updateTemplate(e,t,r){let n=this.templates.get(e);if(!n)return m.fail(new m.KMsgError(m.KMsgErrorCode.TEMPLATE_NOT_FOUND,`Template not found: ${e}`));let i={...n,...typeof t.name==="string"?{name:t.name}:{},...typeof t.content==="string"?{content:t.content}:{},...t.category!==void 0?{category:t.category}:{},...t.buttons!==void 0?{buttons:t.buttons}:{},...t.variables!==void 0?{variables:t.variables}:{},updatedAt:new Date};return this.templates.set(e,i),m.ok(i)}async deleteTemplate(e,t){if(!this.templates.has(e))return m.fail(new m.KMsgError(m.KMsgErrorCode.TEMPLATE_NOT_FOUND,`Template not found: ${e}`));return this.templates.delete(e),m.ok(void 0)}async getTemplate(e,t){let r=this.templates.get(e);if(!r)return m.fail(new m.KMsgError(m.KMsgErrorCode.TEMPLATE_NOT_FOUND,`Template not found: ${e}`));return m.ok(r)}async listTemplates(e,t){let r=Array.from(this.templates.values());if(e?.status)r=r.filter((d)=>d.status===e.status);let n=e?.page||1,i=e?.limit||10,o=(n-1)*i,l=o+i;return m.ok(r.slice(o,l))}async requestTemplateInspection(e,t){if(!this.templates.has(e))return m.fail(new m.KMsgError(m.KMsgErrorCode.TEMPLATE_NOT_FOUND,`Template not found: ${e}`));return m.ok(void 0)}async listKakaoChannels(e){let t=Array.from(this.kakaoChannels.values());if(e?.plusId)t=t.filter((r)=>r.plusId===e.plusId);if(e?.senderKey)t=t.filter((r)=>r.senderKey===e.senderKey);return m.ok(t)}async listKakaoChannelCategories(){return m.ok({first:[{code:"001",name:"Mock First"}],second:[{code:"001001",name:"Mock Second",parentCode:"001"}],third:[{code:"001001001",name:"Mock Third",parentCode:"001001"}]})}async requestKakaoChannelAuth(e){if(!e.plusId||!e.phoneNumber)return m.fail(new m.KMsgError(m.KMsgErrorCode.INVALID_REQUEST,"plusId and phoneNumber are required",{providerId:this.id}));return m.ok(void 0)}async addKakaoChannel(e){if(!e.plusId||!e.authNum||!e.phoneNumber||!e.categoryCode)return m.fail(new m.KMsgError(m.KMsgErrorCode.INVALID_REQUEST,"plusId, authNum, phoneNumber, categoryCode are required",{providerId:this.id}));this.channelSeq+=1;let t=`mock-sender-${this.channelSeq}`,r={providerId:this.id,senderKey:t,plusId:e.plusId,name:"Mock Channel",status:"A",createdAt:new Date,updatedAt:new Date};return this.kakaoChannels.set(t,r),m.ok(r)}}
1
+ var{defineProperty:Ne,getOwnPropertyNames:Dt,getOwnPropertyDescriptor:Mt}=Object,Pt=Object.prototype.hasOwnProperty;var We=new WeakMap,Lt=(e)=>{var t=We.get(e),r;if(t)return t;if(t=Ne({},"__esModule",{value:!0}),e&&typeof e==="object"||typeof e==="function")Dt(e).map((n)=>!Pt.call(t,n)&&Ne(t,n,{get:()=>e[n],enumerable:!(r=Mt(e,n))||r.enumerable}));return We.set(e,t),t};var Kt=(e,t)=>{for(var r in t)Ne(e,r,{get:t[r],enumerable:!0,configurable:!0,set:(n)=>t[r]=()=>n})};var Jt={};Kt(Jt,{providerOnboardingSpecs:()=>Re,providerConfigFieldSpecs:()=>lt,providerCliMetadata:()=>_t,listProviderOnboardingSpecs:()=>tt,initializeIWINV:()=>Ct,initializeAligo:()=>dt,getProviderOnboardingSpec:()=>X,createIWINVProvider:()=>ht,createDefaultIWINVProvider:()=>xe,createDefaultAligoProvider:()=>Ce,createAligoProvider:()=>at,MockProvider:()=>Qe,IWINVProviderFactory:()=>Be,IWINVProvider:()=>fe,AligoProviderFactory:()=>_e,AligoProvider:()=>le});module.exports=Lt(Jt);var R=require("@k-msg/core"),ke=require("@k-msg/template/send");function w(e){return typeof e==="object"&&e!==null&&!Array.isArray(e)}var F=require("@k-msg/core");function U(e,t){if(e instanceof F.KMsgError)return e;return new F.KMsgError(F.KMsgErrorCode.PROVIDER_ERROR,e instanceof Error?e.message:String(e),{providerId:t})}function me(e,t){if(e instanceof F.KMsgError)return e;let r=w(e)?e:{},n=r.result_code,i=n!==void 0&&n!==null?String(n):"UNKNOWN",o=typeof r.message==="string"&&r.message.length>0?r.message:typeof r.msg==="string"&&r.msg.length>0?r.msg:e instanceof Error?e.message:"Unknown Aligo error",l=F.KMsgErrorCode.PROVIDER_ERROR;switch(i){case"-100":case"-101":l=F.KMsgErrorCode.AUTHENTICATION_FAILED;break;case"-102":case"-201":l=F.KMsgErrorCode.INSUFFICIENT_BALANCE;break;case"-103":case"-105":l=F.KMsgErrorCode.INVALID_REQUEST;break;case"-501":l=F.KMsgErrorCode.TEMPLATE_NOT_FOUND;break;default:l=F.KMsgErrorCode.PROVIDER_ERROR}return new F.KMsgError(l,`${o} (code: ${i})`,{providerId:t,resultCode:i})}var W=require("@k-msg/core");var ae=require("@k-msg/core");function Ft(e,t){if(!e)return"";return e.replace(/#\{([^}]+)\}/g,(r,n)=>{let i=t[n];return i===void 0||i===null?r:String(i)})}function Ee(e){let t=typeof e.imageUrl==="string"&&e.imageUrl.trim().length>0?e.imageUrl.trim():void 0;if(t)return t;let r=e.media?.image;if(!r)return;if("ref"in r){let n=r.ref.trim();return n.length>0?n:void 0}throw new ae.KMsgError(ae.KMsgErrorCode.INVALID_REQUEST,"Aligo MMS/FriendTalk image requires `options.imageUrl` or `options.media.image.ref` (url/path).",{providerId:e.providerId})}function Ie(e,t){switch(e){case"sendSMS":return"/send/";case"sendAlimTalk":return"/akv10/alimtalk/send/";case"sendFriendTalk":return t.friendtalkEndpoint||"/akv10/friendtalk/send/";default:return"/"}}function Se(e){let t=e.getFullYear(),r=String(e.getMonth()+1).padStart(2,"0"),n=String(e.getDate()).padStart(2,"0"),i=String(e.getHours()).padStart(2,"0"),o=String(e.getMinutes()).padStart(2,"0");return{date:`${t}${r}${n}`,time:`${i}${o}`}}function ze(e){if(typeof e==="number"&&Number.isFinite(e))return e;if(typeof e==="string"){let t=e.trim();if(!t)return;let r=Number(t);if(Number.isFinite(r))return r}return}function ne(e,t){let r=(typeof t?.kakaoChannelSenderKey==="string"&&t.kakaoChannelSenderKey.trim().length>0?t.kakaoChannelSenderKey.trim():e.config.senderKey)||"";if(!r)throw new ae.KMsgError(ae.KMsgErrorCode.INVALID_REQUEST,"kakao channel senderKey is required (ctx.kakaoChannelSenderKey or config.senderKey)",{providerId:e.providerId});return r}function ve(e){switch(typeof e.inspStatus==="string"?e.inspStatus.trim().toUpperCase():""){case"APR":return"APPROVED";case"REJ":return"REJECTED";case"REQ":case"REG":return"INSPECTION";default:return"PENDING"}}function K(e){if(typeof e!=="string")return;let t=e.trim();if(!t)return;let r=/^(\d{4})-(\d{2})-(\d{2})\s+(\d{2}):(\d{2}):(\d{2})$/.exec(t);if(!r)return;let n=Number(r[1]),i=Number(r[2]),o=Number(r[3]),l=Number(r[4]),d=Number(r[5]),a=Number(r[6]),s=new Date(n,i-1,o,l,d,a);return Number.isNaN(s.getTime())?void 0:s}function $e(e,t){if(!e)return"";let r=e._full_text;if(r!==void 0&&r!==null)return String(r);if(!t)return Object.values(e).map(String).join(`
2
+ `);return Ft(t,e)}async function L(e){let t=new FormData;for(let[n,i]of Object.entries(e.data))if(i!==void 0&&i!==null)t.append(n,String(i));let r=await fetch(`${e.host}${e.endpoint}`,{method:"POST",body:t});if(!r.ok)throw new W.KMsgError(W.KMsgErrorCode.NETWORK_ERROR,`HTTP error! status: ${r.status}`,{providerId:e.providerId});return await r.json()}function q(e){let{providerId:t,response:r,fallbackMessage:n}=e,i=r.code,o=ze(i);if(o===0)return W.ok(void 0);let l=typeof r.message==="string"&&r.message.length>0?r.message:n,d=o===509||o===-99?W.KMsgErrorCode.INVALID_REQUEST:W.KMsgErrorCode.PROVIDER_ERROR;return W.fail(new W.KMsgError(d,l,{providerId:t,originalCode:i,raw:r}))}var je=require("@k-msg/template/send");function we(e){if(!Array.isArray(e)||e.length===0)return;let t=JSON.parse(je.ButtonParser.serializeButtons(e));return JSON.stringify({button:t})}function Ye(e,t){return new R.KMsgError(e.code,e.message,{providerId:t,...e.details??{}})}async function Je(e,t,r){try{let n=ne(e,r),i=ke.validateTemplatePayload(t,{requireName:!0,requireContent:!0});if(i.isFailure)return R.fail(Ye(i.error,e.providerId));let o={apikey:e.config.apiKey,userid:e.config.userId,senderkey:n,tpl_name:i.value.name??t.name,tpl_content:i.value.content??t.content},l=we(i.value.buttons);if(l)o.tpl_button=l;let d=await L({host:e.alimtalkHost,endpoint:"/akv10/template/add/",data:o,providerId:e.providerId}),a=q({providerId:e.providerId,response:d,fallbackMessage:"template create failed"});if(a.isFailure)return a;let s=w(d.data)?d.data:{},p=String(s.templtCode??"");if(!p)return R.fail(new R.KMsgError(R.KMsgErrorCode.PROVIDER_ERROR,"template create did not return templtCode",{providerId:e.providerId,raw:d}));let b=K(s.cdate)??new Date,u=K(s.udate)??K(s.cdate)??b;return R.ok({id:p,code:p,name:String(s.templtName??i.value.name??t.name),content:String(s.templtContent??i.value.content??t.content),category:t.category,status:ve(s),buttons:Array.isArray(s.buttons)?s.buttons:i.value.buttons,variables:t.variables,createdAt:b,updatedAt:u})}catch(n){return R.fail(U(n,e.providerId))}}async function be(e,t,r){try{let n=ne(e,r),i=t.trim();if(!i)return R.fail(new R.KMsgError(R.KMsgErrorCode.INVALID_REQUEST,"code is required",{providerId:e.providerId}));let o=await L({host:e.alimtalkHost,endpoint:"/akv10/template/list/",data:{apikey:e.config.apiKey,userid:e.config.userId,senderkey:n,tpl_code:i},providerId:e.providerId}),l=q({providerId:e.providerId,response:o,fallbackMessage:"template get failed"});if(l.isFailure)return l;let d=o.list,s=(Array.isArray(d)?d:[]).find(w);if(!s)return R.fail(new R.KMsgError(R.KMsgErrorCode.TEMPLATE_NOT_FOUND,"Template not found",{providerId:e.providerId,templateCode:i}));let p=String(s.templtCode??i),b=K(s.cdate)??new Date,u=K(s.udate)??K(s.cdate)??b;return R.ok({id:p,code:p,name:String(s.templtName??""),content:String(s.templtContent??""),status:ve(s),buttons:Array.isArray(s.buttons)?s.buttons:void 0,createdAt:b,updatedAt:u})}catch(n){return R.fail(U(n,e.providerId))}}async function Ge(e,t,r,n){try{let i=ne(e,n),o=t.trim();if(!o)return R.fail(new R.KMsgError(R.KMsgErrorCode.INVALID_REQUEST,"code is required",{providerId:e.providerId}));let l=await be(e,o,{kakaoChannelSenderKey:i});if(l.isFailure)return l;let d=l.value,a=typeof r.name==="string"&&r.name.trim().length>0?r.name.trim():d.name,s=typeof r.content==="string"&&r.content.trim().length>0?r.content:d.content,p=ke.validateTemplatePayload({name:a,content:s,buttons:r.buttons!==void 0?r.buttons:d.buttons},{requireName:!0,requireContent:!0});if(p.isFailure)return R.fail(Ye(p.error,e.providerId));let b={apikey:e.config.apiKey,userid:e.config.userId,senderkey:i,tpl_code:o,tpl_name:p.value.name??a,tpl_content:p.value.content??s},u=we(p.value.buttons);if(u)b.tpl_button=u;let S=await L({host:e.alimtalkHost,endpoint:"/akv10/template/modify/",data:b,providerId:e.providerId}),E=q({providerId:e.providerId,response:S,fallbackMessage:"template update failed"});if(E.isFailure)return E;let y=await be(e,o,{kakaoChannelSenderKey:i});if(y.isSuccess)return y;return R.ok({...d,name:p.value.name??a,content:p.value.content??s,...r.category!==void 0?{category:r.category}:{},...r.variables!==void 0?{variables:r.variables}:{},...r.buttons!==void 0?{buttons:p.value.buttons}:{},updatedAt:new Date})}catch(i){return R.fail(U(i,e.providerId))}}async function Xe(e,t,r){try{let n=ne(e,r),i=t.trim();if(!i)return R.fail(new R.KMsgError(R.KMsgErrorCode.INVALID_REQUEST,"code is required",{providerId:e.providerId}));let o=await L({host:e.alimtalkHost,endpoint:"/akv10/template/del/",data:{apikey:e.config.apiKey,userid:e.config.userId,senderkey:n,tpl_code:i},providerId:e.providerId}),l=q({providerId:e.providerId,response:o,fallbackMessage:"template delete failed"});if(l.isFailure)return l;return R.ok(void 0)}catch(n){return R.fail(U(n,e.providerId))}}async function Ze(e,t,r){try{let n=ne(e,r),i=await L({host:e.alimtalkHost,endpoint:"/akv10/template/list/",data:{apikey:e.config.apiKey,userid:e.config.userId,senderkey:n},providerId:e.providerId}),o=q({providerId:e.providerId,response:i,fallbackMessage:"template list failed"});if(o.isFailure)return o;let l=i.list,a=(Array.isArray(l)?l:[]).filter(w).map((s)=>{let p=String(s.templtCode??""),b=K(s.cdate)??new Date,u=K(s.udate)??K(s.cdate)??b;return{id:p,code:p,name:String(s.templtName??""),content:String(s.templtContent??""),status:ve(s),buttons:Array.isArray(s.buttons)?s.buttons:void 0,createdAt:b,updatedAt:u}}).filter((s)=>s.code.length>0);if(t?.status){let s=t.status.trim().toUpperCase();return R.ok(a.filter((p)=>p.status===s))}return R.ok(a)}catch(n){return R.fail(U(n,e.providerId))}}async function et(e,t,r){try{let n=ne(e,r),i=t.trim();if(!i)return R.fail(new R.KMsgError(R.KMsgErrorCode.INVALID_REQUEST,"code is required",{providerId:e.providerId}));let o=await L({host:e.alimtalkHost,endpoint:"/akv10/template/request/",data:{apikey:e.config.apiKey,userid:e.config.userId,senderkey:n,tpl_code:i},providerId:e.providerId}),l=q({providerId:e.providerId,response:o,fallbackMessage:"template inspection request failed"});if(l.isFailure)return l;return R.ok(void 0)}catch(n){return R.fail(U(n,e.providerId))}}var Z=require("@k-msg/core");var Re={iwinv:{providerId:"iwinv",providerName:"IWINV Messaging Provider",channelOnboarding:"manual",templateLifecycleApi:"available",plusIdPolicy:"optional",plusIdInference:"unsupported",liveTestSupport:"supported",checks:[{id:"channel_registered_in_console",title:"Kakao channel is registered in IWINV console",description:"IWINV channel onboarding is manual. Confirm channel registration and approval in console.",kind:"manual",severity:"blocker",scopes:["doctor","preflight"]},{id:"iwinv_config_required",title:"IWINV config has required keys",kind:"config",severity:"blocker",scopes:["doctor","preflight"],configKeys:["apiKey"]},{id:"template_capability_available",title:"Template lifecycle APIs are available",kind:"capability",severity:"warning",scopes:["doctor","preflight"],capabilityMethods:["listTemplates","getTemplate","createTemplate","updateTemplate","deleteTemplate"]},{id:"template_list_probe",title:"Template list API probe",kind:"api_probe",severity:"warning",scopes:["doctor","preflight"],probeOperation:"list_templates"}],notes:["Channel add/auth is not available via IWINV public API in current integration.","Template APIs are available and can be probed."]},aligo:{providerId:"aligo",providerName:"Aligo Smart SMS",channelOnboarding:"api",templateLifecycleApi:"available",plusIdPolicy:"required_if_no_inference",plusIdInference:"supported",liveTestSupport:"supported",checks:[{id:"aligo_config_required",title:"Aligo config has required keys",kind:"config",severity:"blocker",scopes:["doctor","preflight"],configKeys:["apiKey","userId"]},{id:"channel_api_capability_available",title:"Kakao channel APIs are available",kind:"capability",severity:"warning",scopes:["doctor","preflight"],capabilityMethods:["listKakaoChannels","requestKakaoChannelAuth","addKakaoChannel"]},{id:"channel_list_probe",title:"Kakao channel list API probe",kind:"api_probe",severity:"warning",scopes:["doctor","preflight"],probeOperation:"list_kakao_channels"},{id:"template_list_probe",title:"Template list API probe",kind:"api_probe",severity:"warning",scopes:["doctor","preflight"],probeOperation:"list_templates"}]},solapi:{providerId:"solapi",providerName:"SOLAPI Messaging Provider",channelOnboarding:"none",templateLifecycleApi:"unavailable",plusIdPolicy:"required_if_no_inference",plusIdInference:"unsupported",liveTestSupport:"partial",checks:[{id:"solapi_config_required",title:"SOLAPI config has required keys",kind:"config",severity:"blocker",scopes:["doctor","preflight"],configKeys:["apiKey","apiSecret"]}],notes:["SOLAPI ALIMTALK requires kakao profileId/pfId, but plusId inference is not available in current integration."]},mock:{providerId:"mock",providerName:"Mock Provider",channelOnboarding:"api",templateLifecycleApi:"available",plusIdPolicy:"optional",plusIdInference:"supported",liveTestSupport:"none",checks:[{id:"mock_template_capability_available",title:"Mock template APIs are available",kind:"capability",severity:"info",scopes:["doctor","preflight"],capabilityMethods:["listTemplates","getTemplate","createTemplate"]}]}};function X(e){return Re[e]}function tt(){return Object.values(Re)}var C=require("@k-msg/core");async function rt(e,t){try{let r={apikey:e.config.apiKey,userid:e.config.userId,...typeof t?.plusId==="string"&&t.plusId.trim().length>0?{plusid:t.plusId.trim()}:{},...typeof t?.senderKey==="string"&&t.senderKey.trim().length>0?{senderkey:t.senderKey.trim()}:{}},n=await L({host:e.alimtalkHost,endpoint:"/akv10/profile/list/",data:r,providerId:e.providerId}),i=q({providerId:e.providerId,response:n,fallbackMessage:"channel list failed"});if(i.isFailure)return i;let o=n.list,d=(Array.isArray(o)?o:[]).filter(w).map((a)=>({providerId:e.providerId,senderKey:String(a.senderKey??""),plusId:typeof a.uuid==="string"?a.uuid:void 0,name:typeof a.name==="string"?a.name:void 0,status:typeof a.status==="string"?a.status:void 0,createdAt:K(a.cdate),updatedAt:K(a.udate),raw:a})).filter((a)=>a.senderKey.length>0);return C.ok(d)}catch(r){return C.fail(U(r,e.providerId))}}async function nt(e){try{let t=await L({host:e.alimtalkHost,endpoint:"/akv10/category/",data:{apikey:e.config.apiKey,userid:e.config.userId},providerId:e.providerId}),r=q({providerId:e.providerId,response:t,fallbackMessage:"category list failed"});if(r.isFailure)return r;let n=w(t.data)?t.data:{},i=(o)=>{return(Array.isArray(o)?o:[]).filter(w).map((d)=>({code:String(d.code??""),name:String(d.name??""),parentCode:typeof d.parentCode==="string"&&d.parentCode.length>0?d.parentCode:void 0})).filter((d)=>d.code.length>0)};return C.ok({first:i(n.firstBusinessType),second:i(n.secondBusinessType),third:i(n.thirdBusinessType)})}catch(t){return C.fail(U(t,e.providerId))}}async function it(e,t){try{let r=t.plusId.trim(),n=t.phoneNumber.trim();if(!r||!n)return C.fail(new C.KMsgError(C.KMsgErrorCode.INVALID_REQUEST,"plusId and phoneNumber are required",{providerId:e.providerId}));let i=await L({host:e.alimtalkHost,endpoint:"/akv10/profile/auth/",data:{apikey:e.config.apiKey,userid:e.config.userId,plusid:r,phonenumber:n},providerId:e.providerId}),o=q({providerId:e.providerId,response:i,fallbackMessage:"channel auth failed"});if(o.isFailure)return o;return C.ok(void 0)}catch(r){return C.fail(U(r,e.providerId))}}async function ot(e,t){try{let r=t.plusId.trim(),n=t.authNum.trim(),i=t.phoneNumber.trim(),o=t.categoryCode.trim();if(!r||!n||!i||!o)return C.fail(new C.KMsgError(C.KMsgErrorCode.INVALID_REQUEST,"plusId, authNum, phoneNumber, categoryCode are required",{providerId:e.providerId}));let l=await L({host:e.alimtalkHost,endpoint:"/akv10/profile/add/",data:{apikey:e.config.apiKey,userid:e.config.userId,plusid:r,authnum:n,phonenumber:i,categorycode:o},providerId:e.providerId}),d=q({providerId:e.providerId,response:l,fallbackMessage:"channel add failed"});if(d.isFailure)return d;let a=l.data,s=Array.isArray(a)?a.find(w):w(a)?a:void 0;if(!s)return C.fail(new C.KMsgError(C.KMsgErrorCode.PROVIDER_ERROR,"channel add returned empty data",{providerId:e.providerId,raw:l}));let p=String(s.senderKey??"");if(!p)return C.fail(new C.KMsgError(C.KMsgErrorCode.PROVIDER_ERROR,"channel add did not return senderKey",{providerId:e.providerId,raw:s}));return C.ok({providerId:e.providerId,senderKey:p,plusId:typeof s.uuid==="string"?s.uuid:r,name:typeof s.name==="string"?s.name:void 0,status:typeof s.status==="string"?s.status:void 0,createdAt:K(s.cdate),updatedAt:K(s.udate),raw:s})}catch(r){return C.fail(U(r,e.providerId))}}var T=require("@k-msg/core");function Vt(e,t){if(e.type!=="ALIMTALK")return;if(e.failover?.enabled!==!0)return;return[{code:"FAILOVER_PARTIAL_PROVIDER",message:"Aligo failover mapping is partial. API-level fallback may be attempted for non-Kakao-user failures.",details:{providerId:t,mappedFields:["failover","fmessage_1","fsubject_1"],unsupportedFields:["fallbackChannel"]}}]}async function Ut(e,t){let r=t.from||e.config.sender||"";if(!r)return T.fail(new T.KMsgError(T.KMsgErrorCode.INVALID_REQUEST,"from is required for SMS/LMS/MMS (options.from or config.sender)",{providerId:e.providerId}));let n={key:e.config.apiKey,user_id:e.config.userId,sender:r,receiver:t.to,msg:t.text,msg_type:t.type,title:t.subject,testmode_yn:e.config.testMode?"Y":"N"},i=t.options?.scheduledAt;if(i instanceof Date&&!Number.isNaN(i.getTime())){let{date:l,time:d}=Se(i);n.rdate=l,n.rtime=d}if(t.type==="MMS"){let l=Ee({imageUrl:t.imageUrl,media:t.media,providerId:e.providerId});if(!l)return T.fail(new T.KMsgError(T.KMsgErrorCode.INVALID_REQUEST,"image is required for MMS (options.imageUrl or options.media.image.ref)",{providerId:e.providerId}));n.image=l}let o=await L({host:e.smsHost,endpoint:Ie("sendSMS",e.config),data:n,providerId:e.providerId});if(o.result_code!=="1")return T.fail(me(o,e.providerId));return T.ok({messageId:t.messageId||crypto.randomUUID(),providerId:e.providerId,providerMessageId:o.msg_id,status:"PENDING",type:t.type,to:t.to,raw:o})}async function qt(e,t){let r=Vt(t,e.providerId),n=(typeof t.kakao?.profileId==="string"?t.kakao.profileId:e.config.senderKey)||"";if(!n)return T.fail(new T.KMsgError(T.KMsgErrorCode.INVALID_REQUEST,"kakao profileId is required (options.kakao.profileId or config.senderKey)",{providerId:e.providerId}));let i=t.from||e.config.sender||"";if(!i)return T.fail(new T.KMsgError(T.KMsgErrorCode.INVALID_REQUEST,"from is required for ALIMTALK (options.from or config.sender)",{providerId:e.providerId}));let{variables:o,templateId:l}=t;if(!l||l.length===0)return T.fail(new T.KMsgError(T.KMsgErrorCode.INVALID_REQUEST,"templateId is required for ALIMTALK",{providerId:e.providerId}));let d=typeof t.providerOptions?.templateContent==="string"?t.providerOptions.templateContent:void 0,a={apikey:e.config.apiKey,userid:e.config.userId,senderkey:n,tpl_code:l,sender:i,receiver_1:t.to,subject_1:"알림톡",message_1:$e(o,d),testMode:e.config.testMode?"Y":"N"},s=typeof t.providerOptions?.failover==="string"?t.providerOptions.failover.trim().toUpperCase():"",p=s==="Y"||s==="N"?s:void 0,b=t.failover?.enabled===!0?"Y":t.failover?.enabled===!1?"N":void 0,u=p??b,S=typeof t.providerOptions?.fsubject_1==="string"&&t.providerOptions.fsubject_1.trim().length>0?t.providerOptions.fsubject_1.trim():typeof t.failover?.fallbackTitle==="string"&&t.failover.fallbackTitle.trim().length>0?t.failover.fallbackTitle.trim():void 0,E=typeof t.providerOptions?.fmessage_1==="string"&&t.providerOptions.fmessage_1.trim().length>0?t.providerOptions.fmessage_1.trim():typeof t.failover?.fallbackContent==="string"&&t.failover.fallbackContent.trim().length>0?t.failover.fallbackContent.trim():void 0;if(u)a.failover=u;if(S)a.fsubject_1=S;if(E)a.fmessage_1=E;let y=t.options?.scheduledAt;if(y instanceof Date&&!Number.isNaN(y.getTime())){let{date:k,time:I}=Se(y);a.reserve="Y",a.reserve_date=k,a.reserve_time=I}let A=await L({host:e.alimtalkHost,endpoint:Ie("sendAlimTalk",e.config),data:a,providerId:e.providerId});if(A.result_code!=="0")return T.fail(me(A,e.providerId));return T.ok({messageId:t.messageId||crypto.randomUUID(),providerId:e.providerId,providerMessageId:A.msg_id,status:"PENDING",type:t.type,to:t.to,...Array.isArray(r)&&r.length>0?{warnings:r}:{},raw:A})}async function Ht(e,t){let r=(typeof t.kakao?.profileId==="string"?t.kakao.profileId:e.config.senderKey)||"";if(!r)return T.fail(new T.KMsgError(T.KMsgErrorCode.INVALID_REQUEST,"kakao profileId is required (options.kakao.profileId or config.senderKey)",{providerId:e.providerId}));let n=t.from||e.config.sender||"";if(!n)return T.fail(new T.KMsgError(T.KMsgErrorCode.INVALID_REQUEST,"from is required for FRIENDTALK (options.from or config.sender)",{providerId:e.providerId}));let i={apikey:e.config.apiKey,userid:e.config.userId,senderkey:r,sender:n,receiver_1:t.to,subject_1:"친구톡",message_1:t.text,testMode:e.config.testMode?"Y":"N"},o=Ee({imageUrl:t.imageUrl,media:t.media,providerId:e.providerId});if(o)i.image_1=o;let l=Array.isArray(t.kakao?.buttons)?t.kakao.buttons:t.buttons;if(l)i.button_1=JSON.stringify(l);let d=t.options?.scheduledAt;if(d instanceof Date&&!Number.isNaN(d.getTime())){let{date:s,time:p}=Se(d);i.reserve="Y",i.reserve_date=s,i.reserve_time=p}let a=await L({host:e.alimtalkHost,endpoint:Ie("sendFriendTalk",e.config),data:i,providerId:e.providerId});if(a.result_code!=="0")return T.fail(me(a,e.providerId));return T.ok({messageId:t.messageId||crypto.randomUUID(),providerId:e.providerId,providerMessageId:a.msg_id,status:"PENDING",type:t.type,to:t.to,raw:a})}async function st(e,t){try{switch(t.type){case"ALIMTALK":return await qt(e,t);case"FRIENDTALK":return await Ht(e,t);case"SMS":case"LMS":case"MMS":return await Ut(e,t);default:return T.fail(new T.KMsgError(T.KMsgErrorCode.INVALID_REQUEST,`AligoProvider does not support type ${t.type}`,{providerId:e.providerId,type:t.type}))}}catch(r){return T.fail(me(r,e.providerId))}}function he(){return{apiKey:Z.readRuntimeEnv("ALIGO_API_KEY")||"",userId:Z.readRuntimeEnv("ALIGO_USER_ID")||"",senderKey:Z.readRuntimeEnv("ALIGO_SENDER_KEY")||"",sender:Z.readRuntimeEnv("ALIGO_SENDER")||"",friendtalkEndpoint:Z.readRuntimeEnv("ALIGO_FRIENDTALK_ENDPOINT"),testMode:Z.readRuntimeEnv("NODE_ENV")!=="production",debug:Z.readRuntimeEnv("NODE_ENV")==="development"}}class de{id="aligo";name="Aligo Smart SMS";supportedTypes=["ALIMTALK","FRIENDTALK","SMS","LMS","MMS"];config;smsHost;alimtalkHost;getOnboardingSpec(){let e=X(this.id);if(!e)throw Error(`Onboarding spec missing for provider: ${this.id}`);return e}constructor(e){if(!e||typeof e!=="object")throw Error("AligoProvider requires a config object");if(!e.apiKey||e.apiKey.length===0)throw Error("AligoProvider requires `apiKey`");if(!e.userId||e.userId.length===0)throw Error("AligoProvider requires `userId`");this.config=e,this.smsHost=e.smsBaseUrl||"https://apis.aligo.in",this.alimtalkHost=e.alimtalkBaseUrl||"https://kakaoapi.aligo.in"}getRuntimeContext(){return{providerId:this.id,config:this.config,smsHost:this.smsHost,alimtalkHost:this.alimtalkHost}}async healthCheck(){let e=Date.now(),t=[];try{if(!this.config.apiKey)t.push("Missing apiKey");if(!this.config.userId)t.push("Missing userId");if(!this.config.sender)t.push("Missing sender (default from)");try{new URL(this.smsHost)}catch{t.push("Invalid smsBaseUrl")}try{new URL(this.alimtalkHost)}catch{t.push("Invalid alimtalkBaseUrl")}return{healthy:t.length===0,issues:t,latencyMs:Date.now()-e,data:{provider:this.id,smsBaseUrl:this.smsHost,alimtalkBaseUrl:this.alimtalkHost}}}catch(r){return t.push(r instanceof Error?r.message:String(r)),{healthy:!1,issues:t,latencyMs:Date.now()-e}}}async send(e){let t=e.messageId||crypto.randomUUID(),r={...e,messageId:t};return st(this.getRuntimeContext(),r)}async listKakaoChannels(e){return rt(this.getRuntimeContext(),e)}async listKakaoChannelCategories(){return nt(this.getRuntimeContext())}async requestKakaoChannelAuth(e){return it(this.getRuntimeContext(),e)}async addKakaoChannel(e){return ot(this.getRuntimeContext(),e)}}var Nr=(e)=>new de(e),xt=()=>{let e=he();if(!e.apiKey||!e.userId)throw Error("ALIGO_API_KEY and ALIGO_USER_ID are required");return new de(e)};class Bt{static create(e){return new de(e)}static createDefault(){return xt()}}class le extends de{async createTemplate(e,t){return Je(this.getRuntimeContext(),e,t)}async updateTemplate(e,t,r){return Ge(this.getRuntimeContext(),e,t,r)}async deleteTemplate(e,t){return Xe(this.getRuntimeContext(),e,t)}async getTemplate(e,t){return be(this.getRuntimeContext(),e,t)}async listTemplates(e,t){return Ze(this.getRuntimeContext(),e,t)}async requestTemplateInspection(e,t){return et(this.getRuntimeContext(),e,t)}}var at=(e)=>new le(e),Ce=()=>{let e=he();return new le(e)};class _e{static create(e){return new le(e)}static createDefault(){return Ce()}}function dt(){}var lt={mock:{},aligo:{apiKey:{type:"string",required:!0,description:"Aligo API key",defaultValue:"env:ALIGO_API_KEY"},userId:{type:"string",required:!0,description:"Aligo user id",defaultValue:"env:ALIGO_USER_ID"},senderKey:{type:"string",description:"Default Kakao sender key",defaultValue:"env:ALIGO_SENDER_KEY"},sender:{type:"string",description:"Default SMS/LMS sender number",defaultValue:"env:ALIGO_SENDER"},testMode:{type:"boolean",description:"Enable Aligo test mode"},debug:{type:"boolean",description:"Enable debug logging"},smsBaseUrl:{type:"string",description:"Override SMS API base URL"},alimtalkBaseUrl:{type:"string",description:"Override AlimTalk API base URL"},friendtalkEndpoint:{type:"string",description:"Override FriendTalk endpoint path"}},iwinv:{apiKey:{type:"string",required:!0,description:"IWINV AlimTalk API key (AUTH header)",defaultValue:"env:IWINV_API_KEY"},smsApiKey:{type:"string",description:"IWINV SMS API key",defaultValue:"env:IWINV_SMS_API_KEY"},smsAuthKey:{type:"string",description:"IWINV SMS auth key",defaultValue:"env:IWINV_SMS_AUTH_KEY"},smsCompanyId:{type:"string",description:"IWINV SMS company id",defaultValue:"env:IWINV_SMS_COMPANY_ID"},senderNumber:{type:"string",description:"Default sender number",defaultValue:"env:IWINV_SENDER_NUMBER"},smsSenderNumber:{type:"string",description:"SMS/LMS sender number override"},sendEndpoint:{type:"string",description:"Override IWINV send endpoint path"},xForwardedFor:{type:"string",description:"X-Forwarded-For header override"},extraHeaders:{type:"stringRecord",description:"Additional HTTP headers"},ipRetryCount:{type:"number",description:"IP-restriction retry count"},ipRetryDelayMs:{type:"number",description:"IP-restriction retry delay in ms"},ipAlertWebhookUrl:{type:"string",description:"Webhook URL for IP restriction alerts"},debug:{type:"boolean",description:"Enable debug logging"}},solapi:{apiKey:{type:"string",required:!0,description:"SOLAPI API key",defaultValue:"env:SOLAPI_API_KEY"},apiSecret:{type:"string",required:!0,description:"SOLAPI API secret",defaultValue:"env:SOLAPI_API_SECRET"},defaultFrom:{type:"string",description:"Default sender number",defaultValue:"env:SOLAPI_DEFAULT_FROM"},kakaoPfId:{type:"string",description:"Default Kakao PF ID",defaultValue:"env:SOLAPI_KAKAO_PF_ID"},rcsBrandId:{type:"string",description:"Default RCS brand id"},naverTalkId:{type:"string",description:"Default Naver Talk id"},appId:{type:"string",description:"SOLAPI app id"},defaultCountry:{type:"string",description:"Default country code"},baseUrl:{type:"string",description:"Override SOLAPI API base URL"},debug:{type:"boolean",description:"Enable debug logging"}}};var m=require("@k-msg/core"),Le=require("@k-msg/template/send");function H(e){if(!e)return{};try{return JSON.parse(e)}catch{return e}}function ee(e,t){return w(e)?e:t}var j=require("@k-msg/core");function Qt(e){let t="",r=0;while(r<e.length){let n=e[r++]??0,i=e[r++]??0,o=e[r++]??0,l=n<<16|i<<8|o;t+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[l>>18&63],t+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[l>>12&63],t+=r-2<e.length?"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[l>>6&63]:"=",t+=r-1<e.length?"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[l&63]:"="}return t}function ce(e){return Qt(new TextEncoder().encode(e))}function pt(e){let t=e.sendEndpoint||"/api/v2/send/";return t.startsWith("/")?t:`/${t}`}function x(e){let r={AUTH:ce(e.apiKey),"Content-Type":"application/json;charset=UTF-8"};if(typeof e.xForwardedFor==="string"&&e.xForwardedFor.length>0)r["X-Forwarded-For"]=e.xForwardedFor;if(e.extraHeaders&&typeof e.extraHeaders==="object")return{...r,...e.extraHeaders};return r}function B(e){switch(e){case 201:case 206:case 401:case 403:return j.KMsgErrorCode.AUTHENTICATION_FAILED;case 429:return j.KMsgErrorCode.RATE_LIMIT_EXCEEDED;case 519:return j.KMsgErrorCode.INSUFFICIENT_BALANCE;case 404:case 501:return j.KMsgErrorCode.TEMPLATE_NOT_FOUND;case 502:case 503:case 504:case 505:case 506:case 507:case 508:case 509:case 510:case 511:case 512:case 513:case 514:case 515:case 516:case 517:case 540:return j.KMsgErrorCode.INVALID_REQUEST;case 518:return j.KMsgErrorCode.PROVIDER_ERROR;default:if(e>=500)return j.KMsgErrorCode.PROVIDER_ERROR;return j.KMsgErrorCode.INVALID_REQUEST}}function z(e){if(typeof e==="number"&&Number.isFinite(e))return e;if(typeof e==="string"){let t=e.trim();if(t.length===0)return;let r=Number(t);if(Number.isFinite(r))return r}return}function ut(e){if(typeof e!=="string")return;let t=e.trim().toUpperCase();if(!t)return;switch(t){case"Y":case"APPROVED":return"Y";case"I":case"INSPECTION":return"I";case"R":case"REJECTED":return"R";case"PENDING":return"I";default:return}}function Oe(e){switch(typeof e==="string"?e.trim().toUpperCase():""){case"Y":return"APPROVED";case"I":return"INSPECTION";case"R":return"REJECTED";default:return"PENDING"}}function De(e,t){return new Date(e.getTime()+t*24*60*60*1000)}function Me(e){let t=(r)=>r.toString().padStart(2,"0");return`${e.getFullYear()}-${t(e.getMonth()+1)}-${t(e.getDate())}`}function ie(e){if(typeof e!=="string")return;let t=e.trim();if(!t)return;let r=/^(\d{4})-(\d{2})-(\d{2})\s+(\d{2}):(\d{2}):(\d{2})$/.exec(t);if(!r)return;let n=Number(r[1]),i=Number(r[2]),o=Number(r[3]),l=Number(r[4]),d=Number(r[5]),a=Number(r[6]);if(!Number.isFinite(n)||!Number.isFinite(i)||!Number.isFinite(o)||!Number.isFinite(l)||!Number.isFinite(d)||!Number.isFinite(a))return;let s=new Date(n,i-1,o,l,d,a);if(Number.isNaN(s.getTime()))return;return s}function ge(e){let t=(r)=>r.toString().padStart(2,"0");return`${e.getFullYear()}-${t(e.getMonth()+1)}-${t(e.getDate())} ${t(e.getHours())}:${t(e.getMinutes())}:${t(e.getSeconds())}`}function Pe(e){let t=(r)=>r.toString().padStart(2,"0");return`${e.getFullYear()}-${t(e.getMonth()+1)}-${t(e.getDate())} ${t(e.getHours())}:${t(e.getMinutes())}:${t(e.getSeconds())}`}async function ye(e){let t=await e.text(),r=H(t);return ee(r,{code:z(r)??e.status,message:t||String(r||"")})}function ft(e,t){return new m.KMsgError(e.code,e.message,{providerId:t,...e.details??{}})}async function mt(e){let{providerId:t,config:r,input:n}=e;if(!n||typeof n!=="object")return m.fail(new m.KMsgError(m.KMsgErrorCode.INVALID_REQUEST,"Template input is required",{providerId:t}));let i=Le.validateTemplatePayload(n,{requireName:!0,requireContent:!0});if(i.isFailure)return m.fail(ft(i.error,t));let o=`${r.baseUrl}/api/template/add/`,l={templateName:i.value.name??n.name,templateContent:i.value.content??n.content,...i.value.buttons?{buttons:i.value.buttons}:{}};try{let d=await fetch(o,{method:"POST",headers:x(r),body:JSON.stringify(l)}),a=await ye(d),s=z(a.code)??d.status,p=typeof a.message==="string"&&a.message.length>0?a.message:"IWINV template create failed";if(!d.ok||s!==200)return m.fail(new m.KMsgError(B(s),p,{providerId:t,originalCode:s}));let b=a.templateCode,u=typeof b==="string"&&b.trim().length>0?b.trim():"";if(!u)return m.fail(new m.KMsgError(m.KMsgErrorCode.PROVIDER_ERROR,"IWINV template create did not return templateCode",{providerId:t,raw:a}));let S=new Date;return m.ok({id:u,code:u,name:i.value.name??n.name,content:i.value.content??n.content,category:n.category,status:"INSPECTION",buttons:i.value.buttons,variables:n.variables,createdAt:S,updatedAt:S})}catch(d){return m.fail(new m.KMsgError(m.KMsgErrorCode.NETWORK_ERROR,d instanceof Error?d.message:String(d),{providerId:t}))}}async function ct(e){let{providerId:t,config:r,code:n,patch:i,ctx:o}=e,l=typeof n==="string"?n.trim():"";if(!l)return m.fail(new m.KMsgError(m.KMsgErrorCode.INVALID_REQUEST,"code is required",{providerId:t}));let d=await Ae({providerId:t,config:r,code:l,ctx:o});if(d.isFailure)return d;let a=d.value,s=typeof i.name==="string"&&i.name.trim().length>0?i.name.trim():a.name,p=typeof i.content==="string"&&i.content.trim().length>0?i.content:a.content,b=i.buttons!==void 0?i.buttons:a.buttons,u=Le.validateTemplatePayload({name:s,content:p,buttons:b},{requireName:!0,requireContent:!0});if(u.isFailure)return m.fail(ft(u.error,t));let S=`${r.baseUrl}/api/template/modify/`,E={templateCode:l,templateName:u.value.name??s,templateContent:u.value.content??p,...u.value.buttons?{buttons:u.value.buttons}:{}};try{let y=await fetch(S,{method:"POST",headers:x(r),body:JSON.stringify(E)}),A=await ye(y),k=z(A.code)??y.status,I=typeof A.message==="string"&&A.message.length>0?A.message:"IWINV template update failed";if(!y.ok||k!==200)return m.fail(new m.KMsgError(B(k),I,{providerId:t,originalCode:k}));let h=await Ae({providerId:t,config:r,code:l,ctx:o});if(h.isSuccess)return h;return m.ok({...a,name:u.value.name??s,content:u.value.content??p,...i.category!==void 0?{category:i.category}:{},...i.variables!==void 0?{variables:i.variables}:{},...i.buttons!==void 0?{buttons:u.value.buttons}:{},updatedAt:new Date})}catch(y){return m.fail(new m.KMsgError(m.KMsgErrorCode.NETWORK_ERROR,y instanceof Error?y.message:String(y),{providerId:t}))}}async function gt(e){let{providerId:t,config:r,code:n}=e,i=typeof n==="string"?n.trim():"";if(!i)return m.fail(new m.KMsgError(m.KMsgErrorCode.INVALID_REQUEST,"code is required",{providerId:t}));let o=`${r.baseUrl}/api/template/delete/`,l={templateCode:i};try{let d=await fetch(o,{method:"POST",headers:x(r),body:JSON.stringify(l)}),a=await ye(d),s=z(a.code)??d.status,p=typeof a.message==="string"&&a.message.length>0?a.message:typeof a.messgae==="string"&&a.messgae.length>0?a.messgae:"IWINV template delete failed";if(!d.ok||s!==200)return m.fail(new m.KMsgError(B(s),p,{providerId:t,originalCode:s}));return m.ok(void 0)}catch(d){return m.fail(new m.KMsgError(m.KMsgErrorCode.NETWORK_ERROR,d instanceof Error?d.message:String(d),{providerId:t}))}}async function Ae(e){let{providerId:t,config:r,code:n}=e,i=typeof n==="string"?n.trim():"";if(!i)return m.fail(new m.KMsgError(m.KMsgErrorCode.INVALID_REQUEST,"code is required",{providerId:t}));let o={pageNum:"1",pageSize:"15",templateCode:i},l=`${r.baseUrl}/api/template/`;try{let d=await fetch(l,{method:"POST",headers:x(r),body:JSON.stringify(o)}),a=await ye(d),s=z(a.code)??d.status,p=typeof a.message==="string"&&a.message.length>0?a.message:"IWINV template get failed";if(!d.ok||s!==200)return m.fail(new m.KMsgError(B(s),p,{providerId:t,originalCode:s}));let b=a.list,S=(Array.isArray(b)?b:[]).find(w);if(!S)return m.fail(new m.KMsgError(m.KMsgErrorCode.TEMPLATE_NOT_FOUND,"Template not found",{providerId:t,templateCode:i}));let E=S.templateCode,y=typeof E==="string"?E:String(E??""),A=typeof S.templateName==="string"?S.templateName:"",k=typeof S.templateContent==="string"?S.templateContent:"",I=Oe(S.status),h=ie(S.createDate)??new Date;return m.ok({id:y,code:y,name:A,content:k,status:I,buttons:Array.isArray(S.buttons)?S.buttons:void 0,createdAt:h,updatedAt:h})}catch(d){return m.fail(new m.KMsgError(m.KMsgErrorCode.NETWORK_ERROR,d instanceof Error?d.message:String(d),{providerId:t}))}}async function yt(e){let{providerId:t,config:r,query:n}=e,i=typeof n?.page==="number"&&n.page>0?Math.floor(n.page):1,o=typeof n?.limit==="number"&&n.limit>0?Math.floor(n.limit):15,l=ut(n?.status),d={pageNum:String(i),pageSize:String(o),...l?{templateStatus:l}:{}},a=`${r.baseUrl}/api/template/`;try{let s=await fetch(a,{method:"POST",headers:x(r),body:JSON.stringify(d)}),p=await ye(s),b=z(p.code)??s.status,u=typeof p.message==="string"&&p.message.length>0?p.message:"IWINV template list failed";if(!s.ok||b!==200)return m.fail(new m.KMsgError(B(b),u,{providerId:t,originalCode:b}));let S=p.list,y=(Array.isArray(S)?S:[]).filter(w).map((A)=>{let k=A.templateCode,I=typeof k==="string"?k:String(k??""),h=typeof A.templateName==="string"?A.templateName:"",O=typeof A.templateContent==="string"?A.templateContent:"",N=Oe(A.status),M=ie(A.createDate)??new Date;return{id:I,code:I,name:h,content:O,status:N,buttons:Array.isArray(A.buttons)?A.buttons:void 0,createdAt:M,updatedAt:M}}).filter((A)=>A.code.length>0);return m.ok(y)}catch(s){return m.fail(new m.KMsgError(m.KMsgErrorCode.NETWORK_ERROR,s instanceof Error?s.message:String(s),{providerId:t}))}}var c=require("@k-msg/core");var It="https://alimtalk.bizservice.iwinv.kr",St="https://sms.bizservice.iwinv.kr";var v=require("@k-msg/core");var pe=require("@k-msg/core");function Y(e){return e.replace(/[^0-9]/g,"")}function J(){return St}function te(e){if(e.smsApiKey&&e.smsAuthKey)return ce(`${e.smsApiKey}&${e.smsAuthKey}`);let t=e.smsAuthKey||e.smsApiKey;if(!t)return"";return ce(`${e.apiKey}&${t}`)}function oe(e){return te(e).length>0}function Ke(e){if(typeof e==="number"&&Number.isFinite(e))return e.toString();if(typeof e==="string")return e.trim();return""}function Fe(e,t){return{"0":"전송 성공","1":"메시지가 전송되지 않았습니다.","11":"운영 중인 서비스가 아닙니다.","12":"요금제 충전 중입니다. 잠시 후 다시 시도해 보시기 바랍니다.","13":"등록되지 않은 발신번호입니다.","14":"인증 요청이 올바르지 않습니다.","15":"등록하지 않은 IP에서는 발송되지 않습니다.","21":"장문 메시지는 2000 Bytes까지만 입력이 가능합니다.","22":"제목 입력 가능 문자가 올바르지 않습니다.","23":"제목은 40 Byte까지만 입력이 가능합니다.","31":"파일 업로드는 100KB까지 가능합니다.","32":"허용되지 않는 파일 확장자입니다.","33":"이미지 업로드에 실패했습니다.","41":"수신 번호를 입력하여 주세요.","42":"예약 전송 가능 시간이 아닙니다.","43":"날짜와 시간 표현 형식에 맞춰 입력하여 주십시오.","44":"최대 1000건 전송 가능합니다.","50":"SMS 자동 충전 한도를 초과하였습니다.","202":"SMS API 인증 실패 또는 SMS 서비스 권한이 없습니다.","206":"등록하지 않은 IP에서는 발송되지 않습니다."}[e]||t}function Ve(e,t){if(e==="14"||e==="15"||e==="202"||e==="206")return pe.KMsgErrorCode.AUTHENTICATION_FAILED;if(e==="50")return pe.KMsgErrorCode.INSUFFICIENT_BALANCE;if(e==="13"||e==="21"||e==="22"||e==="23"||e==="31"||e==="32"||e==="33"||e==="41"||e==="42"||e==="43"||e==="44")return pe.KMsgErrorCode.INVALID_REQUEST;if(!t)return pe.KMsgErrorCode.NETWORK_ERROR;return pe.KMsgErrorCode.PROVIDER_ERROR}function Ue(e,t){if(t&&t.trim().length>0)return t.trim();return e.slice(0,20)}function vt(e,t){if(e==="06")return"DELIVERED";if(e==="1000")return"DELIVERED";if(typeof t==="string"){if(t.includes("전송 성공"))return"DELIVERED";if(t.includes("대기")||t.includes("처리중"))return"PENDING"}if(e==="00"||e==="01")return"PENDING";if(!e&&!t)return"UNKNOWN";return"FAILED"}async function bt(e){let{providerId:t,config:r,query:n}=e,i=n.providerMessageId.trim();if(!i)return v.fail(new v.KMsgError(v.KMsgErrorCode.INVALID_REQUEST,"providerMessageId is required",{providerId:t}));let o=Y(n.to);if(!o)return v.fail(new v.KMsgError(v.KMsgErrorCode.INVALID_REQUEST,"to is required",{providerId:t}));let l=Number(i),d=Number.isFinite(l)?l:void 0,a=ge(De(n.requestedAt,-1)),s=ge(new Date),p={pageNum:1,pageSize:15,phone:o,startDate:a,endDate:s,...d!==void 0?{seqNo:d}:{},...n.scheduledAt instanceof Date&&!Number.isNaN(n.scheduledAt.getTime())?{reserve:"Y"}:{}},b=`${r.baseUrl}/api/history/`;try{let u=await fetch(b,{method:"POST",headers:x(r),body:JSON.stringify(p)}),S=await u.text(),E=H(S),y=ee(E,{}),A=y.code,k=typeof A==="number"?A:void 0,I=typeof y.message==="string"&&y.message.length>0?y.message:"IWINV history query failed";if(!u.ok||k!==200)return v.fail(new v.KMsgError(B(k??z(E)??u.status),I,{providerId:t,originalCode:A??u.status}));let h=y.list,O=Array.isArray(h)?h:[];if(O.length===0)return v.ok(null);let N=(()=>{if(d===void 0)return O[0];return O.find((_)=>w(_)&&_.seqNo===d)??O[0]})();if(!w(N))return v.ok(null);let M=typeof N.statusCode==="string"?N.statusCode:void 0,P=typeof N.statusCodeName==="string"?N.statusCodeName:void 0,D=ie(N.sendDate),G=ie(N.receiveDate),$=M==="OK"||typeof P==="string"&&P.includes("성공");return v.ok({providerId:t,providerMessageId:i,status:$?"DELIVERED":D?"FAILED":"PENDING",statusCode:M,statusMessage:P,sentAt:D,deliveredAt:$?G||D:void 0,failedAt:!$&&D?D:void 0,raw:N})}catch(u){return v.fail(new v.KMsgError(v.KMsgErrorCode.NETWORK_ERROR,u instanceof Error?u.message:String(u),{providerId:t}))}}async function Rt(e){let{providerId:t,config:r,query:n}=e;if(!oe(r))return v.fail(new v.KMsgError(v.KMsgErrorCode.INVALID_REQUEST,"SMS v2 configuration missing (smsApiKey/smsAuthKey)",{providerId:t}));if(!r.smsCompanyId||r.smsCompanyId.length===0)return v.fail(new v.KMsgError(v.KMsgErrorCode.INVALID_REQUEST,"smsCompanyId required for history (config.smsCompanyId)",{providerId:t}));let i=n.providerMessageId.trim();if(!i)return v.fail(new v.KMsgError(v.KMsgErrorCode.INVALID_REQUEST,"providerMessageId is required",{providerId:t}));let o=Y(n.to);if(!o)return v.fail(new v.KMsgError(v.KMsgErrorCode.INVALID_REQUEST,"to is required",{providerId:t}));let l=De(n.requestedAt,-1),d=new Date;if(d.getTime()-l.getTime()>7776000000)return v.fail(new v.KMsgError(v.KMsgErrorCode.INVALID_REQUEST,"SMS history date range must be within 90 days",{providerId:t}));let p={version:"1.0",companyid:r.smsCompanyId,startDate:Me(l),endDate:Me(d),requestNo:i,pageNum:1,pageSize:15,phone:o},u={"Content-Type":"application/json;charset=UTF-8",secret:te(r)};if(typeof r.xForwardedFor==="string"&&r.xForwardedFor.length>0)u["X-Forwarded-For"]=r.xForwardedFor;let S=r.extraHeaders&&typeof r.extraHeaders==="object"?{...u,...r.extraHeaders}:u,E=`${J()}/api/history/`;try{let y=await fetch(E,{method:"POST",headers:S,body:JSON.stringify(p)}),A=await y.text(),k=H(A),I=ee(k,{}),h=I.resultCode,O=typeof h==="number"?h:typeof h==="string"?Number(h):NaN,N=typeof I.message==="string"&&I.message.length>0?I.message:"IWINV SMS history query failed";if(!y.ok||O!==0)return v.fail(new v.KMsgError(v.KMsgErrorCode.PROVIDER_ERROR,N,{providerId:t,originalCode:h??y.status}));let M=I.list,P=Array.isArray(M)?M:[];if(P.length===0)return v.ok(null);let D=(()=>{return P.find((re)=>{if(!w(re))return!1;let Q=re.requestNo;return Q!==void 0&&Q!==null?String(Q)===i:!1})??P[0]})();if(!w(D))return v.ok(null);let G=typeof D.sendStatusCode==="string"?D.sendStatusCode:void 0,$=typeof D.sendStatusMsg==="string"?D.sendStatusMsg:typeof D.sendStatus==="string"?D.sendStatus:void 0,se=ie(D.sendDate),_=vt(G,$);return v.ok({providerId:t,providerMessageId:i,status:_,statusCode:G,statusMessage:$,sentAt:se,deliveredAt:_==="DELIVERED"?se:void 0,failedAt:_==="FAILED"?se:void 0,raw:D})}catch(y){return v.fail(new v.KMsgError(v.KMsgErrorCode.NETWORK_ERROR,y instanceof Error?y.message:String(y),{providerId:t}))}}var f=require("@k-msg/core");var V=require("@k-msg/core");function At(e){let t=e.split(/[?#]/,1)[0]??e,r=t.lastIndexOf(".");if(r<=0||r===t.length-1)return"";return t.slice(r).toLowerCase()}function qe(e){switch(At(e)){case".jpg":case".jpeg":return"image/jpeg";case".png":return"image/png";case".gif":return"image/gif";case".webp":return"image/webp";default:return}}function Tt(e,t){let r=e&&typeof e==="object"?e:{},i=(r.media&&typeof r.media==="object"?r.media:void 0)?.image;if(i&&typeof i==="object"){if(i.bytes instanceof Uint8Array)return V.ok({bytes:i.bytes,filename:typeof i.filename==="string"?i.filename:void 0,contentType:typeof i.contentType==="string"?i.contentType:void 0});if(i.blob instanceof Blob)return V.ok({blob:i.blob,filename:typeof i.filename==="string"?i.filename:void 0,contentType:typeof i.contentType==="string"?i.contentType:void 0});if(typeof i.ref==="string"&&i.ref.trim().length>0)return V.fail(new V.KMsgError(V.KMsgErrorCode.INVALID_REQUEST,"IWINV MMS caller must provide blob/bytes in options.media.image",{providerId:t,field:"media.image.ref"}))}let o=r.imageUrl;if(typeof o==="string"&&o.trim().length>0)return V.fail(new V.KMsgError(V.KMsgErrorCode.INVALID_REQUEST,"IWINV MMS caller must provide blob/bytes in options.media.image",{providerId:t,field:"imageUrl"}));return V.ok(void 0)}async function Nt(e){if("blob"in e){let o=e.contentType||e.blob.type||"application/octet-stream",l=e.filename||"image",d=e.contentType&&e.contentType!==e.blob.type?new Blob([await e.blob.arrayBuffer()],{type:o}):e.blob;return{blob:d,filename:l,contentType:o,size:d.size}}let t=e.contentType||"application/octet-stream",r=new Uint8Array(e.bytes.byteLength);r.set(e.bytes);let n=new Blob([r],{type:t}),i=e.filename||"image";return{blob:n,filename:i,contentType:t,size:n.size}}function Et(e){if(At(e.filename).length>0)return e.filename;let r=qe(e.filename)==="image/png"?".png":qe(e.filename)==="image/gif"?".gif":qe(e.filename)==="image/webp"?".webp":e.contentType==="image/png"?".png":e.contentType==="image/gif"?".gif":e.contentType==="image/webp"?".webp":".jpg";return`${e.filename}${r}`}async function wt(e){let{providerId:t,config:r,options:n}=e,i=n.templateId;if(!i||i.length===0)return f.fail(new f.KMsgError(f.KMsgErrorCode.INVALID_REQUEST,"templateId is required for ALIMTALK",{providerId:t}));let o=n.options?.scheduledAt,l=o instanceof Date&&!Number.isNaN(o.getTime()),d=l?"Y":"N",a=l?ge(o):void 0,s=Y(n.to);if(!s)return f.fail(new f.KMsgError(f.KMsgErrorCode.INVALID_REQUEST,"to is required",{providerId:t}));let p=n.providerOptions?.templateParam,b=Array.isArray(p)?p.map((_)=>_===null||_===void 0?"":String(_)):Object.values(n.variables||{}).map((_)=>_===null||_===void 0?"":String(_)),u=n.failover,S=(typeof n.from==="string"&&n.from.length>0?n.from:r.senderNumber||r.smsSenderNumber)||"",E=S?Y(S):"",y=typeof n.providerOptions?.reSend==="string"?n.providerOptions.reSend.trim().toUpperCase():"",A=y==="Y"||y==="N"?y:void 0,k=u?.enabled===!0?"Y":u?.enabled===!1?"N":void 0,I=A??k??(E?"Y":"N"),O=(typeof n.providerOptions?.resendCallback==="string"?Y(n.providerOptions.resendCallback):"")||E;if(I==="Y"&&!O)return f.fail(new f.KMsgError(f.KMsgErrorCode.INVALID_REQUEST,"resendCallback is required when reSend is 'Y' (options.from or providerOptions.resendCallback)",{providerId:t}));let N=typeof n.providerOptions?.resendType==="string"?n.providerOptions.resendType.trim().toUpperCase():"",M=N==="Y"||N==="N"?N:void 0;if(typeof n.providerOptions?.resendType==="string"&&n.providerOptions.resendType.length>0&&!M)return f.fail(new f.KMsgError(f.KMsgErrorCode.INVALID_REQUEST,"resendType must be 'Y' or 'N'",{providerId:t}));let P=u?.fallbackChannel==="lms"?"Y":u?.fallbackChannel==="sms"?"N":void 0,D=typeof n.providerOptions?.resendTitle==="string"&&n.providerOptions.resendTitle.trim().length>0?n.providerOptions.resendTitle.trim():typeof u?.fallbackTitle==="string"&&u.fallbackTitle.trim().length>0?u.fallbackTitle.trim():void 0,G=typeof n.providerOptions?.resendContent==="string"&&n.providerOptions.resendContent.trim().length>0?n.providerOptions.resendContent.trim():typeof u?.fallbackContent==="string"&&u.fallbackContent.trim().length>0?u.fallbackContent.trim():void 0,$={templateCode:i,reserve:d,...a?{sendDate:a}:{},list:[{phone:s,templateParam:b.length>0?b:void 0}],reSend:I,...O?{resendCallback:O}:{},...M??P?{resendType:M??P}:{},...D?{resendTitle:D}:{},...G?{resendContent:G}:{}},se=`${r.baseUrl}${pt(r)}`;try{let _=await fetch(se,{method:"POST",headers:x(r),body:JSON.stringify($)}),Te=await _.text(),re=H(Te),Q=w(re)?re:{code:z(re)??_.status,message:Te||String(re||"")};if(!_.ok||Q.code!==200)return f.fail(new f.KMsgError(B(Q.code),Q.message||"IWINV send failed",{providerId:t,originalCode:Q.code}));return f.ok({messageId:n.messageId||crypto.randomUUID(),providerId:t,providerMessageId:typeof Q.seqNo==="number"?String(Q.seqNo):void 0,status:l?"PENDING":"SENT",type:n.type,to:n.to,raw:Q})}catch(_){return f.fail(new f.KMsgError(f.KMsgErrorCode.NETWORK_ERROR,_ instanceof Error?_.message:String(_),{providerId:t}))}}async function Wt(e){let{providerId:t,config:r,options:n,to:i,from:o,text:l,scheduledAtValid:d,scheduledAt:a}=e;if(n.type!=="MMS")return f.fail(new f.KMsgError(f.KMsgErrorCode.INVALID_REQUEST,"IWINVProvider: MMS handler called with non-MMS options",{providerId:t,type:n.type}));let s=Ue(l,n.subject),p=Tt(n,t);if(p.isFailure)return p;let b=p.value;if(!b)return f.fail(new f.KMsgError(f.KMsgErrorCode.INVALID_REQUEST,"image is required for MMS; caller must provide options.media.image.blob or bytes",{providerId:t}));let u;try{u=await Nt(b)}catch(I){return f.fail(I instanceof f.KMsgError?I:new f.KMsgError(f.KMsgErrorCode.NETWORK_ERROR,I instanceof Error?I.message:String(I),{providerId:t}))}if(u.size>102400)return f.fail(new f.KMsgError(f.KMsgErrorCode.INVALID_REQUEST,"MMS image must be <= 100KB",{providerId:t,bytes:u.size}));let S=new FormData;if(S.append("version","1.0"),S.append("from",o),S.append("to",i),S.append("title",s),S.append("text",l),d&&a)S.append("date",Pe(a));S.append("image",u.blob,Et(u));let y={secret:te(r)};if(typeof r.xForwardedFor==="string"&&r.xForwardedFor.length>0)y["X-Forwarded-For"]=r.xForwardedFor;let A={...y};if(r.extraHeaders&&typeof r.extraHeaders==="object")for(let[I,h]of Object.entries(r.extraHeaders)){if(I.toLowerCase()==="content-type")continue;A[I]=h}let k=`${J()}/api/v2/send/`;try{let I=await fetch(k,{method:"POST",headers:A,body:S}),h=await I.text(),O=H(h),N=w(O)?O:{resultCode:O},M=N.resultCode??N.code,P=Ke(M),D=typeof N.message==="string"&&N.message.length>0?N.message:Fe(P,"MMS send failed");if(!(I.ok&&P==="0"))return f.fail(new f.KMsgError(Ve(P,I.ok),D,{providerId:t,originalCode:M}));let $=typeof N.requestNo==="string"&&N.requestNo.length>0?N.requestNo:typeof N.msgid==="string"&&N.msgid.length>0?N.msgid:void 0;return f.ok({messageId:n.messageId||crypto.randomUUID(),providerId:t,providerMessageId:$,status:d?"PENDING":"SENT",type:n.type,to:n.to,raw:N})}catch(I){return f.fail(new f.KMsgError(f.KMsgErrorCode.NETWORK_ERROR,I instanceof Error?I.message:String(I),{providerId:t}))}}async function kt(e){let{providerId:t,config:r,options:n}=e;if(!oe(r))return f.fail(new f.KMsgError(f.KMsgErrorCode.INVALID_REQUEST,"SMS v2 configuration missing (smsApiKey/smsAuthKey)",{providerId:t}));let i=Y(n.to);if(!i)return f.fail(new f.KMsgError(f.KMsgErrorCode.INVALID_REQUEST,"to is required",{providerId:t}));let o=n.text;if(!o||o.trim().length===0)return f.fail(new f.KMsgError(f.KMsgErrorCode.INVALID_REQUEST,"text is required for SMS/LMS/MMS",{providerId:t}));let l=(typeof n.from==="string"&&n.from.length>0?n.from:r.smsSenderNumber||r.senderNumber)||"",d=l?Y(l):"";if(!d)return f.fail(new f.KMsgError(f.KMsgErrorCode.INVALID_REQUEST,"from is required for SMS/LMS/MMS (options.from or config.smsSenderNumber)",{providerId:t}));let a=n.options?.scheduledAt,s=a instanceof Date&&!Number.isNaN(a.getTime());if(n.type==="MMS")return await Wt({providerId:t,config:r,options:n,to:i,from:d,text:o,scheduledAtValid:s,scheduledAt:s?a:void 0});let p={version:"1.0",from:d,to:[i],text:o};if(n.type==="LMS")p.title=Ue(o,n.subject);else{let y=typeof n.providerOptions?.msgType==="string"&&n.providerOptions.msgType.trim().length>0?n.providerOptions.msgType.trim():void 0;p.msgType=y||n.type}if(s)p.date=Pe(a);let u={"Content-Type":"application/json;charset=UTF-8",secret:te(r)};if(typeof r.xForwardedFor==="string"&&r.xForwardedFor.length>0)u["X-Forwarded-For"]=r.xForwardedFor;let S=r.extraHeaders&&typeof r.extraHeaders==="object"?{...u,...r.extraHeaders}:u,E=`${J()}/api/v2/send/`;try{let y=await fetch(E,{method:"POST",headers:S,body:JSON.stringify(p)}),A=await y.text(),k=H(A),I=w(k)?k:{resultCode:k},h=I.resultCode??I.code,O=Ke(h),N=typeof I.message==="string"&&I.message.length>0?I.message:Fe(O,"SMS send failed");if(!(y.ok&&O==="0"))return f.fail(new f.KMsgError(Ve(O,y.ok),N,{providerId:t,originalCode:h}));let P=typeof I.requestNo==="string"&&I.requestNo.length>0?I.requestNo:typeof I.msgid==="string"&&I.msgid.length>0?I.msgid:void 0;return f.ok({messageId:n.messageId||crypto.randomUUID(),providerId:t,providerMessageId:P,status:s?"PENDING":"SENT",type:n.type,to:n.to,raw:I})}catch(y){return f.fail(new f.KMsgError(f.KMsgErrorCode.NETWORK_ERROR,y instanceof Error?y.message:String(y),{providerId:t}))}}function zt(e){return{...e,baseUrl:It,sendEndpoint:e.sendEndpoint||"/api/v2/send/"}}function He(){return{apiKey:c.readRuntimeEnv("IWINV_API_KEY")||"",smsApiKey:c.readRuntimeEnv("IWINV_SMS_API_KEY"),smsAuthKey:c.readRuntimeEnv("IWINV_SMS_AUTH_KEY"),smsCompanyId:c.readRuntimeEnv("IWINV_SMS_COMPANY_ID"),senderNumber:c.readRuntimeEnv("IWINV_SENDER_NUMBER")||c.readRuntimeEnv("IWINV_SMS_SENDER_NUMBER"),smsSenderNumber:c.readRuntimeEnv("IWINV_SMS_SENDER_NUMBER"),sendEndpoint:c.readRuntimeEnv("IWINV_SEND_ENDPOINT")||"/api/v2/send/",xForwardedFor:c.readRuntimeEnv("IWINV_X_FORWARDED_FOR"),debug:c.readRuntimeEnv("NODE_ENV")==="development"}}class ue{id="iwinv";name="IWINV Messaging Provider";supportedTypes;config;getOnboardingSpec(){let e=X(this.id);if(!e)throw new c.KMsgError(c.KMsgErrorCode.INVALID_REQUEST,`Onboarding spec missing for provider: ${this.id}`,{providerId:this.id});return e}constructor(e){if(!e||typeof e!=="object")throw new c.KMsgError(c.KMsgErrorCode.INVALID_REQUEST,"IWINVProvider requires a config object",{providerId:this.id});if(!e.apiKey||e.apiKey.length===0)throw new c.KMsgError(c.KMsgErrorCode.INVALID_REQUEST,"IWINVProvider requires `apiKey` configuration",{providerId:this.id});this.config=zt(e);let t=["ALIMTALK"];if(oe(this.config))t.push("SMS","LMS","MMS");this.supportedTypes=t}async healthCheck(){let e=Date.now(),t=[];try{try{new URL(this.config.baseUrl)}catch{t.push("Invalid baseUrl")}if(oe(this.config))try{new URL(J())}catch{t.push("Invalid smsBaseUrl")}return{healthy:t.length===0,issues:t,latencyMs:Date.now()-e,data:{provider:this.id,baseUrl:this.config.baseUrl,smsBaseUrl:J()}}}catch(r){return t.push(r instanceof Error?r.message:String(r)),{healthy:!1,issues:t,latencyMs:Date.now()-e}}}async send(e){let t=e.messageId||crypto.randomUUID(),r={...e,messageId:t};switch(r.type){case"ALIMTALK":return wt({providerId:this.id,config:this.config,options:r});case"SMS":case"LMS":case"MMS":return kt({providerId:this.id,config:this.config,options:r});default:return c.fail(new c.KMsgError(c.KMsgErrorCode.INVALID_REQUEST,`IWINVProvider does not support type ${r.type}`,{providerId:this.id,type:r.type}))}}async getDeliveryStatus(e){switch(e.type){case"ALIMTALK":return bt({providerId:this.id,config:this.config,query:e});case"SMS":case"LMS":case"MMS":return Rt({providerId:this.id,config:this.config,query:e});default:return c.fail(new c.KMsgError(c.KMsgErrorCode.INVALID_REQUEST,`IWINVProvider does not support type ${e.type}`,{providerId:this.id,type:e.type}))}}async getBalance(e){let t=e?.channel??"ALIMTALK";switch(t){case"ALIMTALK":return this.getAlimTalkBalance(t);case"SMS":case"LMS":case"MMS":return this.getSmsBalance(t);default:return c.fail(new c.KMsgError(c.KMsgErrorCode.INVALID_REQUEST,`IWINVProvider does not support balance query for type ${t}`,{providerId:this.id,type:t}))}}async getAlimTalkBalance(e){let t=`${this.config.baseUrl}/api/charge/`;try{let r=await fetch(t,{method:"POST",headers:x(this.config),body:JSON.stringify({})}),n=await r.text(),i=H(n),o=ee(i,{}),l=o.code,d=typeof l==="string"?Number(l):void 0,a=typeof l==="number"?l:typeof d==="number"&&Number.isFinite(d)?d:void 0,s=typeof o.message==="string"&&o.message.length>0?o.message:"IWINV AlimTalk charge query failed";if(!r.ok||a!==200)return c.fail(new c.KMsgError(B(a??r.status),s,{providerId:this.id,originalCode:l??r.status}));let p=o.charge,b=typeof p==="number"?p:typeof p==="string"?Number(p):NaN;if(!Number.isFinite(b))return c.fail(new c.KMsgError(c.KMsgErrorCode.PROVIDER_ERROR,"Invalid charge value from IWINV AlimTalk charge API",{providerId:this.id,raw:o}));return c.ok({providerId:this.id,channel:e,amount:b,currency:"KRW",raw:o})}catch(r){return c.fail(new c.KMsgError(c.KMsgErrorCode.NETWORK_ERROR,r instanceof Error?r.message:String(r),{providerId:this.id}))}}async getSmsBalance(e){if(!this.config.smsApiKey||!this.config.smsAuthKey)return c.fail(new c.KMsgError(c.KMsgErrorCode.INVALID_REQUEST,"smsApiKey and smsAuthKey are required for SMS/LMS/MMS balance query",{providerId:this.id}));let r={"Content-Type":"application/json;charset=UTF-8",secret:te(this.config)};if(typeof this.config.xForwardedFor==="string"&&this.config.xForwardedFor.length>0)r["X-Forwarded-For"]=this.config.xForwardedFor;let n=this.config.extraHeaders&&typeof this.config.extraHeaders==="object"?{...r,...this.config.extraHeaders}:r,i=`${J()}/api/charge/`;try{let o=await fetch(i,{method:"POST",headers:n,body:JSON.stringify({version:"1.0"})}),l=await o.text(),d=H(l),a=ee(d,{}),s=a.code??a.resultCode,p=typeof s==="string"?Number(s):void 0,b=typeof s==="number"?s:typeof p==="number"&&Number.isFinite(p)?p:NaN,u=typeof a.message==="string"&&a.message.length>0?a.message:"IWINV SMS charge query failed";if(!o.ok||b!==0)return c.fail(new c.KMsgError(c.KMsgErrorCode.PROVIDER_ERROR,u,{providerId:this.id,originalCode:s??o.status}));let S=a.charge,E=typeof S==="number"?S:typeof S==="string"?Number(S):NaN;if(!Number.isFinite(E))return c.fail(new c.KMsgError(c.KMsgErrorCode.PROVIDER_ERROR,"Invalid charge value from IWINV SMS charge API",{providerId:this.id,raw:a}));return c.ok({providerId:this.id,channel:e,amount:E,currency:"KRW",raw:a})}catch(o){return c.fail(new c.KMsgError(c.KMsgErrorCode.NETWORK_ERROR,o instanceof Error?o.message:String(o),{providerId:this.id}))}}}var mn=(e)=>new ue(e),$t=()=>{let e=He();if(!e.apiKey)throw new c.KMsgError(c.KMsgErrorCode.INVALID_REQUEST,"IWINV_API_KEY environment variable is required",{providerId:"iwinv"});return new ue(e)};class jt{static create(e){return new ue(e)}static createDefault(){return $t()}}class fe extends ue{async createTemplate(e,t){return mt({providerId:this.id,config:this.config,input:e})}async updateTemplate(e,t,r){return ct({providerId:this.id,config:this.config,code:e,patch:t,ctx:r})}async deleteTemplate(e,t){return gt({providerId:this.id,config:this.config,code:e})}async getTemplate(e,t){return Ae({providerId:this.id,config:this.config,code:e,ctx:t})}async listTemplates(e,t){return yt({providerId:this.id,config:this.config,query:e,ctx:t})}}var ht=(e)=>new fe(e),xe=()=>{let e=He();return new fe(e)};class Be{static create(e){return new fe(e)}static createDefault(){return xe()}}function Ct(){}var _t={mock:{label:"Mock (local test)",routingSeedTypes:["ALIMTALK","FRIENDTALK","SMS","LMS","MMS","NSA","VOICE","FAX","RCS_SMS","RCS_LMS","RCS_MMS","RCS_TPL","RCS_ITPL","RCS_LTPL"],defaultKakaoSenderKey:"env:MOCK_SENDER_KEY"},aligo:{label:"Aligo",routingSeedTypes:["ALIMTALK","FRIENDTALK","SMS","LMS","MMS"],defaultKakaoSenderKey:"env:ALIGO_SENDER_KEY"},iwinv:{label:"IWINV",routingSeedTypes:["ALIMTALK","SMS","LMS","MMS"]},solapi:{label:"SOLAPI",routingSeedTypes:["ALIMTALK","FRIENDTALK","SMS","LMS","MMS","NSA","VOICE","FAX","RCS_SMS","RCS_LMS","RCS_MMS","RCS_TPL","RCS_ITPL","RCS_LTPL"],defaultKakaoSenderKey:"env:SOLAPI_KAKAO_PF_ID"}};var g=require("@k-msg/core");var Ot=(e)=>new Promise((t)=>{setTimeout(t,Math.max(0,Math.floor(e)))}),Yt=(e)=>{if(e===g.KMsgErrorCode.INVALID_REQUEST||e===g.KMsgErrorCode.AUTHENTICATION_FAILED||e===g.KMsgErrorCode.INSUFFICIENT_BALANCE||e===g.KMsgErrorCode.TEMPLATE_NOT_FOUND||e===g.KMsgErrorCode.RATE_LIMIT_EXCEEDED||e===g.KMsgErrorCode.NETWORK_ERROR||e===g.KMsgErrorCode.NETWORK_TIMEOUT||e===g.KMsgErrorCode.NETWORK_SERVICE_UNAVAILABLE||e===g.KMsgErrorCode.PROVIDER_ERROR||e===g.KMsgErrorCode.MESSAGE_SEND_FAILED||e===g.KMsgErrorCode.UNKNOWN_ERROR)return e;return g.KMsgErrorCode.PROVIDER_ERROR};class Qe{id="mock";name="Mock Provider";supportedTypes=["ALIMTALK","FRIENDTALK","SMS","LMS","MMS","NSA","VOICE","FAX","RCS_SMS","RCS_LMS","RCS_MMS","RCS_TPL","RCS_ITPL","RCS_LTPL"];calls=[];failureCount=0;scenario=[];scenarioCursor=0;templates=new Map;templateSeq=0;channelSeq=0;kakaoChannels=new Map;getOnboardingSpec(){let e=X(this.id);if(!e)throw Error(`Onboarding spec missing for provider: ${this.id}`);return e}constructor(){let e=new Date,t={id:"MOCK_TPL_SEED",code:"MOCK_TPL_SEED",name:"Mock Seed Template",content:"Hello #{name}",status:"APPROVED",createdAt:e,updatedAt:e};this.templates.set(t.code,t);let r={providerId:this.id,senderKey:"mock-sender-seed",plusId:"@mock",name:"Mock Seed Channel",status:"A",createdAt:e,updatedAt:e};this.kakaoChannels.set(r.senderKey,r)}async healthCheck(){return{healthy:!0,issues:[]}}async send(e){this.calls.push(e);let t=this.nextScenarioOutcome();while(t.outcome==="delay")await Ot(t.durationMs??0),t=this.nextScenarioOutcome();if(t.outcome==="timeout")return await Ot(t.durationMs??0),g.fail(new g.KMsgError(g.KMsgErrorCode.NETWORK_TIMEOUT,t.message??"Mock provider simulated timeout",{provider:this.id},{providerErrorCode:t.providerErrorCode??"TIMEOUT",providerErrorText:t.providerErrorText,httpStatus:t.httpStatus,retryAfterMs:t.retryAfterMs}));if(t.outcome==="failure"){let n=Yt(t.code);return g.fail(new g.KMsgError(n,t.message??"Mock provider simulated failure",{provider:this.id},{providerErrorCode:t.providerErrorCode,providerErrorText:t.providerErrorText,httpStatus:t.httpStatus,retryAfterMs:t.retryAfterMs,causeChain:t.causeChain}))}if(t.outcome!=="success")return g.fail(new g.KMsgError(g.KMsgErrorCode.UNKNOWN_ERROR,`Unsupported mock outcome: ${String(t.outcome)}`,{provider:this.id}));let r={messageId:e.messageId||crypto.randomUUID(),status:"SENT",providerId:this.id,providerMessageId:`mock-${Date.now()}-${Math.random().toString(36).substring(2,11)}`,type:e.type,to:e.to,...e.type==="ALIMTALK"&&e.failover?.enabled===!0?{warnings:[{code:"FAILOVER_UNSUPPORTED_PROVIDER",message:"Mock provider does not support native ALIMTALK failover.",details:{providerId:this.id}}]}:{}};return g.ok(r)}mockSuccess(){this.failureCount=0,this.clearScenario()}mockFailure(e){this.failureCount=e,this.clearScenario()}mockScenario(e){this.scenario=Array.isArray(e)?e.slice():[],this.scenarioCursor=0}clearScenario(){this.scenario=[],this.scenarioCursor=0}nextScenarioOutcome(){if(this.scenarioCursor<this.scenario.length){let e=this.scenario[this.scenarioCursor];return this.scenarioCursor+=1,e}if(this.failureCount>0)return this.failureCount-=1,{outcome:"failure",code:g.KMsgErrorCode.PROVIDER_ERROR,message:"Mock provider simulated failure"};return{outcome:"success"}}getHistory(){return this.calls}clearHistory(){this.calls=[]}async createTemplate(e,t){this.templateSeq+=1;let r=`MOCK_TPL_${this.templateSeq}`,n={id:r,code:r,name:e.name,content:e.content,category:e.category,buttons:e.buttons,variables:e.variables,status:"APPROVED",createdAt:new Date,updatedAt:new Date};return this.templates.set(n.code,n),g.ok(n)}async updateTemplate(e,t,r){let n=this.templates.get(e);if(!n)return g.fail(new g.KMsgError(g.KMsgErrorCode.TEMPLATE_NOT_FOUND,`Template not found: ${e}`));let i={...n,...typeof t.name==="string"?{name:t.name}:{},...typeof t.content==="string"?{content:t.content}:{},...t.category!==void 0?{category:t.category}:{},...t.buttons!==void 0?{buttons:t.buttons}:{},...t.variables!==void 0?{variables:t.variables}:{},updatedAt:new Date};return this.templates.set(e,i),g.ok(i)}async deleteTemplate(e,t){if(!this.templates.has(e))return g.fail(new g.KMsgError(g.KMsgErrorCode.TEMPLATE_NOT_FOUND,`Template not found: ${e}`));return this.templates.delete(e),g.ok(void 0)}async getTemplate(e,t){let r=this.templates.get(e);if(!r)return g.fail(new g.KMsgError(g.KMsgErrorCode.TEMPLATE_NOT_FOUND,`Template not found: ${e}`));return g.ok(r)}async listTemplates(e,t){let r=Array.from(this.templates.values());if(e?.status)r=r.filter((d)=>d.status===e.status);let n=e?.page||1,i=e?.limit||10,o=(n-1)*i,l=o+i;return g.ok(r.slice(o,l))}async requestTemplateInspection(e,t){if(!this.templates.has(e))return g.fail(new g.KMsgError(g.KMsgErrorCode.TEMPLATE_NOT_FOUND,`Template not found: ${e}`));return g.ok(void 0)}async listKakaoChannels(e){let t=Array.from(this.kakaoChannels.values());if(e?.plusId)t=t.filter((r)=>r.plusId===e.plusId);if(e?.senderKey)t=t.filter((r)=>r.senderKey===e.senderKey);return g.ok(t)}async listKakaoChannelCategories(){return g.ok({first:[{code:"001",name:"Mock First"}],second:[{code:"001001",name:"Mock Second",parentCode:"001"}],third:[{code:"001001001",name:"Mock Third",parentCode:"001001"}]})}async requestKakaoChannelAuth(e){if(!e.plusId||!e.phoneNumber)return g.fail(new g.KMsgError(g.KMsgErrorCode.INVALID_REQUEST,"plusId and phoneNumber are required",{providerId:this.id}));return g.ok(void 0)}async addKakaoChannel(e){if(!e.plusId||!e.authNum||!e.phoneNumber||!e.categoryCode)return g.fail(new g.KMsgError(g.KMsgErrorCode.INVALID_REQUEST,"plusId, authNum, phoneNumber, categoryCode are required",{providerId:this.id}));this.channelSeq+=1;let t=`mock-sender-${this.channelSeq}`,r={providerId:this.id,senderKey:t,plusId:e.plusId,name:"Mock Channel",status:"A",createdAt:new Date,updatedAt:new Date};return this.kakaoChannels.set(t,r),g.ok(r)}}
3
3
 
4
- //# debugId=9D2074B801C1F2AE64756E2164756E21
4
+ //# debugId=F0C2E561F07737E364756E2164756E21
5
5
  //# sourceMappingURL=index.js.map