@zibby/skills 2.0.24 → 2.0.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/jira.d.ts CHANGED
@@ -111,7 +111,7 @@ export declare function jiraApiCall(cred: any, path: string, opts?: any): {
111
111
  * than replacing one with the other.
112
112
  *
113
113
  * @param {string} path Jira REST path, e.g. `/rest/api/3/issue/PROJ-1`
114
- * @param {{ method?: string, body?: any, headers?: object, signal?: AbortSignal }} [opts]
114
+ * @param {{ method?: string, body?: any, form?: FormData, headers?: object, signal?: AbortSignal }} [opts]
115
115
  * @returns {Promise<any>} parsed JSON response body
116
116
  */
117
117
  export declare function jiraFetch(path: any, opts?: any): Promise<any>;
package/dist/jira.js CHANGED
@@ -1,24 +1,26 @@
1
- import{existsSync as we}from"fs";import{dirname as xe,resolve as Ne}from"path";import{fileURLToPath as Oe}from"url";import{resolveIntegrationToken as Re,clearTokenCache as $e}from"@zibby/core/backend-client.js";var G=Object.freeze({SENTRY:"sentry",JIRA:"jira",GITHUB:"github",GITLAB:"gitlab",SLACK:"slack",LARK:"lark",LARK_DOCS:"lark_docs",OPENAI_BILLING:"openai_billing",ANTHROPIC_BILLING:"anthropic_billing",CURSOR_ADMIN:"cursor_admin",NOTION:"notion",GOOGLE:"google",PLANE:"plane",LINEAR:"linear",VIKUNJA:"vikunja",FIGMA:"figma",HUBSPOT:"hubspot",OPEN_DESIGN:"open_design",LINKEDIN_PERSONAL:"linkedin_personal",LINKEDIN_BUSINESS:"linkedin_business",DISCORD:"discord"}),Be=Object.freeze({sentry:{id:"sentry",name:"Sentry",connectPath:"/integrations?provider=sentry"},jira:{id:"jira",name:"Jira",connectPath:"/integrations?provider=jira"},github:{id:"github",name:"GitHub",connectPath:"/integrations?provider=github"},gitlab:{id:"gitlab",name:"GitLab",connectPath:"/integrations?provider=gitlab"},slack:{id:"slack",name:"Slack",connectPath:"/integrations?provider=slack"},lark:{id:"lark",name:"Lark Chat",connectPath:"/integrations?provider=lark"},lark_docs:{id:"lark_docs",name:"Lark App",connectPath:"/integrations?provider=lark_docs"},openai_billing:{id:"openai_billing",name:"OpenAI Admin",connectPath:"/integrations?provider=openai_billing"},anthropic_billing:{id:"anthropic_billing",name:"Anthropic Admin",connectPath:"/integrations?provider=anthropic_billing"},cursor_admin:{id:"cursor_admin",name:"Cursor Admin",connectPath:"/integrations?provider=cursor_admin"},notion:{id:"notion",name:"Notion",connectPath:"/integrations?provider=notion"},google:{id:"google",name:"Google Docs",connectPath:"/integrations?provider=google"},plane:{id:"plane",name:"Plane",connectPath:"/integrations?provider=plane"},linear:{id:"linear",name:"Linear",connectPath:"/integrations?provider=linear"},vikunja:{id:"vikunja",name:"Vikunja",connectPath:"/integrations?provider=vikunja"},figma:{id:"figma",name:"Figma",connectPath:"/integrations?provider=figma"},hubspot:{id:"hubspot",name:"HubSpot",connectPath:"/integrations?provider=hubspot"},open_design:{id:"open_design",name:"OpenDesign",connectPath:"/integrations?provider=open_design"},linkedin_personal:{id:"linkedin_personal",name:"LinkedIn (Personal)",connectPath:"/integrations?provider=linkedin_personal"},linkedin_business:{id:"linkedin_business",name:"LinkedIn (Business)",connectPath:"/integrations?provider=linkedin_business"},discord:{id:"discord",name:"Discord",connectPath:"/integrations?provider=discord"}});var R={api:{knob:"SKILL_API_TIMEOUT_MS",fallback:3e4},transfer:{knob:"SKILL_TRANSFER_TIMEOUT_MS",fallback:12e4},job:{knob:"SKILL_JOB_TIMEOUT_MS",fallback:3e5}};function oe(s,n,t=process.env){let e=Number(t?.[s]);return Number.isFinite(e)&&e>0?Math.min(6e5,Math.max(1e3,Math.floor(e))):n}function ae(s="api",n=process.env){let t=R[s]||R.api;return oe(t.knob,t.fallback,n)}function P(s){return s?.name==="TimeoutError"||s?.name==="AbortError"}function ce(s){try{return new URL(String(s?.url??s)).host||"unknown host"}catch{return"unknown host"}}function le(s,n){if(!s)return n;let t=new AbortController,e=a=>{t.signal.aborted||t.abort(a)},i=()=>e(s.reason),r=()=>e(n.reason);return t.signal.addEventListener("abort",()=>{s.removeEventListener("abort",i),n.removeEventListener("abort",r)},{once:!0}),s.aborted?e(s.reason):n.aborted?e(n.reason):(s.addEventListener("abort",i,{once:!0}),n.addEventListener("abort",r,{once:!0})),t.signal}async function F(s,n={},t={}){let e=t.kind||"api",i=(R[e]||R.api).knob,r=t.timeoutMs?Math.min(6e5,Math.max(1e3,Math.floor(t.timeoutMs))):ae(e),a=n?.signal;if(a?.aborted)throw a.reason??new DOMException("This operation was aborted","AbortError");let o=AbortSignal.timeout(r),c=le(a,o);try{return await fetch(s,{...n,signal:c})}catch(l){throw o.aborted&&P(l)?new Error(`${t.what||"request"} TIMED OUT after ${r}ms against ${ce(s)} (${i})`):l}}var ue={NOTE:"info",TIP:"success",IMPORTANT:"note",WARNING:"warning",CAUTION:"error"},V={info:"NOTE",success:"TIP",note:"IMPORTANT",warning:"WARNING",error:"CAUTION"},pe=2e5,ee=6,de=/^```([A-Za-z0-9_+.-]{0,32})\s*$/,me=/^(#{1,6})[ \t]+(.*?)\s*$/,fe=/^(?:-{3,}|\*{3,}|_{3,})\s*$/,W=/^>(?: ?(.*))?$/,q=/^[-*][ \t]+\[([ xX])\][ \t]+(.*)$/,z=/^[-*][ \t]+(.*)$/,H=/^(\d{1,3})[.)][ \t]+(.*)$/,Y=/^\|.*\|\s*$/,he=/^\|?\s*:?-{1,}:?\s*(?:\|\s*:?-{1,}:?\s*)*\|?\s*$/,ge=/^\[!(NOTE|TIP|IMPORTANT|WARNING|CAUTION)\]\s*$/i;function Q(s){let n=s.trim().replace(/^\|/,"").replace(/\|$/,""),t=[],e="";for(let i=0;i<n.length;i++){let r=n[i];if(r==="\\"&&n[i+1]==="|"){e+="|",i++;continue}if(r==="|"){t.push(e.trim()),e="";continue}e+=r}return t.push(e.trim()),t}function te(s){let t=String(s??"").slice(0,pe).replace(/\r\n?/g,`
1
+ import{existsSync as Ne}from"fs";import{dirname as Oe,resolve as $e}from"path";import{fileURLToPath as Ee}from"url";import{resolveIntegrationToken as Re,clearTokenCache as Le}from"@zibby/core/backend-client.js";var G=Object.freeze({SENTRY:"sentry",JIRA:"jira",GITHUB:"github",GITLAB:"gitlab",SLACK:"slack",LARK:"lark",LARK_DOCS:"lark_docs",OPENAI_BILLING:"openai_billing",ANTHROPIC_BILLING:"anthropic_billing",CURSOR_ADMIN:"cursor_admin",NOTION:"notion",GOOGLE:"google",PLANE:"plane",LINEAR:"linear",VIKUNJA:"vikunja",FIGMA:"figma",HUBSPOT:"hubspot",OPEN_DESIGN:"open_design",LINKEDIN_PERSONAL:"linkedin_personal",LINKEDIN_BUSINESS:"linkedin_business",DISCORD:"discord"}),De=Object.freeze({sentry:{id:"sentry",name:"Sentry",connectPath:"/integrations?provider=sentry"},jira:{id:"jira",name:"Jira",connectPath:"/integrations?provider=jira"},github:{id:"github",name:"GitHub",connectPath:"/integrations?provider=github"},gitlab:{id:"gitlab",name:"GitLab",connectPath:"/integrations?provider=gitlab"},slack:{id:"slack",name:"Slack",connectPath:"/integrations?provider=slack"},lark:{id:"lark",name:"Lark Chat",connectPath:"/integrations?provider=lark"},lark_docs:{id:"lark_docs",name:"Lark App",connectPath:"/integrations?provider=lark_docs"},openai_billing:{id:"openai_billing",name:"OpenAI Admin",connectPath:"/integrations?provider=openai_billing"},anthropic_billing:{id:"anthropic_billing",name:"Anthropic Admin",connectPath:"/integrations?provider=anthropic_billing"},cursor_admin:{id:"cursor_admin",name:"Cursor Admin",connectPath:"/integrations?provider=cursor_admin"},notion:{id:"notion",name:"Notion",connectPath:"/integrations?provider=notion"},google:{id:"google",name:"Google Docs",connectPath:"/integrations?provider=google"},plane:{id:"plane",name:"Plane",connectPath:"/integrations?provider=plane"},linear:{id:"linear",name:"Linear",connectPath:"/integrations?provider=linear"},vikunja:{id:"vikunja",name:"Vikunja",connectPath:"/integrations?provider=vikunja"},figma:{id:"figma",name:"Figma",connectPath:"/integrations?provider=figma"},hubspot:{id:"hubspot",name:"HubSpot",connectPath:"/integrations?provider=hubspot"},open_design:{id:"open_design",name:"OpenDesign",connectPath:"/integrations?provider=open_design"},linkedin_personal:{id:"linkedin_personal",name:"LinkedIn (Personal)",connectPath:"/integrations?provider=linkedin_personal"},linkedin_business:{id:"linkedin_business",name:"LinkedIn (Business)",connectPath:"/integrations?provider=linkedin_business"},discord:{id:"discord",name:"Discord",connectPath:"/integrations?provider=discord"}});var $={api:{knob:"SKILL_API_TIMEOUT_MS",fallback:3e4},transfer:{knob:"SKILL_TRANSFER_TIMEOUT_MS",fallback:12e4},job:{knob:"SKILL_JOB_TIMEOUT_MS",fallback:3e5}};function ae(s,n,t=process.env){let e=Number(t?.[s]);return Number.isFinite(e)&&e>0?Math.min(6e5,Math.max(1e3,Math.floor(e))):n}function ce(s="api",n=process.env){let t=$[s]||$.api;return ae(t.knob,t.fallback,n)}function P(s){return s?.name==="TimeoutError"||s?.name==="AbortError"}function le(s){try{return new URL(String(s?.url??s)).host||"unknown host"}catch{return"unknown host"}}function ue(s,n){if(!s)return n;let t=new AbortController,e=a=>{t.signal.aborted||t.abort(a)},i=()=>e(s.reason),r=()=>e(n.reason);return t.signal.addEventListener("abort",()=>{s.removeEventListener("abort",i),n.removeEventListener("abort",r)},{once:!0}),s.aborted?e(s.reason):n.aborted?e(n.reason):(s.addEventListener("abort",i,{once:!0}),n.addEventListener("abort",r,{once:!0})),t.signal}async function F(s,n={},t={}){let e=t.kind||"api",i=($[e]||$.api).knob,r=t.timeoutMs?Math.min(6e5,Math.max(1e3,Math.floor(t.timeoutMs))):ce(e),a=n?.signal;if(a?.aborted)throw a.reason??new DOMException("This operation was aborted","AbortError");let o=AbortSignal.timeout(r),c=ue(a,o);try{return await fetch(s,{...n,signal:c})}catch(l){throw o.aborted&&P(l)?new Error(`${t.what||"request"} TIMED OUT after ${r}ms against ${le(s)} (${i})`):l}}var pe={NOTE:"info",TIP:"success",IMPORTANT:"note",WARNING:"warning",CAUTION:"error"},ee={info:"NOTE",success:"TIP",note:"IMPORTANT",warning:"WARNING",error:"CAUTION"},de={info:{bg:"rgba(88, 140, 245, 0.16)",rgb:[88,140,245],icon:"\u2139\uFE0F"},note:{bg:"rgba(160, 120, 240, 0.16)",rgb:[160,120,240],icon:"\u{1F4DD}"},warning:{bg:"rgba(236, 170, 60, 0.15)",rgb:[236,170,60],icon:"\u26A0\uFE0F"},success:{bg:"rgba(70, 190, 125, 0.16)",rgb:[70,190,125],icon:"\u2705"},error:{bg:"rgba(235, 90, 80, 0.15)",rgb:[235,90,80],icon:"\u26D4"}},We=Object.keys(de),fe=2e5,te=6,me=/^```([A-Za-z0-9_+.-]{0,32})\s*$/,ge=/^(#{1,6})[ \t]+(.*?)\s*$/,he=/^(?:-{3,}|\*{3,}|_{3,})\s*$/,W=/^>(?: ?(.*))?$/,K=/^[-*][ \t]+\[([ xX])\][ \t]+(.*)$/,z=/^[-*][ \t]+(.*)$/,H=/^(\d{1,3})[.)][ \t]+(.*)$/,Y=/^\|.*\|\s*$/,ye=/^\|?\s*:?-{1,}:?\s*(?:\|\s*:?-{1,}:?\s*)*\|?\s*$/,ke=/^\[!(NOTE|TIP|IMPORTANT|WARNING|CAUTION)\]\s*$/i;function Q(s){let n=s.trim().replace(/^\|/,"").replace(/\|$/,""),t=[],e="";for(let i=0;i<n.length;i++){let r=n[i];if(r==="\\"&&n[i+1]==="|"){e+="|",i++;continue}if(r==="|"){t.push(e.trim()),e="";continue}e+=r}return t.push(e.trim()),t}function ne(s){let t=String(s??"").slice(0,fe).replace(/\r\n?/g,`
2
2
  `).split(`
3
- `);return C(t,0)}function C(s,n){let t=[],e=0;for(;e<s.length;){let i=s[e];if(i.trim()===""){e++;continue}if(/^[ \t]/.test(i)){t.push({t:"paragraph",c:b(i)}),e++;continue}let r;if(r=de.exec(i)){let a=r[1]||"",o=[];for(e++;e<s.length&&!/^```\s*$/.test(s[e]);)o.push(s[e]),e++;e++,t.push({t:"code",lang:a,v:o.join(`
4
- `)});continue}if(fe.test(i)){t.push({t:"rule"}),e++;continue}if(r=me.exec(i)){let a=Math.min(ee,r[1].length);t.push({t:"heading",level:a,c:b(r[2])}),e++;continue}if(W.test(i)&&n<3){let a=[];for(;e<s.length&&(r=W.exec(s[e]));)a.push(r[1]??""),e++;let o=a.findIndex(l=>l.trim()!==""),c=o>=0?ge.exec(a[o].trim()):null;if(c){let l=ue[c[1].toUpperCase()];t.push({t:"panel",kind:l,c:C(a.slice(o+1),n+1)})}else t.push({t:"quote",c:C(a,n+1)});continue}if(q.test(i)){let a=[];for(;e<s.length&&(r=q.exec(s[e]));)a.push({checked:r[1]!==" ",c:b(r[2])}),e++;t.push({t:"task",items:a});continue}if(z.test(i)){let a=[];for(;e<s.length&&!q.test(s[e])&&(r=z.exec(s[e]));)a.push([{t:"paragraph",c:b(r[1])}]),e++;t.push({t:"bullet",items:a});continue}if(r=H.exec(i)){let a=Math.max(1,parseInt(r[1],10)||1),o=[];for(;e<s.length&&(r=H.exec(s[e]));)o.push([{t:"paragraph",c:b(r[2])}]),e++;t.push({t:"ordered",start:a,items:o});continue}if(Y.test(i)&&e+1<s.length&&he.test(s[e+1])){let a=Q(i).map(b);e+=2;let o=[];for(;e<s.length&&Y.test(s[e]);)o.push(Q(s[e]).map(b)),e++;t.push({t:"table",header:a,rows:o});continue}t.push({t:"paragraph",c:b(i)}),e++}return t}var ye=/^https?:\/\/[^\s<>()[\]]+/,ke=/^\[([^\]\n]{1,300})\]\((https?:\/\/[^\s)]{1,2000})\)/,be=/[.,;:!?'"]+$/;function _e(s,n){return n<=0?!0:/[\s([{"'“‘>:—–-]/.test(s[n-1])}function Ie(s,n){return n>=s.length?!0:/[\s)\]}"'”’.,;:!?—–-]/.test(s[n])}function je(s,n,t){let e=n;for(;e<s.length;){let i=s.indexOf(t,e);if(i<0)return-1;let r=s[i-1],a=s[i+t.length],o=t.length===1&&(r===t||a===t);if(i>n&&r&&!/\s/.test(r)&&!o&&Ie(s,i+t.length))return i;e=i+1}return-1}function b(s){let n=String(s??""),t=[],e="",i=()=>{e&&(t.push({t:"text",v:e}),e="")},r=0;for(;r<n.length;){let a=n[r];if(a==="`"){let o=1;for(;n[r+o]==="`";)o++;let c="`".repeat(o),l=n.indexOf(c,r+o);if(l>r+o-1&&l!==-1){let u=n.slice(r+o,l);if(u.trim()){i(),t.push({t:"code",v:u.length>1&&u.startsWith(" ")&&u.endsWith(" ")?u.slice(1,-1):u}),r=l+o;continue}}e+=c,r+=o;continue}if(a==="["){let o=ke.exec(n.slice(r));if(o){i(),t.push({t:"link",href:o[2],c:b(o[1])}),r+=o[0].length;continue}}if((a==="*"||a==="_"||a==="~")&&_e(n,r)){let o=n[r+1]===a;if(a==="~"&&!o){e+=a,r++;continue}let c=o?a+a:a,l=r+c.length;if(l<n.length&&!/\s/.test(n[l])){let u=je(n,l,c);if(u>l){i();let d=b(n.slice(l,u));t.push(a==="~"?{t:"strike",c:d}:o?{t:"strong",c:d}:{t:"em",c:d}),r=u+c.length;continue}}}if(a==="h"&&(r===0||/[\s(<]/.test(n[r-1]))){let o=ye.exec(n.slice(r));if(o){let c=o[0],l=be.exec(c);if(l&&(c=c.slice(0,-l[0].length)),c.length>8){i(),t.push({t:"link",href:c,c:[{t:"text",v:c}]}),r+=c.length;continue}}}e+=a,r++}return i(),t}function A(s,n=[]){let t=[];for(let e of s)switch(e.t){case"text":e.v&&t.push({type:"text",text:e.v,...n.length?{marks:n}:{}});break;case"br":t.push({type:"hardBreak"});break;case"code":t.push({type:"text",text:e.v,marks:[{type:"code"},...n.filter(i=>i.type==="link")]});break;case"strong":t.push(...A(e.c,$(n,{type:"strong"})));break;case"em":t.push(...A(e.c,$(n,{type:"em"})));break;case"strike":t.push(...A(e.c,$(n,{type:"strike"})));break;case"link":t.push(...A(e.c,$(n,{type:"link",attrs:{href:e.href}})));break}return t}function $(s,n){return s.some(t=>t.type===n.type)?s:[...s,n]}var K=0;function X(){return K=(K+1)%1e6,`m${Date.now().toString(36)}-${K}`}var w=s=>{let n=A(s);return n.length?{type:"paragraph",content:n}:{type:"paragraph"}};function T(s,n){let t=[];for(let e of s)switch(e.t){case"paragraph":t.push(w(e.c));break;case"heading":if(n==="quote"||n==="item")t.push(w([{t:"strong",c:e.c}]));else{let i=A(e.c);i.length&&t.push({type:"heading",attrs:{level:e.level},content:i})}break;case"bullet":t.push({type:"bulletList",content:e.items.map(i=>({type:"listItem",content:E(T(i,"item"))}))});break;case"ordered":t.push({type:"orderedList",attrs:{order:e.start},content:e.items.map(i=>({type:"listItem",content:E(T(i,"item"))}))});break;case"task":n==="quote"||n==="item"?t.push({type:"bulletList",content:e.items.map(i=>({type:"listItem",content:[w([{t:"text",v:i.checked?"\u2611 ":"\u2610 "},...i.c])]}))}):t.push({type:"taskList",attrs:{localId:X()},content:e.items.map(i=>({type:"taskItem",attrs:{localId:X(),state:i.checked?"DONE":"TODO"},content:ve(A(i.c))}))});break;case"code":t.push({type:"codeBlock",attrs:e.lang?{language:e.lang}:{},...e.v?{content:[{type:"text",text:e.v}]}:{}});break;case"quote":n==="quote"||n==="item"?t.push(...T(e.c,n)):t.push({type:"blockquote",content:E(T(e.c,"quote"))});break;case"panel":n!=="doc"?t.push(...T(e.c,n)):t.push({type:"panel",attrs:{panelType:e.kind},content:E(T(e.c,"panel"))});break;case"rule":if(n==="quote"||n==="item")break;t.push({type:"rule"});break;case"table":{if(n!=="doc"){for(let r of[...e.header?[e.header]:[],...e.rows])t.push(w(Se(r)));break}let i=[];e.header&&i.push({type:"tableRow",content:e.header.map(r=>({type:"tableHeader",attrs:{},content:[w(r)]}))});for(let r of e.rows)i.push({type:"tableRow",content:r.map(a=>({type:"tableCell",attrs:{},content:[w(a)]}))});i.length&&t.push({type:"table",attrs:{isNumberColumnEnabled:!1,layout:"default"},content:i});break}}return t}function E(s){return s.length?s:[{type:"paragraph"}]}function ve(s){return s.length?s:[{type:"text",text:" "}]}function Se(s){let n=[];return s.forEach((t,e)=>{e&&n.push({t:"text",v:" \xB7 "}),n.push(...t)}),n}function M(s){return{type:"doc",version:1,content:String(s??"").split(`
5
- `).map(n=>({type:"paragraph",...n?{content:[{type:"text",text:n}]}:{}}))}}function ne(s){try{let n=T(te(s),"doc");return{type:"doc",version:1,content:n.length?n:[{type:"paragraph"}]}}catch{return M(s)}}function v(s){let n="";for(let t of s)switch(t.t){case"text":n+=t.v;break;case"br":n+=`
6
- `;break;case"code":n+=`\`${t.v}\``;break;case"strong":n+=`**${v(t.c)}**`;break;case"em":n+=`_${v(t.c)}_`;break;case"strike":n+=`~~${v(t.c)}~~`;break;case"link":{let e=v(t.c);n+=!e||e===t.href?t.href:`[${e}](${t.href})`;break}}return n}function N(s){let n="";for(let t of s)switch(t.t){case"paragraph":n+=`${v(t.c)}
7
- `;break;case"heading":n+=`${"#".repeat(Math.max(1,Math.min(ee,t.level)))} ${v(t.c)}
8
- `;break;case"bullet":for(let e of t.items)n+=`- ${N(e).trim()}
9
- `;break;case"ordered":t.items.forEach((e,i)=>{n+=`${t.start+i}. ${N(e).trim()}
10
- `});break;case"task":for(let e of t.items)n+=`- [${e.checked?"x":" "}] ${v(e.c)}
11
- `;break;case"code":n+=`\`\`\`${t.lang}
12
- ${t.v}
3
+ `);return C(t,0)}function C(s,n){let t=[],e=0;for(;e<s.length;){let i=s[e];if(i.trim()===""){e++;continue}if(/^[ \t]/.test(i)){t.push({t:"paragraph",c:b(i)}),e++;continue}let r;if(r=me.exec(i)){let a=r[1]||"",o=[];for(e++;e<s.length&&!/^```\s*$/.test(s[e]);)o.push(s[e]),e++;e++,t.push({t:"code",lang:a,v:o.join(`
4
+ `)});continue}if(he.test(i)){t.push({t:"rule"}),e++;continue}if(r=ge.exec(i)){let a=Math.min(te,r[1].length);t.push({t:"heading",level:a,c:b(r[2])}),e++;continue}if(W.test(i)&&n<3){let a=[];for(;e<s.length&&(r=W.exec(s[e]));)a.push(r[1]??""),e++;let o=a.findIndex(l=>l.trim()!==""),c=o>=0?ke.exec(a[o].trim()):null;if(c){let l=pe[c[1].toUpperCase()];t.push({t:"panel",kind:l,c:C(a.slice(o+1),n+1)})}else t.push({t:"quote",c:C(a,n+1)});continue}if(K.test(i)){let a=[];for(;e<s.length&&(r=K.exec(s[e]));)a.push({checked:r[1]!==" ",c:b(r[2])}),e++;t.push({t:"task",items:a});continue}if(z.test(i)){let a=[];for(;e<s.length&&!K.test(s[e])&&(r=z.exec(s[e]));)a.push([{t:"paragraph",c:b(r[1])}]),e++;t.push({t:"bullet",items:a});continue}if(r=H.exec(i)){let a=Math.max(1,parseInt(r[1],10)||1),o=[];for(;e<s.length&&(r=H.exec(s[e]));)o.push([{t:"paragraph",c:b(r[2])}]),e++;t.push({t:"ordered",start:a,items:o});continue}if(Y.test(i)&&e+1<s.length&&ye.test(s[e+1])){let a=Q(i).map(b);e+=2;let o=[];for(;e<s.length&&Y.test(s[e]);)o.push(Q(s[e]).map(b)),e++;t.push({t:"table",header:a,rows:o});continue}t.push({t:"paragraph",c:b(i)}),e++}return t}var be=/^https?:\/\/[^\s<>()[\]]+/,_e=/^\[([^\]\n]{1,300})\]\((https?:\/\/[^\s)]{1,2000})\)/,Ie=/[.,;:!?'"]+$/;function ve(s,n){return n<=0?!0:/[\s([{"'“‘>:—–-]/.test(s[n-1])}function je(s,n){return n>=s.length?!0:/[\s)\]}"'”’.,;:!?—–-]/.test(s[n])}function Te(s,n,t){let e=n;for(;e<s.length;){let i=s.indexOf(t,e);if(i<0)return-1;let r=s[i-1],a=s[i+t.length],o=t.length===1&&(r===t||a===t);if(i>n&&r&&!/\s/.test(r)&&!o&&je(s,i+t.length))return i;e=i+1}return-1}function b(s){let n=String(s??""),t=[],e="",i=()=>{e&&(t.push({t:"text",v:e}),e="")},r=0;for(;r<n.length;){let a=n[r];if(a==="`"){let o=1;for(;n[r+o]==="`";)o++;let c="`".repeat(o),l=n.indexOf(c,r+o);if(l>r+o-1&&l!==-1){let u=n.slice(r+o,l);if(u.trim()){i(),t.push({t:"code",v:u.length>1&&u.startsWith(" ")&&u.endsWith(" ")?u.slice(1,-1):u}),r=l+o;continue}}e+=c,r+=o;continue}if(a==="["){let o=_e.exec(n.slice(r));if(o){i(),t.push({t:"link",href:o[2],c:b(o[1])}),r+=o[0].length;continue}}if((a==="*"||a==="_"||a==="~")&&ve(n,r)){let o=n[r+1]===a;if(a==="~"&&!o){e+=a,r++;continue}let c=o?a+a:a,l=r+c.length;if(l<n.length&&!/\s/.test(n[l])){let u=Te(n,l,c);if(u>l){i();let d=b(n.slice(l,u));t.push(a==="~"?{t:"strike",c:d}:o?{t:"strong",c:d}:{t:"em",c:d}),r=u+c.length;continue}}}if(a==="h"&&(r===0||/[\s(<]/.test(n[r-1]))){let o=be.exec(n.slice(r));if(o){let c=o[0],l=Ie.exec(c);if(l&&(c=c.slice(0,-l[0].length)),c.length>8){i(),t.push({t:"link",href:c,c:[{t:"text",v:c}]}),r+=c.length;continue}}}e+=a,r++}return i(),t}function A(s,n=[]){let t=[];for(let e of s)switch(e.t){case"text":e.v&&t.push({type:"text",text:e.v,...n.length?{marks:n}:{}});break;case"br":t.push({type:"hardBreak"});break;case"code":t.push({type:"text",text:e.v,marks:[{type:"code"},...n.filter(i=>i.type==="link")]});break;case"strong":t.push(...A(e.c,E(n,{type:"strong"})));break;case"em":t.push(...A(e.c,E(n,{type:"em"})));break;case"strike":t.push(...A(e.c,E(n,{type:"strike"})));break;case"link":t.push(...A(e.c,E(n,{type:"link",attrs:{href:e.href}})));break}return t}function E(s,n){return s.some(t=>t.type===n.type)?s:[...s,n]}var q=0;function X(){return q=(q+1)%1e6,`m${Date.now().toString(36)}-${q}`}var x=s=>{let n=A(s);return n.length?{type:"paragraph",content:n}:{type:"paragraph"}};function S(s,n){let t=[];for(let e of s)switch(e.t){case"paragraph":t.push(x(e.c));break;case"heading":if(n==="quote"||n==="item")t.push(x([{t:"strong",c:e.c}]));else{let i=A(e.c);i.length&&t.push({type:"heading",attrs:{level:e.level},content:i})}break;case"bullet":t.push({type:"bulletList",content:e.items.map(i=>({type:"listItem",content:R(S(i,"item"))}))});break;case"ordered":t.push({type:"orderedList",attrs:{order:e.start},content:e.items.map(i=>({type:"listItem",content:R(S(i,"item"))}))});break;case"task":n==="quote"||n==="item"?t.push({type:"bulletList",content:e.items.map(i=>({type:"listItem",content:[x([{t:"text",v:i.checked?"\u2611 ":"\u2610 "},...i.c])]}))}):t.push({type:"taskList",attrs:{localId:X()},content:e.items.map(i=>({type:"taskItem",attrs:{localId:X(),state:i.checked?"DONE":"TODO"},content:Se(A(i.c))}))});break;case"code":t.push({type:"codeBlock",attrs:e.lang?{language:e.lang}:{},...e.v?{content:[{type:"text",text:e.v}]}:{}});break;case"quote":n==="quote"||n==="item"?t.push(...S(e.c,n)):n==="panel"?t.push(...Z(e).map(i=>({type:"paragraph",content:[{type:"text",text:i}]}))):t.push({type:"blockquote",content:R(S(e.c,"quote"))});break;case"panel":n==="panel"?t.push(...Z(e).map(i=>({type:"paragraph",content:[{type:"text",text:i}]}))):n!=="doc"?t.push(...S(e.c,n)):t.push({type:"panel",attrs:{panelType:e.kind},content:R(S(e.c,"panel"))});break;case"rule":if(n==="quote"||n==="item")break;t.push({type:"rule"});break;case"table":{if(n!=="doc"){for(let r of[...e.header?[e.header]:[],...e.rows])t.push(x(Ae(r)));break}let i=[];e.header&&i.push({type:"tableRow",content:e.header.map(r=>({type:"tableHeader",attrs:{},content:[x(r)]}))});for(let r of e.rows)i.push({type:"tableRow",content:r.map(a=>({type:"tableCell",attrs:{},content:[x(a)]}))});i.length&&t.push({type:"table",attrs:{isNumberColumnEnabled:!1,layout:"default"},content:i});break}}return t}function R(s){return s.length?s:[{type:"paragraph"}]}function Z(s){return w([s]).replace(/\n$/,"").split(`
5
+ `).filter(n=>n!=="")}function Se(s){return s.length?s:[{type:"text",text:" "}]}function Ae(s){let n=[];return s.forEach((t,e)=>{e&&n.push({t:"text",v:" \xB7 "}),n.push(...t)}),n}function M(s){return{type:"doc",version:1,content:String(s??"").split(`
6
+ `).map(n=>({type:"paragraph",...n?{content:[{type:"text",text:n}]}:{}}))}}function se(s){try{let n=S(ne(s),"doc");return{type:"doc",version:1,content:n.length?n:[{type:"paragraph"}]}}catch{return M(s)}}function j(s){let n="";for(let t of s)switch(t.t){case"text":n+=t.v;break;case"br":n+=`
7
+ `;break;case"code":n+=`\`${t.v}\``;break;case"strong":n+=`**${j(t.c)}**`;break;case"em":n+=`_${j(t.c)}_`;break;case"strike":n+=`~~${j(t.c)}~~`;break;case"link":{let e=j(t.c);n+=!e||e===t.href?t.href:`[${e}](${t.href})`;break}}return n}function w(s){let n="",t=!1;for(let e of s){let i=e.t==="quote"||e.t==="panel";switch(i&&t&&(n+=`
8
+ `),t=i,e.t){case"paragraph":n+=`${j(e.c)}
9
+ `;break;case"heading":n+=`${"#".repeat(Math.max(1,Math.min(te,e.level)))} ${j(e.c)}
10
+ `;break;case"bullet":for(let r of e.items)n+=`- ${w(r).trim()}
11
+ `;break;case"ordered":e.items.forEach((r,a)=>{n+=`${e.start+a}. ${w(r).trim()}
12
+ `});break;case"task":for(let r of e.items)n+=`- [${r.checked?"x":" "}] ${j(r.c)}
13
+ `;break;case"code":n+=`\`\`\`${e.lang}
14
+ ${e.v}
13
15
  \`\`\`
14
- `;break;case"quote":n+=Z(N(t.c));break;case"panel":n+=`> [!${V[t.kind]}]
15
- ${Z(N(t.c))}`;break;case"rule":n+=`---
16
- `;break;case"table":{let e=i=>`| ${i.map(r=>v(r).replace(/\|/g,"\\|")).join(" | ")} |
17
- `;t.header&&(n+=e(t.header)+`|${t.header.map(()=>" --- |").join("")}
18
- `);for(let i of t.rows)n+=e(i);break}}return n}function Te(s){return s.replace(/^\n+/,"").replace(/\s+$/,"")}function Z(s){return s.replace(/\n$/,"").split(`
16
+ `;break;case"quote":n+=V(w(e.c));break;case"panel":n+=`> [!${ee[e.kind]}]
17
+ ${V(w(e.c))}`;break;case"rule":n+=`---
18
+ `;break;case"table":{let r=a=>`| ${a.map(o=>j(o).replace(/\|/g,"\\|")).join(" | ")} |
19
+ `;e.header&&(n+=r(e.header)+`|${e.header.map(()=>" --- |").join("")}
20
+ `);for(let a of e.rows)n+=r(a);break}}}return n}function we(s){return s.replace(/^\n+/,"").replace(/\s+$/,"")}function V(s){return s.replace(/\n$/,"").split(`
19
21
  `).map(n=>n?`> ${n}`:">").join(`
20
22
  `)+`
21
- `}function x(s){let n=[];for(let t of s||[])if(!(!t||typeof t!="object"))switch(t.type){case"text":{let e={t:"text",v:String(t.text??"")},i=Array.isArray(t.marks)?t.marks:[];i.some(r=>r?.type==="code")&&(e={t:"code",v:String(t.text??"")});for(let r of i)!r||r.type==="code"||(r.type==="strong"?e={t:"strong",c:[e]}:r.type==="em"?e={t:"em",c:[e]}:r.type==="strike"?e={t:"strike",c:[e]}:r.type==="link"&&r.attrs?.href&&(e={t:"link",href:String(r.attrs.href),c:[e]}));n.push(e);break}case"hardBreak":n.push({t:"br"});break;case"mention":n.push({t:"text",v:String(t.attrs?.text||(t.attrs?.id?`@${t.attrs.id}`:"@someone"))});break;case"emoji":n.push({t:"text",v:String(t.attrs?.text||t.attrs?.shortName||"")});break;case"status":n.push({t:"text",v:String(t.attrs?.text||"")});break;case"date":n.push({t:"text",v:t.attrs?.timestamp?new Date(Number(t.attrs.timestamp)).toISOString().slice(0,10):""});break;case"inlineCard":{let e=String(t.attrs?.url||"");e&&n.push({t:"link",href:e,c:[{t:"text",v:e}]});break}default:Array.isArray(t.content)?n.push(...x(t.content)):typeof t.text=="string"&&n.push({t:"text",v:t.text})}return n}function _(s){let n=[];for(let t of s||[])if(!(!t||typeof t!="object"))switch(t.type){case"paragraph":n.push({t:"paragraph",c:x(t.content)});break;case"heading":n.push({t:"heading",level:Number(t.attrs?.level)||1,c:x(t.content)});break;case"bulletList":n.push({t:"bullet",items:(t.content||[]).map(e=>_(e?.content))});break;case"orderedList":n.push({t:"ordered",start:Number(t.attrs?.order)||1,items:(t.content||[]).map(e=>_(e?.content))});break;case"taskList":n.push({t:"task",items:(t.content||[]).map(e=>({checked:e?.attrs?.state==="DONE",c:x(e?.content)}))});break;case"decisionList":n.push({t:"bullet",items:(t.content||[]).map(e=>[{t:"paragraph",c:x(e?.content)}])});break;case"codeBlock":n.push({t:"code",lang:String(t.attrs?.language||""),v:(t.content||[]).map(e=>String(e?.text??"")).join("")});break;case"blockquote":n.push({t:"quote",c:_(t.content)});break;case"panel":{let e=String(t.attrs?.panelType||"info");n.push({t:"panel",kind:e in V?e:"info",c:_(t.content)});break}case"rule":n.push({t:"rule"});break;case"table":{let e=(t.content||[]).filter(o=>o?.type==="tableRow"),i=o=>(o.content||[]).map(c=>{let l=_(c?.content);return b(N(l).trim().replace(/\n+/g," "))}),r=o=>(o.content||[]).length>0&&(o.content||[]).every(c=>c?.type==="tableHeader"),a=e.length&&r(e[0])?i(e[0]):null;n.push({t:"table",header:a,rows:e.slice(a?1:0).map(i)});break}case"mediaSingle":case"mediaGroup":case"media":case"mediaInline":n.push({t:"paragraph",c:[{t:"text",v:"[attachment]"}]});break;case"expand":case"nestedExpand":{let e=String(t.attrs?.title||"").trim();e&&n.push({t:"paragraph",c:[{t:"strong",c:[{t:"text",v:e}]}]}),n.push(..._(t.content));break}default:{let e=Array.isArray(t.content)?t.content:[];e.some(i=>i?.type==="text"||i?.type==="hardBreak")?n.push({t:"paragraph",c:x(e)}):e.length?n.push(..._(e)):typeof t.text=="string"&&t.text&&n.push({t:"paragraph",c:[{t:"text",v:t.text}]})}}return n}function Ae(s){try{if(Array.isArray(s))return _(s);if(s&&typeof s=="object"){let n=s;return n.type==="doc"||!n.type&&Array.isArray(n.content)?_(n.content):_([n])}if(typeof s=="string")return te(s)}catch{}return[]}function J(s){try{return Te(N(Ae(s)))}catch{return""}}function Ee(){if(process.env.MCP_SKILL_PATH)return process.env.MCP_SKILL_PATH;let s=xe(Oe(import.meta.url)),n=Ne(s,"..","bin","mcp-skill.mjs");return we(n)?n:null}function Le(s){return ne(s)}async function B(s,n){try{return await s(Le(n))}catch(t){let e=Number(t?.status);if(!(e>=400&&e<500))throw t;return console.warn(`[jira] rich body rejected (${e}) \u2014 retrying as plain text: ${String(t?.message||t).slice(0,200)}`),await s(M(n))}}function O(s){return String(s||"").toLowerCase().replace(/\s+/g,"").replace(/[()\-_::"'`]/g,"")}function U(s){return O(s).replace(/[a-z0-9]+/g,"")}function L(s,n){let t=O(s),e=O(n);if(!t||!e)return 0;if(t===e)return 1;if(t.length===1||e.length===1)return t===e?1:0;let i=u=>{let d=new Map;for(let m=0;m<u.length-1;m++){let g=u.slice(m,m+2);d.set(g,(d.get(g)||0)+1)}return d},r=i(t),a=i(e),o=0,c=0,l=0;for(let u of r.values())c+=u;for(let u of a.values())l+=u;for(let[u,d]of r.entries()){let m=a.get(u)||0;o+=Math.min(d,m)}return 2*o/Math.max(1,c+l)}function S(s){return String(s||"").toLowerCase().replace(/\s+/g,"").replace(/[()\-_::"'`]/g,"")}function Pe(s,n=[]){let t=Array.isArray(n)?n:[];if(t.length===0)return{requested:s||null,resolved:null,strategy:"none"};let e=t.filter(o=>!o.subtask),i=e.length>0?e:t,r=S(s);if(r){let o=i.find(u=>S(u.name)===r);if(o)return{requested:s,resolved:o,strategy:"exact"};let c={task:["task","\u4EFB\u52A1","\u4E8B\u9879","to do","todo"],story:["story","\u7528\u6237\u6545\u4E8B","\u9700\u6C42"],bug:["bug","\u7F3A\u9677","\u95EE\u9898"],improvement:["improvement","\u4F18\u5316","\u6539\u8FDB"],epic:["epic","\u53F2\u8BD7"]};for(let u of Object.values(c)){if(!u.some(m=>S(m)===r))continue;let d=i.find(m=>u.some(g=>S(g)===S(m.name)));if(d)return{requested:s,resolved:d,strategy:"alias"}}let l=i.map(u=>({t:u,score:L(s,u.name)})).sort((u,d)=>d.score-u.score);if(l[0]&&l[0].score>=.5)return{requested:s,resolved:l[0].t,strategy:"fuzzy"}}let a=["task","story","bug","improvement","epic"];for(let o of a){let c=i.find(l=>S(l.name)===o);if(c)return{requested:s||null,resolved:c,strategy:"default-preferred"}}return{requested:s||null,resolved:i[0],strategy:"default-first"}}async function se(s){let n=`projectKeys=${encodeURIComponent(s)}&expand=projects.issuetypes`,t=await h(`/rest/api/3/issue/createmeta?${n}`),e=Array.isArray(t?.projects)?t.projects:[],r=e.find(o=>String(o?.key||"").toUpperCase()===String(s||"").toUpperCase())||e[0]||null;return(Array.isArray(r?.issuetypes)?r.issuetypes:[]).map(o=>({id:o.id,name:o.name,subtask:!!o.subtask,description:o.description||null}))}async function re(s,n){if(!s)throw new Error("projectKey is required");let t="sprint is not EMPTY";n==="active"?t="sprint in openSprints()":n==="closed"?t="sprint in closedSprints()":n==="future"&&(t="sprint in futureSprints()");let e=`project = ${s} AND ${t} ORDER BY updated DESC`,i=`jql=${encodeURIComponent(e)}&maxResults=100&fields=customfield_10020`,r=await h(`/rest/api/3/search/jql?${i}`),a=new Map;for(let o of r.issues||[])for(let c of o.fields?.customfield_10020||[])c&&!a.has(c.id)&&a.set(c.id,{id:c.id,name:c.name,state:c.state,boardId:c.boardId||null,startDate:c.startDate||null,endDate:c.endDate||null,goal:c.goal||null});return[...a.values()].sort((o,c)=>{let l={active:0,future:1,closed:2},u=(l[o.state]??3)-(l[c.state]??3);return u!==0?u:String(c.startDate||"").localeCompare(String(o.startDate||""))})}function qe(s,{sprintId:n,sprintName:t,target:e}={}){let i=Array.isArray(s)?s:[];if(!i.length)return{sprint:null,selectedBy:"none"};if(n!=null&&String(n).trim()!=="")return{sprint:i.find(o=>String(o.id)===String(n))||null,selectedBy:"id"};if(t&&String(t).trim()){let a=String(t).trim(),o=i.find(l=>String(l.name||"").toLowerCase()===a.toLowerCase());if(o)return{sprint:o,selectedBy:"name-exact"};let c=i.map(l=>({s:l,score:L(a,l.name||"")})).sort((l,u)=>u.score-l.score);return c[0]&&c[0].score>=.5?{sprint:c[0].s,selectedBy:"name-fuzzy"}:{sprint:null,selectedBy:"name-none"}}let r=String(e||"current").trim().toLowerCase();return r==="active"||r==="current"||r==="latest"?{sprint:i[0],selectedBy:r}:{sprint:i[0],selectedBy:"default"}}function Ke(s,n){let t=s?.fields?.customfield_10020;return Array.isArray(t)?t.some(e=>String(e?.id)===String(n)):!1}async function Ce({issueKey:s,projectKey:n,sprintId:t,attempts:e=3,delayMs:i=450}){let r=[];for(let a=0;a<e;a++){try{let o=`project = ${n} AND key = ${s} AND sprint = ${t}`,c=`jql=${encodeURIComponent(o)}&maxResults=1&fields=key,status`,l=await h(`/rest/api/3/search/jql?${c}`);if(Number(l?.total||0)>0)return r.push({attempt:a+1,jql:!0,issueField:null}),{ok:!0,method:"jql",traces:r};let d=await h(`/rest/api/3/issue/${s}?fields=customfield_10020,status`),m=Ke(d,t);if(r.push({attempt:a+1,jql:!1,issueField:m}),m)return{ok:!0,method:"issue_field",traces:r}}catch(o){r.push({attempt:a+1,error:String(o?.message||o)})}a<e-1&&await new Promise(o=>setTimeout(o,i))}return{ok:!1,method:"none",traces:r}}async function D({issueKey:s,projectKey:n,sprintId:t,sprintName:e,target:i}){if(!s)return{ok:!1,error:"issueKey is required"};let r=n;if(!r&&(r=(await h(`/rest/api/3/issue/${s}?fields=project`))?.fields?.project?.key||null,!r))return{ok:!1,error:`Could not resolve project for ${s}`};let a=await re(r,"active");if(!a.length)return{ok:!1,error:`No assignable active sprint found for project ${r}`};let{sprint:o,selectedBy:c}=qe(a,{sprintId:t,sprintName:e,target:i});if(!o)return{ok:!1,error:`No matching sprint found in ${r}`,requested:{sprintId:t??null,sprintName:e??null,target:i??"current"},availableSprints:a.map(d=>({id:d.id,name:d.name,state:d.state}))};await h(`/rest/api/3/issue/${s}`,{method:"PUT",body:{fields:{customfield_10020:Number(o.id)}}});let l=await Ce({issueKey:s,projectKey:r,sprintId:o.id}),u=l.ok;return{ok:u,issueKey:s,projectKey:r,sprintId:o.id,sprintName:o.name,selectedBy:c,verifiedBy:l.method,verified:u,verificationTrace:l.traces,warning:u?null:`Sprint assignment attempted but verification did not find ${s} in sprint ${o.id}`}}async function Me(){let s=process.env.JIRA_API_TOKEN,n=process.env.JIRA_EMAIL,t=process.env.JIRA_BASE_URL;if(s&&n&&t)return{authType:"token",apiToken:s,email:n,baseUrl:t};let e=await Re("jira");return(e?.authType?e.authType!=="token":!!e?.cloudId)?{authType:"oauth",accessToken:e.token,cloudId:e.cloudId}:{authType:"token",apiToken:e?.token,email:n||e?.email||"",baseUrl:t||e?.baseUrl||e?.instanceUrl||process.env.ATLASSIAN_INSTANCE_URL||""}}function Je(s,n,t={}){let e=s||{},i={Accept:"application/json",...t.body?{"Content-Type":"application/json"}:{},...t.headers};if(e.authType==="token"){let r=String(e.baseUrl||e.instanceUrl||"").trim().replace(/\/+$/,""),a=e.apiToken||e.accessToken||"";if(!r)throw new Error("Jira token connection has no base URL \u2014 reconnect Jira with its instance URL, or set JIRA_BASE_URL.");if(!e.email)throw new Error("Jira token connection has no account email \u2014 reconnect Jira with the account email, or set JIRA_EMAIL.");if(!a)throw new Error("Jira token connection has no API token \u2014 reconnect Jira, or set JIRA_API_TOKEN.");return{url:`${r}${n}`,headers:{Authorization:"Basic "+Buffer.from(`${e.email}:${a}`).toString("base64"),...i}}}if(typeof e.accessToken!="string"||!e.accessToken)throw new Error(`Invalid jira token type: ${typeof e.accessToken}`);if(!e.cloudId)throw new Error("Invalid jira cloudId: missing");return{url:`https://api.atlassian.com/ex/jira/${e.cloudId}${n}`,headers:{Authorization:`Bearer ${e.accessToken}`,...i}}}async function h(s,n={}){let t=async()=>{let e=await Me(),{url:i,headers:r}=Je(e,s,n),a=await F(i,{method:n.method||"GET",headers:r,body:n.body?JSON.stringify(n.body):void 0,signal:n.signal},{kind:/\/search\b/.test(String(s))?"job":"api",what:`Jira ${n.method||"GET"} ${s}`}),o=()=>a.text().catch(l=>{if(P(l)||n.signal?.aborted)throw l;return""});if(!a.ok){let l=await o(),u=new Error(`Jira API ${a.status}: ${l.slice(0,300)}`);throw u.status=a.status,u}let c=await o();if(!c||!c.trim())return{};try{return JSON.parse(c)}catch{return{raw:c}}};try{return await t()}catch(e){if(n.signal?.aborted)throw e;let i=String(e?.message||e||"").toLowerCase();if(!(i.includes("token")||i.includes("401")||i.includes("403")||i.includes("substring")))throw e;return $e("jira"),t()}}var Ze={id:"jira",callsBackend:!0,serverName:"jira",allowedTools:["mcp__jira__*"],requiresIntegration:G.JIRA,envKeys:["ATLASSIAN_ACCESS_TOKEN","ATLASSIAN_CLOUD_ID"],description:"Zibby Jira MCP Server (OAuth Bearer)",promptFragment:`## Jira
23
+ `}function N(s){let n=[];for(let t of s||[])if(!(!t||typeof t!="object"))switch(t.type){case"text":{let e={t:"text",v:String(t.text??"")},i=Array.isArray(t.marks)?t.marks:[];i.some(r=>r?.type==="code")&&(e={t:"code",v:String(t.text??"")});for(let r of i)!r||r.type==="code"||(r.type==="strong"?e={t:"strong",c:[e]}:r.type==="em"?e={t:"em",c:[e]}:r.type==="strike"?e={t:"strike",c:[e]}:r.type==="link"&&r.attrs?.href&&(e={t:"link",href:String(r.attrs.href),c:[e]}));n.push(e);break}case"hardBreak":n.push({t:"br"});break;case"mention":n.push({t:"text",v:String(t.attrs?.text||(t.attrs?.id?`@${t.attrs.id}`:"@someone"))});break;case"emoji":n.push({t:"text",v:String(t.attrs?.text||t.attrs?.shortName||"")});break;case"status":n.push({t:"text",v:String(t.attrs?.text||"")});break;case"date":n.push({t:"text",v:t.attrs?.timestamp?new Date(Number(t.attrs.timestamp)).toISOString().slice(0,10):""});break;case"inlineCard":{let e=String(t.attrs?.url||"");e&&n.push({t:"link",href:e,c:[{t:"text",v:e}]});break}default:Array.isArray(t.content)?n.push(...N(t.content)):typeof t.text=="string"&&n.push({t:"text",v:t.text})}return n}function _(s){let n=[];for(let t of s||[])if(!(!t||typeof t!="object"))switch(t.type){case"paragraph":n.push({t:"paragraph",c:N(t.content)});break;case"heading":n.push({t:"heading",level:Number(t.attrs?.level)||1,c:N(t.content)});break;case"bulletList":n.push({t:"bullet",items:(t.content||[]).map(e=>_(e?.content))});break;case"orderedList":n.push({t:"ordered",start:Number(t.attrs?.order)||1,items:(t.content||[]).map(e=>_(e?.content))});break;case"taskList":n.push({t:"task",items:(t.content||[]).map(e=>({checked:e?.attrs?.state==="DONE",c:N(e?.content)}))});break;case"decisionList":n.push({t:"bullet",items:(t.content||[]).map(e=>[{t:"paragraph",c:N(e?.content)}])});break;case"codeBlock":n.push({t:"code",lang:String(t.attrs?.language||""),v:(t.content||[]).map(e=>String(e?.text??"")).join("")});break;case"blockquote":n.push({t:"quote",c:_(t.content)});break;case"panel":{let e=String(t.attrs?.panelType||"info");n.push({t:"panel",kind:e in ee?e:"info",c:_(t.content)});break}case"rule":n.push({t:"rule"});break;case"table":{let e=(t.content||[]).filter(o=>o?.type==="tableRow"),i=o=>(o.content||[]).map(c=>{let l=_(c?.content);return b(w(l).trim().replace(/\n+/g," "))}),r=o=>(o.content||[]).length>0&&(o.content||[]).every(c=>c?.type==="tableHeader"),a=e.length&&r(e[0])?i(e[0]):null;n.push({t:"table",header:a,rows:e.slice(a?1:0).map(i)});break}case"mediaSingle":case"mediaGroup":case"media":case"mediaInline":n.push({t:"paragraph",c:[{t:"text",v:"[attachment]"}]});break;case"expand":case"nestedExpand":{let e=String(t.attrs?.title||"").trim();e&&n.push({t:"paragraph",c:[{t:"strong",c:[{t:"text",v:e}]}]}),n.push(..._(t.content));break}default:{let e=Array.isArray(t.content)?t.content:[];e.some(i=>i?.type==="text"||i?.type==="hardBreak")?n.push({t:"paragraph",c:N(e)}):e.length?n.push(..._(e)):typeof t.text=="string"&&t.text&&n.push({t:"paragraph",c:[{t:"text",v:t.text}]})}}return n}function xe(s){try{if(Array.isArray(s))return _(s);if(s&&typeof s=="object"){let n=s;return n.type==="doc"||!n.type&&Array.isArray(n.content)?_(n.content):_([n])}if(typeof s=="string")return ne(s)}catch{}return[]}function B(s){try{return we(w(xe(s)))}catch{return""}}function Pe(){if(process.env.MCP_SKILL_PATH)return process.env.MCP_SKILL_PATH;let s=Oe(Ee(import.meta.url)),n=$e(s,"..","bin","mcp-skill.mjs");return Ne(n)?n:null}function Ke(s){return se(s)}async function J(s,n){try{return await s(Ke(n))}catch(t){let e=Number(t?.status);if(!(e>=400&&e<500))throw t;return console.warn(`[jira] rich body rejected (${e}) \u2014 retrying as plain text: ${String(t?.message||t).slice(0,200)}`),await s(M(n))}}function O(s){return String(s||"").toLowerCase().replace(/\s+/g,"").replace(/[()\-_::"'`]/g,"")}function U(s){return O(s).replace(/[a-z0-9]+/g,"")}function L(s,n){let t=O(s),e=O(n);if(!t||!e)return 0;if(t===e)return 1;if(t.length===1||e.length===1)return t===e?1:0;let i=u=>{let d=new Map;for(let f=0;f<u.length-1;f++){let h=u.slice(f,f+2);d.set(h,(d.get(h)||0)+1)}return d},r=i(t),a=i(e),o=0,c=0,l=0;for(let u of r.values())c+=u;for(let u of a.values())l+=u;for(let[u,d]of r.entries()){let f=a.get(u)||0;o+=Math.min(d,f)}return 2*o/Math.max(1,c+l)}function T(s){return String(s||"").toLowerCase().replace(/\s+/g,"").replace(/[()\-_::"'`]/g,"")}function qe(s,n=[]){let t=Array.isArray(n)?n:[];if(t.length===0)return{requested:s||null,resolved:null,strategy:"none"};let e=t.filter(o=>!o.subtask),i=e.length>0?e:t,r=T(s);if(r){let o=i.find(u=>T(u.name)===r);if(o)return{requested:s,resolved:o,strategy:"exact"};let c={task:["task","\u4EFB\u52A1","\u4E8B\u9879","to do","todo"],story:["story","\u7528\u6237\u6545\u4E8B","\u9700\u6C42"],bug:["bug","\u7F3A\u9677","\u95EE\u9898"],improvement:["improvement","\u4F18\u5316","\u6539\u8FDB"],epic:["epic","\u53F2\u8BD7"]};for(let u of Object.values(c)){if(!u.some(f=>T(f)===r))continue;let d=i.find(f=>u.some(h=>T(h)===T(f.name)));if(d)return{requested:s,resolved:d,strategy:"alias"}}let l=i.map(u=>({t:u,score:L(s,u.name)})).sort((u,d)=>d.score-u.score);if(l[0]&&l[0].score>=.5)return{requested:s,resolved:l[0].t,strategy:"fuzzy"}}let a=["task","story","bug","improvement","epic"];for(let o of a){let c=i.find(l=>T(l.name)===o);if(c)return{requested:s||null,resolved:c,strategy:"default-preferred"}}return{requested:s||null,resolved:i[0],strategy:"default-first"}}async function re(s){let n=`projectKeys=${encodeURIComponent(s)}&expand=projects.issuetypes`,t=await g(`/rest/api/3/issue/createmeta?${n}`),e=Array.isArray(t?.projects)?t.projects:[],r=e.find(o=>String(o?.key||"").toUpperCase()===String(s||"").toUpperCase())||e[0]||null;return(Array.isArray(r?.issuetypes)?r.issuetypes:[]).map(o=>({id:o.id,name:o.name,subtask:!!o.subtask,description:o.description||null}))}async function ie(s,n){if(!s)throw new Error("projectKey is required");let t="sprint is not EMPTY";n==="active"?t="sprint in openSprints()":n==="closed"?t="sprint in closedSprints()":n==="future"&&(t="sprint in futureSprints()");let e=`project = ${s} AND ${t} ORDER BY updated DESC`,i=`jql=${encodeURIComponent(e)}&maxResults=100&fields=customfield_10020`,r=await g(`/rest/api/3/search/jql?${i}`),a=new Map;for(let o of r.issues||[])for(let c of o.fields?.customfield_10020||[])c&&!a.has(c.id)&&a.set(c.id,{id:c.id,name:c.name,state:c.state,boardId:c.boardId||null,startDate:c.startDate||null,endDate:c.endDate||null,goal:c.goal||null});return[...a.values()].sort((o,c)=>{let l={active:0,future:1,closed:2},u=(l[o.state]??3)-(l[c.state]??3);return u!==0?u:String(c.startDate||"").localeCompare(String(o.startDate||""))})}function Ce(s,{sprintId:n,sprintName:t,target:e}={}){let i=Array.isArray(s)?s:[];if(!i.length)return{sprint:null,selectedBy:"none"};if(n!=null&&String(n).trim()!=="")return{sprint:i.find(o=>String(o.id)===String(n))||null,selectedBy:"id"};if(t&&String(t).trim()){let a=String(t).trim(),o=i.find(l=>String(l.name||"").toLowerCase()===a.toLowerCase());if(o)return{sprint:o,selectedBy:"name-exact"};let c=i.map(l=>({s:l,score:L(a,l.name||"")})).sort((l,u)=>u.score-l.score);return c[0]&&c[0].score>=.5?{sprint:c[0].s,selectedBy:"name-fuzzy"}:{sprint:null,selectedBy:"name-none"}}let r=String(e||"current").trim().toLowerCase();return r==="active"||r==="current"||r==="latest"?{sprint:i[0],selectedBy:r}:{sprint:i[0],selectedBy:"default"}}function Me(s,n){let t=s?.fields?.customfield_10020;return Array.isArray(t)?t.some(e=>String(e?.id)===String(n)):!1}async function Be({issueKey:s,projectKey:n,sprintId:t,attempts:e=3,delayMs:i=450}){let r=[];for(let a=0;a<e;a++){try{let o=`project = ${n} AND key = ${s} AND sprint = ${t}`,c=`jql=${encodeURIComponent(o)}&maxResults=1&fields=key,status`,l=await g(`/rest/api/3/search/jql?${c}`);if(Number(l?.total||0)>0)return r.push({attempt:a+1,jql:!0,issueField:null}),{ok:!0,method:"jql",traces:r};let d=await g(`/rest/api/3/issue/${s}?fields=customfield_10020,status`),f=Me(d,t);if(r.push({attempt:a+1,jql:!1,issueField:f}),f)return{ok:!0,method:"issue_field",traces:r}}catch(o){r.push({attempt:a+1,error:String(o?.message||o)})}a<e-1&&await new Promise(o=>setTimeout(o,i))}return{ok:!1,method:"none",traces:r}}async function D({issueKey:s,projectKey:n,sprintId:t,sprintName:e,target:i}){if(!s)return{ok:!1,error:"issueKey is required"};let r=n;if(!r&&(r=(await g(`/rest/api/3/issue/${s}?fields=project`))?.fields?.project?.key||null,!r))return{ok:!1,error:`Could not resolve project for ${s}`};let a=await ie(r,"active");if(!a.length)return{ok:!1,error:`No assignable active sprint found for project ${r}`};let{sprint:o,selectedBy:c}=Ce(a,{sprintId:t,sprintName:e,target:i});if(!o)return{ok:!1,error:`No matching sprint found in ${r}`,requested:{sprintId:t??null,sprintName:e??null,target:i??"current"},availableSprints:a.map(d=>({id:d.id,name:d.name,state:d.state}))};await g(`/rest/api/3/issue/${s}`,{method:"PUT",body:{fields:{customfield_10020:Number(o.id)}}});let l=await Be({issueKey:s,projectKey:r,sprintId:o.id}),u=l.ok;return{ok:u,issueKey:s,projectKey:r,sprintId:o.id,sprintName:o.name,selectedBy:c,verifiedBy:l.method,verified:u,verificationTrace:l.traces,warning:u?null:`Sprint assignment attempted but verification did not find ${s} in sprint ${o.id}`}}async function Je(){let s=process.env.JIRA_API_TOKEN,n=process.env.JIRA_EMAIL,t=process.env.JIRA_BASE_URL;if(s&&n&&t)return{authType:"token",apiToken:s,email:n,baseUrl:t};let e=await Re("jira");return(e?.authType?e.authType!=="token":!!e?.cloudId)?{authType:"oauth",accessToken:e.token,cloudId:e.cloudId}:{authType:"token",apiToken:e?.token,email:n||e?.email||"",baseUrl:t||e?.baseUrl||e?.instanceUrl||process.env.ATLASSIAN_INSTANCE_URL||""}}function Ue(s,n,t={}){let e=s||{},i={Accept:"application/json",...t.body&&!t.form?{"Content-Type":"application/json"}:{},...t.headers};if(e.authType==="token"){let r=String(e.baseUrl||e.instanceUrl||"").trim().replace(/\/+$/,""),a=e.apiToken||e.accessToken||"";if(!r)throw new Error("Jira token connection has no base URL \u2014 reconnect Jira with its instance URL, or set JIRA_BASE_URL.");if(!e.email)throw new Error("Jira token connection has no account email \u2014 reconnect Jira with the account email, or set JIRA_EMAIL.");if(!a)throw new Error("Jira token connection has no API token \u2014 reconnect Jira, or set JIRA_API_TOKEN.");return{url:`${r}${n}`,headers:{Authorization:"Basic "+Buffer.from(`${e.email}:${a}`).toString("base64"),...i}}}if(typeof e.accessToken!="string"||!e.accessToken)throw new Error(`Invalid jira token type: ${typeof e.accessToken}`);if(!e.cloudId)throw new Error("Invalid jira cloudId: missing");return{url:`https://api.atlassian.com/ex/jira/${e.cloudId}${n}`,headers:{Authorization:`Bearer ${e.accessToken}`,...i}}}async function g(s,n={}){let t=async()=>{let e=await Je(),{url:i,headers:r}=Ue(e,s,n),a=await F(i,{method:n.method||"GET",headers:r,body:n.form?n.form:n.body?JSON.stringify(n.body):void 0,signal:n.signal},{kind:/\/search\b/.test(String(s))?"job":"api",what:`Jira ${n.method||"GET"} ${s}`}),o=()=>a.text().catch(l=>{if(P(l)||n.signal?.aborted)throw l;return""});if(!a.ok){let l=await o(),u=new Error(`Jira API ${a.status}: ${l.slice(0,300)}`);throw u.status=a.status,u}let c=await o();if(!c||!c.trim())return{};try{return JSON.parse(c)}catch{return{raw:c}}};try{return await t()}catch(e){if(n.signal?.aborted)throw e;let i=String(e?.message||e||"").toLowerCase();if(!(i.includes("token")||i.includes("401")||i.includes("403")||i.includes("substring")))throw e;return Le("jira"),t()}}var tt={id:"jira",callsBackend:!0,serverName:"jira",allowedTools:["mcp__jira__*"],requiresIntegration:G.JIRA,envKeys:["ATLASSIAN_ACCESS_TOKEN","ATLASSIAN_CLOUD_ID"],description:"Zibby Jira MCP Server (OAuth Bearer)",promptFragment:`## Jira
22
24
  You have direct access to the user's Jira. Use these tools proactively:
23
25
 
24
26
  ### Issue tools
@@ -68,4 +70,4 @@ When user asks to move/transition ticket status:
68
70
  3. Pick the correct transition from returned list (match by "to" status name, not guesswork), then call jira_transition_issue with transitionId.
69
71
  4. Call jira_get_issue(issueKey) to verify final status before claiming success.
70
72
  5. If target wording differs (e.g. \u5DF2\u7ECF\u9A8C\u6536 vs \u5DF2\u9A8C\u6536), try toStatus first; only ask user to confirm when no reasonable match exists.
71
- 6. IMPORTANT: When target is clear, complete transition + verification in SAME turn. Do NOT stop after listing options.`,resolve(){let s=Ee();if(!s)return{command:null,args:[],env:{},description:this.description};let n={};for(let t of this.envKeys)process.env[t]&&(n[t]=process.env[t]);process.env.ATLASSIAN_INSTANCE_URL&&(n.ATLASSIAN_INSTANCE_URL=process.env.ATLASSIAN_INSTANCE_URL);for(let t of["JIRA_API_TOKEN","JIRA_EMAIL","JIRA_BASE_URL"])process.env[t]&&(n[t]=process.env[t]);return{type:"stdio",command:"node",args:[s,"../dist/jira.js","jiraSkill"],env:n,description:this.description}},async handleToolCall(s,n){try{switch(s){case"jira_list_projects":{let t=await h("/rest/api/3/project"),e=(Array.isArray(t)?t:[]).map(i=>({id:i.id,key:i.key,name:i.name,style:i.style}));return JSON.stringify({count:e.length,projects:e})}case"jira_list_statuses":{let{projectKey:t}=n||{};if(t){let r=await h(`/rest/api/3/project/${encodeURIComponent(t)}/statuses`),a=Array.isArray(r)?r:[],o=new Map;for(let l of a)for(let u of l.statuses||[])u?.id&&(o.has(u.id)||o.set(u.id,{id:u.id,name:u.name,category:u.statusCategory?.name||null}));let c=[...o.values()].sort((l,u)=>String(l.name).localeCompare(String(u.name)));return JSON.stringify({scope:"project",projectKey:t,count:c.length,statuses:c})}let e=await h("/rest/api/3/status"),i=(Array.isArray(e)?e:[]).map(r=>({id:r.id,name:r.name,category:r.statusCategory?.name||null})).sort((r,a)=>String(r.name).localeCompare(String(a.name)));return JSON.stringify({scope:"global",count:i.length,statuses:i})}case"jira_list_issue_types":{let{projectKey:t}=n||{};if(!t)return JSON.stringify({error:"projectKey is required"});let e=await se(t);return JSON.stringify({projectKey:t,count:e.length,issueTypes:e})}case"jira_search":{let t=n.jql||"",e=n.maxResults||20;t.replace(/\s*ORDER\s+BY\s+.*/i,"").trim()||(t=`created >= -365d ${t}`.trim());let r=`jql=${encodeURIComponent(t)}&maxResults=${e}&fields=summary,status,assignee,priority,updated,issuetype,project`,o=((await h(`/rest/api/3/search/jql?${r}`)).issues||[]).map(c=>({key:c.key,project:c.fields?.project?.key,summary:c.fields?.summary,status:c.fields?.status?.name,assignee:c.fields?.assignee?.displayName||"Unassigned",priority:c.fields?.priority?.name,type:c.fields?.issuetype?.name}));return JSON.stringify({count:o.length,issues:o})}case"jira_get_issue":{let t=n.issueKey;if(!t)return JSON.stringify({error:"issueKey is required"});let e=await h(`/rest/api/3/issue/${t}`);return JSON.stringify({key:e.key,project:e.fields?.project?.key,summary:e.fields?.summary,description:e.fields?.description?J(e.fields.description):e.fields?.description??null,status:e.fields?.status?.name,assignee:e.fields?.assignee?.displayName||"Unassigned",priority:e.fields?.priority?.name,type:e.fields?.issuetype?.name,labels:e.fields?.labels,created:e.fields?.created,updated:e.fields?.updated})}case"jira_create_issue":{let{projectKey:t,summary:e,issueType:i,description:r,priority:a,labels:o,assigneeId:c,moveToSprint:l,moveToActiveSprint:u,sprintId:d,sprintName:m,target:g}=n;if(!t||!e)return JSON.stringify({error:"projectKey and summary are required"});let p={requested:i||null,resolved:null,strategy:"none"},y=[];try{y=await se(t),p=Pe(i,y)}catch{}let f={project:{key:t},summary:e,issuetype:p?.resolved?.id?{id:p.resolved.id}:{name:i||"Task"}};a&&(f.priority={name:a}),o?.length&&(f.labels=o),c&&(f.assignee={id:c});let I=r?await B(j=>h("/rest/api/3/issue",{method:"POST",body:{fields:{...f,description:j}}}),r):await h("/rest/api/3/issue",{method:"POST",body:{fields:f}}),k={ok:!0,key:I.key,id:I.id,self:I.self};return p?.resolved&&(k.issueType=p.resolved.name,k.issueTypeResolution=p.strategy,p.strategy!=="exact"&&p.requested&&S(p.requested)!==S(p.resolved.name)&&(k.issueTypeWarning=`Requested "${p.requested}" is not available in ${t}; used "${p.resolved.name}" instead.`)),y.length>0&&(k.availableIssueTypes=y.map(j=>j.name)),(l||u)&&(k.sprintMove=await D({issueKey:I.key,projectKey:t,sprintId:d,sprintName:m,target:g})),JSON.stringify(k)}case"jira_list_sprints":{let{projectKey:t,state:e}=n,i=await re(t,e);return JSON.stringify({count:i.length,sprints:i})}case"jira_move_to_active_sprint":{let{issueKey:t,projectKey:e,sprintId:i,sprintName:r,target:a}=n||{},o=await D({issueKey:t,projectKey:e,sprintId:i,sprintName:r,target:a||"current"});return JSON.stringify(o)}case"jira_move_issue_to_sprint":{let{issueKey:t,projectKey:e,sprintId:i,sprintName:r,target:a}=n||{},o=await D({issueKey:t,projectKey:e,sprintId:i,sprintName:r,target:a});return JSON.stringify(o)}case"jira_get_sprint_issues":{let{sprintName:t,sprintId:e,projectKey:i,status:r,maxResults:a}=n;if(!t&&!e)return JSON.stringify({error:"sprintName or sprintId is required"});let o=a||50,c=e?`sprint = ${e}`:`sprint = "${t}"`,l=i?`project = ${i} AND `:"",u=r?` AND status = "${r}"`:"",d=`${l}${c}${u} ORDER BY status ASC, priority DESC`,m=`jql=${encodeURIComponent(d)}&maxResults=${o}&fields=summary,status,assignee,priority,issuetype,project`,g=await h(`/rest/api/3/search/jql?${m}`),p=(g.issues||[]).map(f=>({key:f.key,project:f.fields?.project?.key,summary:f.fields?.summary,status:f.fields?.status?.name,assignee:f.fields?.assignee?.displayName||"Unassigned",priority:f.fields?.priority?.name,type:f.fields?.issuetype?.name})),y={};for(let f of p)y[f.status]=(y[f.status]||0)+1;return JSON.stringify({count:p.length,total:g.total||p.length,statusCounts:y,issues:p})}case"jira_get_comments":{let{issueKey:t,maxResults:e}=n;if(!t)return JSON.stringify({error:"issueKey is required"});let r=await h(`/rest/api/3/issue/${t}/comment?maxResults=${e||50}&orderBy=-created`),a=(r.comments||[]).map(o=>{let c=o.body?.content?J(o.body):"";return{id:o.id,author:o.author?.displayName||"Unknown",body:c,created:o.created,updated:o.updated}});return JSON.stringify({count:a.length,total:r.total||a.length,comments:a})}case"jira_add_comment":{let{issueKey:t,body:e}=n;return!t||!e?JSON.stringify({error:"issueKey and body are required"}):(await B(i=>h(`/rest/api/3/issue/${t}/comment`,{method:"POST",body:{body:i}}),e),JSON.stringify({ok:!0,issueKey:t}))}case"jira_edit_issue":{let{issueKey:t,fields:e}=n;if(!t||!e)return JSON.stringify({error:"issueKey and fields are required"});if(typeof e.description=="string"){let{description:i,...r}=e;await B(a=>h(`/rest/api/3/issue/${t}`,{method:"PUT",body:{fields:{...r,description:a}}}),i)}else await h(`/rest/api/3/issue/${t}`,{method:"PUT",body:{fields:e}});return JSON.stringify({ok:!0,issueKey:t})}case"jira_transition_issue":{let{issueKey:t,transitionId:e,toStatus:i,statusName:r,status:a}=n;if(!t)return JSON.stringify({error:"issueKey is required"});let o=String(i||r||a||"").trim();if(!e&&!o){let d=((await h(`/rest/api/3/issue/${t}/transitions`)).transitions||[]).map(m=>({id:m.id,name:m.name,to:m.to?.name}));return JSON.stringify({ok:!1,error:"transitionId or toStatus is required",issueKey:t,availableTransitions:d})}let c=e;if(!c){let d=(await h(`/rest/api/3/issue/${t}/transitions`)).transitions||[],m=O(o),g=d.find(p=>O(p?.name||"")===m||O(p?.to?.name||"")===m);if(!g){let p=U(o);p.length>=2&&(g=d.find(y=>{let f=U(y?.name||""),I=U(y?.to?.name||""),k=f.length>=2&&(f.includes(p)||p.includes(f)),j=I.length>=2&&(I.includes(p)||p.includes(I));return k||j}))}if(!g){let p=d.map(k=>{let j=L(o,k?.name||""),ie=L(o,k?.to?.name||"");return{t:k,score:Math.max(j,ie)}}).sort((k,j)=>j.score-k.score),y=p[0],f=p[1];y&&y.score>=.45&&(!f||y.score-f.score>=.12)&&(g=y.t)}if(!g?.id)return JSON.stringify({ok:!1,error:`No transition matches target status: "${o}"`,issueKey:t,availableTransitions:d.map(p=>({id:p.id,name:p.name,to:p.to?.name}))});c=g.id}await h(`/rest/api/3/issue/${t}/transitions`,{method:"POST",body:{transition:{id:c}}});let l=await h(`/rest/api/3/issue/${t}?fields=status`);return JSON.stringify({ok:!0,issueKey:t,transitionId:c,statusAfter:l?.fields?.status?.name||null})}default:return JSON.stringify({error:`Unknown tool: ${s}`})}}catch(t){return JSON.stringify({error:t.message})}},tools:[{name:"jira_list_projects",description:"List all Jira projects accessible to the user",input_schema:{type:"object",properties:{}}},{name:"jira_list_statuses",description:"List Jira statuses. Use projectKey to get statuses applicable in that project workflow.",input_schema:{type:"object",properties:{projectKey:{type:"string",description:"Optional project key (e.g. PROJ). If omitted, returns global status catalog."}}}},{name:"jira_list_issue_types",description:"List issue types allowed for issue creation in the given project.",input_schema:{type:"object",properties:{projectKey:{type:"string",description:"Project key, e.g. PROJ"}},required:["projectKey"]}},{name:"jira_search",description:"Search Jira issues using JQL",input_schema:{type:"object",properties:{jql:{type:"string",description:'JQL query string, e.g. "project = PROJ AND status = Open"'},maxResults:{type:"number",description:"Max results to return (default 20)"}},required:["jql"]}},{name:"jira_get_issue",description:"Get details of a specific Jira issue",input_schema:{type:"object",properties:{issueKey:{type:"string",description:"Issue key, e.g. PROJ-123"}},required:["issueKey"]}},{name:"jira_create_issue",description:"Create a new Jira issue",input_schema:{type:"object",properties:{projectKey:{type:"string",description:"Project key, e.g. PROJ"},summary:{type:"string",description:"Issue title/summary"},issueType:{type:"string",description:"Issue type (default: Task). Common: Task, Bug, Story, Epic"},description:{type:"string",description:"Issue description. Markdown is rendered (headings, **bold**, `code`, lists, - [ ] tasks, links, tables, > quotes, > [!NOTE]/[!TIP]/[!WARNING]/[!CAUTION] panels)."},priority:{type:"string",description:"Priority name, e.g. High, Medium, Low"},labels:{type:"array",items:{type:"string"},description:"Array of label strings"},assigneeId:{type:"string",description:"Atlassian account ID to assign to"},moveToSprint:{type:"boolean",description:"If true, move created issue to a sprint and verify."},moveToActiveSprint:{type:"boolean",description:"Backward-compatible alias for moveToSprint."},sprintId:{type:"number",description:"Optional sprint id for placement."},sprintName:{type:"string",description:"Optional sprint name for placement."},target:{type:"string",description:"Placement target when sprintId/sprintName omitted: current|active|latest (default: current)."}},required:["projectKey","summary"]}},{name:"jira_list_sprints",description:"List sprints for a Jira project (returns sprint names, IDs, states, dates)",input_schema:{type:"object",properties:{projectKey:{type:"string",description:"Project key, e.g. PROJ"},state:{type:"string",description:"Filter: active, closed, future. Omit for all."}},required:["projectKey"]}},{name:"jira_get_sprint_issues",description:"Get all issues in a sprint, optionally filtered by status column name",input_schema:{type:"object",properties:{sprintName:{type:"string",description:"Sprint name (from jira_list_sprints). Use this OR sprintId."},sprintId:{type:"number",description:"Sprint ID (from jira_list_sprints). Use this OR sprintName."},projectKey:{type:"string",description:"Project key to scope the search (optional)"},status:{type:"string",description:'Filter by status name (e.g. "\u8FDB\u884C\u4E2D", "\u6D4B\u8BD5", "Done")'},maxResults:{type:"number",description:"Max issues to return (default 50)"}}}},{name:"jira_move_to_active_sprint",description:"Backward-compatible alias: move issue to sprint target and verify membership.",input_schema:{type:"object",properties:{issueKey:{type:"string",description:"Issue key, e.g. PROJ-123"},projectKey:{type:"string",description:"Optional project key. If omitted, inferred from issue."},sprintId:{type:"number",description:"Optional sprint id."},sprintName:{type:"string",description:"Optional sprint name."},target:{type:"string",description:"Target when sprintId/sprintName omitted: current|active|latest (default: current)."}},required:["issueKey"]}},{name:"jira_move_issue_to_sprint",description:"Move an issue to a sprint by id/name/target and verify membership.",input_schema:{type:"object",properties:{issueKey:{type:"string",description:"Issue key, e.g. PROJ-123"},projectKey:{type:"string",description:"Optional project key. If omitted, inferred from issue."},sprintId:{type:"number",description:"Optional sprint id."},sprintName:{type:"string",description:"Optional sprint name."},target:{type:"string",description:"Target when sprintId/sprintName omitted: current|active|latest (default: current)."}},required:["issueKey"]}},{name:"jira_get_comments",description:"Get comments on a Jira issue (newest first)",input_schema:{type:"object",properties:{issueKey:{type:"string",description:"Issue key, e.g. PROJ-123"},maxResults:{type:"number",description:"Max comments to return (default 50)"}},required:["issueKey"]}},{name:"jira_add_comment",description:"Add a comment to a Jira issue",input_schema:{type:"object",properties:{issueKey:{type:"string",description:"Issue key, e.g. PROJ-123"},body:{type:"string",description:"Comment text. Markdown is rendered: headings, **bold**, `code`, lists, - [ ] tasks, links, tables, > quotes, > [!NOTE]/[!TIP]/[!WARNING]/[!CAUTION] panels."}},required:["issueKey","body"]}},{name:"jira_edit_issue",description:"Update fields on a Jira issue (summary, description, story points, labels, priority). A string `description` is Markdown and is rendered.",input_schema:{type:"object",properties:{issueKey:{type:"string",description:"Issue key, e.g. PROJ-123"},fields:{type:"object",description:"Object of field names to values",additionalProperties:!0}},required:["issueKey","fields"]}},{name:"jira_transition_issue",description:"Move a Jira issue to a different status. Always pass toStatus when user gave a target; only pass issueKey alone when you explicitly need to list transitions.",input_schema:{type:"object",properties:{issueKey:{type:"string",description:"Issue key, e.g. PROJ-123"},transitionId:{type:"string",description:"Transition ID to perform (optional if toStatus is provided)"},toStatus:{type:"string",description:'Target status/column name (e.g. "\u5DF2\u7ECF\u9A8C\u6536", "Done", "In Progress"). If provided, tool resolves matching transition automatically.'}},required:["issueKey"]}}]};export{Je as jiraApiCall,h as jiraFetch,Ze as jiraSkill,Me as resolveJiraCredential};
73
+ 6. IMPORTANT: When target is clear, complete transition + verification in SAME turn. Do NOT stop after listing options.`,resolve(){let s=Pe();if(!s)return{command:null,args:[],env:{},description:this.description};let n={};for(let t of this.envKeys)process.env[t]&&(n[t]=process.env[t]);process.env.ATLASSIAN_INSTANCE_URL&&(n.ATLASSIAN_INSTANCE_URL=process.env.ATLASSIAN_INSTANCE_URL);for(let t of["JIRA_API_TOKEN","JIRA_EMAIL","JIRA_BASE_URL"])process.env[t]&&(n[t]=process.env[t]);return{type:"stdio",command:"node",args:[s,"../dist/jira.js","jiraSkill"],env:n,description:this.description}},async handleToolCall(s,n){try{switch(s){case"jira_list_projects":{let t=await g("/rest/api/3/project"),e=(Array.isArray(t)?t:[]).map(i=>({id:i.id,key:i.key,name:i.name,style:i.style}));return JSON.stringify({count:e.length,projects:e})}case"jira_list_statuses":{let{projectKey:t}=n||{};if(t){let r=await g(`/rest/api/3/project/${encodeURIComponent(t)}/statuses`),a=Array.isArray(r)?r:[],o=new Map;for(let l of a)for(let u of l.statuses||[])u?.id&&(o.has(u.id)||o.set(u.id,{id:u.id,name:u.name,category:u.statusCategory?.name||null}));let c=[...o.values()].sort((l,u)=>String(l.name).localeCompare(String(u.name)));return JSON.stringify({scope:"project",projectKey:t,count:c.length,statuses:c})}let e=await g("/rest/api/3/status"),i=(Array.isArray(e)?e:[]).map(r=>({id:r.id,name:r.name,category:r.statusCategory?.name||null})).sort((r,a)=>String(r.name).localeCompare(String(a.name)));return JSON.stringify({scope:"global",count:i.length,statuses:i})}case"jira_list_issue_types":{let{projectKey:t}=n||{};if(!t)return JSON.stringify({error:"projectKey is required"});let e=await re(t);return JSON.stringify({projectKey:t,count:e.length,issueTypes:e})}case"jira_search":{let t=n.jql||"",e=n.maxResults||20;t.replace(/\s*ORDER\s+BY\s+.*/i,"").trim()||(t=`created >= -365d ${t}`.trim());let r=`jql=${encodeURIComponent(t)}&maxResults=${e}&fields=summary,status,assignee,priority,updated,issuetype,project`,o=((await g(`/rest/api/3/search/jql?${r}`)).issues||[]).map(c=>({key:c.key,project:c.fields?.project?.key,summary:c.fields?.summary,status:c.fields?.status?.name,assignee:c.fields?.assignee?.displayName||"Unassigned",priority:c.fields?.priority?.name,type:c.fields?.issuetype?.name}));return JSON.stringify({count:o.length,issues:o})}case"jira_get_issue":{let t=n.issueKey;if(!t)return JSON.stringify({error:"issueKey is required"});let e=await g(`/rest/api/3/issue/${t}`);return JSON.stringify({key:e.key,project:e.fields?.project?.key,summary:e.fields?.summary,description:e.fields?.description?B(e.fields.description):e.fields?.description??null,status:e.fields?.status?.name,assignee:e.fields?.assignee?.displayName||"Unassigned",priority:e.fields?.priority?.name,type:e.fields?.issuetype?.name,labels:e.fields?.labels,created:e.fields?.created,updated:e.fields?.updated})}case"jira_create_issue":{let{projectKey:t,summary:e,issueType:i,description:r,priority:a,labels:o,assigneeId:c,moveToSprint:l,moveToActiveSprint:u,sprintId:d,sprintName:f,target:h}=n;if(!t||!e)return JSON.stringify({error:"projectKey and summary are required"});let p={requested:i||null,resolved:null,strategy:"none"},y=[];try{y=await re(t),p=qe(i,y)}catch{}let m={project:{key:t},summary:e,issuetype:p?.resolved?.id?{id:p.resolved.id}:{name:i||"Task"}};a&&(m.priority={name:a}),o?.length&&(m.labels=o),c&&(m.assignee={id:c});let I=r?await J(v=>g("/rest/api/3/issue",{method:"POST",body:{fields:{...m,description:v}}}),r):await g("/rest/api/3/issue",{method:"POST",body:{fields:m}}),k={ok:!0,key:I.key,id:I.id,self:I.self};return p?.resolved&&(k.issueType=p.resolved.name,k.issueTypeResolution=p.strategy,p.strategy!=="exact"&&p.requested&&T(p.requested)!==T(p.resolved.name)&&(k.issueTypeWarning=`Requested "${p.requested}" is not available in ${t}; used "${p.resolved.name}" instead.`)),y.length>0&&(k.availableIssueTypes=y.map(v=>v.name)),(l||u)&&(k.sprintMove=await D({issueKey:I.key,projectKey:t,sprintId:d,sprintName:f,target:h})),JSON.stringify(k)}case"jira_list_sprints":{let{projectKey:t,state:e}=n,i=await ie(t,e);return JSON.stringify({count:i.length,sprints:i})}case"jira_move_to_active_sprint":{let{issueKey:t,projectKey:e,sprintId:i,sprintName:r,target:a}=n||{},o=await D({issueKey:t,projectKey:e,sprintId:i,sprintName:r,target:a||"current"});return JSON.stringify(o)}case"jira_move_issue_to_sprint":{let{issueKey:t,projectKey:e,sprintId:i,sprintName:r,target:a}=n||{},o=await D({issueKey:t,projectKey:e,sprintId:i,sprintName:r,target:a});return JSON.stringify(o)}case"jira_get_sprint_issues":{let{sprintName:t,sprintId:e,projectKey:i,status:r,maxResults:a}=n;if(!t&&!e)return JSON.stringify({error:"sprintName or sprintId is required"});let o=a||50,c=e?`sprint = ${e}`:`sprint = "${t}"`,l=i?`project = ${i} AND `:"",u=r?` AND status = "${r}"`:"",d=`${l}${c}${u} ORDER BY status ASC, priority DESC`,f=`jql=${encodeURIComponent(d)}&maxResults=${o}&fields=summary,status,assignee,priority,issuetype,project`,h=await g(`/rest/api/3/search/jql?${f}`),p=(h.issues||[]).map(m=>({key:m.key,project:m.fields?.project?.key,summary:m.fields?.summary,status:m.fields?.status?.name,assignee:m.fields?.assignee?.displayName||"Unassigned",priority:m.fields?.priority?.name,type:m.fields?.issuetype?.name})),y={};for(let m of p)y[m.status]=(y[m.status]||0)+1;return JSON.stringify({count:p.length,total:h.total||p.length,statusCounts:y,issues:p})}case"jira_get_comments":{let{issueKey:t,maxResults:e}=n;if(!t)return JSON.stringify({error:"issueKey is required"});let r=await g(`/rest/api/3/issue/${t}/comment?maxResults=${e||50}&orderBy=-created`),a=(r.comments||[]).map(o=>{let c=o.body?.content?B(o.body):"";return{id:o.id,author:o.author?.displayName||"Unknown",body:c,created:o.created,updated:o.updated}});return JSON.stringify({count:a.length,total:r.total||a.length,comments:a})}case"jira_add_comment":{let{issueKey:t,body:e}=n;return!t||!e?JSON.stringify({error:"issueKey and body are required"}):(await J(i=>g(`/rest/api/3/issue/${t}/comment`,{method:"POST",body:{body:i}}),e),JSON.stringify({ok:!0,issueKey:t}))}case"jira_edit_issue":{let{issueKey:t,fields:e}=n;if(!t||!e)return JSON.stringify({error:"issueKey and fields are required"});if(typeof e.description=="string"){let{description:i,...r}=e;await J(a=>g(`/rest/api/3/issue/${t}`,{method:"PUT",body:{fields:{...r,description:a}}}),i)}else await g(`/rest/api/3/issue/${t}`,{method:"PUT",body:{fields:e}});return JSON.stringify({ok:!0,issueKey:t})}case"jira_transition_issue":{let{issueKey:t,transitionId:e,toStatus:i,statusName:r,status:a}=n;if(!t)return JSON.stringify({error:"issueKey is required"});let o=String(i||r||a||"").trim();if(!e&&!o){let d=((await g(`/rest/api/3/issue/${t}/transitions`)).transitions||[]).map(f=>({id:f.id,name:f.name,to:f.to?.name}));return JSON.stringify({ok:!1,error:"transitionId or toStatus is required",issueKey:t,availableTransitions:d})}let c=e;if(!c){let d=(await g(`/rest/api/3/issue/${t}/transitions`)).transitions||[],f=O(o),h=d.find(p=>O(p?.name||"")===f||O(p?.to?.name||"")===f);if(!h){let p=U(o);p.length>=2&&(h=d.find(y=>{let m=U(y?.name||""),I=U(y?.to?.name||""),k=m.length>=2&&(m.includes(p)||p.includes(m)),v=I.length>=2&&(I.includes(p)||p.includes(I));return k||v}))}if(!h){let p=d.map(k=>{let v=L(o,k?.name||""),oe=L(o,k?.to?.name||"");return{t:k,score:Math.max(v,oe)}}).sort((k,v)=>v.score-k.score),y=p[0],m=p[1];y&&y.score>=.45&&(!m||y.score-m.score>=.12)&&(h=y.t)}if(!h?.id)return JSON.stringify({ok:!1,error:`No transition matches target status: "${o}"`,issueKey:t,availableTransitions:d.map(p=>({id:p.id,name:p.name,to:p.to?.name}))});c=h.id}await g(`/rest/api/3/issue/${t}/transitions`,{method:"POST",body:{transition:{id:c}}});let l=await g(`/rest/api/3/issue/${t}?fields=status`);return JSON.stringify({ok:!0,issueKey:t,transitionId:c,statusAfter:l?.fields?.status?.name||null})}default:return JSON.stringify({error:`Unknown tool: ${s}`})}}catch(t){return JSON.stringify({error:t.message})}},tools:[{name:"jira_list_projects",description:"List all Jira projects accessible to the user",input_schema:{type:"object",properties:{}}},{name:"jira_list_statuses",description:"List Jira statuses. Use projectKey to get statuses applicable in that project workflow.",input_schema:{type:"object",properties:{projectKey:{type:"string",description:"Optional project key (e.g. PROJ). If omitted, returns global status catalog."}}}},{name:"jira_list_issue_types",description:"List issue types allowed for issue creation in the given project.",input_schema:{type:"object",properties:{projectKey:{type:"string",description:"Project key, e.g. PROJ"}},required:["projectKey"]}},{name:"jira_search",description:"Search Jira issues using JQL",input_schema:{type:"object",properties:{jql:{type:"string",description:'JQL query string, e.g. "project = PROJ AND status = Open"'},maxResults:{type:"number",description:"Max results to return (default 20)"}},required:["jql"]}},{name:"jira_get_issue",description:"Get details of a specific Jira issue",input_schema:{type:"object",properties:{issueKey:{type:"string",description:"Issue key, e.g. PROJ-123"}},required:["issueKey"]}},{name:"jira_create_issue",description:"Create a new Jira issue",input_schema:{type:"object",properties:{projectKey:{type:"string",description:"Project key, e.g. PROJ"},summary:{type:"string",description:"Issue title/summary"},issueType:{type:"string",description:"Issue type (default: Task). Common: Task, Bug, Story, Epic"},description:{type:"string",description:"Issue description. Markdown is rendered (headings, **bold**, `code`, lists, - [ ] tasks, links, tables, > quotes, > [!NOTE]/[!TIP]/[!WARNING]/[!CAUTION] panels)."},priority:{type:"string",description:"Priority name, e.g. High, Medium, Low"},labels:{type:"array",items:{type:"string"},description:"Array of label strings"},assigneeId:{type:"string",description:"Atlassian account ID to assign to"},moveToSprint:{type:"boolean",description:"If true, move created issue to a sprint and verify."},moveToActiveSprint:{type:"boolean",description:"Backward-compatible alias for moveToSprint."},sprintId:{type:"number",description:"Optional sprint id for placement."},sprintName:{type:"string",description:"Optional sprint name for placement."},target:{type:"string",description:"Placement target when sprintId/sprintName omitted: current|active|latest (default: current)."}},required:["projectKey","summary"]}},{name:"jira_list_sprints",description:"List sprints for a Jira project (returns sprint names, IDs, states, dates)",input_schema:{type:"object",properties:{projectKey:{type:"string",description:"Project key, e.g. PROJ"},state:{type:"string",description:"Filter: active, closed, future. Omit for all."}},required:["projectKey"]}},{name:"jira_get_sprint_issues",description:"Get all issues in a sprint, optionally filtered by status column name",input_schema:{type:"object",properties:{sprintName:{type:"string",description:"Sprint name (from jira_list_sprints). Use this OR sprintId."},sprintId:{type:"number",description:"Sprint ID (from jira_list_sprints). Use this OR sprintName."},projectKey:{type:"string",description:"Project key to scope the search (optional)"},status:{type:"string",description:'Filter by status name (e.g. "\u8FDB\u884C\u4E2D", "\u6D4B\u8BD5", "Done")'},maxResults:{type:"number",description:"Max issues to return (default 50)"}}}},{name:"jira_move_to_active_sprint",description:"Backward-compatible alias: move issue to sprint target and verify membership.",input_schema:{type:"object",properties:{issueKey:{type:"string",description:"Issue key, e.g. PROJ-123"},projectKey:{type:"string",description:"Optional project key. If omitted, inferred from issue."},sprintId:{type:"number",description:"Optional sprint id."},sprintName:{type:"string",description:"Optional sprint name."},target:{type:"string",description:"Target when sprintId/sprintName omitted: current|active|latest (default: current)."}},required:["issueKey"]}},{name:"jira_move_issue_to_sprint",description:"Move an issue to a sprint by id/name/target and verify membership.",input_schema:{type:"object",properties:{issueKey:{type:"string",description:"Issue key, e.g. PROJ-123"},projectKey:{type:"string",description:"Optional project key. If omitted, inferred from issue."},sprintId:{type:"number",description:"Optional sprint id."},sprintName:{type:"string",description:"Optional sprint name."},target:{type:"string",description:"Target when sprintId/sprintName omitted: current|active|latest (default: current)."}},required:["issueKey"]}},{name:"jira_get_comments",description:"Get comments on a Jira issue (newest first)",input_schema:{type:"object",properties:{issueKey:{type:"string",description:"Issue key, e.g. PROJ-123"},maxResults:{type:"number",description:"Max comments to return (default 50)"}},required:["issueKey"]}},{name:"jira_add_comment",description:"Add a comment to a Jira issue",input_schema:{type:"object",properties:{issueKey:{type:"string",description:"Issue key, e.g. PROJ-123"},body:{type:"string",description:"Comment text. Markdown is rendered: headings, **bold**, `code`, lists, - [ ] tasks, links, tables, > quotes, > [!NOTE]/[!TIP]/[!WARNING]/[!CAUTION] panels."}},required:["issueKey","body"]}},{name:"jira_edit_issue",description:"Update fields on a Jira issue (summary, description, story points, labels, priority). A string `description` is Markdown and is rendered.",input_schema:{type:"object",properties:{issueKey:{type:"string",description:"Issue key, e.g. PROJ-123"},fields:{type:"object",description:"Object of field names to values",additionalProperties:!0}},required:["issueKey","fields"]}},{name:"jira_transition_issue",description:"Move a Jira issue to a different status. Always pass toStatus when user gave a target; only pass issueKey alone when you explicitly need to list transitions.",input_schema:{type:"object",properties:{issueKey:{type:"string",description:"Issue key, e.g. PROJ-123"},transitionId:{type:"string",description:"Transition ID to perform (optional if toStatus is provided)"},toStatus:{type:"string",description:'Target status/column name (e.g. "\u5DF2\u7ECF\u9A8C\u6536", "Done", "In Progress"). If provided, tool resolves matching transition automatically.'}},required:["issueKey"]}}]};export{Ue as jiraApiCall,g as jiraFetch,tt as jiraSkill,Je as resolveJiraCredential};
@@ -0,0 +1,18 @@
1
+ /**
2
+ * The rule files of a repository a tool has just checked out (CLAUDE.md,
3
+ * AGENTS.md, .cursor/rules, …), for the tool's answer.
4
+ *
5
+ * A run's model nodes receive the rule files of the working tree they START in
6
+ * (@zibby/agent-workflow repository-rules, rendered by invokeAgent). A
7
+ * repository cloned DURING a node is not there yet at that moment, so the clone
8
+ * tool hands its rules back in its own answer — the same collector and the same
9
+ * rendering, whatever vendor reads the answer.
10
+ *
11
+ * A namespace import on purpose: an engine installed beside this skill that
12
+ * predates the collector simply yields '' instead of failing the clone.
13
+ */
14
+ export declare function checkedOutRepositoryRules(dir: string): Promise<string>;
15
+ /** The answer's field, present only when the repository carries rule files. */
16
+ export declare function repositoryRulesField(dir: string): Promise<{
17
+ repositoryRules?: string;
18
+ }>;
@@ -0,0 +1 @@
1
+ async function t(r){try{let e=await import("@zibby/agent-workflow");return typeof e.collectRepositoryRules!="function"||typeof e.renderRepositoryRules!="function"?"":e.renderRepositoryRules(e.collectRepositoryRules([{dir:r,declared:!0}]))||""}catch{return""}}async function o(r){let e=await t(r);return e?{repositoryRules:e}:{}}export{t as checkedOutRepositoryRules,o as repositoryRulesField};
@@ -42,7 +42,9 @@
42
42
  * bullets, `1.`/`1)` ordered lists, `- [ ]`/`- [x]` task items, `[text](url)`
43
43
  * + bare URLs, `---` rules, `> ` blockquotes, GitHub-style alert panels
44
44
  * (`> [!NOTE]` / `[!TIP]` / `[!IMPORTANT]` / `[!WARNING]` / `[!CAUTION]` →
45
- * ADF panel info / success / note / warning / error), and simple GFM tables.
45
+ * ADF panel info / success / note / warning / error; on Vikunja, which has no
46
+ * panel, a one-cell table in the panel's colour — see `PANEL_LOOK`), and simple
47
+ * GFM tables.
46
48
  * Anything else is text. NOTHING HERE THROWS: every entry point catches and
47
49
  * degrades to the plain one-paragraph-per-line shape, because a render failure
48
50
  * that lost a comment would be strictly worse than the ugliness it fixes.
@@ -1,22 +1,24 @@
1
- var rt={NOTE:"info",TIP:"success",IMPORTANT:"note",WARNING:"warning",CAUTION:"error"},j={info:"NOTE",success:"TIP",note:"IMPORTANT",warning:"WARNING",error:"CAUTION"},ot=2e5,nt=6,ct=/^```([A-Za-z0-9_+.-]{0,32})\s*$/,it=/^(#{1,6})[ \t]+(.*?)\s*$/,at=/^(?:-{3,}|\*{3,}|_{3,})\s*$/,z=/^>(?: ?(.*))?$/,W=/^[-*][ \t]+\[([ xX])\][ \t]+(.*)$/,X=/^[-*][ \t]+(.*)$/,F=/^(\d{1,3})[.)][ \t]+(.*)$/,Z=/^\|.*\|\s*$/,lt=/^\|?\s*:?-{1,}:?\s*(?:\|\s*:?-{1,}:?\s*)*\|?\s*$/,pt=/^\[!(NOTE|TIP|IMPORTANT|WARNING|CAUTION)\]\s*$/i;function Q(s){let t=s.trim().replace(/^\|/,"").replace(/\|$/,""),e=[],n="";for(let r=0;r<t.length;r++){let o=t[r];if(o==="\\"&&t[r+1]==="|"){n+="|",r++;continue}if(o==="|"){e.push(n.trim()),n="";continue}n+=o}return e.push(n.trim()),e}function P(s){let e=String(s??"").slice(0,ot).replace(/\r\n?/g,`
1
+ var it={NOTE:"info",TIP:"success",IMPORTANT:"note",WARNING:"warning",CAUTION:"error"},rt={info:"NOTE",success:"TIP",note:"IMPORTANT",warning:"WARNING",error:"CAUTION"},P={info:{bg:"rgba(88, 140, 245, 0.16)",rgb:[88,140,245],icon:"\u2139\uFE0F"},note:{bg:"rgba(160, 120, 240, 0.16)",rgb:[160,120,240],icon:"\u{1F4DD}"},warning:{bg:"rgba(236, 170, 60, 0.15)",rgb:[236,170,60],icon:"\u26A0\uFE0F"},success:{bg:"rgba(70, 190, 125, 0.16)",rgb:[70,190,125],icon:"\u2705"},error:{bg:"rgba(235, 90, 80, 0.15)",rgb:[235,90,80],icon:"\u26D4"}},lt=Object.keys(P),pt=2e5,ot=6,ut=/^```([A-Za-z0-9_+.-]{0,32})\s*$/,ht=/^(#{1,6})[ \t]+(.*?)\s*$/,ft=/^(?:-{3,}|\*{3,}|_{3,})\s*$/,X=/^>(?: ?(.*))?$/,D=/^[-*][ \t]+\[([ xX])\][ \t]+(.*)$/,Z=/^[-*][ \t]+(.*)$/,Q=/^(\d{1,3})[.)][ \t]+(.*)$/,J=/^\|.*\|\s*$/,dt=/^\|?\s*:?-{1,}:?\s*(?:\|\s*:?-{1,}:?\s*)*\|?\s*$/,gt=/^\[!(NOTE|TIP|IMPORTANT|WARNING|CAUTION)\]\s*$/i;function V(s){let t=s.trim().replace(/^\|/,"").replace(/\|$/,""),n=[],e="";for(let r=0;r<t.length;r++){let o=t[r];if(o==="\\"&&t[r+1]==="|"){e+="|",r++;continue}if(o==="|"){n.push(e.trim()),e="";continue}e+=o}return n.push(e.trim()),n}function M(s){let n=String(s??"").slice(0,pt).replace(/\r\n?/g,`
2
2
  `).split(`
3
- `);return K(e,0)}function K(s,t){let e=[],n=0;for(;n<s.length;){let r=s[n];if(r.trim()===""){n++;continue}if(/^[ \t]/.test(r)){e.push({t:"paragraph",c:k(r)}),n++;continue}let o;if(o=ct.exec(r)){let a=o[1]||"",i=[];for(n++;n<s.length&&!/^```\s*$/.test(s[n]);)i.push(s[n]),n++;n++,e.push({t:"code",lang:a,v:i.join(`
4
- `)});continue}if(at.test(r)){e.push({t:"rule"}),n++;continue}if(o=it.exec(r)){let a=Math.min(nt,o[1].length);e.push({t:"heading",level:a,c:k(o[2])}),n++;continue}if(z.test(r)&&t<3){let a=[];for(;n<s.length&&(o=z.exec(s[n]));)a.push(o[1]??""),n++;let i=a.findIndex(l=>l.trim()!==""),h=i>=0?pt.exec(a[i].trim()):null;if(h){let l=rt[h[1].toUpperCase()];e.push({t:"panel",kind:l,c:K(a.slice(i+1),t+1)})}else e.push({t:"quote",c:K(a,t+1)});continue}if(W.test(r)){let a=[];for(;n<s.length&&(o=W.exec(s[n]));)a.push({checked:o[1]!==" ",c:k(o[2])}),n++;e.push({t:"task",items:a});continue}if(X.test(r)){let a=[];for(;n<s.length&&!W.test(s[n])&&(o=X.exec(s[n]));)a.push([{t:"paragraph",c:k(o[1])}]),n++;e.push({t:"bullet",items:a});continue}if(o=F.exec(r)){let a=Math.max(1,parseInt(o[1],10)||1),i=[];for(;n<s.length&&(o=F.exec(s[n]));)i.push([{t:"paragraph",c:k(o[2])}]),n++;e.push({t:"ordered",start:a,items:i});continue}if(Z.test(r)&&n+1<s.length&&lt.test(s[n+1])){let a=Q(r).map(k);n+=2;let i=[];for(;n<s.length&&Z.test(s[n]);)i.push(Q(s[n]).map(k)),n++;e.push({t:"table",header:a,rows:i});continue}e.push({t:"paragraph",c:k(r)}),n++}return e}var ut=/^https?:\/\/[^\s<>()[\]]+/,ht=/^\[([^\]\n]{1,300})\]\((https?:\/\/[^\s)]{1,2000})\)/,ft=/[.,;:!?'"]+$/;function dt(s,t){return t<=0?!0:/[\s([{"'“‘>:—–-]/.test(s[t-1])}function kt(s,t){return t>=s.length?!0:/[\s)\]}"'”’.,;:!?—–-]/.test(s[t])}function gt(s,t,e){let n=t;for(;n<s.length;){let r=s.indexOf(e,n);if(r<0)return-1;let o=s[r-1],a=s[r+e.length],i=e.length===1&&(o===e||a===e);if(r>t&&o&&!/\s/.test(o)&&!i&&kt(s,r+e.length))return r;n=r+1}return-1}function k(s){let t=String(s??""),e=[],n="",r=()=>{n&&(e.push({t:"text",v:n}),n="")},o=0;for(;o<t.length;){let a=t[o];if(a==="`"){let i=1;for(;t[o+i]==="`";)i++;let h="`".repeat(i),l=t.indexOf(h,o+i);if(l>o+i-1&&l!==-1){let c=t.slice(o+i,l);if(c.trim()){r(),e.push({t:"code",v:c.length>1&&c.startsWith(" ")&&c.endsWith(" ")?c.slice(1,-1):c}),o=l+i;continue}}n+=h,o+=i;continue}if(a==="["){let i=ht.exec(t.slice(o));if(i){r(),e.push({t:"link",href:i[2],c:k(i[1])}),o+=i[0].length;continue}}if((a==="*"||a==="_"||a==="~")&&dt(t,o)){let i=t[o+1]===a;if(a==="~"&&!i){n+=a,o++;continue}let h=i?a+a:a,l=o+h.length;if(l<t.length&&!/\s/.test(t[l])){let c=gt(t,l,h);if(c>l){r();let p=k(t.slice(l,c));e.push(a==="~"?{t:"strike",c:p}:i?{t:"strong",c:p}:{t:"em",c:p}),o=c+h.length;continue}}}if(a==="h"&&(o===0||/[\s(<]/.test(t[o-1]))){let i=ut.exec(t.slice(o));if(i){let h=i[0],l=ft.exec(h);if(l&&(h=h.slice(0,-l[0].length)),h.length>8){r(),e.push({t:"link",href:h,c:[{t:"text",v:h}]}),o+=h.length;continue}}}n+=a,o++}return r(),e}function R(s,t=[]){let e=[];for(let n of s)switch(n.t){case"text":n.v&&e.push({type:"text",text:n.v,...t.length?{marks:t}:{}});break;case"br":e.push({type:"hardBreak"});break;case"code":e.push({type:"text",text:n.v,marks:[{type:"code"},...t.filter(r=>r.type==="link")]});break;case"strong":e.push(...R(n.c,O(t,{type:"strong"})));break;case"em":e.push(...R(n.c,O(t,{type:"em"})));break;case"strike":e.push(...R(n.c,O(t,{type:"strike"})));break;case"link":e.push(...R(n.c,O(t,{type:"link",attrs:{href:n.href}})));break}return e}function O(s,t){return s.some(e=>e.type===t.type)?s:[...s,t]}var D=0;function J(){return D=(D+1)%1e6,`m${Date.now().toString(36)}-${D}`}var L=s=>{let t=R(s);return t.length?{type:"paragraph",content:t}:{type:"paragraph"}};function N(s,t){let e=[];for(let n of s)switch(n.t){case"paragraph":e.push(L(n.c));break;case"heading":if(t==="quote"||t==="item")e.push(L([{t:"strong",c:n.c}]));else{let r=R(n.c);r.length&&e.push({type:"heading",attrs:{level:n.level},content:r})}break;case"bullet":e.push({type:"bulletList",content:n.items.map(r=>({type:"listItem",content:C(N(r,"item"))}))});break;case"ordered":e.push({type:"orderedList",attrs:{order:n.start},content:n.items.map(r=>({type:"listItem",content:C(N(r,"item"))}))});break;case"task":t==="quote"||t==="item"?e.push({type:"bulletList",content:n.items.map(r=>({type:"listItem",content:[L([{t:"text",v:r.checked?"\u2611 ":"\u2610 "},...r.c])]}))}):e.push({type:"taskList",attrs:{localId:J()},content:n.items.map(r=>({type:"taskItem",attrs:{localId:J(),state:r.checked?"DONE":"TODO"},content:mt(R(r.c))}))});break;case"code":e.push({type:"codeBlock",attrs:n.lang?{language:n.lang}:{},...n.v?{content:[{type:"text",text:n.v}]}:{}});break;case"quote":t==="quote"||t==="item"?e.push(...N(n.c,t)):e.push({type:"blockquote",content:C(N(n.c,"quote"))});break;case"panel":t!=="doc"?e.push(...N(n.c,t)):e.push({type:"panel",attrs:{panelType:n.kind},content:C(N(n.c,"panel"))});break;case"rule":if(t==="quote"||t==="item")break;e.push({type:"rule"});break;case"table":{if(t!=="doc"){for(let o of[...n.header?[n.header]:[],...n.rows])e.push(L(bt(o)));break}let r=[];n.header&&r.push({type:"tableRow",content:n.header.map(o=>({type:"tableHeader",attrs:{},content:[L(o)]}))});for(let o of n.rows)r.push({type:"tableRow",content:o.map(a=>({type:"tableCell",attrs:{},content:[L(a)]}))});r.length&&e.push({type:"table",attrs:{isNumberColumnEnabled:!1,layout:"default"},content:r});break}}return e}function C(s){return s.length?s:[{type:"paragraph"}]}function mt(s){return s.length?s:[{type:"text",text:" "}]}function bt(s){let t=[];return s.forEach((e,n)=>{n&&t.push({t:"text",v:" \xB7 "}),t.push(...e)}),t}function xt(s){return{type:"doc",version:1,content:String(s??"").split(`
5
- `).map(t=>({type:"paragraph",...t?{content:[{type:"text",text:t}]}:{}}))}}function Nt(s){try{let t=N(P(s),"doc");return{type:"doc",version:1,content:t.length?t:[{type:"paragraph"}]}}catch{return xt(s)}}function B(s){return s.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function I(s){let t="";for(let e of s)switch(e.t){case"text":t+=B(e.v);break;case"br":t+="<br>";break;case"code":t+=`<code>${B(e.v)}</code>`;break;case"strong":t+=`<strong>${I(e.c)}</strong>`;break;case"em":t+=`<em>${I(e.c)}</em>`;break;case"strike":t+=`<s>${I(e.c)}</s>`;break;case"link":t+=`<a href="${B(e.href)}" target="_blank" rel="noopener noreferrer">${I(e.c)}</a>`;break}return t}function yt(s){return s.length&&s[0].t==="text"&&/^ /.test(s[0].v)?[{t:"text",v:`\xA0${s[0].v.slice(1)}`},...s.slice(1)]:s}function q(s){let t="";for(let e of s)switch(e.t){case"paragraph":t+=`<p>${I(yt(e.c))}</p>`;break;case"heading":t+=`<h${e.level}>${I(e.c)}</h${e.level}>`;break;case"bullet":t+=`<ul>${e.items.map(n=>`<li>${q(n)}</li>`).join("")}</ul>`;break;case"ordered":t+=`<ol${e.start!==1?` start="${e.start}"`:""}>${e.items.map(n=>`<li>${q(n)}</li>`).join("")}</ol>`;break;case"task":t+=`<ul data-type="taskList">${e.items.map(n=>`<li data-type="taskItem" data-checked="${n.checked?"true":"false"}"><label><input type="checkbox"${n.checked?' checked="checked"':""}><span></span></label><div><p>${I(n.c)}</p></div></li>`).join("")}</ul>`;break;case"code":t+=`<pre><code${e.lang?` class="language-${B(e.lang)}"`:""}>${B(e.v)}</code></pre>`;break;case"quote":t+=`<blockquote>${q(e.c)}</blockquote>`;break;case"panel":t+=`<blockquote><p><strong>${j[e.kind][0]}${j[e.kind].slice(1).toLowerCase()}</strong></p>${q(e.c)}</blockquote>`;break;case"rule":t+="<hr>";break;case"table":{let n="<table><tbody>";e.header&&(n+=`<tr>${e.header.map(r=>`<th><p>${I(r)}</p></th>`).join("")}</tr>`);for(let r of e.rows)n+=`<tr>${r.map(o=>`<td><p>${I(o)}</p></td>`).join("")}</tr>`;t+=`${n}</tbody></table>`;break}}return t}function Et(s){try{return q(P(s))||`<p>${B(String(s??""))}</p>`}catch{return String(s??"").split(`
6
- `).map(t=>`<p>${B(t)}</p>`).join("")}}function A(s){let t="";for(let e of s)switch(e.t){case"text":t+=e.v;break;case"br":t+=`
7
- `;break;case"code":t+=`\`${e.v}\``;break;case"strong":t+=`**${A(e.c)}**`;break;case"em":t+=`_${A(e.c)}_`;break;case"strike":t+=`~~${A(e.c)}~~`;break;case"link":{let n=A(e.c);t+=!n||n===e.href?e.href:`[${n}](${e.href})`;break}}return t}function $(s){let t="";for(let e of s)switch(e.t){case"paragraph":t+=`${A(e.c)}
8
- `;break;case"heading":t+=`${"#".repeat(Math.max(1,Math.min(nt,e.level)))} ${A(e.c)}
9
- `;break;case"bullet":for(let n of e.items)t+=`- ${$(n).trim()}
10
- `;break;case"ordered":e.items.forEach((n,r)=>{t+=`${e.start+r}. ${$(n).trim()}
11
- `});break;case"task":for(let n of e.items)t+=`- [${n.checked?"x":" "}] ${A(n.c)}
3
+ `);return G(n,0)}function G(s,t){let n=[],e=0;for(;e<s.length;){let r=s[e];if(r.trim()===""){e++;continue}if(/^[ \t]/.test(r)){n.push({t:"paragraph",c:m(r)}),e++;continue}let o;if(o=ut.exec(r)){let c=o[1]||"",a=[];for(e++;e<s.length&&!/^```\s*$/.test(s[e]);)a.push(s[e]),e++;e++,n.push({t:"code",lang:c,v:a.join(`
4
+ `)});continue}if(ft.test(r)){n.push({t:"rule"}),e++;continue}if(o=ht.exec(r)){let c=Math.min(ot,o[1].length);n.push({t:"heading",level:c,c:m(o[2])}),e++;continue}if(X.test(r)&&t<3){let c=[];for(;e<s.length&&(o=X.exec(s[e]));)c.push(o[1]??""),e++;let a=c.findIndex(l=>l.trim()!==""),f=a>=0?gt.exec(c[a].trim()):null;if(f){let l=it[f[1].toUpperCase()];n.push({t:"panel",kind:l,c:G(c.slice(a+1),t+1)})}else n.push({t:"quote",c:G(c,t+1)});continue}if(D.test(r)){let c=[];for(;e<s.length&&(o=D.exec(s[e]));)c.push({checked:o[1]!==" ",c:m(o[2])}),e++;n.push({t:"task",items:c});continue}if(Z.test(r)){let c=[];for(;e<s.length&&!D.test(s[e])&&(o=Z.exec(s[e]));)c.push([{t:"paragraph",c:m(o[1])}]),e++;n.push({t:"bullet",items:c});continue}if(o=Q.exec(r)){let c=Math.max(1,parseInt(o[1],10)||1),a=[];for(;e<s.length&&(o=Q.exec(s[e]));)a.push([{t:"paragraph",c:m(o[2])}]),e++;n.push({t:"ordered",start:c,items:a});continue}if(J.test(r)&&e+1<s.length&&dt.test(s[e+1])){let c=V(r).map(m);e+=2;let a=[];for(;e<s.length&&J.test(s[e]);)a.push(V(s[e]).map(m)),e++;n.push({t:"table",header:c,rows:a});continue}n.push({t:"paragraph",c:m(r)}),e++}return n}var kt=/^https?:\/\/[^\s<>()[\]]+/,mt=/^\[([^\]\n]{1,300})\]\((https?:\/\/[^\s)]{1,2000})\)/,bt=/[.,;:!?'"]+$/;function xt(s,t){return t<=0?!0:/[\s([{"'“‘>:—–-]/.test(s[t-1])}function yt(s,t){return t>=s.length?!0:/[\s)\]}"'”’.,;:!?—–-]/.test(s[t])}function $t(s,t,n){let e=t;for(;e<s.length;){let r=s.indexOf(n,e);if(r<0)return-1;let o=s[r-1],c=s[r+n.length],a=n.length===1&&(o===n||c===n);if(r>t&&o&&!/\s/.test(o)&&!a&&yt(s,r+n.length))return r;e=r+1}return-1}function m(s){let t=String(s??""),n=[],e="",r=()=>{e&&(n.push({t:"text",v:e}),e="")},o=0;for(;o<t.length;){let c=t[o];if(c==="`"){let a=1;for(;t[o+a]==="`";)a++;let f="`".repeat(a),l=t.indexOf(f,o+a);if(l>o+a-1&&l!==-1){let i=t.slice(o+a,l);if(i.trim()){r(),n.push({t:"code",v:i.length>1&&i.startsWith(" ")&&i.endsWith(" ")?i.slice(1,-1):i}),o=l+a;continue}}e+=f,o+=a;continue}if(c==="["){let a=mt.exec(t.slice(o));if(a){r(),n.push({t:"link",href:a[2],c:m(a[1])}),o+=a[0].length;continue}}if((c==="*"||c==="_"||c==="~")&&xt(t,o)){let a=t[o+1]===c;if(c==="~"&&!a){e+=c,o++;continue}let f=a?c+c:c,l=o+f.length;if(l<t.length&&!/\s/.test(t[l])){let i=$t(t,l,f);if(i>l){r();let p=m(t.slice(l,i));n.push(c==="~"?{t:"strike",c:p}:a?{t:"strong",c:p}:{t:"em",c:p}),o=i+f.length;continue}}}if(c==="h"&&(o===0||/[\s(<]/.test(t[o-1]))){let a=kt.exec(t.slice(o));if(a){let f=a[0],l=bt.exec(f);if(l&&(f=f.slice(0,-l[0].length)),f.length>8){r(),n.push({t:"link",href:f,c:[{t:"text",v:f}]}),o+=f.length;continue}}}e+=c,o++}return r(),n}function E(s,t=[]){let n=[];for(let e of s)switch(e.t){case"text":e.v&&n.push({type:"text",text:e.v,...t.length?{marks:t}:{}});break;case"br":n.push({type:"hardBreak"});break;case"code":n.push({type:"text",text:e.v,marks:[{type:"code"},...t.filter(r=>r.type==="link")]});break;case"strong":n.push(...E(e.c,C(t,{type:"strong"})));break;case"em":n.push(...E(e.c,C(t,{type:"em"})));break;case"strike":n.push(...E(e.c,C(t,{type:"strike"})));break;case"link":n.push(...E(e.c,C(t,{type:"link",attrs:{href:e.href}})));break}return n}function C(s,t){return s.some(n=>n.type===t.type)?s:[...s,t]}var U=0;function Y(){return U=(U+1)%1e6,`m${Date.now().toString(36)}-${U}`}var L=s=>{let t=E(s);return t.length?{type:"paragraph",content:t}:{type:"paragraph"}};function N(s,t){let n=[];for(let e of s)switch(e.t){case"paragraph":n.push(L(e.c));break;case"heading":if(t==="quote"||t==="item")n.push(L([{t:"strong",c:e.c}]));else{let r=E(e.c);r.length&&n.push({type:"heading",attrs:{level:e.level},content:r})}break;case"bullet":n.push({type:"bulletList",content:e.items.map(r=>({type:"listItem",content:j(N(r,"item"))}))});break;case"ordered":n.push({type:"orderedList",attrs:{order:e.start},content:e.items.map(r=>({type:"listItem",content:j(N(r,"item"))}))});break;case"task":t==="quote"||t==="item"?n.push({type:"bulletList",content:e.items.map(r=>({type:"listItem",content:[L([{t:"text",v:r.checked?"\u2611 ":"\u2610 "},...r.c])]}))}):n.push({type:"taskList",attrs:{localId:Y()},content:e.items.map(r=>({type:"taskItem",attrs:{localId:Y(),state:r.checked?"DONE":"TODO"},content:vt(E(r.c))}))});break;case"code":n.push({type:"codeBlock",attrs:e.lang?{language:e.lang}:{},...e.v?{content:[{type:"text",text:e.v}]}:{}});break;case"quote":t==="quote"||t==="item"?n.push(...N(e.c,t)):t==="panel"?n.push(...z(e).map(r=>({type:"paragraph",content:[{type:"text",text:r}]}))):n.push({type:"blockquote",content:j(N(e.c,"quote"))});break;case"panel":t==="panel"?n.push(...z(e).map(r=>({type:"paragraph",content:[{type:"text",text:r}]}))):t!=="doc"?n.push(...N(e.c,t)):n.push({type:"panel",attrs:{panelType:e.kind},content:j(N(e.c,"panel"))});break;case"rule":if(t==="quote"||t==="item")break;n.push({type:"rule"});break;case"table":{if(t!=="doc"){for(let o of[...e.header?[e.header]:[],...e.rows])n.push(L(ct(o)));break}let r=[];e.header&&r.push({type:"tableRow",content:e.header.map(o=>({type:"tableHeader",attrs:{},content:[L(o)]}))});for(let o of e.rows)r.push({type:"tableRow",content:o.map(c=>({type:"tableCell",attrs:{},content:[L(c)]}))});r.length&&n.push({type:"table",attrs:{isNumberColumnEnabled:!1,layout:"default"},content:r});break}}return n}function j(s){return s.length?s:[{type:"paragraph"}]}function z(s){return $([s]).replace(/\n$/,"").split(`
5
+ `).filter(t=>t!=="")}function vt(s){return s.length?s:[{type:"text",text:" "}]}function ct(s){let t=[];return s.forEach((n,e)=>{e&&t.push({t:"text",v:" \xB7 "}),t.push(...n)}),t}function It(s){return{type:"doc",version:1,content:String(s??"").split(`
6
+ `).map(t=>({type:"paragraph",...t?{content:[{type:"text",text:t}]}:{}}))}}function St(s){try{let t=N(M(s),"doc");return{type:"doc",version:1,content:t.length?t:[{type:"paragraph"}]}}catch{return It(s)}}function w(s){return s.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function I(s){let t="";for(let n of s)switch(n.t){case"text":t+=w(n.v);break;case"br":t+="<br>";break;case"code":t+=`<code>${w(n.v)}</code>`;break;case"strong":t+=`<strong>${I(n.c)}</strong>`;break;case"em":t+=`<em>${I(n.c)}</em>`;break;case"strike":t+=`<s>${I(n.c)}</s>`;break;case"link":t+=`<a href="${w(n.href)}" target="_blank" rel="noopener noreferrer">${I(n.c)}</a>`;break}return t}function Tt(s){return s.length&&s[0].t==="text"&&/^ /.test(s[0].v)?[{t:"text",v:`\xA0${s[0].v.slice(1)}`},...s.slice(1)]:s}function O(s,t=!0){let n="";for(let e of s)switch(e.t){case"paragraph":n+=`<p>${I(Tt(e.c))}</p>`;break;case"heading":n+=`<h${e.level}>${I(e.c)}</h${e.level}>`;break;case"bullet":n+=`<ul>${e.items.map(r=>`<li>${O(r,!1)}</li>`).join("")}</ul>`;break;case"ordered":n+=`<ol${e.start!==1?` start="${e.start}"`:""}>${e.items.map(r=>`<li>${O(r,!1)}</li>`).join("")}</ol>`;break;case"task":n+=`<ul data-type="taskList">${e.items.map(r=>`<li data-type="taskItem" data-checked="${r.checked?"true":"false"}"><label><input type="checkbox"${r.checked?' checked="checked"':""}><span></span></label><div><p>${I(r.c)}</p></div></li>`).join("")}</ul>`;break;case"code":n+=`<pre><code${e.lang?` class="language-${w(e.lang)}"`:""}>${w(e.v)}</code></pre>`;break;case"quote":n+=`<blockquote>${O(e.c,!1)}</blockquote>`;break;case"panel":{if(!t){n+=z(e).map(l=>`<p>${w(l)}</p>`).join("");break}let r=P[e.kind],o=e.c.flatMap(l=>l.t==="table"?[...l.header?[l.header]:[],...l.rows].map(i=>({t:"paragraph",c:ct(i)})):[l]),[c,...a]=o,f=c&&c.t==="heading"?[{...c,c:[{t:"text",v:`${r.icon} `},...c.c]},...a]:o;n+=`<table><tbody><tr><td data-background-color="${r.bg}" style="background-color: ${r.bg}">${O(f,!1)||"<p></p>"}</td></tr></tbody></table>`;break}case"rule":n+="<hr>";break;case"table":{let r="<table><tbody>";e.header&&(r+=`<tr>${e.header.map(o=>`<th><p>${I(o)}</p></th>`).join("")}</tr>`);for(let o of e.rows)r+=`<tr>${o.map(c=>`<td><p>${I(c)}</p></td>`).join("")}</tr>`;n+=`${r}</tbody></table>`;break}}return n}function _t(s){try{return O(M(s))||`<p>${w(String(s??""))}</p>`}catch{return String(s??"").split(`
7
+ `).map(t=>`<p>${w(t)}</p>`).join("")}}function A(s){let t="";for(let n of s)switch(n.t){case"text":t+=n.v;break;case"br":t+=`
8
+ `;break;case"code":t+=`\`${n.v}\``;break;case"strong":t+=`**${A(n.c)}**`;break;case"em":t+=`_${A(n.c)}_`;break;case"strike":t+=`~~${A(n.c)}~~`;break;case"link":{let e=A(n.c);t+=!e||e===n.href?n.href:`[${e}](${n.href})`;break}}return t}function $(s){let t="",n=!1;for(let e of s){let r=e.t==="quote"||e.t==="panel";switch(r&&n&&(t+=`
9
+ `),n=r,e.t){case"paragraph":t+=`${A(e.c)}
10
+ `;break;case"heading":t+=`${"#".repeat(Math.max(1,Math.min(ot,e.level)))} ${A(e.c)}
11
+ `;break;case"bullet":for(let o of e.items)t+=`- ${$(o).trim()}
12
+ `;break;case"ordered":e.items.forEach((o,c)=>{t+=`${e.start+c}. ${$(o).trim()}
13
+ `});break;case"task":for(let o of e.items)t+=`- [${o.checked?"x":" "}] ${A(o.c)}
12
14
  `;break;case"code":t+=`\`\`\`${e.lang}
13
15
  ${e.v}
14
16
  \`\`\`
15
- `;break;case"quote":t+=V($(e.c));break;case"panel":t+=`> [!${j[e.kind]}]
16
- ${V($(e.c))}`;break;case"rule":t+=`---
17
- `;break;case"table":{let n=r=>`| ${r.map(o=>A(o).replace(/\|/g,"\\|")).join(" | ")} |
18
- `;e.header&&(t+=n(e.header)+`|${e.header.map(()=>" --- |").join("")}
19
- `);for(let r of e.rows)t+=n(r);break}}return t}function st(s){return s.replace(/^\n+/,"").replace(/\s+$/,"")}function V(s){return s.replace(/\n$/,"").split(`
17
+ `;break;case"quote":t+=tt($(e.c));break;case"panel":t+=`> [!${rt[e.kind]}]
18
+ ${tt($(e.c))}`;break;case"rule":t+=`---
19
+ `;break;case"table":{let o=c=>`| ${c.map(a=>A(a).replace(/\|/g,"\\|")).join(" | ")} |
20
+ `;e.header&&(t+=o(e.header)+`|${e.header.map(()=>" --- |").join("")}
21
+ `);for(let c of e.rows)t+=o(c);break}}}return t}function at(s){return s.replace(/^\n+/,"").replace(/\s+$/,"")}function tt(s){return s.replace(/\n$/,"").split(`
20
22
  `).map(t=>t?`> ${t}`:">").join(`
21
23
  `)+`
22
- `}function _(s){let t=[];for(let e of s||[])if(!(!e||typeof e!="object"))switch(e.type){case"text":{let n={t:"text",v:String(e.text??"")},r=Array.isArray(e.marks)?e.marks:[];r.some(o=>o?.type==="code")&&(n={t:"code",v:String(e.text??"")});for(let o of r)!o||o.type==="code"||(o.type==="strong"?n={t:"strong",c:[n]}:o.type==="em"?n={t:"em",c:[n]}:o.type==="strike"?n={t:"strike",c:[n]}:o.type==="link"&&o.attrs?.href&&(n={t:"link",href:String(o.attrs.href),c:[n]}));t.push(n);break}case"hardBreak":t.push({t:"br"});break;case"mention":t.push({t:"text",v:String(e.attrs?.text||(e.attrs?.id?`@${e.attrs.id}`:"@someone"))});break;case"emoji":t.push({t:"text",v:String(e.attrs?.text||e.attrs?.shortName||"")});break;case"status":t.push({t:"text",v:String(e.attrs?.text||"")});break;case"date":t.push({t:"text",v:e.attrs?.timestamp?new Date(Number(e.attrs.timestamp)).toISOString().slice(0,10):""});break;case"inlineCard":{let n=String(e.attrs?.url||"");n&&t.push({t:"link",href:n,c:[{t:"text",v:n}]});break}default:Array.isArray(e.content)?t.push(..._(e.content)):typeof e.text=="string"&&t.push({t:"text",v:e.text})}return t}function y(s){let t=[];for(let e of s||[])if(!(!e||typeof e!="object"))switch(e.type){case"paragraph":t.push({t:"paragraph",c:_(e.content)});break;case"heading":t.push({t:"heading",level:Number(e.attrs?.level)||1,c:_(e.content)});break;case"bulletList":t.push({t:"bullet",items:(e.content||[]).map(n=>y(n?.content))});break;case"orderedList":t.push({t:"ordered",start:Number(e.attrs?.order)||1,items:(e.content||[]).map(n=>y(n?.content))});break;case"taskList":t.push({t:"task",items:(e.content||[]).map(n=>({checked:n?.attrs?.state==="DONE",c:_(n?.content)}))});break;case"decisionList":t.push({t:"bullet",items:(e.content||[]).map(n=>[{t:"paragraph",c:_(n?.content)}])});break;case"codeBlock":t.push({t:"code",lang:String(e.attrs?.language||""),v:(e.content||[]).map(n=>String(n?.text??"")).join("")});break;case"blockquote":t.push({t:"quote",c:y(e.content)});break;case"panel":{let n=String(e.attrs?.panelType||"info");t.push({t:"panel",kind:n in j?n:"info",c:y(e.content)});break}case"rule":t.push({t:"rule"});break;case"table":{let n=(e.content||[]).filter(i=>i?.type==="tableRow"),r=i=>(i.content||[]).map(h=>{let l=y(h?.content);return k($(l).trim().replace(/\n+/g," "))}),o=i=>(i.content||[]).length>0&&(i.content||[]).every(h=>h?.type==="tableHeader"),a=n.length&&o(n[0])?r(n[0]):null;t.push({t:"table",header:a,rows:n.slice(a?1:0).map(r)});break}case"mediaSingle":case"mediaGroup":case"media":case"mediaInline":t.push({t:"paragraph",c:[{t:"text",v:"[attachment]"}]});break;case"expand":case"nestedExpand":{let n=String(e.attrs?.title||"").trim();n&&t.push({t:"paragraph",c:[{t:"strong",c:[{t:"text",v:n}]}]}),t.push(...y(e.content));break}default:{let n=Array.isArray(e.content)?e.content:[];n.some(r=>r?.type==="text"||r?.type==="hardBreak")?t.push({t:"paragraph",c:_(n)}):n.length?t.push(...y(n)):typeof e.text=="string"&&e.text&&t.push({t:"paragraph",c:[{t:"text",v:e.text}]})}}return t}function $t(s){try{if(Array.isArray(s))return y(s);if(s&&typeof s=="object"){let t=s;return t.type==="doc"||!t.type&&Array.isArray(t.content)?y(t.content):y([t])}if(typeof s=="string")return P(s)}catch{}return[]}function Rt(s){try{return st($($t(s)))}catch{return""}}var It={amp:"&",lt:"<",gt:">",quot:'"',apos:"'",nbsp:"\xA0",hellip:"\u2026",mdash:"\u2014",ndash:"\u2013",lsquo:"\u2018",rsquo:"\u2019",ldquo:"\u201C",rdquo:"\u201D",copy:"\xA9",reg:"\xAE",trade:"\u2122"};function Y(s){return s.replace(/&(#x[0-9a-f]+|#\d+|[a-z]+);/gi,(t,e)=>{if(e[0]==="#"){let r=e[1]==="x"||e[1]==="X"?parseInt(e.slice(2),16):parseInt(e.slice(1),10);return Number.isFinite(r)&&r>0&&r<1114112?String.fromCodePoint(r):t}let n=It[e.toLowerCase()];return n===void 0?t:n})}function At(s){let t=[],e=/<!--[\s\S]*?-->|<\/([A-Za-z][\w:-]*)\s*>|<([A-Za-z][\w:-]*)((?:\s+[^\s=>/]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>]+))?)*)\s*(\/?)>|([^<]+)|(<)/g,n;for(;n=e.exec(s);)if(n[1])t.push({kind:"close",name:n[1].toLowerCase()});else if(n[2]){let r={},o=/([^\s=>/]+)(?:\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s>]+)))?/g,a;for(;a=o.exec(n[3]||"");)r[a[1].toLowerCase()]=Y(a[2]??a[3]??a[4]??"");let i=n[2].toLowerCase();t.push({kind:"open",name:i,attrs:r,selfClose:!!n[4]||i==="br"||i==="hr"||i==="img"||i==="input"})}else n[5]!==void 0?t.push({kind:"text",v:Y(n[5])}):n[6]&&t.push({kind:"text",v:"<"});return t}var tt=new Set(["p","div","h1","h2","h3","h4","h5","h6","ul","ol","li","blockquote","pre","hr","table","thead","tbody","tfoot","tr","td","th","section","article","header","footer","details","summary","figure","figcaption"]),Tt=new Set(["script","style","label","input","button","svg","head","title"]);function E(s){let t=[],e=0,n=[],r=[],o=l=>{let c=vt(n);n=[],c.length&&t.push(l?l(c):{t:"paragraph",c})},a=l=>{if(!l)return;let c={t:"text",v:l};for(let p=r.length-1;p>=0;p--){let u=r[p];u==="strong"?c={t:"strong",c:[c]}:u==="em"?c={t:"em",c:[c]}:u==="strike"?c={t:"strike",c:[c]}:c={t:"link",href:u.link,c:[c]}}n.push(c)},i=l=>{let c=[],p=1;for(;e<s.length;){let u=s[e++];if(u.kind==="open"&&u.name===l&&!u.selfClose&&p++,u.kind==="close"&&u.name===l&&(p--,p===0))break;c.push(u)}return c},h=l=>l.filter(c=>c.kind==="text").map(c=>c.v).join("");for(;e<s.length;){let l=s[e++];if(l.kind==="text"){a(l.v.replace(/\s+/g," "));continue}if(l.kind==="close"){if(l.name==="strong"||l.name==="b")H(r,"strong");else if(l.name==="em"||l.name==="i")H(r,"em");else if(l.name==="s"||l.name==="del"||l.name==="strike")H(r,"strike");else if(l.name==="a"){let p=r.map(u=>typeof u=="object").lastIndexOf(!0);p>=0&&r.splice(p,1)}else tt.has(l.name)&&o();continue}let c=l.name;if(Tt.has(c)){l.selfClose||i(c);continue}if(c==="br"){n.push({t:"br"});continue}if(c==="hr"){o(),t.push({t:"rule"});continue}if(c==="strong"||c==="b"){r.push("strong");continue}if(c==="em"||c==="i"){r.push("em");continue}if(c==="s"||c==="del"||c==="strike"){r.push("strike");continue}if(c==="a"){l.attrs.href?r.push({link:l.attrs.href}):r.push({link:""});continue}if(c==="code"){let p=h(i("code"));p&&n.push({t:"code",v:p});continue}if(c==="pre"){o();let p=i("pre"),u=p.find(x=>x.kind==="open"&&x.name==="code"),b=u&&/language-([\w+.-]+)/.exec(u.attrs.class||"")?.[1]||"";t.push({t:"code",lang:b,v:h(p).replace(/\n$/,"")});continue}if(/^h[1-6]$/.test(c)){o();let p=Number(c[1]),u=E(i(c));t.push({t:"heading",level:p,c:k($(u).trim().replace(/\n+/g," "))});continue}if(c==="blockquote"){o(),t.push({t:"quote",c:E(i(c))});continue}if(c==="ul"||c==="ol"){o();let p=i(c),u=(l.attrs["data-type"]||"")==="tasklist",b=[],x=[],T=0;for(;T<p.length;){let f=p[T++];if(f.kind==="open"&&f.name==="li"){let m=[],v=1;for(;T<p.length;){let d=p[T++];if(d.kind==="open"&&d.name==="li"&&!d.selfClose&&v++,d.kind==="close"&&d.name==="li"&&(v--,v===0))break;m.push(d)}b.push(m);let w=(f.attrs["data-checked"]||"")==="true"||m.some(d=>d.kind==="open"&&d.name==="input"&&"checked"in d.attrs);x.push(w)}}u||b.some(f=>f.some(m=>m.kind==="open"&&m.name==="input"&&(m.attrs.type||"")==="checkbox"))?t.push({t:"task",items:b.map((f,m)=>({checked:x[m],c:k($(E(f)).trim().replace(/\n+/g," "))}))}):c==="ul"?t.push({t:"bullet",items:b.map(f=>et(E(f)))}):t.push({t:"ordered",start:Math.max(1,parseInt(l.attrs.start||"1",10)||1),items:b.map(f=>et(E(f)))});continue}if(c==="table"){o();let p=i("table"),u=[],b=[],x=0;for(;x<p.length;){let M=p[x++];if(M.kind==="open"&&M.name==="tr"){let f=[],m=!0,v=1,w=[];for(;x<p.length;){let g=p[x++];if(g.kind==="open"&&g.name==="tr"&&!g.selfClose&&v++,g.kind==="close"&&g.name==="tr"&&(v--,v===0))break;w.push(g)}let d=0;for(;d<w.length;){let g=w[d++];if(g.kind==="open"&&(g.name==="td"||g.name==="th")){g.name!=="th"&&(m=!1);let G=[],U=1;for(;d<w.length;){let S=w[d++];if(S.kind==="open"&&S.name===g.name&&!S.selfClose&&U++,S.kind==="close"&&S.name===g.name&&(U--,U===0))break;G.push(S)}f.push(k($(E(G)).trim().replace(/\n+/g," ")))}}f.length&&(u.push(f),b.push(m))}}let T=u.length&&b[0]?u[0]:null;t.push({t:"table",header:T,rows:u.slice(T?1:0)});continue}if(tt.has(c)){o();continue}}return o(),t}function H(s,t){let e=s.lastIndexOf(t);e>=0&&s.splice(e,1)}function et(s){return s.length?s:[{t:"paragraph",c:[]}]}function vt(s){let t=[...s];for(;t.length&&t[0].t==="text"&&!t[0].v.trim();)t.shift();for(;t.length&&t[t.length-1].t==="text"&&!t[t.length-1].v.trim();)t.pop();t.length&&t[0].t==="text"&&(t[0]={t:"text",v:t[0].v.replace(/^\s+/," ")});let e=t.length-1;return e>=0&&t[e].t==="text"&&(t[e]={t:"text",v:t[e].v.replace(/\s+$/,"")}),t}function wt(s){try{let t=String(s??"");return/<[a-z][\s\S]*>/i.test(t)?E(At(t)):P(t)}catch{return[]}}function Bt(s){try{return st($(wt(s)))}catch{return""}}export{$t as adfToBlocks,Rt as adfToMarkup,$ as blocksToText,wt as htmlToBlocks,Bt as htmlToMarkup,Nt as markupToAdf,Et as markupToHtml,k as parseInline,P as parseMarkup,xt as plainTextToAdf};
24
+ `}function S(s){let t=[];for(let n of s||[])if(!(!n||typeof n!="object"))switch(n.type){case"text":{let e={t:"text",v:String(n.text??"")},r=Array.isArray(n.marks)?n.marks:[];r.some(o=>o?.type==="code")&&(e={t:"code",v:String(n.text??"")});for(let o of r)!o||o.type==="code"||(o.type==="strong"?e={t:"strong",c:[e]}:o.type==="em"?e={t:"em",c:[e]}:o.type==="strike"?e={t:"strike",c:[e]}:o.type==="link"&&o.attrs?.href&&(e={t:"link",href:String(o.attrs.href),c:[e]}));t.push(e);break}case"hardBreak":t.push({t:"br"});break;case"mention":t.push({t:"text",v:String(n.attrs?.text||(n.attrs?.id?`@${n.attrs.id}`:"@someone"))});break;case"emoji":t.push({t:"text",v:String(n.attrs?.text||n.attrs?.shortName||"")});break;case"status":t.push({t:"text",v:String(n.attrs?.text||"")});break;case"date":t.push({t:"text",v:n.attrs?.timestamp?new Date(Number(n.attrs.timestamp)).toISOString().slice(0,10):""});break;case"inlineCard":{let e=String(n.attrs?.url||"");e&&t.push({t:"link",href:e,c:[{t:"text",v:e}]});break}default:Array.isArray(n.content)?t.push(...S(n.content)):typeof n.text=="string"&&t.push({t:"text",v:n.text})}return t}function v(s){let t=[];for(let n of s||[])if(!(!n||typeof n!="object"))switch(n.type){case"paragraph":t.push({t:"paragraph",c:S(n.content)});break;case"heading":t.push({t:"heading",level:Number(n.attrs?.level)||1,c:S(n.content)});break;case"bulletList":t.push({t:"bullet",items:(n.content||[]).map(e=>v(e?.content))});break;case"orderedList":t.push({t:"ordered",start:Number(n.attrs?.order)||1,items:(n.content||[]).map(e=>v(e?.content))});break;case"taskList":t.push({t:"task",items:(n.content||[]).map(e=>({checked:e?.attrs?.state==="DONE",c:S(e?.content)}))});break;case"decisionList":t.push({t:"bullet",items:(n.content||[]).map(e=>[{t:"paragraph",c:S(e?.content)}])});break;case"codeBlock":t.push({t:"code",lang:String(n.attrs?.language||""),v:(n.content||[]).map(e=>String(e?.text??"")).join("")});break;case"blockquote":t.push({t:"quote",c:v(n.content)});break;case"panel":{let e=String(n.attrs?.panelType||"info");t.push({t:"panel",kind:e in rt?e:"info",c:v(n.content)});break}case"rule":t.push({t:"rule"});break;case"table":{let e=(n.content||[]).filter(a=>a?.type==="tableRow"),r=a=>(a.content||[]).map(f=>{let l=v(f?.content);return m($(l).trim().replace(/\n+/g," "))}),o=a=>(a.content||[]).length>0&&(a.content||[]).every(f=>f?.type==="tableHeader"),c=e.length&&o(e[0])?r(e[0]):null;t.push({t:"table",header:c,rows:e.slice(c?1:0).map(r)});break}case"mediaSingle":case"mediaGroup":case"media":case"mediaInline":t.push({t:"paragraph",c:[{t:"text",v:"[attachment]"}]});break;case"expand":case"nestedExpand":{let e=String(n.attrs?.title||"").trim();e&&t.push({t:"paragraph",c:[{t:"strong",c:[{t:"text",v:e}]}]}),t.push(...v(n.content));break}default:{let e=Array.isArray(n.content)?n.content:[];e.some(r=>r?.type==="text"||r?.type==="hardBreak")?t.push({t:"paragraph",c:S(e)}):e.length?t.push(...v(e)):typeof n.text=="string"&&n.text&&t.push({t:"paragraph",c:[{t:"text",v:n.text}]})}}return t}function At(s){try{if(Array.isArray(s))return v(s);if(s&&typeof s=="object"){let t=s;return t.type==="doc"||!t.type&&Array.isArray(t.content)?v(t.content):v([t])}if(typeof s=="string")return M(s)}catch{}return[]}function Ot(s){try{return at($(At(s)))}catch{return""}}var wt={amp:"&",lt:"<",gt:">",quot:'"',apos:"'",nbsp:"\xA0",hellip:"\u2026",mdash:"\u2014",ndash:"\u2013",lsquo:"\u2018",rsquo:"\u2019",ldquo:"\u201C",rdquo:"\u201D",copy:"\xA9",reg:"\xAE",trade:"\u2122"};function et(s){return s.replace(/&(#x[0-9a-f]+|#\d+|[a-z]+);/gi,(t,n)=>{if(n[0]==="#"){let r=n[1]==="x"||n[1]==="X"?parseInt(n.slice(2),16):parseInt(n.slice(1),10);return Number.isFinite(r)&&r>0&&r<1114112?String.fromCodePoint(r):t}let e=wt[n.toLowerCase()];return e===void 0?t:e})}function Nt(s){let t=[],n=/<!--[\s\S]*?-->|<\/([A-Za-z][\w:-]*)\s*>|<([A-Za-z][\w:-]*)((?:\s+[^\s=>/]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>]+))?)*)\s*(\/?)>|([^<]+)|(<)/g,e;for(;e=n.exec(s);)if(e[1])t.push({kind:"close",name:e[1].toLowerCase()});else if(e[2]){let r={},o=/([^\s=>/]+)(?:\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s>]+)))?/g,c;for(;c=o.exec(e[3]||"");)r[c[1].toLowerCase()]=et(c[2]??c[3]??c[4]??"");let a=e[2].toLowerCase();t.push({kind:"open",name:a,attrs:r,selfClose:!!e[4]||a==="br"||a==="hr"||a==="img"||a==="input"})}else e[5]!==void 0?t.push({kind:"text",v:et(e[5])}):e[6]&&t.push({kind:"text",v:"<"});return t}var nt=new Set(["p","div","h1","h2","h3","h4","h5","h6","ul","ol","li","blockquote","pre","hr","table","thead","tbody","tfoot","tr","td","th","section","article","header","footer","details","summary","figure","figcaption"]),Et=new Set(["script","style","label","input","button","svg","head","title"]);function T(s){let t=[],n=0,e=[],r=[],o=l=>{let i=Bt(e);e=[],i.length&&t.push(l?l(i):{t:"paragraph",c:i})},c=l=>{if(!l)return;let i={t:"text",v:l};for(let p=r.length-1;p>=0;p--){let h=r[p];h==="strong"?i={t:"strong",c:[i]}:h==="em"?i={t:"em",c:[i]}:h==="strike"?i={t:"strike",c:[i]}:i={t:"link",href:h.link,c:[i]}}e.push(i)},a=l=>{let i=[],p=1;for(;n<s.length;){let h=s[n++];if(h.kind==="open"&&h.name===l&&!h.selfClose&&p++,h.kind==="close"&&h.name===l&&(p--,p===0))break;i.push(h)}return i},f=l=>l.filter(i=>i.kind==="text").map(i=>i.v).join("");for(;n<s.length;){let l=s[n++];if(l.kind==="text"){c(l.v.replace(/\s+/g," "));continue}if(l.kind==="close"){if(l.name==="strong"||l.name==="b")H(r,"strong");else if(l.name==="em"||l.name==="i")H(r,"em");else if(l.name==="s"||l.name==="del"||l.name==="strike")H(r,"strike");else if(l.name==="a"){let p=r.map(h=>typeof h=="object").lastIndexOf(!0);p>=0&&r.splice(p,1)}else nt.has(l.name)&&o();continue}let i=l.name;if(Et.has(i)){l.selfClose||a(i);continue}if(i==="br"){e.push({t:"br"});continue}if(i==="hr"){o(),t.push({t:"rule"});continue}if(i==="strong"||i==="b"){r.push("strong");continue}if(i==="em"||i==="i"){r.push("em");continue}if(i==="s"||i==="del"||i==="strike"){r.push("strike");continue}if(i==="a"){l.attrs.href?r.push({link:l.attrs.href}):r.push({link:""});continue}if(i==="code"){let p=f(a("code"));p&&e.push({t:"code",v:p});continue}if(i==="pre"){o();let p=a("pre"),h=p.find(b=>b.kind==="open"&&b.name==="code"),u=h&&/language-([\w+.-]+)/.exec(h.attrs.class||"")?.[1]||"";t.push({t:"code",lang:u,v:f(p).replace(/\n$/,"")});continue}if(/^h[1-6]$/.test(i)){o();let p=Number(i[1]),h=T(a(i));t.push({t:"heading",level:p,c:m($(h).trim().replace(/\n+/g," "))});continue}if(i==="blockquote"){o(),t.push({t:"quote",c:T(a(i))});continue}if(i==="ul"||i==="ol"){o();let p=a(i),h=(l.attrs["data-type"]||"")==="tasklist",u=[],b=[],g=0;for(;g<p.length;){let k=p[g++];if(k.kind==="open"&&k.name==="li"){let x=[],R=1;for(;g<p.length;){let d=p[g++];if(d.kind==="open"&&d.name==="li"&&!d.selfClose&&R++,d.kind==="close"&&d.name==="li"&&(R--,R===0))break;x.push(d)}u.push(x);let _=(k.attrs["data-checked"]||"")==="true"||x.some(d=>d.kind==="open"&&d.name==="input"&&"checked"in d.attrs);b.push(_)}}h||u.some(k=>k.some(x=>x.kind==="open"&&x.name==="input"&&(x.attrs.type||"")==="checkbox"))?t.push({t:"task",items:u.map((k,x)=>({checked:b[x],c:m($(T(k)).trim().replace(/\n+/g," "))}))}):i==="ul"?t.push({t:"bullet",items:u.map(k=>st(T(k)))}):t.push({t:"ordered",start:Math.max(1,parseInt(l.attrs.start||"1",10)||1),items:u.map(k=>st(T(k)))});continue}if(i==="table"){o();let p=a("table"),h=Rt(p);if(h){t.push(h);continue}let u=[],b=[],g=0;for(;g<p.length;){let k=p[g++];if(k.kind==="open"&&k.name==="tr"){let x=[],R=!0,_=1,d=[];for(;g<p.length;){let y=p[g++];if(y.kind==="open"&&y.name==="tr"&&!y.selfClose&&_++,y.kind==="close"&&y.name==="tr"&&(_--,_===0))break;d.push(y)}let q=0;for(;q<d.length;){let y=d[q++];if(y.kind==="open"&&(y.name==="td"||y.name==="th")){y.name!=="th"&&(R=!1);let F=[],W=1;for(;q<d.length;){let B=d[q++];if(B.kind==="open"&&B.name===y.name&&!B.selfClose&&W++,B.kind==="close"&&B.name===y.name&&(W--,W===0))break;F.push(B)}x.push(m($(T(F)).trim().replace(/\n+/g," ")))}}x.length&&(u.push(x),b.push(R))}}let K=u.length&&b[0]?u[0]:null;t.push({t:"table",header:K,rows:u.slice(K?1:0)});continue}if(nt.has(i)){o();continue}}return o(),t}function Rt(s){let t=s.filter(u=>u.kind==="open"),n=t.filter(u=>u.name==="tr"),e=t.filter(u=>u.name==="td"||u.name==="th");if(n.length!==1||e.length!==1||t.some(u=>u.name==="table"))return null;let r=e[0],o=r.attrs["data-background-color"]||/background-color\s*:\s*([^;]+)/i.exec(r.attrs.style||"")?.[1]||"",c=/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})/i.exec(o);if(!c)return null;let a=lt.find(u=>P[u].rgb.every((b,g)=>b===Number(c[g+1])));if(!a)return null;let f=s.indexOf(r)+1,l=1,i=f;for(;i<s.length;i++){let u=s[i];if(u.kind==="open"&&u.name===r.name&&!u.selfClose&&l++,u.kind==="close"&&u.name===r.name&&--l===0)break}let p=T(s.slice(f,i)),h=p[0];if(h&&h.t==="heading"&&h.c[0]?.t==="text"){let u=P[a].icon.replace(/\ufe0f$/,""),b=h.c[0].v;if(b.startsWith(u)){let g=b.slice(u.length).replace(/^\ufe0f/,"").replace(/^\s+/,"");p[0]={...h,c:g?[{t:"text",v:g},...h.c.slice(1)]:h.c.slice(1)}}}return{t:"panel",kind:a,c:p}}function H(s,t){let n=s.lastIndexOf(t);n>=0&&s.splice(n,1)}function st(s){return s.length?s:[{t:"paragraph",c:[]}]}function Bt(s){let t=[...s];for(;t.length&&t[0].t==="text"&&!t[0].v.trim();)t.shift();for(;t.length&&t[t.length-1].t==="text"&&!t[t.length-1].v.trim();)t.pop();t.length&&t[0].t==="text"&&(t[0]={t:"text",v:t[0].v.replace(/^\s+/," ")});let n=t.length-1;return n>=0&&t[n].t==="text"&&(t[n]={t:"text",v:t[n].v.replace(/\s+$/,"")}),t}function Lt(s){try{let t=String(s??"");return/<[a-z][\s\S]*>/i.test(t)?T(Nt(t)):M(t)}catch{return[]}}function qt(s){try{return at($(Lt(s)))}catch{return""}}export{At as adfToBlocks,Ot as adfToMarkup,$ as blocksToText,Lt as htmlToBlocks,qt as htmlToMarkup,St as markupToAdf,_t as markupToHtml,m as parseInline,M as parseMarkup,It as plainTextToAdf};