agentix-cli 0.31.0 → 0.32.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{App-6TP7YMQ3.js → App-2LAWZNMG.js} +2 -2
- package/dist/{ChatApp-G2MQUBR3.js → ChatApp-2KRDHMTV.js} +2 -2
- package/dist/{agent-A5G4DGVU.js → agent-ZRRIMLTX.js} +2 -2
- package/dist/{board-dashboard-BU6QJK6X.js → board-dashboard-LL3YVODL.js} +4 -4
- package/dist/{chunk-JC6ZHSTY.js → chunk-2DBGOCCW.js} +2 -2
- package/dist/chunk-2DMVKLLE.js +13 -0
- package/dist/chunk-2DMVKLLE.js.map +1 -0
- package/dist/chunk-2GIDVZ4H.js +3 -0
- package/dist/{chunk-EVWEG3VD.js.map → chunk-2GIDVZ4H.js.map} +1 -1
- package/dist/{chunk-2J3NV6RZ.js → chunk-4CR463C6.js} +2 -2
- package/dist/{chunk-7JWYLSFF.js → chunk-5FEQI22L.js} +2 -2
- package/dist/{chunk-COOJI5SR.js → chunk-6VQKHMEQ.js} +40 -40
- package/dist/chunk-6VQKHMEQ.js.map +1 -0
- package/dist/{chunk-R7WLFEW3.js → chunk-A4YR3PQY.js} +2 -2
- package/dist/{chunk-NZ346QCV.js → chunk-B2XTYYXV.js} +2 -2
- package/dist/{chunk-DLOYTMYZ.js → chunk-G5MFPNGJ.js} +2 -2
- package/dist/{chunk-JV52UMCI.js → chunk-GWQIMAJ7.js} +2 -2
- package/dist/{chunk-ZZQMR526.js → chunk-H57XXGMF.js} +96 -94
- package/dist/chunk-H57XXGMF.js.map +1 -0
- package/dist/{chunk-W6HKWISZ.js → chunk-JGJE5Y2J.js} +2 -2
- package/dist/{chunk-FFDXDUVQ.js → chunk-JWKIFAXA.js} +2 -2
- package/dist/{chunk-JJIYFBDH.js → chunk-K6E7WJ7O.js} +2 -2
- package/dist/{chunk-6DD4DA2L.js → chunk-MFVI5FOM.js} +2 -2
- package/dist/{chunk-UOGDSRG3.js → chunk-W3YGESNK.js} +2 -2
- package/dist/{chunk-7MNXKITO.js → chunk-WFIBOAXN.js} +3 -3
- package/dist/cli.js +1 -1
- package/dist/client-IP643GRO.js +2 -0
- package/dist/config-IVDP46ZG.js +2 -0
- package/dist/config-mutator-UCGAV3SP.js +2 -0
- package/dist/doctor-MMT4SREV.js +2 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.js +1 -1
- package/dist/program-7ULXLTD6.js +2 -0
- package/dist/query-RHVR6QUZ.js +2 -0
- package/dist/{registry-LUMYXZ6F.js → registry-OB6S66XX.js} +2 -2
- package/dist/{request-planner-RNQB4L6F.js → request-planner-F5NVL2G7.js} +2 -2
- package/dist/{review-candidates-ZX4JBWQL.js → review-candidates-IRPKFWL2.js} +2 -2
- package/dist/{rotation-memo-7T75BLEX.js → rotation-memo-QEO3COFH.js} +3 -3
- package/dist/rotation-memo-QEO3COFH.js.map +1 -0
- package/dist/{routing-5VGXQ4VG.js → routing-OSPRKRAY.js} +2 -2
- package/dist/scheduler-JL6K5HHI.js +2 -0
- package/dist/{seat-SXPFROXT.js → seat-2MHKVMW2.js} +2 -2
- package/dist/{select-GJ47QACY.js → select-7LCHJVPK.js} +2 -2
- package/dist/wiki-MY32MON3.js +2 -0
- package/package.json +2 -1
- package/dist/chunk-COOJI5SR.js.map +0 -1
- package/dist/chunk-EVWEG3VD.js +0 -3
- package/dist/chunk-Z3RKXKE2.js +0 -13
- package/dist/chunk-Z3RKXKE2.js.map +0 -1
- package/dist/chunk-ZZQMR526.js.map +0 -1
- package/dist/client-QALLJG62.js +0 -2
- package/dist/config-TNNODULV.js +0 -2
- package/dist/config-mutator-RI77M5YT.js +0 -2
- package/dist/doctor-DW27MR2T.js +0 -2
- package/dist/program-WZ3GEOXO.js +0 -2
- package/dist/query-7X6VO5VU.js +0 -2
- package/dist/rotation-memo-7T75BLEX.js.map +0 -1
- package/dist/scheduler-W5C43ZTE.js +0 -2
- package/dist/wiki-SRH3JKI4.js +0 -2
- /package/dist/{App-6TP7YMQ3.js.map → App-2LAWZNMG.js.map} +0 -0
- /package/dist/{ChatApp-G2MQUBR3.js.map → ChatApp-2KRDHMTV.js.map} +0 -0
- /package/dist/{agent-A5G4DGVU.js.map → agent-ZRRIMLTX.js.map} +0 -0
- /package/dist/{board-dashboard-BU6QJK6X.js.map → board-dashboard-LL3YVODL.js.map} +0 -0
- /package/dist/{chunk-JC6ZHSTY.js.map → chunk-2DBGOCCW.js.map} +0 -0
- /package/dist/{chunk-2J3NV6RZ.js.map → chunk-4CR463C6.js.map} +0 -0
- /package/dist/{chunk-7JWYLSFF.js.map → chunk-5FEQI22L.js.map} +0 -0
- /package/dist/{chunk-R7WLFEW3.js.map → chunk-A4YR3PQY.js.map} +0 -0
- /package/dist/{chunk-NZ346QCV.js.map → chunk-B2XTYYXV.js.map} +0 -0
- /package/dist/{chunk-DLOYTMYZ.js.map → chunk-G5MFPNGJ.js.map} +0 -0
- /package/dist/{chunk-JV52UMCI.js.map → chunk-GWQIMAJ7.js.map} +0 -0
- /package/dist/{chunk-W6HKWISZ.js.map → chunk-JGJE5Y2J.js.map} +0 -0
- /package/dist/{chunk-FFDXDUVQ.js.map → chunk-JWKIFAXA.js.map} +0 -0
- /package/dist/{chunk-JJIYFBDH.js.map → chunk-K6E7WJ7O.js.map} +0 -0
- /package/dist/{chunk-6DD4DA2L.js.map → chunk-MFVI5FOM.js.map} +0 -0
- /package/dist/{chunk-UOGDSRG3.js.map → chunk-W3YGESNK.js.map} +0 -0
- /package/dist/{chunk-7MNXKITO.js.map → chunk-WFIBOAXN.js.map} +0 -0
- /package/dist/{client-QALLJG62.js.map → client-IP643GRO.js.map} +0 -0
- /package/dist/{config-TNNODULV.js.map → config-IVDP46ZG.js.map} +0 -0
- /package/dist/{config-mutator-RI77M5YT.js.map → config-mutator-UCGAV3SP.js.map} +0 -0
- /package/dist/{doctor-DW27MR2T.js.map → doctor-MMT4SREV.js.map} +0 -0
- /package/dist/{program-WZ3GEOXO.js.map → program-7ULXLTD6.js.map} +0 -0
- /package/dist/{query-7X6VO5VU.js.map → query-RHVR6QUZ.js.map} +0 -0
- /package/dist/{registry-LUMYXZ6F.js.map → registry-OB6S66XX.js.map} +0 -0
- /package/dist/{request-planner-RNQB4L6F.js.map → request-planner-F5NVL2G7.js.map} +0 -0
- /package/dist/{review-candidates-ZX4JBWQL.js.map → review-candidates-IRPKFWL2.js.map} +0 -0
- /package/dist/{routing-5VGXQ4VG.js.map → routing-OSPRKRAY.js.map} +0 -0
- /package/dist/{scheduler-W5C43ZTE.js.map → scheduler-JL6K5HHI.js.map} +0 -0
- /package/dist/{seat-SXPFROXT.js.map → seat-2MHKVMW2.js.map} +0 -0
- /package/dist/{select-GJ47QACY.js.map → select-7LCHJVPK.js.map} +0 -0
- /package/dist/{wiki-SRH3JKI4.js.map → wiki-MY32MON3.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/agents/rotation-memo.ts"],"sourcesContent":["import { execFile } from \"child_process\"\nimport type { AgentDef } from \"@/daemon/config\"\nimport { buildAgentEnv, claudeBillingEnv } from \"@/utils/workspace-env\"\n\n// --- Pre-rotation memo extraction ---\n//\n// Just before agentx clears `claudeSessionId` (tier-2 / max-turns / stale\n// rotation), we ask the dying Claude session to dump the facts and\n// decisions it should carry forward. The agent has full working-memory\n// of its tool-use history at this moment — the only chance to capture\n// it before --resume is dropped and the next turn starts with a blank\n// session.\n//\n// The memo persists into MemoryStore, where the existing findRelevant\n// path injects it into future turns naturally. No new wiring on the\n// read side; one-shot LLM call on the write side.\n//\n// Hard rule: never block rotation. Timeout, errors, empty memos all\n// mean \"skip this round of memo capture\". Memory continuity is a\n// best-effort enhancement, not a correctness requirement.\n\nconst MEMO_TIMEOUT_MS = 30_000\nconst MEMO_MODEL = \"haiku\" // cheapest fast model — memo is summarisation, not reasoning\n\nconst MEMO_PROMPT =\n \"You are about to lose this working session due to context-size rotation. \" +\n \"Before that happens, write a compact memo of what you should carry forward \" +\n \"to your next session on the same conversation.\\n\\n\" +\n \"Include only durable facts a future turn would otherwise have to rediscover:\\n\" +\n \"- Names, handles, agent ids, telegram/whatsapp/gitlab usernames\\n\" +\n \"- File paths, URLs, project namespaces, ssh hosts, ports\\n\" +\n \"- Decisions made and their reasoning\\n\" +\n \"- Open tasks or commitments to follow up on\\n\" +\n \"- Identifiers (issue numbers, PR numbers, ticket ids) the user referred to\\n\\n\" +\n \"Format: 3-12 short bullet points. Each ≤120 chars. No prose, no preamble, \" +\n \"no header. If the session was uninformative or just casual chat, reply with \" +\n \"exactly the literal text \\\"(no memo)\\\".\\n\\n\" +\n \"Begin the memo now.\"\n\nexport interface RotationMemoResult {\n /** The extracted memo text, or null when extraction failed/skipped. */\n memo: string | null\n /** Why we skipped or what happened — \"ok\", \"timeout\", \"error\", \"empty\", \"no-resume\". */\n reason: string\n /** Wall-clock time spent in the extractor. */\n durationMs: number\n}\n\n/** Ask the dying Claude session for a carry-forward memo. Spawns one\n * short claude CLI call with --resume on the about-to-be-dropped\n * session id, asks for a compact memo, returns the text. Never throws\n * — every failure mode resolves with `memo=null` so the caller can\n * proceed with the rotation regardless. */\nexport async function extractRotationMemo(\n agent: AgentDef,\n resumeSessionId: string | undefined,\n): Promise<RotationMemoResult> {\n const start = Date.now()\n if (!resumeSessionId) {\n return { memo: null, reason: \"no-resume\", durationMs: 0 }\n }\n\n const args: string[] = [\n \"-p\", MEMO_PROMPT,\n \"--output-format\", \"json\",\n \"--resume\", resumeSessionId,\n \"--model\", MEMO_MODEL,\n ]\n if (agent.permissionMode === \"bypassPermissions\") {\n args.push(\"--dangerously-skip-permissions\")\n }\n\n const env = claudeBillingEnv(buildAgentEnv(agent.workspace), agent.billing)\n\n return new Promise<RotationMemoResult>((resolve) => {\n let settled = false\n const finish = (memo: string | null, reason: string) => {\n if (settled) return\n settled = true\n resolve({ memo, reason, durationMs: Date.now() - start })\n }\n\n const child = execFile(\n \"claude\",\n args,\n {\n cwd: agent.workspace,\n env,\n timeout: MEMO_TIMEOUT_MS,\n maxBuffer: 1024 * 1024, // 1 MB; the memo itself is tiny\n },\n (err, stdout, _stderr) => {\n if (err) {\n // execFile signals timeout via signal SIGTERM + err.killed\n if ((err as NodeJS.ErrnoException & { killed?: boolean }).killed) {\n return finish(null, \"timeout\")\n }\n return finish(null, `error:${err.message.slice(0, 80)}`)\n }\n try {\n const data = JSON.parse(stdout || \"{}\")\n // claude -p --output-format json yields { result, ... }\n const text = typeof data.result === \"string\" ? data.result.trim() : \"\"\n if (!text || text === \"(no memo)\") return finish(null, \"empty\")\n // Defensive cap: memos > 4 KB are almost certainly the LLM\n // ignoring instructions and dumping prose. Truncate.\n const capped = text.length > 4096 ? text.slice(0, 4096) + \"…\" : text\n return finish(capped, \"ok\")\n } catch {\n return finish(null, \"parse-error\")\n }\n },\n )\n child.on(\"error\", () => finish(null, \"spawn-error\"))\n })\n}\n"],"mappings":"2EAAA,OAAS,YAAAA,MAAgB,gBAqBzB,IAAMC,EAAkB,IAClBC,EAAa,QAEbC,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBA4BF,eAAsBC,EACpBC,EACAC,EAC6B,CAC7B,IAAMC,EAAQ,KAAK,IAAI,EACvB,GAAI,CAACD,EACH,MAAO,CAAE,KAAM,KAAM,OAAQ,YAAa,WAAY,CAAE,EAG1D,IAAME,EAAiB,CACrB,KAAML,EACN,kBAAmB,OACnB,WAAYG,EACZ,UAAWJ,CACb,EACIG,EAAM,iBAAmB,qBAC3BG,EAAK,KAAK,gCAAgC,EAG5C,IAAMC,EAAMC,EAAiBC,EAAcN,EAAM,SAAS,EAAGA,EAAM,OAAO,EAE1E,OAAO,IAAI,QAA6BO,GAAY,CAClD,IAAIC,EAAU,GACRC,EAAS,CAACC,EAAqBC,IAAmB,CAClDH,IACJA,EAAU,GACVD,EAAQ,CAAE,KAAAG,EAAM,OAAAC,EAAQ,WAAY,KAAK,IAAI,EAAIT,CAAM,CAAC,EAC1D,EAEcU,EACZ,SACAT,EACA,CACE,IAAKH,EAAM,UACX,IAAAI,EACA,QAASR,EACT,UAAW,KAAO,IACpB,EACA,CAACiB,EAAKC,EAAQC,IAAY,CACxB,GAAIF,EAEF,OAAKA,EAAqD,OACjDJ,EAAO,KAAM,SAAS,EAExBA,EAAO,KAAM,SAASI,EAAI,QAAQ,MAAM,EAAG,EAAE,GAAG,EAEzD,GAAI,CACF,IAAMG,EAAO,KAAK,MAAMF,GAAU,IAAI,EAEhCG,EAAO,OAAOD,EAAK,QAAW,SAAWA,EAAK,OAAO,KAAK,EAAI,GACpE,GAAI,CAACC,GAAQA,IAAS,YAAa,OAAOR,EAAO,KAAM,OAAO,EAG9D,IAAMS,EAASD,EAAK,OAAS,KAAOA,EAAK,MAAM,EAAG,IAAI,EAAI,SAAMA,EAChE,OAAOR,EAAOS,EAAQ,IAAI,CAC5B,MAAE,CACA,OAAOT,EAAO,KAAM,aAAa,CACnC,CACF,CACF,EACM,GAAG,QAAS,IAAMA,EAAO,KAAM,aAAa,CAAC,CACrD,CAAC,CACH","names":["execFile","MEMO_TIMEOUT_MS","MEMO_MODEL","MEMO_PROMPT","extractRotationMemo","agent","resumeSessionId","start","args","env","claudeBillingEnv","buildAgentEnv","resolve","settled","finish","memo","reason","execFile","err","stdout","_stderr","data","text","capped"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a,b}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=routing-
|
|
1
|
+
import{a,b}from"./chunk-W3YGESNK.js";import"./chunk-2DBGOCCW.js";import"./chunk-ZTEU5JVQ.js";import"./chunk-AJONZWLT.js";import"./chunk-F4HZTZHW.js";import"./chunk-LCIREYTD.js";import"./chunk-L2WSPY6S.js";import"./chunk-2DMVKLLE.js";import"./chunk-BH3GTCZ6.js";import"./chunk-FIOB3MEX.js";export{a as cheapModelForEngine,b as routeTaskModel};
|
|
2
|
+
//# sourceMappingURL=routing-OSPRKRAY.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{g as a,h as b}from"./chunk-A4YR3PQY.js";import"./chunk-JWKIFAXA.js";import"./chunk-ZTEU5JVQ.js";import"./chunk-L2WSPY6S.js";import"./chunk-2DMVKLLE.js";import"./chunk-FIOB3MEX.js";export{b as CronScheduler,a as getNextCronDate};
|
|
2
|
+
//# sourceMappingURL=scheduler-JL6K5HHI.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{o as a,p as b,q as c,r as d,s as e,t as f,u as g,v as h,w as i}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=seat-
|
|
1
|
+
import{o as a,p as b,q as c,r as d,s as e,t as f,u as g,v as h,w as i}from"./chunk-2DBGOCCW.js";import"./chunk-ZTEU5JVQ.js";import"./chunk-AJONZWLT.js";import"./chunk-F4HZTZHW.js";import"./chunk-LCIREYTD.js";import"./chunk-L2WSPY6S.js";import"./chunk-2DMVKLLE.js";import"./chunk-BH3GTCZ6.js";import"./chunk-FIOB3MEX.js";i();export{h as askSeat,a as configureDecisions,c as decisionsRuntime,f as getSeatMode,d as parseSeatMode,g as recordSeatOutcome,b as resetDecisionsRuntime,e as seatEnvVar};
|
|
2
|
+
//# sourceMappingURL=seat-2MHKVMW2.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{v as S,w}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=select-
|
|
1
|
+
import{v as S,w}from"./chunk-2DBGOCCW.js";import"./chunk-ZTEU5JVQ.js";import"./chunk-AJONZWLT.js";import{a as g,b as h,f as R}from"./chunk-F4HZTZHW.js";import"./chunk-LCIREYTD.js";import"./chunk-L2WSPY6S.js";import{d as f}from"./chunk-VDMYBPYB.js";import"./chunk-2DMVKLLE.js";import"./chunk-BH3GTCZ6.js";import"./chunk-FIOB3MEX.js";w();R();var p="skill-select";function y(l){return{task:d(l.task,1200),...l.agent?{agent:l.agent}:{},skills:l.candidates.map(t=>({name:t.name,purpose:d(t.description,300),...t.category?{category:t.category}:{},...t.tags?.length?{tags:t.tags.slice(0,8)}:{}}))}}function b(l){let t={};for(let i of l)t[i.name]=d(i.description,300);return{anyRelevant:g("At least one of these skills is about the task at hand.",{true:"The task is the kind of work one of these skills exists for, and following it would change how the work is done \u2014 it names the same system, the same procedure or the same kind of artefact.",false:"None of them is about this task. They may share vocabulary with it, mention the same tools, or belong to the same project without bearing on what is being asked. Sharing words with a task is not being about it."}),best:h(t,"Which skill is this task most about?")}}function v(l){let t=l.anyRelevant,i=l.best,o=Object.entries(i.probabilities??{}).map(([e,s])=>({name:e,p:Number(s)||0})).sort((e,s)=>s.p-e.p);return{anyRelevant:t.noul,name:i.choice,confidence:i.confidence,ranked:o}}function d(l,t){return l.length>t?`${l.slice(0,t)}\u2026`:l}var x=.1,A=12;async function E(l,t,i={}){let o=i.minRelevant??.6,e=f(l,t).filter(n=>n.relevance>=x).slice(0,A),s=e.map(n=>({name:n.skill.frontmatter.name,lexical:n.relevance}));if(e.length===0)return{skill:null,anyRelevant:0,confidence:0,shortlist:s,judged:!1,reason:"no skill mentions anything in this task"};if(e.length===1)return{skill:e[0].skill,anyRelevant:e[0].relevance,confidence:e[0].relevance,shortlist:s,judged:!1,reason:`only ${e[0].skill.frontmatter.name} matched (${e[0].matchReason})`};let r=e.map(n=>({name:n.skill.frontmatter.name,description:n.skill.frontmatter.description,category:n.skill.frontmatter.category??null,tags:n.skill.frontmatter.tags})),m=await S(p,y({task:t,agent:i.agent??null,candidates:r}),b(r),{incumbent:{best:r[0].name},features:{agent:i.agent??"unknown",candidates:r.length}});if(!m)return{skill:e[0].skill,anyRelevant:e[0].relevance,confidence:e[0].relevance,shortlist:s,judged:!1,reason:`seat off \u2014 lexical top match (${e[0].matchReason})`};let a=v(m.answers),c=s.map(n=>({...n,p:a.ranked.find(k=>k.name===n.name)?.p??0})).sort((n,k)=>(k.p??0)-(n.p??0));if(a.anyRelevant<o)return{skill:null,anyRelevant:a.anyRelevant,confidence:a.confidence,shortlist:c,judged:!0,reason:`nothing on the shortlist is about this task (${a.anyRelevant.toFixed(2)} below ${o})`};let u=e.find(n=>n.skill.frontmatter.name===a.name);return u?{skill:u.skill,anyRelevant:a.anyRelevant,confidence:a.confidence,shortlist:c,judged:!0,reason:`${a.name} (confidence ${a.confidence.toFixed(2)})`}:{skill:null,anyRelevant:a.anyRelevant,confidence:a.confidence,shortlist:c,judged:!0,reason:`seat chose "${a.name}", which was not on the shortlist`}}export{E as pickSkillForTask};
|
|
2
|
+
//# sourceMappingURL=select-7LCHJVPK.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import"./chunk-VWTBHLMX.js";import{e as a,f as b}from"./chunk-MFVI5FOM.js";import"./chunk-PNWNVOEZ.js";import"./chunk-64P4QHSZ.js";import{a as c}from"./chunk-JGJE5Y2J.js";import"./chunk-AJ5RMU7X.js";import"./chunk-2GIDVZ4H.js";import"./chunk-2DBGOCCW.js";import"./chunk-ZTEU5JVQ.js";import"./chunk-AJONZWLT.js";import"./chunk-F4HZTZHW.js";import"./chunk-QOYAX2FT.js";import"./chunk-LCIREYTD.js";import"./chunk-L2WSPY6S.js";import"./chunk-2DMVKLLE.js";import"./chunk-BH3GTCZ6.js";import"./chunk-FIOB3MEX.js";export{b as WikiHub,a as WikiStore,c as agenticQuery};
|
|
2
|
+
//# sourceMappingURL=wiki-MY32MON3.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agentix-cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.32.0",
|
|
4
4
|
"description": "AI operations layer for small and medium businesses. Routes Telegram, WhatsApp, GitLab, GitHub, crons, webhooks, and mesh tasks to AI agents. Web wizard for operators, CLI for engineers. Self-hosted.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": {
|
|
@@ -56,6 +56,7 @@
|
|
|
56
56
|
"build:web": "tsup --config tsup.web.config.ts",
|
|
57
57
|
"dev": "tsup --watch",
|
|
58
58
|
"typecheck": "tsc --noEmit",
|
|
59
|
+
"bench:context": "tsx bench/context-size.ts",
|
|
59
60
|
"test": "vitest run",
|
|
60
61
|
"clean": "rimraf dist",
|
|
61
62
|
"format:write": "prettier --write \"src/**/*.{ts,tsx,mdx}\" --cache",
|