tasuku 3.0.0-beta.3 → 3.0.0-beta.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -966,6 +966,24 @@ Default: `process.stderr`
966
966
 
967
967
  The stream to render task UI to. Defaults to stderr so that stdout stays clean for program output (e.g. `mytool | jq`). `console.log` output goes to stdout unaffected.
968
968
 
969
+ #### Multiple instances
970
+
971
+ Multiple `createTasuku()` instances can run concurrently when using the inline renderer:
972
+
973
+ ```ts
974
+ import { createTasuku } from 'tasuku/inline'
975
+ import { theme as claudeTheme } from 'tasuku/theme/claude'
976
+
977
+ const defaultTask = createTasuku()
978
+ const claudeTask = createTasuku({ theme: claudeTheme })
979
+
980
+ defaultTask('Build', async () => { /* ... */ })
981
+ claudeTask('Deploy', async () => { /* ... */ })
982
+ ```
983
+
984
+ > [!NOTE]
985
+ > Multiple pinned renderers on the same stream are not supported — they share a single cursor save/restore slot. Use the inline renderer for concurrent instances, or use separate output streams.
986
+
969
987
  ### Contributing a theme
970
988
 
971
989
  Have a theme you're proud of? We'd love to see it. Open a PR to add it as a built-in theme.
package/dist/create.mjs CHANGED
@@ -1 +1 @@
1
- import{c as m}from"./patch-console-BZRKJTPe.mjs";import{p as n}from"./pinned-C8CAzwc9.mjs";import{i as f}from"./inline-DgxsObjS.mjs";import"node:async_hooks";import"node:stream";import"node:process";import"node:os";export{m as createTasuku,f as inline,n as pinned};
1
+ import{c as m}from"./patch-console-D3Ski1GW.mjs";import{p as n}from"./pinned-9BNeszB5.mjs";import{i as f}from"./inline-D3bM0rF0.mjs";import"node:async_hooks";import"node:stream";import"node:process";import"node:os";export{m as createTasuku,f as inline,n as pinned};
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- var a=Object.defineProperty;var t=(r,p)=>a(r,"name",{value:p,configurable:!0});import{c as o}from"./patch-console-BZRKJTPe.mjs";import{p as m}from"./pinned-C8CAzwc9.mjs";import{t as e}from"./default-C2LITu6I.mjs";import"node:async_hooks";import"node:stream";import"node:process";import"node:os";import"./index-D7F2xFGS.mjs";const i=t(r=>o({renderer:m,theme:e,...r}),"createTasuku");var s=o({renderer:m,theme:e});export{i as createTasuku,s as default,e as theme};
1
+ var a=Object.defineProperty;var t=(r,p)=>a(r,"name",{value:p,configurable:!0});import{c as o}from"./patch-console-D3Ski1GW.mjs";import{p as m}from"./pinned-9BNeszB5.mjs";import{t as e}from"./default-C2LITu6I.mjs";import"node:async_hooks";import"node:stream";import"node:process";import"node:os";import"./index-D7F2xFGS.mjs";const i=t(r=>o({renderer:m,theme:e,...r}),"createTasuku");var s=o({renderer:m,theme:e});export{i as createTasuku,s as default,e as theme};
@@ -0,0 +1,4 @@
1
+ var q=Object.defineProperty;var c=(t,o)=>q(t,"name",{value:o,configurable:!0});import{s as E,p as G,i as H,a as J,b as S,g as Q,f as Z,d as ee}from"./patch-console-D3Ski1GW.mjs";const k=c((t,o)=>{let i=0,u="",e=0;for(;e<t.length;){const a=t[e];if(a==="\x1B"&&e+1<t.length){const d=t[e+1];switch(d){case"[":{for(u+=a+d,e+=2;e<t.length&&(u+=t[e],!(t[e]>="@"&&t[e]<="~"));)e+=1;break}case"]":case"P":case"_":case"^":case"X":{for(u+=a+d,e+=2;e<t.length&&(u+=t[e],t[e]!=="\x07");){if(t[e]==="\x1B"&&e+1<t.length&&t[e+1]==="\\"){u+=t[e+1],e+=1;break}e+=1}break}case"(":case")":case"*":case"+":{u+=a+d,e+=2,e<t.length&&(u+=t[e]);break}default:{u+=a+d,e+=1;break}}}else{const d=a.charCodeAt(0),f=d>=55296&&d<=56319&&e+1<t.length?a+t[e+1]:a,h=d<128?1:E(f);if(i+h>o)break;u+=f,i+=h,f.length===2&&(e+=1)}e+=1}return u},"truncateLine"),A=c(t=>{let o=0;for(let i=0;i<t.length;i+=1)t[i]===`
2
+ `&&(o+=1);return o},"countNewlines"),y=new Map,te=c((t,o)=>{let i=y.get(t);if(i||(i={listeners:new Set,originalWrite:t.write.bind(t)},y.set(t,i)),i.listeners.add(o),i.listeners.size===1){const{originalWrite:u}=i;t.write=(e,...a)=>{const d=u(e,...a);let f;typeof e=="string"?f=e:Buffer.isBuffer(e)||e instanceof Uint8Array?f=Buffer.from(e).toString():f=String(e);const h=A(f);if(h>0)for(const b of i.listeners)b(h);return d}}return()=>{i.listeners.delete(o),i.listeners.size===0&&(t.write=i.originalWrite,y.delete(t))}},"registerStreamListener"),se=c((t,o,i)=>{const e=o.isTTY===!0&&!H;let a=0,d=0,f,h,b,L,$=!1;const x=c(s=>{$=!0;try{o.write(s)}finally{$=!1}},"writeOutput"),p=new Map,Y=new WeakSet,C=c((s,r)=>{const n=ee(s,r,i);return n?(x(n),A(n)):0},"writeTaskOutput"),v=c((s,r)=>{const n=Q(s.state,s.children.length>0,i,d);return Z(s,n,r,i,a)},"getLine"),m=c((s,r=1)=>{for(const[,n]of p)n.offset>=r&&(n.offset+=s)},"incrementOffsets"),M=c((s,r)=>{const n=o.columns||80;m(1),x(`${k(v(s,r),n-1)}
3
+ `),p.set(s,{offset:1,depth:r,outputWritten:!1})},"appendLineAtRest"),z=c((s,r,n)=>{const B=o.columns||80,T=(o.rows||24)-1;if(n-1>T){M(s,r);return}const w=k(v(s,r),B-1);m(1,n);const g=n-1;let l="";g>0&&(l+=`\x1B[${g}A`),l+=`\x1B[L${w}\x1B[${n}B\r`,x(l),p.set(s,{offset:n,depth:r,outputWritten:!1})},"insertLineAfterOffset"),K=c((s,r)=>{const n=(o.rows||24)-1;s.offset>n||x(`\x1B[${s.offset}A\r\x1B[2K${r}\x1B[${s.offset}B\r`)},"updateLineInPlace"),P=c(()=>{let s=0;for(const[,r]of p)r.outputWritten||(s+=1);return s},"countActiveTasks"),F=c((s,r,n)=>{const B=o.columns||80,T=n!==void 0;let w=n;for(const g of s){if(g.state==="pending")continue;let l=p.get(g);if(!l){if(L!==void 0&&P()>=L)continue;T?z(g,r,w):M(g,r),l=p.get(g)}let O=l.offset;if(g.children.length>0){const W=F(g.children,r+1,l.offset);W!==void 0&&(O=W)}T&&(w=O);const R=S(g.state);if(R&&!l.outputWritten){K(l,k(v(g,l.depth),B-1));const W=C(g,l.depth);W>0&&m(W),l.outputWritten=!0}else!R&&l.outputWritten&&(l.outputWritten=!1)}return T?w:void 0},"processTaskList"),D=c(()=>{const s=o.columns||80,r=(o.rows||24)-1;let n="";for(const[B,T]of p){if(T.outputWritten||B.state!=="loading"||T.offset>r)continue;const w=k(v(B,T.depth),s-1);n+=`\x1B[${T.offset}A\r\x1B[2K${w}\x1B[${T.offset}B\r`}n&&x(n)},"renderSpinnerFrames"),U=c(()=>{F(t,0),D()},"renderTTY"),N=c((s,r)=>{for(const n of s)Y.has(n)||S(n.state)&&(Y.add(n),x(`${v(n,r)}
4
+ `),n.children.length>0&&N(n.children,r+1),C(n,r))},"commitDoneTasksNonTTY"),V=c(()=>{e?U():N(t,0)},"render"),X=o===process.stderr||"fd"in o&&o.fd===2?"stderr":"stdout",_=process.stdout.isTTY===!0&&process.stderr.isTTY===!0;h=G({after:c((s,r)=>{if(e&&(s===X||_)){const n=A(r);n>0&&m(n)}},"after")}),e&&(b=te(o,s=>{$||m(s)}));const j=c(()=>{f||!e||(f=setInterval(()=>{a+=1,d=a%i.spinner.length,D()},i.spinnerInterval??80),f.unref())},"startSpinner"),I=c(()=>{V(),J(t)?f&&(clearInterval(f),f=void 0):j()},"renderAndManageSpinner");return{triggerRender:I,flushRender:I,renderFinal:I,destroy:c(()=>{clearInterval(f),f=void 0,h?.(),h=void 0,b?.(),b=void 0,p.clear()},"destroy"),setMaxVisible:c(s=>{L=typeof s=="number"?s:void 0},"setMaxVisible")}},"inline");export{se as i};
package/dist/inline.mjs CHANGED
@@ -1 +1 @@
1
- var m=Object.defineProperty;var t=(r,a)=>m(r,"name",{value:a,configurable:!0});import{c as i}from"./patch-console-BZRKJTPe.mjs";import{i as o}from"./inline-DgxsObjS.mjs";import{t as e}from"./default-C2LITu6I.mjs";import"node:async_hooks";import"node:stream";import"./index-D7F2xFGS.mjs";const n=t(r=>i({renderer:o,theme:e,...r}),"createTasuku");var p=i({renderer:o,theme:e});export{n as createTasuku,p as default,e as theme};
1
+ var m=Object.defineProperty;var t=(r,a)=>m(r,"name",{value:a,configurable:!0});import{c as i}from"./patch-console-D3Ski1GW.mjs";import{i as o}from"./inline-D3bM0rF0.mjs";import{t as e}from"./default-C2LITu6I.mjs";import"node:async_hooks";import"node:stream";import"./index-D7F2xFGS.mjs";const n=t(r=>i({renderer:o,theme:e,...r}),"createTasuku");var p=i({renderer:o,theme:e});export{n as createTasuku,p as default,e as theme};
@@ -0,0 +1,8 @@
1
+ var Y=Object.defineProperty;var o=(e,n)=>Y(e,"name",{value:n,configurable:!0});import{AsyncLocalStorage as Z}from"node:async_hooks";import{Writable as D}from"node:stream";async function H(e,n,{concurrency:r=Number.POSITIVE_INFINITY,stopOnError:s=!0,signal:t}={}){return new Promise((c,h)=>{if(e[Symbol.iterator]===void 0&&e[Symbol.asyncIterator]===void 0)throw new TypeError(`Expected \`input\` to be either an \`Iterable\` or \`AsyncIterable\`, got (${typeof e})`);if(typeof n!="function")throw new TypeError("Mapper function is required");if(!(Number.isSafeInteger(r)&&r>=1||r===Number.POSITIVE_INFINITY))throw new TypeError(`Expected \`concurrency\` to be an integer from 1 and up or \`Infinity\`, got \`${r}\` (${typeof r})`);const u=[],l=[],x=new Map;let M=!1,T=!1,i=!1,g=0,w=0;const p=e[Symbol.iterator]===void 0?e[Symbol.asyncIterator]():e[Symbol.iterator](),d=o(()=>{m(t.reason)},"signalListener"),a=o(()=>{t?.removeEventListener("abort",d)},"cleanup"),E=o(b=>{c(b),a()},"resolve"),m=o(b=>{M=!0,T=!0,h(b),a()},"reject");t&&(t.aborted&&m(t.reason),t.addEventListener("abort",d,{once:!0}));const $=o(async()=>{if(T)return;const b=await p.next(),y=w;if(w++,b.done){if(i=!0,g===0&&!T){if(!s&&l.length>0){m(new AggregateError(l));return}if(T=!0,x.size===0){E(u);return}const R=[];for(const[v,I]of u.entries())x.get(v)!==j&&R.push(I);E(R)}return}g++,(async()=>{try{const R=await b.value;if(T)return;const v=await n(R,y);v===j&&x.set(y,v),u[y]=v,g--,await $()}catch(R){if(s)m(R);else{l.push(R),g--;try{await $()}catch(v){m(v)}}}})()},"next");(async()=>{for(let b=0;b<r;b++){try{await $()}catch(y){m(y);break}if(i||M)break}})()})}o(H,"pMap");const j=Symbol("skip"),K=o((e,n)=>new Proxy(e,{set(r,s,t){const c=Reflect.get(r,s);return Reflect.set(r,s,t),c!==t&&n(),!0}}),"reactive"),W=o(e=>e==="success"||e==="error"||e==="warning"||e==="skipped","isTerminalState"),V=o(e=>{for(const n of e)if(n.state==="loading"||n.state==="pending"||n.children&&n.children.length>0&&!V(n.children))return!1;return!0},"areAllTasksDone"),Q=5,J=o((e,n)=>{const r=[];let s=0,t="";const c=o(l=>l.split("\r").reverse().find(Boolean)??"","resolveCarriageReturn"),h=o(()=>{const l=t.includes("\r")?c(t):t,x=l?[...r,l].join(`
2
+ `):r.join(`
3
+ `);e.streamOutput=x,e.streamTruncatedLines=Math.max(0,s-n)},"flush"),u=new D({write(l,x,M){const i=(t+l.toString()).split(/\r?\n/);t=i.pop();for(const g of i){const w=g.includes("\r")?c(g):g;r.push(w),s+=1,r.length>n&&r.shift()}if(t.includes("\r")){const g=c(t);t=t.endsWith("\r")?`${g}\r`:g}(i.length>0||t)&&h(),M()},final(l){if(t){const x=t.includes("\r")?c(t):t;r.push(x),s+=1,r.length>n&&r.shift(),t="",h()}l()}});return u.clear=()=>{r.length=0,s=0,t="",e.streamOutput=void 0,e.streamTruncatedLines=void 0},u},"createStreamPreview");class q{static{o(this,"TaskSkipError")}message;constructor(n){this.message=n??""}}const X=o(({theme:e,renderer:n,outputStream:r})=>{const s=new Z;let t;const c=o(()=>{t?.triggerRender()},"triggerRender"),h=o((i,g,w)=>{let p;const d={signal:g,setTitle(a){i.title=a},setStatus(a){i.status=a},setOutput(a){i.output=typeof a=="string"?a:a.message},get streamPreview(){return p||(p=J(i,Math.max(1,Math.trunc(w?.previewLines??Q)))),p},setWarning(a){a?(d.setOutput(a),i.state="warning"):(i.state="loading",i.output=void 0)},setError(a){a?(d.setOutput(a),i.state="error"):(i.state="loading",i.output=void 0)},skip(a){throw new q(a)},startTime:o(()=>{i.startedAt=Date.now(),i.elapsedMs=void 0},"startTime"),stopTime:o(()=>i.startedAt===void 0?0:(i.elapsedMs=Date.now()-i.startedAt,i.startedAt=void 0,i.elapsedMs),"stopTime")};return{api:d,dispose:o(()=>p?.destroy(),"dispose")}},"createTaskInnerApi"),u=o(i=>{t||(t=n(i,r??process.stderr,e),i.isRoot=!0)},"ensureRenderer"),l=o((i,g,w,p)=>{const d=K({title:g,state:"pending",children:[]},c);return i.push(d),{task:d,run:o(async a=>{const E=s.getStore()?.abortController.signal,m=new AbortController,$=[a,p?.signal,E].filter(Boolean),b=o(function(){m.abort(this.reason)},"forwardAbort");for(const f of $){if(f.aborted){m.abort(f.reason);break}f.addEventListener("abort",b)}const y=o(()=>{for(const f of $)f.removeEventListener("abort",b)},"cleanupSignalListeners"),{signal:R}=m,{api:v,dispose:I}=h(d,R,p);d.state="loading",p?.showTime&&v.startTime();let S;try{S=await s.run({children:d.children,abortController:m},()=>w(v))}catch(f){if(f instanceof q){v.stopTime(),f.message&&(d.output=f.message),d.state="skipped",I(),y(),t?.flushRender();return}throw m.abort(f),v.stopTime(),v.setError(f instanceof Error||typeof f=="object"&&f!==null&&"message"in f&&typeof f.message=="string"?f:String(f)),I(),y(),t?.flushRender(!0),f}return v.stopTime(),I(),y(),d.state==="loading"&&(d.state="success"),t?.flushRender(),S},"run"),clear:o(()=>{const a=i.indexOf(d);a!==-1&&i.splice(a,1),t&&(i.isRoot&&i.length===0?(t.renderFinal(),t.destroy(),t=void 0):t.triggerRender())},"clear")}},"registerTask"),x=o(i=>{const w=i.run();return Object.defineProperties(w,{state:{get:o(()=>i.task.state,"get"),enumerable:!0,configurable:!0},warning:{get:o(()=>i.task.state==="warning"?i.task.output:void 0,"get"),enumerable:!0,configurable:!0},error:{get:o(()=>i.task.state==="error"?i.task.output:void 0,"get"),enumerable:!0,configurable:!0},skipped:{get:o(()=>i.task.state==="skipped"?i.task.output:void 0,"get"),enumerable:!0,configurable:!0},clear:{value:o(()=>{const{state:p}=i.task;return W(p)?i.clear():w.finally(()=>i.clear()).catch(()=>{}),w},"value"),enumerable:!0,configurable:!0}}),w},"createTaskPromise");return o(i=>{const g=o((w,p,d)=>{const a=s.getStore()?.children??i;u(a);const E=l(a,w,p,d);return x(E)},"task");return g.group=((w,p)=>{const d=s.getStore()?.children??i;u(d);const a=w((f,C,k)=>l(d,f,C,k));p?.maxVisible!==void 0&&t&&t.setMaxVisible(p.maxVisible);const E=new AbortController,m=p?.signal,$=o(function(){E.abort(this.reason)},"forwardGroupAbort");m&&(m.aborted?E.abort(m.reason):m.addEventListener("abort",$));const b=E.signal,y=p?.stopOnError!==!1,I=H(a,async f=>{try{return await f.run(b)}catch(C){throw y&&E.abort(C),C}},{concurrency:p?.concurrency??1,stopOnError:y,signal:b}).finally(()=>{m&&m.removeEventListener("abort",$)}),S=o(()=>{for(const f of a)f.clear();p?.maxVisible!==void 0&&t&&t.setMaxVisible(void 0)},"clearAll");return Object.assign(I,{clear:o(()=>(a.every(({task:C})=>W(C.state))?S():I.finally(()=>S()).catch(()=>{}),I),"clear")}),I}),g},"createTaskFunction")([])},"createTasuku");function ee({onlyFirst:e=!1}={}){const t="(?:\\u001B\\][\\s\\S]*?(?:\\u0007|\\u001B\\u005C|\\u009C))|[\\u001B\\u009B][[\\]()#;?]*(?:\\d{1,4}(?:[;:]\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]";return new RegExp(t,e?void 0:"g")}o(ee,"ansiRegex");const te=ee();function re(e){if(typeof e!="string")throw new TypeError(`Expected a \`string\`, got \`${typeof e}\``);return!e.includes("\x1B")&&!e.includes("\x9B")?e:e.replace(te,"")}o(re,"stripAnsi");const F=[161,161,164,164,167,168,170,170,173,174,176,180,182,186,188,191,198,198,208,208,215,216,222,225,230,230,232,234,236,237,240,240,242,243,247,250,252,252,254,254,257,257,273,273,275,275,283,283,294,295,299,299,305,307,312,312,319,322,324,324,328,331,333,333,338,339,358,359,363,363,462,462,464,464,466,466,468,468,470,470,472,472,474,474,476,476,593,593,609,609,708,708,711,711,713,715,717,717,720,720,728,731,733,733,735,735,768,879,913,929,931,937,945,961,963,969,1025,1025,1040,1103,1105,1105,8208,8208,8211,8214,8216,8217,8220,8221,8224,8226,8228,8231,8240,8240,8242,8243,8245,8245,8251,8251,8254,8254,8308,8308,8319,8319,8321,8324,8364,8364,8451,8451,8453,8453,8457,8457,8467,8467,8470,8470,8481,8482,8486,8486,8491,8491,8531,8532,8539,8542,8544,8555,8560,8569,8585,8585,8592,8601,8632,8633,8658,8658,8660,8660,8679,8679,8704,8704,8706,8707,8711,8712,8715,8715,8719,8719,8721,8721,8725,8725,8730,8730,8733,8736,8739,8739,8741,8741,8743,8748,8750,8750,8756,8759,8764,8765,8776,8776,8780,8780,8786,8786,8800,8801,8804,8807,8810,8811,8814,8815,8834,8835,8838,8839,8853,8853,8857,8857,8869,8869,8895,8895,8978,8978,9312,9449,9451,9547,9552,9587,9600,9615,9618,9621,9632,9633,9635,9641,9650,9651,9654,9655,9660,9661,9664,9665,9670,9672,9675,9675,9678,9681,9698,9701,9711,9711,9733,9734,9737,9737,9742,9743,9756,9756,9758,9758,9792,9792,9794,9794,9824,9825,9827,9829,9831,9834,9836,9837,9839,9839,9886,9887,9919,9919,9926,9933,9935,9939,9941,9953,9955,9955,9960,9961,9963,9969,9972,9972,9974,9977,9979,9980,9982,9983,10045,10045,10102,10111,11094,11097,12872,12879,57344,63743,65024,65039,65533,65533,127232,127242,127248,127277,127280,127337,127344,127373,127375,127376,127387,127404,917760,917999,983040,1048573,1048576,1114109],L=[12288,12288,65281,65376,65504,65510],P=[4352,4447,8986,8987,9001,9002,9193,9196,9200,9200,9203,9203,9725,9726,9748,9749,9776,9783,9800,9811,9855,9855,9866,9871,9875,9875,9889,9889,9898,9899,9917,9918,9924,9925,9934,9934,9940,9940,9962,9962,9970,9971,9973,9973,9978,9978,9981,9981,9989,9989,9994,9995,10024,10024,10060,10060,10062,10062,10067,10069,10071,10071,10133,10135,10160,10160,10175,10175,11035,11036,11088,11088,11093,11093,11904,11929,11931,12019,12032,12245,12272,12287,12289,12350,12353,12438,12441,12543,12549,12591,12593,12686,12688,12773,12783,12830,12832,12871,12880,42124,42128,42182,43360,43388,44032,55203,63744,64255,65040,65049,65072,65106,65108,65126,65128,65131,94176,94180,94192,94198,94208,101589,101631,101662,101760,101874,110576,110579,110581,110587,110589,110590,110592,110882,110898,110898,110928,110930,110933,110933,110948,110951,110960,111355,119552,119638,119648,119670,126980,126980,127183,127183,127374,127374,127377,127386,127488,127490,127504,127547,127552,127560,127568,127569,127584,127589,127744,127776,127789,127797,127799,127868,127870,127891,127904,127946,127951,127955,127968,127984,127988,127988,127992,128062,128064,128064,128066,128252,128255,128317,128331,128334,128336,128359,128378,128378,128405,128406,128420,128420,128507,128591,128640,128709,128716,128716,128720,128722,128725,128728,128732,128735,128747,128748,128756,128764,128992,129003,129008,129008,129292,129338,129340,129349,129351,129535,129648,129660,129664,129674,129678,129734,129736,129736,129741,129756,129759,129770,129775,129784,131072,196605,196608,262141],O=o((e,n)=>{let r=0,s=Math.floor(e.length/2)-1;for(;r<=s;){const t=Math.floor((r+s)/2),c=t*2;if(n<e[c])s=t-1;else if(n>e[c+1])r=t+1;else return!0}return!1},"isInRange"),ne=F[0],oe=F.at(-1),se=L[0],ie=L.at(-1),ce=P[0],ae=P.at(-1),z=19968,[ue,le]=fe(P);function fe(e){let n=e[0],r=e[1];for(let s=0;s<e.length;s+=2){const t=e[s],c=e[s+1];if(z>=t&&z<=c)return[t,c];c-t>r-n&&(n=t,r=c)}return[n,r]}o(fe,"findWideFastPathRange");const de=o(e=>e<ne||e>oe?!1:O(F,e),"isAmbiguous"),pe=o(e=>e<se||e>ie?!1:O(L,e),"isFullWidth"),ge=o(e=>e>=ue&&e<=le?!0:e<ce||e>ae?!1:O(P,e),"isWide");function me(e){if(!Number.isSafeInteger(e))throw new TypeError(`Expected a code point, got \`${typeof e}\`.`)}o(me,"validate");function G(e,{ambiguousAsWide:n=!1}={}){return me(e),pe(e)||ge(e)||n&&de(e)?2:1}o(G,"eastAsianWidth");const he=new Intl.Segmenter,we=new RegExp("^(?:\\p{Default_Ignorable_Code_Point}|\\p{Control}|\\p{Format}|\\p{Mark}|\\p{Surrogate})+$","v"),be=new RegExp("^[\\p{Default_Ignorable_Code_Point}\\p{Control}\\p{Format}\\p{Mark}\\p{Surrogate}]+","v"),ve=new RegExp("^\\p{RGI_Emoji}$","v"),ye=/^[\d#*]\u20E3$/,xe=new RegExp("\\p{Extended_Pictographic}","gu");function Ee(e){if(e.length>50)return!1;if(ye.test(e))return!0;if(e.includes("\u200D")){const n=e.match(xe);return n!==null&&n.length>=2}return!1}o(Ee,"isDoubleWidthNonRgiEmojiSequence");function Re(e){return e.replace(be,"")}o(Re,"baseVisible");function Ie(e){return we.test(e)}o(Ie,"isZeroWidthCluster");function $e(e,n){let r=0;if(e.length>1)for(const s of e.slice(1))s>="\uFF00"&&s<="\uFFEF"&&(r+=G(s.codePointAt(0),n));return r}o($e,"trailingHalfwidthWidth");function Te(e,n={}){if(typeof e!="string"||e.length===0)return 0;const{ambiguousIsNarrow:r=!0,countAnsiEscapeCodes:s=!1}=n;let t=e;if(!s&&(t.includes("\x1B")||t.includes("\x9B"))&&(t=re(t)),t.length===0)return 0;if(/^[\u0020-\u007E]*$/.test(t))return t.length;let c=0;const h={ambiguousAsWide:!r};for(const{segment:u}of he.segment(t)){if(Ie(u))continue;if(ve.test(u)||Ee(u)){c+=2;continue}const l=Re(u).codePointAt(0);c+=G(l,h),c+=$e(u,h)}return c}o(Te,"stringWidth");const Ce=o(e=>{const n=Math.floor(e/1e3);if(n<60)return`(${n}s)`;const r=Math.floor(n/60);if(r<60){const c=n%60;return`(${r}m ${c}s)`}const s=Math.floor(r/60),t=r%60;return`(${s}h ${t}m)`},"formatElapsed"),Ae=o((e,n,r,s,t)=>{const c=" ".repeat(r),h=s.colors.title?s.colors.title(e.title,e.state,t):e.title;let u=`${c}${n} ${h}`;e.status&&(u+=` ${s.colors.dim(`[${e.status}]`)}`);const l=e.elapsedMs??(e.startedAt===void 0?void 0:Date.now()-e.startedAt);return l!==void 0&&l>=1e3&&(u+=` ${s.colors.dim(Ce(l))}`),u},"formatTaskLine"),Me=o((e,n,r)=>{const s=`${" ".repeat(n)} `;let t="";if(e.output){const c=e.state==="error"&&r.colors.error||e.state==="warning"&&r.colors.warning||r.colors.secondary,h=e.output.split(`
4
+ `);for(let u=0;u<h.length;u+=1){const l=u===0?`${r.colors.secondary("\u2192")} `:" ";t+=`${s}${l}${c(h[u])}
5
+ `}}if(e.streamOutput){const c=`${s} `,h=e.streamOutput.split(`
6
+ `);for(let u=0;u<h.length;u+=1){const l=u===0?`${s}\u23BF `:c;t+=`${l}${r.colors.secondary(h[u])}
7
+ `}e.streamTruncatedLines&&(t+=`${c}${r.colors.secondary(`(+ ${e.streamTruncatedLines} lines)`)}
8
+ `)}return t},"formatTaskOutput"),Se=o((e,n,r,s)=>{switch(e){case"loading":return n?r.icons.parent:r.spinner[s];case"success":return n?r.icons.parent:r.icons.success;case"error":return n?r.icons.parentError:r.icons.error;case"warning":return r.icons.warning;case"skipped":return r.icons.skipped;default:return r.icons.pending}},"getIcon"),Pe=!!(process.env.CI||process.env.CONTINUOUS_INTEGRATION||process.env.BUILD_NUMBER),U=["assert","count","countReset","debug","dir","dirxml","error","group","groupCollapsed","groupEnd","info","log","table","time","timeEnd","timeLog","trace","warn"],A=new Set,N=new Map;let _,B;const We=o((e,n)=>{for(const s of A)try{s.before?.(e,n)}catch{}(e==="stderr"?B:_)(n);for(const s of A)try{s.after?.(e,n)}catch{}},"handleWrite"),Fe=o(()=>{const e=o(r=>new D({write:o((s,t,c)=>{We(r,String(s)),c()},"write")}),"createStream"),n=new console.Console(e("stdout"),e("stderr"));for(const r of U)console[r]=n[r]},"installPatch"),Le=o(e=>{if(A.size===0){for(const n of U)N.set(n,console[n]);_=process.stdout.write.bind(process.stdout),B=process.stderr.write.bind(process.stderr),Fe()}return A.add(e),()=>{if(A.delete(e),A.size===0){for(const[n,r]of N)console[n]=r;N.clear(),_=void 0,B=void 0}}},"patchConsole");export{V as a,W as b,X as c,Me as d,Ae as f,Se as g,Pe as i,Le as p,Te as s};
@@ -0,0 +1,6 @@
1
+ var ie=Object.defineProperty;var e=(r,o)=>ie(r,"name",{value:o,configurable:!0});import{i as W,p as re,a as P,s as te,g as le,f as ae,d as ce}from"./patch-console-D3Ski1GW.mjs";import m from"node:process";import de from"node:os";const A=globalThis.window?.document!==void 0;globalThis.process?.versions?.node,globalThis.process?.versions?.bun,globalThis.Deno?.version?.deno,globalThis.process?.versions?.electron,globalThis.navigator?.userAgent?.includes("jsdom"),typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope,typeof DedicatedWorkerGlobalScope<"u"&&globalThis instanceof DedicatedWorkerGlobalScope,typeof SharedWorkerGlobalScope<"u"&&globalThis instanceof SharedWorkerGlobalScope,typeof ServiceWorkerGlobalScope<"u"&&globalThis instanceof ServiceWorkerGlobalScope;const I=globalThis.navigator?.userAgentData?.platform;I==="macOS"||globalThis.navigator?.platform==="MacIntel"||globalThis.navigator?.userAgent?.includes(" Mac ")===!0||globalThis.process?.platform,I==="Windows"||globalThis.navigator?.platform==="Win32"||globalThis.process?.platform,I==="Linux"||globalThis.navigator?.platform?.startsWith("Linux")===!0||globalThis.navigator?.userAgent?.includes(" Linux ")===!0||globalThis.process?.platform,I==="Android"||globalThis.navigator?.platform==="Android"||globalThis.navigator?.userAgent?.includes(" Android ")===!0||globalThis.process?.platform;const c="\x1B[",K=!A&&m.env.TERM_PROGRAM==="Apple_Terminal",fe=!A&&m.platform==="win32";!A&&(m.env.TERM?.startsWith("screen")||m.env.TERM?.startsWith("tmux")||m.env.TMUX),A||m.cwd;const ue=e((r=1)=>c+r+"A","cursorUp"),pe=e((r=1)=>c+r+"B","cursorDown"),Q=K?"\x1B7":c+"s",ge=K?"\x1B8":c+"u",he=c+"J",Z=c+"2J",Te=e(()=>{if(A||!fe)return!1;const r=de.release().split("."),o=Number(r[0]),d=Number(r[2]??0);return o<10||o===10&&d<10586},"isOldWindows");Te()?`${Z}${c}`:`${Z}${c}${c}`;const ve=e((r,o,d)=>{let y=0,B=0,f,u,T="",v=!1,w=!1,F=!1,H;const M=o.isTTY===!0,z=M&&!W,J=e(()=>{W||(o.write(Q),w=!0)},"savePosition"),C=e(()=>{w&&o.write(ge+he)},"clearRenderArea");let p,D=o.rows||24;const ee=e(()=>{if(p!==void 0){const s=typeof p=="function"?p(D):p;return Math.max(1,s)}return Math.max(5,D-2)},"getVisibleLinesLimit"),O=e((s,n)=>{const a=s.children&&s.children.length>0,g=le(s.state,a,d,B);let t=`${ae(s,g,n,d,y)}
2
+ `;return t+=ce(s,n,d),a&&(t+=V(s.children,n+1)),t},"renderTask"),N=e(s=>s==="loading"?0:s==="pending"?1:2,"getStatePriority");let k=!1;const V=e((s,n=0)=>{if(n===0)if(k&&p===void 0)v=!1;else{const g=ee(),t=s.map(i=>O(i,n)),R=t.join("");if(t.reduce((i,l)=>i+l.split(`
3
+ `).length-1,0)<=g)return v=!1,R;const h=[...s].sort((i,l)=>N(i.state)-N(l.state));let j="",q=0,E=0;for(let i=0;i<h.length;i+=1){const l=O(h[i],n),b=l.split(`
4
+ `).length-1,G=i<h.length-1?1:0;if(q+b+G>g&&E>0)break;j+=l,q+=b,E+=1}const X=h.slice(E);if(v=X.length>0,v){const i=[];let l=0,b=0,L=0;for(const G of X)G.state==="loading"?l+=1:G.state==="pending"?b+=1:L+=1;l>0&&i.push(`${l} loading`),b>0&&i.push(`${b} queued`),L>0&&i.push(`${L} completed`),j+=`${d.colors.dim(`(+ ${i.join(", ")})`)}
5
+ `}return j}return s.map(a=>O(a,n)).join("")},"renderTaskList"),se={before:e(()=>{C(),T=""},"before"),after:e(()=>{J(),r.length>0&&!F&&x()},"after")},U=e(()=>{f||!M||W||(f=setInterval(()=>{y+=1,B=y%d.spinner.length,S()},d.spinnerInterval??80),f.unref())},"startSpinner"),x=e((s=!1)=>{const n=V(r),a=P(r);if(a&&f?(clearInterval(f),f=void 0):!a&&!f&&U(),W&&!s){a&&n!==T&&(o.write(n),T=n);return}if(n!==T)if(C(),w||J(),T=n,M){const g=o.columns||80;let t=0;const R=n.split(`
6
+ `);for(let $=0;$<R.length-1;$+=1){const h=te(R[$]);t+=h<=g?1:Math.ceil(h/g)}t>0?(o.write(n+ue(t)+Q+pe(t)),w=!0):o.write(n)}else o.write(n)},"render"),S=e(()=>{u||(u=setTimeout(()=>{u=void 0,x()},33))},"scheduleRender"),ne=e((s=!1)=>{!s&&!z||(u&&(clearTimeout(u),u=void 0),x(),P(r)&&v&&(F=!0))},"flushRender"),Y=e(()=>{D=o.rows||24,T="",S()},"handleResize"),oe=e(()=>{process.off("exit",_),o.off("resize",Y),clearInterval(f),clearTimeout(u),H?.(),C(),w=!1},"destroy"),_=e(()=>{v&&P(r)&&(p=void 0,k=!0,x(),k=!1)},"handleExit");return M&&o.on("resize",Y),z&&process.on("exit",_),W||(H=re(se),U()),{triggerRender:S,flushRender:ne,renderFinal:e(()=>{k=!0,x(!0),k=!1},"renderFinal"),destroy:oe,setMaxVisible:e(s=>{p=s},"setMaxVisible")}},"pinned");export{ve as p};
@@ -1 +1 @@
1
- import{d as i}from"../index-D7F2xFGS.mjs";import{c as n}from"../patch-console-BZRKJTPe.mjs";import{p}from"../pinned-C8CAzwc9.mjs";import{e,t as s,s as t,w as a,a as m,i as c,b as d}from"../claude-palette-C-goBtER.mjs";import"node:async_hooks";import"node:stream";import"node:process";import"node:os";const r=process.platform==="darwin"?"\u23FA":"\u25CF",o={spinner:[s(r),i(s(r))],spinnerInterval:1e3,icons:{pending:t(r),success:m(r),error:e(r),warning:a(r),skipped:t(r),parent:s("\u276F"),parentError:e("\u276F")},colors:{title:d,dim:t,secondary:c,error:e,warning:a}};var u=n({renderer:p,theme:o});export{u as default,o as theme};
1
+ import{d as i}from"../index-D7F2xFGS.mjs";import{c as n}from"../patch-console-D3Ski1GW.mjs";import{p}from"../pinned-9BNeszB5.mjs";import{e,t as s,s as t,w as a,a as m,i as c,b as d}from"../claude-palette-C-goBtER.mjs";import"node:async_hooks";import"node:stream";import"node:process";import"node:os";const r=process.platform==="darwin"?"\u23FA":"\u25CF",o={spinner:[s(r),i(s(r))],spinnerInterval:1e3,icons:{pending:t(r),success:m(r),error:e(r),warning:a(r),skipped:t(r),parent:s("\u276F"),parentError:e("\u276F")},colors:{title:d,dim:t,secondary:c,error:e,warning:a}};var u=n({renderer:p,theme:o});export{u as default,o as theme};
@@ -1 +1 @@
1
- var b=Object.defineProperty;var c=(r,s)=>b(r,"name",{value:s,configurable:!0});import{b as w}from"../index-D7F2xFGS.mjs";import{c as v}from"../patch-console-BZRKJTPe.mjs";import{p as F}from"../pinned-C8CAzwc9.mjs";import{e as i,t as e,s as o,w as m,a as k,i as B,b as I}from"../claude-palette-C-goBtER.mjs";import"node:async_hooks";import"node:stream";import"node:process";import"node:os";const M=w(245,149,117),T=c((r,s,l)=>{if(s!=="loading")return I(r);const d=r.length+20,t=r.length+10-l%d,n=t-1,a=t+2,g=n>0?r.slice(0,n):"",h=r.slice(Math.max(0,n),Math.min(r.length,a)),f=a<r.length?r.slice(a):"";return e(g)+M(h)+e(f)},"shimmerTitle"),u=["\xB7","\u2722","\u2733","\u2736","\u273B","\u273D"],p={spinner:[...u,...[...u].reverse()].map(r=>e(r)),spinnerInterval:200,icons:{pending:o("\u25FC"),success:k("\u2714"),error:i("\u2716"),warning:m("\u26A0"),skipped:o("\u2298"),parent:e("\u276F"),parentError:i("\u276F")},colors:{title:T,dim:o,secondary:B,error:i,warning:m}};var y=v({renderer:F,theme:p});export{y as default,p as theme};
1
+ var w=Object.defineProperty;var c=(e,n)=>w(e,"name",{value:n,configurable:!0});import{b as B}from"../index-D7F2xFGS.mjs";import{c as b}from"../patch-console-D3Ski1GW.mjs";import{p as v}from"../pinned-9BNeszB5.mjs";import{e as o,t as s,s as t,w as m,a as F,i as M,b as T}from"../claude-palette-C-goBtER.mjs";import"node:async_hooks";import"node:stream";import"node:process";import"node:os";const k=B(245,149,117),y=c((e,n,l)=>{if(n!=="loading")return T(e);const d=e.length+20,u=e.length+10-l%d,a=u-1,i=u+2,g=a>0?e.slice(0,a):"",h=e.slice(Math.max(0,a),Math.min(e.length,i)),f=i<e.length?e.slice(i):"";return s(g)+k(h)+s(f)},"shimmerTitle");let r;process.env.TERM==="xterm-ghostty"?r=["\xB7","\u2722","\u2733","\u2736","\u273B","*"]:process.platform==="darwin"?r=["\xB7","\u2722","\u2733","\u2736","\u273B","\u273D"]:r=["\xB7","\u2722","*","\u2736","\u273B","\u273D"];const p={spinner:[...r,...[...r].reverse()].map(e=>s(e)),spinnerInterval:200,icons:{pending:t("\u25FC"),success:F("\u2714"),error:o("\u2716"),warning:m("\u26A0"),skipped:t("\u2298"),parent:s("\u276F"),parentError:o("\u276F")},colors:{title:y,dim:t,secondary:M,error:o,warning:m}};var D=b({renderer:v,theme:p});export{D as default,p as theme};
@@ -1 +1 @@
1
- var D=Object.defineProperty;var t=(n,o)=>D(n,"name",{value:o,configurable:!0});import{b as e,r as l,d as h,y as b,a as G}from"../index-D7F2xFGS.mjs";import{c as N}from"../patch-console-BZRKJTPe.mjs";import{p as F}from"../pinned-C8CAzwc9.mjs";import"node:async_hooks";import"node:stream";import"node:process";import"node:os";const a=10,p=2e3,f=5,u=50,c=128,S=255,I=t(n=>n>f?0:.5*(1+Math.cos(Math.PI*n/f)),"cosineIntensity"),g=t(n=>{const o=n*.9;return Math.round(S*o+c*(1-o))},"blendGray"),M="\u2022",w=1+a*2,A=p/u,E=[];for(let n=0;n<A;n+=1){const o=n/A*w,i=Math.abs(a-o),r=g(I(i));E.push(e(r,r,r).bold(M))}const L=t((n,o,i)=>{if(o!=="loading")return n;const r=n.length+a*2,H=i*u%p/p*r;let m="";for(let s=0;s<n.length;s+=1){const P=s+a,_=Math.abs(P-H),d=g(I(_));m+=e(d,d,d).bold(n[s])}return m},"shimmerTitle"),T=e(c,c,c),y={spinner:E,spinnerInterval:u,icons:{pending:h(M),success:G.bold("\u2713"),error:l.bold("\u2717"),warning:b("\u26A0"),skipped:h("\u2298"),parent:T("\u276F"),parentError:l.bold("\u276F")},colors:{title:L,dim:T,secondary:e(153,153,153),error:l,warning:b}};var R=N({renderer:F,theme:y});export{R as default,y as theme};
1
+ var D=Object.defineProperty;var t=(n,o)=>D(n,"name",{value:o,configurable:!0});import{b as e,r as l,d as h,y as b,a as G}from"../index-D7F2xFGS.mjs";import{c as N}from"../patch-console-D3Ski1GW.mjs";import{p as F}from"../pinned-9BNeszB5.mjs";import"node:async_hooks";import"node:stream";import"node:process";import"node:os";const a=10,p=2e3,f=5,u=50,c=128,S=255,I=t(n=>n>f?0:.5*(1+Math.cos(Math.PI*n/f)),"cosineIntensity"),g=t(n=>{const o=n*.9;return Math.round(S*o+c*(1-o))},"blendGray"),M="\u2022",w=1+a*2,A=p/u,E=[];for(let n=0;n<A;n+=1){const o=n/A*w,i=Math.abs(a-o),r=g(I(i));E.push(e(r,r,r).bold(M))}const L=t((n,o,i)=>{if(o!=="loading")return n;const r=n.length+a*2,H=i*u%p/p*r;let m="";for(let s=0;s<n.length;s+=1){const P=s+a,_=Math.abs(P-H),d=g(I(_));m+=e(d,d,d).bold(n[s])}return m},"shimmerTitle"),T=e(c,c,c),y={spinner:E,spinnerInterval:u,icons:{pending:h(M),success:G.bold("\u2713"),error:l.bold("\u2717"),warning:b("\u26A0"),skipped:h("\u2298"),parent:T("\u276F"),parentError:l.bold("\u276F")},colors:{title:L,dim:T,secondary:e(153,153,153),error:l,warning:b}};var R=N({renderer:F,theme:y});export{R as default,y as theme};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tasuku",
3
- "version": "3.0.0-beta.3",
3
+ "version": "3.0.0-beta.5",
4
4
  "description": "タスク — The minimal task runner",
5
5
  "keywords": [
6
6
  "simple",
@@ -17,7 +17,8 @@
17
17
  "email": "hiroki.osame@gmail.com"
18
18
  },
19
19
  "files": [
20
- "dist"
20
+ "dist",
21
+ "skills"
21
22
  ],
22
23
  "type": "module",
23
24
  "types": "./dist/index.d.mts",
@@ -0,0 +1,223 @@
1
+ ---
2
+ name: tasuku
3
+ description: Minimal task runner for Node.js — displays loading, success, error, warning, and skipped states in the terminal. Use when creating CLI task runners, progress displays, or terminal UIs with tasuku.
4
+ ---
5
+
6
+ # tasuku
7
+
8
+ Minimal task runner for Node.js. Renders task states to stderr, keeps stdout clean.
9
+
10
+ ## Quick Start
11
+
12
+ ```ts
13
+ import task from 'tasuku'
14
+
15
+ await task('Build project', async ({ setTitle }) => {
16
+ await build()
17
+ setTitle('Build complete')
18
+ })
19
+ ```
20
+
21
+ ## Entry Points
22
+
23
+ | Import | Use |
24
+ |--------|-----|
25
+ | `tasuku` | Default (pinned renderer + default theme) |
26
+ | `tasuku/inline` | Inline renderer (sequential, no cursor manipulation) |
27
+ | `tasuku/create` | Raw factory (`createTasuku`, `pinned`, `inline`) |
28
+ | `tasuku/theme/claude` | Claude Code theme (shimmer + truecolor) |
29
+ | `tasuku/theme/blink` | Reduced-motion theme (pulsing dot) |
30
+ | `tasuku/theme/codex` | OpenAI Codex theme (cosine shimmer) |
31
+
32
+ Theme entry points export both `{ theme }` (data) and a default export (pre-composed task runner).
33
+
34
+ ## `createTasuku`
35
+
36
+ The convenience `createTasuku` from `tasuku` or `tasuku/inline` accepts **partial** overrides — renderer and theme default to the entry point's built-in:
37
+
38
+ ```ts
39
+ import { createTasuku } from 'tasuku'
40
+ import { theme } from 'tasuku/theme/claude'
41
+ const task = createTasuku({ theme }) // renderer defaults to pinned
42
+ ```
43
+
44
+ The raw `createTasuku` from `tasuku/create` requires all options:
45
+
46
+ ```ts
47
+ import { createTasuku, pinned } from 'tasuku/create'
48
+ const task = createTasuku({ renderer: pinned, theme })
49
+ ```
50
+
51
+ ## Task Inner API
52
+
53
+ ```ts
54
+ await task('Title', async (api) => {
55
+ api.setTitle('Updated title')
56
+ api.setStatus('step 2') // dimmed, in brackets: [step 2]
57
+ api.setOutput('result data') // → result data below task
58
+ api.setWarning('careful') // yellow ⚠ state
59
+ api.setError('failed') // red ✖ state
60
+ api.skip('not needed') // gray ⊘ state, throws (never returns)
61
+ api.signal // AbortSignal — cooperative cancellation
62
+ api.streamPreview // Writable for live streaming output
63
+ api.startTime() / api.stopTime() // elapsed time: (3s), (1m 30s)
64
+ })
65
+ ```
66
+
67
+ | Method | Effect |
68
+ |--------|--------|
69
+ | `setTitle(s)` | Update task title |
70
+ | `setStatus(s?)` | Show `[status]` after title, clear with no arg |
71
+ | `setOutput(s \| { message })` | Show `→ message` below task. Accepts string or object with `.message` |
72
+ | `setWarning(s?)` | Warning state. Accepts `Error \| string \| false \| null`. Falsy reverts to loading |
73
+ | `setError(s?)` | Error state. Same types as setWarning. Thrown errors auto-set this |
74
+ | `skip(msg?)` | Skip task. Throws internally — code after is unreachable. Promise resolves `undefined` |
75
+ | `streamPreview` | `Writable` stream for live output. Handles `\r` for progress bars. Shows last `previewLines` (default 5) lines with `(+ N lines)` indicator. Call `.clear()` to remove |
76
+ | `startTime()` | Start/restart elapsed timer. Shown as `(Xs)`, `(Xm Ys)`, `(Xh Ym)`. Hidden if < 1s |
77
+ | `stopTime()` | Stop timer, return elapsed ms. Display freezes at stopped value |
78
+
79
+ ## Task Promise
80
+
81
+ `task()` returns a `TaskPromise<T>` — a Promise with live properties:
82
+
83
+ ```ts
84
+ const p = task('Deploy', async () => data)
85
+ p.state // 'loading' | 'success' | 'error' | 'warning' | 'skipped'
86
+ p.warning // string | undefined (message when state is 'warning')
87
+ p.error // string | undefined (message when state is 'error')
88
+ p.skipped // string | undefined (message when state is 'skipped')
89
+ p.clear() // remove from UI, returns same promise for chaining
90
+ ```
91
+
92
+ `.clear()` can be chained before `await` — clears automatically on completion:
93
+
94
+ ```ts
95
+ const result = await task('Temporary', async () => 42).clear()
96
+ // result === 42, task removed from UI
97
+ ```
98
+
99
+ ## Signal (AbortSignal)
100
+
101
+ The signal is **cooperative** — only cancels if passed to APIs that respect it (`fetch`, `setTimeout` from `timers/promises`, etc.).
102
+
103
+ Auto-aborted when:
104
+ - In `task.group()`: a sibling task throws (when `stopOnError: true`, the default)
105
+ - In nested tasks: the parent task throws
106
+
107
+ The error that caused the abort is on `signal.reason`.
108
+
109
+ ```ts
110
+ await task('Multi-step', async ({ signal }) => {
111
+ await step1(signal)
112
+ signal.throwIfAborted() // bail between steps
113
+ await step2(signal)
114
+ })
115
+ ```
116
+
117
+ External signal:
118
+
119
+ ```ts
120
+ const controller = new AbortController()
121
+ task('Cancellable', fn, { signal: controller.signal })
122
+ controller.abort()
123
+ ```
124
+
125
+ ## Groups
126
+
127
+ ```ts
128
+ const results = await task.group(task => [
129
+ task('Step 1', async () => 'a'),
130
+ task('Step 2', async () => 'b'),
131
+ ], {
132
+ concurrency: 2,
133
+ stopOnError: true,
134
+ maxVisible: 10,
135
+ signal: controller.signal,
136
+ })
137
+ // results === ['a', 'b'] — array of return values
138
+ ```
139
+
140
+ | Option | Default | Description |
141
+ |--------|---------|-------------|
142
+ | `concurrency` | `1` | Parallel tasks |
143
+ | `stopOnError` | `true` | Abort group on first failure |
144
+ | `maxVisible` | `rows - 2` | `number` or `(terminalHeight) => number`. Active tasks prioritized. Lifted on `.clear()` |
145
+ | `signal` | — | External `AbortSignal` |
146
+
147
+ Group returns `TaskGroupPromise` with `.clear()` to remove all tasks.
148
+
149
+ ## Nesting
150
+
151
+ Tasks nest automatically via async context tracking — works across modules:
152
+
153
+ ```ts
154
+ await task('Parent', async () => {
155
+ await task('Child A', async () => { /* ... */ })
156
+ await task('Child B', async () => { /* ... */ })
157
+ })
158
+ ```
159
+
160
+ ## Renderers
161
+
162
+ **Pinned** (default): Task list fixed at bottom, spinner animates in-place, `console.log` moved above.
163
+
164
+ **Inline**: Sequential output, no cursor manipulation. Use when:
165
+ - Console.log ordering matters
166
+ - Logging to a file or pipe
167
+ - Running multiple `createTasuku()` instances concurrently
168
+
169
+ Multiple inline renderers on the same stream are supported. Multiple pinned renderers are not (they share a cursor save/restore slot). Use separate output streams for concurrent pinned instances.
170
+
171
+ ## Theme Object
172
+
173
+ ```ts
174
+ type TasukuTheme = {
175
+ spinner: string[] // pre-colored frames, e.g. [yellow('⠋'), ...]
176
+ spinnerInterval?: number // ms between frames (default: 80)
177
+ icons: {
178
+ pending: string // all pre-colored
179
+ success: string
180
+ error: string
181
+ warning: string
182
+ skipped: string
183
+ parent: string // parent task with children
184
+ parentError: string
185
+ }
186
+ colors: {
187
+ title?: (text: string, state: State, frame: number) => string
188
+ dim: (text: string) => string // status, elapsed time
189
+ secondary: (text: string) => string // output text, stream preview
190
+ error?: (text: string) => string // error output message
191
+ warning?: (text: string) => string // warning output message
192
+ }
193
+ }
194
+ ```
195
+
196
+ The `title` color receives the animation frame counter — enables per-frame effects like shimmer.
197
+
198
+ ## Options
199
+
200
+ ```ts
201
+ task('Title', fn, {
202
+ showTime: true, // auto-start elapsed timer
203
+ previewLines: 5, // max lines for streamPreview (default 5, min 1)
204
+ signal: abortSignal, // external abort signal
205
+ })
206
+ ```
207
+
208
+ ## States
209
+
210
+ | State | Icon | Trigger |
211
+ |-------|------|---------|
212
+ | pending | ◼ | Queued in group |
213
+ | loading | ⠋ | Task executing |
214
+ | success | ✔ | Task completed |
215
+ | warning | ⚠ | `setWarning(msg)` |
216
+ | error | ✖ | `setError(msg)` or thrown error |
217
+ | skipped | ⊘ | `skip(msg)` |
218
+
219
+ ## Output Stream
220
+
221
+ Default: `process.stderr`. Override via `createTasuku({ outputStream })`.
222
+
223
+ Task UI renders to stderr so stdout stays clean for program output (`mytool | jq`).
@@ -1,4 +0,0 @@
1
- var U=Object.defineProperty;var c=(o,r)=>U(o,"name",{value:r,configurable:!0});import{s as X,p as _,a as j,i as q,b as O,g as z,f as E,d as G}from"./patch-console-BZRKJTPe.mjs";const k=c((o,r)=>{let a=0,h="",e=0;for(;e<o.length;){const l=o[e];if(l==="\x1B"&&e+1<o.length){const u=o[e+1];switch(u){case"[":{for(h+=l+u,e+=2;e<o.length&&(h+=o[e],!(o[e]>="@"&&o[e]<="~"));)e+=1;break}case"]":case"P":case"_":case"^":case"X":{for(h+=l+u,e+=2;e<o.length&&(h+=o[e],o[e]!=="\x07");){if(o[e]==="\x1B"&&e+1<o.length&&o[e+1]==="\\"){h+=o[e+1],e+=1;break}e+=1}break}case"(":case")":case"*":case"+":{h+=l+u,e+=2,e<o.length&&(h+=o[e]);break}default:{h+=l+u,e+=1;break}}}else{const u=l.charCodeAt(0),d=u>=55296&&u<=56319&&e+1<o.length?l+o[e+1]:l,p=u<128?1:X(d);if(a+p>r)break;h+=d,a+=p,d.length===2&&(e+=1)}e+=1}return h},"truncateLine"),y=c(o=>{let r=0;for(let a=0;a<o.length;a+=1)o[a]===`
2
- `&&(r+=1);return r},"countNewlines"),H=c((o,r,a)=>{const e=r.isTTY===!0&&!q;let l=0,u=0,d,p,m;const x=new Map,$=new WeakSet,I=c((n,s)=>{const t=G(n,s,a);return t?(r.write(t),y(t)):0},"writeTaskOutput"),v=c((n,s)=>{const t=z(n.state,n.children.length>0,a,u);return E(n,t,s,a,l)},"getLine"),b=c((n,s=1)=>{for(const[,t]of x)t.offset>=s&&(t.offset+=n)},"incrementOffsets"),A=c((n,s)=>{const t=r.columns||80;b(1),r.write(`${k(v(n,s),t-1)}
3
- `),x.set(n,{offset:1,depth:s,outputWritten:!1})},"appendLineAtRest"),D=c((n,s,t)=>{const w=r.columns||80,g=(r.rows||24)-1;if(t-1>g){A(n,s);return}const T=k(v(n,s),w-1);b(1,t);const f=t-1;let i="";f>0&&(i+=`\x1B[${f}A`),i+=`\x1B[L${T}\x1B[${t}B\r`,r.write(i),x.set(n,{offset:t,depth:s,outputWritten:!1})},"insertLineAfterOffset"),R=c((n,s)=>{const t=(r.rows||24)-1;n.offset>t||r.write(`\x1B[${n.offset}A\r\x1B[2K${s}\x1B[${n.offset}B\r`)},"updateLineInPlace"),K=c(()=>{let n=0;for(const[,s]of x)s.outputWritten||(n+=1);return n},"countActiveTasks"),C=c((n,s,t)=>{const w=r.columns||80,g=t!==void 0;let T=t;for(const f of n){if(f.state==="pending")continue;let i=x.get(f);if(!i){if(m!==void 0&&K()>=m)continue;g?D(f,s,T):A(f,s),i=x.get(f)}let F=i.offset;if(f.children.length>0){const B=C(f.children,s+1,i.offset);B!==void 0&&(F=B)}g&&(T=F);const M=O(f.state);if(M&&!i.outputWritten){R(i,k(v(f,i.depth),w-1));const B=I(f,i.depth);B>0&&b(B),i.outputWritten=!0}else!M&&i.outputWritten&&(i.outputWritten=!1)}return g?T:void 0},"processTaskList"),L=c(()=>{const n=r.columns||80,s=(r.rows||24)-1;let t="";for(const[w,g]of x){if(g.outputWritten||w.state!=="loading"||g.offset>s)continue;const T=k(v(w,g.depth),n-1);t+=`\x1B[${g.offset}A\r\x1B[2K${T}\x1B[${g.offset}B\r`}t&&r.write(t)},"renderSpinnerFrames"),N=c(()=>{C(o,0),L()},"renderTTY"),Y=c((n,s)=>{for(const t of n)$.has(t)||O(t.state)&&($.add(t),r.write(`${v(t,s)}
4
- `),t.children.length>0&&Y(t.children,s+1),I(t,s))},"commitDoneTasksNonTTY"),P=c(()=>{e?N():Y(o,0)},"render");p=_(c((n,s)=>{if((n==="stderr"?process.stderr:process.stdout).write(s),e){const w=y(s);w>0&&b(w)}},"handleConsoleOutput"));const V=c(()=>{d||!e||(d=setInterval(()=>{l+=1,u=l%a.spinner.length,L()},a.spinnerInterval??80),d.unref())},"startSpinner"),W=c(()=>{P(),j(o)?d&&(clearInterval(d),d=void 0):V()},"renderAndManageSpinner");return{triggerRender:W,flushRender:W,renderFinal:W,destroy:c(()=>{clearInterval(d),d=void 0,p?.(),p=void 0,x.clear()},"destroy"),setMaxVisible:c(n=>{m=typeof n=="number"?n:void 0},"setMaxVisible")}},"inline");export{H as i};
@@ -1,8 +0,0 @@
1
- var Y=Object.defineProperty;var o=(e,r)=>Y(e,"name",{value:r,configurable:!0});import{AsyncLocalStorage as Z}from"node:async_hooks";import{Writable as _}from"node:stream";async function H(e,r,{concurrency:n=Number.POSITIVE_INFINITY,stopOnError:s=!0,signal:t}={}){return new Promise((c,g)=>{if(e[Symbol.iterator]===void 0&&e[Symbol.asyncIterator]===void 0)throw new TypeError(`Expected \`input\` to be either an \`Iterable\` or \`AsyncIterable\`, got (${typeof e})`);if(typeof r!="function")throw new TypeError("Mapper function is required");if(!(Number.isSafeInteger(n)&&n>=1||n===Number.POSITIVE_INFINITY))throw new TypeError(`Expected \`concurrency\` to be an integer from 1 and up or \`Infinity\`, got \`${n}\` (${typeof n})`);const u=[],l=[],y=new Map;let M=!1,T=!1,i=!1,m=0,w=0;const p=e[Symbol.iterator]===void 0?e[Symbol.asyncIterator]():e[Symbol.iterator](),d=o(()=>{h(t.reason)},"signalListener"),a=o(()=>{t?.removeEventListener("abort",d)},"cleanup"),E=o(b=>{c(b),a()},"resolve"),h=o(b=>{M=!0,T=!0,g(b),a()},"reject");t&&(t.aborted&&h(t.reason),t.addEventListener("abort",d,{once:!0}));const $=o(async()=>{if(T)return;const b=await p.next(),x=w;if(w++,b.done){if(i=!0,m===0&&!T){if(!s&&l.length>0){h(new AggregateError(l));return}if(T=!0,y.size===0){E(u);return}const R=[];for(const[v,I]of u.entries())y.get(v)!==B&&R.push(I);E(R)}return}m++,(async()=>{try{const R=await b.value;if(T)return;const v=await r(R,x);v===B&&y.set(x,v),u[x]=v,m--,await $()}catch(R){if(s)h(R);else{l.push(R),m--;try{await $()}catch(v){h(v)}}}})()},"next");(async()=>{for(let b=0;b<n;b++){try{await $()}catch(x){h(x);break}if(i||M)break}})()})}o(H,"pMap");const B=Symbol("skip"),K=o((e,r)=>new Proxy(e,{set(n,s,t){const c=Reflect.get(n,s);return Reflect.set(n,s,t),c!==t&&r(),!0}}),"reactive"),F=o(e=>e==="success"||e==="error"||e==="warning"||e==="skipped","isTerminalState"),D=o(e=>{for(const r of e)if(r.state==="loading"||r.state==="pending"||r.children&&r.children.length>0&&!D(r.children))return!1;return!0},"areAllTasksDone"),Q=5,k=o((e,r)=>{const n=[];let s=0,t="";const c=o(l=>l.split("\r").reverse().find(Boolean)??"","resolveCarriageReturn"),g=o(()=>{const l=t.includes("\r")?c(t):t,y=l?[...n,l].join(`
2
- `):n.join(`
3
- `);e.streamOutput=y,e.streamTruncatedLines=Math.max(0,s-r)},"flush"),u=new _({write(l,y,M){const i=(t+l.toString()).split(/\r?\n/);t=i.pop();for(const m of i){const w=m.includes("\r")?c(m):m;n.push(w),s+=1,n.length>r&&n.shift()}if(t.includes("\r")){const m=c(t);t=t.endsWith("\r")?`${m}\r`:m}(i.length>0||t)&&g(),M()},final(l){if(t){const y=t.includes("\r")?c(t):t;n.push(y),s+=1,n.length>r&&n.shift(),t="",g()}l()}});return u.clear=()=>{n.length=0,s=0,t="",e.streamOutput=void 0,e.streamTruncatedLines=void 0},u},"createStreamPreview");class j{static{o(this,"TaskSkipError")}message;constructor(r){this.message=r??""}}const J=o(({theme:e,renderer:r,outputStream:n})=>{const s=new Z;let t;const c=o(()=>{t?.triggerRender()},"triggerRender"),g=o((i,m,w)=>{let p;const d={signal:m,setTitle(a){i.title=a},setStatus(a){i.status=a},setOutput(a){i.output=typeof a=="string"?a:a.message},get streamPreview(){return p||(p=k(i,Math.max(1,Math.trunc(w?.previewLines??Q)))),p},setWarning(a){a?(d.setOutput(a),i.state="warning"):(i.state="loading",i.output=void 0)},setError(a){a?(d.setOutput(a),i.state="error"):(i.state="loading",i.output=void 0)},skip(a){throw new j(a)},startTime:o(()=>{i.startedAt=Date.now(),i.elapsedMs=void 0},"startTime"),stopTime:o(()=>i.startedAt===void 0?0:(i.elapsedMs=Date.now()-i.startedAt,i.startedAt=void 0,i.elapsedMs),"stopTime")};return{api:d,dispose:o(()=>p?.destroy(),"dispose")}},"createTaskInnerApi"),u=o(i=>{t||(t=r(i,n??process.stderr,e),i.isRoot=!0)},"ensureRenderer"),l=o((i,m,w,p)=>{const d=K({title:m,state:"pending",children:[]},c);return i.push(d),{task:d,run:o(async a=>{const E=s.getStore()?.abortController.signal,h=new AbortController,$=[a,p?.signal,E].filter(Boolean),b=o(function(){h.abort(this.reason)},"forwardAbort");for(const f of $){if(f.aborted){h.abort(f.reason);break}f.addEventListener("abort",b)}const x=o(()=>{for(const f of $)f.removeEventListener("abort",b)},"cleanupSignalListeners"),{signal:R}=h,{api:v,dispose:I}=g(d,R,p);d.state="loading",p?.showTime&&v.startTime();let P;try{P=await s.run({children:d.children,abortController:h},()=>w(v))}catch(f){if(f instanceof j){v.stopTime(),f.message&&(d.output=f.message),d.state="skipped",I(),x(),t?.flushRender();return}throw h.abort(f),v.stopTime(),v.setError(f instanceof Error||typeof f=="object"&&f!==null&&"message"in f&&typeof f.message=="string"?f:String(f)),I(),x(),t?.flushRender(!0),f}return v.stopTime(),I(),x(),d.state==="loading"&&(d.state="success"),t?.flushRender(),P},"run"),clear:o(()=>{const a=i.indexOf(d);a!==-1&&i.splice(a,1),t&&(i.isRoot&&i.length===0?(t.renderFinal(),t.destroy(),t=void 0):t.triggerRender())},"clear")}},"registerTask"),y=o(i=>{const w=i.run();return Object.defineProperties(w,{state:{get:o(()=>i.task.state,"get"),enumerable:!0,configurable:!0},warning:{get:o(()=>i.task.state==="warning"?i.task.output:void 0,"get"),enumerable:!0,configurable:!0},error:{get:o(()=>i.task.state==="error"?i.task.output:void 0,"get"),enumerable:!0,configurable:!0},skipped:{get:o(()=>i.task.state==="skipped"?i.task.output:void 0,"get"),enumerable:!0,configurable:!0},clear:{value:o(()=>{const{state:p}=i.task;return F(p)?i.clear():w.finally(()=>i.clear()).catch(()=>{}),w},"value"),enumerable:!0,configurable:!0}}),w},"createTaskPromise");return o(i=>{const m=o((w,p,d)=>{const a=s.getStore()?.children??i;u(a);const E=l(a,w,p,d);return y(E)},"task");return m.group=((w,p)=>{const d=s.getStore()?.children??i;u(d);const a=w((f,C,z)=>l(d,f,C,z));p?.maxVisible!==void 0&&t&&t.setMaxVisible(p.maxVisible);const E=new AbortController,h=p?.signal,$=o(function(){E.abort(this.reason)},"forwardGroupAbort");h&&(h.aborted?E.abort(h.reason):h.addEventListener("abort",$));const b=E.signal,x=p?.stopOnError!==!1,I=H(a,async f=>{try{return await f.run(b)}catch(C){throw x&&E.abort(C),C}},{concurrency:p?.concurrency??1,stopOnError:x,signal:b}).finally(()=>{h&&h.removeEventListener("abort",$)}),P=o(()=>{for(const f of a)f.clear();p?.maxVisible!==void 0&&t&&t.setMaxVisible(void 0)},"clearAll");return Object.assign(I,{clear:o(()=>(a.every(({task:C})=>F(C.state))?P():I.finally(()=>P()).catch(()=>{}),I),"clear")}),I}),m},"createTaskFunction")([])},"createTasuku");function X({onlyFirst:e=!1}={}){const t="(?:\\u001B\\][\\s\\S]*?(?:\\u0007|\\u001B\\u005C|\\u009C))|[\\u001B\\u009B][[\\]()#;?]*(?:\\d{1,4}(?:[;:]\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]";return new RegExp(t,e?void 0:"g")}o(X,"ansiRegex");const ee=X();function te(e){if(typeof e!="string")throw new TypeError(`Expected a \`string\`, got \`${typeof e}\``);return!e.includes("\x1B")&&!e.includes("\x9B")?e:e.replace(ee,"")}o(te,"stripAnsi");const O=[161,161,164,164,167,168,170,170,173,174,176,180,182,186,188,191,198,198,208,208,215,216,222,225,230,230,232,234,236,237,240,240,242,243,247,250,252,252,254,254,257,257,273,273,275,275,283,283,294,295,299,299,305,307,312,312,319,322,324,324,328,331,333,333,338,339,358,359,363,363,462,462,464,464,466,466,468,468,470,470,472,472,474,474,476,476,593,593,609,609,708,708,711,711,713,715,717,717,720,720,728,731,733,733,735,735,768,879,913,929,931,937,945,961,963,969,1025,1025,1040,1103,1105,1105,8208,8208,8211,8214,8216,8217,8220,8221,8224,8226,8228,8231,8240,8240,8242,8243,8245,8245,8251,8251,8254,8254,8308,8308,8319,8319,8321,8324,8364,8364,8451,8451,8453,8453,8457,8457,8467,8467,8470,8470,8481,8482,8486,8486,8491,8491,8531,8532,8539,8542,8544,8555,8560,8569,8585,8585,8592,8601,8632,8633,8658,8658,8660,8660,8679,8679,8704,8704,8706,8707,8711,8712,8715,8715,8719,8719,8721,8721,8725,8725,8730,8730,8733,8736,8739,8739,8741,8741,8743,8748,8750,8750,8756,8759,8764,8765,8776,8776,8780,8780,8786,8786,8800,8801,8804,8807,8810,8811,8814,8815,8834,8835,8838,8839,8853,8853,8857,8857,8869,8869,8895,8895,8978,8978,9312,9449,9451,9547,9552,9587,9600,9615,9618,9621,9632,9633,9635,9641,9650,9651,9654,9655,9660,9661,9664,9665,9670,9672,9675,9675,9678,9681,9698,9701,9711,9711,9733,9734,9737,9737,9742,9743,9756,9756,9758,9758,9792,9792,9794,9794,9824,9825,9827,9829,9831,9834,9836,9837,9839,9839,9886,9887,9919,9919,9926,9933,9935,9939,9941,9953,9955,9955,9960,9961,9963,9969,9972,9972,9974,9977,9979,9980,9982,9983,10045,10045,10102,10111,11094,11097,12872,12879,57344,63743,65024,65039,65533,65533,127232,127242,127248,127277,127280,127337,127344,127373,127375,127376,127387,127404,917760,917999,983040,1048573,1048576,1114109],L=[12288,12288,65281,65376,65504,65510],S=[4352,4447,8986,8987,9001,9002,9193,9196,9200,9200,9203,9203,9725,9726,9748,9749,9776,9783,9800,9811,9855,9855,9866,9871,9875,9875,9889,9889,9898,9899,9917,9918,9924,9925,9934,9934,9940,9940,9962,9962,9970,9971,9973,9973,9978,9978,9981,9981,9989,9989,9994,9995,10024,10024,10060,10060,10062,10062,10067,10069,10071,10071,10133,10135,10160,10160,10175,10175,11035,11036,11088,11088,11093,11093,11904,11929,11931,12019,12032,12245,12272,12287,12289,12350,12353,12438,12441,12543,12549,12591,12593,12686,12688,12773,12783,12830,12832,12871,12880,42124,42128,42182,43360,43388,44032,55203,63744,64255,65040,65049,65072,65106,65108,65126,65128,65131,94176,94180,94192,94198,94208,101589,101631,101662,101760,101874,110576,110579,110581,110587,110589,110590,110592,110882,110898,110898,110928,110930,110933,110933,110948,110951,110960,111355,119552,119638,119648,119670,126980,126980,127183,127183,127374,127374,127377,127386,127488,127490,127504,127547,127552,127560,127568,127569,127584,127589,127744,127776,127789,127797,127799,127868,127870,127891,127904,127946,127951,127955,127968,127984,127988,127988,127992,128062,128064,128064,128066,128252,128255,128317,128331,128334,128336,128359,128378,128378,128405,128406,128420,128420,128507,128591,128640,128709,128716,128716,128720,128722,128725,128728,128732,128735,128747,128748,128756,128764,128992,129003,129008,129008,129292,129338,129340,129349,129351,129535,129648,129660,129664,129674,129678,129734,129736,129736,129741,129756,129759,129770,129775,129784,131072,196605,196608,262141],W=o((e,r)=>{let n=0,s=Math.floor(e.length/2)-1;for(;n<=s;){const t=Math.floor((n+s)/2),c=t*2;if(r<e[c])s=t-1;else if(r>e[c+1])n=t+1;else return!0}return!1},"isInRange"),ne=O[0],re=O.at(-1),oe=L[0],se=L.at(-1),ie=S[0],ce=S.at(-1),V=19968,[ae,ue]=le(S);function le(e){let r=e[0],n=e[1];for(let s=0;s<e.length;s+=2){const t=e[s],c=e[s+1];if(V>=t&&V<=c)return[t,c];c-t>n-r&&(r=t,n=c)}return[r,n]}o(le,"findWideFastPathRange");const fe=o(e=>e<ne||e>re?!1:W(O,e),"isAmbiguous"),de=o(e=>e<oe||e>se?!1:W(L,e),"isFullWidth"),pe=o(e=>e>=ae&&e<=ue?!0:e<ie||e>ce?!1:W(S,e),"isWide");function ge(e){if(!Number.isSafeInteger(e))throw new TypeError(`Expected a code point, got \`${typeof e}\`.`)}o(ge,"validate");function q(e,{ambiguousAsWide:r=!1}={}){return ge(e),de(e)||pe(e)||r&&fe(e)?2:1}o(q,"eastAsianWidth");const me=new Intl.Segmenter,he=new RegExp("^(?:\\p{Default_Ignorable_Code_Point}|\\p{Control}|\\p{Format}|\\p{Mark}|\\p{Surrogate})+$","v"),we=new RegExp("^[\\p{Default_Ignorable_Code_Point}\\p{Control}\\p{Format}\\p{Mark}\\p{Surrogate}]+","v"),be=new RegExp("^\\p{RGI_Emoji}$","v"),ve=/^[\d#*]\u20E3$/,xe=new RegExp("\\p{Extended_Pictographic}","gu");function ye(e){if(e.length>50)return!1;if(ve.test(e))return!0;if(e.includes("\u200D")){const r=e.match(xe);return r!==null&&r.length>=2}return!1}o(ye,"isDoubleWidthNonRgiEmojiSequence");function Ee(e){return e.replace(we,"")}o(Ee,"baseVisible");function Re(e){return he.test(e)}o(Re,"isZeroWidthCluster");function Ie(e,r){let n=0;if(e.length>1)for(const s of e.slice(1))s>="\uFF00"&&s<="\uFFEF"&&(n+=q(s.codePointAt(0),r));return n}o(Ie,"trailingHalfwidthWidth");function $e(e,r={}){if(typeof e!="string"||e.length===0)return 0;const{ambiguousIsNarrow:n=!0,countAnsiEscapeCodes:s=!1}=r;let t=e;if(!s&&(t.includes("\x1B")||t.includes("\x9B"))&&(t=te(t)),t.length===0)return 0;if(/^[\u0020-\u007E]*$/.test(t))return t.length;let c=0;const g={ambiguousAsWide:!n};for(const{segment:u}of me.segment(t)){if(Re(u))continue;if(be.test(u)||ye(u)){c+=2;continue}const l=Ee(u).codePointAt(0);c+=q(l,g),c+=Ie(u,g)}return c}o($e,"stringWidth");const Te=o(e=>{const r=Math.floor(e/1e3);if(r<60)return`(${r}s)`;const n=Math.floor(r/60);if(n<60){const c=r%60;return`(${n}m ${c}s)`}const s=Math.floor(n/60),t=n%60;return`(${s}h ${t}m)`},"formatElapsed"),Ce=o((e,r,n,s,t)=>{const c=" ".repeat(n),g=s.colors.title?s.colors.title(e.title,e.state,t):e.title;let u=`${c}${r} ${g}`;e.status&&(u+=` ${s.colors.dim(`[${e.status}]`)}`);const l=e.elapsedMs??(e.startedAt===void 0?void 0:Date.now()-e.startedAt);return l!==void 0&&l>=1e3&&(u+=` ${s.colors.dim(Te(l))}`),u},"formatTaskLine"),Ae=o((e,r,n)=>{const s=`${" ".repeat(r)} `;let t="";if(e.output){const c=e.state==="error"&&n.colors.error||e.state==="warning"&&n.colors.warning||n.colors.secondary,g=e.output.split(`
4
- `);for(let u=0;u<g.length;u+=1){const l=u===0?`${n.colors.secondary("\u2192")} `:" ";t+=`${s}${l}${c(g[u])}
5
- `}}if(e.streamOutput){const c=`${s} `,g=e.streamOutput.split(`
6
- `);for(let u=0;u<g.length;u+=1){const l=u===0?`${s}\u23BF `:c;t+=`${l}${n.colors.secondary(g[u])}
7
- `}e.streamTruncatedLines&&(t+=`${c}${n.colors.secondary(`(+ ${e.streamTruncatedLines} lines)`)}
8
- `)}return t},"formatTaskOutput"),Me=o((e,r,n,s)=>{switch(e){case"loading":return r?n.icons.parent:n.spinner[s];case"success":return r?n.icons.parent:n.icons.success;case"error":return r?n.icons.parentError:n.icons.error;case"warning":return n.icons.warning;case"skipped":return n.icons.skipped;default:return n.icons.pending}},"getIcon"),Pe=!!(process.env.CI||process.env.CONTINUOUS_INTEGRATION||process.env.BUILD_NUMBER),G=["assert","count","countReset","debug","dir","dirxml","error","group","groupCollapsed","groupEnd","info","log","table","time","timeEnd","timeLog","trace","warn"],A=[],N=new Map,U=o(e=>{const r=o(s=>new _({write(t,c,g){e(s,String(t)),g()}}),"createStream"),n=new console.Console(r("stdout"),r("stderr"));for(const s of G)console[s]=n[s]},"installPatch"),Se=o(e=>{if(A.length===0)for(const r of G)N.set(r,console[r]);return A.push(e),U(e),()=>{const r=A.indexOf(e);if(r!==-1)if(A.splice(r,1),A.length===0){for(const[n,s]of N)console[n]=s;N.clear()}else U(A.at(-1))}},"patchConsole");export{D as a,F as b,J as c,Ae as d,Ce as f,Me as g,Pe as i,Se as p,$e as s};
@@ -1,6 +0,0 @@
1
- var ne=Object.defineProperty;var s=(i,n)=>ne(i,"name",{value:n,configurable:!0});import{i as k,p as oe,a as P,s as re,g as ie,f as te,d as le}from"./patch-console-BZRKJTPe.mjs";import m from"node:process";import ae from"node:os";const W=globalThis.window?.document!==void 0;globalThis.process?.versions?.node,globalThis.process?.versions?.bun,globalThis.Deno?.version?.deno,globalThis.process?.versions?.electron,globalThis.navigator?.userAgent?.includes("jsdom"),typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope,typeof DedicatedWorkerGlobalScope<"u"&&globalThis instanceof DedicatedWorkerGlobalScope,typeof SharedWorkerGlobalScope<"u"&&globalThis instanceof SharedWorkerGlobalScope,typeof ServiceWorkerGlobalScope<"u"&&globalThis instanceof ServiceWorkerGlobalScope;const L=globalThis.navigator?.userAgentData?.platform;L==="macOS"||globalThis.navigator?.platform==="MacIntel"||globalThis.navigator?.userAgent?.includes(" Mac ")===!0||globalThis.process?.platform,L==="Windows"||globalThis.navigator?.platform==="Win32"||globalThis.process?.platform,L==="Linux"||globalThis.navigator?.platform?.startsWith("Linux")===!0||globalThis.navigator?.userAgent?.includes(" Linux ")===!0||globalThis.process?.platform,L==="Android"||globalThis.navigator?.platform==="Android"||globalThis.navigator?.userAgent?.includes(" Android ")===!0||globalThis.process?.platform;const c="\x1B[",X=!W&&m.env.TERM_PROGRAM==="Apple_Terminal",ce=!W&&m.platform==="win32";!W&&(m.env.TERM?.startsWith("screen")||m.env.TERM?.startsWith("tmux")||m.env.TMUX),W||m.cwd;const de=s((i=1)=>c+i+"A","cursorUp"),fe=s((i=1)=>c+i+"B","cursorDown"),ue=X?"\x1B7":c+"s",pe=X?"\x1B8":c+"u",ge=c+"J",K=c+"2J",he=s(()=>{if(W||!ce)return!1;const i=ae.release().split("."),n=Number(i[0]),d=Number(i[2]??0);return n<10||n===10&&d<10586},"isOldWindows");he()?`${K}${c}`:`${K}${c}${c}`;const Te=s((i,n,d)=>{let C=0,B=0,f,p,G="",T=!1,A=!1,F=!1,z;const M=n.isTTY===!0,H=M&&!k,I=s(()=>{k||(n.write(ue),A=!0)},"savePosition"),y=s(()=>{A&&n.write(pe+ge)},"clearRenderArea");let g,D=n.rows||24;const Q=s(()=>{if(g!==void 0){const e=typeof g=="function"?g(D):g;return Math.max(1,e)}return Math.max(5,D-2)},"getVisibleLinesLimit"),O=s((e,o)=>{const l=e.children&&e.children.length>0,h=ie(e.state,l,d,B);let t=`${te(e,h,o,d,C)}
2
- `;return t+=le(e,o,d),l&&(t+=N(e.children,o+1)),t},"renderTask"),J=s(e=>e==="loading"?0:e==="pending"?1:2,"getStatePriority");let w=!1;const N=s((e,o=0)=>{if(o===0)if(w&&g===void 0)T=!1;else{const h=Q(),t=e.map(r=>O(r,o));if(t.reduce((r,a)=>r+a.split(`
3
- `).length-1,0)<=h)return T=!1,t.join("");const u=[...e].sort((r,a)=>J(r.state)-J(a.state));let v="",_=0,E=0;for(let r=0;r<u.length;r+=1){const a=O(u[r],o),b=a.split(`
4
- `).length-1,$=r<u.length-1?1:0;if(_+b+$>h&&E>0)break;v+=a,_+=b,E+=1}const q=u.slice(E);if(T=q.length>0,T){const r=[];let a=0,b=0,R=0;for(const $ of q)$.state==="loading"?a+=1:$.state==="pending"?b+=1:R+=1;a>0&&r.push(`${a} loading`),b>0&&r.push(`${b} queued`),R>0&&r.push(`${R} completed`),v+=`${d.colors.dim(`(+ ${r.join(", ")})`)}
5
- `}return v}return e.map(l=>O(l,o)).join("")},"renderTaskList"),Z=s((e,o)=>{y(),(e==="stderr"?process.stderr:process.stdout).write(o),I(),i.length>0&&!F&&x()},"handleConsoleOutput"),V=s(()=>{f||!M||k||(f=setInterval(()=>{C+=1,B=C%d.spinner.length,S()},d.spinnerInterval??80),f.unref())},"startSpinner"),x=s((e=!1)=>{const o=N(i),l=P(i);if(l&&f?(clearInterval(f),f=void 0):!l&&!f&&V(),k&&!e){l&&o!==G&&(n.write(o),G=o);return}if(y(),A||I(),n.write(o),G=o,M){const h=n.columns||80;let t=0;const j=o.split(`
6
- `);for(let u=0;u<j.length-1;u+=1){const v=re(j[u]);t+=v<=h?1:Math.ceil(v/h)}t>0&&(n.write(de(t)),I(),n.write(fe(t)))}},"render"),S=s(()=>{p||(p=setTimeout(()=>{p=void 0,x()},33))},"scheduleRender"),ee=s((e=!1)=>{!e&&!H||(p&&(clearTimeout(p),p=void 0),x(),P(i)&&T&&(F=!0))},"flushRender"),U=s(()=>{D=n.rows||24,S()},"handleResize"),se=s(()=>{process.off("exit",Y),n.off("resize",U),clearInterval(f),clearTimeout(p),z?.(),y(),A=!1},"destroy"),Y=s(()=>{T&&P(i)&&(g=void 0,w=!0,x(),w=!1)},"handleExit");return M&&n.on("resize",U),H&&process.on("exit",Y),k||(z=oe(Z),V()),{triggerRender:S,flushRender:ee,renderFinal:s(()=>{w=!0,x(!0),w=!1},"renderFinal"),destroy:se,setMaxVisible:s(e=>{g=e},"setMaxVisible")}},"pinned");export{Te as p};