jaz-clio 5.24.8 → 5.24.9
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/assets/skills/api/SKILL.md +1 -1
- package/assets/skills/api/references/endpoints.md +1 -1
- package/assets/skills/cli/SKILL.md +1 -1
- package/assets/skills/cli/references/command-catalog.md +1 -1
- package/assets/skills/conversion/SKILL.md +1 -1
- package/assets/skills/jaz-pseudo-sql/SKILL.md +1 -1
- package/assets/skills/jobs/SKILL.md +1 -1
- package/assets/skills/transaction-recipes/SKILL.md +1 -1
- package/assets/templates/platform-rules/jaz-agent-rules.md +1 -1
- package/cli.mjs +3 -3
- package/package.json +1 -1
|
@@ -2380,7 +2380,7 @@ Batch-record judgment entries (1-100 per call). Per-entry independent: acks come
|
|
|
2380
2380
|
{ "data": { "records": [{ "resourceId": "...", "replayed": false, "duplicateCount": 0 }] } }
|
|
2381
2381
|
```
|
|
2382
2382
|
|
|
2383
|
-
`kind`: CLASSIFICATION, MATCH, SCOPE, ASSUMPTION, RISK, METHOD, RECOVERY, DEVIATION. `tier`: LOW, MEDIUM, HIGH, CRITICAL. `refs` entries are OBJECTS: the string grammar `TYPE:resourceId[#field][:RELATION]` travels in `raw` (an unparseable ref is stored with `parsed: false`, never bounced). Optional fields: `ruledOut`, `frame`, `confidence`, `citedRule`, `workflowLabel`, `agentLabel`. `idempotencyKey` makes retries safe: a replay returns the existing entry with `replayed: true`.
|
|
2383
|
+
`kind`: CLASSIFICATION, MATCH, SCOPE, ASSUMPTION, RISK, METHOD, RECOVERY, DEVIATION, NOTE (the neutral fallback for a judgment logged without a declared type; a missing or blank `kind` defaults to NOTE and is flagged, not rejected). `tier`: LOW, MEDIUM, HIGH, CRITICAL. `refs` entries are OBJECTS: the string grammar `TYPE:resourceId[#field][:RELATION]` travels in `raw` (an unparseable ref is stored with `parsed: false`, never bounced). Optional fields: `ruledOut`, `frame`, `confidence`, `citedRule`, `workflowLabel`, `agentLabel`. `idempotencyKey` makes retries safe: a replay returns the existing entry with `replayed: true`.
|
|
2384
2384
|
|
|
2385
2385
|
### POST /api/v1/jots/search
|
|
2386
2386
|
|
|
@@ -517,7 +517,7 @@ Blueprints are offline (no auth). Tools require auth.
|
|
|
517
517
|
### `clio jots` · Judgment journal
|
|
518
518
|
| Subcommand | Key flags |
|
|
519
519
|
|------------|-----------|
|
|
520
|
-
| `create` | `--kind` (CLASSIFICATION, MATCH, SCOPE, ASSUMPTION, RISK, METHOD, RECOVERY, DEVIATION), `--tier` (LOW, MEDIUM, HIGH, CRITICAL), `--call`, `--why`, `--ruled-out`, `--ref` (repeatable, grammar `TYPE:resourceId[#field][:RELATION]`), `--frame`, `--confidence`, `--cited-rule`, `--workflow-label`, `--agent-label`, `--idempotency-key`, `--input` (batch JSON), `--json` |
|
|
520
|
+
| `create` | `--kind` (CLASSIFICATION, MATCH, SCOPE, ASSUMPTION, RISK, METHOD, RECOVERY, DEVIATION, NOTE), `--tier` (LOW, MEDIUM, HIGH, CRITICAL), `--call`, `--why`, `--ruled-out`, `--ref` (repeatable, grammar `TYPE:resourceId[#field][:RELATION]`), `--frame`, `--confidence`, `--cited-rule`, `--workflow-label`, `--agent-label`, `--idempotency-key`, `--input` (batch JSON), `--json` |
|
|
521
521
|
| `recall` | `--ref`, `--kind`, `--tier`, `--disposition-verb` (FLAG, REJECT, ENDORSE), `--freetext`, `--created-from`, `--created-to`, `--stats`, `--limit`, `--offset`, `--all`, `--max-rows`, `--format`, `--json` |
|
|
522
522
|
| `dispose <resourceId>` | `--verb` (FLAG, REJECT, ENDORSE), `--note`, `--json` |
|
|
523
523
|
|
|
@@ -52,5 +52,5 @@ A jot is a one-line record of a judgment call: the decision and why. The org's j
|
|
|
52
52
|
|
|
53
53
|
- **Two ways to write one.** The `jot` field on the mutation you are already making (`"MATCH: distinct from BILL bil_x, references differ"`), or the `jot` tool alone. Jot AFTER the write succeeds, never before, and carry the record's resourceId.
|
|
54
54
|
- **Recall before repeating.** Call `recall` before repeating a judgment on the same record, kind, or workflow: a prior call with its basis beats re-deriving; a flag on it is a warning.
|
|
55
|
-
- **
|
|
55
|
+
- **9 kinds:** CLASSIFICATION · MATCH · SCOPE · ASSUMPTION · RISK · METHOD · RECOVERY · DEVIATION · NOTE.
|
|
56
56
|
- Optional and non-blocking: a jot never delays or fails the action it rides on.
|
package/cli.mjs
CHANGED
|
@@ -864,7 +864,7 @@ btType enum: SALE = invoice, PURCHASE = bill, SALE_CREDIT_NOTE = customer CN, PU
|
|
|
864
864
|
|
|
865
865
|
Each result carries contactSignals (Mid-7: cadence, outliers, severity, divergences from contact's modal pattern; null if no contact / no history) and breakdown (Balance-panel payload: line items + subtotal/tax/total/balance/exchange rate). Top-level contactSignalsMeta.unavailable=true \u2192 freshness layer offline for whole batch.
|
|
866
866
|
|
|
867
|
-
USE THIS to score a specific draft against contact history. For stand-alone "what does this contact normally look like?" without a draft \u2192 use get_contact_signals.`,params:{items:{type:"array",description:"Draft business transaction references (max 500). Mix any btType freely.",items:{type:"object",properties:{btResourceId:{type:"string",description:"Draft BT resource ID (UUID) \u2014 required"},btType:{type:"string",enum:["SALE","PURCHASE","SALE_CREDIT_NOTE","PURCHASE_CREDIT_NOTE"],description:"Required"}}}}},required:["items"],group:"drafts",readOnly:!0,isConcurrencySafe:!0,searchHint:"validate drafts eligibility check before convert promote",execute:async(t,e)=>(bv(e.items),_z(t.client,e.items))},{name:"convert_drafts_to_active",description:`BULK promote \u2014 finalize up to 500 draft business transactions to ACTIVE in ONE call, mixing any combination of invoices, bills, and credit notes (no per-type tools needed). ${Ol} NOT idempotent: a second call on already-promoted drafts returns 422. Filter the draft list by status: DRAFT before submitting. Pair with validate_drafts for a pre-flight check on large batches.`,params:{items:{type:"array",description:"Draft BT references (max 500). Mix any btType.",items:{type:"object",properties:{btResourceId:{type:"string",description:"Draft BT resource ID (UUID) \u2014 required"},btType:{type:"string",enum:["SALE","PURCHASE","SALE_CREDIT_NOTE","PURCHASE_CREDIT_NOTE"],description:"Required"}}}}},required:["items"],group:"drafts",readOnly:!1,searchHint:"convert drafts to active promote finalize bulk",execute:async(t,e)=>(bv(e.items),Dz(t.client,e.items))},{name:"submit_drafts_for_approval",description:`BULK submit \u2014 route up to 500 draft business transactions into the approval workflow in ONE call, mixing any combination of invoices, bills, and credit notes. ${Ol} NOT idempotent on drafts that already have an in-flight approval request.`,params:{items:{type:"array",description:"Draft BT references (max 500). Mix any btType.",items:{type:"object",properties:{btResourceId:{type:"string",description:"Draft BT resource ID (UUID) \u2014 required"},btType:{type:"string",enum:["SALE","PURCHASE","SALE_CREDIT_NOTE","PURCHASE_CREDIT_NOTE"],description:"Required"}}}}},required:["items"],group:"drafts",readOnly:!1,searchHint:"submit drafts for approval workflow review bulk",execute:async(t,e)=>(bv(e.items),Sz(t.client,e.items))},{name:"search_help_center",description:'Search the Jaz help center for how-to articles, feature guides, and accounting concepts. Use this for "how do I..." or "what is..." questions about Jaz: bank reconciliation, GST/VAT filing, multi-currency, fixed assets, custom fields, integrations, and so on. Returns top matching articles with title, section, content, and source URL.',params:{query:{type:"string",description:'Natural-language question or keywords (e.g. "how do I reconcile a bank statement", "set up GST", "multi-currency invoice").'},limit:{type:"number",description:"Maximum number of articles to return (default 3, max 10)."},section:{type:"string",description:'Optional: restrict to a single help-center section slug (e.g. "bank-reconciliations", "invoices").'}},required:["query"],group:"help_center",readOnly:!0,searchHint:"help center docs how to guide article search question",isConcurrencySafe:!0,maxResultSizeChars:2e4,execute:async(t,e)=>{let r=String(e.query??"").trim();if(!r)return{error:"Query is required.",hint:"Pass a natural-language question or keywords."};let n=typeof e.limit=="number"&&!Number.isNaN(e.limit)?e.limit:3,i=Math.max(1,Math.min(10,Math.floor(n))),o=typeof e.section=="string"?e.section:void 0;try{let s=Ox();if(o&&!s.sections.some(u=>u.slug===o))return{error:`Unknown section: "${o}".`,available:s.sections.map(u=>u.slug),hint:"Omit the section parameter to search every section, or pick a slug from the available list."};let a=Fx(),c=await Qx(s,a,r,{mode:"hybrid",limit:i,section:o});return c.length===0?{results:[],hint:"No matching articles. Try broader keywords or rephrase the question."}:{results:c.map(u=>{let d=(Wle(u.article)??u.article.snippet).slice(0,1500);return{title:u.article.title,section:u.section.name,sectionSlug:u.section.slug,content:d,url:u.article.sourceUrl,score:Math.round(u.score*1e3)/1e3,scoreKind:u.scoreKind,matchedTerms:u.matchedTerms}}),totalArticles:s.articleCount,searchedSections:o?[o]:void 0}}catch(s){return{error:"Help center search failed.",detail:s instanceof Error?s.message:String(s),hint:"The bundled help-center index may be missing or corrupt."}}}},{name:"jot",description:"Record judgment entries in the org's judgment journal. THE RULE: log a judgment when you chose among real alternatives and a write followed, or when you deliberately decided NOT to write; skip mechanical actions and calls where the platform, the data, or the user left you no choice. Jot AFTER the write succeeds, never before, and carry the written record's resourceId in refs. Kinds: CLASSIFICATION account/tax/category choice \xB7 MATCH decided which records correspond \xB7 SCOPE chose what is in or out of a set \xB7 ASSUMPTION filled a gap the data left open \xB7 RISK proceeded despite a known concern \xB7 METHOD picked a calculation or approach \xB7 RECOVERY decided how to proceed after a failure (incl. holding a write) \xB7 DEVIATION knowingly departed from a stated rule. Accepting or rejecting an inbound external document (an e-invoice a counterparty sent) is a FINALIZE act, so pin it. A decided omission (you deliberately did not post something) is RECOVERY, which pins via withheld-write, not DEVIATION. Always give why: a call without a basis is half a record. Batch related entries in one call; each entry is acked independently.",params:{entries:{type:"array",description:"Judgment entries to record (1-100). A bad entry never fails the batch: it acks with error while siblings persist.",items:{type:"object",properties:{kind:{type:"string",enum:["CLASSIFICATION","MATCH","SCOPE","ASSUMPTION","RISK","METHOD","RECOVERY","DEVIATION"],description:"Judgment kind: one-liners in the tool description."},tier:{type:"string",enum:["LOW","MEDIUM","HIGH","CRITICAL"],description:"Severity you assign the call."},call:{type:"string",description:'The decision, one line (e.g. "Posted to 6420 Travel: recurring Grab vendor pattern").'},why:{type:"string",description:"The basis for the call: a call without a basis is half a record."},ruledOut:{type:"string",description:"Alternatives considered and set aside."},refs:{type:"array",description:"Entity refs this judgment touches. Include the written record's resourceId.",items:{type:"string",description:'Grammar TYPE:resourceId[#field][:RELATION], e.g. "INVOICE:41f6\u2026:CREATE". RELATION: CREATE UPDATE DELETE FINALIZE PAY RECONCILE TRIGGER SUBJECT INPUT REJECTED SUPERSEDES (default SUBJECT).'}},frame:{type:"string",description:'For set-shaped subjects: the defining query + counts (e.g. "search_bills status=UNPAID \xB7 41 in scope, 4 deferred").'},confidence:{type:"string",enum:["LOW","MEDIUM","HIGH"],description:"Routing hint for review attention."},citedRule:{type:"string",description:"Org rule, policy, threshold, or precedent applied."},workflowLabel:{type:"string",description:"Short workflow label (e.g. month-end-close)."},agentLabel:{type:"string",description:"Self-reported product/model (e.g. jaz-clio/claude); informative, never authoritative."},idempotencyKey:{type:"string",description:"Retry key: a replay returns the existing entry, not a duplicate."}},required:["kind","tier","call"]}}},required:["entries"],group:"jots",readOnly:!1,alwaysLoaded:!0,searchHint:"jot judgment judgement journal record decision log rationale reasoning why chose ruled out classification match scope assumption risk method recovery deviation basis precedent note after write",execute:async(t,e)=>gv(t.client,e.entries)},{name:"recall",description:"Search the org's judgment journal (jots) for precedents, prior judgment calls with their basis. Check BEFORE repeating a judgment on the same entity, kind of decision, or workflow: a prior call with its why beats re-deriving from scratch; a FLAG or REJECT disposition on it is a warning, ENDORSE a strong precedent. Sort is pinned server-side (CRITICAL and withheld-write RECOVERY entries first, then newest). An empty page means no prior judgments match this filter, or none are recorded for this org yet.",params:{ref:{type:"string",description:'Entity ref filter, TYPE:resourceId (e.g. "INVOICE:41f626a3-\u2026").'},kind:{type:"string",enum:["CLASSIFICATION","MATCH","SCOPE","ASSUMPTION","RISK","METHOD","RECOVERY","DEVIATION"],description:"Judgment kind filter."},tier:{type:"string",enum:["LOW","MEDIUM","HIGH","CRITICAL"],description:"Severity tier filter."},dispositionVerb:{type:"string",enum:["FLAG","REJECT","ENDORSE"],description:"Only entries carrying at least one disposition with this verb."},freetext:{type:"string",description:"Case-insensitive substring over call and why."},createdFrom:{type:"number",description:"Created-at lower bound, epoch ms (inclusive)."},createdTo:{type:"number",description:"Created-at upper bound, epoch ms (inclusive)."},limit:{type:"number",description:"Max results per page (1-1000, default 100)."},offset:{type:"number",description:"Page number, 0-indexed."},includeStats:{type:"boolean",description:"Include per-credential disposition counts."}},required:[],group:"jots",readOnly:!0,isConcurrencySafe:!0,searchHint:"recall search jots judgment judgement journal precedent prior decisions rationale history dispositions flagged rejected endorsed lookup why",maxResultSizeChars:2e4,execute:async(t,e)=>{let r={};for(let n of["ref","kind","tier","dispositionVerb","freetext"])typeof e[n]=="string"&&e[n]&&(r[n]=e[n]);for(let n of["createdFrom","createdTo"])typeof e[n]=="number"&&(r[n]=e[n]);return dH(t.client,{...typeof e.limit=="number"?{limit:e.limit}:{},...typeof e.offset=="number"?{offset:e.offset}:{},...Object.keys(r).length?{filter:r}:{},...e.includeStats===!0?{includeStats:!0}:{}})}},{name:"present_questions",description:`Present the user with a bounded multiple-choice question (or a short sequence of them) as an interactive pick-list, instead of asking in prose. Use as your FINAL action when the user must choose among a KNOWN, finite set of options you ALREADY have from context (a prior search/list result, org defaults, or your own knowledge) to continue (e.g. "which bank account?", "which of these duplicate bills?"). Give 2-4 options per question \u2014 curate to the most likely, never dump a long list \u2014 and at most 4 questions; set multiSelect per question when more than one may apply. List the options and stop \u2014 the user's pick arrives as their next message and starts a new turn. Ask several questions at once when more than one thing is unspecified. Prose-ask only when there's no bounded set to offer (a free-text name or amount), to confirm destructive actions, or instead of fetching data just to populate options. Terminal: do not call further tools or re-list the options in text afterward.`,params:{questions:{type:"array",description:"Questions to ask, each rendered as one page of the pick-list (at most 4). Provide one unless you genuinely have several distinct choices to collect in sequence.",items:{type:"object",properties:{header:{type:"string",description:'Optional short eyebrow label categorizing the question (1-2 words, e.g. "Account", "Period").'},question:{type:"string",description:'The question, shown as the card title (e.g. "Which bank account should I inspect?").'},options:{type:"array",description:"2-4 concrete choices (hard cap \u2014 curate to the most likely; the user can still type a different answer if none fit).",items:{type:"object",properties:{label:{type:"string",description:"The choice shown on the row and relayed verbatim as the user's answer when picked \u2014 keep it self-contained and unambiguous."},description:{type:"string",description:'Optional one-line detail under the label (e.g. "554 unreconciled records").'}},required:["label"]}},multiSelect:{type:"boolean",description:"Set true to let the user select multiple options for this question; omit or false for a single pick."}},required:["question","options"]}}},required:["questions"],group:"interaction",alwaysLoaded:!0,interactive:!0,readOnly:!0,isConcurrencySafe:!0,searchHint:"present questions options choices pick select ask user interactive widget",maxResultSizeChars:2e4,execute:async(t,e)=>{let n=(Array.isArray(e?.questions)?e.questions:[]).filter(o=>typeof o=="object"&&o!==null).map(o=>{let s=(Array.isArray(o.options)?o.options:[]).filter(c=>typeof c=="object"&&c!==null).map(c=>{let u=String(c.label??"").trim();return c.description?{label:u,description:String(c.description)}:{label:u}}).filter(c=>c.label),a=String(o.question??"").trim();return{...o.header?{header:String(o.header)}:{},question:a,options:s,multiSelect:!!o.multiSelect}}).filter(o=>o.question&&o.options.length>=2);if(n.length===0)return{error:"present_questions needs at least one question with non-empty question text and \u22652 labeled options (a single-option pick-list is not a choice).",hint:"Provide questions: [{ question, options: [{ label }, { label }] }]. For open-ended input, ask in prose instead."};if(n.length>4)return{error:`present_questions renders at most 4 questions (got ${n.length}).`,hint:"Ask the 4 most important now; collect the rest on a later turn."};let i=n.find(o=>o.options.length>4);return i?{error:`Each question may offer at most 4 options ("${i.question}" has ${i.options.length}).`,hint:"Curate to the 4 most likely choices \u2014 the user can still type a different answer if none fit."}:{questions:n}}},{name:"navigate",description:'Dashboard navigation: discover destinations, then build deep links. Without `destination`: lists valid destinations as { key, label, kind } \u2014 filter with `query` (substring over key + label), `resource` (e.g. "sales"), or `kind` ("screen" | "modal"); results are capped, narrow if `truncated`. With `destination`: builds the URL to hand the user \u2014 a screen (e.g. "reports.profit-and-loss") or a record modal (e.g. "sales.modal.view-sale"); pass `resourceId` only for a record-specific modal (view/edit one record), never for screens or create/"new" modals. Returns { url, kind, label }; the link opens in the user\'s current org. Never write dashboard URLs or destination keys from memory \u2014 call with no destination to discover keys first.',params:{destination:{type:"string",description:'Destination key to link to, e.g. "reports.profit-and-loss" or "sales.modal.view-sale". Omit to discover valid keys instead.'},resourceId:{type:"string",description:"Jaz resourceId of the record to focus \u2014 only with a record-modal destination (view/edit a specific record). Omit for screens and create modals."},query:{type:"string",description:'Discovery only: case-insensitive substring over destination keys and labels (e.g. "invoice", "p&l", "bank").'},resource:{type:"string",description:'Discovery only: restrict to one resource namespace, e.g. "sales", "purchases", "reports", "settings".'},kind:{type:"string",description:'Discovery only: restrict to "screen" (list/report pages) or "modal" (record view/create/edit).',enum:["screen","modal"]}},required:[],group:"navigation",alwaysLoaded:!0,readOnly:!0,isConcurrencySafe:!0,aliases:["find_dashboard_destinations","get_dashboard_url"],searchHint:"dashboard url deep link navigate go to open screen record modal page share shareable list destinations keys catalog",maxResultSizeChars:16e3,execute:async(t,e)=>{let r=typeof e.destination=="string"&&e.destination?e.destination:void 0,n=typeof e.resourceId=="string"&&e.resourceId?e.resourceId:void 0;if(!r){if(n)return{error:"resourceId given without destination - pass the record-modal destination key, or omit resourceId to discover destinations."};let o=e.kind==="screen"||e.kind==="modal"?e.kind:void 0,s=iQe({query:typeof e.query=="string"?e.query:void 0,resource:typeof e.resource=="string"?e.resource:void 0,kind:o});return s.truncated?{...s,hint:`Showing ${s.results.length} of ${s.total} matches. Narrow with a more specific query, resource, or kind.`}:s.results.length===0?{...s,hint:'No matches. Destinations are named by product area, not task wording \u2014 retry with a broader or synonym term (e.g. "billing" not "card", "sales" not "invoice payment", "settings", "reports", "bank") before concluding the destination does not exist.'}:s}let{dashboardUrl:i}=K1e(t.platform??"jaz");try{return nQe(r,n,{dashboardUrl:i,orgResourceId:t.org?.resourceId})}catch(o){return{error:o instanceof Error?o.message:String(o)}}}}];W1e(Qc)});function Gbr(){if(!vv){vv=new Map;for(let t of Qc)vv.set(t.name,t);for(let t of Qc)for(let e of t.aliases??[])vv.has(e)||vv.set(e,t)}return vv}function lf(t){return Gbr().get(t)}function nT(){return Uue||(Uue=Qc.filter(t=>!t.disabled)),Uue}function Jbr(){return $ue||($ue=nT().filter(t=>!t.interactive)),$ue}function cnt(t){return t!==void 0&&Vbr.has(t)?nT():Jbr()}function zh(t){return nT().filter(e=>e.group===t)}var vv,Uue,Vbr,$ue,py=X(()=>{"use strict";rT();vv=null,Uue=null;Vbr=new Set(["chat"]),$ue=null});function Zat(t,e=5){let r=t.trim().toLowerCase();if(!r)return[];let n=r.split(/[\s_-]+/).filter(o=>o.length>=2&&!DIr.has(o));return n.length===0?[]:Uc.map(o=>{let s=0,a=o.name.toLowerCase(),c=o.description.toLowerCase();(a===r||a===r.replace(/\s+/g,"_"))&&(s+=5),a.includes(r)&&(s+=3),c.includes(r)&&(s+=1);for(let u of n)a.includes(u)&&(s+=2),c.includes(u)&&(s+=1);return{ns:o,score:s}}).filter(o=>o.score>0).sort((o,s)=>s.score-o.score).slice(0,e).map(o=>o.ns)}var Uc,DIr,xT=X(()=>{"use strict";Uc=[{name:"invoices",description:"Sales invoices (INV/SI). Create, search, get, update, delete, pay, finalize, apply credits, download PDF. Also: receivables, AR, AR aging, billing, overdue invoices, dunning, recurring invoices. To create from an uploaded invoice file/PDF/image, use the document_ai namespace (AI extraction), not manual entry.",groups:["invoices"]},{name:"customer_credit_notes",description:"Customer credit notes (CN). Create, search, update, delete, finalize, refund, download PDF. Also: sales returns, customer CN.",groups:["customer_credit_notes"]},{name:"bills",description:"Purchase bills (PO/PI). Create, search, get, update, delete, pay, finalize, apply credits. Also: payables, AP, vendor invoices, supplier bills. To create from an uploaded bill/invoice file/PDF/image, use the document_ai namespace (AI extraction), not manual entry.",groups:["bills"]},{name:"supplier_credit_notes",description:"Supplier credit notes. Create, search, update, delete, finalize, refund. Also: purchase returns, debit notes, supplier CN.",groups:["supplier_credit_notes"]},{name:"sale_orders",description:"Sales order documents: Sale Quotes (estimates/quotations) and Sale Orders. Create, get, search, update, and transition (accept a quote, confirm an order, void, delete). A Sale Order links to its quote via saleQuoteResourceId; the quote must be accepted first. Tracks fulfillment via orderState. Pipeline: quote \u2192 order \u2192 invoice (raise the invoice separately).",groups:["sale_orders"]},{name:"purchase_orders",description:"Purchase order documents: Purchase Requests (requisitions) and Purchase Orders (POs). Create, get, search, update, and transition (accept a request, confirm an order, void, delete). A Purchase Order links to its request via purchaseRequestResourceId; the request must be accepted first. Tracks fulfillment via orderState. Pipeline: request \u2192 order \u2192 bill (raise the bill separately).",groups:["purchase_orders"]},{name:"journals",description:"Journal entries (JE). Create, search, update, delete manual journals. Also: adjusting entries, accruals, reclassifications, corrections.",groups:["journals"]},{name:"cash_entries",description:"Cash-in receipts and cash-out disbursements for external cash movements. WHEN TO USE: money received from customers/external \u2192 cash-in. Money paid to suppliers/external \u2192 cash-out. For internal account-to-account transfers, use cash_transfers namespace.",groups:["cash_entries"]},{name:"cash_transfers",description:"Cash transfers between your own bank/cash accounts and cashflow transaction search. WHEN TO USE: moving funds between own accounts (main bank \u2192 petty cash, USD \u2192 SGD). For external receipts/payments, use cash_entries namespace.",groups:["cash_transfers"]},{name:"bank_accounts",description:"Bank accounts, bank statement imports (CSV/OFX), bank records search, auto-reconciliation. For unreconciled queries: ALWAYS search bank records with status UNRECONCILED after listing accounts. Also: bank feeds, bank balance.",groups:["bank"]},{name:"bank_rules",description:"Bank reconciliation rules (action shortcuts). Create, search, update, delete bank rules. Configure auto-matching rules for bank records.",groups:["bank_rules"]},{name:"reconciliations",description:"Apply a reconciliation decision to a bank statement entry \u2014 write side. Match bank records to EXISTING open bills/invoices/payments (reconcile_with_payments \u2014 the primary path, creates the payment for you), or to journals, cash entries, or transfers, or CREATE new bills/invoices (invoice_receipt/bill_receipt). Distinct from bank_accounts/bank_rules (which configure auto-reconciliation) and view_auto_reconciliation (which queries suggestions). Eleven endpoints: quick_reconcile + apply_bank_rule + magic_match (bulk), and direct_cash_entry / cash_journal / manual_journal / cash_transfer / invoice_receipt / bill_receipt / with_payments / learned_prediction (per-entry). Match-to-existing is preferred over create-new to avoid duplicates. Most fields prefill from the bank entry when omitted; FX is resolved server-side.",groups:["reconciliations"]},{name:"financial_reports",description:"Core financial statements: trial balance (TB), balance sheet (BS/B/S), profit & loss (PnL/P&L/income statement), cash flow, general ledger (GL), cash balance/position, equity movement, VAT/GST ledger. Also: how profitable, what is the balance. XLSX/PDF file exports of any of these statements are produced via download_export (lives in operational_reports namespace \u2014 switch there or call by name).",groups:["financial_reports"]},{name:"operational_reports",description:"Aging and operational reports: aged receivables (AR aging), aged payables (AP aging), AR report, bank balance summary, bank reconciliation reports, fixed asset (FA) summary, FA reconciliation. Data exports (CSV/Excel/XLSX). Anomaly detection and audit analysis: anomalous invoices, anomalous bills, cashflow anomalies, GL journal audit, exchange rate audit, receivables customer risk, cash expense health. Also: overdue analysis, how much owed, suspicious transactions, audit trail.",groups:["operational_reports","exports"]},{name:"pseudo_sql",description:"Pseudo-SQL ad-hoc read-only queries against the curated reporting schema (custom select, custom report, query data, run sql). Includes live schema introspection (get_pseudo_sql_schema) + sync preview (\u2264100 rows) + async CSV export. Use when search_* / download_export canonical reports don't cover the question.",groups:["pseudo_sql"]},{name:"contacts",description:"Contacts (customers/suppliers/vendors), contact groups, customer segmentation. Create, search, get, update, delete contacts. Bulk upsert contacts from CSV / spreadsheet imports \u2014 async, returns jobId, poll background_jobs. List/create contact groups.",groups:["contacts","contact_groups"]},{name:"items_and_inventory",description:"Products, services, inventory items. Create, search, get, update, delete items. Check inventory balance. List/search purchase-side catalog items. Also: SKU, catalog, stock.",groups:["items","inventory","purchase_items"]},{name:"catalogs",description:"Catalogs \u2014 named groupings of products/services, optionally scoped to contact groups. Create, search, get, update, delete catalogs.",groups:["catalogs"]},{name:"tags_and_custom_fields",description:"Tags for categorizing transactions. Custom fields for adding metadata (text, date, dropdown). Create, search, delete tags and custom fields.",groups:["tags","custom_fields"]},{name:"nano_classifiers",description:"Nano classifiers (tracking categories/dimensions). List, search, create, update, delete classifiers and their classes. Used for line-item tagging and dimensional reporting. Also: tracking categories, cost centers, departments, projects.",groups:["nano_classifiers"]},{name:"chart_of_accounts",description:"Chart of accounts (COA/GL accounts). Create, search, update accounts \u2014 including setting or removing an account's period lock date (lock / unlock a period, lock date: block recording or editing transactions on the account dated on or before a date). Bookmarks (favorites/shortcuts). Also: ledger codes, account types.",groups:["accounts","bookmarks"]},{name:"currencies",description:"Currencies, exchange rates (FX/forex). List/add org currencies. Set, update, import currency rates. Also: multi-currency, FX rates.",groups:["currencies"]},{name:"tax_profiles",description:"Tax profiles (GST/VAT/sales tax), withholding tax codes (WHT/ATC). Search, create, update tax profiles. List WHT codes.",groups:["tax_profiles"]},{name:"claim_settings",description:"Employee-expense claim configuration (Settings -> Claim Settings): claim types (expense categories) and claim profiles (per-employee policy: approver, limits, visible types, balance account). Full CRUD + search on each.",groups:["claim_types","claim_profiles"]},{name:"posting_rules",description:"Claim posting rules \u2014 how approved employee-expense claims group into journals at conversion (outer/inner grouping axes, line templates, default reimbursement bank). Full CRUD + search.",groups:["posting_rules"]},{name:"claims",description:'Employee-expense claims (the Claims area / Employees). Search, get, update DRAFT claims (line items, employee, vendor), and drive the lifecycle: submit, approve, reject, cancel, unpost (reverse conversion), delete. Status flow DRAFT \u2192 SUBMITTED \u2192 APPROVED \u2192 CONVERTED ("Processed"), or REJECTED / CANCELLED. Claims are born via document attachment / conversion (no bare create); the server enforces legal transitions.',groups:["claims"]},{name:"claim_processing",description:"Process employee-expense claims: convert APPROVED claims into journal entries (preview + commit, books-only \u2014 no real-money disburse), record books-only employee payouts (reimbursements / advances) and search them, run bulk claim actions (submit / approve / reject / cancel / delete many at once \u2014 asynchronous, returns a background-job handle to poll), plus the claim tracking-tag and custom-field-value pickers.",groups:["claim_processing"]},{name:"employees",description:"Employees (expense-claim members): create, update, get, delete, and search employees; search the employee-balance directory (reimbursement balances owed); bind a login user to an employee (permanent); and bulk-import employees from a sheet (preprocess preview \u2192 async import). Archive an employee with update active=false rather than deleting.",groups:["employees"]},{name:"capsules_and_recipes",description:"Capsules (transaction groupings/capsule types). Financial recipes: amortization, depreciation, deferred revenue, IFRS 16 leases, hire purchase, fixed deposits, FX revaluation, loan schedules, ECL/expected credit loss, IAS 37 provisions, asset disposal. Two recipe execution paths: offline (plan_recipe + execute_recipe \u2014 client-side calculators, no API key) and server-side (list/get/preview/resume/rollback_capsule_recipe \u2014 produce real capsule entities via Jaz API). Plus capsuleRecipe payload on trigger mutations (create_bill, create_journal, create_cash_in, etc.) to create and trigger a recipe in one shot, with optional templateOverrides to customize the generated text (Customize Recipe). Keywords: calculate, provision, schedule, expected credit loss, revaluation, amortize, rollback recipe, customize template overrides slots.",groups:["capsules","recipes","capsule_recipes"]},{name:"scheduled_transactions",description:"Scheduled/recurring invoices, bills, journals. Create scheduled invoices/bills/journals, search scheduled transactions. Also: recurring, auto-generate.",groups:["schedulers"]},{name:"subscriptions",description:"Subscriptions (recurring billing/payment plans). Create, update, cancel, search subscriptions. Also: recurring charges, subscription schedules.",groups:["subscriptions"]},{name:"organization",description:"Organization info (name, currency, country, fiscal year). User management: invite, update, remove, search org users. Bulk invite. List enabled modules (org features/capabilities). List/search saved report templates.",groups:["organization","org_users","modules","report_templates"]},{name:"document_ai",description:'File attachments, spreadsheets, and document AI. Read and parse rows from attached spreadsheets \u2014 CSV, Excel, XLSX. Scan a single invoice / bill / receipt PDF or image to create a draft bill or invoice via AI extraction (create_bt_from_attachment, with the file or a sourceUrl). Auto-sort a whole FOLDER, a .zip, or a Dropbox / Google Drive / OneDrive folder share link of mixed paperwork \u2014 "create docs from this Dropbox folder link", a pile/batch of invoices and bills \u2014 into invoices, bills, credit notes, and bank statements with classify_documents, then create the drafts with extract_documents. Upload and list attachments; track extraction workflows.',groups:["attachments","magic"]},{name:"fixed_assets",description:"Fixed assets (PP&E/property, plant, equipment). Search, create, update, discard, sell, transfer, undo disposal. Also: depreciation, asset register.",groups:["fixed_assets"]},{name:"payments_and_search",description:"Payment records: get, update, delete individual payments. List payments/credits on invoices and bills. Reverse credit applications. Cashflow transaction search. Universal cross-entity search. Also: payment run, batch payment, payment matching, void payment, payment history, credit note applications.",groups:["payments","cashflow","search"]},{name:"quick_fix",description:"Quick Fix: bulk-update multiple transactions or line items in one call. Change dates, contacts, tags, accounts, tax profiles, custom fields across many invoices/bills/journals/credit-notes/cash-entries/schedulers at once. Also: batch update, mass edit.",groups:["quick_fix"]},{name:"export_records",description:"Export records to XLSX. List available columns, preview export scope (row count + sample), generate export file with pre-signed download URL. Supports any entity type: invoices, bills, contacts, items, journals, bank records, cashflow, fixed assets, etc. Pass query (structured search syntax) or filter (JSON), never both.",groups:["export_records"]},{name:"background_jobs",description:"Background job tracking. Poll any async operation by jobId (contacts bulk-upsert, items bulk-upsert, bank import, magic file processing, etc.). Filter by resourceId field to look up a specific job. Poll until status is SUCCESS, FAILED, or PARTIAL_SUCCESS.",groups:["background_jobs"]},{name:"drafts",description:"Draft business transactions \u2014 both local payload validation (invoices, bills, journals, credit notes) AND BULK-FRIENDLY server-side lifecycle: validate_drafts (sync eligibility check), convert_drafts_to_active (async promote to ACTIVE), submit_drafts_for_approval (async route to approval). The lifecycle tools are GENERIC and BULK \u2014 one call accepts up to 500 items mixing any combination of {btResourceId, btType: SALE|PURCHASE|SALE_CREDIT_NOTE|PURCHASE_CREDIT_NOTE}. No need for per-entity tools when promoting/submitting drafts at scale. NOT idempotent on already-promoted drafts.",groups:["drafts"]},{name:"help_center",description:"Search the Jaz help center for how-to articles, feature guides, accounting concepts, and troubleshooting. Returns top matches with title, section, snippet, and source URL. Works without an API key.",groups:["help_center"]},{name:"jots",description:"The judgment journal. jot records a judgment call (chose among real alternatives and wrote, or deliberately held a write); recall looks up prior judgments and precedents by entity, kind, or freetext. Also: decision log, rationale, why.",groups:["jots"]},{name:"navigation",description:"Dashboard navigation deep links. Build a URL to any dashboard screen or record for the user \u2014 including the view link for a record just created or updated (a reply reporting on a record carries its link, and dashboard URLs always come from this tool, never written from memory). Also: open, go to, take me to, link, deep link, share a link, url, navigate, show me the page/screen, where can I see \u2014 for invoices, bills, reports, settings, or a specific transaction.",groups:["navigation"]}],DIr=new Set(["a","an","and","are","at","be","by","can","do","does","for","how","i","in","is","it","me","my","of","on","or","our","please","that","the","this","to","us","we","what","when","where","which","with","you","your"])});function _8(t){let e={type:t.type};if(t.description&&(e.description=t.description),t.enum&&(e.enum=t.enum),t.type==="array"&&t.items&&(e.items=_8(t.items)),t.type==="object"&&t.properties){let r={};for(let[n,i]of Object.entries(t.properties))r[n]=_8(i);e.properties=r,t.required?.length&&(e.required=t.required)}return e}function ff(t,e){let r={};for(let[n,i]of Object.entries(t))r[n]=_8(i);return{type:"object",properties:r,...e.length>0?{required:e}:{}}}function gy(t){return{name:t.name,description:t.description,input_schema:ff(t.params,t.required),...t.searchHint?{searchHint:t.searchHint}:{}}}var TT=X(()=>{"use strict"});function kT(t){if(typeof t!="string")return t.isDestructive??!1;let e=t;return e.startsWith("delete_")||e.startsWith("pay_")||e.startsWith("finalize_")||e.includes("refund")||e==="remove_org_user"}function D8(t){return{readOnlyHint:t.readOnly,destructiveHint:!t.readOnly&&kT(t),idempotentHint:t.readOnly,openWorldHint:t.openWorld??!1}}function Kat(t){if(!t.trim())return{namespaces:Uc.map(i=>{let o=i.groups.flatMap(s=>zh(s));return{name:i.name,description:i.description,toolCount:o.length,tools:o.map(s=>s.name)}}),hint:"Call describe_tools with specific tool names to get full schemas before executing."};let e=Zat(t,5);if(e.length===0)return{matches:[],hint:`No tools match "${t}". Try broader terms or call search_tools with empty query to see all namespaces.`};let n=t.toLowerCase().split(/\s+/).filter(Boolean);return{matches:e.map(i=>{let o=i.groups.flatMap(u=>zh(u)),s=o.map(u=>`${u.name} ${(u.aliases??[]).join(" ")} ${u.searchHint??""} ${u.description}`.toLowerCase()),a=new Map(n.map(u=>{let d=s.filter(f=>f.includes(u)).length;return[u,Math.log((o.length+1)/(d+1))]})),c=o.map((u,d)=>{let f=s[d],p=n.reduce((h,m)=>f.includes(m)?h+(a.get(m)??0):h,0);return{tool:u,score:p}}).sort((u,d)=>d.score-u.score);return{namespace:i.name,description:i.description,tools:c.map(u=>({name:u.tool.name,description:u.tool.description.split(`
|
|
867
|
+
USE THIS to score a specific draft against contact history. For stand-alone "what does this contact normally look like?" without a draft \u2192 use get_contact_signals.`,params:{items:{type:"array",description:"Draft business transaction references (max 500). Mix any btType freely.",items:{type:"object",properties:{btResourceId:{type:"string",description:"Draft BT resource ID (UUID) \u2014 required"},btType:{type:"string",enum:["SALE","PURCHASE","SALE_CREDIT_NOTE","PURCHASE_CREDIT_NOTE"],description:"Required"}}}}},required:["items"],group:"drafts",readOnly:!0,isConcurrencySafe:!0,searchHint:"validate drafts eligibility check before convert promote",execute:async(t,e)=>(bv(e.items),_z(t.client,e.items))},{name:"convert_drafts_to_active",description:`BULK promote \u2014 finalize up to 500 draft business transactions to ACTIVE in ONE call, mixing any combination of invoices, bills, and credit notes (no per-type tools needed). ${Ol} NOT idempotent: a second call on already-promoted drafts returns 422. Filter the draft list by status: DRAFT before submitting. Pair with validate_drafts for a pre-flight check on large batches.`,params:{items:{type:"array",description:"Draft BT references (max 500). Mix any btType.",items:{type:"object",properties:{btResourceId:{type:"string",description:"Draft BT resource ID (UUID) \u2014 required"},btType:{type:"string",enum:["SALE","PURCHASE","SALE_CREDIT_NOTE","PURCHASE_CREDIT_NOTE"],description:"Required"}}}}},required:["items"],group:"drafts",readOnly:!1,searchHint:"convert drafts to active promote finalize bulk",execute:async(t,e)=>(bv(e.items),Dz(t.client,e.items))},{name:"submit_drafts_for_approval",description:`BULK submit \u2014 route up to 500 draft business transactions into the approval workflow in ONE call, mixing any combination of invoices, bills, and credit notes. ${Ol} NOT idempotent on drafts that already have an in-flight approval request.`,params:{items:{type:"array",description:"Draft BT references (max 500). Mix any btType.",items:{type:"object",properties:{btResourceId:{type:"string",description:"Draft BT resource ID (UUID) \u2014 required"},btType:{type:"string",enum:["SALE","PURCHASE","SALE_CREDIT_NOTE","PURCHASE_CREDIT_NOTE"],description:"Required"}}}}},required:["items"],group:"drafts",readOnly:!1,searchHint:"submit drafts for approval workflow review bulk",execute:async(t,e)=>(bv(e.items),Sz(t.client,e.items))},{name:"search_help_center",description:'Search the Jaz help center for how-to articles, feature guides, and accounting concepts. Use this for "how do I..." or "what is..." questions about Jaz: bank reconciliation, GST/VAT filing, multi-currency, fixed assets, custom fields, integrations, and so on. Returns top matching articles with title, section, content, and source URL.',params:{query:{type:"string",description:'Natural-language question or keywords (e.g. "how do I reconcile a bank statement", "set up GST", "multi-currency invoice").'},limit:{type:"number",description:"Maximum number of articles to return (default 3, max 10)."},section:{type:"string",description:'Optional: restrict to a single help-center section slug (e.g. "bank-reconciliations", "invoices").'}},required:["query"],group:"help_center",readOnly:!0,searchHint:"help center docs how to guide article search question",isConcurrencySafe:!0,maxResultSizeChars:2e4,execute:async(t,e)=>{let r=String(e.query??"").trim();if(!r)return{error:"Query is required.",hint:"Pass a natural-language question or keywords."};let n=typeof e.limit=="number"&&!Number.isNaN(e.limit)?e.limit:3,i=Math.max(1,Math.min(10,Math.floor(n))),o=typeof e.section=="string"?e.section:void 0;try{let s=Ox();if(o&&!s.sections.some(u=>u.slug===o))return{error:`Unknown section: "${o}".`,available:s.sections.map(u=>u.slug),hint:"Omit the section parameter to search every section, or pick a slug from the available list."};let a=Fx(),c=await Qx(s,a,r,{mode:"hybrid",limit:i,section:o});return c.length===0?{results:[],hint:"No matching articles. Try broader keywords or rephrase the question."}:{results:c.map(u=>{let d=(Wle(u.article)??u.article.snippet).slice(0,1500);return{title:u.article.title,section:u.section.name,sectionSlug:u.section.slug,content:d,url:u.article.sourceUrl,score:Math.round(u.score*1e3)/1e3,scoreKind:u.scoreKind,matchedTerms:u.matchedTerms}}),totalArticles:s.articleCount,searchedSections:o?[o]:void 0}}catch(s){return{error:"Help center search failed.",detail:s instanceof Error?s.message:String(s),hint:"The bundled help-center index may be missing or corrupt."}}}},{name:"jot",description:"Record judgment entries in the org's judgment journal. THE RULE: log a judgment when you chose among real alternatives and a write followed, or when you deliberately decided NOT to write; skip mechanical actions and calls where the platform, the data, or the user left you no choice. Jot AFTER the write succeeds, never before, and carry the written record's resourceId in refs. Kinds: CLASSIFICATION account/tax/category choice \xB7 MATCH decided which records correspond \xB7 SCOPE chose what is in or out of a set \xB7 ASSUMPTION filled a gap the data left open \xB7 RISK proceeded despite a known concern \xB7 METHOD picked a calculation or approach \xB7 RECOVERY decided how to proceed after a failure (incl. holding a write) \xB7 DEVIATION knowingly departed from a stated rule. Accepting or rejecting an inbound external document (an e-invoice a counterparty sent) is a FINALIZE act, so pin it. A decided omission (you deliberately did not post something) is RECOVERY, which pins via withheld-write, not DEVIATION. Always give why: a call without a basis is half a record. Batch related entries in one call; each entry is acked independently.",params:{entries:{type:"array",description:"Judgment entries to record (1-100). A bad entry never fails the batch: it acks with error while siblings persist.",items:{type:"object",properties:{kind:{type:"string",enum:["CLASSIFICATION","MATCH","SCOPE","ASSUMPTION","RISK","METHOD","RECOVERY","DEVIATION","NOTE"],description:"Judgment kind: one-liners in the tool description."},tier:{type:"string",enum:["LOW","MEDIUM","HIGH","CRITICAL"],description:"Severity you assign the call."},call:{type:"string",description:'The decision, one line (e.g. "Posted to 6420 Travel: recurring Grab vendor pattern").'},why:{type:"string",description:"The basis for the call: a call without a basis is half a record."},ruledOut:{type:"string",description:"Alternatives considered and set aside."},refs:{type:"array",description:"Entity refs this judgment touches. Include the written record's resourceId.",items:{type:"string",description:'Grammar TYPE:resourceId[#field][:RELATION], e.g. "INVOICE:41f6\u2026:CREATE". RELATION: CREATE UPDATE DELETE FINALIZE PAY RECONCILE TRIGGER SUBJECT INPUT REJECTED SUPERSEDES (default SUBJECT).'}},frame:{type:"string",description:'For set-shaped subjects: the defining query + counts (e.g. "search_bills status=UNPAID \xB7 41 in scope, 4 deferred").'},confidence:{type:"string",enum:["LOW","MEDIUM","HIGH"],description:"Routing hint for review attention."},citedRule:{type:"string",description:"Org rule, policy, threshold, or precedent applied."},workflowLabel:{type:"string",description:"Short workflow label (e.g. month-end-close)."},agentLabel:{type:"string",description:"Self-reported product/model (e.g. jaz-clio/claude); informative, never authoritative."},idempotencyKey:{type:"string",description:"Retry key: a replay returns the existing entry, not a duplicate."}},required:["kind","tier","call"]}}},required:["entries"],group:"jots",readOnly:!1,alwaysLoaded:!0,searchHint:"jot judgment judgement journal record decision log rationale reasoning why chose ruled out classification match scope assumption risk method recovery deviation basis precedent note after write",execute:async(t,e)=>gv(t.client,e.entries)},{name:"recall",description:"Search the org's judgment journal (jots) for precedents, prior judgment calls with their basis. Check BEFORE repeating a judgment on the same entity, kind of decision, or workflow: a prior call with its why beats re-deriving from scratch; a FLAG or REJECT disposition on it is a warning, ENDORSE a strong precedent. Sort is pinned server-side (CRITICAL and withheld-write RECOVERY entries first, then newest). An empty page means no prior judgments match this filter, or none are recorded for this org yet.",params:{ref:{type:"string",description:'Entity ref filter, TYPE:resourceId (e.g. "INVOICE:41f626a3-\u2026").'},kind:{type:"string",enum:["CLASSIFICATION","MATCH","SCOPE","ASSUMPTION","RISK","METHOD","RECOVERY","DEVIATION","NOTE"],description:"Judgment kind filter."},tier:{type:"string",enum:["LOW","MEDIUM","HIGH","CRITICAL"],description:"Severity tier filter."},dispositionVerb:{type:"string",enum:["FLAG","REJECT","ENDORSE"],description:"Only entries carrying at least one disposition with this verb."},freetext:{type:"string",description:"Case-insensitive substring over call and why."},createdFrom:{type:"number",description:"Created-at lower bound, epoch ms (inclusive)."},createdTo:{type:"number",description:"Created-at upper bound, epoch ms (inclusive)."},limit:{type:"number",description:"Max results per page (1-1000, default 100)."},offset:{type:"number",description:"Page number, 0-indexed."},includeStats:{type:"boolean",description:"Include per-credential disposition counts."}},required:[],group:"jots",readOnly:!0,isConcurrencySafe:!0,searchHint:"recall search jots judgment judgement journal precedent prior decisions rationale history dispositions flagged rejected endorsed lookup why",maxResultSizeChars:2e4,execute:async(t,e)=>{let r={};for(let n of["ref","kind","tier","dispositionVerb","freetext"])typeof e[n]=="string"&&e[n]&&(r[n]=e[n]);for(let n of["createdFrom","createdTo"])typeof e[n]=="number"&&(r[n]=e[n]);return dH(t.client,{...typeof e.limit=="number"?{limit:e.limit}:{},...typeof e.offset=="number"?{offset:e.offset}:{},...Object.keys(r).length?{filter:r}:{},...e.includeStats===!0?{includeStats:!0}:{}})}},{name:"present_questions",description:`Present the user with a bounded multiple-choice question (or a short sequence of them) as an interactive pick-list, instead of asking in prose. Use as your FINAL action when the user must choose among a KNOWN, finite set of options you ALREADY have from context (a prior search/list result, org defaults, or your own knowledge) to continue (e.g. "which bank account?", "which of these duplicate bills?"). Give 2-4 options per question \u2014 curate to the most likely, never dump a long list \u2014 and at most 4 questions; set multiSelect per question when more than one may apply. List the options and stop \u2014 the user's pick arrives as their next message and starts a new turn. Ask several questions at once when more than one thing is unspecified. Prose-ask only when there's no bounded set to offer (a free-text name or amount), to confirm destructive actions, or instead of fetching data just to populate options. Terminal: do not call further tools or re-list the options in text afterward.`,params:{questions:{type:"array",description:"Questions to ask, each rendered as one page of the pick-list (at most 4). Provide one unless you genuinely have several distinct choices to collect in sequence.",items:{type:"object",properties:{header:{type:"string",description:'Optional short eyebrow label categorizing the question (1-2 words, e.g. "Account", "Period").'},question:{type:"string",description:'The question, shown as the card title (e.g. "Which bank account should I inspect?").'},options:{type:"array",description:"2-4 concrete choices (hard cap \u2014 curate to the most likely; the user can still type a different answer if none fit).",items:{type:"object",properties:{label:{type:"string",description:"The choice shown on the row and relayed verbatim as the user's answer when picked \u2014 keep it self-contained and unambiguous."},description:{type:"string",description:'Optional one-line detail under the label (e.g. "554 unreconciled records").'}},required:["label"]}},multiSelect:{type:"boolean",description:"Set true to let the user select multiple options for this question; omit or false for a single pick."}},required:["question","options"]}}},required:["questions"],group:"interaction",alwaysLoaded:!0,interactive:!0,readOnly:!0,isConcurrencySafe:!0,searchHint:"present questions options choices pick select ask user interactive widget",maxResultSizeChars:2e4,execute:async(t,e)=>{let n=(Array.isArray(e?.questions)?e.questions:[]).filter(o=>typeof o=="object"&&o!==null).map(o=>{let s=(Array.isArray(o.options)?o.options:[]).filter(c=>typeof c=="object"&&c!==null).map(c=>{let u=String(c.label??"").trim();return c.description?{label:u,description:String(c.description)}:{label:u}}).filter(c=>c.label),a=String(o.question??"").trim();return{...o.header?{header:String(o.header)}:{},question:a,options:s,multiSelect:!!o.multiSelect}}).filter(o=>o.question&&o.options.length>=2);if(n.length===0)return{error:"present_questions needs at least one question with non-empty question text and \u22652 labeled options (a single-option pick-list is not a choice).",hint:"Provide questions: [{ question, options: [{ label }, { label }] }]. For open-ended input, ask in prose instead."};if(n.length>4)return{error:`present_questions renders at most 4 questions (got ${n.length}).`,hint:"Ask the 4 most important now; collect the rest on a later turn."};let i=n.find(o=>o.options.length>4);return i?{error:`Each question may offer at most 4 options ("${i.question}" has ${i.options.length}).`,hint:"Curate to the 4 most likely choices \u2014 the user can still type a different answer if none fit."}:{questions:n}}},{name:"navigate",description:'Dashboard navigation: discover destinations, then build deep links. Without `destination`: lists valid destinations as { key, label, kind } \u2014 filter with `query` (substring over key + label), `resource` (e.g. "sales"), or `kind` ("screen" | "modal"); results are capped, narrow if `truncated`. With `destination`: builds the URL to hand the user \u2014 a screen (e.g. "reports.profit-and-loss") or a record modal (e.g. "sales.modal.view-sale"); pass `resourceId` only for a record-specific modal (view/edit one record), never for screens or create/"new" modals. Returns { url, kind, label }; the link opens in the user\'s current org. Never write dashboard URLs or destination keys from memory \u2014 call with no destination to discover keys first.',params:{destination:{type:"string",description:'Destination key to link to, e.g. "reports.profit-and-loss" or "sales.modal.view-sale". Omit to discover valid keys instead.'},resourceId:{type:"string",description:"Jaz resourceId of the record to focus \u2014 only with a record-modal destination (view/edit a specific record). Omit for screens and create modals."},query:{type:"string",description:'Discovery only: case-insensitive substring over destination keys and labels (e.g. "invoice", "p&l", "bank").'},resource:{type:"string",description:'Discovery only: restrict to one resource namespace, e.g. "sales", "purchases", "reports", "settings".'},kind:{type:"string",description:'Discovery only: restrict to "screen" (list/report pages) or "modal" (record view/create/edit).',enum:["screen","modal"]}},required:[],group:"navigation",alwaysLoaded:!0,readOnly:!0,isConcurrencySafe:!0,aliases:["find_dashboard_destinations","get_dashboard_url"],searchHint:"dashboard url deep link navigate go to open screen record modal page share shareable list destinations keys catalog",maxResultSizeChars:16e3,execute:async(t,e)=>{let r=typeof e.destination=="string"&&e.destination?e.destination:void 0,n=typeof e.resourceId=="string"&&e.resourceId?e.resourceId:void 0;if(!r){if(n)return{error:"resourceId given without destination - pass the record-modal destination key, or omit resourceId to discover destinations."};let o=e.kind==="screen"||e.kind==="modal"?e.kind:void 0,s=iQe({query:typeof e.query=="string"?e.query:void 0,resource:typeof e.resource=="string"?e.resource:void 0,kind:o});return s.truncated?{...s,hint:`Showing ${s.results.length} of ${s.total} matches. Narrow with a more specific query, resource, or kind.`}:s.results.length===0?{...s,hint:'No matches. Destinations are named by product area, not task wording \u2014 retry with a broader or synonym term (e.g. "billing" not "card", "sales" not "invoice payment", "settings", "reports", "bank") before concluding the destination does not exist.'}:s}let{dashboardUrl:i}=K1e(t.platform??"jaz");try{return nQe(r,n,{dashboardUrl:i,orgResourceId:t.org?.resourceId})}catch(o){return{error:o instanceof Error?o.message:String(o)}}}}];W1e(Qc)});function Gbr(){if(!vv){vv=new Map;for(let t of Qc)vv.set(t.name,t);for(let t of Qc)for(let e of t.aliases??[])vv.has(e)||vv.set(e,t)}return vv}function lf(t){return Gbr().get(t)}function nT(){return Uue||(Uue=Qc.filter(t=>!t.disabled)),Uue}function Jbr(){return $ue||($ue=nT().filter(t=>!t.interactive)),$ue}function cnt(t){return t!==void 0&&Vbr.has(t)?nT():Jbr()}function zh(t){return nT().filter(e=>e.group===t)}var vv,Uue,Vbr,$ue,py=X(()=>{"use strict";rT();vv=null,Uue=null;Vbr=new Set(["chat"]),$ue=null});function Zat(t,e=5){let r=t.trim().toLowerCase();if(!r)return[];let n=r.split(/[\s_-]+/).filter(o=>o.length>=2&&!DIr.has(o));return n.length===0?[]:Uc.map(o=>{let s=0,a=o.name.toLowerCase(),c=o.description.toLowerCase();(a===r||a===r.replace(/\s+/g,"_"))&&(s+=5),a.includes(r)&&(s+=3),c.includes(r)&&(s+=1);for(let u of n)a.includes(u)&&(s+=2),c.includes(u)&&(s+=1);return{ns:o,score:s}}).filter(o=>o.score>0).sort((o,s)=>s.score-o.score).slice(0,e).map(o=>o.ns)}var Uc,DIr,xT=X(()=>{"use strict";Uc=[{name:"invoices",description:"Sales invoices (INV/SI). Create, search, get, update, delete, pay, finalize, apply credits, download PDF. Also: receivables, AR, AR aging, billing, overdue invoices, dunning, recurring invoices. To create from an uploaded invoice file/PDF/image, use the document_ai namespace (AI extraction), not manual entry.",groups:["invoices"]},{name:"customer_credit_notes",description:"Customer credit notes (CN). Create, search, update, delete, finalize, refund, download PDF. Also: sales returns, customer CN.",groups:["customer_credit_notes"]},{name:"bills",description:"Purchase bills (PO/PI). Create, search, get, update, delete, pay, finalize, apply credits. Also: payables, AP, vendor invoices, supplier bills. To create from an uploaded bill/invoice file/PDF/image, use the document_ai namespace (AI extraction), not manual entry.",groups:["bills"]},{name:"supplier_credit_notes",description:"Supplier credit notes. Create, search, update, delete, finalize, refund. Also: purchase returns, debit notes, supplier CN.",groups:["supplier_credit_notes"]},{name:"sale_orders",description:"Sales order documents: Sale Quotes (estimates/quotations) and Sale Orders. Create, get, search, update, and transition (accept a quote, confirm an order, void, delete). A Sale Order links to its quote via saleQuoteResourceId; the quote must be accepted first. Tracks fulfillment via orderState. Pipeline: quote \u2192 order \u2192 invoice (raise the invoice separately).",groups:["sale_orders"]},{name:"purchase_orders",description:"Purchase order documents: Purchase Requests (requisitions) and Purchase Orders (POs). Create, get, search, update, and transition (accept a request, confirm an order, void, delete). A Purchase Order links to its request via purchaseRequestResourceId; the request must be accepted first. Tracks fulfillment via orderState. Pipeline: request \u2192 order \u2192 bill (raise the bill separately).",groups:["purchase_orders"]},{name:"journals",description:"Journal entries (JE). Create, search, update, delete manual journals. Also: adjusting entries, accruals, reclassifications, corrections.",groups:["journals"]},{name:"cash_entries",description:"Cash-in receipts and cash-out disbursements for external cash movements. WHEN TO USE: money received from customers/external \u2192 cash-in. Money paid to suppliers/external \u2192 cash-out. For internal account-to-account transfers, use cash_transfers namespace.",groups:["cash_entries"]},{name:"cash_transfers",description:"Cash transfers between your own bank/cash accounts and cashflow transaction search. WHEN TO USE: moving funds between own accounts (main bank \u2192 petty cash, USD \u2192 SGD). For external receipts/payments, use cash_entries namespace.",groups:["cash_transfers"]},{name:"bank_accounts",description:"Bank accounts, bank statement imports (CSV/OFX), bank records search, auto-reconciliation. For unreconciled queries: ALWAYS search bank records with status UNRECONCILED after listing accounts. Also: bank feeds, bank balance.",groups:["bank"]},{name:"bank_rules",description:"Bank reconciliation rules (action shortcuts). Create, search, update, delete bank rules. Configure auto-matching rules for bank records.",groups:["bank_rules"]},{name:"reconciliations",description:"Apply a reconciliation decision to a bank statement entry \u2014 write side. Match bank records to EXISTING open bills/invoices/payments (reconcile_with_payments \u2014 the primary path, creates the payment for you), or to journals, cash entries, or transfers, or CREATE new bills/invoices (invoice_receipt/bill_receipt). Distinct from bank_accounts/bank_rules (which configure auto-reconciliation) and view_auto_reconciliation (which queries suggestions). Eleven endpoints: quick_reconcile + apply_bank_rule + magic_match (bulk), and direct_cash_entry / cash_journal / manual_journal / cash_transfer / invoice_receipt / bill_receipt / with_payments / learned_prediction (per-entry). Match-to-existing is preferred over create-new to avoid duplicates. Most fields prefill from the bank entry when omitted; FX is resolved server-side.",groups:["reconciliations"]},{name:"financial_reports",description:"Core financial statements: trial balance (TB), balance sheet (BS/B/S), profit & loss (PnL/P&L/income statement), cash flow, general ledger (GL), cash balance/position, equity movement, VAT/GST ledger. Also: how profitable, what is the balance. XLSX/PDF file exports of any of these statements are produced via download_export (lives in operational_reports namespace \u2014 switch there or call by name).",groups:["financial_reports"]},{name:"operational_reports",description:"Aging and operational reports: aged receivables (AR aging), aged payables (AP aging), AR report, bank balance summary, bank reconciliation reports, fixed asset (FA) summary, FA reconciliation. Data exports (CSV/Excel/XLSX). Anomaly detection and audit analysis: anomalous invoices, anomalous bills, cashflow anomalies, GL journal audit, exchange rate audit, receivables customer risk, cash expense health. Also: overdue analysis, how much owed, suspicious transactions, audit trail.",groups:["operational_reports","exports"]},{name:"pseudo_sql",description:"Pseudo-SQL ad-hoc read-only queries against the curated reporting schema (custom select, custom report, query data, run sql). Includes live schema introspection (get_pseudo_sql_schema) + sync preview (\u2264100 rows) + async CSV export. Use when search_* / download_export canonical reports don't cover the question.",groups:["pseudo_sql"]},{name:"contacts",description:"Contacts (customers/suppliers/vendors), contact groups, customer segmentation. Create, search, get, update, delete contacts. Bulk upsert contacts from CSV / spreadsheet imports \u2014 async, returns jobId, poll background_jobs. List/create contact groups.",groups:["contacts","contact_groups"]},{name:"items_and_inventory",description:"Products, services, inventory items. Create, search, get, update, delete items. Check inventory balance. List/search purchase-side catalog items. Also: SKU, catalog, stock.",groups:["items","inventory","purchase_items"]},{name:"catalogs",description:"Catalogs \u2014 named groupings of products/services, optionally scoped to contact groups. Create, search, get, update, delete catalogs.",groups:["catalogs"]},{name:"tags_and_custom_fields",description:"Tags for categorizing transactions. Custom fields for adding metadata (text, date, dropdown). Create, search, delete tags and custom fields.",groups:["tags","custom_fields"]},{name:"nano_classifiers",description:"Nano classifiers (tracking categories/dimensions). List, search, create, update, delete classifiers and their classes. Used for line-item tagging and dimensional reporting. Also: tracking categories, cost centers, departments, projects.",groups:["nano_classifiers"]},{name:"chart_of_accounts",description:"Chart of accounts (COA/GL accounts). Create, search, update accounts \u2014 including setting or removing an account's period lock date (lock / unlock a period, lock date: block recording or editing transactions on the account dated on or before a date). Bookmarks (favorites/shortcuts). Also: ledger codes, account types.",groups:["accounts","bookmarks"]},{name:"currencies",description:"Currencies, exchange rates (FX/forex). List/add org currencies. Set, update, import currency rates. Also: multi-currency, FX rates.",groups:["currencies"]},{name:"tax_profiles",description:"Tax profiles (GST/VAT/sales tax), withholding tax codes (WHT/ATC). Search, create, update tax profiles. List WHT codes.",groups:["tax_profiles"]},{name:"claim_settings",description:"Employee-expense claim configuration (Settings -> Claim Settings): claim types (expense categories) and claim profiles (per-employee policy: approver, limits, visible types, balance account). Full CRUD + search on each.",groups:["claim_types","claim_profiles"]},{name:"posting_rules",description:"Claim posting rules \u2014 how approved employee-expense claims group into journals at conversion (outer/inner grouping axes, line templates, default reimbursement bank). Full CRUD + search.",groups:["posting_rules"]},{name:"claims",description:'Employee-expense claims (the Claims area / Employees). Search, get, update DRAFT claims (line items, employee, vendor), and drive the lifecycle: submit, approve, reject, cancel, unpost (reverse conversion), delete. Status flow DRAFT \u2192 SUBMITTED \u2192 APPROVED \u2192 CONVERTED ("Processed"), or REJECTED / CANCELLED. Claims are born via document attachment / conversion (no bare create); the server enforces legal transitions.',groups:["claims"]},{name:"claim_processing",description:"Process employee-expense claims: convert APPROVED claims into journal entries (preview + commit, books-only \u2014 no real-money disburse), record books-only employee payouts (reimbursements / advances) and search them, run bulk claim actions (submit / approve / reject / cancel / delete many at once \u2014 asynchronous, returns a background-job handle to poll), plus the claim tracking-tag and custom-field-value pickers.",groups:["claim_processing"]},{name:"employees",description:"Employees (expense-claim members): create, update, get, delete, and search employees; search the employee-balance directory (reimbursement balances owed); bind a login user to an employee (permanent); and bulk-import employees from a sheet (preprocess preview \u2192 async import). Archive an employee with update active=false rather than deleting.",groups:["employees"]},{name:"capsules_and_recipes",description:"Capsules (transaction groupings/capsule types). Financial recipes: amortization, depreciation, deferred revenue, IFRS 16 leases, hire purchase, fixed deposits, FX revaluation, loan schedules, ECL/expected credit loss, IAS 37 provisions, asset disposal. Two recipe execution paths: offline (plan_recipe + execute_recipe \u2014 client-side calculators, no API key) and server-side (list/get/preview/resume/rollback_capsule_recipe \u2014 produce real capsule entities via Jaz API). Plus capsuleRecipe payload on trigger mutations (create_bill, create_journal, create_cash_in, etc.) to create and trigger a recipe in one shot, with optional templateOverrides to customize the generated text (Customize Recipe). Keywords: calculate, provision, schedule, expected credit loss, revaluation, amortize, rollback recipe, customize template overrides slots.",groups:["capsules","recipes","capsule_recipes"]},{name:"scheduled_transactions",description:"Scheduled/recurring invoices, bills, journals. Create scheduled invoices/bills/journals, search scheduled transactions. Also: recurring, auto-generate.",groups:["schedulers"]},{name:"subscriptions",description:"Subscriptions (recurring billing/payment plans). Create, update, cancel, search subscriptions. Also: recurring charges, subscription schedules.",groups:["subscriptions"]},{name:"organization",description:"Organization info (name, currency, country, fiscal year). User management: invite, update, remove, search org users. Bulk invite. List enabled modules (org features/capabilities). List/search saved report templates.",groups:["organization","org_users","modules","report_templates"]},{name:"document_ai",description:'File attachments, spreadsheets, and document AI. Read and parse rows from attached spreadsheets \u2014 CSV, Excel, XLSX. Scan a single invoice / bill / receipt PDF or image to create a draft bill or invoice via AI extraction (create_bt_from_attachment, with the file or a sourceUrl). Auto-sort a whole FOLDER, a .zip, or a Dropbox / Google Drive / OneDrive folder share link of mixed paperwork \u2014 "create docs from this Dropbox folder link", a pile/batch of invoices and bills \u2014 into invoices, bills, credit notes, and bank statements with classify_documents, then create the drafts with extract_documents. Upload and list attachments; track extraction workflows.',groups:["attachments","magic"]},{name:"fixed_assets",description:"Fixed assets (PP&E/property, plant, equipment). Search, create, update, discard, sell, transfer, undo disposal. Also: depreciation, asset register.",groups:["fixed_assets"]},{name:"payments_and_search",description:"Payment records: get, update, delete individual payments. List payments/credits on invoices and bills. Reverse credit applications. Cashflow transaction search. Universal cross-entity search. Also: payment run, batch payment, payment matching, void payment, payment history, credit note applications.",groups:["payments","cashflow","search"]},{name:"quick_fix",description:"Quick Fix: bulk-update multiple transactions or line items in one call. Change dates, contacts, tags, accounts, tax profiles, custom fields across many invoices/bills/journals/credit-notes/cash-entries/schedulers at once. Also: batch update, mass edit.",groups:["quick_fix"]},{name:"export_records",description:"Export records to XLSX. List available columns, preview export scope (row count + sample), generate export file with pre-signed download URL. Supports any entity type: invoices, bills, contacts, items, journals, bank records, cashflow, fixed assets, etc. Pass query (structured search syntax) or filter (JSON), never both.",groups:["export_records"]},{name:"background_jobs",description:"Background job tracking. Poll any async operation by jobId (contacts bulk-upsert, items bulk-upsert, bank import, magic file processing, etc.). Filter by resourceId field to look up a specific job. Poll until status is SUCCESS, FAILED, or PARTIAL_SUCCESS.",groups:["background_jobs"]},{name:"drafts",description:"Draft business transactions \u2014 both local payload validation (invoices, bills, journals, credit notes) AND BULK-FRIENDLY server-side lifecycle: validate_drafts (sync eligibility check), convert_drafts_to_active (async promote to ACTIVE), submit_drafts_for_approval (async route to approval). The lifecycle tools are GENERIC and BULK \u2014 one call accepts up to 500 items mixing any combination of {btResourceId, btType: SALE|PURCHASE|SALE_CREDIT_NOTE|PURCHASE_CREDIT_NOTE}. No need for per-entity tools when promoting/submitting drafts at scale. NOT idempotent on already-promoted drafts.",groups:["drafts"]},{name:"help_center",description:"Search the Jaz help center for how-to articles, feature guides, accounting concepts, and troubleshooting. Returns top matches with title, section, snippet, and source URL. Works without an API key.",groups:["help_center"]},{name:"jots",description:"The judgment journal. jot records a judgment call (chose among real alternatives and wrote, or deliberately held a write); recall looks up prior judgments and precedents by entity, kind, or freetext. Also: decision log, rationale, why.",groups:["jots"]},{name:"navigation",description:"Dashboard navigation deep links. Build a URL to any dashboard screen or record for the user \u2014 including the view link for a record just created or updated (a reply reporting on a record carries its link, and dashboard URLs always come from this tool, never written from memory). Also: open, go to, take me to, link, deep link, share a link, url, navigate, show me the page/screen, where can I see \u2014 for invoices, bills, reports, settings, or a specific transaction.",groups:["navigation"]}],DIr=new Set(["a","an","and","are","at","be","by","can","do","does","for","how","i","in","is","it","me","my","of","on","or","our","please","that","the","this","to","us","we","what","when","where","which","with","you","your"])});function _8(t){let e={type:t.type};if(t.description&&(e.description=t.description),t.enum&&(e.enum=t.enum),t.type==="array"&&t.items&&(e.items=_8(t.items)),t.type==="object"&&t.properties){let r={};for(let[n,i]of Object.entries(t.properties))r[n]=_8(i);e.properties=r,t.required?.length&&(e.required=t.required)}return e}function ff(t,e){let r={};for(let[n,i]of Object.entries(t))r[n]=_8(i);return{type:"object",properties:r,...e.length>0?{required:e}:{}}}function gy(t){return{name:t.name,description:t.description,input_schema:ff(t.params,t.required),...t.searchHint?{searchHint:t.searchHint}:{}}}var TT=X(()=>{"use strict"});function kT(t){if(typeof t!="string")return t.isDestructive??!1;let e=t;return e.startsWith("delete_")||e.startsWith("pay_")||e.startsWith("finalize_")||e.includes("refund")||e==="remove_org_user"}function D8(t){return{readOnlyHint:t.readOnly,destructiveHint:!t.readOnly&&kT(t),idempotentHint:t.readOnly,openWorldHint:t.openWorld??!1}}function Kat(t){if(!t.trim())return{namespaces:Uc.map(i=>{let o=i.groups.flatMap(s=>zh(s));return{name:i.name,description:i.description,toolCount:o.length,tools:o.map(s=>s.name)}}),hint:"Call describe_tools with specific tool names to get full schemas before executing."};let e=Zat(t,5);if(e.length===0)return{matches:[],hint:`No tools match "${t}". Try broader terms or call search_tools with empty query to see all namespaces.`};let n=t.toLowerCase().split(/\s+/).filter(Boolean);return{matches:e.map(i=>{let o=i.groups.flatMap(u=>zh(u)),s=o.map(u=>`${u.name} ${(u.aliases??[]).join(" ")} ${u.searchHint??""} ${u.description}`.toLowerCase()),a=new Map(n.map(u=>{let d=s.filter(f=>f.includes(u)).length;return[u,Math.log((o.length+1)/(d+1))]})),c=o.map((u,d)=>{let f=s[d],p=n.reduce((h,m)=>f.includes(m)?h+(a.get(m)??0):h,0);return{tool:u,score:p}}).sort((u,d)=>d.score-u.score);return{namespace:i.name,description:i.description,tools:c.map(u=>({name:u.tool.name,description:u.tool.description.split(`
|
|
868
868
|
`)[0],...u.tool.searchHint?{searchHint:u.tool.searchHint}:{}}))}}),hint:"Call describe_tools with the tool names you need, then execute_tool to run them."}}function Xat(t){if(!Array.isArray(t)||!t.every(n=>typeof n=="string"))return{error:"Invalid `tools` parameter. Expected string[]."};if(t.length===0)return{error:"Provide at least one tool name. Use search_tools first to discover tool names."};let e=[],r=[];for(let n of t){let i=lf(n);if(!i){r.push(n);continue}e.push({...gy(i),readOnly:i.readOnly,isDestructive:i.isDestructive??!1,isConcurrencySafe:i.isConcurrencySafe??!1,destructiveHint:!i.readOnly&&kT(i),group:i.group})}return{tools:e,...r.length>0?{notFound:r,hint:`Tools not found: ${r.join(", ")}. Use search_tools to find correct names.`}:{}}}var SIr,RIr,BIr,Wh,pf,NT=X(()=>{"use strict";xT();py();TT();SIr={name:"search_tools",description:"Search for available Jaz accounting tools by keyword. Returns matching tool namespaces with tool names and descriptions. Call with empty query to list all namespaces. ALWAYS call this first to discover what tools are available.",inputSchema:ff({query:{type:"string",description:'Search keyword (e.g. "invoice", "bank recon", "depreciation"). Empty string lists all namespaces.'}},[])};RIr={name:"describe_tools",description:"Get full JSON Schema (parameters, types, required fields) for specific tools. Call this after search_tools to get the exact input format before calling execute_tool.",inputSchema:ff({tools:{type:"array",items:{type:"string"},description:'Tool names to describe (e.g. ["create_invoice", "search_contacts"])'}},["tools"])},BIr={name:"execute_tool",description:"Execute a Jaz accounting tool. Call describe_tools first to get the required parameters. Pass the tool name and its arguments.",inputSchema:ff({tool:{type:"string",description:'Tool name (e.g. "create_invoice")'},arguments:{type:"object",description:"Tool arguments (see describe_tools for schema)"},org_id:{type:"string",description:"Organization ID (UUID). Required in multi-org mode (PAT or multiple API keys). Call list_organizations to get available IDs."}},["tool"])},Wh={name:"list_organizations",description:"List organizations available to the current authentication. Returns org names and resource IDs for use as org_id in execute_tool calls.",inputSchema:ff({},[])},pf=[SIr,RIr,BIr]});var LT=b(Tr=>{"use strict";Object.defineProperty(Tr,"__esModule",{value:!0});Tr.regexpCode=Tr.getEsmExportName=Tr.getProperty=Tr.safeStringify=Tr.stringify=Tr.strConcat=Tr.addCodeArg=Tr.str=Tr._=Tr.nil=Tr._Code=Tr.Name=Tr.IDENTIFIER=Tr._CodeOrName=void 0;var FT=class{};Tr._CodeOrName=FT;Tr.IDENTIFIER=/^[a-z$_][a-z$_0-9]*$/i;var yy=class extends FT{constructor(e){if(super(),!Tr.IDENTIFIER.test(e))throw new Error("CodeGen: name must be a valid identifier");this.str=e}toString(){return this.str}emptyStr(){return!1}get names(){return{[this.str]:1}}};Tr.Name=yy;var $c=class extends FT{constructor(e){super(),this._items=typeof e=="string"?[e]:e}toString(){return this.str}emptyStr(){if(this._items.length>1)return!1;let e=this._items[0];return e===""||e==='""'}get str(){var e;return(e=this._str)!==null&&e!==void 0?e:this._str=this._items.reduce((r,n)=>`${r}${n}`,"")}get names(){var e;return(e=this._names)!==null&&e!==void 0?e:this._names=this._items.reduce((r,n)=>(n instanceof yy&&(r[n.str]=(r[n.str]||0)+1),r),{})}};Tr._Code=$c;Tr.nil=new $c("");function nct(t,...e){let r=[t[0]],n=0;for(;n<e.length;)cfe(r,e[n]),r.push(t[++n]);return new $c(r)}Tr._=nct;var afe=new $c("+");function ict(t,...e){let r=[QT(t[0])],n=0;for(;n<e.length;)r.push(afe),cfe(r,e[n]),r.push(afe,QT(t[++n]));return QIr(r),new $c(r)}Tr.str=ict;function cfe(t,e){e instanceof $c?t.push(...e._items):e instanceof yy?t.push(e):t.push(PIr(e))}Tr.addCodeArg=cfe;function QIr(t){let e=1;for(;e<t.length-1;){if(t[e]===afe){let r=LIr(t[e-1],t[e+1]);if(r!==void 0){t.splice(e-1,3,r);continue}t[e++]="+"}e++}}function LIr(t,e){if(e==='""')return t;if(t==='""')return e;if(typeof t=="string")return e instanceof yy||t[t.length-1]!=='"'?void 0:typeof e!="string"?`${t.slice(0,-1)}${e}"`:e[0]==='"'?t.slice(0,-1)+e.slice(1):void 0;if(typeof e=="string"&&e[0]==='"'&&!(t instanceof yy))return`"${t}${e.slice(1)}`}function MIr(t,e){return e.emptyStr()?t:t.emptyStr()?e:ict`${t}${e}`}Tr.strConcat=MIr;function PIr(t){return typeof t=="number"||typeof t=="boolean"||t===null?t:QT(Array.isArray(t)?t.join(","):t)}function UIr(t){return new $c(QT(t))}Tr.stringify=UIr;function QT(t){return JSON.stringify(t).replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")}Tr.safeStringify=QT;function $Ir(t){return typeof t=="string"&&Tr.IDENTIFIER.test(t)?new $c(`.${t}`):nct`[${t}]`}Tr.getProperty=$Ir;function qIr(t){if(typeof t=="string"&&Tr.IDENTIFIER.test(t))return new $c(`${t}`);throw new Error(`CodeGen: invalid export name: ${t}, use explicit $id name mapping`)}Tr.getEsmExportName=qIr;function jIr(t){return new $c(t.toString())}Tr.regexpCode=jIr});var dfe=b(aa=>{"use strict";Object.defineProperty(aa,"__esModule",{value:!0});aa.ValueScope=aa.ValueScopeName=aa.Scope=aa.varKinds=aa.UsedValueState=void 0;var sa=LT(),lfe=class extends Error{constructor(e){super(`CodeGen: "code" for ${e} not defined`),this.value=e.value}},B8;(function(t){t[t.Started=0]="Started",t[t.Completed=1]="Completed"})(B8||(aa.UsedValueState=B8={}));aa.varKinds={const:new sa.Name("const"),let:new sa.Name("let"),var:new sa.Name("var")};var x8=class{constructor({prefixes:e,parent:r}={}){this._names={},this._prefixes=e,this._parent=r}toName(e){return e instanceof sa.Name?e:this.name(e)}name(e){return new sa.Name(this._newName(e))}_newName(e){let r=this._names[e]||this._nameGroup(e);return`${e}${r.index++}`}_nameGroup(e){var r,n;if(!((n=(r=this._parent)===null||r===void 0?void 0:r._prefixes)===null||n===void 0)&&n.has(e)||this._prefixes&&!this._prefixes.has(e))throw new Error(`CodeGen: prefix "${e}" is not allowed in this scope`);return this._names[e]={prefix:e,index:0}}};aa.Scope=x8;var T8=class extends sa.Name{constructor(e,r){super(r),this.prefix=e}setValue(e,{property:r,itemIndex:n}){this.value=e,this.scopePath=(0,sa._)`.${new sa.Name(r)}[${n}]`}};aa.ValueScopeName=T8;var YIr=(0,sa._)`\n`,ufe=class extends x8{constructor(e){super(e),this._values={},this._scope=e.scope,this.opts={...e,_n:e.lines?YIr:sa.nil}}get(){return this._scope}name(e){return new T8(e,this._newName(e))}value(e,r){var n;if(r.ref===void 0)throw new Error("CodeGen: ref must be passed in value");let i=this.toName(e),{prefix:o}=i,s=(n=r.key)!==null&&n!==void 0?n:r.ref,a=this._values[o];if(a){let d=a.get(s);if(d)return d}else a=this._values[o]=new Map;a.set(s,i);let c=this._scope[o]||(this._scope[o]=[]),u=c.length;return c[u]=r.ref,i.setValue(r,{property:o,itemIndex:u}),i}getValue(e,r){let n=this._values[e];if(n)return n.get(r)}scopeRefs(e,r=this._values){return this._reduceValues(r,n=>{if(n.scopePath===void 0)throw new Error(`CodeGen: name "${n}" has no value`);return(0,sa._)`${e}${n.scopePath}`})}scopeCode(e=this._values,r,n){return this._reduceValues(e,i=>{if(i.value===void 0)throw new Error(`CodeGen: name "${i}" has no value`);return i.value.code},r,n)}_reduceValues(e,r,n={},i){let o=sa.nil;for(let s in e){let a=e[s];if(!a)continue;let c=n[s]=n[s]||new Map;a.forEach(u=>{if(c.has(u))return;c.set(u,B8.Started);let d=r(u);if(d){let f=this.opts.es5?aa.varKinds.var:aa.varKinds.const;o=(0,sa._)`${o}${f} ${u} = ${d};${this.opts._n}`}else if(d=i?.(u))o=(0,sa._)`${o}${d}${this.opts._n}`;else throw new lfe(u);c.set(u,B8.Completed)})}return o}};aa.ValueScope=ufe});var qt=b(Ht=>{"use strict";Object.defineProperty(Ht,"__esModule",{value:!0});Ht.or=Ht.and=Ht.not=Ht.CodeGen=Ht.operators=Ht.varKinds=Ht.ValueScopeName=Ht.ValueScope=Ht.Scope=Ht.Name=Ht.regexpCode=Ht.stringify=Ht.getProperty=Ht.nil=Ht.strConcat=Ht.str=Ht._=void 0;var hr=LT(),Ll=dfe(),Xh=LT();Object.defineProperty(Ht,"_",{enumerable:!0,get:function(){return Xh._}});Object.defineProperty(Ht,"str",{enumerable:!0,get:function(){return Xh.str}});Object.defineProperty(Ht,"strConcat",{enumerable:!0,get:function(){return Xh.strConcat}});Object.defineProperty(Ht,"nil",{enumerable:!0,get:function(){return Xh.nil}});Object.defineProperty(Ht,"getProperty",{enumerable:!0,get:function(){return Xh.getProperty}});Object.defineProperty(Ht,"stringify",{enumerable:!0,get:function(){return Xh.stringify}});Object.defineProperty(Ht,"regexpCode",{enumerable:!0,get:function(){return Xh.regexpCode}});Object.defineProperty(Ht,"Name",{enumerable:!0,get:function(){return Xh.Name}});var F8=dfe();Object.defineProperty(Ht,"Scope",{enumerable:!0,get:function(){return F8.Scope}});Object.defineProperty(Ht,"ValueScope",{enumerable:!0,get:function(){return F8.ValueScope}});Object.defineProperty(Ht,"ValueScopeName",{enumerable:!0,get:function(){return F8.ValueScopeName}});Object.defineProperty(Ht,"varKinds",{enumerable:!0,get:function(){return F8.varKinds}});Ht.operators={GT:new hr._Code(">"),GTE:new hr._Code(">="),LT:new hr._Code("<"),LTE:new hr._Code("<="),EQ:new hr._Code("==="),NEQ:new hr._Code("!=="),NOT:new hr._Code("!"),OR:new hr._Code("||"),AND:new hr._Code("&&"),ADD:new hr._Code("+")};var mf=class{optimizeNodes(){return this}optimizeNames(e,r){return this}},ffe=class extends mf{constructor(e,r,n){super(),this.varKind=e,this.name=r,this.rhs=n}render({es5:e,_n:r}){let n=e?Ll.varKinds.var:this.varKind,i=this.rhs===void 0?"":` = ${this.rhs}`;return`${n} ${this.name}${i};`+r}optimizeNames(e,r){if(e[this.name.str])return this.rhs&&(this.rhs=kv(this.rhs,e,r)),this}get names(){return this.rhs instanceof hr._CodeOrName?this.rhs.names:{}}},k8=class extends mf{constructor(e,r,n){super(),this.lhs=e,this.rhs=r,this.sideEffects=n}render({_n:e}){return`${this.lhs} = ${this.rhs};`+e}optimizeNames(e,r){if(!(this.lhs instanceof hr.Name&&!e[this.lhs.str]&&!this.sideEffects))return this.rhs=kv(this.rhs,e,r),this}get names(){let e=this.lhs instanceof hr.Name?{}:{...this.lhs.names};return O8(e,this.rhs)}},pfe=class extends k8{constructor(e,r,n,i){super(e,n,i),this.op=r}render({_n:e}){return`${this.lhs} ${this.op}= ${this.rhs};`+e}},hfe=class extends mf{constructor(e){super(),this.label=e,this.names={}}render({_n:e}){return`${this.label}:`+e}},mfe=class extends mf{constructor(e){super(),this.label=e,this.names={}}render({_n:e}){return`break${this.label?` ${this.label}`:""};`+e}},Afe=class extends mf{constructor(e){super(),this.error=e}render({_n:e}){return`throw ${this.error};`+e}get names(){return this.error.names}},gfe=class extends mf{constructor(e){super(),this.code=e}render({_n:e}){return`${this.code};`+e}optimizeNodes(){return`${this.code}`?this:void 0}optimizeNames(e,r){return this.code=kv(this.code,e,r),this}get names(){return this.code instanceof hr._CodeOrName?this.code.names:{}}},MT=class extends mf{constructor(e=[]){super(),this.nodes=e}render(e){return this.nodes.reduce((r,n)=>r+n.render(e),"")}optimizeNodes(){let{nodes:e}=this,r=e.length;for(;r--;){let n=e[r].optimizeNodes();Array.isArray(n)?e.splice(r,1,...n):n?e[r]=n:e.splice(r,1)}return e.length>0?this:void 0}optimizeNames(e,r){let{nodes:n}=this,i=n.length;for(;i--;){let o=n[i];o.optimizeNames(e,r)||(HIr(e,o.names),n.splice(i,1))}return n.length>0?this:void 0}get names(){return this.nodes.reduce((e,r)=>Cy(e,r.names),{})}},Af=class extends MT{render(e){return"{"+e._n+super.render(e)+"}"+e._n}},yfe=class extends MT{},Tv=class extends Af{};Tv.kind="else";var Ey=class t extends Af{constructor(e,r){super(r),this.condition=e}render(e){let r=`if(${this.condition})`+super.render(e);return this.else&&(r+="else "+this.else.render(e)),r}optimizeNodes(){super.optimizeNodes();let e=this.condition;if(e===!0)return this.nodes;let r=this.else;if(r){let n=r.optimizeNodes();r=this.else=Array.isArray(n)?new Tv(n):n}if(r)return e===!1?r instanceof t?r:r.nodes:this.nodes.length?this:new t(oct(e),r instanceof t?[r]:r.nodes);if(!(e===!1||!this.nodes.length))return this}optimizeNames(e,r){var n;if(this.else=(n=this.else)===null||n===void 0?void 0:n.optimizeNames(e,r),!!(super.optimizeNames(e,r)||this.else))return this.condition=kv(this.condition,e,r),this}get names(){let e=super.names;return O8(e,this.condition),this.else&&Cy(e,this.else.names),e}};Ey.kind="if";var by=class extends Af{};by.kind="for";var Efe=class extends by{constructor(e){super(),this.iteration=e}render(e){return`for(${this.iteration})`+super.render(e)}optimizeNames(e,r){if(super.optimizeNames(e,r))return this.iteration=kv(this.iteration,e,r),this}get names(){return Cy(super.names,this.iteration.names)}},bfe=class extends by{constructor(e,r,n,i){super(),this.varKind=e,this.name=r,this.from=n,this.to=i}render(e){let r=e.es5?Ll.varKinds.var:this.varKind,{name:n,from:i,to:o}=this;return`for(${r} ${n}=${i}; ${n}<${o}; ${n}++)`+super.render(e)}get names(){let e=O8(super.names,this.from);return O8(e,this.to)}},N8=class extends by{constructor(e,r,n,i){super(),this.loop=e,this.varKind=r,this.name=n,this.iterable=i}render(e){return`for(${this.varKind} ${this.name} ${this.loop} ${this.iterable})`+super.render(e)}optimizeNames(e,r){if(super.optimizeNames(e,r))return this.iterable=kv(this.iterable,e,r),this}get names(){return Cy(super.names,this.iterable.names)}},PT=class extends Af{constructor(e,r,n){super(),this.name=e,this.args=r,this.async=n}render(e){return`${this.async?"async ":""}function ${this.name}(${this.args})`+super.render(e)}};PT.kind="func";var UT=class extends MT{render(e){return"return "+super.render(e)}};UT.kind="return";var Cfe=class extends Af{render(e){let r="try"+super.render(e);return this.catch&&(r+=this.catch.render(e)),this.finally&&(r+=this.finally.render(e)),r}optimizeNodes(){var e,r;return super.optimizeNodes(),(e=this.catch)===null||e===void 0||e.optimizeNodes(),(r=this.finally)===null||r===void 0||r.optimizeNodes(),this}optimizeNames(e,r){var n,i;return super.optimizeNames(e,r),(n=this.catch)===null||n===void 0||n.optimizeNames(e,r),(i=this.finally)===null||i===void 0||i.optimizeNames(e,r),this}get names(){let e=super.names;return this.catch&&Cy(e,this.catch.names),this.finally&&Cy(e,this.finally.names),e}},$T=class extends Af{constructor(e){super(),this.error=e}render(e){return`catch(${this.error})`+super.render(e)}};$T.kind="catch";var qT=class extends Af{render(e){return"finally"+super.render(e)}};qT.kind="finally";var vfe=class{constructor(e,r={}){this._values={},this._blockStarts=[],this._constants={},this.opts={...r,_n:r.lines?`
|
|
869
869
|
`:""},this._extScope=e,this._scope=new Ll.Scope({parent:e}),this._nodes=[new yfe]}toString(){return this._root.render(this.opts)}name(e){return this._scope.name(e)}scopeName(e){return this._extScope.name(e)}scopeValue(e,r){let n=this._extScope.value(e,r);return(this._values[n.prefix]||(this._values[n.prefix]=new Set)).add(n),n}getScopeValue(e,r){return this._extScope.getValue(e,r)}scopeRefs(e){return this._extScope.scopeRefs(e,this._values)}scopeCode(){return this._extScope.scopeCode(this._values)}_def(e,r,n,i){let o=this._scope.toName(r);return n!==void 0&&i&&(this._constants[o.str]=n),this._leafNode(new ffe(e,o,n)),o}const(e,r,n){return this._def(Ll.varKinds.const,e,r,n)}let(e,r,n){return this._def(Ll.varKinds.let,e,r,n)}var(e,r,n){return this._def(Ll.varKinds.var,e,r,n)}assign(e,r,n){return this._leafNode(new k8(e,r,n))}add(e,r){return this._leafNode(new pfe(e,Ht.operators.ADD,r))}code(e){return typeof e=="function"?e():e!==hr.nil&&this._leafNode(new gfe(e)),this}object(...e){let r=["{"];for(let[n,i]of e)r.length>1&&r.push(","),r.push(n),(n!==i||this.opts.es5)&&(r.push(":"),(0,hr.addCodeArg)(r,i));return r.push("}"),new hr._Code(r)}if(e,r,n){if(this._blockNode(new Ey(e)),r&&n)this.code(r).else().code(n).endIf();else if(r)this.code(r).endIf();else if(n)throw new Error('CodeGen: "else" body without "then" body');return this}elseIf(e){return this._elseNode(new Ey(e))}else(){return this._elseNode(new Tv)}endIf(){return this._endBlockNode(Ey,Tv)}_for(e,r){return this._blockNode(e),r&&this.code(r).endFor(),this}for(e,r){return this._for(new Efe(e),r)}forRange(e,r,n,i,o=this.opts.es5?Ll.varKinds.var:Ll.varKinds.let){let s=this._scope.toName(e);return this._for(new bfe(o,s,r,n),()=>i(s))}forOf(e,r,n,i=Ll.varKinds.const){let o=this._scope.toName(e);if(this.opts.es5){let s=r instanceof hr.Name?r:this.var("_arr",r);return this.forRange("_i",0,(0,hr._)`${s}.length`,a=>{this.var(o,(0,hr._)`${s}[${a}]`),n(o)})}return this._for(new N8("of",i,o,r),()=>n(o))}forIn(e,r,n,i=this.opts.es5?Ll.varKinds.var:Ll.varKinds.const){if(this.opts.ownProperties)return this.forOf(e,(0,hr._)`Object.keys(${r})`,n);let o=this._scope.toName(e);return this._for(new N8("in",i,o,r),()=>n(o))}endFor(){return this._endBlockNode(by)}label(e){return this._leafNode(new hfe(e))}break(e){return this._leafNode(new mfe(e))}return(e){let r=new UT;if(this._blockNode(r),this.code(e),r.nodes.length!==1)throw new Error('CodeGen: "return" should have one node');return this._endBlockNode(UT)}try(e,r,n){if(!r&&!n)throw new Error('CodeGen: "try" without "catch" and "finally"');let i=new Cfe;if(this._blockNode(i),this.code(e),r){let o=this.name("e");this._currNode=i.catch=new $T(o),r(o)}return n&&(this._currNode=i.finally=new qT,this.code(n)),this._endBlockNode($T,qT)}throw(e){return this._leafNode(new Afe(e))}block(e,r){return this._blockStarts.push(this._nodes.length),e&&this.code(e).endBlock(r),this}endBlock(e){let r=this._blockStarts.pop();if(r===void 0)throw new Error("CodeGen: not in self-balancing block");let n=this._nodes.length-r;if(n<0||e!==void 0&&n!==e)throw new Error(`CodeGen: wrong number of nodes: ${n} vs ${e} expected`);return this._nodes.length=r,this}func(e,r=hr.nil,n,i){return this._blockNode(new PT(e,r,n)),i&&this.code(i).endFunc(),this}endFunc(){return this._endBlockNode(PT)}optimize(e=1){for(;e-- >0;)this._root.optimizeNodes(),this._root.optimizeNames(this._root.names,this._constants)}_leafNode(e){return this._currNode.nodes.push(e),this}_blockNode(e){this._currNode.nodes.push(e),this._nodes.push(e)}_endBlockNode(e,r){let n=this._currNode;if(n instanceof e||r&&n instanceof r)return this._nodes.pop(),this;throw new Error(`CodeGen: not in block "${r?`${e.kind}/${r.kind}`:e.kind}"`)}_elseNode(e){let r=this._currNode;if(!(r instanceof Ey))throw new Error('CodeGen: "else" without "if"');return this._currNode=r.else=e,this}get _root(){return this._nodes[0]}get _currNode(){let e=this._nodes;return e[e.length-1]}set _currNode(e){let r=this._nodes;r[r.length-1]=e}};Ht.CodeGen=vfe;function Cy(t,e){for(let r in e)t[r]=(t[r]||0)+(e[r]||0);return t}function O8(t,e){return e instanceof hr._CodeOrName?Cy(t,e.names):t}function kv(t,e,r){if(t instanceof hr.Name)return n(t);if(!i(t))return t;return new hr._Code(t._items.reduce((o,s)=>(s instanceof hr.Name&&(s=n(s)),s instanceof hr._Code?o.push(...s._items):o.push(s),o),[]));function n(o){let s=r[o.str];return s===void 0||e[o.str]!==1?o:(delete e[o.str],s)}function i(o){return o instanceof hr._Code&&o._items.some(s=>s instanceof hr.Name&&e[s.str]===1&&r[s.str]!==void 0)}}function HIr(t,e){for(let r in e)t[r]=(t[r]||0)-(e[r]||0)}function oct(t){return typeof t=="boolean"||typeof t=="number"||t===null?!t:(0,hr._)`!${Ife(t)}`}Ht.not=oct;var zIr=sct(Ht.operators.AND);function GIr(...t){return t.reduce(zIr)}Ht.and=GIr;var VIr=sct(Ht.operators.OR);function JIr(...t){return t.reduce(VIr)}Ht.or=JIr;function sct(t){return(e,r)=>e===hr.nil?r:r===hr.nil?e:(0,hr._)`${Ife(e)} ${t} ${Ife(r)}`}function Ife(t){return t instanceof hr.Name?t:(0,hr._)`(${t})`}});var br=b(rr=>{"use strict";Object.defineProperty(rr,"__esModule",{value:!0});rr.checkStrictMode=rr.getErrorPath=rr.Type=rr.useFunc=rr.setEvaluated=rr.evaluatedPropsToName=rr.mergeEvaluated=rr.eachItem=rr.unescapeJsonPointer=rr.escapeJsonPointer=rr.escapeFragment=rr.unescapeFragment=rr.schemaRefOrVal=rr.schemaHasRulesButRef=rr.schemaHasRules=rr.checkUnknownRules=rr.alwaysValidSchema=rr.toHash=void 0;var ln=qt(),WIr=LT();function ZIr(t){let e={};for(let r of t)e[r]=!0;return e}rr.toHash=ZIr;function KIr(t,e){return typeof e=="boolean"?e:Object.keys(e).length===0?!0:(lct(t,e),!uct(e,t.self.RULES.all))}rr.alwaysValidSchema=KIr;function lct(t,e=t.schema){let{opts:r,self:n}=t;if(!r.strictSchema||typeof e=="boolean")return;let i=n.RULES.keywords;for(let o in e)i[o]||pct(t,`unknown keyword: "${o}"`)}rr.checkUnknownRules=lct;function uct(t,e){if(typeof t=="boolean")return!t;for(let r in t)if(e[r])return!0;return!1}rr.schemaHasRules=uct;function XIr(t,e){if(typeof t=="boolean")return!t;for(let r in t)if(r!=="$ref"&&e.all[r])return!0;return!1}rr.schemaHasRulesButRef=XIr;function ewr({topSchemaRef:t,schemaPath:e},r,n,i){if(!i){if(typeof r=="number"||typeof r=="boolean")return r;if(typeof r=="string")return(0,ln._)`${r}`}return(0,ln._)`${t}${e}${(0,ln.getProperty)(n)}`}rr.schemaRefOrVal=ewr;function twr(t){return dct(decodeURIComponent(t))}rr.unescapeFragment=twr;function rwr(t){return encodeURIComponent(_fe(t))}rr.escapeFragment=rwr;function _fe(t){return typeof t=="number"?`${t}`:t.replace(/~/g,"~0").replace(/\//g,"~1")}rr.escapeJsonPointer=_fe;function dct(t){return t.replace(/~1/g,"/").replace(/~0/g,"~")}rr.unescapeJsonPointer=dct;function nwr(t,e){if(Array.isArray(t))for(let r of t)e(r);else e(t)}rr.eachItem=nwr;function act({mergeNames:t,mergeToName:e,mergeValues:r,resultToName:n}){return(i,o,s,a)=>{let c=s===void 0?o:s instanceof ln.Name?(o instanceof ln.Name?t(i,o,s):e(i,o,s),s):o instanceof ln.Name?(e(i,s,o),o):r(o,s);return a===ln.Name&&!(c instanceof ln.Name)?n(i,c):c}}rr.mergeEvaluated={props:act({mergeNames:(t,e,r)=>t.if((0,ln._)`${r} !== true && ${e} !== undefined`,()=>{t.if((0,ln._)`${e} === true`,()=>t.assign(r,!0),()=>t.assign(r,(0,ln._)`${r} || {}`).code((0,ln._)`Object.assign(${r}, ${e})`))}),mergeToName:(t,e,r)=>t.if((0,ln._)`${r} !== true`,()=>{e===!0?t.assign(r,!0):(t.assign(r,(0,ln._)`${r} || {}`),Dfe(t,r,e))}),mergeValues:(t,e)=>t===!0?!0:{...t,...e},resultToName:fct}),items:act({mergeNames:(t,e,r)=>t.if((0,ln._)`${r} !== true && ${e} !== undefined`,()=>t.assign(r,(0,ln._)`${e} === true ? true : ${r} > ${e} ? ${r} : ${e}`)),mergeToName:(t,e,r)=>t.if((0,ln._)`${r} !== true`,()=>t.assign(r,e===!0?!0:(0,ln._)`${r} > ${e} ? ${r} : ${e}`)),mergeValues:(t,e)=>t===!0?!0:Math.max(t,e),resultToName:(t,e)=>t.var("items",e)})};function fct(t,e){if(e===!0)return t.var("props",!0);let r=t.var("props",(0,ln._)`{}`);return e!==void 0&&Dfe(t,r,e),r}rr.evaluatedPropsToName=fct;function Dfe(t,e,r){Object.keys(r).forEach(n=>t.assign((0,ln._)`${e}${(0,ln.getProperty)(n)}`,!0))}rr.setEvaluated=Dfe;var cct={};function iwr(t,e){return t.scopeValue("func",{ref:e,code:cct[e.code]||(cct[e.code]=new WIr._Code(e.code))})}rr.useFunc=iwr;var wfe;(function(t){t[t.Num=0]="Num",t[t.Str=1]="Str"})(wfe||(rr.Type=wfe={}));function owr(t,e,r){if(t instanceof ln.Name){let n=e===wfe.Num;return r?n?(0,ln._)`"[" + ${t} + "]"`:(0,ln._)`"['" + ${t} + "']"`:n?(0,ln._)`"/" + ${t}`:(0,ln._)`"/" + ${t}.replace(/~/g, "~0").replace(/\\//g, "~1")`}return r?(0,ln.getProperty)(t).toString():"/"+_fe(t)}rr.getErrorPath=owr;function pct(t,e,r=t.opts.strictSchema){if(r){if(e=`strict mode: ${e}`,r===!0)throw new Error(e);t.self.logger.warn(e)}}rr.checkStrictMode=pct});var gf=b(Sfe=>{"use strict";Object.defineProperty(Sfe,"__esModule",{value:!0});var os=qt(),swr={data:new os.Name("data"),valCxt:new os.Name("valCxt"),instancePath:new os.Name("instancePath"),parentData:new os.Name("parentData"),parentDataProperty:new os.Name("parentDataProperty"),rootData:new os.Name("rootData"),dynamicAnchors:new os.Name("dynamicAnchors"),vErrors:new os.Name("vErrors"),errors:new os.Name("errors"),this:new os.Name("this"),self:new os.Name("self"),scope:new os.Name("scope"),json:new os.Name("json"),jsonPos:new os.Name("jsonPos"),jsonLen:new os.Name("jsonLen"),jsonPart:new os.Name("jsonPart")};Sfe.default=swr});var jT=b(ss=>{"use strict";Object.defineProperty(ss,"__esModule",{value:!0});ss.extendErrors=ss.resetErrorsCount=ss.reportExtraError=ss.reportError=ss.keyword$DataError=ss.keywordError=void 0;var Cr=qt(),Q8=br(),Ns=gf();ss.keywordError={message:({keyword:t})=>(0,Cr.str)`must pass "${t}" keyword validation`};ss.keyword$DataError={message:({keyword:t,schemaType:e})=>e?(0,Cr.str)`"${t}" keyword must be ${e} ($data)`:(0,Cr.str)`"${t}" keyword is invalid ($data)`};function awr(t,e=ss.keywordError,r,n){let{it:i}=t,{gen:o,compositeRule:s,allErrors:a}=i,c=Act(t,e,r);n??(s||a)?hct(o,c):mct(i,(0,Cr._)`[${c}]`)}ss.reportError=awr;function cwr(t,e=ss.keywordError,r){let{it:n}=t,{gen:i,compositeRule:o,allErrors:s}=n,a=Act(t,e,r);hct(i,a),o||s||mct(n,Ns.default.vErrors)}ss.reportExtraError=cwr;function lwr(t,e){t.assign(Ns.default.errors,e),t.if((0,Cr._)`${Ns.default.vErrors} !== null`,()=>t.if(e,()=>t.assign((0,Cr._)`${Ns.default.vErrors}.length`,e),()=>t.assign(Ns.default.vErrors,null)))}ss.resetErrorsCount=lwr;function uwr({gen:t,keyword:e,schemaValue:r,data:n,errsCount:i,it:o}){if(i===void 0)throw new Error("ajv implementation error");let s=t.name("err");t.forRange("i",i,Ns.default.errors,a=>{t.const(s,(0,Cr._)`${Ns.default.vErrors}[${a}]`),t.if((0,Cr._)`${s}.instancePath === undefined`,()=>t.assign((0,Cr._)`${s}.instancePath`,(0,Cr.strConcat)(Ns.default.instancePath,o.errorPath))),t.assign((0,Cr._)`${s}.schemaPath`,(0,Cr.str)`${o.errSchemaPath}/${e}`),o.opts.verbose&&(t.assign((0,Cr._)`${s}.schema`,r),t.assign((0,Cr._)`${s}.data`,n))})}ss.extendErrors=uwr;function hct(t,e){let r=t.const("err",e);t.if((0,Cr._)`${Ns.default.vErrors} === null`,()=>t.assign(Ns.default.vErrors,(0,Cr._)`[${r}]`),(0,Cr._)`${Ns.default.vErrors}.push(${r})`),t.code((0,Cr._)`${Ns.default.errors}++`)}function mct(t,e){let{gen:r,validateName:n,schemaEnv:i}=t;i.$async?r.throw((0,Cr._)`new ${t.ValidationError}(${e})`):(r.assign((0,Cr._)`${n}.errors`,e),r.return(!1))}var vy={keyword:new Cr.Name("keyword"),schemaPath:new Cr.Name("schemaPath"),params:new Cr.Name("params"),propertyName:new Cr.Name("propertyName"),message:new Cr.Name("message"),schema:new Cr.Name("schema"),parentSchema:new Cr.Name("parentSchema")};function Act(t,e,r){let{createErrors:n}=t.it;return n===!1?(0,Cr._)`{}`:dwr(t,e,r)}function dwr(t,e,r={}){let{gen:n,it:i}=t,o=[fwr(i,r),pwr(t,r)];return hwr(t,e,o),n.object(...o)}function fwr({errorPath:t},{instancePath:e}){let r=e?(0,Cr.str)`${t}${(0,Q8.getErrorPath)(e,Q8.Type.Str)}`:t;return[Ns.default.instancePath,(0,Cr.strConcat)(Ns.default.instancePath,r)]}function pwr({keyword:t,it:{errSchemaPath:e}},{schemaPath:r,parentSchema:n}){let i=n?e:(0,Cr.str)`${e}/${t}`;return r&&(i=(0,Cr.str)`${i}${(0,Q8.getErrorPath)(r,Q8.Type.Str)}`),[vy.schemaPath,i]}function hwr(t,{params:e,message:r},n){let{keyword:i,data:o,schemaValue:s,it:a}=t,{opts:c,propertyName:u,topSchemaRef:d,schemaPath:f}=a;n.push([vy.keyword,i],[vy.params,typeof e=="function"?e(t):e||(0,Cr._)`{}`]),c.messages&&n.push([vy.message,typeof r=="function"?r(t):r]),c.verbose&&n.push([vy.schema,s],[vy.parentSchema,(0,Cr._)`${d}${f}`],[Ns.default.data,o]),u&&n.push([vy.propertyName,u])}});var yct=b(Nv=>{"use strict";Object.defineProperty(Nv,"__esModule",{value:!0});Nv.boolOrEmptySchema=Nv.topBoolOrEmptySchema=void 0;var mwr=jT(),Awr=qt(),gwr=gf(),ywr={message:"boolean schema is false"};function Ewr(t){let{gen:e,schema:r,validateName:n}=t;r===!1?gct(t,!1):typeof r=="object"&&r.$async===!0?e.return(gwr.default.data):(e.assign((0,Awr._)`${n}.errors`,null),e.return(!0))}Nv.topBoolOrEmptySchema=Ewr;function bwr(t,e){let{gen:r,schema:n}=t;n===!1?(r.var(e,!1),gct(t)):r.var(e,!0)}Nv.boolOrEmptySchema=bwr;function gct(t,e){let{gen:r,data:n}=t,i={gen:r,keyword:"false schema",data:n,schema:!1,schemaCode:!1,schemaValue:!1,params:{},it:t};(0,mwr.reportError)(i,ywr,void 0,e)}});var Rfe=b(Ov=>{"use strict";Object.defineProperty(Ov,"__esModule",{value:!0});Ov.getRules=Ov.isJSONType=void 0;var Cwr=["string","number","integer","boolean","null","object","array"],vwr=new Set(Cwr);function Iwr(t){return typeof t=="string"&&vwr.has(t)}Ov.isJSONType=Iwr;function wwr(){let t={number:{type:"number",rules:[]},string:{type:"string",rules:[]},array:{type:"array",rules:[]},object:{type:"object",rules:[]}};return{types:{...t,integer:!0,boolean:!0,null:!0},rules:[{rules:[]},t.number,t.string,t.array,t.object],post:{rules:[]},all:{},keywords:{}}}Ov.getRules=wwr});var Bfe=b(em=>{"use strict";Object.defineProperty(em,"__esModule",{value:!0});em.shouldUseRule=em.shouldUseGroup=em.schemaHasRulesForType=void 0;function _wr({schema:t,self:e},r){let n=e.RULES.types[r];return n&&n!==!0&&Ect(t,n)}em.schemaHasRulesForType=_wr;function Ect(t,e){return e.rules.some(r=>bct(t,r))}em.shouldUseGroup=Ect;function bct(t,e){var r;return t[e.keyword]!==void 0||((r=e.definition.implements)===null||r===void 0?void 0:r.some(n=>t[n]!==void 0))}em.shouldUseRule=bct});var YT=b(as=>{"use strict";Object.defineProperty(as,"__esModule",{value:!0});as.reportTypeError=as.checkDataTypes=as.checkDataType=as.coerceAndCheckDataType=as.getJSONTypes=as.getSchemaTypes=as.DataType=void 0;var Dwr=Rfe(),Swr=Bfe(),Rwr=jT(),Ut=qt(),Cct=br(),Fv;(function(t){t[t.Correct=0]="Correct",t[t.Wrong=1]="Wrong"})(Fv||(as.DataType=Fv={}));function Bwr(t){let e=vct(t.type);if(e.includes("null")){if(t.nullable===!1)throw new Error("type: null contradicts nullable: false")}else{if(!e.length&&t.nullable!==void 0)throw new Error('"nullable" cannot be used without "type"');t.nullable===!0&&e.push("null")}return e}as.getSchemaTypes=Bwr;function vct(t){let e=Array.isArray(t)?t:t?[t]:[];if(e.every(Dwr.isJSONType))return e;throw new Error("type must be JSONType or JSONType[]: "+e.join(","))}as.getJSONTypes=vct;function xwr(t,e){let{gen:r,data:n,opts:i}=t,o=Twr(e,i.coerceTypes),s=e.length>0&&!(o.length===0&&e.length===1&&(0,Swr.schemaHasRulesForType)(t,e[0]));if(s){let a=Tfe(e,n,i.strictNumbers,Fv.Wrong);r.if(a,()=>{o.length?kwr(t,e,o):kfe(t)})}return s}as.coerceAndCheckDataType=xwr;var Ict=new Set(["string","number","integer","boolean","null"]);function Twr(t,e){return e?t.filter(r=>Ict.has(r)||e==="array"&&r==="array"):[]}function kwr(t,e,r){let{gen:n,data:i,opts:o}=t,s=n.let("dataType",(0,Ut._)`typeof ${i}`),a=n.let("coerced",(0,Ut._)`undefined`);o.coerceTypes==="array"&&n.if((0,Ut._)`${s} == 'object' && Array.isArray(${i}) && ${i}.length == 1`,()=>n.assign(i,(0,Ut._)`${i}[0]`).assign(s,(0,Ut._)`typeof ${i}`).if(Tfe(e,i,o.strictNumbers),()=>n.assign(a,i))),n.if((0,Ut._)`${a} !== undefined`);for(let u of r)(Ict.has(u)||u==="array"&&o.coerceTypes==="array")&&c(u);n.else(),kfe(t),n.endIf(),n.if((0,Ut._)`${a} !== undefined`,()=>{n.assign(i,a),Nwr(t,a)});function c(u){switch(u){case"string":n.elseIf((0,Ut._)`${s} == "number" || ${s} == "boolean"`).assign(a,(0,Ut._)`"" + ${i}`).elseIf((0,Ut._)`${i} === null`).assign(a,(0,Ut._)`""`);return;case"number":n.elseIf((0,Ut._)`${s} == "boolean" || ${i} === null
|
|
870
870
|
|| (${s} == "string" && ${i} && ${i} == +${i})`).assign(a,(0,Ut._)`+${i}`);return;case"integer":n.elseIf((0,Ut._)`${s} === "boolean" || ${i} === null
|
|
@@ -1057,7 +1057,7 @@ clio() {
|
|
|
1057
1057
|
`))}process.exit(1)}await $S(o,n,d);let y=(await bl(o,n)).data,C=f.filter(E=>E!=="saveAsDraft"&&E!=="resourceId");i.json?console.log(JSON.stringify({finalized:!0,resourceId:y.resourceId,reference:y.reference||null,status:y.status,fieldsUpdated:C},null,2)):(console.log(Y(`
|
|
1058
1058
|
\u2713 Supplier credit note finalized: ${y.reference||y.resourceId}`)),console.log(R(" Status:"),y.status),C.length>0&&console.log(R(" Updated:"),C.join(", ")))})(i)),r.command("attachments <resourceId>").description("List attachments for a supplier credit note (URLs for agent inspection)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((n,i)=>Q(async o=>{let a=(await bl(o,n)).data,u=(await ii(o,"supplier-credit-notes",n)).data;if(i.json)console.log(JSON.stringify({creditNoteResourceId:n,creditNoteReference:a.reference||null,attachments:u},null,2));else{if(u.length===0){console.log(`No attachments for supplier credit note ${a.reference||n}.`);return}console.log(R(`Attachments for ${a.reference||n}:
|
|
1059
1059
|
`));for(let d of u)console.log(` ${Se(d.resourceId)} ${d.fileName||"(unnamed)"}`),d.fileUrl&&console.log(` ${G(d.fileUrl)}`)}})(i)),e.command("bulk-upsert").description("Create or update supplier credit notes in bulk (max 500). Natural key: creditNoteReference. Returns a jobId \u2014 poll with `clio background-jobs get <jobId>`.").option("--input <file>","Read JSON body from file (or pipe via stdin with --input -)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(Q(async(n,i)=>{let o=Ce(i);o||(console.error('Error: --input <file> is required (JSON with { "supplierCreditNotes": [...] } or a bare array)'),process.exit(1));let s=o.supplierCreditNotes??o;Array.isArray(s)||(console.error('Error: expected { "supplierCreditNotes": [...] }'),process.exit(1)),s.length===0&&(console.error("Error: supplierCreditNotes array is empty."),process.exit(1)),s.length>500&&(console.error(`Error: max 500 per call (got ${s.length}). Split into batches.`),process.exit(1));let a=await r2(n,s);i.json?console.log(JSON.stringify(a.data,null,2)):(console.log(Y(`Bulk upsert started. Job ID: ${a.data.jobId}`)),console.log(Se(` Poll progress: clio background-jobs get ${a.data.jobId}`)))}))}Oe();l2();mt();Pt();var znt=[{key:"currencyCode",header:"Code"},{key:"currencyName",header:"Name"},{key:"currencySymbol",header:"Symbol"},{key:"baseCurrency",header:"Base"}];function Gnt(t){let e=t.command("currencies").description("Manage organization currencies");e.command("list").description("List enabled currencies for the organization").option("--api-key <key>","API key (overrides stored/env)").option("--format <type>","Output format: table, json, csv, yaml").option("--json","Output as JSON").action(Q(async(r,n)=>{let i=await jS(r),o={data:i.data,totalElements:i.data.length,totalPages:1,truncated:!1};Pe(o,znt,n,"Currencies")})),e.command("add <codes...>").description("Add currencies to the organization (e.g. clio currencies add EUR GBP)").option("--api-key <key>","API key (overrides stored/env)").option("--format <type>","Output format: table, json, csv, yaml").option("--json","Output as JSON").action((r,n)=>Q(async i=>{let o=r.map(a=>a.toUpperCase()),s=await i2(i,o);if(n.json||n.format){let a=Array.isArray(s.data)?s.data:[s.data],c={data:a,totalElements:a.length,totalPages:1,truncated:!1};Pe(c,znt,n,"Currencies")}else console.log(Y(`Added currencies: ${o.join(", ")}`))})(n))}l2();mt();Pt();Ft();Oe();xt();lr();var Gue=[{key:"resourceId",header:"ID",format:Be},{key:"rate",header:"Rate"},{key:"rateApplicableFrom",header:"From"},{key:"rateApplicableTo",header:"To"}];function Vnt(t){let e=t.command("currency-rates").description("Manage currency exchange rates");e.command("list <currencyCode>").description("List exchange rates for a currency").option("--limit <n>","Max results (default 100)",Ee).option("--offset <n>","Page number offset (0-indexed)",ze).option("--all","Fetch all pages").option("--max-rows <n>","Max rows for --all (default 1000)",Ee).option("--api-key <key>","API key (overrides stored/env)").option("--format <type>","Output format: table, json, csv, yaml").option("--json","Output as JSON").action((r,n)=>Q(async i=>{let o=r.toUpperCase(),s=await je(n,a=>o2(i,o,a),{label:`Fetching ${o} rates`});Pe(s,Gue,n,`${o} Rates`)})(n)),e.command("add <currencyCode>").description("Add an exchange rate for a currency").option("--rate <number>","Exchange rate",parseFloat).option("--from <YYYY-MM-DD>","Rate applicable from date").option("--to <YYYY-MM-DD>","Rate applicable to date (optional)").option("--api-key <key>","API key (overrides stored/env)").option("--format <type>","Output format: table, json, csv, yaml").option("--json","Output as JSON").action((r,n)=>Q(async i=>{Fe(n,[{flag:"--rate",key:"rate"},{flag:"--from",key:"from"}]);let o=r.toUpperCase(),s={rate:n.rate,rateApplicableFrom:n.from};n.to&&(s.rateApplicableTo=n.to);let a=await s2(i,o,s);if(n.json||n.format){let c={data:[a.data],totalElements:1,totalPages:1,truncated:!1};Pe(c,Gue,n,`${o} Rates`)}else console.log(Y(`Rate added for ${o}: ${n.rate} (from ${n.from})`))})(n)),e.command("update <currencyCode> <rateResourceId>").description("Update an exchange rate").option("--rate <number>","Exchange rate",parseFloat).option("--from <YYYY-MM-DD>","Rate applicable from date").option("--to <YYYY-MM-DD>","Rate applicable to date (optional)").option("--api-key <key>","API key (overrides stored/env)").option("--format <type>","Output format: table, json, csv, yaml").option("--json","Output as JSON").action((r,n,i)=>Q(async o=>{Fe(i,[{flag:"--rate",key:"rate"},{flag:"--from",key:"from"}]);let s=r.toUpperCase(),a={rate:i.rate,rateApplicableFrom:i.from};i.to&&(a.rateApplicableTo=i.to);let c=await a2(o,s,n,a);if(i.json||i.format){let u={data:[c.data],totalElements:1,totalPages:1,truncated:!1};Pe(u,Gue,i,`${s} Rates`)}else console.log(Y(`Rate updated for ${s}: ${i.rate}`))})(i)),e.command("bulk-upsert").description("Create exchange rates in bulk (max 500). Auto-enables currencies not yet in the org.").option("--input <file>","Read JSON body from file (or pipe via stdin with --input -)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(Q(async(r,n)=>{let i=Ce(n);i||(console.error('Error: --input <file> is required (JSON with { "rates": [...] })'),process.exit(1));let o=i.rates??i;Array.isArray(o)||(console.error('Error: expected { "rates": [...] } or a JSON array'),process.exit(1)),o.length>500&&(console.error(`Error: max 500 rates per call (got ${o.length}). Split into batches.`),process.exit(1));let s=await c2(r,o);if(n.json)console.log(JSON.stringify(s.data,null,2));else{let a=s.data.resourceIds??[];console.log(Y(`${a.length} rate(s) upserted.`)),a.forEach(c=>console.log(` ${c}`))}}))}Hh();mt();Pt();Ft();Oe();import{readFileSync as rCr}from"node:fs";import{basename as Jnt,extname as nCr,resolve as iCr}from"node:path";var oCr=[{key:"resourceId",header:"ID",format:Be},{key:"fileName",header:"File Name"}],uf=["invoices","bills","journals","scheduled_journals","customer-credit-notes","supplier-credit-notes","sale-quotes","sale-orders","purchase-requests","purchase-orders"],sCr={".pdf":"application/pdf",".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp",".svg":"image/svg+xml",".csv":"text/csv",".xls":"application/vnd.ms-excel",".xlsx":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"};function Wnt(t){let e=t.command("attachments").description("Manage transaction attachments");e.command("list").description("List attachments for a transaction").requiredOption("--type <type>",`Transaction type (${uf.join(", ")})`).requiredOption("--id <resourceId>","Transaction resourceId").option("--api-key <key>","API key").option("--format <type>","Output format: table, json, csv, yaml").option("--json","Output as JSON").action(Q(async(r,n)=>{let i=n.type;uf.includes(i)||(console.error(ie(`Invalid type. Use one of: ${uf.join(", ")}`)),process.exit(1));let o=await ii(r,i,n.id),s=o.data??[],a={data:s,totalElements:o.totalElements??s.length,totalPages:o.totalPages??1,truncated:o.truncated??!1};Pe(a,oCr,n,"Attachments")})),e.command("add").description("Add an attachment to a transaction (file upload or URL download)").requiredOption("--type <type>",`Transaction type (${uf.join(", ")})`).requiredOption("--id <resourceId>","Transaction resourceId").option("--file <path>","Local file path (PDF, PNG, JPG, etc.)").option("--url <url>","Download file from URL and attach").option("--attachment-id <id>","Link existing attachment by ID").option("--api-key <key>","API key").option("--json","Output as JSON").action(Q(async(r,n)=>{let i=n.type;uf.includes(i)||(console.error(ie(`Invalid type. Use one of: ${uf.join(", ")}`)),process.exit(1)),!n.attachmentId&&!n.url&&!n.file&&(console.error(ie("Provide --file, --url, or --attachment-id")),process.exit(1)),n.attachmentId&&SH.includes(i)&&(console.error(ie(`link-by-id (--attachment-id) is not supported for order documents (${i}). Use --file or --url instead.`)),process.exit(1));let o,s;if(n.file){let c=iCr(n.file),u=nCr(c).toLowerCase(),d=sCr[u]??"application/octet-stream",f=rCr(c);o=new Blob([f],{type:d}),s=Jnt(c)}else if(n.url){let c=await fetch(n.url);c.ok||(console.error(ie(`Failed to download: ${c.status} ${c.statusText}`)),process.exit(1));let u=await c.arrayBuffer(),d=c.headers.get("content-type")??"application/octet-stream";o=new Blob([u],{type:d});let f=new URL(n.url).pathname;s=Jnt(f)||"attachment"}let a=await RH(r,{businessTransactionType:i,businessTransactionResourceId:n.id,file:o,fileName:s,attachmentId:n.attachmentId});n.json?console.log(JSON.stringify(a,null,2)):console.log(Y("Attachment added."))})),e.command("delete").description("Delete an attachment from a transaction").requiredOption("--type <type>",`Transaction type (${uf.join(", ")})`).requiredOption("--id <resourceId>","Transaction resourceId").argument("<attachmentResourceId>","Attachment resourceId to delete").option("--api-key <key>","API key").option("--json","Output as JSON").action((r,n)=>{let i=n.type;return uf.includes(i)||(console.error(ie(`Invalid type. Use one of: ${uf.join(", ")}`)),process.exit(1)),Q(async o=>{let s=await BH(o,i,n.id,r);n.json?console.log(JSON.stringify(s,null,2)):console.log(Y("Attachment deleted."))})(n)})}Oe();rD();dc();mt();xt();lr();Pt();Ft();ur();var Znt=[{key:"resourceId",header:"ID",format:Be},{key:"name",header:"Name"},{key:"taxRate",header:"Rate (%)"},{key:"taxTypeCode",header:"Tax Type"}],aCr=[{key:"code",header:"Code"},{key:"name",header:"Name"}];function Knt(t){let e=t.command("tax-profiles").description("Manage tax profiles and tax types");e.command("list").description("List tax profiles").option("--limit <n>","Max results (default 100)",Ee).option("--offset <n>","Page number offset (0-indexed)",ze).option("--all","Fetch all pages").option("--max-rows <n>","Max rows for --all (default 1000)",Ee).option("--api-key <key>","API key (overrides stored/env)").option("--format <type>","Output format: table, json, csv, yaml").option("--json","Output as JSON").action(Q(async(r,n)=>{let i=await je(n,o=>Fb(r,o),{label:"Fetching tax profiles"});Pe(i,Znt,n,"Tax Profiles")})),e.command("types").description("List available tax types (GST, VAT, WHT, etc.)").option("--limit <n>","Max results (default 100)",Ee).option("--offset <n>","Page number offset (0-indexed)",ze).option("--all","Fetch all pages").option("--max-rows <n>","Max rows for --all (default 1000)",Ee).option("--api-key <key>","API key (overrides stored/env)").option("--format <type>","Output format: table, json, csv, yaml").option("--json","Output as JSON").action(Q(async(r,n)=>{let i=await je(n,o=>wL(r,o),{label:"Fetching tax types"});Pe(i,aCr,n,"Tax Types")})),e.command("get <resourceId>").description("Get a tax profile by resourceId").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>Q(async i=>{let s=(await DL(i,r)).data;n.json?console.log(JSON.stringify(s,null,2)):(console.log(R("Name:"),s.name),console.log(R("ID:"),s.resourceId),console.log(R("Rate:"),`${s.taxRate}%`),console.log(R("Tax Type:"),s.taxTypeCode))})(n)),Ve({parent:e,fields:fS,defaults:pS,fetcher:Qb,columns:Znt,label:"Searching tax profiles"}),e.command("update <resourceId>").description("Update a tax profile").option("--name <name>","New name").option("--rate <n>","New tax rate as percentage",Ee).option("--tax-type-code <code>","New tax type code").option("--status <status>","New status (ACTIVE, INACTIVE)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>Q(async i=>{let o={};n.name!==void 0&&(o.name=n.name),n.rate!==void 0&&(o.taxRate=n.rate),n.taxTypeCode!==void 0&&(o.taxTypeCode=n.taxTypeCode),n.status!==void 0&&(o.status=n.status);let s=await SL(i,r,o);n.json?console.log(JSON.stringify(s.data,null,2)):console.log(Y(`Tax profile updated: ${s.data.name}`))})(n)),e.command("wht-codes").description("List withholding tax codes").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(Q(async(r,n)=>{let i=await RL(r);if(n.json)console.log(JSON.stringify(i.data,null,2));else{if(i.data.length===0){console.log("No withholding tax codes found.");return}console.log(R(`Withholding Tax Codes (${i.data.length}):
|
|
1060
|
-
`));for(let o of i.data)console.log(` ${Se(o.code??o.resourceId??"?")} ${o.description??""} ${G(o.countryCode??"")}`)}})),e.command("create").description("Create a new tax profile").option("--name <name>",'Tax profile name (e.g., "GST 9%")').option("--rate <n>","Tax rate as percentage (e.g., 9)",Ee).option("--tax-type-code <code>","Tax type code (from tax-profiles types)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(Q(async(r,n)=>{Fe(n,[{flag:"--name",key:"name"},{flag:"--rate",key:"rate"},{flag:"--tax-type-code",key:"taxTypeCode"}]);let i=await sM(r,n.name);if(i){n.json?console.log(JSON.stringify({_guard:"duplicate_skipped",existing:i},null,2)):console.log(ke(`Tax profile "${n.name}" already exists (${i.resourceId}).`));return}let o=await _L(r,{name:n.name,taxRate:n.rate,taxTypeCode:n.taxTypeCode});n.json?console.log(JSON.stringify(o.data,null,2)):(console.log(Y(`Tax profile created: ${n.name} (${n.rate}%)`)),console.log(R("ID:"),o.data.resourceId))}))}Oe();PL();NY();dc();mt();xt();lr();Pt();Ft();ur();var Xnt=[{key:"resourceId",header:"ID",format:Be},{key:"name",header:"Name"},{key:"isDefault",header:"Default"},{key:"expenseAccountResourceId",header:"Expense Acct",format:Be}];function eit(t){let e=t.command("claim-types").description("Manage employee-expense claim types (expense categories)");e.command("list").description("List claim types").option("--limit <n>","Max results (default 100)",Ee).option("--offset <n>","Page number offset (0-indexed)",ze).option("--all","Fetch all pages").option("--max-rows <n>","Max rows for --all (default 1000)",Ee).option("--api-key <key>","API key (overrides stored/env)").option("--format <type>","Output format: table, json, csv, yaml").option("--json","Output as JSON").action(Q(async(r,n)=>{let i=await je(n,o=>OL(r,o),{label:"Fetching claim types"});Pe(i,Xnt,n,"Claim Types")})),e.command("get <resourceId>").description("Get a claim type by resourceId").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>Q(async i=>{let s=(await FL(i,r)).data;n.json?console.log(JSON.stringify(s,null,2)):(console.log(R("Name:"),s.name),console.log(R("ID:"),s.resourceId),console.log(R("Default:"),s.isDefault),s.expenseAccount&&console.log(R("Expense Account:"),`${s.expenseAccount.code} ${s.expenseAccount.name}`),s.taxProfile&&console.log(R("Tax Profile:"),s.taxProfile.name))})(n)),Ve({parent:e,fields:KD,defaults:XD,fetcher:Mb,columns:Xnt,label:"Searching claim types"}),e.command("create").description("Create a claim type").option("--name <name>","Claim type name (unique per org)").option("--expense-account <id>","Default expense account resourceId").option("--tax-profile <id>","Default tax profile resourceId").option("--classifier-config <json>","Magic OCR classifier defaults (JSON string)").option("--default","Make org default").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(Q(async(r,n)=>{Fe(n,[{flag:"--name",key:"name"}]);let i=await cM(r,n.name);if(i){n.json?console.log(JSON.stringify({_guard:"duplicate_skipped",existing:i},null,2)):console.log(ke(`Claim type "${n.name}" already exists (${i.resourceId}).`));return}let o=await QL(r,{name:n.name,expenseAccountResourceId:n.expenseAccount,taxProfileResourceId:n.taxProfile,classifierConfig:n.classifierConfig,isDefault:n.default});n.json?console.log(JSON.stringify(o.data,null,2)):(console.log(Y(`Claim type created: ${n.name}`)),console.log(R("ID:"),o.data.resourceId))})),e.command("update <resourceId>").description("Update a claim type").option("--name <name>","New name").option("--expense-account <id>","Default expense account resourceId").option("--tax-profile <id>","Default tax profile resourceId").option("--classifier-config <json>","Classifier defaults (JSON string)").option("--default","Make org default").option("--clear <fields>","Comma-separated optional fields to NULL (expenseAccountResourceId,taxProfileResourceId,classifierConfig)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>Q(async i=>{let o={};n.name!==void 0&&(o.name=n.name),n.expenseAccount!==void 0&&(o.expenseAccountResourceId=n.expenseAccount),n.taxProfile!==void 0&&(o.taxProfileResourceId=n.taxProfile),n.classifierConfig!==void 0&&(o.classifierConfig=n.classifierConfig),n.default!==void 0&&(o.isDefault=n.default),Object.assign(o,oy(Co(n.clear),iD));let s=await LL(i,r,o);n.json?console.log(JSON.stringify(s.data,null,2)):console.log(Y(`Claim type updated: ${s.data.name}`))})(n)),e.command("delete <resourceId>").description("Soft-delete a claim type").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>Q(async i=>{await ML(i,r),n.json?console.log(JSON.stringify({deleted:!0,resourceId:r})):console.log(Y(`Claim type deleted: ${r}`))})(n))}Oe();aD();NY();dc();mt();xt();lr();Pt();Ft();ur();var tit=[{key:"resourceId",header:"ID",format:Be},{key:"name",header:"Name"},{key:"isDefault",header:"Default"},{key:"taxMode",header:"Tax Mode"},{key:"employeeBalanceAccountResourceId",header:"Balance Acct",format:Be}];function rit(t){let e={};return t.name!==void 0&&(e.name=t.name),t.approver!==void 0&&(e.approverUserResourceId=t.approver),t.visibleClaimTypes!==void 0&&(e.visibleClaimTypeIds=Co(t.visibleClaimTypes)),t.visibleTaxProfiles!==void 0&&(e.visibleTaxProfileIds=Co(t.visibleTaxProfiles)),t.visibleClassifiers!==void 0&&(e.visibleClassifierIds=Co(t.visibleClassifiers)),t.visibleVendors!==void 0&&(e.visibleVendorResourceIds=Co(t.visibleVendors)),t.allowedCurrencies!==void 0&&(e.allowedCurrencies=Co(t.allowedCurrencies)),t.minAmount!==void 0&&(e.minClaimAmount=t.minAmount),t.maxAmount!==void 0&&(e.maxClaimAmount=t.maxAmount),t.maxPerPeriod!==void 0&&(e.maxPerPeriodAmount=t.maxPerPeriod),t.perPeriod!==void 0&&(e.perPeriod=t.perPeriod),t.balanceAccount!==void 0&&(e.employeeBalanceAccountResourceId=t.balanceAccount),t.taxMode!==void 0&&(e.taxMode=t.taxMode),t.default!==void 0&&(e.isDefault=t.default),e}function nit(t){return t.option("--approver <id>","Default approver user resourceId").option("--visible-claim-types <ids>","Allowed claim type IDs (comma-separated)").option("--visible-tax-profiles <ids>","Allowed tax profile IDs (comma-separated)").option("--visible-classifiers <ids>","Allowed classifier IDs (comma-separated)").option("--visible-vendors <ids>","Allowed vendor contact IDs (comma-separated)").option("--allowed-currencies <codes>","Allowed ISO currency codes (comma-separated)").option("--min-amount <n>","Min claim total",ar).option("--max-amount <n>","Max claim total",ar).option("--max-per-period <n>","Per-period spend cap (requires --per-period)",ar).option("--per-period <window>","DAILY | WEEKLY | MONTHLY | QUARTERLY | YEARLY").option("--balance-account <id>","Employee balance (CURRENT_LIABILITY) account resourceId").option("--tax-mode <mode>","NO_TAX | INCLUSIVE (EXCLUSIVE rejected)").option("--default","Make org default")}function iit(t){let e=t.command("claim-profiles").description("Manage employee-expense claim profiles (per-employee policy bundles)");e.command("list").description("List claim profiles").option("--limit <n>","Max results (default 100)",Ee).option("--offset <n>","Page number offset (0-indexed)",ze).option("--all","Fetch all pages").option("--max-rows <n>","Max rows for --all (default 1000)",Ee).option("--api-key <key>","API key (overrides stored/env)").option("--format <type>","Output format: table, json, csv, yaml").option("--json","Output as JSON").action(Q(async(r,n)=>{let i=await je(n,o=>UL(r,o),{label:"Fetching claim profiles"});Pe(i,tit,n,"Claim Profiles")})),e.command("get <resourceId>").description("Get a claim profile by resourceId").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>Q(async i=>{let s=(await $L(i,r)).data;n.json?console.log(JSON.stringify(s,null,2)):(console.log(R("Name:"),s.name),console.log(R("ID:"),s.resourceId),console.log(R("Default:"),s.isDefault),s.taxMode&&console.log(R("Tax mode:"),s.taxMode),s.employeeBalanceAccount&&console.log(R("Balance account:"),`${s.employeeBalanceAccount.code} ${s.employeeBalanceAccount.name}`))})(n)),Ve({parent:e,fields:eS,defaults:tS,fetcher:Pb,columns:tit,label:"Searching claim profiles"}),nit(e.command("create").description("Create a claim profile").option("--name <name>","Profile name (unique per org)")).option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(Q(async(r,n)=>{Fe(n,[{flag:"--name",key:"name"}]);let i=await lM(r,n.name);if(i){n.json?console.log(JSON.stringify({_guard:"duplicate_skipped",existing:i},null,2)):console.log(ke(`Claim profile "${n.name}" already exists (${i.resourceId}).`));return}let o=await qL(r,rit(n));n.json?console.log(JSON.stringify(o.data,null,2)):(console.log(Y(`Claim profile created: ${n.name}`)),console.log(R("ID:"),o.data.resourceId))})),nit(e.command("update <resourceId>").description("Update a claim profile").option("--name <name>","New name")).option("--clear <fields>","Comma-separated optional fields to NULL (e.g. approverUserResourceId,perPeriod,taxMode)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>Q(async i=>{let o=rit(n);Object.assign(o,oy(Co(n.clear),sD));let s=await jL(i,r,o);n.json?console.log(JSON.stringify(s.data,null,2)):console.log(Y(`Claim profile updated: ${s.data.name}`))})(n)),e.command("delete <resourceId>").description("Soft-delete a claim profile").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>Q(async i=>{await YL(i,r),n.json?console.log(JSON.stringify({deleted:!0,resourceId:r})):console.log(Y(`Claim profile deleted: ${r}`))})(n))}Oe();uD();dc();mt();xt();lr();Pt();Ft();ur();var oit=[{key:"resourceId",header:"ID",format:Be},{key:"name",header:"Name"},{key:"outerAxis",header:"Outer"},{key:"innerAxis",header:"Inner"},{key:"isDefault",header:"Default"}];function sit(t){let e=t.command("posting-rules").description("Manage claim posting rules (how approved claims group into journals at conversion)");e.command("list").description("List posting rules").option("--limit <n>","Max results (default 100)",Ee).option("--offset <n>","Page number offset (0-indexed)",ze).option("--all","Fetch all pages").option("--max-rows <n>","Max rows for --all (default 1000)",Ee).option("--api-key <key>","API key (overrides stored/env)").option("--format <type>","Output format: table, json, csv, yaml").option("--json","Output as JSON").action(Q(async(r,n)=>{let i=await je(n,o=>HL(r,o),{label:"Fetching posting rules"});Pe(i,oit,n,"Posting Rules")})),e.command("get <resourceId>").description("Get a posting rule by resourceId").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>Q(async i=>{let s=(await zL(i,r)).data;n.json?console.log(JSON.stringify(s,null,2)):(console.log(R("Name:"),s.name),console.log(R("ID:"),s.resourceId),console.log(R("Outer axis:"),s.outerAxis),console.log(R("Inner axis:"),s.innerAxis),console.log(R("Line template:"),s.lineDescriptionTemplate),console.log(R("Default:"),s.isDefault))})(n)),Ve({parent:e,fields:rS,defaults:nS,fetcher:Ub,columns:oit,label:"Searching posting rules"}),e.command("create").description("Create a posting rule").option("--name <name>","Rule name (unique per org)").option("--outer-axis <axis>","PER_EMPLOYEE | PER_VENDOR | PER_PAIR | ONE_BATCH | PER_CLAIM").option("--inner-axis <axis>","RAW | BY_CT_TP_NC | BY_CT_TP_NC_EMPLOYEE | BY_CT_TP_NC_VENDOR").option("--line-template <tpl>",'Handlebars line template, e.g. "{employeeName} - {claimType}"').option("--journal-reference-template <tpl>","Optional journal-header reference template").option("--default-bank-account <id>","Default reimbursement bank account resourceId").option("--default-include-payout","Create reimbursement DCE by default").option("--default","Make org default rule").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(Q(async(r,n)=>{Fe(n,[{flag:"--name",key:"name"},{flag:"--outer-axis",key:"outerAxis"},{flag:"--inner-axis",key:"innerAxis"},{flag:"--line-template",key:"lineTemplate"}]);let i=await uM(r,n.name);if(i){n.json?console.log(JSON.stringify({_guard:"duplicate_skipped",existing:i},null,2)):console.log(ke(`Posting rule "${n.name}" already exists (${i.resourceId}).`));return}let o=await GL(r,{name:n.name,outerAxis:n.outerAxis,innerAxis:n.innerAxis,lineDescriptionTemplate:n.lineTemplate,journalReferenceTemplate:n.journalReferenceTemplate,defaultBankAccountResourceId:n.defaultBankAccount,defaultIncludeReimbursementPayout:n.defaultIncludePayout,isDefault:n.default});n.json?console.log(JSON.stringify(o.data,null,2)):(console.log(Y(`Posting rule created: ${n.name}`)),console.log(R("ID:"),o.data.resourceId))})),e.command("update <resourceId>").description("Update a posting rule").option("--name <name>","New name").option("--outer-axis <axis>","Outer grouping axis").option("--inner-axis <axis>","Inner line-aggregation axis").option("--line-template <tpl>","Handlebars line template").option("--journal-reference-template <tpl>","Journal-header reference template").option("--default-bank-account <id>","Default reimbursement bank account resourceId").option("--default-include-payout <bool>","Create reimbursement DCE by default (true/false)").option("--default","Make org default rule").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>Q(async i=>{let o={};n.name!==void 0&&(o.name=n.name),n.outerAxis!==void 0&&(o.outerAxis=n.outerAxis),n.innerAxis!==void 0&&(o.innerAxis=n.innerAxis),n.lineTemplate!==void 0&&(o.lineDescriptionTemplate=n.lineTemplate),n.journalReferenceTemplate!==void 0&&(o.journalReferenceTemplate=n.journalReferenceTemplate),n.defaultBankAccount!==void 0&&(o.defaultBankAccountResourceId=n.defaultBankAccount),n.defaultIncludePayout!==void 0&&(o.defaultIncludeReimbursementPayout=n.defaultIncludePayout==="true"),n.default!==void 0&&(o.isDefault=n.default);let s=await VL(i,r,o);n.json?console.log(JSON.stringify(s.data,null,2)):console.log(Y(`Posting rule updated: ${s.data.name}`))})(n)),e.command("delete <resourceId>").description("Delete a posting rule (the org default cannot be deleted while default)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>Q(async i=>{await JL(i,r),n.json?console.log(JSON.stringify({deleted:!0,resourceId:r})):console.log(Y(`Posting rule deleted: ${r}`))})(n))}Oe();HM();mue();Aue();l_();xH();mt();xt();Ft();xf();ur();import{randomUUID as cCr}from"node:crypto";import{readFileSync as ait,statSync as lCr}from"node:fs";import{basename as uCr,extname as dCr,resolve as cit}from"node:path";var fCr=[{key:"resourceId",header:"ID",format:Be},{key:"reference",header:"Reference"},{key:"status",header:"Status"},{key:"employeeResourceId",header:"Employee",format:Be},{key:"totalAmount",header:"Amount"},{key:"currencyCode",header:"Ccy"}];function lit(t){let e=t.command("claims").description("Employee-expense claims: search, edit drafts, lifecycle, bulk actions");Ve({parent:e,fields:VD,defaults:JD,fetcher:SM,columns:fCr,label:"Searching claims"}),e.command("get <resourceId>").description("Get a claim by resourceId").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((s,a)=>Q(async c=>{let d=(await RM(c,s)).data;a.json?console.log(JSON.stringify(d,null,2)):(console.log(R("Reference:"),d.reference??"\u2014"),console.log(R("ID:"),d.resourceId),console.log(R("Status:"),d.status),console.log(R("Total:"),`${d.totalAmount??0} ${d.currencyCode??""}`),console.log(R("Lines:"),(d.claimItems??[]).length))})(a)),e.command("create").description("Create a claim directly (bare create). Vendor is EITHER --contact OR --vendor-name. --items / --custom-fields take a JSON array string.").requiredOption("--value-date <date>","Business-transaction date (YYYY-MM-DD)").requiredOption("--currency <code>","Claim currency (ISO 4217)").option("--reference <ref>","User reference").option("--employee <id>","Employee resourceId the claim is filed for").option("--contact <id>","Vendor contact resourceId").option("--vendor-name <name>","Free-text vendor name").option("--currency-symbol <symbol>","Currency symbol override").option("--internal-notes <text>","Internal notes").option("--claim-profile <id>","Claim profile resourceId").option("--approver <id>","Approver user resourceId").option("--tags <list>","Header tags (comma-separated)").option("--items <json>","Line items as a JSON array").option("--custom-fields <json>","Custom field values as a JSON array").option("--submit","Validate + submit in one call (saveAsDraft=false). Requires --reference (else 422 CLAIM_REFERENCE_REQUIRED_AT_SUBMIT)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(s=>Q(async a=>{let c={valueDate:s.valueDate,currencyCode:s.currency};s.reference!==void 0&&(c.reference=s.reference),s.employee!==void 0&&(c.employeeResourceId=s.employee),s.contact!==void 0&&(c.contactResourceId=s.contact),s.vendorName!==void 0&&(c.vendorName=s.vendorName),s.currencySymbol!==void 0&&(c.currencySymbol=s.currencySymbol),s.internalNotes!==void 0&&(c.internalNotes=s.internalNotes),s.claimProfile!==void 0&&(c.claimProfileResourceId=s.claimProfile),s.approver!==void 0&&(c.approverUserResourceId=s.approver),s.tags!==void 0&&(c.tags=Co(s.tags)??[]),s.items!==void 0&&(c.claimItems=hu(s.items,"--items")),s.customFields!==void 0&&(c.customFields=hu(s.customFields,"--custom-fields")),s.submit&&(c.saveAsDraft=!1);let u=await BM(a,c);s.json?console.log(JSON.stringify(u.data,null,2)):console.log(Y(`Claim created: ${u.data.reference??u.data.resourceId} (${u.data.status})`))})(s)),e.command("update <resourceId>").description("Update a DRAFT claim (partial). --items / --custom-fields take a JSON array string.").option("--reference <ref>","User reference").option("--value-date <date>","Business-transaction date (YYYY-MM-DD)").option("--employee <id>","Employee resourceId").option("--contact <id>","Vendor contact resourceId").option("--vendor-name <name>","Free-text vendor name").option("--currency <code>","Claim currency (ISO 4217)").option("--internal-notes <text>","Internal notes").option("--claim-profile <id>","Claim profile resourceId").option("--approver <id>","Approver user resourceId").option("--tags <list>","Header tags (comma-separated)").option("--items <json>","Line items as a JSON array (REPLACES all lines)").option("--custom-fields <json>","Custom field values as a JSON array").option("--submit","Validate + submit in one call (saveAsDraft=false). Requires --reference (else 422 CLAIM_REFERENCE_REQUIRED_AT_SUBMIT)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((s,a)=>Q(async c=>{let u={};a.reference!==void 0&&(u.reference=a.reference),a.valueDate!==void 0&&(u.valueDate=a.valueDate),a.employee!==void 0&&(u.employeeResourceId=a.employee),a.contact!==void 0&&(u.contactResourceId=a.contact),a.vendorName!==void 0&&(u.vendorName=a.vendorName),a.currency!==void 0&&(u.currencyCode=a.currency),a.internalNotes!==void 0&&(u.internalNotes=a.internalNotes),a.claimProfile!==void 0&&(u.claimProfileResourceId=a.claimProfile),a.approver!==void 0&&(u.approverUserResourceId=a.approver),a.tags!==void 0&&(u.tags=Co(a.tags)??[]),a.items!==void 0&&(u.claimItems=hu(a.items,"--items")),a.customFields!==void 0&&(u.customFields=hu(a.customFields,"--custom-fields")),a.submit&&(u.saveAsDraft=!1);let d=await xM(c,s,u);a.json?console.log(JSON.stringify(d.data,null,2)):console.log(Y(`Claim updated: ${d.data.reference??d.data.resourceId} (${d.data.status})`))})(a)),e.command("delete <resourceId>").description("Delete a claim (only DRAFT / REJECTED / CANCELLED)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((s,a)=>Q(async c=>{await TM(c,s),a.json?console.log(JSON.stringify({deleted:!0,resourceId:s})):console.log(Y(`Claim deleted: ${s}`))})(a)),e.command("delete-attachment <resourceId> <attachmentResourceId>").description("Remove one attachment from a claim").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((s,a,c)=>Q(async u=>{await kM(u,s,a),c.json?console.log(JSON.stringify({deleted:!0,resourceId:s,attachmentResourceId:a})):console.log(Y(`Attachment removed from claim ${s}`))})(c));let r=[["submit",NM,"Submit a DRAFT claim for approval"],["approve",OM,"Approve a SUBMITTED claim"],["unpost",LM,"Unpost a CONVERTED claim (reverse conversion)"]];for(let[s,a,c]of r)e.command(`${s} <resourceId>`).description(c).option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((u,d)=>Q(async f=>{let p=await a(f,u);d.json?console.log(JSON.stringify(p,null,2)):console.log(Y(`Claim ${s}: ${u}${p.data?.status?` (${p.data.status})`:""}`))})(d));let n=[["reject",FM,"Reject a SUBMITTED/APPROVED claim"],["cancel",QM,"Cancel a DRAFT/SUBMITTED claim"]];for(let[s,a,c]of n)e.command(`${s} <resourceId>`).description(c).option("--reason <text>","Reason (1-1000 chars), required").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((u,d)=>Q(async f=>{Fe(d,[{flag:"--reason",key:"reason"}]);let p=await a(f,u,d.reason);d.json?console.log(JSON.stringify(p,null,2)):console.log(Y(`Claim ${s}ed: ${u}${p.data?.status?` (${p.data.status})`:""}`))})(d));let i=[["bulk-submit",MM,"Bulk-submit DRAFT claims (async)"],["bulk-approve",PM,"Bulk-approve SUBMITTED claims (async)"],["bulk-delete",UM,"Bulk-delete DRAFT/REJECTED/CANCELLED claims (async)"]];for(let[s,a,c]of i)e.command(s).description(`${c}. Poll with: clio background-jobs search`).option("--ids <list>","Claim resourceIds (comma-separated, 1-500)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(Q(async(u,d)=>{Fe(d,[{flag:"--ids",key:"ids"}]);let f=await a(u,Co(d.ids)??[]);d.json?console.log(JSON.stringify(f,null,2)):console.log(Y(`Queued ${s} \u2014 jobId ${f.data?.jobId??"?"}`))}));let o=[["bulk-reject",$M,"Bulk-reject claims (async)"],["bulk-cancel",qM,"Bulk-cancel claims (async)"]];for(let[s,a,c]of o)e.command(s).description(`${c}. Poll with: clio background-jobs search`).option("--ids <list>","Claim resourceIds (comma-separated, 1-500)").option("--reason <text>","Shared reason (1-1000 chars), required").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(Q(async(u,d)=>{Fe(d,[{flag:"--ids",key:"ids"},{flag:"--reason",key:"reason"}]);let f=await a(u,Co(d.ids)??[],d.reason);d.json?console.log(JSON.stringify(f,null,2)):console.log(Y(`Queued ${s} \u2014 jobId ${f.data?.jobId??"?"}`))}));e.command("tracking-tags").description("List claim tracking-tag values (picker)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(Q(async(s,a)=>{let c=await jM(s);if(a.json)console.log(JSON.stringify(c,null,2));else{console.log(R(`Tracking tags (${c.length}):`));for(let u of c)console.log(` ${typeof u=="string"?u:JSON.stringify(u)}`)}})),e.command("custom-field-values").description("List claim custom-field values (picker)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(Q(async(s,a)=>{let c=await YM(s);a.json?console.log(JSON.stringify(c,null,2)):console.log(ke(c.length===0?"No custom field values.":`${c.length} custom field value(s).`))})),e.command("preview-conversion").description("Preview the journals an APPROVED claim batch would produce (no write)").option("--ids <list>","APPROVED claim resourceIds (comma-separated)").option("--posting-rule <id>","Posting rule resourceId (default: org default)").option("--payout-flow <flow>","POST | POST_AND_RECORD").option("--include-payout","Include reimbursement DCE lines").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(Q(async(s,a)=>{if(Fe(a,[{flag:"--ids",key:"ids"}]),a.payoutFlow!==void 0&&!Ux.includes(a.payoutFlow))throw new Error(`--payout-flow must be one of: ${Ux.join(", ")}`);let c=await TH(s,{claimResourceIds:Co(a.ids)??[],postingRuleResourceId:a.postingRule,payoutFlow:a.payoutFlow,includeReimbursementPayout:a.includePayout});console.log(JSON.stringify(c.data,null,2))})),e.command("convert").description("Convert an APPROVED claim batch into journals (atomic). Preview first.").option("--ids <list>","APPROVED claim resourceIds (comma-separated)").option("--value-date <date>","Journal value date (YYYY-MM-DD), required").option("--posting-rule <id>","Posting rule resourceId (default: org default)").option("--include-payout","Create books-only reimbursement DCEs").option("--bank-account <id>","Override reimbursement bank account").option("--idempotency-key <key>","Retry-dedup token (auto-generated if omitted)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(Q(async(s,a)=>{Fe(a,[{flag:"--ids",key:"ids"},{flag:"--value-date",key:"valueDate"}]);let c=await kH(s,{claimResourceIds:Co(a.ids)??[],valueDate:a.valueDate,postingRuleResourceId:a.postingRule,includeReimbursementPayout:a.includePayout,bankAccountResourceIdOverride:a.bankAccount,idempotencyKey:a.idempotencyKey||cCr()});a.json?console.log(JSON.stringify(c.data,null,2)):console.log(Y("Claims converted to journals."))})),e.command("record-payout").description("Record a books-only employee payout (reimbursement / advance)").option("--employee <id>","Employee resourceId").option("--amount <n>","Payout amount (> 0)",ar).option("--payment-account <id>","Bank/cash account the DCE credits").option("--value-date <date>","Value date (YYYY-MM-DD)").option("--payout-for <type>","REIMBURSEMENT | ADVANCE (default ADVANCE)").option("--currency <code>","Settle currency (ISO 4217)").option("--reference <ref>","Payout reference (auto-generated if omitted)").option("--description <text>","DCE line description").option("--internal-notes <text>","Internal notes").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(Q(async(s,a)=>{Fe(a,[{flag:"--employee",key:"employee"},{flag:"--amount",key:"amount"},{flag:"--payment-account",key:"paymentAccount"},{flag:"--value-date",key:"valueDate"}]);let c=await NH(s,{employeeResourceId:a.employee,amount:a.amount,paymentAccountResourceId:a.paymentAccount,valueDate:a.valueDate,payoutFor:a.payoutFor,currencyCode:a.currency,reference:a.reference||Pa("EP"),description:a.description,internalNotes:a.internalNotes});a.json?console.log(JSON.stringify(c.data,null,2)):console.log(Y(`Payout recorded: ${c.data.resourceId}`))})),Ve({parent:e,commandName:"payouts",fields:WD,defaults:ZD,fetcher:OH,columns:[{key:"resourceId",header:"ID",format:Be},{key:"reference",header:"Reference"},{key:"employeeResourceId",header:"Employee",format:Be},{key:"amount",header:"Amount"},{key:"payoutType",header:"Type"}],label:"Searching employee payouts"}),e.command("from-attachment").description("Create a claim DRAFT from a receipt via AI extraction \u2014 a local file (--file), a remote URL (--source-url), or raw HTML (--html)").option("--file <path>","Local receipt file (PDF / JPG / PNG / HEIC / XLS / XLSX / EML)").option("--source-url <url>","Remote receipt file URL (alternative to --file)").option("--html <value>","Raw HTML (e.g. an email body) \u2014 inline or @path to read from a file").option("--contact <id>","Vendor contact resourceId").option("--claim-profile <id>","Claim profile resourceId").option("--employee <id>","File on behalf of this employee resourceId (default: the uploader's own; server requires a claims Manager/Admin to name another)").option("--currency <code>","Currency override (ISO 4217)").option("--value-date <date>","Value date override (YYYY-MM-DD)").option("--internal-notes <text>","Internal notes").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(Q(async(s,a)=>{if([a.file,a.sourceUrl,a.html].filter(Boolean).length!==1)throw new Error("provide exactly one of --file / --source-url / --html.");let u,d;if(a.file){let h=cit(a.file),m=dCr(h).toLowerCase();if(!cd.has(m))throw new Error(`unsupported file type "${m}". Supported: ${[...cd].join(", ")}`);let A=25*1024*1024,g=lCr(h).size;if(g>A)throw new Error(`file too large (${(g/1048576).toFixed(1)}MB > 25MB). Compress or split the receipt.`);u=new Blob([ait(h)],{type:jm(m)}),d=uCr(h)}let f;a.html&&(a.html.startsWith("@")||console.error(ke("Warning: passing HTML inline can leak invoice data into shell history \u2014 prefer --html @path.")),f=a.html.startsWith("@")?ait(cit(a.html.slice(1)),"utf8"):a.html);let p=await ab(s,{sourceFile:u,sourceFileName:d,sourceURL:a.sourceUrl,html:f,contactResourceId:a.contact,claimProfileResourceId:a.claimProfile,employeeResourceId:a.employee,currencyCode:a.currency,valueDate:a.valueDate,internalNotes:a.internalNotes});console.log(JSON.stringify(p,null,2))}))}Oe();dD();dc();mt();xt();Ft();ur();var uit=[{key:"resourceId",header:"ID",format:Be},{key:"name",header:"Name"},{key:"email",header:"Email"},{key:"employmentType",header:"Type"},{key:"active",header:"Active"}];function dit(t){let e=t.command("employees").description("Manage employees (expense-claim members): CRUD, balances, bind-user, import");Ve({parent:e,fields:iS,defaults:oS,fetcher:$b,columns:uit,label:"Searching employees"}),Ve({parent:e,commandName:"balances",fields:sS,defaults:aS,fetcher:WL,columns:uit,label:"Searching employee balances"}),e.command("get <resourceId>").description("Get an employee by resourceId").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>Q(async i=>{let s=(await ZL(i,r)).data;n.json?console.log(JSON.stringify(s,null,2)):(console.log(R("Name:"),s.name),console.log(R("ID:"),s.resourceId),console.log(R("Email:"),s.email??"\u2014"),console.log(R("Active:"),s.active),s.userBinding&&console.log(R("Bound user:"),`${s.userBinding.name??""} (${s.userBinding.status??""})`),s.claimProfile&&console.log(R("Claim profile:"),s.claimProfile.name))})(n)),e.command("create").description("Create an employee (requires --user to bind; binding is permanent)").option("--name <name>","Employee name").option("--user <id>","Login user resourceId to bind (required)").option("--claim-profile <id>","Claim profile resourceId (defaults to org default)").option("--email <email>","Work email").option("--phone <phone>","Phone").option("--manager <id>","Manager employee resourceId").option("--employment-type <type>","FULL_TIME | PART_TIME | CONTRACTOR | INTERN | TEMPORARY | CONSULTANT").option("--inactive","Create as inactive").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(Q(async(r,n)=>{if(Fe(n,[{flag:"--name",key:"name"},{flag:"--user",key:"user"}]),n.email){let o=await dM(r,n.email);if(o){n.json?console.log(JSON.stringify({_guard:"duplicate_skipped",existing:o},null,2)):console.log(ke(`Employee with email "${n.email}" already exists (${o.resourceId}).`));return}}let i=await KL(r,{name:n.name,userResourceId:n.user,claimProfileResourceId:n.claimProfile,email:n.email,phone:n.phone,managerEmployeeResourceId:n.manager,active:n.inactive?!1:void 0,employmentType:n.employmentType});n.json?console.log(JSON.stringify(i.data,null,2)):(console.log(Y(`Employee created: ${n.name}`)),console.log(R("ID:"),i.data.resourceId))})),e.command("update <resourceId>").description("Update an employee. Use --archive to deactivate (reversible).").option("--name <name>","New name").option("--email <email>","Work email").option("--phone <phone>","Phone").option("--manager <id>","Manager employee resourceId").option("--claim-profile <id>","Claim profile resourceId").option("--employment-type <type>","Employment classification").option("--archive","Set active=false (archive)").option("--activate","Set active=true").option("--clear-employment-type","Unset the classification").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>Q(async i=>{let o={};if(n.name!==void 0&&(o.name=n.name),n.email!==void 0&&(o.email=n.email),n.phone!==void 0&&(o.phone=n.phone),n.manager!==void 0&&(o.managerEmployeeResourceId=n.manager),n.claimProfile!==void 0&&(o.claimProfileResourceId=n.claimProfile),n.employmentType!==void 0&&(o.employmentType=n.employmentType),n.archive&&n.activate)throw new Error("--archive and --activate are mutually exclusive.");n.archive&&(o.active=!1),n.activate&&(o.active=!0),n.clearEmploymentType&&(o.clearEmploymentType=!0);let s=await XL(i,r,o);n.json?console.log(JSON.stringify(s.data,null,2)):console.log(Y(`Employee updated: ${s.data.name??r}`))})(n)),e.command("delete <resourceId>").description("Delete an employee (must be settled). Prefer update --archive.").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>Q(async i=>{await eM(i,r),n.json?console.log(JSON.stringify({deleted:!0,resourceId:r})):console.log(Y(`Employee deleted: ${r}`))})(n)),e.command("bind-user <resourceId> <userResourceId>").description("Bind a login user to an offline employee (no user bound yet). One-way, permanent \u2014 allowed only while unbound.").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n,i)=>Q(async o=>{let s=await tM(o,r,n);i.json?console.log(JSON.stringify(s.data,null,2)):console.log(Y(`Bound user ${n} to employee ${r}`))})(i)),e.command("preprocess <fileUrl>").description("Preview an employee import sheet before importing").option("--file-name <name>","Display file name").option("--file-type <type>","CSV | XLS | XLSX").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>Q(async i=>{let o=await rM(i,{fileUrl:r,fileName:n.fileName,fileType:n.fileType});console.log(JSON.stringify(o.data,null,2))})(n)),e.command("import").description("Bulk import employees (async). Pass --create / --update / --delete JSON arrays (max 100 each).").option("--create <json>","Create rows (JSON array)").option("--update <json>","Update rows (JSON array, each with employeeResourceId)").option("--delete <json>","Delete rows (JSON array, each with employeeResourceId)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(Q(async(r,n)=>{let i={};n.create!==void 0&&(i.create=hu(n.create,"--create")),n.update!==void 0&&(i.update=hu(n.update,"--update")),n.delete!==void 0&&(i.delete=hu(n.delete,"--delete"));let o=await nM(r,i);n.json?console.log(JSON.stringify(o.data,null,2)):console.log(Y(`Queued employee import \u2014 jobId ${o.data?.jobId??"?"}`))}))}cue();mt();xt();lr();Pt();Ft();Oe();var pCr=[{key:"resourceId",header:"ID",format:Be},{key:"name",header:"Name"},{key:"categoryCode",header:"Category"},{key:"value",header:"Value"}];function fit(t){let e=t.command("bookmarks").description("Manage organization bookmarks");e.command("list").description("List bookmarks").option("--limit <n>","Max results (default 100)",Ee).option("--offset <n>","Page number offset (0-indexed)",ze).option("--all","Fetch all pages").option("--max-rows <n>","Max rows for --all (default 1000)",Ee).option("--api-key <key>","API key (overrides stored/env)").option("--format <type>","Output format: table, json, csv, yaml").option("--json","Output as JSON").action(Q(async(r,n)=>{let i=await je(n,o=>cH(r,o),{label:"Fetching bookmarks"});Pe(i,pCr,n,"Bookmarks")})),e.command("get <resourceId>").description("Get a bookmark by resourceId").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>Q(async i=>{let s=(await lH(i,r)).data;n.json?console.log(JSON.stringify(s,null,2)):(console.log(R("Name:"),s.name),console.log(R("ID:"),s.resourceId),console.log(R("Category:"),s.categoryCode),console.log(R("Value:"),s.value))})(n)),e.command("create").description("Create bookmark(s)").option("--name <name>","Bookmark name").option("--value <value>","Bookmark value").option("--category <code>","Category code (GENERAL_INFORMATION, TAXATION_AND_COMPLIANCE, etc.)").option("--datatype <code>","Datatype code (default: TEXT)").option("--input <file>","Read full request body from JSON file (or pipe via stdin)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(Q(async(r,n)=>{let i=Ce(n),o;if(i?o=await Mx(r,i.items??[i]):(Fe(n,[{flag:"--name",key:"name"},{flag:"--value",key:"value"},{flag:"--category",key:"category"}]),o=await Mx(r,[{name:n.name,value:n.value,categoryCode:n.category,datatypeCode:n.datatype??"TEXT"}])),n.json)console.log(JSON.stringify(o.data,null,2));else{console.log(Y(`Bookmark(s) created: ${o.data.length} item(s)`));for(let s of o.data)console.log(` ${Se(s.resourceId)} ${s.name}`)}})),e.command("update <resourceId>").description("Update a bookmark").option("--name <name>","New name").option("--value <value>","New value").option("--category <code>","New category code").option("--input <file>","Read full request body from JSON file (or pipe via stdin)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>Q(async i=>{let o=Ce(n),s=o||{...n.name&&{name:n.name},...n.value&&{value:n.value},...n.category&&{categoryCode:n.category}},a=await uH(i,r,s);n.json?console.log(JSON.stringify(a.data,null,2)):console.log(Y(`Bookmark updated: ${a.data.name}`))})(n))}fH();mt();xt();Pt();lr();Ft();Oe();var hCr=[{key:"resourceId",header:"ID",format:Be},{key:"kind",header:"Kind"},{key:"tier",header:"Tier"},{key:"call",header:"Call"},{key:"dispositions",header:"Dispositions",format:t=>Array.isArray(t)?t.map(e=>e.verb).join(" "):String(t)},{key:"createdAt",header:"Created",format:pp}];function pit(t){let e=t.command("jots").description("Judgment journal: record and look up judgment entries");e.command("create").description("Record judgment entries (batch via --input, single via flags)").option("--kind <kind>","Judgment kind (CLASSIFICATION, MATCH, SCOPE, ASSUMPTION, RISK, METHOD, RECOVERY, DEVIATION)").option("--tier <tier>","Severity tier (LOW, MEDIUM, HIGH, CRITICAL)").option("--call <call>","The decision, one line").option("--why <why>","The basis for the call").option("--ruled-out <text>","Alternatives considered and set aside").option("--ref <ref...>","Entity ref, grammar TYPE:resourceId[#field][:RELATION] (repeatable)").option("--frame <frame>","Set anchor: defining query + counts").option("--confidence <level>","Routing hint (LOW, MEDIUM, HIGH)").option("--cited-rule <rule>","Org rule, policy, threshold, or precedent applied").option("--workflow-label <label>","Short workflow label (e.g. month-end-close)").option("--agent-label <label>","Self-reported product/model").option("--idempotency-key <key>","Retry key: a replay returns the existing entry").option("--input <file>","Read full request body from JSON file (or pipe via stdin)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(Q(async(r,n)=>{let i=Ce(n),o;i?o=i.entries??[i]:(Fe(n,[{flag:"--kind",key:"kind"},{flag:"--tier",key:"tier"},{flag:"--call",key:"call"}]),o=[{kind:n.kind,tier:n.tier,call:n.call,...n.why&&{why:n.why},...n.ruledOut&&{ruledOut:n.ruledOut},...n.ref&&{refs:n.ref},...n.frame&&{frame:n.frame},...n.confidence&&{confidence:n.confidence},...n.citedRule&&{citedRule:n.citedRule},...n.workflowLabel&&{workflowLabel:n.workflowLabel},...n.agentLabel&&{agentLabel:n.agentLabel},...n.idempotencyKey&&{idempotencyKey:n.idempotencyKey}}]),o=o.map(d=>({writePath:"CLI",...d}));let s=await gv(r,o),a=s.data.records??[],c=a.filter(d=>!d.error),u=a.length>0&&c.length===0;u&&(process.exitCode=1),n.json?console.log(JSON.stringify(s.data,null,2)):(console.log(u?ie(`No jots recorded: ${a.length} error(s)`):Y(`Jot(s) recorded: ${c.length}/${a.length} entr${a.length===1?"y":"ies"}`)),a.forEach((d,f)=>{if(d.error)console.log(` ${ke(`entry ${f}:`)} ${d.error}${d.errorCode?G(` (${d.errorCode})`):""}`);else{let p=[d.replayed&&"replayed",d.duplicateCount&&`${d.duplicateCount} similar`].filter(Boolean).join(", ");console.log(` ${Se(d.resourceId??"")}${p?G(` ${p}`):""}`)}}))})),e.command("recall").description("Search judgment entries (sort pinned server-side: critical first, then newest)").option("--ref <ref>","Entity ref filter, TYPE:resourceId").option("--kind <kind>","Judgment kind filter").option("--tier <tier>","Severity tier filter").option("--disposition-verb <verb>","Only entries with a disposition of this verb (FLAG, REJECT, ENDORSE)").option("--freetext <text>","Case-insensitive substring over call and why").option("--created-from <epochMs>","Created-at lower bound, epoch ms (inclusive)",ze).option("--created-to <epochMs>","Created-at upper bound, epoch ms (inclusive)",ze).option("--stats","Include per-credential disposition counts").option("--limit <n>","Max results (default 100)",Ee).option("--offset <n>","Page number offset (0-indexed)",ze).option("--all","Fetch all pages").option("--max-rows <n>","Max rows for --all (default 1000)",Ee).option("--format <type>","Output format: table, json, csv, yaml").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(Q(async(r,n)=>{let i={...n.ref&&{ref:n.ref},...n.kind&&{kind:n.kind},...n.tier&&{tier:n.tier},...n.dispositionVerb&&{dispositionVerb:n.dispositionVerb},...n.freetext&&{freetext:n.freetext},...n.createdFrom!==void 0&&{createdFrom:n.createdFrom},...n.createdTo!==void 0&&{createdTo:n.createdTo}},o,s=await je(n,async a=>{let c=await dH(r,{limit:a.limit,offset:a.offset,...Object.keys(i).length?{filter:i}:{},...n.stats&&(!n.all||a.offset===0)&&{includeStats:!0}});return o??=c.stats,c},{label:"Fetching jots"});if(Pe(o?.length?{...s,stats:o}:s,hCr,n,"Jots"),n.stats&&o?.length&&!wd(n)){console.log(R("Disposition stats (per credential):"));for(let a of o)console.log(` ${a.credential??"(unknown)"} ${a.verb??""} ${a.count??0}`)}})),e.command("dispose <resourceId>").description("Append a review disposition to a jot (append-only)").option("--verb <verb>","Review verb: FLAG, REJECT, or ENDORSE").option("--note <note>","Optional reviewer note").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>Q(async i=>{Fe(n,[{flag:"--verb",key:"verb"}]);let s=(await brt(i,r,{verb:n.verb,...n.note&&{note:n.note}})).data;n.json?console.log(JSON.stringify(s,null,2)):(console.log(Y(`Disposition recorded: ${s.verb} on ${s.jotResourceId}`)),s.rollbackHandoff&&console.log(G(" Rollback handoff pointer returned: execution lives in the rollback module.")))})(n))}lue();ED();mt();xt();lr();Pt();Ft();Oe();ur();function Hz(t,e){return r=>{let n=r.toUpperCase();if(!t.includes(n))throw new Error(`Invalid ${e}: ${r}. Allowed: ${t.join(", ")}`);return n}}function hit(t){return Zb.map(e=>({moduleName:e,roleCode:t}))}var mit=[{key:"resourceId",header:"ID",format:Be},{key:"firstName",header:"First Name"},{key:"lastName",header:"Last Name"},{key:"email",header:"Email"},{key:"moduleRoles",header:"Roles",format:t=>Array.isArray(t)?t.map(e=>`${e.moduleName}:${e.roleCode}`).join(", "):String(t??"")}];function Ait(t){let e=t.command("org-users").description("Manage organization users");e.command("list").description("List organization users").option("--limit <n>","Max results (default 100)",Ee).option("--offset <n>","Page number offset (0-indexed)",ze).option("--all","Fetch all pages").option("--max-rows <n>","Max rows for --all (default 1000)",Ee).option("--api-key <key>","API key (overrides stored/env)").option("--format <type>","Output format: table, json, csv, yaml").option("--json","Output as JSON").action(Q(async(r,n)=>{let i=await je(n,o=>pH(r,o),{label:"Fetching org users"});Pe(i,mit,n,"Org Users")})),Ve({parent:e,fields:bS,defaults:CS,fetcher:hH,columns:mit,label:"Searching org users",positionalArg:"name",positionalFilter:r=>({or:[{firstName:{contains:r}},{lastName:{contains:r}},{email:{contains:r}}]})}),e.command("invite").description("Invite a user to the organization").option("--first-name <name>","First name").option("--last-name <name>","Last name").option("--email <email>","Email address").option("--user-type <type>","ADMIN | CUSTOM_USER (default: derived from --role)",Hz(NA,"user-type")).option("--role <role>","Role code: ADMIN, PREPARER, MEMBER, NO_ACCESS (default: MEMBER). ADMIN \u2192 userType=ADMIN; others \u2192 userType=CUSTOM_USER with this role on every module.",Hz(kA,"role")).option("--input <file>","Read full request body from JSON file (or pipe via stdin)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(Q(async(r,n)=>{let i=Ce(n),o;if(i)o=await yv(r,i);else{Fe(n,[{flag:"--first-name",key:"firstName"},{flag:"--last-name",key:"lastName"},{flag:"--email",key:"email"}]);let s=n.role??"MEMBER",a=n.userType??(s==="ADMIN"?"ADMIN":"CUSTOM_USER");o=await yv(r,{firstName:n.firstName,lastName:n.lastName,email:n.email,userType:a,...a==="CUSTOM_USER"?{moduleRoles:hit(s)}:{}})}n.json?console.log(JSON.stringify(o.data,null,2)):(console.log(Y(`User invited: ${n.firstName??""} ${n.lastName??""} (${n.email??""})`)),console.log(R("ID:"),o.data.resourceId))})),e.command("update <resourceId>").description("Update a user's access tier and/or module roles").option("--user-type <type>","ADMIN | CUSTOM_USER (default: derived from --role)",Hz(NA,"user-type")).option("--role <role>","New role code: ADMIN, PREPARER, MEMBER, NO_ACCESS. ADMIN \u2192 userType=ADMIN; others \u2192 userType=CUSTOM_USER with this role on every module.",Hz(kA,"role")).option("--input <file>","Read full request body from JSON file (or pipe via stdin)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>Q(async i=>{let o=Ce(n),s;if(o)s=o;else{if(!n.role&&!n.userType)throw new Error("At least one of --role or --user-type is required");let c=n.role,u=n.userType??(c==="ADMIN"?"ADMIN":c?"CUSTOM_USER":void 0);s={...u?{userType:u}:{},...u==="CUSTOM_USER"&&c?{moduleRoles:hit(c)}:{}}}let a=await mH(i,r,s);n.json?console.log(JSON.stringify(a.data,null,2)):console.log(Y(`User updated: ${a.data.firstName} ${a.data.lastName}`))})(n)),e.command("remove <resourceId>").description("Remove a user from the organization").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>Q(async i=>{await AH(i,r),n.json?console.log(JSON.stringify({deleted:!0,resourceId:r})):console.log(Y(`User ${r} removed.`))})(n))}Oe();Lx();ur();Ft();var mCr=[{key:"resourceId",header:"ID",format:Be},{key:"transactionReference",header:"Reference",format:Pn},{key:"direction",header:"Dir",format:pL},{key:"valueDate",header:"Date",format:pp},{key:"totalAmount",header:"Amount",align:"right"},{key:"currencyCode",header:"Ccy"},{key:"businessTransactionType",header:"Type",format:t=>G(String(t??""))}];function git(t){let e=t.command("cashflow").description("Search cashflow transactions");Ve({parent:e,fields:Rd,defaults:Bd,fetcher:Yh,columns:mCr,label:"Searching cashflow"})}function yit(t){t.command("serve").description("HTTP daemon (not available in bundled CLI)").action(()=>{console.error("clio serve is not available in the bundled CLI. Use the full installation from the private repo."),process.exit(1)})}Oe();mt();xt();qo();zle();sue();Hle();function $a(t){return t.option("--plan","Plan mode \u2014 show required accounts and step summary (offline, no auth)").option("--input <file>","Account mapping JSON file (optional \u2014 auto-resolves from chart of accounts if omitted)").option("--bank-account <id>","Bank/cash account name or resourceId (for cash-in/cash-out steps)").option("--contact <id>","Contact name or resourceId \u2014 supplier for bills, customer for invoices").option("--existing-txn <id>","Attach to existing transaction \u2014 skip initial step, create delta only").option("--ref <prefix>","Reference prefix (generates prefix-1, prefix-2, ...)").option("--finalize","Approve transactions immediately (default: create as drafts)").option("--json","Output as JSON").option("--api-key <key>","API key override")}function qa(t,e){return async r=>{try{let n=e(r);if(r.plan){let s=Av(t,n);r.json?console.log(JSON.stringify(s,null,2)):ACr(s);return}let i=Nx(n);i||(console.error(ie("Error: no blueprint generated. Provide --start-date to enable blueprint.")),process.exit(1)),await Q(async(s,a,c)=>{let u=!!a.json,d,f=Ce(a);if(f)d=f;else{let h=Av(t,n);u||process.stderr.write(G(` Auto-resolving accounts from chart of accounts...
|
|
1060
|
+
`));for(let o of i.data)console.log(` ${Se(o.code??o.resourceId??"?")} ${o.description??""} ${G(o.countryCode??"")}`)}})),e.command("create").description("Create a new tax profile").option("--name <name>",'Tax profile name (e.g., "GST 9%")').option("--rate <n>","Tax rate as percentage (e.g., 9)",Ee).option("--tax-type-code <code>","Tax type code (from tax-profiles types)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(Q(async(r,n)=>{Fe(n,[{flag:"--name",key:"name"},{flag:"--rate",key:"rate"},{flag:"--tax-type-code",key:"taxTypeCode"}]);let i=await sM(r,n.name);if(i){n.json?console.log(JSON.stringify({_guard:"duplicate_skipped",existing:i},null,2)):console.log(ke(`Tax profile "${n.name}" already exists (${i.resourceId}).`));return}let o=await _L(r,{name:n.name,taxRate:n.rate,taxTypeCode:n.taxTypeCode});n.json?console.log(JSON.stringify(o.data,null,2)):(console.log(Y(`Tax profile created: ${n.name} (${n.rate}%)`)),console.log(R("ID:"),o.data.resourceId))}))}Oe();PL();NY();dc();mt();xt();lr();Pt();Ft();ur();var Xnt=[{key:"resourceId",header:"ID",format:Be},{key:"name",header:"Name"},{key:"isDefault",header:"Default"},{key:"expenseAccountResourceId",header:"Expense Acct",format:Be}];function eit(t){let e=t.command("claim-types").description("Manage employee-expense claim types (expense categories)");e.command("list").description("List claim types").option("--limit <n>","Max results (default 100)",Ee).option("--offset <n>","Page number offset (0-indexed)",ze).option("--all","Fetch all pages").option("--max-rows <n>","Max rows for --all (default 1000)",Ee).option("--api-key <key>","API key (overrides stored/env)").option("--format <type>","Output format: table, json, csv, yaml").option("--json","Output as JSON").action(Q(async(r,n)=>{let i=await je(n,o=>OL(r,o),{label:"Fetching claim types"});Pe(i,Xnt,n,"Claim Types")})),e.command("get <resourceId>").description("Get a claim type by resourceId").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>Q(async i=>{let s=(await FL(i,r)).data;n.json?console.log(JSON.stringify(s,null,2)):(console.log(R("Name:"),s.name),console.log(R("ID:"),s.resourceId),console.log(R("Default:"),s.isDefault),s.expenseAccount&&console.log(R("Expense Account:"),`${s.expenseAccount.code} ${s.expenseAccount.name}`),s.taxProfile&&console.log(R("Tax Profile:"),s.taxProfile.name))})(n)),Ve({parent:e,fields:KD,defaults:XD,fetcher:Mb,columns:Xnt,label:"Searching claim types"}),e.command("create").description("Create a claim type").option("--name <name>","Claim type name (unique per org)").option("--expense-account <id>","Default expense account resourceId").option("--tax-profile <id>","Default tax profile resourceId").option("--classifier-config <json>","Magic OCR classifier defaults (JSON string)").option("--default","Make org default").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(Q(async(r,n)=>{Fe(n,[{flag:"--name",key:"name"}]);let i=await cM(r,n.name);if(i){n.json?console.log(JSON.stringify({_guard:"duplicate_skipped",existing:i},null,2)):console.log(ke(`Claim type "${n.name}" already exists (${i.resourceId}).`));return}let o=await QL(r,{name:n.name,expenseAccountResourceId:n.expenseAccount,taxProfileResourceId:n.taxProfile,classifierConfig:n.classifierConfig,isDefault:n.default});n.json?console.log(JSON.stringify(o.data,null,2)):(console.log(Y(`Claim type created: ${n.name}`)),console.log(R("ID:"),o.data.resourceId))})),e.command("update <resourceId>").description("Update a claim type").option("--name <name>","New name").option("--expense-account <id>","Default expense account resourceId").option("--tax-profile <id>","Default tax profile resourceId").option("--classifier-config <json>","Classifier defaults (JSON string)").option("--default","Make org default").option("--clear <fields>","Comma-separated optional fields to NULL (expenseAccountResourceId,taxProfileResourceId,classifierConfig)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>Q(async i=>{let o={};n.name!==void 0&&(o.name=n.name),n.expenseAccount!==void 0&&(o.expenseAccountResourceId=n.expenseAccount),n.taxProfile!==void 0&&(o.taxProfileResourceId=n.taxProfile),n.classifierConfig!==void 0&&(o.classifierConfig=n.classifierConfig),n.default!==void 0&&(o.isDefault=n.default),Object.assign(o,oy(Co(n.clear),iD));let s=await LL(i,r,o);n.json?console.log(JSON.stringify(s.data,null,2)):console.log(Y(`Claim type updated: ${s.data.name}`))})(n)),e.command("delete <resourceId>").description("Soft-delete a claim type").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>Q(async i=>{await ML(i,r),n.json?console.log(JSON.stringify({deleted:!0,resourceId:r})):console.log(Y(`Claim type deleted: ${r}`))})(n))}Oe();aD();NY();dc();mt();xt();lr();Pt();Ft();ur();var tit=[{key:"resourceId",header:"ID",format:Be},{key:"name",header:"Name"},{key:"isDefault",header:"Default"},{key:"taxMode",header:"Tax Mode"},{key:"employeeBalanceAccountResourceId",header:"Balance Acct",format:Be}];function rit(t){let e={};return t.name!==void 0&&(e.name=t.name),t.approver!==void 0&&(e.approverUserResourceId=t.approver),t.visibleClaimTypes!==void 0&&(e.visibleClaimTypeIds=Co(t.visibleClaimTypes)),t.visibleTaxProfiles!==void 0&&(e.visibleTaxProfileIds=Co(t.visibleTaxProfiles)),t.visibleClassifiers!==void 0&&(e.visibleClassifierIds=Co(t.visibleClassifiers)),t.visibleVendors!==void 0&&(e.visibleVendorResourceIds=Co(t.visibleVendors)),t.allowedCurrencies!==void 0&&(e.allowedCurrencies=Co(t.allowedCurrencies)),t.minAmount!==void 0&&(e.minClaimAmount=t.minAmount),t.maxAmount!==void 0&&(e.maxClaimAmount=t.maxAmount),t.maxPerPeriod!==void 0&&(e.maxPerPeriodAmount=t.maxPerPeriod),t.perPeriod!==void 0&&(e.perPeriod=t.perPeriod),t.balanceAccount!==void 0&&(e.employeeBalanceAccountResourceId=t.balanceAccount),t.taxMode!==void 0&&(e.taxMode=t.taxMode),t.default!==void 0&&(e.isDefault=t.default),e}function nit(t){return t.option("--approver <id>","Default approver user resourceId").option("--visible-claim-types <ids>","Allowed claim type IDs (comma-separated)").option("--visible-tax-profiles <ids>","Allowed tax profile IDs (comma-separated)").option("--visible-classifiers <ids>","Allowed classifier IDs (comma-separated)").option("--visible-vendors <ids>","Allowed vendor contact IDs (comma-separated)").option("--allowed-currencies <codes>","Allowed ISO currency codes (comma-separated)").option("--min-amount <n>","Min claim total",ar).option("--max-amount <n>","Max claim total",ar).option("--max-per-period <n>","Per-period spend cap (requires --per-period)",ar).option("--per-period <window>","DAILY | WEEKLY | MONTHLY | QUARTERLY | YEARLY").option("--balance-account <id>","Employee balance (CURRENT_LIABILITY) account resourceId").option("--tax-mode <mode>","NO_TAX | INCLUSIVE (EXCLUSIVE rejected)").option("--default","Make org default")}function iit(t){let e=t.command("claim-profiles").description("Manage employee-expense claim profiles (per-employee policy bundles)");e.command("list").description("List claim profiles").option("--limit <n>","Max results (default 100)",Ee).option("--offset <n>","Page number offset (0-indexed)",ze).option("--all","Fetch all pages").option("--max-rows <n>","Max rows for --all (default 1000)",Ee).option("--api-key <key>","API key (overrides stored/env)").option("--format <type>","Output format: table, json, csv, yaml").option("--json","Output as JSON").action(Q(async(r,n)=>{let i=await je(n,o=>UL(r,o),{label:"Fetching claim profiles"});Pe(i,tit,n,"Claim Profiles")})),e.command("get <resourceId>").description("Get a claim profile by resourceId").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>Q(async i=>{let s=(await $L(i,r)).data;n.json?console.log(JSON.stringify(s,null,2)):(console.log(R("Name:"),s.name),console.log(R("ID:"),s.resourceId),console.log(R("Default:"),s.isDefault),s.taxMode&&console.log(R("Tax mode:"),s.taxMode),s.employeeBalanceAccount&&console.log(R("Balance account:"),`${s.employeeBalanceAccount.code} ${s.employeeBalanceAccount.name}`))})(n)),Ve({parent:e,fields:eS,defaults:tS,fetcher:Pb,columns:tit,label:"Searching claim profiles"}),nit(e.command("create").description("Create a claim profile").option("--name <name>","Profile name (unique per org)")).option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(Q(async(r,n)=>{Fe(n,[{flag:"--name",key:"name"}]);let i=await lM(r,n.name);if(i){n.json?console.log(JSON.stringify({_guard:"duplicate_skipped",existing:i},null,2)):console.log(ke(`Claim profile "${n.name}" already exists (${i.resourceId}).`));return}let o=await qL(r,rit(n));n.json?console.log(JSON.stringify(o.data,null,2)):(console.log(Y(`Claim profile created: ${n.name}`)),console.log(R("ID:"),o.data.resourceId))})),nit(e.command("update <resourceId>").description("Update a claim profile").option("--name <name>","New name")).option("--clear <fields>","Comma-separated optional fields to NULL (e.g. approverUserResourceId,perPeriod,taxMode)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>Q(async i=>{let o=rit(n);Object.assign(o,oy(Co(n.clear),sD));let s=await jL(i,r,o);n.json?console.log(JSON.stringify(s.data,null,2)):console.log(Y(`Claim profile updated: ${s.data.name}`))})(n)),e.command("delete <resourceId>").description("Soft-delete a claim profile").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>Q(async i=>{await YL(i,r),n.json?console.log(JSON.stringify({deleted:!0,resourceId:r})):console.log(Y(`Claim profile deleted: ${r}`))})(n))}Oe();uD();dc();mt();xt();lr();Pt();Ft();ur();var oit=[{key:"resourceId",header:"ID",format:Be},{key:"name",header:"Name"},{key:"outerAxis",header:"Outer"},{key:"innerAxis",header:"Inner"},{key:"isDefault",header:"Default"}];function sit(t){let e=t.command("posting-rules").description("Manage claim posting rules (how approved claims group into journals at conversion)");e.command("list").description("List posting rules").option("--limit <n>","Max results (default 100)",Ee).option("--offset <n>","Page number offset (0-indexed)",ze).option("--all","Fetch all pages").option("--max-rows <n>","Max rows for --all (default 1000)",Ee).option("--api-key <key>","API key (overrides stored/env)").option("--format <type>","Output format: table, json, csv, yaml").option("--json","Output as JSON").action(Q(async(r,n)=>{let i=await je(n,o=>HL(r,o),{label:"Fetching posting rules"});Pe(i,oit,n,"Posting Rules")})),e.command("get <resourceId>").description("Get a posting rule by resourceId").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>Q(async i=>{let s=(await zL(i,r)).data;n.json?console.log(JSON.stringify(s,null,2)):(console.log(R("Name:"),s.name),console.log(R("ID:"),s.resourceId),console.log(R("Outer axis:"),s.outerAxis),console.log(R("Inner axis:"),s.innerAxis),console.log(R("Line template:"),s.lineDescriptionTemplate),console.log(R("Default:"),s.isDefault))})(n)),Ve({parent:e,fields:rS,defaults:nS,fetcher:Ub,columns:oit,label:"Searching posting rules"}),e.command("create").description("Create a posting rule").option("--name <name>","Rule name (unique per org)").option("--outer-axis <axis>","PER_EMPLOYEE | PER_VENDOR | PER_PAIR | ONE_BATCH | PER_CLAIM").option("--inner-axis <axis>","RAW | BY_CT_TP_NC | BY_CT_TP_NC_EMPLOYEE | BY_CT_TP_NC_VENDOR").option("--line-template <tpl>",'Handlebars line template, e.g. "{employeeName} - {claimType}"').option("--journal-reference-template <tpl>","Optional journal-header reference template").option("--default-bank-account <id>","Default reimbursement bank account resourceId").option("--default-include-payout","Create reimbursement DCE by default").option("--default","Make org default rule").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(Q(async(r,n)=>{Fe(n,[{flag:"--name",key:"name"},{flag:"--outer-axis",key:"outerAxis"},{flag:"--inner-axis",key:"innerAxis"},{flag:"--line-template",key:"lineTemplate"}]);let i=await uM(r,n.name);if(i){n.json?console.log(JSON.stringify({_guard:"duplicate_skipped",existing:i},null,2)):console.log(ke(`Posting rule "${n.name}" already exists (${i.resourceId}).`));return}let o=await GL(r,{name:n.name,outerAxis:n.outerAxis,innerAxis:n.innerAxis,lineDescriptionTemplate:n.lineTemplate,journalReferenceTemplate:n.journalReferenceTemplate,defaultBankAccountResourceId:n.defaultBankAccount,defaultIncludeReimbursementPayout:n.defaultIncludePayout,isDefault:n.default});n.json?console.log(JSON.stringify(o.data,null,2)):(console.log(Y(`Posting rule created: ${n.name}`)),console.log(R("ID:"),o.data.resourceId))})),e.command("update <resourceId>").description("Update a posting rule").option("--name <name>","New name").option("--outer-axis <axis>","Outer grouping axis").option("--inner-axis <axis>","Inner line-aggregation axis").option("--line-template <tpl>","Handlebars line template").option("--journal-reference-template <tpl>","Journal-header reference template").option("--default-bank-account <id>","Default reimbursement bank account resourceId").option("--default-include-payout <bool>","Create reimbursement DCE by default (true/false)").option("--default","Make org default rule").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>Q(async i=>{let o={};n.name!==void 0&&(o.name=n.name),n.outerAxis!==void 0&&(o.outerAxis=n.outerAxis),n.innerAxis!==void 0&&(o.innerAxis=n.innerAxis),n.lineTemplate!==void 0&&(o.lineDescriptionTemplate=n.lineTemplate),n.journalReferenceTemplate!==void 0&&(o.journalReferenceTemplate=n.journalReferenceTemplate),n.defaultBankAccount!==void 0&&(o.defaultBankAccountResourceId=n.defaultBankAccount),n.defaultIncludePayout!==void 0&&(o.defaultIncludeReimbursementPayout=n.defaultIncludePayout==="true"),n.default!==void 0&&(o.isDefault=n.default);let s=await VL(i,r,o);n.json?console.log(JSON.stringify(s.data,null,2)):console.log(Y(`Posting rule updated: ${s.data.name}`))})(n)),e.command("delete <resourceId>").description("Delete a posting rule (the org default cannot be deleted while default)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>Q(async i=>{await JL(i,r),n.json?console.log(JSON.stringify({deleted:!0,resourceId:r})):console.log(Y(`Posting rule deleted: ${r}`))})(n))}Oe();HM();mue();Aue();l_();xH();mt();xt();Ft();xf();ur();import{randomUUID as cCr}from"node:crypto";import{readFileSync as ait,statSync as lCr}from"node:fs";import{basename as uCr,extname as dCr,resolve as cit}from"node:path";var fCr=[{key:"resourceId",header:"ID",format:Be},{key:"reference",header:"Reference"},{key:"status",header:"Status"},{key:"employeeResourceId",header:"Employee",format:Be},{key:"totalAmount",header:"Amount"},{key:"currencyCode",header:"Ccy"}];function lit(t){let e=t.command("claims").description("Employee-expense claims: search, edit drafts, lifecycle, bulk actions");Ve({parent:e,fields:VD,defaults:JD,fetcher:SM,columns:fCr,label:"Searching claims"}),e.command("get <resourceId>").description("Get a claim by resourceId").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((s,a)=>Q(async c=>{let d=(await RM(c,s)).data;a.json?console.log(JSON.stringify(d,null,2)):(console.log(R("Reference:"),d.reference??"\u2014"),console.log(R("ID:"),d.resourceId),console.log(R("Status:"),d.status),console.log(R("Total:"),`${d.totalAmount??0} ${d.currencyCode??""}`),console.log(R("Lines:"),(d.claimItems??[]).length))})(a)),e.command("create").description("Create a claim directly (bare create). Vendor is EITHER --contact OR --vendor-name. --items / --custom-fields take a JSON array string.").requiredOption("--value-date <date>","Business-transaction date (YYYY-MM-DD)").requiredOption("--currency <code>","Claim currency (ISO 4217)").option("--reference <ref>","User reference").option("--employee <id>","Employee resourceId the claim is filed for").option("--contact <id>","Vendor contact resourceId").option("--vendor-name <name>","Free-text vendor name").option("--currency-symbol <symbol>","Currency symbol override").option("--internal-notes <text>","Internal notes").option("--claim-profile <id>","Claim profile resourceId").option("--approver <id>","Approver user resourceId").option("--tags <list>","Header tags (comma-separated)").option("--items <json>","Line items as a JSON array").option("--custom-fields <json>","Custom field values as a JSON array").option("--submit","Validate + submit in one call (saveAsDraft=false). Requires --reference (else 422 CLAIM_REFERENCE_REQUIRED_AT_SUBMIT)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(s=>Q(async a=>{let c={valueDate:s.valueDate,currencyCode:s.currency};s.reference!==void 0&&(c.reference=s.reference),s.employee!==void 0&&(c.employeeResourceId=s.employee),s.contact!==void 0&&(c.contactResourceId=s.contact),s.vendorName!==void 0&&(c.vendorName=s.vendorName),s.currencySymbol!==void 0&&(c.currencySymbol=s.currencySymbol),s.internalNotes!==void 0&&(c.internalNotes=s.internalNotes),s.claimProfile!==void 0&&(c.claimProfileResourceId=s.claimProfile),s.approver!==void 0&&(c.approverUserResourceId=s.approver),s.tags!==void 0&&(c.tags=Co(s.tags)??[]),s.items!==void 0&&(c.claimItems=hu(s.items,"--items")),s.customFields!==void 0&&(c.customFields=hu(s.customFields,"--custom-fields")),s.submit&&(c.saveAsDraft=!1);let u=await BM(a,c);s.json?console.log(JSON.stringify(u.data,null,2)):console.log(Y(`Claim created: ${u.data.reference??u.data.resourceId} (${u.data.status})`))})(s)),e.command("update <resourceId>").description("Update a DRAFT claim (partial). --items / --custom-fields take a JSON array string.").option("--reference <ref>","User reference").option("--value-date <date>","Business-transaction date (YYYY-MM-DD)").option("--employee <id>","Employee resourceId").option("--contact <id>","Vendor contact resourceId").option("--vendor-name <name>","Free-text vendor name").option("--currency <code>","Claim currency (ISO 4217)").option("--internal-notes <text>","Internal notes").option("--claim-profile <id>","Claim profile resourceId").option("--approver <id>","Approver user resourceId").option("--tags <list>","Header tags (comma-separated)").option("--items <json>","Line items as a JSON array (REPLACES all lines)").option("--custom-fields <json>","Custom field values as a JSON array").option("--submit","Validate + submit in one call (saveAsDraft=false). Requires --reference (else 422 CLAIM_REFERENCE_REQUIRED_AT_SUBMIT)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((s,a)=>Q(async c=>{let u={};a.reference!==void 0&&(u.reference=a.reference),a.valueDate!==void 0&&(u.valueDate=a.valueDate),a.employee!==void 0&&(u.employeeResourceId=a.employee),a.contact!==void 0&&(u.contactResourceId=a.contact),a.vendorName!==void 0&&(u.vendorName=a.vendorName),a.currency!==void 0&&(u.currencyCode=a.currency),a.internalNotes!==void 0&&(u.internalNotes=a.internalNotes),a.claimProfile!==void 0&&(u.claimProfileResourceId=a.claimProfile),a.approver!==void 0&&(u.approverUserResourceId=a.approver),a.tags!==void 0&&(u.tags=Co(a.tags)??[]),a.items!==void 0&&(u.claimItems=hu(a.items,"--items")),a.customFields!==void 0&&(u.customFields=hu(a.customFields,"--custom-fields")),a.submit&&(u.saveAsDraft=!1);let d=await xM(c,s,u);a.json?console.log(JSON.stringify(d.data,null,2)):console.log(Y(`Claim updated: ${d.data.reference??d.data.resourceId} (${d.data.status})`))})(a)),e.command("delete <resourceId>").description("Delete a claim (only DRAFT / REJECTED / CANCELLED)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((s,a)=>Q(async c=>{await TM(c,s),a.json?console.log(JSON.stringify({deleted:!0,resourceId:s})):console.log(Y(`Claim deleted: ${s}`))})(a)),e.command("delete-attachment <resourceId> <attachmentResourceId>").description("Remove one attachment from a claim").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((s,a,c)=>Q(async u=>{await kM(u,s,a),c.json?console.log(JSON.stringify({deleted:!0,resourceId:s,attachmentResourceId:a})):console.log(Y(`Attachment removed from claim ${s}`))})(c));let r=[["submit",NM,"Submit a DRAFT claim for approval"],["approve",OM,"Approve a SUBMITTED claim"],["unpost",LM,"Unpost a CONVERTED claim (reverse conversion)"]];for(let[s,a,c]of r)e.command(`${s} <resourceId>`).description(c).option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((u,d)=>Q(async f=>{let p=await a(f,u);d.json?console.log(JSON.stringify(p,null,2)):console.log(Y(`Claim ${s}: ${u}${p.data?.status?` (${p.data.status})`:""}`))})(d));let n=[["reject",FM,"Reject a SUBMITTED/APPROVED claim"],["cancel",QM,"Cancel a DRAFT/SUBMITTED claim"]];for(let[s,a,c]of n)e.command(`${s} <resourceId>`).description(c).option("--reason <text>","Reason (1-1000 chars), required").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((u,d)=>Q(async f=>{Fe(d,[{flag:"--reason",key:"reason"}]);let p=await a(f,u,d.reason);d.json?console.log(JSON.stringify(p,null,2)):console.log(Y(`Claim ${s}ed: ${u}${p.data?.status?` (${p.data.status})`:""}`))})(d));let i=[["bulk-submit",MM,"Bulk-submit DRAFT claims (async)"],["bulk-approve",PM,"Bulk-approve SUBMITTED claims (async)"],["bulk-delete",UM,"Bulk-delete DRAFT/REJECTED/CANCELLED claims (async)"]];for(let[s,a,c]of i)e.command(s).description(`${c}. Poll with: clio background-jobs search`).option("--ids <list>","Claim resourceIds (comma-separated, 1-500)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(Q(async(u,d)=>{Fe(d,[{flag:"--ids",key:"ids"}]);let f=await a(u,Co(d.ids)??[]);d.json?console.log(JSON.stringify(f,null,2)):console.log(Y(`Queued ${s} \u2014 jobId ${f.data?.jobId??"?"}`))}));let o=[["bulk-reject",$M,"Bulk-reject claims (async)"],["bulk-cancel",qM,"Bulk-cancel claims (async)"]];for(let[s,a,c]of o)e.command(s).description(`${c}. Poll with: clio background-jobs search`).option("--ids <list>","Claim resourceIds (comma-separated, 1-500)").option("--reason <text>","Shared reason (1-1000 chars), required").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(Q(async(u,d)=>{Fe(d,[{flag:"--ids",key:"ids"},{flag:"--reason",key:"reason"}]);let f=await a(u,Co(d.ids)??[],d.reason);d.json?console.log(JSON.stringify(f,null,2)):console.log(Y(`Queued ${s} \u2014 jobId ${f.data?.jobId??"?"}`))}));e.command("tracking-tags").description("List claim tracking-tag values (picker)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(Q(async(s,a)=>{let c=await jM(s);if(a.json)console.log(JSON.stringify(c,null,2));else{console.log(R(`Tracking tags (${c.length}):`));for(let u of c)console.log(` ${typeof u=="string"?u:JSON.stringify(u)}`)}})),e.command("custom-field-values").description("List claim custom-field values (picker)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(Q(async(s,a)=>{let c=await YM(s);a.json?console.log(JSON.stringify(c,null,2)):console.log(ke(c.length===0?"No custom field values.":`${c.length} custom field value(s).`))})),e.command("preview-conversion").description("Preview the journals an APPROVED claim batch would produce (no write)").option("--ids <list>","APPROVED claim resourceIds (comma-separated)").option("--posting-rule <id>","Posting rule resourceId (default: org default)").option("--payout-flow <flow>","POST | POST_AND_RECORD").option("--include-payout","Include reimbursement DCE lines").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(Q(async(s,a)=>{if(Fe(a,[{flag:"--ids",key:"ids"}]),a.payoutFlow!==void 0&&!Ux.includes(a.payoutFlow))throw new Error(`--payout-flow must be one of: ${Ux.join(", ")}`);let c=await TH(s,{claimResourceIds:Co(a.ids)??[],postingRuleResourceId:a.postingRule,payoutFlow:a.payoutFlow,includeReimbursementPayout:a.includePayout});console.log(JSON.stringify(c.data,null,2))})),e.command("convert").description("Convert an APPROVED claim batch into journals (atomic). Preview first.").option("--ids <list>","APPROVED claim resourceIds (comma-separated)").option("--value-date <date>","Journal value date (YYYY-MM-DD), required").option("--posting-rule <id>","Posting rule resourceId (default: org default)").option("--include-payout","Create books-only reimbursement DCEs").option("--bank-account <id>","Override reimbursement bank account").option("--idempotency-key <key>","Retry-dedup token (auto-generated if omitted)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(Q(async(s,a)=>{Fe(a,[{flag:"--ids",key:"ids"},{flag:"--value-date",key:"valueDate"}]);let c=await kH(s,{claimResourceIds:Co(a.ids)??[],valueDate:a.valueDate,postingRuleResourceId:a.postingRule,includeReimbursementPayout:a.includePayout,bankAccountResourceIdOverride:a.bankAccount,idempotencyKey:a.idempotencyKey||cCr()});a.json?console.log(JSON.stringify(c.data,null,2)):console.log(Y("Claims converted to journals."))})),e.command("record-payout").description("Record a books-only employee payout (reimbursement / advance)").option("--employee <id>","Employee resourceId").option("--amount <n>","Payout amount (> 0)",ar).option("--payment-account <id>","Bank/cash account the DCE credits").option("--value-date <date>","Value date (YYYY-MM-DD)").option("--payout-for <type>","REIMBURSEMENT | ADVANCE (default ADVANCE)").option("--currency <code>","Settle currency (ISO 4217)").option("--reference <ref>","Payout reference (auto-generated if omitted)").option("--description <text>","DCE line description").option("--internal-notes <text>","Internal notes").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(Q(async(s,a)=>{Fe(a,[{flag:"--employee",key:"employee"},{flag:"--amount",key:"amount"},{flag:"--payment-account",key:"paymentAccount"},{flag:"--value-date",key:"valueDate"}]);let c=await NH(s,{employeeResourceId:a.employee,amount:a.amount,paymentAccountResourceId:a.paymentAccount,valueDate:a.valueDate,payoutFor:a.payoutFor,currencyCode:a.currency,reference:a.reference||Pa("EP"),description:a.description,internalNotes:a.internalNotes});a.json?console.log(JSON.stringify(c.data,null,2)):console.log(Y(`Payout recorded: ${c.data.resourceId}`))})),Ve({parent:e,commandName:"payouts",fields:WD,defaults:ZD,fetcher:OH,columns:[{key:"resourceId",header:"ID",format:Be},{key:"reference",header:"Reference"},{key:"employeeResourceId",header:"Employee",format:Be},{key:"amount",header:"Amount"},{key:"payoutType",header:"Type"}],label:"Searching employee payouts"}),e.command("from-attachment").description("Create a claim DRAFT from a receipt via AI extraction \u2014 a local file (--file), a remote URL (--source-url), or raw HTML (--html)").option("--file <path>","Local receipt file (PDF / JPG / PNG / HEIC / XLS / XLSX / EML)").option("--source-url <url>","Remote receipt file URL (alternative to --file)").option("--html <value>","Raw HTML (e.g. an email body) \u2014 inline or @path to read from a file").option("--contact <id>","Vendor contact resourceId").option("--claim-profile <id>","Claim profile resourceId").option("--employee <id>","File on behalf of this employee resourceId (default: the uploader's own; server requires a claims Manager/Admin to name another)").option("--currency <code>","Currency override (ISO 4217)").option("--value-date <date>","Value date override (YYYY-MM-DD)").option("--internal-notes <text>","Internal notes").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(Q(async(s,a)=>{if([a.file,a.sourceUrl,a.html].filter(Boolean).length!==1)throw new Error("provide exactly one of --file / --source-url / --html.");let u,d;if(a.file){let h=cit(a.file),m=dCr(h).toLowerCase();if(!cd.has(m))throw new Error(`unsupported file type "${m}". Supported: ${[...cd].join(", ")}`);let A=25*1024*1024,g=lCr(h).size;if(g>A)throw new Error(`file too large (${(g/1048576).toFixed(1)}MB > 25MB). Compress or split the receipt.`);u=new Blob([ait(h)],{type:jm(m)}),d=uCr(h)}let f;a.html&&(a.html.startsWith("@")||console.error(ke("Warning: passing HTML inline can leak invoice data into shell history \u2014 prefer --html @path.")),f=a.html.startsWith("@")?ait(cit(a.html.slice(1)),"utf8"):a.html);let p=await ab(s,{sourceFile:u,sourceFileName:d,sourceURL:a.sourceUrl,html:f,contactResourceId:a.contact,claimProfileResourceId:a.claimProfile,employeeResourceId:a.employee,currencyCode:a.currency,valueDate:a.valueDate,internalNotes:a.internalNotes});console.log(JSON.stringify(p,null,2))}))}Oe();dD();dc();mt();xt();Ft();ur();var uit=[{key:"resourceId",header:"ID",format:Be},{key:"name",header:"Name"},{key:"email",header:"Email"},{key:"employmentType",header:"Type"},{key:"active",header:"Active"}];function dit(t){let e=t.command("employees").description("Manage employees (expense-claim members): CRUD, balances, bind-user, import");Ve({parent:e,fields:iS,defaults:oS,fetcher:$b,columns:uit,label:"Searching employees"}),Ve({parent:e,commandName:"balances",fields:sS,defaults:aS,fetcher:WL,columns:uit,label:"Searching employee balances"}),e.command("get <resourceId>").description("Get an employee by resourceId").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>Q(async i=>{let s=(await ZL(i,r)).data;n.json?console.log(JSON.stringify(s,null,2)):(console.log(R("Name:"),s.name),console.log(R("ID:"),s.resourceId),console.log(R("Email:"),s.email??"\u2014"),console.log(R("Active:"),s.active),s.userBinding&&console.log(R("Bound user:"),`${s.userBinding.name??""} (${s.userBinding.status??""})`),s.claimProfile&&console.log(R("Claim profile:"),s.claimProfile.name))})(n)),e.command("create").description("Create an employee (requires --user to bind; binding is permanent)").option("--name <name>","Employee name").option("--user <id>","Login user resourceId to bind (required)").option("--claim-profile <id>","Claim profile resourceId (defaults to org default)").option("--email <email>","Work email").option("--phone <phone>","Phone").option("--manager <id>","Manager employee resourceId").option("--employment-type <type>","FULL_TIME | PART_TIME | CONTRACTOR | INTERN | TEMPORARY | CONSULTANT").option("--inactive","Create as inactive").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(Q(async(r,n)=>{if(Fe(n,[{flag:"--name",key:"name"},{flag:"--user",key:"user"}]),n.email){let o=await dM(r,n.email);if(o){n.json?console.log(JSON.stringify({_guard:"duplicate_skipped",existing:o},null,2)):console.log(ke(`Employee with email "${n.email}" already exists (${o.resourceId}).`));return}}let i=await KL(r,{name:n.name,userResourceId:n.user,claimProfileResourceId:n.claimProfile,email:n.email,phone:n.phone,managerEmployeeResourceId:n.manager,active:n.inactive?!1:void 0,employmentType:n.employmentType});n.json?console.log(JSON.stringify(i.data,null,2)):(console.log(Y(`Employee created: ${n.name}`)),console.log(R("ID:"),i.data.resourceId))})),e.command("update <resourceId>").description("Update an employee. Use --archive to deactivate (reversible).").option("--name <name>","New name").option("--email <email>","Work email").option("--phone <phone>","Phone").option("--manager <id>","Manager employee resourceId").option("--claim-profile <id>","Claim profile resourceId").option("--employment-type <type>","Employment classification").option("--archive","Set active=false (archive)").option("--activate","Set active=true").option("--clear-employment-type","Unset the classification").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>Q(async i=>{let o={};if(n.name!==void 0&&(o.name=n.name),n.email!==void 0&&(o.email=n.email),n.phone!==void 0&&(o.phone=n.phone),n.manager!==void 0&&(o.managerEmployeeResourceId=n.manager),n.claimProfile!==void 0&&(o.claimProfileResourceId=n.claimProfile),n.employmentType!==void 0&&(o.employmentType=n.employmentType),n.archive&&n.activate)throw new Error("--archive and --activate are mutually exclusive.");n.archive&&(o.active=!1),n.activate&&(o.active=!0),n.clearEmploymentType&&(o.clearEmploymentType=!0);let s=await XL(i,r,o);n.json?console.log(JSON.stringify(s.data,null,2)):console.log(Y(`Employee updated: ${s.data.name??r}`))})(n)),e.command("delete <resourceId>").description("Delete an employee (must be settled). Prefer update --archive.").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>Q(async i=>{await eM(i,r),n.json?console.log(JSON.stringify({deleted:!0,resourceId:r})):console.log(Y(`Employee deleted: ${r}`))})(n)),e.command("bind-user <resourceId> <userResourceId>").description("Bind a login user to an offline employee (no user bound yet). One-way, permanent \u2014 allowed only while unbound.").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n,i)=>Q(async o=>{let s=await tM(o,r,n);i.json?console.log(JSON.stringify(s.data,null,2)):console.log(Y(`Bound user ${n} to employee ${r}`))})(i)),e.command("preprocess <fileUrl>").description("Preview an employee import sheet before importing").option("--file-name <name>","Display file name").option("--file-type <type>","CSV | XLS | XLSX").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>Q(async i=>{let o=await rM(i,{fileUrl:r,fileName:n.fileName,fileType:n.fileType});console.log(JSON.stringify(o.data,null,2))})(n)),e.command("import").description("Bulk import employees (async). Pass --create / --update / --delete JSON arrays (max 100 each).").option("--create <json>","Create rows (JSON array)").option("--update <json>","Update rows (JSON array, each with employeeResourceId)").option("--delete <json>","Delete rows (JSON array, each with employeeResourceId)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(Q(async(r,n)=>{let i={};n.create!==void 0&&(i.create=hu(n.create,"--create")),n.update!==void 0&&(i.update=hu(n.update,"--update")),n.delete!==void 0&&(i.delete=hu(n.delete,"--delete"));let o=await nM(r,i);n.json?console.log(JSON.stringify(o.data,null,2)):console.log(Y(`Queued employee import \u2014 jobId ${o.data?.jobId??"?"}`))}))}cue();mt();xt();lr();Pt();Ft();Oe();var pCr=[{key:"resourceId",header:"ID",format:Be},{key:"name",header:"Name"},{key:"categoryCode",header:"Category"},{key:"value",header:"Value"}];function fit(t){let e=t.command("bookmarks").description("Manage organization bookmarks");e.command("list").description("List bookmarks").option("--limit <n>","Max results (default 100)",Ee).option("--offset <n>","Page number offset (0-indexed)",ze).option("--all","Fetch all pages").option("--max-rows <n>","Max rows for --all (default 1000)",Ee).option("--api-key <key>","API key (overrides stored/env)").option("--format <type>","Output format: table, json, csv, yaml").option("--json","Output as JSON").action(Q(async(r,n)=>{let i=await je(n,o=>cH(r,o),{label:"Fetching bookmarks"});Pe(i,pCr,n,"Bookmarks")})),e.command("get <resourceId>").description("Get a bookmark by resourceId").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>Q(async i=>{let s=(await lH(i,r)).data;n.json?console.log(JSON.stringify(s,null,2)):(console.log(R("Name:"),s.name),console.log(R("ID:"),s.resourceId),console.log(R("Category:"),s.categoryCode),console.log(R("Value:"),s.value))})(n)),e.command("create").description("Create bookmark(s)").option("--name <name>","Bookmark name").option("--value <value>","Bookmark value").option("--category <code>","Category code (GENERAL_INFORMATION, TAXATION_AND_COMPLIANCE, etc.)").option("--datatype <code>","Datatype code (default: TEXT)").option("--input <file>","Read full request body from JSON file (or pipe via stdin)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(Q(async(r,n)=>{let i=Ce(n),o;if(i?o=await Mx(r,i.items??[i]):(Fe(n,[{flag:"--name",key:"name"},{flag:"--value",key:"value"},{flag:"--category",key:"category"}]),o=await Mx(r,[{name:n.name,value:n.value,categoryCode:n.category,datatypeCode:n.datatype??"TEXT"}])),n.json)console.log(JSON.stringify(o.data,null,2));else{console.log(Y(`Bookmark(s) created: ${o.data.length} item(s)`));for(let s of o.data)console.log(` ${Se(s.resourceId)} ${s.name}`)}})),e.command("update <resourceId>").description("Update a bookmark").option("--name <name>","New name").option("--value <value>","New value").option("--category <code>","New category code").option("--input <file>","Read full request body from JSON file (or pipe via stdin)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>Q(async i=>{let o=Ce(n),s=o||{...n.name&&{name:n.name},...n.value&&{value:n.value},...n.category&&{categoryCode:n.category}},a=await uH(i,r,s);n.json?console.log(JSON.stringify(a.data,null,2)):console.log(Y(`Bookmark updated: ${a.data.name}`))})(n))}fH();mt();xt();Pt();lr();Ft();Oe();var hCr=[{key:"resourceId",header:"ID",format:Be},{key:"kind",header:"Kind"},{key:"tier",header:"Tier"},{key:"call",header:"Call"},{key:"dispositions",header:"Dispositions",format:t=>Array.isArray(t)?t.map(e=>e.verb).join(" "):String(t)},{key:"createdAt",header:"Created",format:pp}];function pit(t){let e=t.command("jots").description("Judgment journal: record and look up judgment entries");e.command("create").description("Record judgment entries (batch via --input, single via flags)").option("--kind <kind>","Judgment kind (CLASSIFICATION, MATCH, SCOPE, ASSUMPTION, RISK, METHOD, RECOVERY, DEVIATION, NOTE)").option("--tier <tier>","Severity tier (LOW, MEDIUM, HIGH, CRITICAL)").option("--call <call>","The decision, one line").option("--why <why>","The basis for the call").option("--ruled-out <text>","Alternatives considered and set aside").option("--ref <ref...>","Entity ref, grammar TYPE:resourceId[#field][:RELATION] (repeatable)").option("--frame <frame>","Set anchor: defining query + counts").option("--confidence <level>","Routing hint (LOW, MEDIUM, HIGH)").option("--cited-rule <rule>","Org rule, policy, threshold, or precedent applied").option("--workflow-label <label>","Short workflow label (e.g. month-end-close)").option("--agent-label <label>","Self-reported product/model").option("--idempotency-key <key>","Retry key: a replay returns the existing entry").option("--input <file>","Read full request body from JSON file (or pipe via stdin)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(Q(async(r,n)=>{let i=Ce(n),o;i?o=i.entries??[i]:(Fe(n,[{flag:"--kind",key:"kind"},{flag:"--tier",key:"tier"},{flag:"--call",key:"call"}]),o=[{kind:n.kind,tier:n.tier,call:n.call,...n.why&&{why:n.why},...n.ruledOut&&{ruledOut:n.ruledOut},...n.ref&&{refs:n.ref},...n.frame&&{frame:n.frame},...n.confidence&&{confidence:n.confidence},...n.citedRule&&{citedRule:n.citedRule},...n.workflowLabel&&{workflowLabel:n.workflowLabel},...n.agentLabel&&{agentLabel:n.agentLabel},...n.idempotencyKey&&{idempotencyKey:n.idempotencyKey}}]),o=o.map(d=>({writePath:"CLI",...d}));let s=await gv(r,o),a=s.data.records??[],c=a.filter(d=>!d.error),u=a.length>0&&c.length===0;u&&(process.exitCode=1),n.json?console.log(JSON.stringify(s.data,null,2)):(console.log(u?ie(`No jots recorded: ${a.length} error(s)`):Y(`Jot(s) recorded: ${c.length}/${a.length} entr${a.length===1?"y":"ies"}`)),a.forEach((d,f)=>{if(d.error)console.log(` ${ke(`entry ${f}:`)} ${d.error}${d.errorCode?G(` (${d.errorCode})`):""}`);else{let p=[d.replayed&&"replayed",d.duplicateCount&&`${d.duplicateCount} similar`].filter(Boolean).join(", ");console.log(` ${Se(d.resourceId??"")}${p?G(` ${p}`):""}`)}}))})),e.command("recall").description("Search judgment entries (sort pinned server-side: critical first, then newest)").option("--ref <ref>","Entity ref filter, TYPE:resourceId").option("--kind <kind>","Judgment kind filter").option("--tier <tier>","Severity tier filter").option("--disposition-verb <verb>","Only entries with a disposition of this verb (FLAG, REJECT, ENDORSE)").option("--freetext <text>","Case-insensitive substring over call and why").option("--created-from <epochMs>","Created-at lower bound, epoch ms (inclusive)",ze).option("--created-to <epochMs>","Created-at upper bound, epoch ms (inclusive)",ze).option("--stats","Include per-credential disposition counts").option("--limit <n>","Max results (default 100)",Ee).option("--offset <n>","Page number offset (0-indexed)",ze).option("--all","Fetch all pages").option("--max-rows <n>","Max rows for --all (default 1000)",Ee).option("--format <type>","Output format: table, json, csv, yaml").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(Q(async(r,n)=>{let i={...n.ref&&{ref:n.ref},...n.kind&&{kind:n.kind},...n.tier&&{tier:n.tier},...n.dispositionVerb&&{dispositionVerb:n.dispositionVerb},...n.freetext&&{freetext:n.freetext},...n.createdFrom!==void 0&&{createdFrom:n.createdFrom},...n.createdTo!==void 0&&{createdTo:n.createdTo}},o,s=await je(n,async a=>{let c=await dH(r,{limit:a.limit,offset:a.offset,...Object.keys(i).length?{filter:i}:{},...n.stats&&(!n.all||a.offset===0)&&{includeStats:!0}});return o??=c.stats,c},{label:"Fetching jots"});if(Pe(o?.length?{...s,stats:o}:s,hCr,n,"Jots"),n.stats&&o?.length&&!wd(n)){console.log(R("Disposition stats (per credential):"));for(let a of o)console.log(` ${a.credential??"(unknown)"} ${a.verb??""} ${a.count??0}`)}})),e.command("dispose <resourceId>").description("Append a review disposition to a jot (append-only)").option("--verb <verb>","Review verb: FLAG, REJECT, or ENDORSE").option("--note <note>","Optional reviewer note").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>Q(async i=>{Fe(n,[{flag:"--verb",key:"verb"}]);let s=(await brt(i,r,{verb:n.verb,...n.note&&{note:n.note}})).data;n.json?console.log(JSON.stringify(s,null,2)):(console.log(Y(`Disposition recorded: ${s.verb} on ${s.jotResourceId}`)),s.rollbackHandoff&&console.log(G(" Rollback handoff pointer returned: execution lives in the rollback module.")))})(n))}lue();ED();mt();xt();lr();Pt();Ft();Oe();ur();function Hz(t,e){return r=>{let n=r.toUpperCase();if(!t.includes(n))throw new Error(`Invalid ${e}: ${r}. Allowed: ${t.join(", ")}`);return n}}function hit(t){return Zb.map(e=>({moduleName:e,roleCode:t}))}var mit=[{key:"resourceId",header:"ID",format:Be},{key:"firstName",header:"First Name"},{key:"lastName",header:"Last Name"},{key:"email",header:"Email"},{key:"moduleRoles",header:"Roles",format:t=>Array.isArray(t)?t.map(e=>`${e.moduleName}:${e.roleCode}`).join(", "):String(t??"")}];function Ait(t){let e=t.command("org-users").description("Manage organization users");e.command("list").description("List organization users").option("--limit <n>","Max results (default 100)",Ee).option("--offset <n>","Page number offset (0-indexed)",ze).option("--all","Fetch all pages").option("--max-rows <n>","Max rows for --all (default 1000)",Ee).option("--api-key <key>","API key (overrides stored/env)").option("--format <type>","Output format: table, json, csv, yaml").option("--json","Output as JSON").action(Q(async(r,n)=>{let i=await je(n,o=>pH(r,o),{label:"Fetching org users"});Pe(i,mit,n,"Org Users")})),Ve({parent:e,fields:bS,defaults:CS,fetcher:hH,columns:mit,label:"Searching org users",positionalArg:"name",positionalFilter:r=>({or:[{firstName:{contains:r}},{lastName:{contains:r}},{email:{contains:r}}]})}),e.command("invite").description("Invite a user to the organization").option("--first-name <name>","First name").option("--last-name <name>","Last name").option("--email <email>","Email address").option("--user-type <type>","ADMIN | CUSTOM_USER (default: derived from --role)",Hz(NA,"user-type")).option("--role <role>","Role code: ADMIN, PREPARER, MEMBER, NO_ACCESS (default: MEMBER). ADMIN \u2192 userType=ADMIN; others \u2192 userType=CUSTOM_USER with this role on every module.",Hz(kA,"role")).option("--input <file>","Read full request body from JSON file (or pipe via stdin)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(Q(async(r,n)=>{let i=Ce(n),o;if(i)o=await yv(r,i);else{Fe(n,[{flag:"--first-name",key:"firstName"},{flag:"--last-name",key:"lastName"},{flag:"--email",key:"email"}]);let s=n.role??"MEMBER",a=n.userType??(s==="ADMIN"?"ADMIN":"CUSTOM_USER");o=await yv(r,{firstName:n.firstName,lastName:n.lastName,email:n.email,userType:a,...a==="CUSTOM_USER"?{moduleRoles:hit(s)}:{}})}n.json?console.log(JSON.stringify(o.data,null,2)):(console.log(Y(`User invited: ${n.firstName??""} ${n.lastName??""} (${n.email??""})`)),console.log(R("ID:"),o.data.resourceId))})),e.command("update <resourceId>").description("Update a user's access tier and/or module roles").option("--user-type <type>","ADMIN | CUSTOM_USER (default: derived from --role)",Hz(NA,"user-type")).option("--role <role>","New role code: ADMIN, PREPARER, MEMBER, NO_ACCESS. ADMIN \u2192 userType=ADMIN; others \u2192 userType=CUSTOM_USER with this role on every module.",Hz(kA,"role")).option("--input <file>","Read full request body from JSON file (or pipe via stdin)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>Q(async i=>{let o=Ce(n),s;if(o)s=o;else{if(!n.role&&!n.userType)throw new Error("At least one of --role or --user-type is required");let c=n.role,u=n.userType??(c==="ADMIN"?"ADMIN":c?"CUSTOM_USER":void 0);s={...u?{userType:u}:{},...u==="CUSTOM_USER"&&c?{moduleRoles:hit(c)}:{}}}let a=await mH(i,r,s);n.json?console.log(JSON.stringify(a.data,null,2)):console.log(Y(`User updated: ${a.data.firstName} ${a.data.lastName}`))})(n)),e.command("remove <resourceId>").description("Remove a user from the organization").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>Q(async i=>{await AH(i,r),n.json?console.log(JSON.stringify({deleted:!0,resourceId:r})):console.log(Y(`User ${r} removed.`))})(n))}Oe();Lx();ur();Ft();var mCr=[{key:"resourceId",header:"ID",format:Be},{key:"transactionReference",header:"Reference",format:Pn},{key:"direction",header:"Dir",format:pL},{key:"valueDate",header:"Date",format:pp},{key:"totalAmount",header:"Amount",align:"right"},{key:"currencyCode",header:"Ccy"},{key:"businessTransactionType",header:"Type",format:t=>G(String(t??""))}];function git(t){let e=t.command("cashflow").description("Search cashflow transactions");Ve({parent:e,fields:Rd,defaults:Bd,fetcher:Yh,columns:mCr,label:"Searching cashflow"})}function yit(t){t.command("serve").description("HTTP daemon (not available in bundled CLI)").action(()=>{console.error("clio serve is not available in the bundled CLI. Use the full installation from the private repo."),process.exit(1)})}Oe();mt();xt();qo();zle();sue();Hle();function $a(t){return t.option("--plan","Plan mode \u2014 show required accounts and step summary (offline, no auth)").option("--input <file>","Account mapping JSON file (optional \u2014 auto-resolves from chart of accounts if omitted)").option("--bank-account <id>","Bank/cash account name or resourceId (for cash-in/cash-out steps)").option("--contact <id>","Contact name or resourceId \u2014 supplier for bills, customer for invoices").option("--existing-txn <id>","Attach to existing transaction \u2014 skip initial step, create delta only").option("--ref <prefix>","Reference prefix (generates prefix-1, prefix-2, ...)").option("--finalize","Approve transactions immediately (default: create as drafts)").option("--json","Output as JSON").option("--api-key <key>","API key override")}function qa(t,e){return async r=>{try{let n=e(r);if(r.plan){let s=Av(t,n);r.json?console.log(JSON.stringify(s,null,2)):ACr(s);return}let i=Nx(n);i||(console.error(ie("Error: no blueprint generated. Provide --start-date to enable blueprint.")),process.exit(1)),await Q(async(s,a,c)=>{let u=!!a.json,d,f=Ce(a);if(f)d=f;else{let h=Av(t,n);u||process.stderr.write(G(` Auto-resolving accounts from chart of accounts...
|
|
1061
1061
|
`)),d=await f1e(s,h.plan.requiredAccounts,{silent:u})}if(a.contact){let h=await mi(s,a.contact,{silent:u});a.contact=h.resourceId}if(a.bankAccount){let h=await yM(s,a.bankAccount,{silent:u});a.bankAccount=h.resourceId}let p=await sH(s,{blueprint:i,calcType:t,accountMap:d,bankAccountId:a.bankAccount,contactId:a.contact,existingTxnId:a.existingTxn,referencePrefix:a.ref,finalize:a.finalize});a.json?console.log(JSON.stringify(p,null,2)):gCr(p)})(r)}catch(n){throw(n instanceof Yt||n instanceof Error&&n.message.includes("blueprint"))&&(console.error(ie("Error: "+n.message)),process.exit(1)),n}}}function ACr(t){console.log(R(`
|
|
1062
1062
|
Capsule Transaction Plan: `+t.recipe+`
|
|
1063
1063
|
`)),console.log(" Capsule Type: "+t.plan.capsuleType),console.log(" Capsule Name: "+t.plan.capsuleName),console.log(" Total Steps: "+t.plan.steps.total),console.log(" Step Breakdown:");for(let[e,r]of Object.entries(t.plan.steps.byAction))console.log(" "+e+": "+r);console.log(`
|
|
@@ -1148,7 +1148,7 @@ Strings are replaced with values relative to the transaction date.`);e.command("
|
|
|
1148
1148
|
path: iss.path ? [${hy(C)}, ...iss.path] : [${hy(C)}]
|
|
1149
1149
|
})));`),p.write(`newResult[${hy(C)}] = ${E}.value`)}p.write("payload.value = newResult;"),p.write("return payload;");let y=p.compile();return(C,E)=>y(f,C,E)},i,o=Iv,s=!Gz.jitless,c=s&&rde.value,u=e.catchall,d;t._zod.parse=(f,p)=>{d??(d=r.value);let h=f.value;if(!o(h))return f.issues.push({expected:"object",code:"invalid_type",input:h,inst:t}),f;let m=[];if(s&&c&&p?.async===!1&&p.jitless!==!0)i||(i=n(e.shape)),f=i(f,p);else{f.value={};let E=d.shape;for(let v of d.keys){let I=E[v],k=I._zod.run({value:h[v],issues:[]},p),S=I._zod.optin==="optional"&&I._zod.optout==="optional";k instanceof Promise?m.push(k.then(O=>S?xot(O,f,v,h):e8(O,f,v))):S?xot(k,f,v,h):e8(k,f,v)}}if(!u)return m.length?Promise.all(m).then(()=>f):f;let A=[],g=d.keySet,y=u._zod,C=y.def.type;for(let E of Object.keys(h)){if(g.has(E))continue;if(C==="never"){A.push(E);continue}let v=y.run({value:h[E],issues:[]},p);v instanceof Promise?m.push(v.then(I=>e8(I,f,E))):e8(v,f,E)}return A.length&&f.issues.push({code:"unrecognized_keys",keys:A,input:h,inst:t}),m.length?Promise.all(m).then(()=>f):f}});function Tot(t,e,r,n){for(let i of t)if(i.issues.length===0)return e.value=i.value,e;return e.issues.push({code:"invalid_union",input:e.value,inst:r,errors:t.map(i=>i.issues.map(o=>Ql(o,n,Lc())))}),e}var gde=ge("$ZodUnion",(t,e)=>{yn.init(t,e),gn(t._zod,"optin",()=>e.options.some(r=>r._zod.optin==="optional")?"optional":void 0),gn(t._zod,"optout",()=>e.options.some(r=>r._zod.optout==="optional")?"optional":void 0),gn(t._zod,"values",()=>{if(e.options.every(r=>r._zod.values))return new Set(e.options.flatMap(r=>Array.from(r._zod.values)))}),gn(t._zod,"pattern",()=>{if(e.options.every(r=>r._zod.pattern)){let r=e.options.map(n=>n._zod.pattern);return new RegExp(`^(${r.map(n=>lT(n.source)).join("|")})$`)}}),t._zod.parse=(r,n)=>{let i=!1,o=[];for(let s of e.options){let a=s._zod.run({value:r.value,issues:[]},n);if(a instanceof Promise)o.push(a),i=!0;else{if(a.issues.length===0)return a;o.push(a)}}return i?Promise.all(o).then(s=>Tot(s,r,t,n)):Tot(o,r,t,n)}}),mst=ge("$ZodDiscriminatedUnion",(t,e)=>{gde.init(t,e);let r=t._zod.parse;gn(t._zod,"propValues",()=>{let i={};for(let o of e.options){let s=o._zod.propValues;if(!s||Object.keys(s).length===0)throw new Error(`Invalid discriminated union option at index "${e.options.indexOf(o)}"`);for(let[a,c]of Object.entries(s)){i[a]||(i[a]=new Set);for(let u of c)i[a].add(u)}}return i});let n=aT(()=>{let i=e.options,o=new Map;for(let s of i){let a=s._zod.propValues[e.discriminator];if(!a||a.size===0)throw new Error(`Invalid discriminated union option at index "${e.options.indexOf(s)}"`);for(let c of a){if(o.has(c))throw new Error(`Duplicate discriminator value "${String(c)}"`);o.set(c,s)}}return o});t._zod.parse=(i,o)=>{let s=i.value;if(!Iv(s))return i.issues.push({code:"invalid_type",expected:"object",input:s,inst:t}),i;let a=n.value.get(s?.[e.discriminator]);return a?a._zod.run(i,o):e.unionFallback?r(i,o):(i.issues.push({code:"invalid_union",errors:[],note:"No matching discriminator",input:s,path:[e.discriminator],inst:t}),i)}}),Ast=ge("$ZodIntersection",(t,e)=>{yn.init(t,e),t._zod.parse=(r,n)=>{let i=r.value,o=e.left._zod.run({value:i,issues:[]},n),s=e.right._zod.run({value:i,issues:[]},n);return o instanceof Promise||s instanceof Promise?Promise.all([o,s]).then(([c,u])=>kot(r,c,u)):kot(r,o,s)}});function mde(t,e){if(t===e)return{valid:!0,data:t};if(t instanceof Date&&e instanceof Date&&+t==+e)return{valid:!0,data:t};if(wv(t)&&wv(e)){let r=Object.keys(e),n=Object.keys(t).filter(o=>r.indexOf(o)!==-1),i={...t,...e};for(let o of n){let s=mde(t[o],e[o]);if(!s.valid)return{valid:!1,mergeErrorPath:[o,...s.mergeErrorPath]};i[o]=s.data}return{valid:!0,data:i}}if(Array.isArray(t)&&Array.isArray(e)){if(t.length!==e.length)return{valid:!1,mergeErrorPath:[]};let r=[];for(let n=0;n<t.length;n++){let i=t[n],o=e[n],s=mde(i,o);if(!s.valid)return{valid:!1,mergeErrorPath:[n,...s.mergeErrorPath]};r.push(s.data)}return{valid:!0,data:r}}return{valid:!1,mergeErrorPath:[]}}function kot(t,e,r){if(e.issues.length&&t.issues.push(...e.issues),r.issues.length&&t.issues.push(...r.issues),my(t))return t;let n=mde(e.value,r.value);if(!n.valid)throw new Error(`Unmergable intersection. Error path: ${JSON.stringify(n.mergeErrorPath)}`);return t.value=n.data,t}var gst=ge("$ZodRecord",(t,e)=>{yn.init(t,e),t._zod.parse=(r,n)=>{let i=r.value;if(!wv(i))return r.issues.push({expected:"record",code:"invalid_type",input:i,inst:t}),r;let o=[];if(e.keyType._zod.values){let s=e.keyType._zod.values;r.value={};for(let c of s)if(typeof c=="string"||typeof c=="number"||typeof c=="symbol"){let u=e.valueType._zod.run({value:i[c],issues:[]},n);u instanceof Promise?o.push(u.then(d=>{d.issues.length&&r.issues.push(...Gu(c,d.issues)),r.value[c]=d.value})):(u.issues.length&&r.issues.push(...Gu(c,u.issues)),r.value[c]=u.value)}let a;for(let c in i)s.has(c)||(a=a??[],a.push(c));a&&a.length>0&&r.issues.push({code:"unrecognized_keys",input:i,inst:t,keys:a})}else{r.value={};for(let s of Reflect.ownKeys(i)){if(s==="__proto__")continue;let a=e.keyType._zod.run({value:s,issues:[]},n);if(a instanceof Promise)throw new Error("Async schemas not supported in object keys currently");if(a.issues.length){r.issues.push({origin:"record",code:"invalid_key",issues:a.issues.map(u=>Ql(u,n,Lc())),input:s,path:[s],inst:t}),r.value[a.value]=a.value;continue}let c=e.valueType._zod.run({value:i[s],issues:[]},n);c instanceof Promise?o.push(c.then(u=>{u.issues.length&&r.issues.push(...Gu(s,u.issues)),r.value[a.value]=u.value})):(c.issues.length&&r.issues.push(...Gu(s,c.issues)),r.value[a.value]=c.value)}}return o.length?Promise.all(o).then(()=>r):r}});var yst=ge("$ZodEnum",(t,e)=>{yn.init(t,e);let r=Kue(e.entries);t._zod.values=new Set(r),t._zod.pattern=new RegExp(`^(${r.filter(n=>nde.has(typeof n)).map(n=>typeof n=="string"?Vh(n):n.toString()).join("|")})$`),t._zod.parse=(n,i)=>{let o=n.value;return t._zod.values.has(o)||n.issues.push({code:"invalid_value",values:r,input:o,inst:t}),n}}),Est=ge("$ZodLiteral",(t,e)=>{yn.init(t,e),t._zod.values=new Set(e.values),t._zod.pattern=new RegExp(`^(${e.values.map(r=>typeof r=="string"?Vh(r):r?r.toString():String(r)).join("|")})$`),t._zod.parse=(r,n)=>{let i=r.value;return t._zod.values.has(i)||r.issues.push({code:"invalid_value",values:e.values,input:i,inst:t}),r}});var bst=ge("$ZodTransform",(t,e)=>{yn.init(t,e),t._zod.parse=(r,n)=>{let i=e.transform(r.value,r);if(n.async)return(i instanceof Promise?i:Promise.resolve(i)).then(s=>(r.value=s,r));if(i instanceof Promise)throw new df;return r.value=i,r}}),Cst=ge("$ZodOptional",(t,e)=>{yn.init(t,e),t._zod.optin="optional",t._zod.optout="optional",gn(t._zod,"values",()=>e.innerType._zod.values?new Set([...e.innerType._zod.values,void 0]):void 0),gn(t._zod,"pattern",()=>{let r=e.innerType._zod.pattern;return r?new RegExp(`^(${lT(r.source)})?$`):void 0}),t._zod.parse=(r,n)=>e.innerType._zod.optin==="optional"?e.innerType._zod.run(r,n):r.value===void 0?r:e.innerType._zod.run(r,n)}),vst=ge("$ZodNullable",(t,e)=>{yn.init(t,e),gn(t._zod,"optin",()=>e.innerType._zod.optin),gn(t._zod,"optout",()=>e.innerType._zod.optout),gn(t._zod,"pattern",()=>{let r=e.innerType._zod.pattern;return r?new RegExp(`^(${lT(r.source)}|null)$`):void 0}),gn(t._zod,"values",()=>e.innerType._zod.values?new Set([...e.innerType._zod.values,null]):void 0),t._zod.parse=(r,n)=>r.value===null?r:e.innerType._zod.run(r,n)}),Ist=ge("$ZodDefault",(t,e)=>{yn.init(t,e),t._zod.optin="optional",gn(t._zod,"values",()=>e.innerType._zod.values),t._zod.parse=(r,n)=>{if(r.value===void 0)return r.value=e.defaultValue,r;let i=e.innerType._zod.run(r,n);return i instanceof Promise?i.then(o=>Not(o,e)):Not(i,e)}});function Not(t,e){return t.value===void 0&&(t.value=e.defaultValue),t}var wst=ge("$ZodPrefault",(t,e)=>{yn.init(t,e),t._zod.optin="optional",gn(t._zod,"values",()=>e.innerType._zod.values),t._zod.parse=(r,n)=>(r.value===void 0&&(r.value=e.defaultValue),e.innerType._zod.run(r,n))}),_st=ge("$ZodNonOptional",(t,e)=>{yn.init(t,e),gn(t._zod,"values",()=>{let r=e.innerType._zod.values;return r?new Set([...r].filter(n=>n!==void 0)):void 0}),t._zod.parse=(r,n)=>{let i=e.innerType._zod.run(r,n);return i instanceof Promise?i.then(o=>Oot(o,t)):Oot(i,t)}});function Oot(t,e){return!t.issues.length&&t.value===void 0&&t.issues.push({code:"invalid_type",expected:"nonoptional",input:t.value,inst:e}),t}var Dst=ge("$ZodCatch",(t,e)=>{yn.init(t,e),t._zod.optin="optional",gn(t._zod,"optout",()=>e.innerType._zod.optout),gn(t._zod,"values",()=>e.innerType._zod.values),t._zod.parse=(r,n)=>{let i=e.innerType._zod.run(r,n);return i instanceof Promise?i.then(o=>(r.value=o.value,o.issues.length&&(r.value=e.catchValue({...r,error:{issues:o.issues.map(s=>Ql(s,n,Lc()))},input:r.value}),r.issues=[]),r)):(r.value=i.value,i.issues.length&&(r.value=e.catchValue({...r,error:{issues:i.issues.map(o=>Ql(o,n,Lc()))},input:r.value}),r.issues=[]),r)}});var Sst=ge("$ZodPipe",(t,e)=>{yn.init(t,e),gn(t._zod,"values",()=>e.in._zod.values),gn(t._zod,"optin",()=>e.in._zod.optin),gn(t._zod,"optout",()=>e.out._zod.optout),t._zod.parse=(r,n)=>{let i=e.in._zod.run(r,n);return i instanceof Promise?i.then(o=>Fot(o,e,n)):Fot(i,e,n)}});function Fot(t,e,r){return my(t)?t:e.out._zod.run({value:t.value,issues:t.issues},r)}var Rst=ge("$ZodReadonly",(t,e)=>{yn.init(t,e),gn(t._zod,"propValues",()=>e.innerType._zod.propValues),gn(t._zod,"values",()=>e.innerType._zod.values),gn(t._zod,"optin",()=>e.innerType._zod.optin),gn(t._zod,"optout",()=>e.innerType._zod.optout),t._zod.parse=(r,n)=>{let i=e.innerType._zod.run(r,n);return i instanceof Promise?i.then(Qot):Qot(i)}});function Qot(t){return t.value=Object.freeze(t.value),t}var Bst=ge("$ZodCustom",(t,e)=>{is.init(t,e),yn.init(t,e),t._zod.parse=(r,n)=>r,t._zod.check=r=>{let n=r.value,i=e.fn(n);if(i instanceof Promise)return i.then(o=>Lot(o,r,n,t));Lot(i,r,n,t)}});function Lot(t,e,r,n){if(!t){let i={code:"custom",input:r,inst:n,path:[...n._zod.def.path??[]],continue:!n._zod.def.abort};n._zod.def.params&&(i.params=n._zod.def.params),e.issues.push(sde(i))}}var VCr=t=>{let e=typeof t;switch(e){case"number":return Number.isNaN(t)?"NaN":"number";case"object":{if(Array.isArray(t))return"array";if(t===null)return"null";if(Object.getPrototypeOf(t)!==Object.prototype&&t.constructor)return t.constructor.name}}return e},JCr=()=>{let t={string:{unit:"characters",verb:"to have"},file:{unit:"bytes",verb:"to have"},array:{unit:"items",verb:"to have"},set:{unit:"items",verb:"to have"}};function e(n){return t[n]??null}let r={regex:"input",email:"email address",url:"URL",emoji:"emoji",uuid:"UUID",uuidv4:"UUIDv4",uuidv6:"UUIDv6",nanoid:"nanoid",guid:"GUID",cuid:"cuid",cuid2:"cuid2",ulid:"ULID",xid:"XID",ksuid:"KSUID",datetime:"ISO datetime",date:"ISO date",time:"ISO time",duration:"ISO duration",ipv4:"IPv4 address",ipv6:"IPv6 address",cidrv4:"IPv4 range",cidrv6:"IPv6 range",base64:"base64-encoded string",base64url:"base64url-encoded string",json_string:"JSON string",e164:"E.164 number",jwt:"JWT",template_literal:"input"};return n=>{switch(n.code){case"invalid_type":return`Invalid input: expected ${n.expected}, received ${VCr(n.input)}`;case"invalid_value":return n.values.length===1?`Invalid input: expected ${Wz(n.values[0])}`:`Invalid option: expected one of ${Vz(n.values,"|")}`;case"too_big":{let i=n.inclusive?"<=":"<",o=e(n.origin);return o?`Too big: expected ${n.origin??"value"} to have ${i}${n.maximum.toString()} ${o.unit??"elements"}`:`Too big: expected ${n.origin??"value"} to be ${i}${n.maximum.toString()}`}case"too_small":{let i=n.inclusive?">=":">",o=e(n.origin);return o?`Too small: expected ${n.origin} to have ${i}${n.minimum.toString()} ${o.unit}`:`Too small: expected ${n.origin} to be ${i}${n.minimum.toString()}`}case"invalid_format":{let i=n;return i.format==="starts_with"?`Invalid string: must start with "${i.prefix}"`:i.format==="ends_with"?`Invalid string: must end with "${i.suffix}"`:i.format==="includes"?`Invalid string: must include "${i.includes}"`:i.format==="regex"?`Invalid string: must match pattern ${i.pattern}`:`Invalid ${r[i.format]??n.format}`}case"not_multiple_of":return`Invalid number: must be a multiple of ${n.divisor}`;case"unrecognized_keys":return`Unrecognized key${n.keys.length>1?"s":""}: ${Vz(n.keys,", ")}`;case"invalid_key":return`Invalid key in ${n.origin}`;case"invalid_union":return"Invalid input";case"invalid_element":return`Invalid value in ${n.origin}`;default:return"Invalid input"}}};function xst(){return{localeError:JCr()}}var yde=class{constructor(){this._map=new Map,this._idmap=new Map}add(e,...r){let n=r[0];if(this._map.set(e,n),n&&typeof n=="object"&&"id"in n){if(this._idmap.has(n.id))throw new Error(`ID ${n.id} already exists in the registry`);this._idmap.set(n.id,e)}return this}clear(){return this._map=new Map,this._idmap=new Map,this}remove(e){let r=this._map.get(e);return r&&typeof r=="object"&&"id"in r&&this._idmap.delete(r.id),this._map.delete(e),this}get(e){let r=e._zod.parent;if(r){let n={...this.get(r)??{}};return delete n.id,{...n,...this._map.get(e)}}return this._map.get(e)}has(e){return this._map.has(e)}};function WCr(){return new yde}var pT=WCr();function Tst(t,e){return new t({type:"string",...Ct(e)})}function kst(t,e){return new t({type:"string",format:"email",check:"string_format",abort:!1,...Ct(e)})}function Ede(t,e){return new t({type:"string",format:"guid",check:"string_format",abort:!1,...Ct(e)})}function Nst(t,e){return new t({type:"string",format:"uuid",check:"string_format",abort:!1,...Ct(e)})}function Ost(t,e){return new t({type:"string",format:"uuid",check:"string_format",abort:!1,version:"v4",...Ct(e)})}function Fst(t,e){return new t({type:"string",format:"uuid",check:"string_format",abort:!1,version:"v6",...Ct(e)})}function Qst(t,e){return new t({type:"string",format:"uuid",check:"string_format",abort:!1,version:"v7",...Ct(e)})}function Lst(t,e){return new t({type:"string",format:"url",check:"string_format",abort:!1,...Ct(e)})}function Mst(t,e){return new t({type:"string",format:"emoji",check:"string_format",abort:!1,...Ct(e)})}function Pst(t,e){return new t({type:"string",format:"nanoid",check:"string_format",abort:!1,...Ct(e)})}function Ust(t,e){return new t({type:"string",format:"cuid",check:"string_format",abort:!1,...Ct(e)})}function $st(t,e){return new t({type:"string",format:"cuid2",check:"string_format",abort:!1,...Ct(e)})}function qst(t,e){return new t({type:"string",format:"ulid",check:"string_format",abort:!1,...Ct(e)})}function jst(t,e){return new t({type:"string",format:"xid",check:"string_format",abort:!1,...Ct(e)})}function Yst(t,e){return new t({type:"string",format:"ksuid",check:"string_format",abort:!1,...Ct(e)})}function Hst(t,e){return new t({type:"string",format:"ipv4",check:"string_format",abort:!1,...Ct(e)})}function zst(t,e){return new t({type:"string",format:"ipv6",check:"string_format",abort:!1,...Ct(e)})}function Gst(t,e){return new t({type:"string",format:"cidrv4",check:"string_format",abort:!1,...Ct(e)})}function Vst(t,e){return new t({type:"string",format:"cidrv6",check:"string_format",abort:!1,...Ct(e)})}function Jst(t,e){return new t({type:"string",format:"base64",check:"string_format",abort:!1,...Ct(e)})}function Wst(t,e){return new t({type:"string",format:"base64url",check:"string_format",abort:!1,...Ct(e)})}function Zst(t,e){return new t({type:"string",format:"e164",check:"string_format",abort:!1,...Ct(e)})}function Kst(t,e){return new t({type:"string",format:"jwt",check:"string_format",abort:!1,...Ct(e)})}function Xst(t,e){return new t({type:"string",format:"datetime",check:"string_format",offset:!1,local:!1,precision:null,...Ct(e)})}function eat(t,e){return new t({type:"string",format:"date",check:"string_format",...Ct(e)})}function tat(t,e){return new t({type:"string",format:"time",check:"string_format",precision:null,...Ct(e)})}function rat(t,e){return new t({type:"string",format:"duration",check:"string_format",...Ct(e)})}function nat(t,e){return new t({type:"number",checks:[],...Ct(e)})}function iat(t,e){return new t({type:"number",check:"number_format",abort:!1,format:"safeint",...Ct(e)})}function oat(t,e){return new t({type:"boolean",...Ct(e)})}function sat(t,e){return new t({type:"null",...Ct(e)})}function aat(t){return new t({type:"unknown"})}function cat(t,e){return new t({type:"never",...Ct(e)})}function r8(t,e){return new pde({check:"less_than",...Ct(e),value:t,inclusive:!1})}function hT(t,e){return new pde({check:"less_than",...Ct(e),value:t,inclusive:!0})}function n8(t,e){return new hde({check:"greater_than",...Ct(e),value:t,inclusive:!1})}function mT(t,e){return new hde({check:"greater_than",...Ct(e),value:t,inclusive:!0})}function i8(t,e){return new mot({check:"multiple_of",...Ct(e),value:t})}function o8(t,e){return new got({check:"max_length",...Ct(e),maximum:t})}function _v(t,e){return new yot({check:"min_length",...Ct(e),minimum:t})}function s8(t,e){return new Eot({check:"length_equals",...Ct(e),length:t})}function bde(t,e){return new bot({check:"string_format",format:"regex",...Ct(e),pattern:t})}function Cde(t){return new Cot({check:"string_format",format:"lowercase",...Ct(t)})}function vde(t){return new vot({check:"string_format",format:"uppercase",...Ct(t)})}function Ide(t,e){return new Iot({check:"string_format",format:"includes",...Ct(e),includes:t})}function wde(t,e){return new wot({check:"string_format",format:"starts_with",...Ct(e),prefix:t})}function _de(t,e){return new _ot({check:"string_format",format:"ends_with",...Ct(e),suffix:t})}function Ay(t){return new Dot({check:"overwrite",tx:t})}function Dde(t){return Ay(e=>e.normalize(t))}function Sde(){return Ay(t=>t.trim())}function Rde(){return Ay(t=>t.toLowerCase())}function Bde(){return Ay(t=>t.toUpperCase())}function lat(t,e,r){return new t({type:"array",element:e,...Ct(r)})}function uat(t,e,r){let n=Ct(r);return n.abort??(n.abort=!0),new t({type:"custom",check:"custom",fn:e,...n})}function dat(t,e,r){return new t({type:"custom",check:"custom",fn:e,...Ct(r)})}var gT={};za(gT,{ZodISODate:()=>pat,ZodISODateTime:()=>fat,ZodISODuration:()=>mat,ZodISOTime:()=>hat,date:()=>Tde,datetime:()=>xde,duration:()=>Nde,time:()=>kde});var fat=ge("ZodISODateTime",(t,e)=>{Jot.init(t,e),Yn.init(t,e)});function xde(t){return Xst(fat,t)}var pat=ge("ZodISODate",(t,e)=>{Wot.init(t,e),Yn.init(t,e)});function Tde(t){return eat(pat,t)}var hat=ge("ZodISOTime",(t,e)=>{Zot.init(t,e),Yn.init(t,e)});function kde(t){return tat(hat,t)}var mat=ge("ZodISODuration",(t,e)=>{Kot.init(t,e),Yn.init(t,e)});function Nde(t){return rat(mat,t)}var Aat=(t,e)=>{Zz.init(t,e),t.name="ZodError",Object.defineProperties(t,{format:{value:r=>Qit(t,r)},flatten:{value:r=>Fit(t,r)},addIssue:{value:r=>t.issues.push(r)},addIssues:{value:r=>t.issues.push(...r)},isEmpty:{get(){return t.issues.length===0}}})},fln=ge("ZodError",Aat),yT=ge("ZodError",Aat,{Parent:Error});var gat=Lit(yT),yat=Mit(yT),Eat=cde(yT),bat=lde(yT);var ai=ge("ZodType",(t,e)=>(yn.init(t,e),t.def=e,Object.defineProperty(t,"_def",{value:e}),t.check=(...r)=>t.clone({...e,checks:[...e.checks??[],...r.map(n=>typeof n=="function"?{_zod:{check:n,def:{check:"custom"},onattach:[]}}:n)]}),t.clone=(r,n)=>zu(t,r,n),t.brand=()=>t,t.register=((r,n)=>(r.add(t,n),t)),t.parse=(r,n)=>gat(t,r,n,{callee:t.parse}),t.safeParse=(r,n)=>Eat(t,r,n),t.parseAsync=async(r,n)=>yat(t,r,n,{callee:t.parseAsync}),t.safeParseAsync=async(r,n)=>bat(t,r,n),t.spa=t.safeParseAsync,t.refine=(r,n)=>t.check(G0r(r,n)),t.superRefine=r=>t.check(V0r(r)),t.overwrite=r=>t.check(Ay(r)),t.optional=()=>si(t),t.nullable=()=>Iat(t),t.nullish=()=>si(Iat(t)),t.nonoptional=r=>U0r(t,r),t.array=()=>pr(t),t.or=r=>En([t,r]),t.and=r=>c8(t,r),t.transform=r=>Fde(t,Rat(r)),t.default=r=>L0r(t,r),t.prefault=r=>P0r(t,r),t.catch=r=>q0r(t,r),t.pipe=r=>Fde(t,r),t.readonly=()=>H0r(t),t.describe=r=>{let n=t.clone();return pT.add(n,{description:r}),n},Object.defineProperty(t,"description",{get(){return pT.get(t)?.description},configurable:!0}),t.meta=(...r)=>{if(r.length===0)return pT.get(t);let n=t.clone();return pT.add(n,r[0]),n},t.isOptional=()=>t.safeParse(void 0).success,t.isNullable=()=>t.safeParse(null).success,t)),wat=ge("_ZodString",(t,e)=>{t8.init(t,e),ai.init(t,e);let r=t._zod.bag;t.format=r.format??null,t.minLength=r.minimum??null,t.maxLength=r.maximum??null,t.regex=(...n)=>t.check(bde(...n)),t.includes=(...n)=>t.check(Ide(...n)),t.startsWith=(...n)=>t.check(wde(...n)),t.endsWith=(...n)=>t.check(_de(...n)),t.min=(...n)=>t.check(_v(...n)),t.max=(...n)=>t.check(o8(...n)),t.length=(...n)=>t.check(s8(...n)),t.nonempty=(...n)=>t.check(_v(1,...n)),t.lowercase=n=>t.check(Cde(n)),t.uppercase=n=>t.check(vde(n)),t.trim=()=>t.check(Sde()),t.normalize=(...n)=>t.check(Dde(...n)),t.toLowerCase=()=>t.check(Rde()),t.toUpperCase=()=>t.check(Bde())}),o0r=ge("ZodString",(t,e)=>{t8.init(t,e),wat.init(t,e),t.email=r=>t.check(kst(s0r,r)),t.url=r=>t.check(Lst(a0r,r)),t.jwt=r=>t.check(Kst(v0r,r)),t.emoji=r=>t.check(Mst(c0r,r)),t.guid=r=>t.check(Ede(Cat,r)),t.uuid=r=>t.check(Nst(a8,r)),t.uuidv4=r=>t.check(Ost(a8,r)),t.uuidv6=r=>t.check(Fst(a8,r)),t.uuidv7=r=>t.check(Qst(a8,r)),t.nanoid=r=>t.check(Pst(l0r,r)),t.guid=r=>t.check(Ede(Cat,r)),t.cuid=r=>t.check(Ust(u0r,r)),t.cuid2=r=>t.check($st(d0r,r)),t.ulid=r=>t.check(qst(f0r,r)),t.base64=r=>t.check(Jst(E0r,r)),t.base64url=r=>t.check(Wst(b0r,r)),t.xid=r=>t.check(jst(p0r,r)),t.ksuid=r=>t.check(Yst(h0r,r)),t.ipv4=r=>t.check(Hst(m0r,r)),t.ipv6=r=>t.check(zst(A0r,r)),t.cidrv4=r=>t.check(Gst(g0r,r)),t.cidrv6=r=>t.check(Vst(y0r,r)),t.e164=r=>t.check(Zst(C0r,r)),t.datetime=r=>t.check(xde(r)),t.date=r=>t.check(Tde(r)),t.time=r=>t.check(kde(r)),t.duration=r=>t.check(Nde(r))});function me(t){return Tst(o0r,t)}var Yn=ge("ZodStringFormat",(t,e)=>{Sn.init(t,e),wat.init(t,e)}),s0r=ge("ZodEmail",(t,e)=>{Uot.init(t,e),Yn.init(t,e)});var Cat=ge("ZodGUID",(t,e)=>{Mot.init(t,e),Yn.init(t,e)});var a8=ge("ZodUUID",(t,e)=>{Pot.init(t,e),Yn.init(t,e)});var a0r=ge("ZodURL",(t,e)=>{$ot.init(t,e),Yn.init(t,e)});var c0r=ge("ZodEmoji",(t,e)=>{qot.init(t,e),Yn.init(t,e)});var l0r=ge("ZodNanoID",(t,e)=>{jot.init(t,e),Yn.init(t,e)});var u0r=ge("ZodCUID",(t,e)=>{Yot.init(t,e),Yn.init(t,e)});var d0r=ge("ZodCUID2",(t,e)=>{Hot.init(t,e),Yn.init(t,e)});var f0r=ge("ZodULID",(t,e)=>{zot.init(t,e),Yn.init(t,e)});var p0r=ge("ZodXID",(t,e)=>{Got.init(t,e),Yn.init(t,e)});var h0r=ge("ZodKSUID",(t,e)=>{Vot.init(t,e),Yn.init(t,e)});var m0r=ge("ZodIPv4",(t,e)=>{Xot.init(t,e),Yn.init(t,e)});var A0r=ge("ZodIPv6",(t,e)=>{est.init(t,e),Yn.init(t,e)});var g0r=ge("ZodCIDRv4",(t,e)=>{tst.init(t,e),Yn.init(t,e)});var y0r=ge("ZodCIDRv6",(t,e)=>{rst.init(t,e),Yn.init(t,e)});var E0r=ge("ZodBase64",(t,e)=>{ist.init(t,e),Yn.init(t,e)});var b0r=ge("ZodBase64URL",(t,e)=>{ost.init(t,e),Yn.init(t,e)});var C0r=ge("ZodE164",(t,e)=>{sst.init(t,e),Yn.init(t,e)});var v0r=ge("ZodJWT",(t,e)=>{ast.init(t,e),Yn.init(t,e)});var _at=ge("ZodNumber",(t,e)=>{Ade.init(t,e),ai.init(t,e),t.gt=(n,i)=>t.check(n8(n,i)),t.gte=(n,i)=>t.check(mT(n,i)),t.min=(n,i)=>t.check(mT(n,i)),t.lt=(n,i)=>t.check(r8(n,i)),t.lte=(n,i)=>t.check(hT(n,i)),t.max=(n,i)=>t.check(hT(n,i)),t.int=n=>t.check(vat(n)),t.safe=n=>t.check(vat(n)),t.positive=n=>t.check(n8(0,n)),t.nonnegative=n=>t.check(mT(0,n)),t.negative=n=>t.check(r8(0,n)),t.nonpositive=n=>t.check(hT(0,n)),t.multipleOf=(n,i)=>t.check(i8(n,i)),t.step=(n,i)=>t.check(i8(n,i)),t.finite=()=>t;let r=t._zod.bag;t.minValue=Math.max(r.minimum??Number.NEGATIVE_INFINITY,r.exclusiveMinimum??Number.NEGATIVE_INFINITY)??null,t.maxValue=Math.min(r.maximum??Number.POSITIVE_INFINITY,r.exclusiveMaximum??Number.POSITIVE_INFINITY)??null,t.isInt=(r.format??"").includes("int")||Number.isSafeInteger(r.multipleOf??.5),t.isFinite=!0,t.format=r.format??null});function Kr(t){return nat(_at,t)}var I0r=ge("ZodNumberFormat",(t,e)=>{cst.init(t,e),_at.init(t,e)});function vat(t){return iat(I0r,t)}var w0r=ge("ZodBoolean",(t,e)=>{lst.init(t,e),ai.init(t,e)});function po(t){return oat(w0r,t)}var _0r=ge("ZodNull",(t,e)=>{ust.init(t,e),ai.init(t,e)});function Qde(t){return sat(_0r,t)}var D0r=ge("ZodUnknown",(t,e)=>{dst.init(t,e),ai.init(t,e)});function Hn(){return aat(D0r)}var S0r=ge("ZodNever",(t,e)=>{fst.init(t,e),ai.init(t,e)});function R0r(t){return cat(S0r,t)}var B0r=ge("ZodArray",(t,e)=>{pst.init(t,e),ai.init(t,e),t.element=e.element,t.min=(r,n)=>t.check(_v(r,n)),t.nonempty=r=>t.check(_v(1,r)),t.max=(r,n)=>t.check(o8(r,n)),t.length=(r,n)=>t.check(s8(r,n)),t.unwrap=()=>t.element});function pr(t,e){return lat(B0r,t,e)}var Dat=ge("ZodObject",(t,e)=>{hst.init(t,e),ai.init(t,e),Lr.defineLazy(t,"shape",()=>e.shape),t.keyof=()=>oa(Object.keys(t._zod.def.shape)),t.catchall=r=>t.clone({...t._zod.def,catchall:r}),t.passthrough=()=>t.clone({...t._zod.def,catchall:Hn()}),t.loose=()=>t.clone({...t._zod.def,catchall:Hn()}),t.strict=()=>t.clone({...t._zod.def,catchall:R0r()}),t.strip=()=>t.clone({...t._zod.def,catchall:void 0}),t.extend=r=>Lr.extend(t,r),t.merge=r=>Lr.merge(t,r),t.pick=r=>Lr.pick(t,r),t.omit=r=>Lr.omit(t,r),t.partial=(...r)=>Lr.partial(Bat,t,r[0]),t.required=(...r)=>Lr.required(xat,t,r[0])});function Je(t,e){let r={type:"object",get shape(){return Lr.assignProp(this,"shape",{...t}),this.shape},...Lr.normalizeParams(e)};return new Dat(r)}function ks(t,e){return new Dat({type:"object",get shape(){return Lr.assignProp(this,"shape",{...t}),this.shape},catchall:Hn(),...Lr.normalizeParams(e)})}var Sat=ge("ZodUnion",(t,e)=>{gde.init(t,e),ai.init(t,e),t.options=e.options});function En(t,e){return new Sat({type:"union",options:t,...Lr.normalizeParams(e)})}var x0r=ge("ZodDiscriminatedUnion",(t,e)=>{Sat.init(t,e),mst.init(t,e)});function Lde(t,e,r){return new x0r({type:"union",options:e,discriminator:t,...Lr.normalizeParams(r)})}var T0r=ge("ZodIntersection",(t,e)=>{Ast.init(t,e),ai.init(t,e)});function c8(t,e){return new T0r({type:"intersection",left:t,right:e})}var k0r=ge("ZodRecord",(t,e)=>{gst.init(t,e),ai.init(t,e),t.keyType=e.keyType,t.valueType=e.valueType});function zn(t,e,r){return new k0r({type:"record",keyType:t,valueType:e,...Lr.normalizeParams(r)})}var Ode=ge("ZodEnum",(t,e)=>{yst.init(t,e),ai.init(t,e),t.enum=e.entries,t.options=Object.values(e.entries);let r=new Set(Object.keys(e.entries));t.extract=(n,i)=>{let o={};for(let s of n)if(r.has(s))o[s]=e.entries[s];else throw new Error(`Key ${s} not found in enum`);return new Ode({...e,checks:[],...Lr.normalizeParams(i),entries:o})},t.exclude=(n,i)=>{let o={...e.entries};for(let s of n)if(r.has(s))delete o[s];else throw new Error(`Key ${s} not found in enum`);return new Ode({...e,checks:[],...Lr.normalizeParams(i),entries:o})}});function oa(t,e){let r=Array.isArray(t)?Object.fromEntries(t.map(n=>[n,n])):t;return new Ode({type:"enum",entries:r,...Lr.normalizeParams(e)})}var N0r=ge("ZodLiteral",(t,e)=>{Est.init(t,e),ai.init(t,e),t.values=new Set(e.values),Object.defineProperty(t,"value",{get(){if(e.values.length>1)throw new Error("This schema contains multiple valid literal values. Use `.values` instead.");return e.values[0]}})});function st(t,e){return new N0r({type:"literal",values:Array.isArray(t)?t:[t],...Lr.normalizeParams(e)})}var O0r=ge("ZodTransform",(t,e)=>{bst.init(t,e),ai.init(t,e),t._zod.parse=(r,n)=>{r.addIssue=o=>{if(typeof o=="string")r.issues.push(Lr.issue(o,r.value,e));else{let s=o;s.fatal&&(s.continue=!1),s.code??(s.code="custom"),s.input??(s.input=r.value),s.inst??(s.inst=t),s.continue??(s.continue=!0),r.issues.push(Lr.issue(s))}};let i=e.transform(r.value,r);return i instanceof Promise?i.then(o=>(r.value=o,r)):(r.value=i,r)}});function Rat(t){return new O0r({type:"transform",transform:t})}var Bat=ge("ZodOptional",(t,e)=>{Cst.init(t,e),ai.init(t,e),t.unwrap=()=>t._zod.def.innerType});function si(t){return new Bat({type:"optional",innerType:t})}var F0r=ge("ZodNullable",(t,e)=>{vst.init(t,e),ai.init(t,e),t.unwrap=()=>t._zod.def.innerType});function Iat(t){return new F0r({type:"nullable",innerType:t})}var Q0r=ge("ZodDefault",(t,e)=>{Ist.init(t,e),ai.init(t,e),t.unwrap=()=>t._zod.def.innerType,t.removeDefault=t.unwrap});function L0r(t,e){return new Q0r({type:"default",innerType:t,get defaultValue(){return typeof e=="function"?e():e}})}var M0r=ge("ZodPrefault",(t,e)=>{wst.init(t,e),ai.init(t,e),t.unwrap=()=>t._zod.def.innerType});function P0r(t,e){return new M0r({type:"prefault",innerType:t,get defaultValue(){return typeof e=="function"?e():e}})}var xat=ge("ZodNonOptional",(t,e)=>{_st.init(t,e),ai.init(t,e),t.unwrap=()=>t._zod.def.innerType});function U0r(t,e){return new xat({type:"nonoptional",innerType:t,...Lr.normalizeParams(e)})}var $0r=ge("ZodCatch",(t,e)=>{Dst.init(t,e),ai.init(t,e),t.unwrap=()=>t._zod.def.innerType,t.removeCatch=t.unwrap});function q0r(t,e){return new $0r({type:"catch",innerType:t,catchValue:typeof e=="function"?e:()=>e})}var j0r=ge("ZodPipe",(t,e)=>{Sst.init(t,e),ai.init(t,e),t.in=e.in,t.out=e.out});function Fde(t,e){return new j0r({type:"pipe",in:t,out:e})}var Y0r=ge("ZodReadonly",(t,e)=>{Rst.init(t,e),ai.init(t,e)});function H0r(t){return new Y0r({type:"readonly",innerType:t})}var Tat=ge("ZodCustom",(t,e)=>{Bst.init(t,e),ai.init(t,e)});function z0r(t){let e=new is({check:"custom"});return e._zod.check=t,e}function kat(t,e){return uat(Tat,t??(()=>!0),e)}function G0r(t,e={}){return dat(Tat,t,e)}function V0r(t){let e=z0r(r=>(r.addIssue=n=>{if(typeof n=="string")r.issues.push(Lr.issue(n,r.value,e._zod.def));else{let i=n;i.fatal&&(i.continue=!1),i.code??(i.code="custom"),i.input??(i.input=r.value),i.inst??(i.inst=e),i.continue??(i.continue=!e._zod.def.abort),r.issues.push(Lr.issue(i))}},t(r.value,r)));return e}function Mde(t,e){return Fde(Rat(t),e)}Lc(xst());var Ude="2025-11-25";var Nat=[Ude,"2025-06-18","2025-03-26","2024-11-05","2024-10-07"],Jh="io.modelcontextprotocol/related-task",u8="2.0",xo=kat(t=>t!==null&&(typeof t=="object"||typeof t=="function")),Oat=En([me(),Kr().int()]),Fat=me(),oun=ks({ttl:En([Kr(),Qde()]).optional(),pollInterval:Kr().optional()}),J0r=Je({ttl:Kr().optional()}),W0r=Je({taskId:me()}),$de=ks({progressToken:Oat.optional(),[Jh]:W0r.optional()}),ja=Je({_meta:$de.optional()}),ET=ja.extend({task:J0r.optional()}),Qat=t=>ET.safeParse(t).success,To=Je({method:me(),params:ja.loose().optional()}),Mc=Je({_meta:$de.optional()}),Pc=Je({method:me(),params:Mc.loose().optional()}),ko=ks({_meta:$de.optional()}),d8=En([me(),Kr().int()]),Lat=Je({jsonrpc:st(u8),id:d8,...To.shape}).strict(),qde=t=>Lat.safeParse(t).success,Mat=Je({jsonrpc:st(u8),...Pc.shape}).strict(),Pat=t=>Mat.safeParse(t).success,jde=Je({jsonrpc:st(u8),id:d8,result:ko}).strict(),bT=t=>jde.safeParse(t).success;var $t;(function(t){t[t.ConnectionClosed=-32e3]="ConnectionClosed",t[t.RequestTimeout=-32001]="RequestTimeout",t[t.ParseError=-32700]="ParseError",t[t.InvalidRequest=-32600]="InvalidRequest",t[t.MethodNotFound=-32601]="MethodNotFound",t[t.InvalidParams=-32602]="InvalidParams",t[t.InternalError=-32603]="InternalError",t[t.UrlElicitationRequired=-32042]="UrlElicitationRequired"})($t||($t={}));var Yde=Je({jsonrpc:st(u8),id:d8.optional(),error:Je({code:Kr().int(),message:me(),data:Hn().optional()})}).strict();var Uat=t=>Yde.safeParse(t).success;var $at=En([Lat,Mat,jde,Yde]),sun=En([jde,Yde]),f8=ko.strict(),Z0r=Mc.extend({requestId:d8.optional(),reason:me().optional()}),p8=Pc.extend({method:st("notifications/cancelled"),params:Z0r}),K0r=Je({src:me(),mimeType:me().optional(),sizes:pr(me()).optional(),theme:oa(["light","dark"]).optional()}),CT=Je({icons:pr(K0r).optional()}),Dv=Je({name:me(),title:me().optional()}),qat=Dv.extend({...Dv.shape,...CT.shape,version:me(),websiteUrl:me().optional(),description:me().optional()}),X0r=c8(Je({applyDefaults:po().optional()}),zn(me(),Hn())),evr=Mde(t=>t&&typeof t=="object"&&!Array.isArray(t)&&Object.keys(t).length===0?{form:{}}:t,c8(Je({form:X0r.optional(),url:xo.optional()}),zn(me(),Hn()).optional())),tvr=ks({list:xo.optional(),cancel:xo.optional(),requests:ks({sampling:ks({createMessage:xo.optional()}).optional(),elicitation:ks({create:xo.optional()}).optional()}).optional()}),rvr=ks({list:xo.optional(),cancel:xo.optional(),requests:ks({tools:ks({call:xo.optional()}).optional()}).optional()}),nvr=Je({experimental:zn(me(),xo).optional(),sampling:Je({context:xo.optional(),tools:xo.optional()}).optional(),elicitation:evr.optional(),roots:Je({listChanged:po().optional()}).optional(),tasks:tvr.optional()}),ivr=ja.extend({protocolVersion:me(),capabilities:nvr,clientInfo:qat}),Hde=To.extend({method:st("initialize"),params:ivr});var ovr=Je({experimental:zn(me(),xo).optional(),logging:xo.optional(),completions:xo.optional(),prompts:Je({listChanged:po().optional()}).optional(),resources:Je({subscribe:po().optional(),listChanged:po().optional()}).optional(),tools:Je({listChanged:po().optional()}).optional(),tasks:rvr.optional()}),svr=ko.extend({protocolVersion:me(),capabilities:ovr,serverInfo:qat,instructions:me().optional()}),zde=Pc.extend({method:st("notifications/initialized"),params:Mc.optional()});var h8=To.extend({method:st("ping"),params:ja.optional()}),avr=Je({progress:Kr(),total:si(Kr()),message:si(me())}),cvr=Je({...Mc.shape,...avr.shape,progressToken:Oat}),m8=Pc.extend({method:st("notifications/progress"),params:cvr}),lvr=ja.extend({cursor:Fat.optional()}),vT=To.extend({params:lvr.optional()}),IT=ko.extend({nextCursor:Fat.optional()}),uvr=oa(["working","input_required","completed","failed","cancelled"]),wT=Je({taskId:me(),status:uvr,ttl:En([Kr(),Qde()]),createdAt:me(),lastUpdatedAt:me(),pollInterval:si(Kr()),statusMessage:si(me())}),Sv=ko.extend({task:wT}),dvr=Mc.merge(wT),_T=Pc.extend({method:st("notifications/tasks/status"),params:dvr}),A8=To.extend({method:st("tasks/get"),params:ja.extend({taskId:me()})}),g8=ko.merge(wT),y8=To.extend({method:st("tasks/result"),params:ja.extend({taskId:me()})}),aun=ko.loose(),E8=vT.extend({method:st("tasks/list")}),b8=IT.extend({tasks:pr(wT)}),C8=To.extend({method:st("tasks/cancel"),params:ja.extend({taskId:me()})}),jat=ko.merge(wT),Yat=Je({uri:me(),mimeType:si(me()),_meta:zn(me(),Hn()).optional()}),Hat=Yat.extend({text:me()}),Gde=me().refine(t=>{try{return atob(t),!0}catch{return!1}},{message:"Invalid Base64 string"}),zat=Yat.extend({blob:Gde}),DT=oa(["user","assistant"]),Rv=Je({audience:pr(DT).optional(),priority:Kr().min(0).max(1).optional(),lastModified:gT.datetime({offset:!0}).optional()}),Gat=Je({...Dv.shape,...CT.shape,uri:me(),description:si(me()),mimeType:si(me()),annotations:Rv.optional(),_meta:si(ks({}))}),fvr=Je({...Dv.shape,...CT.shape,uriTemplate:me(),description:si(me()),mimeType:si(me()),annotations:Rv.optional(),_meta:si(ks({}))}),Vde=vT.extend({method:st("resources/list")}),pvr=IT.extend({resources:pr(Gat)}),hvr=vT.extend({method:st("resources/templates/list")}),mvr=IT.extend({resourceTemplates:pr(fvr)}),Jde=ja.extend({uri:me()}),Avr=Jde,Wde=To.extend({method:st("resources/read"),params:Avr}),gvr=ko.extend({contents:pr(En([Hat,zat]))}),yvr=Pc.extend({method:st("notifications/resources/list_changed"),params:Mc.optional()}),Evr=Jde,bvr=To.extend({method:st("resources/subscribe"),params:Evr}),Cvr=Jde,vvr=To.extend({method:st("resources/unsubscribe"),params:Cvr}),Ivr=Mc.extend({uri:me()}),wvr=Pc.extend({method:st("notifications/resources/updated"),params:Ivr}),_vr=Je({name:me(),description:si(me()),required:si(po())}),Dvr=Je({...Dv.shape,...CT.shape,description:si(me()),arguments:si(pr(_vr)),_meta:si(ks({}))}),Svr=vT.extend({method:st("prompts/list")}),Rvr=IT.extend({prompts:pr(Dvr)}),Bvr=ja.extend({name:me(),arguments:zn(me(),me()).optional()}),xvr=To.extend({method:st("prompts/get"),params:Bvr}),Zde=Je({type:st("text"),text:me(),annotations:Rv.optional(),_meta:zn(me(),Hn()).optional()}),Kde=Je({type:st("image"),data:Gde,mimeType:me(),annotations:Rv.optional(),_meta:zn(me(),Hn()).optional()}),Xde=Je({type:st("audio"),data:Gde,mimeType:me(),annotations:Rv.optional(),_meta:zn(me(),Hn()).optional()}),Tvr=Je({type:st("tool_use"),name:me(),id:me(),input:zn(me(),Hn()),_meta:zn(me(),Hn()).optional()}),kvr=Je({type:st("resource"),resource:En([Hat,zat]),annotations:Rv.optional(),_meta:zn(me(),Hn()).optional()}),Nvr=Gat.extend({type:st("resource_link")}),efe=En([Zde,Kde,Xde,Nvr,kvr]),Ovr=Je({role:DT,content:efe}),Fvr=ko.extend({description:me().optional(),messages:pr(Ovr)}),Qvr=Pc.extend({method:st("notifications/prompts/list_changed"),params:Mc.optional()}),Lvr=Je({title:me().optional(),readOnlyHint:po().optional(),destructiveHint:po().optional(),idempotentHint:po().optional(),openWorldHint:po().optional()}),Mvr=Je({taskSupport:oa(["required","optional","forbidden"]).optional()}),Vat=Je({...Dv.shape,...CT.shape,description:me().optional(),inputSchema:Je({type:st("object"),properties:zn(me(),xo).optional(),required:pr(me()).optional()}).catchall(Hn()),outputSchema:Je({type:st("object"),properties:zn(me(),xo).optional(),required:pr(me()).optional()}).catchall(Hn()).optional(),annotations:Lvr.optional(),execution:Mvr.optional(),_meta:zn(me(),Hn()).optional()}),tfe=vT.extend({method:st("tools/list")}),Pvr=IT.extend({tools:pr(Vat)}),v8=ko.extend({content:pr(efe).default([]),structuredContent:zn(me(),Hn()).optional(),isError:po().optional()}),cun=v8.or(ko.extend({toolResult:Hn()})),Uvr=ET.extend({name:me(),arguments:zn(me(),Hn()).optional()}),ST=To.extend({method:st("tools/call"),params:Uvr}),$vr=Pc.extend({method:st("notifications/tools/list_changed"),params:Mc.optional()}),lun=Je({autoRefresh:po().default(!0),debounceMs:Kr().int().nonnegative().default(300)}),RT=oa(["debug","info","notice","warning","error","critical","alert","emergency"]),qvr=ja.extend({level:RT}),rfe=To.extend({method:st("logging/setLevel"),params:qvr}),jvr=Mc.extend({level:RT,logger:me().optional(),data:Hn()}),Yvr=Pc.extend({method:st("notifications/message"),params:jvr}),Hvr=Je({name:me().optional()}),zvr=Je({hints:pr(Hvr).optional(),costPriority:Kr().min(0).max(1).optional(),speedPriority:Kr().min(0).max(1).optional(),intelligencePriority:Kr().min(0).max(1).optional()}),Gvr=Je({mode:oa(["auto","required","none"]).optional()}),Vvr=Je({type:st("tool_result"),toolUseId:me().describe("The unique identifier for the corresponding tool call."),content:pr(efe).default([]),structuredContent:Je({}).loose().optional(),isError:po().optional(),_meta:zn(me(),Hn()).optional()}),Jvr=Lde("type",[Zde,Kde,Xde]),l8=Lde("type",[Zde,Kde,Xde,Tvr,Vvr]),Wvr=Je({role:DT,content:En([l8,pr(l8)]),_meta:zn(me(),Hn()).optional()}),Zvr=ET.extend({messages:pr(Wvr),modelPreferences:zvr.optional(),systemPrompt:me().optional(),includeContext:oa(["none","thisServer","allServers"]).optional(),temperature:Kr().optional(),maxTokens:Kr().int(),stopSequences:pr(me()).optional(),metadata:xo.optional(),tools:pr(Vat).optional(),toolChoice:Gvr.optional()}),Kvr=To.extend({method:st("sampling/createMessage"),params:Zvr}),BT=ko.extend({model:me(),stopReason:si(oa(["endTurn","stopSequence","maxTokens"]).or(me())),role:DT,content:Jvr}),nfe=ko.extend({model:me(),stopReason:si(oa(["endTurn","stopSequence","maxTokens","toolUse"]).or(me())),role:DT,content:En([l8,pr(l8)])}),Xvr=Je({type:st("boolean"),title:me().optional(),description:me().optional(),default:po().optional()}),eIr=Je({type:st("string"),title:me().optional(),description:me().optional(),minLength:Kr().optional(),maxLength:Kr().optional(),format:oa(["email","uri","date","date-time"]).optional(),default:me().optional()}),tIr=Je({type:oa(["number","integer"]),title:me().optional(),description:me().optional(),minimum:Kr().optional(),maximum:Kr().optional(),default:Kr().optional()}),rIr=Je({type:st("string"),title:me().optional(),description:me().optional(),enum:pr(me()),default:me().optional()}),nIr=Je({type:st("string"),title:me().optional(),description:me().optional(),oneOf:pr(Je({const:me(),title:me()})),default:me().optional()}),iIr=Je({type:st("string"),title:me().optional(),description:me().optional(),enum:pr(me()),enumNames:pr(me()).optional(),default:me().optional()}),oIr=En([rIr,nIr]),sIr=Je({type:st("array"),title:me().optional(),description:me().optional(),minItems:Kr().optional(),maxItems:Kr().optional(),items:Je({type:st("string"),enum:pr(me())}),default:pr(me()).optional()}),aIr=Je({type:st("array"),title:me().optional(),description:me().optional(),minItems:Kr().optional(),maxItems:Kr().optional(),items:Je({anyOf:pr(Je({const:me(),title:me()}))}),default:pr(me()).optional()}),cIr=En([sIr,aIr]),lIr=En([iIr,oIr,cIr]),uIr=En([lIr,Xvr,eIr,tIr]),dIr=ET.extend({mode:st("form").optional(),message:me(),requestedSchema:Je({type:st("object"),properties:zn(me(),uIr),required:pr(me()).optional()})}),fIr=ET.extend({mode:st("url"),message:me(),elicitationId:me(),url:me().url()}),pIr=En([dIr,fIr]),hIr=To.extend({method:st("elicitation/create"),params:pIr}),mIr=Mc.extend({elicitationId:me()}),AIr=Pc.extend({method:st("notifications/elicitation/complete"),params:mIr}),Bv=ko.extend({action:oa(["accept","decline","cancel"]),content:Mde(t=>t===null?void 0:t,zn(me(),En([me(),Kr(),po(),pr(me())])).optional())}),gIr=Je({type:st("ref/resource"),uri:me()});var yIr=Je({type:st("ref/prompt"),name:me()}),EIr=ja.extend({ref:En([yIr,gIr]),argument:Je({name:me(),value:me()}),context:Je({arguments:zn(me(),me()).optional()}).optional()}),bIr=To.extend({method:st("completion/complete"),params:EIr});var CIr=ko.extend({completion:ks({values:pr(me()).max(100),total:si(Kr().int()),hasMore:si(po())})}),vIr=Je({uri:me().startsWith("file://"),name:me().optional(),_meta:zn(me(),Hn()).optional()}),IIr=To.extend({method:st("roots/list"),params:ja.optional()}),ife=ko.extend({roots:pr(vIr)}),wIr=Pc.extend({method:st("notifications/roots/list_changed"),params:Mc.optional()}),uun=En([h8,Hde,bIr,rfe,xvr,Svr,Vde,hvr,Wde,bvr,vvr,ST,tfe,A8,y8,E8,C8]),dun=En([p8,m8,zde,wIr,_T]),fun=En([f8,BT,nfe,Bv,ife,g8,b8,Sv]),pun=En([h8,Kvr,hIr,IIr,A8,y8,E8,C8]),hun=En([p8,m8,Yvr,wvr,yvr,$vr,Qvr,_T,AIr]),mun=En([f8,svr,CIr,Fvr,Rvr,pvr,mvr,gvr,v8,Pvr,g8,b8,Sv]),kt=class t extends Error{constructor(e,r,n){super(`MCP error ${e}: ${r}`),this.code=e,this.data=n,this.name="McpError"}static fromError(e,r,n){if(e===$t.UrlElicitationRequired&&n){let i=n;if(i.elicitations)return new Pde(i.elicitations,r)}return new t(e,r,n)}},Pde=class extends kt{constructor(e,r=`URL elicitation${e.length>1?"s":""} required`){super($t.UrlElicitationRequired,r,{elicitations:e})}get elicitations(){return this.data?.elicitations??[]}};var I8=class{append(e){this._buffer=this._buffer?Buffer.concat([this._buffer,e]):e}readMessage(){if(!this._buffer)return null;let e=this._buffer.indexOf(`
|
|
1150
1150
|
`);if(e===-1)return null;let r=this._buffer.toString("utf8",0,e).replace(/\r$/,"");return this._buffer=this._buffer.subarray(e+1),_Ir(r)}clear(){this._buffer=void 0}};function _Ir(t){return $at.parse(JSON.parse(t))}function Jat(t){return JSON.stringify(t)+`
|
|
1151
|
-
`}var w8=class{constructor(e=Wat.stdin,r=Wat.stdout){this._stdin=e,this._stdout=r,this._readBuffer=new I8,this._started=!1,this._ondata=n=>{this._readBuffer.append(n),this.processReadBuffer()},this._onerror=n=>{this.onerror?.(n)}}async start(){if(this._started)throw new Error("StdioServerTransport already started! If using Server class, note that connect() calls start() automatically.");this._started=!0,this._stdin.on("data",this._ondata),this._stdin.on("error",this._onerror)}processReadBuffer(){for(;;)try{let e=this._readBuffer.readMessage();if(e===null)break;this.onmessage?.(e)}catch(e){this.onerror?.(e)}}async close(){this._stdin.off("data",this._ondata),this._stdin.off("error",this._onerror),this._stdin.listenerCount("data")===0&&this._stdin.pause(),this._readBuffer.clear(),this.onclose?.()}send(e){return new Promise(r=>{let n=Jat(e);this._stdout.write(n)?r():this._stdout.once("drain",r)})}};rT();NT();hb();xT();rT();function xv(t){return!!t._zod}function Zh(t,e){return xv(t)?dT(t,e):t.safeParse(e)}function S8(t){if(!t)return;let e;if(xv(t)?e=t._zod?.def?.shape:e=t.shape,!!e){if(typeof e=="function")try{return e()}catch{return}return e}}function ect(t){if(xv(t)){let o=t._zod?.def;if(o){if(o.value!==void 0)return o.value;if(Array.isArray(o.values)&&o.values.length>0)return o.values[0]}}let r=t._def;if(r){if(r.value!==void 0)return r.value;if(Array.isArray(r.values)&&r.values.length>0)return r.values[0]}let n=t.value;if(n!==void 0)return n}function Kh(t){return t==="completed"||t==="failed"||t==="cancelled"}var fdn=new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789");function ofe(t){let r=S8(t)?.method;if(!r)throw new Error("Schema is missing a method literal");let n=ect(r);if(typeof n!="string")throw new Error("Schema method literal must be a string");return n}function sfe(t,e){let r=Zh(t,e);if(!r.success)throw r.error;return r.data}var FIr=6e4,R8=class{constructor(e){this._options=e,this._requestMessageId=0,this._requestHandlers=new Map,this._requestHandlerAbortControllers=new Map,this._notificationHandlers=new Map,this._responseHandlers=new Map,this._progressHandlers=new Map,this._timeoutInfo=new Map,this._pendingDebouncedNotifications=new Set,this._taskProgressTokens=new Map,this._requestResolvers=new Map,this.setNotificationHandler(p8,r=>{this._oncancel(r)}),this.setNotificationHandler(m8,r=>{this._onprogress(r)}),this.setRequestHandler(h8,r=>({})),this._taskStore=e?.taskStore,this._taskMessageQueue=e?.taskMessageQueue,this._taskStore&&(this.setRequestHandler(A8,async(r,n)=>{let i=await this._taskStore.getTask(r.params.taskId,n.sessionId);if(!i)throw new kt($t.InvalidParams,"Failed to retrieve task: Task not found");return{...i}}),this.setRequestHandler(y8,async(r,n)=>{let i=async()=>{let o=r.params.taskId;if(this._taskMessageQueue){let a;for(;a=await this._taskMessageQueue.dequeue(o,n.sessionId);){if(a.type==="response"||a.type==="error"){let c=a.message,u=c.id,d=this._requestResolvers.get(u);if(d)if(this._requestResolvers.delete(u),a.type==="response")d(c);else{let f=c,p=new kt(f.error.code,f.error.message,f.error.data);d(p)}else{let f=a.type==="response"?"Response":"Error";this._onerror(new Error(`${f} handler missing for request ${u}`))}continue}await this._transport?.send(a.message,{relatedRequestId:n.requestId})}}let s=await this._taskStore.getTask(o,n.sessionId);if(!s)throw new kt($t.InvalidParams,`Task not found: ${o}`);if(!Kh(s.status))return await this._waitForTaskUpdate(o,n.signal),await i();if(Kh(s.status)){let a=await this._taskStore.getTaskResult(o,n.sessionId);return this._clearTaskQueue(o),{...a,_meta:{...a._meta,[Jh]:{taskId:o}}}}return await i()};return await i()}),this.setRequestHandler(E8,async(r,n)=>{try{let{tasks:i,nextCursor:o}=await this._taskStore.listTasks(r.params?.cursor,n.sessionId);return{tasks:i,nextCursor:o,_meta:{}}}catch(i){throw new kt($t.InvalidParams,`Failed to list tasks: ${i instanceof Error?i.message:String(i)}`)}}),this.setRequestHandler(C8,async(r,n)=>{try{let i=await this._taskStore.getTask(r.params.taskId,n.sessionId);if(!i)throw new kt($t.InvalidParams,`Task not found: ${r.params.taskId}`);if(Kh(i.status))throw new kt($t.InvalidParams,`Cannot cancel task in terminal status: ${i.status}`);await this._taskStore.updateTaskStatus(r.params.taskId,"cancelled","Client cancelled task execution.",n.sessionId),this._clearTaskQueue(r.params.taskId);let o=await this._taskStore.getTask(r.params.taskId,n.sessionId);if(!o)throw new kt($t.InvalidParams,`Task not found after cancellation: ${r.params.taskId}`);return{_meta:{},...o}}catch(i){throw i instanceof kt?i:new kt($t.InvalidRequest,`Failed to cancel task: ${i instanceof Error?i.message:String(i)}`)}}))}async _oncancel(e){if(!e.params.requestId)return;this._requestHandlerAbortControllers.get(e.params.requestId)?.abort(e.params.reason)}_setupTimeout(e,r,n,i,o=!1){this._timeoutInfo.set(e,{timeoutId:setTimeout(i,r),startTime:Date.now(),timeout:r,maxTotalTimeout:n,resetTimeoutOnProgress:o,onTimeout:i})}_resetTimeout(e){let r=this._timeoutInfo.get(e);if(!r)return!1;let n=Date.now()-r.startTime;if(r.maxTotalTimeout&&n>=r.maxTotalTimeout)throw this._timeoutInfo.delete(e),kt.fromError($t.RequestTimeout,"Maximum total timeout exceeded",{maxTotalTimeout:r.maxTotalTimeout,totalElapsed:n});return clearTimeout(r.timeoutId),r.timeoutId=setTimeout(r.onTimeout,r.timeout),!0}_cleanupTimeout(e){let r=this._timeoutInfo.get(e);r&&(clearTimeout(r.timeoutId),this._timeoutInfo.delete(e))}async connect(e){if(this._transport)throw new Error("Already connected to a transport. Call close() before connecting to a new transport, or use a separate Protocol instance per connection.");this._transport=e;let r=this.transport?.onclose;this._transport.onclose=()=>{r?.(),this._onclose()};let n=this.transport?.onerror;this._transport.onerror=o=>{n?.(o),this._onerror(o)};let i=this._transport?.onmessage;this._transport.onmessage=(o,s)=>{i?.(o,s),bT(o)||Uat(o)?this._onresponse(o):qde(o)?this._onrequest(o,s):Pat(o)?this._onnotification(o):this._onerror(new Error(`Unknown message type: ${JSON.stringify(o)}`))},await this._transport.start()}_onclose(){let e=this._responseHandlers;this._responseHandlers=new Map,this._progressHandlers.clear(),this._taskProgressTokens.clear(),this._pendingDebouncedNotifications.clear();for(let n of this._requestHandlerAbortControllers.values())n.abort();this._requestHandlerAbortControllers.clear();let r=kt.fromError($t.ConnectionClosed,"Connection closed");this._transport=void 0,this.onclose?.();for(let n of e.values())n(r)}_onerror(e){this.onerror?.(e)}_onnotification(e){let r=this._notificationHandlers.get(e.method)??this.fallbackNotificationHandler;r!==void 0&&Promise.resolve().then(()=>r(e)).catch(n=>this._onerror(new Error(`Uncaught error in notification handler: ${n}`)))}_onrequest(e,r){let n=this._requestHandlers.get(e.method)??this.fallbackRequestHandler,i=this._transport,o=e.params?._meta?.[Jh]?.taskId;if(n===void 0){let d={jsonrpc:"2.0",id:e.id,error:{code:$t.MethodNotFound,message:"Method not found"}};o&&this._taskMessageQueue?this._enqueueTaskMessage(o,{type:"error",message:d,timestamp:Date.now()},i?.sessionId).catch(f=>this._onerror(new Error(`Failed to enqueue error response: ${f}`))):i?.send(d).catch(f=>this._onerror(new Error(`Failed to send an error response: ${f}`)));return}let s=new AbortController;this._requestHandlerAbortControllers.set(e.id,s);let a=Qat(e.params)?e.params.task:void 0,c=this._taskStore?this.requestTaskStore(e,i?.sessionId):void 0,u={signal:s.signal,sessionId:i?.sessionId,_meta:e.params?._meta,sendNotification:async d=>{if(s.signal.aborted)return;let f={relatedRequestId:e.id};o&&(f.relatedTask={taskId:o}),await this.notification(d,f)},sendRequest:async(d,f,p)=>{if(s.signal.aborted)throw new kt($t.ConnectionClosed,"Request was cancelled");let h={...p,relatedRequestId:e.id};o&&!h.relatedTask&&(h.relatedTask={taskId:o});let m=h.relatedTask?.taskId??o;return m&&c&&await c.updateTaskStatus(m,"input_required"),await this.request(d,f,h)},authInfo:r?.authInfo,requestId:e.id,requestInfo:r?.requestInfo,taskId:o,taskStore:c,taskRequestedTtl:a?.ttl,closeSSEStream:r?.closeSSEStream,closeStandaloneSSEStream:r?.closeStandaloneSSEStream};Promise.resolve().then(()=>{a&&this.assertTaskHandlerCapability(e.method)}).then(()=>n(e,u)).then(async d=>{if(s.signal.aborted)return;let f={result:d,jsonrpc:"2.0",id:e.id};o&&this._taskMessageQueue?await this._enqueueTaskMessage(o,{type:"response",message:f,timestamp:Date.now()},i?.sessionId):await i?.send(f)},async d=>{if(s.signal.aborted)return;let f={jsonrpc:"2.0",id:e.id,error:{code:Number.isSafeInteger(d.code)?d.code:$t.InternalError,message:d.message??"Internal error",...d.data!==void 0&&{data:d.data}}};o&&this._taskMessageQueue?await this._enqueueTaskMessage(o,{type:"error",message:f,timestamp:Date.now()},i?.sessionId):await i?.send(f)}).catch(d=>this._onerror(new Error(`Failed to send response: ${d}`))).finally(()=>{this._requestHandlerAbortControllers.delete(e.id)})}_onprogress(e){let{progressToken:r,...n}=e.params,i=Number(r),o=this._progressHandlers.get(i);if(!o){this._onerror(new Error(`Received a progress notification for an unknown token: ${JSON.stringify(e)}`));return}let s=this._responseHandlers.get(i),a=this._timeoutInfo.get(i);if(a&&s&&a.resetTimeoutOnProgress)try{this._resetTimeout(i)}catch(c){this._responseHandlers.delete(i),this._progressHandlers.delete(i),this._cleanupTimeout(i),s(c);return}o(n)}_onresponse(e){let r=Number(e.id),n=this._requestResolvers.get(r);if(n){if(this._requestResolvers.delete(r),bT(e))n(e);else{let s=new kt(e.error.code,e.error.message,e.error.data);n(s)}return}let i=this._responseHandlers.get(r);if(i===void 0){this._onerror(new Error(`Received a response for an unknown message ID: ${JSON.stringify(e)}`));return}this._responseHandlers.delete(r),this._cleanupTimeout(r);let o=!1;if(bT(e)&&e.result&&typeof e.result=="object"){let s=e.result;if(s.task&&typeof s.task=="object"){let a=s.task;typeof a.taskId=="string"&&(o=!0,this._taskProgressTokens.set(a.taskId,r))}}if(o||this._progressHandlers.delete(r),bT(e))i(e);else{let s=kt.fromError(e.error.code,e.error.message,e.error.data);i(s)}}get transport(){return this._transport}async close(){await this._transport?.close()}async*requestStream(e,r,n){let{task:i}=n??{};if(!i){try{yield{type:"result",result:await this.request(e,r,n)}}catch(s){yield{type:"error",error:s instanceof kt?s:new kt($t.InternalError,String(s))}}return}let o;try{let s=await this.request(e,Sv,n);if(s.task)o=s.task.taskId,yield{type:"taskCreated",task:s.task};else throw new kt($t.InternalError,"Task creation did not return a task");for(;;){let a=await this.getTask({taskId:o},n);if(yield{type:"taskStatus",task:a},Kh(a.status)){a.status==="completed"?yield{type:"result",result:await this.getTaskResult({taskId:o},r,n)}:a.status==="failed"?yield{type:"error",error:new kt($t.InternalError,`Task ${o} failed`)}:a.status==="cancelled"&&(yield{type:"error",error:new kt($t.InternalError,`Task ${o} was cancelled`)});return}if(a.status==="input_required"){yield{type:"result",result:await this.getTaskResult({taskId:o},r,n)};return}let c=a.pollInterval??this._options?.defaultTaskPollInterval??1e3;await new Promise(u=>setTimeout(u,c)),n?.signal?.throwIfAborted()}}catch(s){yield{type:"error",error:s instanceof kt?s:new kt($t.InternalError,String(s))}}}request(e,r,n){let{relatedRequestId:i,resumptionToken:o,onresumptiontoken:s,task:a,relatedTask:c}=n??{};return new Promise((u,d)=>{let f=C=>{d(C)};if(!this._transport){f(new Error("Not connected"));return}if(this._options?.enforceStrictCapabilities===!0)try{this.assertCapabilityForMethod(e.method),a&&this.assertTaskCapability(e.method)}catch(C){f(C);return}n?.signal?.throwIfAborted();let p=this._requestMessageId++,h={...e,jsonrpc:"2.0",id:p};n?.onprogress&&(this._progressHandlers.set(p,n.onprogress),h.params={...e.params,_meta:{...e.params?._meta||{},progressToken:p}}),a&&(h.params={...h.params,task:a}),c&&(h.params={...h.params,_meta:{...h.params?._meta||{},[Jh]:c}});let m=C=>{this._responseHandlers.delete(p),this._progressHandlers.delete(p),this._cleanupTimeout(p),this._transport?.send({jsonrpc:"2.0",method:"notifications/cancelled",params:{requestId:p,reason:String(C)}},{relatedRequestId:i,resumptionToken:o,onresumptiontoken:s}).catch(v=>this._onerror(new Error(`Failed to send cancellation: ${v}`)));let E=C instanceof kt?C:new kt($t.RequestTimeout,String(C));d(E)};this._responseHandlers.set(p,C=>{if(!n?.signal?.aborted){if(C instanceof Error)return d(C);try{let E=Zh(r,C.result);E.success?u(E.data):d(E.error)}catch(E){d(E)}}}),n?.signal?.addEventListener("abort",()=>{m(n?.signal?.reason)});let A=n?.timeout??FIr,g=()=>m(kt.fromError($t.RequestTimeout,"Request timed out",{timeout:A}));this._setupTimeout(p,A,n?.maxTotalTimeout,g,n?.resetTimeoutOnProgress??!1);let y=c?.taskId;if(y){let C=E=>{let v=this._responseHandlers.get(p);v?v(E):this._onerror(new Error(`Response handler missing for side-channeled request ${p}`))};this._requestResolvers.set(p,C),this._enqueueTaskMessage(y,{type:"request",message:h,timestamp:Date.now()}).catch(E=>{this._cleanupTimeout(p),d(E)})}else this._transport.send(h,{relatedRequestId:i,resumptionToken:o,onresumptiontoken:s}).catch(C=>{this._cleanupTimeout(p),d(C)})})}async getTask(e,r){return this.request({method:"tasks/get",params:e},g8,r)}async getTaskResult(e,r,n){return this.request({method:"tasks/result",params:e},r,n)}async listTasks(e,r){return this.request({method:"tasks/list",params:e},b8,r)}async cancelTask(e,r){return this.request({method:"tasks/cancel",params:e},jat,r)}async notification(e,r){if(!this._transport)throw new Error("Not connected");this.assertNotificationCapability(e.method);let n=r?.relatedTask?.taskId;if(n){let a={...e,jsonrpc:"2.0",params:{...e.params,_meta:{...e.params?._meta||{},[Jh]:r.relatedTask}}};await this._enqueueTaskMessage(n,{type:"notification",message:a,timestamp:Date.now()});return}if((this._options?.debouncedNotificationMethods??[]).includes(e.method)&&!e.params&&!r?.relatedRequestId&&!r?.relatedTask){if(this._pendingDebouncedNotifications.has(e.method))return;this._pendingDebouncedNotifications.add(e.method),Promise.resolve().then(()=>{if(this._pendingDebouncedNotifications.delete(e.method),!this._transport)return;let a={...e,jsonrpc:"2.0"};r?.relatedTask&&(a={...a,params:{...a.params,_meta:{...a.params?._meta||{},[Jh]:r.relatedTask}}}),this._transport?.send(a,r).catch(c=>this._onerror(c))});return}let s={...e,jsonrpc:"2.0"};r?.relatedTask&&(s={...s,params:{...s.params,_meta:{...s.params?._meta||{},[Jh]:r.relatedTask}}}),await this._transport.send(s,r)}setRequestHandler(e,r){let n=ofe(e);this.assertRequestHandlerCapability(n),this._requestHandlers.set(n,(i,o)=>{let s=sfe(e,i);return Promise.resolve(r(s,o))})}removeRequestHandler(e){this._requestHandlers.delete(e)}assertCanSetRequestHandler(e){if(this._requestHandlers.has(e))throw new Error(`A request handler for ${e} already exists, which would be overridden`)}setNotificationHandler(e,r){let n=ofe(e);this._notificationHandlers.set(n,i=>{let o=sfe(e,i);return Promise.resolve(r(o))})}removeNotificationHandler(e){this._notificationHandlers.delete(e)}_cleanupTaskProgressHandler(e){let r=this._taskProgressTokens.get(e);r!==void 0&&(this._progressHandlers.delete(r),this._taskProgressTokens.delete(e))}async _enqueueTaskMessage(e,r,n){if(!this._taskStore||!this._taskMessageQueue)throw new Error("Cannot enqueue task message: taskStore and taskMessageQueue are not configured");let i=this._options?.maxTaskQueueSize;await this._taskMessageQueue.enqueue(e,r,n,i)}async _clearTaskQueue(e,r){if(this._taskMessageQueue){let n=await this._taskMessageQueue.dequeueAll(e,r);for(let i of n)if(i.type==="request"&&qde(i.message)){let o=i.message.id,s=this._requestResolvers.get(o);s?(s(new kt($t.InternalError,"Task cancelled or completed")),this._requestResolvers.delete(o)):this._onerror(new Error(`Resolver missing for request ${o} during task ${e} cleanup`))}}}async _waitForTaskUpdate(e,r){let n=this._options?.defaultTaskPollInterval??1e3;try{let i=await this._taskStore?.getTask(e);i?.pollInterval&&(n=i.pollInterval)}catch{}return new Promise((i,o)=>{if(r.aborted){o(new kt($t.InvalidRequest,"Request cancelled"));return}let s=setTimeout(i,n);r.addEventListener("abort",()=>{clearTimeout(s),o(new kt($t.InvalidRequest,"Request cancelled"))},{once:!0})})}requestTaskStore(e,r){let n=this._taskStore;if(!n)throw new Error("No task store configured");return{createTask:async i=>{if(!e)throw new Error("No request provided");return await n.createTask(i,e.id,{method:e.method,params:e.params},r)},getTask:async i=>{let o=await n.getTask(i,r);if(!o)throw new kt($t.InvalidParams,"Failed to retrieve task: Task not found");return o},storeTaskResult:async(i,o,s)=>{await n.storeTaskResult(i,o,s,r);let a=await n.getTask(i,r);if(a){let c=_T.parse({method:"notifications/tasks/status",params:a});await this.notification(c),Kh(a.status)&&this._cleanupTaskProgressHandler(i)}},getTaskResult:i=>n.getTaskResult(i,r),updateTaskStatus:async(i,o,s)=>{let a=await n.getTask(i,r);if(!a)throw new kt($t.InvalidParams,`Task "${i}" not found - it may have been cleaned up`);if(Kh(a.status))throw new kt($t.InvalidParams,`Cannot update task "${i}" from terminal status "${a.status}" to "${o}". Terminal states (completed, failed, cancelled) cannot transition to other states.`);await n.updateTaskStatus(i,o,s,r);let c=await n.getTask(i,r);if(c){let u=_T.parse({method:"notifications/tasks/status",params:c});await this.notification(u),Kh(c.status)&&this._cleanupTaskProgressHandler(i)}},listTasks:i=>n.listTasks(i,r)}}};function tct(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function rct(t,e){let r={...t};for(let n in e){let i=n,o=e[i];if(o===void 0)continue;let s=r[i];tct(s)&&tct(o)?r[i]={...s,...o}:r[i]=o}return r}var qut=Xr(Hpe(),1),jut=Xr($ut(),1);function DBr(){let t=new qut.default({strict:!1,validateFormats:!0,validateSchema:!1,allErrors:!0});return(0,jut.default)(t),t}var u3=class{constructor(e){this._ajv=e??DBr()}getValidator(e){let r="$id"in e&&typeof e.$id=="string"?this._ajv.getSchema(e.$id)??this._ajv.compile(e):this._ajv.compile(e);return n=>r(n)?{valid:!0,data:n,errorMessage:void 0}:{valid:!1,data:void 0,errorMessage:this._ajv.errorsText(r.errors)}}};var d3=class{constructor(e){this._server=e}requestStream(e,r,n){return this._server.requestStream(e,r,n)}createMessageStream(e,r){let n=this._server.getClientCapabilities();if((e.tools||e.toolChoice)&&!n?.sampling?.tools)throw new Error("Client does not support sampling tools capability.");if(e.messages.length>0){let i=e.messages[e.messages.length-1],o=Array.isArray(i.content)?i.content:[i.content],s=o.some(d=>d.type==="tool_result"),a=e.messages.length>1?e.messages[e.messages.length-2]:void 0,c=a?Array.isArray(a.content)?a.content:[a.content]:[],u=c.some(d=>d.type==="tool_use");if(s){if(o.some(d=>d.type!=="tool_result"))throw new Error("The last message must contain only tool_result content if any is present");if(!u)throw new Error("tool_result blocks are not matching any tool_use from the previous message")}if(u){let d=new Set(c.filter(p=>p.type==="tool_use").map(p=>p.id)),f=new Set(o.filter(p=>p.type==="tool_result").map(p=>p.toolUseId));if(d.size!==f.size||![...d].every(p=>f.has(p)))throw new Error("ids of tool_result blocks and tool_use blocks from previous message do not match")}}return this.requestStream({method:"sampling/createMessage",params:e},BT,r)}elicitInputStream(e,r){let n=this._server.getClientCapabilities(),i=e.mode??"form";switch(i){case"url":{if(!n?.elicitation?.url)throw new Error("Client does not support url elicitation.");break}case"form":{if(!n?.elicitation?.form)throw new Error("Client does not support form elicitation.");break}}let o=i==="form"&&e.mode===void 0?{...e,mode:"form"}:e;return this.requestStream({method:"elicitation/create",params:o},Bv,r)}async getTask(e,r){return this._server.getTask({taskId:e},r)}async getTaskResult(e,r,n){return this._server.getTaskResult({taskId:e},r,n)}async listTasks(e,r){return this._server.listTasks(e?{cursor:e}:void 0,r)}async cancelTask(e,r){return this._server.cancelTask({taskId:e},r)}};function Yut(t,e,r){if(!t)throw new Error(`${r} does not support task creation (required for ${e})`);switch(e){case"tools/call":if(!t.tools?.call)throw new Error(`${r} does not support task creation for tools/call (required for ${e})`);break;default:break}}function Hut(t,e,r){if(!t)throw new Error(`${r} does not support task creation (required for ${e})`);switch(e){case"sampling/createMessage":if(!t.sampling?.createMessage)throw new Error(`${r} does not support task creation for sampling/createMessage (required for ${e})`);break;case"elicitation/create":if(!t.elicitation?.create)throw new Error(`${r} does not support task creation for elicitation/create (required for ${e})`);break;default:break}}var f3=class extends R8{constructor(e,r){super(r),this._serverInfo=e,this._loggingLevels=new Map,this.LOG_LEVEL_SEVERITY=new Map(RT.options.map((n,i)=>[n,i])),this.isMessageIgnored=(n,i)=>{let o=this._loggingLevels.get(i);return o?this.LOG_LEVEL_SEVERITY.get(n)<this.LOG_LEVEL_SEVERITY.get(o):!1},this._capabilities=r?.capabilities??{},this._instructions=r?.instructions,this._jsonSchemaValidator=r?.jsonSchemaValidator??new u3,this.setRequestHandler(Hde,n=>this._oninitialize(n)),this.setNotificationHandler(zde,()=>this.oninitialized?.()),this._capabilities.logging&&this.setRequestHandler(rfe,async(n,i)=>{let o=i.sessionId||i.requestInfo?.headers["mcp-session-id"]||void 0,{level:s}=n.params,a=RT.safeParse(s);return a.success&&this._loggingLevels.set(o,a.data),{}})}get experimental(){return this._experimental||(this._experimental={tasks:new d3(this)}),this._experimental}registerCapabilities(e){if(this.transport)throw new Error("Cannot register capabilities after connecting to transport");this._capabilities=rct(this._capabilities,e)}setRequestHandler(e,r){let i=S8(e)?.method;if(!i)throw new Error("Schema is missing a method literal");let o;if(xv(i)){let a=i;o=a._zod?.def?.value??a.value}else{let a=i;o=a._def?.value??a.value}if(typeof o!="string")throw new Error("Schema method literal must be a string");if(o==="tools/call"){let a=async(c,u)=>{let d=Zh(ST,c);if(!d.success){let m=d.error instanceof Error?d.error.message:String(d.error);throw new kt($t.InvalidParams,`Invalid tools/call request: ${m}`)}let{params:f}=d.data,p=await Promise.resolve(r(c,u));if(f.task){let m=Zh(Sv,p);if(!m.success){let A=m.error instanceof Error?m.error.message:String(m.error);throw new kt($t.InvalidParams,`Invalid task creation result: ${A}`)}return m.data}let h=Zh(v8,p);if(!h.success){let m=h.error instanceof Error?h.error.message:String(h.error);throw new kt($t.InvalidParams,`Invalid tools/call result: ${m}`)}return h.data};return super.setRequestHandler(e,a)}return super.setRequestHandler(e,r)}assertCapabilityForMethod(e){switch(e){case"sampling/createMessage":if(!this._clientCapabilities?.sampling)throw new Error(`Client does not support sampling (required for ${e})`);break;case"elicitation/create":if(!this._clientCapabilities?.elicitation)throw new Error(`Client does not support elicitation (required for ${e})`);break;case"roots/list":if(!this._clientCapabilities?.roots)throw new Error(`Client does not support listing roots (required for ${e})`);break;case"ping":break}}assertNotificationCapability(e){switch(e){case"notifications/message":if(!this._capabilities.logging)throw new Error(`Server does not support logging (required for ${e})`);break;case"notifications/resources/updated":case"notifications/resources/list_changed":if(!this._capabilities.resources)throw new Error(`Server does not support notifying about resources (required for ${e})`);break;case"notifications/tools/list_changed":if(!this._capabilities.tools)throw new Error(`Server does not support notifying of tool list changes (required for ${e})`);break;case"notifications/prompts/list_changed":if(!this._capabilities.prompts)throw new Error(`Server does not support notifying of prompt list changes (required for ${e})`);break;case"notifications/elicitation/complete":if(!this._clientCapabilities?.elicitation?.url)throw new Error(`Client does not support URL elicitation (required for ${e})`);break;case"notifications/cancelled":break;case"notifications/progress":break}}assertRequestHandlerCapability(e){if(this._capabilities)switch(e){case"completion/complete":if(!this._capabilities.completions)throw new Error(`Server does not support completions (required for ${e})`);break;case"logging/setLevel":if(!this._capabilities.logging)throw new Error(`Server does not support logging (required for ${e})`);break;case"prompts/get":case"prompts/list":if(!this._capabilities.prompts)throw new Error(`Server does not support prompts (required for ${e})`);break;case"resources/list":case"resources/templates/list":case"resources/read":if(!this._capabilities.resources)throw new Error(`Server does not support resources (required for ${e})`);break;case"tools/call":case"tools/list":if(!this._capabilities.tools)throw new Error(`Server does not support tools (required for ${e})`);break;case"tasks/get":case"tasks/list":case"tasks/result":case"tasks/cancel":if(!this._capabilities.tasks)throw new Error(`Server does not support tasks capability (required for ${e})`);break;case"ping":case"initialize":break}}assertTaskCapability(e){Hut(this._clientCapabilities?.tasks?.requests,e,"Client")}assertTaskHandlerCapability(e){this._capabilities&&Yut(this._capabilities.tasks?.requests,e,"Server")}async _oninitialize(e){let r=e.params.protocolVersion;return this._clientCapabilities=e.params.capabilities,this._clientVersion=e.params.clientInfo,{protocolVersion:Nat.includes(r)?r:Ude,capabilities:this.getCapabilities(),serverInfo:this._serverInfo,...this._instructions&&{instructions:this._instructions}}}getClientCapabilities(){return this._clientCapabilities}getClientVersion(){return this._clientVersion}getCapabilities(){return this._capabilities}async ping(){return this.request({method:"ping"},f8)}async createMessage(e,r){if((e.tools||e.toolChoice)&&!this._clientCapabilities?.sampling?.tools)throw new Error("Client does not support sampling tools capability.");if(e.messages.length>0){let n=e.messages[e.messages.length-1],i=Array.isArray(n.content)?n.content:[n.content],o=i.some(u=>u.type==="tool_result"),s=e.messages.length>1?e.messages[e.messages.length-2]:void 0,a=s?Array.isArray(s.content)?s.content:[s.content]:[],c=a.some(u=>u.type==="tool_use");if(o){if(i.some(u=>u.type!=="tool_result"))throw new Error("The last message must contain only tool_result content if any is present");if(!c)throw new Error("tool_result blocks are not matching any tool_use from the previous message")}if(c){let u=new Set(a.filter(f=>f.type==="tool_use").map(f=>f.id)),d=new Set(i.filter(f=>f.type==="tool_result").map(f=>f.toolUseId));if(u.size!==d.size||![...u].every(f=>d.has(f)))throw new Error("ids of tool_result blocks and tool_use blocks from previous message do not match")}}return e.tools?this.request({method:"sampling/createMessage",params:e},nfe,r):this.request({method:"sampling/createMessage",params:e},BT,r)}async elicitInput(e,r){switch(e.mode??"form"){case"url":{if(!this._clientCapabilities?.elicitation?.url)throw new Error("Client does not support url elicitation.");let i=e;return this.request({method:"elicitation/create",params:i},Bv,r)}case"form":{if(!this._clientCapabilities?.elicitation?.form)throw new Error("Client does not support form elicitation.");let i=e.mode==="form"?e:{...e,mode:"form"},o=await this.request({method:"elicitation/create",params:i},Bv,r);if(o.action==="accept"&&o.content&&i.requestedSchema)try{let a=this._jsonSchemaValidator.getValidator(i.requestedSchema)(o.content);if(!a.valid)throw new kt($t.InvalidParams,`Elicitation response content does not match requested schema: ${a.errorMessage}`)}catch(s){throw s instanceof kt?s:new kt($t.InternalError,`Error validating elicitation response: ${s instanceof Error?s.message:String(s)}`)}return o}}}createElicitationCompletionNotifier(e,r){if(!this._clientCapabilities?.elicitation?.url)throw new Error("Client does not support URL elicitation (required for notifications/elicitation/complete)");return()=>this.notification({method:"notifications/elicitation/complete",params:{elicitationId:e}},r)}async listRoots(e,r){return this.request({method:"roots/list",params:e},ife,r)}async sendLoggingMessage(e,r){if(this._capabilities.logging&&!this.isMessageIgnored(e.level,r))return this.notification({method:"notifications/message",params:e})}async sendResourceUpdated(e){return this.notification({method:"notifications/resources/updated",params:e})}async sendResourceListChanged(){return this.notification({method:"notifications/resources/list_changed"})}async sendToolListChanged(){return this.notification({method:"notifications/tools/list_changed"})}async sendPromptListChanged(){return this.notification({method:"notifications/prompts/list_changed"})}};py();xT();py();NT();fH();var ql="jot",Jut='Optional but valued: if this action involved a judgment call (which account, which match, an assumption, a risk accepted, a deviation), record it in one line, e.g. "MATCH: treated as distinct from BILL bil_x because references differ". Skip it for mechanical actions.',BBr=["CLASSIFICATION","MATCH","SCOPE","ASSUMPTION","RISK","METHOD","RECOVERY","DEVIATION"],xBr=new RegExp(`^(${BBr.join("|")})\\s*:\\s*`),Vut=20,TBr=6;function kBr(t){if(!(ql in t))return{cleanedInput:t};let{[ql]:e,...r}=t;return{jotText:typeof e=="string"&&e.trim()!==""?e.trim():void 0,cleanedInput:r}}function Wut(t,e){if(t.params[ql])return{cleanedInput:e};let{jotText:r,cleanedInput:n}=kBr(e);return t.readOnly?{cleanedInput:n}:{jotText:r,cleanedInput:n}}function NBr(t){let e=xBr.exec(t);return e?{kind:e[1],call:t.slice(e[0].length)||t}:{call:t}}var OBr=[["RECONCILE",/(?:^|_)reconcile(?:_|$)/],["PAY",/(?:^|_)(?:pay|payment|payout|cash_out|disburse|disbursement|refund)(?:_|$)/],["FINALIZE",/(?:^|_)finalize(?:_|$)/],["DELETE",/(?:^|_)(?:delete|void|discard)(?:_|$)/],["TRIGGER",/(?:^|_)(?:recipe|trigger|execute)(?:_|$)/],["UPDATE",/(?:^|_)update(?:_|$)/],["CREATE",/(?:^|_)create(?:_|$)/]];function FBr(t){let e=t.toLowerCase();for(let[r,n]of OBr)if(n.test(e))return r}function QBr(t,e){let r=FBr(t),n=[],i=new Set,o=(s,a)=>{if(!(n.length>=Vut||a>TBr||!s||typeof s!="object")){if(Array.isArray(s)){for(let c of s)o(c,a+1);return}for(let[c,u]of Object.entries(s)){if(n.length>=Vut)return;c==="resourceId"&&typeof u=="string"&&u&&!i.has(u)?(i.add(u),n.push(u)):o(u,a+1)}}};return o(e,0),n.map(s=>({id:s,...r?{relation:r}:{}}))}function Zut(t,e,r,n){let{kind:i,call:o}=NBr(r),s=QBr(e,n),a={...i?{kind:i}:{},tier:"MEDIUM",call:o,frame:`tool:${e}`,...s.length?{refs:s}:{},writePath:"PIGGYBACK"};gv(t,[a]).catch(c=>{let u=c instanceof Error?c.message:String(c);Promise.resolve().then(()=>(Gut(),zut)).then(({log:d})=>d.warn({tool:e,error:u},"Piggyback jot write failed")).catch(()=>process.stderr.write(`[jots-piggyback] jot write failed (${e}): ${u}
|
|
1151
|
+
`}var w8=class{constructor(e=Wat.stdin,r=Wat.stdout){this._stdin=e,this._stdout=r,this._readBuffer=new I8,this._started=!1,this._ondata=n=>{this._readBuffer.append(n),this.processReadBuffer()},this._onerror=n=>{this.onerror?.(n)}}async start(){if(this._started)throw new Error("StdioServerTransport already started! If using Server class, note that connect() calls start() automatically.");this._started=!0,this._stdin.on("data",this._ondata),this._stdin.on("error",this._onerror)}processReadBuffer(){for(;;)try{let e=this._readBuffer.readMessage();if(e===null)break;this.onmessage?.(e)}catch(e){this.onerror?.(e)}}async close(){this._stdin.off("data",this._ondata),this._stdin.off("error",this._onerror),this._stdin.listenerCount("data")===0&&this._stdin.pause(),this._readBuffer.clear(),this.onclose?.()}send(e){return new Promise(r=>{let n=Jat(e);this._stdout.write(n)?r():this._stdout.once("drain",r)})}};rT();NT();hb();xT();rT();function xv(t){return!!t._zod}function Zh(t,e){return xv(t)?dT(t,e):t.safeParse(e)}function S8(t){if(!t)return;let e;if(xv(t)?e=t._zod?.def?.shape:e=t.shape,!!e){if(typeof e=="function")try{return e()}catch{return}return e}}function ect(t){if(xv(t)){let o=t._zod?.def;if(o){if(o.value!==void 0)return o.value;if(Array.isArray(o.values)&&o.values.length>0)return o.values[0]}}let r=t._def;if(r){if(r.value!==void 0)return r.value;if(Array.isArray(r.values)&&r.values.length>0)return r.values[0]}let n=t.value;if(n!==void 0)return n}function Kh(t){return t==="completed"||t==="failed"||t==="cancelled"}var fdn=new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789");function ofe(t){let r=S8(t)?.method;if(!r)throw new Error("Schema is missing a method literal");let n=ect(r);if(typeof n!="string")throw new Error("Schema method literal must be a string");return n}function sfe(t,e){let r=Zh(t,e);if(!r.success)throw r.error;return r.data}var FIr=6e4,R8=class{constructor(e){this._options=e,this._requestMessageId=0,this._requestHandlers=new Map,this._requestHandlerAbortControllers=new Map,this._notificationHandlers=new Map,this._responseHandlers=new Map,this._progressHandlers=new Map,this._timeoutInfo=new Map,this._pendingDebouncedNotifications=new Set,this._taskProgressTokens=new Map,this._requestResolvers=new Map,this.setNotificationHandler(p8,r=>{this._oncancel(r)}),this.setNotificationHandler(m8,r=>{this._onprogress(r)}),this.setRequestHandler(h8,r=>({})),this._taskStore=e?.taskStore,this._taskMessageQueue=e?.taskMessageQueue,this._taskStore&&(this.setRequestHandler(A8,async(r,n)=>{let i=await this._taskStore.getTask(r.params.taskId,n.sessionId);if(!i)throw new kt($t.InvalidParams,"Failed to retrieve task: Task not found");return{...i}}),this.setRequestHandler(y8,async(r,n)=>{let i=async()=>{let o=r.params.taskId;if(this._taskMessageQueue){let a;for(;a=await this._taskMessageQueue.dequeue(o,n.sessionId);){if(a.type==="response"||a.type==="error"){let c=a.message,u=c.id,d=this._requestResolvers.get(u);if(d)if(this._requestResolvers.delete(u),a.type==="response")d(c);else{let f=c,p=new kt(f.error.code,f.error.message,f.error.data);d(p)}else{let f=a.type==="response"?"Response":"Error";this._onerror(new Error(`${f} handler missing for request ${u}`))}continue}await this._transport?.send(a.message,{relatedRequestId:n.requestId})}}let s=await this._taskStore.getTask(o,n.sessionId);if(!s)throw new kt($t.InvalidParams,`Task not found: ${o}`);if(!Kh(s.status))return await this._waitForTaskUpdate(o,n.signal),await i();if(Kh(s.status)){let a=await this._taskStore.getTaskResult(o,n.sessionId);return this._clearTaskQueue(o),{...a,_meta:{...a._meta,[Jh]:{taskId:o}}}}return await i()};return await i()}),this.setRequestHandler(E8,async(r,n)=>{try{let{tasks:i,nextCursor:o}=await this._taskStore.listTasks(r.params?.cursor,n.sessionId);return{tasks:i,nextCursor:o,_meta:{}}}catch(i){throw new kt($t.InvalidParams,`Failed to list tasks: ${i instanceof Error?i.message:String(i)}`)}}),this.setRequestHandler(C8,async(r,n)=>{try{let i=await this._taskStore.getTask(r.params.taskId,n.sessionId);if(!i)throw new kt($t.InvalidParams,`Task not found: ${r.params.taskId}`);if(Kh(i.status))throw new kt($t.InvalidParams,`Cannot cancel task in terminal status: ${i.status}`);await this._taskStore.updateTaskStatus(r.params.taskId,"cancelled","Client cancelled task execution.",n.sessionId),this._clearTaskQueue(r.params.taskId);let o=await this._taskStore.getTask(r.params.taskId,n.sessionId);if(!o)throw new kt($t.InvalidParams,`Task not found after cancellation: ${r.params.taskId}`);return{_meta:{},...o}}catch(i){throw i instanceof kt?i:new kt($t.InvalidRequest,`Failed to cancel task: ${i instanceof Error?i.message:String(i)}`)}}))}async _oncancel(e){if(!e.params.requestId)return;this._requestHandlerAbortControllers.get(e.params.requestId)?.abort(e.params.reason)}_setupTimeout(e,r,n,i,o=!1){this._timeoutInfo.set(e,{timeoutId:setTimeout(i,r),startTime:Date.now(),timeout:r,maxTotalTimeout:n,resetTimeoutOnProgress:o,onTimeout:i})}_resetTimeout(e){let r=this._timeoutInfo.get(e);if(!r)return!1;let n=Date.now()-r.startTime;if(r.maxTotalTimeout&&n>=r.maxTotalTimeout)throw this._timeoutInfo.delete(e),kt.fromError($t.RequestTimeout,"Maximum total timeout exceeded",{maxTotalTimeout:r.maxTotalTimeout,totalElapsed:n});return clearTimeout(r.timeoutId),r.timeoutId=setTimeout(r.onTimeout,r.timeout),!0}_cleanupTimeout(e){let r=this._timeoutInfo.get(e);r&&(clearTimeout(r.timeoutId),this._timeoutInfo.delete(e))}async connect(e){if(this._transport)throw new Error("Already connected to a transport. Call close() before connecting to a new transport, or use a separate Protocol instance per connection.");this._transport=e;let r=this.transport?.onclose;this._transport.onclose=()=>{r?.(),this._onclose()};let n=this.transport?.onerror;this._transport.onerror=o=>{n?.(o),this._onerror(o)};let i=this._transport?.onmessage;this._transport.onmessage=(o,s)=>{i?.(o,s),bT(o)||Uat(o)?this._onresponse(o):qde(o)?this._onrequest(o,s):Pat(o)?this._onnotification(o):this._onerror(new Error(`Unknown message type: ${JSON.stringify(o)}`))},await this._transport.start()}_onclose(){let e=this._responseHandlers;this._responseHandlers=new Map,this._progressHandlers.clear(),this._taskProgressTokens.clear(),this._pendingDebouncedNotifications.clear();for(let n of this._requestHandlerAbortControllers.values())n.abort();this._requestHandlerAbortControllers.clear();let r=kt.fromError($t.ConnectionClosed,"Connection closed");this._transport=void 0,this.onclose?.();for(let n of e.values())n(r)}_onerror(e){this.onerror?.(e)}_onnotification(e){let r=this._notificationHandlers.get(e.method)??this.fallbackNotificationHandler;r!==void 0&&Promise.resolve().then(()=>r(e)).catch(n=>this._onerror(new Error(`Uncaught error in notification handler: ${n}`)))}_onrequest(e,r){let n=this._requestHandlers.get(e.method)??this.fallbackRequestHandler,i=this._transport,o=e.params?._meta?.[Jh]?.taskId;if(n===void 0){let d={jsonrpc:"2.0",id:e.id,error:{code:$t.MethodNotFound,message:"Method not found"}};o&&this._taskMessageQueue?this._enqueueTaskMessage(o,{type:"error",message:d,timestamp:Date.now()},i?.sessionId).catch(f=>this._onerror(new Error(`Failed to enqueue error response: ${f}`))):i?.send(d).catch(f=>this._onerror(new Error(`Failed to send an error response: ${f}`)));return}let s=new AbortController;this._requestHandlerAbortControllers.set(e.id,s);let a=Qat(e.params)?e.params.task:void 0,c=this._taskStore?this.requestTaskStore(e,i?.sessionId):void 0,u={signal:s.signal,sessionId:i?.sessionId,_meta:e.params?._meta,sendNotification:async d=>{if(s.signal.aborted)return;let f={relatedRequestId:e.id};o&&(f.relatedTask={taskId:o}),await this.notification(d,f)},sendRequest:async(d,f,p)=>{if(s.signal.aborted)throw new kt($t.ConnectionClosed,"Request was cancelled");let h={...p,relatedRequestId:e.id};o&&!h.relatedTask&&(h.relatedTask={taskId:o});let m=h.relatedTask?.taskId??o;return m&&c&&await c.updateTaskStatus(m,"input_required"),await this.request(d,f,h)},authInfo:r?.authInfo,requestId:e.id,requestInfo:r?.requestInfo,taskId:o,taskStore:c,taskRequestedTtl:a?.ttl,closeSSEStream:r?.closeSSEStream,closeStandaloneSSEStream:r?.closeStandaloneSSEStream};Promise.resolve().then(()=>{a&&this.assertTaskHandlerCapability(e.method)}).then(()=>n(e,u)).then(async d=>{if(s.signal.aborted)return;let f={result:d,jsonrpc:"2.0",id:e.id};o&&this._taskMessageQueue?await this._enqueueTaskMessage(o,{type:"response",message:f,timestamp:Date.now()},i?.sessionId):await i?.send(f)},async d=>{if(s.signal.aborted)return;let f={jsonrpc:"2.0",id:e.id,error:{code:Number.isSafeInteger(d.code)?d.code:$t.InternalError,message:d.message??"Internal error",...d.data!==void 0&&{data:d.data}}};o&&this._taskMessageQueue?await this._enqueueTaskMessage(o,{type:"error",message:f,timestamp:Date.now()},i?.sessionId):await i?.send(f)}).catch(d=>this._onerror(new Error(`Failed to send response: ${d}`))).finally(()=>{this._requestHandlerAbortControllers.delete(e.id)})}_onprogress(e){let{progressToken:r,...n}=e.params,i=Number(r),o=this._progressHandlers.get(i);if(!o){this._onerror(new Error(`Received a progress notification for an unknown token: ${JSON.stringify(e)}`));return}let s=this._responseHandlers.get(i),a=this._timeoutInfo.get(i);if(a&&s&&a.resetTimeoutOnProgress)try{this._resetTimeout(i)}catch(c){this._responseHandlers.delete(i),this._progressHandlers.delete(i),this._cleanupTimeout(i),s(c);return}o(n)}_onresponse(e){let r=Number(e.id),n=this._requestResolvers.get(r);if(n){if(this._requestResolvers.delete(r),bT(e))n(e);else{let s=new kt(e.error.code,e.error.message,e.error.data);n(s)}return}let i=this._responseHandlers.get(r);if(i===void 0){this._onerror(new Error(`Received a response for an unknown message ID: ${JSON.stringify(e)}`));return}this._responseHandlers.delete(r),this._cleanupTimeout(r);let o=!1;if(bT(e)&&e.result&&typeof e.result=="object"){let s=e.result;if(s.task&&typeof s.task=="object"){let a=s.task;typeof a.taskId=="string"&&(o=!0,this._taskProgressTokens.set(a.taskId,r))}}if(o||this._progressHandlers.delete(r),bT(e))i(e);else{let s=kt.fromError(e.error.code,e.error.message,e.error.data);i(s)}}get transport(){return this._transport}async close(){await this._transport?.close()}async*requestStream(e,r,n){let{task:i}=n??{};if(!i){try{yield{type:"result",result:await this.request(e,r,n)}}catch(s){yield{type:"error",error:s instanceof kt?s:new kt($t.InternalError,String(s))}}return}let o;try{let s=await this.request(e,Sv,n);if(s.task)o=s.task.taskId,yield{type:"taskCreated",task:s.task};else throw new kt($t.InternalError,"Task creation did not return a task");for(;;){let a=await this.getTask({taskId:o},n);if(yield{type:"taskStatus",task:a},Kh(a.status)){a.status==="completed"?yield{type:"result",result:await this.getTaskResult({taskId:o},r,n)}:a.status==="failed"?yield{type:"error",error:new kt($t.InternalError,`Task ${o} failed`)}:a.status==="cancelled"&&(yield{type:"error",error:new kt($t.InternalError,`Task ${o} was cancelled`)});return}if(a.status==="input_required"){yield{type:"result",result:await this.getTaskResult({taskId:o},r,n)};return}let c=a.pollInterval??this._options?.defaultTaskPollInterval??1e3;await new Promise(u=>setTimeout(u,c)),n?.signal?.throwIfAborted()}}catch(s){yield{type:"error",error:s instanceof kt?s:new kt($t.InternalError,String(s))}}}request(e,r,n){let{relatedRequestId:i,resumptionToken:o,onresumptiontoken:s,task:a,relatedTask:c}=n??{};return new Promise((u,d)=>{let f=C=>{d(C)};if(!this._transport){f(new Error("Not connected"));return}if(this._options?.enforceStrictCapabilities===!0)try{this.assertCapabilityForMethod(e.method),a&&this.assertTaskCapability(e.method)}catch(C){f(C);return}n?.signal?.throwIfAborted();let p=this._requestMessageId++,h={...e,jsonrpc:"2.0",id:p};n?.onprogress&&(this._progressHandlers.set(p,n.onprogress),h.params={...e.params,_meta:{...e.params?._meta||{},progressToken:p}}),a&&(h.params={...h.params,task:a}),c&&(h.params={...h.params,_meta:{...h.params?._meta||{},[Jh]:c}});let m=C=>{this._responseHandlers.delete(p),this._progressHandlers.delete(p),this._cleanupTimeout(p),this._transport?.send({jsonrpc:"2.0",method:"notifications/cancelled",params:{requestId:p,reason:String(C)}},{relatedRequestId:i,resumptionToken:o,onresumptiontoken:s}).catch(v=>this._onerror(new Error(`Failed to send cancellation: ${v}`)));let E=C instanceof kt?C:new kt($t.RequestTimeout,String(C));d(E)};this._responseHandlers.set(p,C=>{if(!n?.signal?.aborted){if(C instanceof Error)return d(C);try{let E=Zh(r,C.result);E.success?u(E.data):d(E.error)}catch(E){d(E)}}}),n?.signal?.addEventListener("abort",()=>{m(n?.signal?.reason)});let A=n?.timeout??FIr,g=()=>m(kt.fromError($t.RequestTimeout,"Request timed out",{timeout:A}));this._setupTimeout(p,A,n?.maxTotalTimeout,g,n?.resetTimeoutOnProgress??!1);let y=c?.taskId;if(y){let C=E=>{let v=this._responseHandlers.get(p);v?v(E):this._onerror(new Error(`Response handler missing for side-channeled request ${p}`))};this._requestResolvers.set(p,C),this._enqueueTaskMessage(y,{type:"request",message:h,timestamp:Date.now()}).catch(E=>{this._cleanupTimeout(p),d(E)})}else this._transport.send(h,{relatedRequestId:i,resumptionToken:o,onresumptiontoken:s}).catch(C=>{this._cleanupTimeout(p),d(C)})})}async getTask(e,r){return this.request({method:"tasks/get",params:e},g8,r)}async getTaskResult(e,r,n){return this.request({method:"tasks/result",params:e},r,n)}async listTasks(e,r){return this.request({method:"tasks/list",params:e},b8,r)}async cancelTask(e,r){return this.request({method:"tasks/cancel",params:e},jat,r)}async notification(e,r){if(!this._transport)throw new Error("Not connected");this.assertNotificationCapability(e.method);let n=r?.relatedTask?.taskId;if(n){let a={...e,jsonrpc:"2.0",params:{...e.params,_meta:{...e.params?._meta||{},[Jh]:r.relatedTask}}};await this._enqueueTaskMessage(n,{type:"notification",message:a,timestamp:Date.now()});return}if((this._options?.debouncedNotificationMethods??[]).includes(e.method)&&!e.params&&!r?.relatedRequestId&&!r?.relatedTask){if(this._pendingDebouncedNotifications.has(e.method))return;this._pendingDebouncedNotifications.add(e.method),Promise.resolve().then(()=>{if(this._pendingDebouncedNotifications.delete(e.method),!this._transport)return;let a={...e,jsonrpc:"2.0"};r?.relatedTask&&(a={...a,params:{...a.params,_meta:{...a.params?._meta||{},[Jh]:r.relatedTask}}}),this._transport?.send(a,r).catch(c=>this._onerror(c))});return}let s={...e,jsonrpc:"2.0"};r?.relatedTask&&(s={...s,params:{...s.params,_meta:{...s.params?._meta||{},[Jh]:r.relatedTask}}}),await this._transport.send(s,r)}setRequestHandler(e,r){let n=ofe(e);this.assertRequestHandlerCapability(n),this._requestHandlers.set(n,(i,o)=>{let s=sfe(e,i);return Promise.resolve(r(s,o))})}removeRequestHandler(e){this._requestHandlers.delete(e)}assertCanSetRequestHandler(e){if(this._requestHandlers.has(e))throw new Error(`A request handler for ${e} already exists, which would be overridden`)}setNotificationHandler(e,r){let n=ofe(e);this._notificationHandlers.set(n,i=>{let o=sfe(e,i);return Promise.resolve(r(o))})}removeNotificationHandler(e){this._notificationHandlers.delete(e)}_cleanupTaskProgressHandler(e){let r=this._taskProgressTokens.get(e);r!==void 0&&(this._progressHandlers.delete(r),this._taskProgressTokens.delete(e))}async _enqueueTaskMessage(e,r,n){if(!this._taskStore||!this._taskMessageQueue)throw new Error("Cannot enqueue task message: taskStore and taskMessageQueue are not configured");let i=this._options?.maxTaskQueueSize;await this._taskMessageQueue.enqueue(e,r,n,i)}async _clearTaskQueue(e,r){if(this._taskMessageQueue){let n=await this._taskMessageQueue.dequeueAll(e,r);for(let i of n)if(i.type==="request"&&qde(i.message)){let o=i.message.id,s=this._requestResolvers.get(o);s?(s(new kt($t.InternalError,"Task cancelled or completed")),this._requestResolvers.delete(o)):this._onerror(new Error(`Resolver missing for request ${o} during task ${e} cleanup`))}}}async _waitForTaskUpdate(e,r){let n=this._options?.defaultTaskPollInterval??1e3;try{let i=await this._taskStore?.getTask(e);i?.pollInterval&&(n=i.pollInterval)}catch{}return new Promise((i,o)=>{if(r.aborted){o(new kt($t.InvalidRequest,"Request cancelled"));return}let s=setTimeout(i,n);r.addEventListener("abort",()=>{clearTimeout(s),o(new kt($t.InvalidRequest,"Request cancelled"))},{once:!0})})}requestTaskStore(e,r){let n=this._taskStore;if(!n)throw new Error("No task store configured");return{createTask:async i=>{if(!e)throw new Error("No request provided");return await n.createTask(i,e.id,{method:e.method,params:e.params},r)},getTask:async i=>{let o=await n.getTask(i,r);if(!o)throw new kt($t.InvalidParams,"Failed to retrieve task: Task not found");return o},storeTaskResult:async(i,o,s)=>{await n.storeTaskResult(i,o,s,r);let a=await n.getTask(i,r);if(a){let c=_T.parse({method:"notifications/tasks/status",params:a});await this.notification(c),Kh(a.status)&&this._cleanupTaskProgressHandler(i)}},getTaskResult:i=>n.getTaskResult(i,r),updateTaskStatus:async(i,o,s)=>{let a=await n.getTask(i,r);if(!a)throw new kt($t.InvalidParams,`Task "${i}" not found - it may have been cleaned up`);if(Kh(a.status))throw new kt($t.InvalidParams,`Cannot update task "${i}" from terminal status "${a.status}" to "${o}". Terminal states (completed, failed, cancelled) cannot transition to other states.`);await n.updateTaskStatus(i,o,s,r);let c=await n.getTask(i,r);if(c){let u=_T.parse({method:"notifications/tasks/status",params:c});await this.notification(u),Kh(c.status)&&this._cleanupTaskProgressHandler(i)}},listTasks:i=>n.listTasks(i,r)}}};function tct(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function rct(t,e){let r={...t};for(let n in e){let i=n,o=e[i];if(o===void 0)continue;let s=r[i];tct(s)&&tct(o)?r[i]={...s,...o}:r[i]=o}return r}var qut=Xr(Hpe(),1),jut=Xr($ut(),1);function DBr(){let t=new qut.default({strict:!1,validateFormats:!0,validateSchema:!1,allErrors:!0});return(0,jut.default)(t),t}var u3=class{constructor(e){this._ajv=e??DBr()}getValidator(e){let r="$id"in e&&typeof e.$id=="string"?this._ajv.getSchema(e.$id)??this._ajv.compile(e):this._ajv.compile(e);return n=>r(n)?{valid:!0,data:n,errorMessage:void 0}:{valid:!1,data:void 0,errorMessage:this._ajv.errorsText(r.errors)}}};var d3=class{constructor(e){this._server=e}requestStream(e,r,n){return this._server.requestStream(e,r,n)}createMessageStream(e,r){let n=this._server.getClientCapabilities();if((e.tools||e.toolChoice)&&!n?.sampling?.tools)throw new Error("Client does not support sampling tools capability.");if(e.messages.length>0){let i=e.messages[e.messages.length-1],o=Array.isArray(i.content)?i.content:[i.content],s=o.some(d=>d.type==="tool_result"),a=e.messages.length>1?e.messages[e.messages.length-2]:void 0,c=a?Array.isArray(a.content)?a.content:[a.content]:[],u=c.some(d=>d.type==="tool_use");if(s){if(o.some(d=>d.type!=="tool_result"))throw new Error("The last message must contain only tool_result content if any is present");if(!u)throw new Error("tool_result blocks are not matching any tool_use from the previous message")}if(u){let d=new Set(c.filter(p=>p.type==="tool_use").map(p=>p.id)),f=new Set(o.filter(p=>p.type==="tool_result").map(p=>p.toolUseId));if(d.size!==f.size||![...d].every(p=>f.has(p)))throw new Error("ids of tool_result blocks and tool_use blocks from previous message do not match")}}return this.requestStream({method:"sampling/createMessage",params:e},BT,r)}elicitInputStream(e,r){let n=this._server.getClientCapabilities(),i=e.mode??"form";switch(i){case"url":{if(!n?.elicitation?.url)throw new Error("Client does not support url elicitation.");break}case"form":{if(!n?.elicitation?.form)throw new Error("Client does not support form elicitation.");break}}let o=i==="form"&&e.mode===void 0?{...e,mode:"form"}:e;return this.requestStream({method:"elicitation/create",params:o},Bv,r)}async getTask(e,r){return this._server.getTask({taskId:e},r)}async getTaskResult(e,r,n){return this._server.getTaskResult({taskId:e},r,n)}async listTasks(e,r){return this._server.listTasks(e?{cursor:e}:void 0,r)}async cancelTask(e,r){return this._server.cancelTask({taskId:e},r)}};function Yut(t,e,r){if(!t)throw new Error(`${r} does not support task creation (required for ${e})`);switch(e){case"tools/call":if(!t.tools?.call)throw new Error(`${r} does not support task creation for tools/call (required for ${e})`);break;default:break}}function Hut(t,e,r){if(!t)throw new Error(`${r} does not support task creation (required for ${e})`);switch(e){case"sampling/createMessage":if(!t.sampling?.createMessage)throw new Error(`${r} does not support task creation for sampling/createMessage (required for ${e})`);break;case"elicitation/create":if(!t.elicitation?.create)throw new Error(`${r} does not support task creation for elicitation/create (required for ${e})`);break;default:break}}var f3=class extends R8{constructor(e,r){super(r),this._serverInfo=e,this._loggingLevels=new Map,this.LOG_LEVEL_SEVERITY=new Map(RT.options.map((n,i)=>[n,i])),this.isMessageIgnored=(n,i)=>{let o=this._loggingLevels.get(i);return o?this.LOG_LEVEL_SEVERITY.get(n)<this.LOG_LEVEL_SEVERITY.get(o):!1},this._capabilities=r?.capabilities??{},this._instructions=r?.instructions,this._jsonSchemaValidator=r?.jsonSchemaValidator??new u3,this.setRequestHandler(Hde,n=>this._oninitialize(n)),this.setNotificationHandler(zde,()=>this.oninitialized?.()),this._capabilities.logging&&this.setRequestHandler(rfe,async(n,i)=>{let o=i.sessionId||i.requestInfo?.headers["mcp-session-id"]||void 0,{level:s}=n.params,a=RT.safeParse(s);return a.success&&this._loggingLevels.set(o,a.data),{}})}get experimental(){return this._experimental||(this._experimental={tasks:new d3(this)}),this._experimental}registerCapabilities(e){if(this.transport)throw new Error("Cannot register capabilities after connecting to transport");this._capabilities=rct(this._capabilities,e)}setRequestHandler(e,r){let i=S8(e)?.method;if(!i)throw new Error("Schema is missing a method literal");let o;if(xv(i)){let a=i;o=a._zod?.def?.value??a.value}else{let a=i;o=a._def?.value??a.value}if(typeof o!="string")throw new Error("Schema method literal must be a string");if(o==="tools/call"){let a=async(c,u)=>{let d=Zh(ST,c);if(!d.success){let m=d.error instanceof Error?d.error.message:String(d.error);throw new kt($t.InvalidParams,`Invalid tools/call request: ${m}`)}let{params:f}=d.data,p=await Promise.resolve(r(c,u));if(f.task){let m=Zh(Sv,p);if(!m.success){let A=m.error instanceof Error?m.error.message:String(m.error);throw new kt($t.InvalidParams,`Invalid task creation result: ${A}`)}return m.data}let h=Zh(v8,p);if(!h.success){let m=h.error instanceof Error?h.error.message:String(h.error);throw new kt($t.InvalidParams,`Invalid tools/call result: ${m}`)}return h.data};return super.setRequestHandler(e,a)}return super.setRequestHandler(e,r)}assertCapabilityForMethod(e){switch(e){case"sampling/createMessage":if(!this._clientCapabilities?.sampling)throw new Error(`Client does not support sampling (required for ${e})`);break;case"elicitation/create":if(!this._clientCapabilities?.elicitation)throw new Error(`Client does not support elicitation (required for ${e})`);break;case"roots/list":if(!this._clientCapabilities?.roots)throw new Error(`Client does not support listing roots (required for ${e})`);break;case"ping":break}}assertNotificationCapability(e){switch(e){case"notifications/message":if(!this._capabilities.logging)throw new Error(`Server does not support logging (required for ${e})`);break;case"notifications/resources/updated":case"notifications/resources/list_changed":if(!this._capabilities.resources)throw new Error(`Server does not support notifying about resources (required for ${e})`);break;case"notifications/tools/list_changed":if(!this._capabilities.tools)throw new Error(`Server does not support notifying of tool list changes (required for ${e})`);break;case"notifications/prompts/list_changed":if(!this._capabilities.prompts)throw new Error(`Server does not support notifying of prompt list changes (required for ${e})`);break;case"notifications/elicitation/complete":if(!this._clientCapabilities?.elicitation?.url)throw new Error(`Client does not support URL elicitation (required for ${e})`);break;case"notifications/cancelled":break;case"notifications/progress":break}}assertRequestHandlerCapability(e){if(this._capabilities)switch(e){case"completion/complete":if(!this._capabilities.completions)throw new Error(`Server does not support completions (required for ${e})`);break;case"logging/setLevel":if(!this._capabilities.logging)throw new Error(`Server does not support logging (required for ${e})`);break;case"prompts/get":case"prompts/list":if(!this._capabilities.prompts)throw new Error(`Server does not support prompts (required for ${e})`);break;case"resources/list":case"resources/templates/list":case"resources/read":if(!this._capabilities.resources)throw new Error(`Server does not support resources (required for ${e})`);break;case"tools/call":case"tools/list":if(!this._capabilities.tools)throw new Error(`Server does not support tools (required for ${e})`);break;case"tasks/get":case"tasks/list":case"tasks/result":case"tasks/cancel":if(!this._capabilities.tasks)throw new Error(`Server does not support tasks capability (required for ${e})`);break;case"ping":case"initialize":break}}assertTaskCapability(e){Hut(this._clientCapabilities?.tasks?.requests,e,"Client")}assertTaskHandlerCapability(e){this._capabilities&&Yut(this._capabilities.tasks?.requests,e,"Server")}async _oninitialize(e){let r=e.params.protocolVersion;return this._clientCapabilities=e.params.capabilities,this._clientVersion=e.params.clientInfo,{protocolVersion:Nat.includes(r)?r:Ude,capabilities:this.getCapabilities(),serverInfo:this._serverInfo,...this._instructions&&{instructions:this._instructions}}}getClientCapabilities(){return this._clientCapabilities}getClientVersion(){return this._clientVersion}getCapabilities(){return this._capabilities}async ping(){return this.request({method:"ping"},f8)}async createMessage(e,r){if((e.tools||e.toolChoice)&&!this._clientCapabilities?.sampling?.tools)throw new Error("Client does not support sampling tools capability.");if(e.messages.length>0){let n=e.messages[e.messages.length-1],i=Array.isArray(n.content)?n.content:[n.content],o=i.some(u=>u.type==="tool_result"),s=e.messages.length>1?e.messages[e.messages.length-2]:void 0,a=s?Array.isArray(s.content)?s.content:[s.content]:[],c=a.some(u=>u.type==="tool_use");if(o){if(i.some(u=>u.type!=="tool_result"))throw new Error("The last message must contain only tool_result content if any is present");if(!c)throw new Error("tool_result blocks are not matching any tool_use from the previous message")}if(c){let u=new Set(a.filter(f=>f.type==="tool_use").map(f=>f.id)),d=new Set(i.filter(f=>f.type==="tool_result").map(f=>f.toolUseId));if(u.size!==d.size||![...u].every(f=>d.has(f)))throw new Error("ids of tool_result blocks and tool_use blocks from previous message do not match")}}return e.tools?this.request({method:"sampling/createMessage",params:e},nfe,r):this.request({method:"sampling/createMessage",params:e},BT,r)}async elicitInput(e,r){switch(e.mode??"form"){case"url":{if(!this._clientCapabilities?.elicitation?.url)throw new Error("Client does not support url elicitation.");let i=e;return this.request({method:"elicitation/create",params:i},Bv,r)}case"form":{if(!this._clientCapabilities?.elicitation?.form)throw new Error("Client does not support form elicitation.");let i=e.mode==="form"?e:{...e,mode:"form"},o=await this.request({method:"elicitation/create",params:i},Bv,r);if(o.action==="accept"&&o.content&&i.requestedSchema)try{let a=this._jsonSchemaValidator.getValidator(i.requestedSchema)(o.content);if(!a.valid)throw new kt($t.InvalidParams,`Elicitation response content does not match requested schema: ${a.errorMessage}`)}catch(s){throw s instanceof kt?s:new kt($t.InternalError,`Error validating elicitation response: ${s instanceof Error?s.message:String(s)}`)}return o}}}createElicitationCompletionNotifier(e,r){if(!this._clientCapabilities?.elicitation?.url)throw new Error("Client does not support URL elicitation (required for notifications/elicitation/complete)");return()=>this.notification({method:"notifications/elicitation/complete",params:{elicitationId:e}},r)}async listRoots(e,r){return this.request({method:"roots/list",params:e},ife,r)}async sendLoggingMessage(e,r){if(this._capabilities.logging&&!this.isMessageIgnored(e.level,r))return this.notification({method:"notifications/message",params:e})}async sendResourceUpdated(e){return this.notification({method:"notifications/resources/updated",params:e})}async sendResourceListChanged(){return this.notification({method:"notifications/resources/list_changed"})}async sendToolListChanged(){return this.notification({method:"notifications/tools/list_changed"})}async sendPromptListChanged(){return this.notification({method:"notifications/prompts/list_changed"})}};py();xT();py();NT();fH();var ql="jot",Jut='Optional but valued: if this action involved a judgment call (which account, which match, an assumption, a risk accepted, a deviation), record it in one line, e.g. "MATCH: treated as distinct from BILL bil_x because references differ". Skip it for mechanical actions.',BBr=["CLASSIFICATION","MATCH","SCOPE","ASSUMPTION","RISK","METHOD","RECOVERY","DEVIATION","NOTE"],xBr=new RegExp(`^(${BBr.join("|")})\\s*:\\s*`),Vut=20,TBr=6;function kBr(t){if(!(ql in t))return{cleanedInput:t};let{[ql]:e,...r}=t;return{jotText:typeof e=="string"&&e.trim()!==""?e.trim():void 0,cleanedInput:r}}function Wut(t,e){if(t.params[ql])return{cleanedInput:e};let{jotText:r,cleanedInput:n}=kBr(e);return t.readOnly?{cleanedInput:n}:{jotText:r,cleanedInput:n}}function NBr(t){let e=xBr.exec(t);return e?{kind:e[1],call:t.slice(e[0].length)||t}:{call:t}}var OBr=[["RECONCILE",/(?:^|_)reconcile(?:_|$)/],["PAY",/(?:^|_)(?:pay|payment|payout|cash_out|disburse|disbursement|refund)(?:_|$)/],["FINALIZE",/(?:^|_)(?:finalize|convert_drafts_to_active)(?:_|$)/],["DELETE",/(?:^|_)(?:delete|void|discard|rollback)(?:_|$)/],["TRIGGER",/(?:^|_)(?:recipe|trigger|execute)(?:_|$)/],["UPDATE",/(?:^|_)update(?:_|$)/],["CREATE",/(?:^|_)create(?:_|$)/]];function FBr(t){let e=t.toLowerCase();for(let[r,n]of OBr)if(n.test(e))return r}function QBr(t,e){let r=FBr(t),n=[],i=new Set,o=(s,a)=>{if(!(n.length>=Vut||a>TBr||!s||typeof s!="object")){if(Array.isArray(s)){for(let c of s)o(c,a+1);return}for(let[c,u]of Object.entries(s)){if(n.length>=Vut)return;c==="resourceId"&&typeof u=="string"&&u&&!i.has(u)?(i.add(u),n.push(u)):o(u,a+1)}}};return o(e,0),n.map(s=>({id:s,...r?{relation:r}:{}}))}function Zut(t,e,r,n){let{kind:i,call:o}=NBr(r),s=QBr(e,n),a={...i?{kind:i}:{},tier:"MEDIUM",call:o,frame:`tool:${e}`,...s.length?{refs:s}:{},writePath:"PIGGYBACK"};gv(t,[a]).catch(c=>{let u=c instanceof Error?c.message:String(c);Promise.resolve().then(()=>(Gut(),zut)).then(({log:d})=>d.warn({tool:e,error:u},"Piggyback jot write failed")).catch(()=>process.stderr.write(`[jots-piggyback] jot write failed (${e}): ${u}
|
|
1152
1152
|
`))})}function Kut(t){let e=new Set,r=[];for(let n of t)for(let i of zh(n))e.has(i.name)||(e.add(i.name),r.push(i));return r}function LBr(t){return t.split("_").map(e=>e&&e[0].toUpperCase()+e.slice(1)).join(" ")}function MBr(t){let e=t.readOnly?"read":kT(t)?"destructive":"write",r=Object.keys(t.params).filter(s=>!t.required.includes(s)),n=t.required.length?` required: ${t.required.join(", ")};`:"",i=r.length?` optional: ${r.slice(0,10).join(", ")}${r.length>10?", \u2026":""}`:"",o=(t.searchHint||t.description.split(`
|
|
1153
1153
|
`)[0]||"").trim().slice(0,140);return`- ${t.name} (${e}): ${o}${n}${i}`}function Xut(t=!1){return Uc.map(e=>{let r=Kut(e.groups),n=r.map(d=>d.name),i=r.length>0&&r.every(d=>d.readOnly),o=r.some(d=>!d.readOnly),s=r.some(d=>kT(d)),a=r.filter(d=>d.acceptsHostFile).map(d=>d.name),c=`${e.description}
|
|
1154
1154
|
|