just-bash 1.5.4 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -135,10 +135,14 @@ await env.exec('echo "hello" > file.txt'); // writes to real filesystem
135
135
 
136
136
  ### AI SDK Tool
137
137
 
138
- Creates a bash tool for use with the [AI SDK](https://ai-sdk.dev/), because [agents love bash](https://vercel.com/blog/we-removed-80-percent-of-our-agents-tools).
138
+ For AI agents, use [`bash-tool`](https://github.com/vercel-labs/bash-tool) which is optimized for just-bash and provides a ready-to-use [AI SDK](https://ai-sdk.dev/) tool:
139
+
140
+ ```bash
141
+ npm install bash-tool
142
+ ```
139
143
 
140
144
  ```typescript
141
- import { createBashTool } from "just-bash/ai";
145
+ import { createBashTool } from "bash-tool";
142
146
  import { generateText } from "ai";
143
147
 
144
148
  const bashTool = createBashTool({
@@ -146,13 +150,13 @@ const bashTool = createBashTool({
146
150
  });
147
151
 
148
152
  const result = await generateText({
149
- model: "anthropic/claude-haiku-4.5",
153
+ model: "anthropic/claude-sonnet-4",
150
154
  tools: { bash: bashTool },
151
155
  prompt: "Count the users in /data/users.json",
152
156
  });
153
157
  ```
154
158
 
155
- See [`examples/bash-agent`](./examples/bash-agent) for a full implementation.
159
+ See the [bash-tool documentation](https://github.com/vercel-labs/bash-tool) for more details and examples.
156
160
 
157
161
  ### Vercel Sandbox Compatible API
158
162
 
@@ -237,7 +241,7 @@ pnpm shell --no-network
237
241
 
238
242
  ### Text Processing
239
243
 
240
- `awk`, `base64`, `comm`, `cut`, `diff`, `grep` (+ `egrep`, `fgrep`), `head`, `jq`, `md5sum`, `od`, `paste`, `printf`, `sed`, `sha1sum`, `sha256sum`, `sort`, `tac`, `tail`, `tr`, `uniq`, `wc`, `xargs`
244
+ `awk`, `base64`, `comm`, `cut`, `diff`, `grep` (+ `egrep`, `fgrep`), `head`, `jq`, `md5sum`, `od`, `paste`, `printf`, `sed`, `sha1sum`, `sha256sum`, `sort`, `tac`, `tail`, `tr`, `uniq`, `wc`, `xargs`, `yq`
241
245
 
242
246
  ### Compression
243
247
 
@@ -367,14 +371,12 @@ pnpm shell # Run interactive shell
367
371
 
368
372
  ## AI Agent Instructions
369
373
 
370
- For AI agents working with just-bash, additional guidance is available in `AGENTS.md`:
374
+ For AI agents, we recommend using [`bash-tool`](https://github.com/vercel-labs/bash-tool) which is optimized for just-bash and provides additional guidance in its `AGENTS.md`:
371
375
 
372
376
  ```bash
373
- cat node_modules/just-bash/dist/AGENTS.md
377
+ cat node_modules/bash-tool/dist/AGENTS.md
374
378
  ```
375
379
 
376
- This file contains quick reference patterns, common pitfalls, and debugging tips specifically for AI agents.
377
-
378
380
  ## License
379
381
 
380
382
  Apache-2.0
package/dist/AGENTS.md CHANGED
@@ -8,10 +8,34 @@ Instructions for AI agents using just-bash in projects.
8
8
  A sandboxed bash interpreter with an in-memory virtual filesystem. Use it when you need to:
9
9
 
10
10
  - Execute shell commands without real filesystem access
11
- - Provide a bash tool for AI agents
12
11
  - Run untrusted scripts safely
13
12
  - Process text with standard Unix tools (grep, sed, awk, jq, etc.)
14
13
 
14
+ ## For AI Agents
15
+
16
+ If you're building an AI agent that needs a bash tool, use [`bash-tool`](https://github.com/vercel-labs/bash-tool) which is optimized for just-bash:
17
+
18
+ ```sh
19
+ npm install bash-tool
20
+ ```
21
+
22
+ ```typescript
23
+ import { createBashTool } from "bash-tool";
24
+ import { generateText } from "ai";
25
+
26
+ const bashTool = createBashTool({
27
+ files: { "/data/users.json": '[{"name": "Alice"}, {"name": "Bob"}]' },
28
+ });
29
+
30
+ const result = await generateText({
31
+ model: "anthropic/claude-sonnet-4",
32
+ tools: { bash: bashTool },
33
+ prompt: "Count the users in /data/users.json",
34
+ });
35
+ ```
36
+
37
+ See the [bash-tool documentation](https://github.com/vercel-labs/bash-tool) for more details.
38
+
15
39
  ## Quick Reference
16
40
 
17
41
  ```typescript
@@ -28,110 +52,153 @@ const result = await bash.exec("cat input.txt | grep pattern");
28
52
  // result.exitCode - 0 = success, non-zero = failure
29
53
  ```
30
54
 
31
- ## Building an AI Agent
55
+ ## Key Behaviors
32
56
 
33
- just-bash integrates with the [AI SDK](https://ai-sdk.dev/) to provide a bash tool for AI agents.
57
+ 1. **Isolation**: Each `exec()` call is isolated. Environment variables, functions, and cwd changes don't persist between calls. Only filesystem changes persist.
34
58
 
35
- ### Basic Agent Setup
59
+ 2. **No real filesystem**: By default, commands only see the virtual filesystem. Use `OverlayFs` to read from a real directory (writes stay in memory).
36
60
 
37
- ```typescript
38
- import { createBashTool } from "just-bash/ai";
39
- import { generateText } from "ai";
61
+ 3. **No network by default**: `curl` doesn't exist unless you configure `network` options with URL allowlists.
40
62
 
41
- const bashTool = createBashTool({
42
- files: {
43
- "/data/users.json": '[{"name": "Alice"}, {"name": "Bob"}]',
44
- "/data/config.yaml": "debug: true\nport: 3000",
45
- },
46
- });
63
+ 4. **No binaries/WASM**: Only built-in commands work. You cannot run node, python, or other binaries.
47
64
 
48
- const result = await generateText({
49
- model: "anthropic/claude-haiku-4.5",
50
- tools: { bash: bashTool },
51
- prompt: "Count the users in /data/users.json",
52
- });
65
+ ## Available Commands
66
+
67
+ **Text processing**: `awk`, `cat`, `comm`, `cut`, `egrep`, `fgrep`, `grep`, `head`, `jq`, `paste`, `sed`, `sort`, `tac`, `tail`, `tr`, `uniq`, `wc`, `xargs`, `yq`
68
+
69
+ **File operations**: `basename`, `chmod`, `cp`, `dirname`, `du`, `file`, `find`, `ln`, `ls`, `mkdir`, `mv`, `od`, `pwd`, `readlink`, `rm`, `stat`, `touch`, `tree`
70
+
71
+ **Utilities**: `alias`, `base64`, `bash`, `clear`, `curl`, `date`, `diff`, `echo`, `env`, `expr`, `false`, `gzip`, `gunzip`, `help`, `history`, `hostname`, `html-to-markdown`, `md5sum`, `printenv`, `printf`, `seq`, `sh`, `sha1sum`, `sha256sum`, `sleep`, `tee`, `timeout`, `true`, `unalias`, `which`, `zcat`
72
+
73
+ All commands support `--help` for usage details.
74
+
75
+ ## Tools by File Format
76
+
77
+ ### JSON - `jq`
78
+
79
+ ```bash
80
+ # Extract field
81
+ jq '.name' data.json
82
+
83
+ # Filter array
84
+ jq '.users[] | select(.active == true)' data.json
85
+
86
+ # Transform structure
87
+ jq '[.items[] | {id, name}]' data.json
88
+
89
+ # From stdin
90
+ echo '{"x":1}' | jq '.x'
53
91
  ```
54
92
 
55
- ### With ToolLoopAgent
93
+ ### YAML - `yq`
56
94
 
57
- For multi-step tasks, use `ToolLoopAgent` which automatically loops until completion:
95
+ ```bash
96
+ # Extract value
97
+ yq '.config.database.host' config.yaml
58
98
 
59
- ```typescript
60
- import { ToolLoopAgent } from "ai";
61
- import { createBashTool } from "just-bash/ai";
99
+ # Output as JSON
100
+ yq -o json '.' config.yaml
62
101
 
63
- const bashTool = createBashTool({
64
- files: {
65
- "/project/src/index.ts": "export const version = '1.0.0';",
66
- "/project/src/utils.ts": "// TODO: implement\nexport function helper() {}",
67
- "/project/package.json": '{"name": "my-app", "version": "1.0.0"}',
68
- },
69
- });
102
+ # Filter with jq syntax
103
+ yq '.users[] | select(.role == "admin")' users.yaml
70
104
 
71
- const agent = new ToolLoopAgent({
72
- model: "anthropic/claude-haiku-4.5",
73
- tools: { bash: bashTool },
74
- });
105
+ # Modify file in-place
106
+ yq -i '.version = "2.0"' config.yaml
107
+ ```
75
108
 
76
- const result = await agent.generate({
77
- prompt: "Find all TODO comments in the project and list the files containing them",
78
- });
109
+ ### TOML - `yq`
110
+
111
+ ```bash
112
+ # Read TOML (auto-detected from .toml extension)
113
+ yq '.package.name' Cargo.toml
114
+ yq '.tool.poetry.version' pyproject.toml
115
+
116
+ # Convert TOML to JSON
117
+ yq -o json '.' config.toml
118
+
119
+ # Convert YAML to TOML
120
+ yq -o toml '.' config.yaml
79
121
  ```
80
122
 
81
- ### With Network Access
123
+ ### CSV/TSV - `yq -p csv`
82
124
 
83
- ```typescript
84
- import { createBashTool } from "just-bash/ai";
125
+ ```bash
126
+ # Read CSV (auto-detects from .csv/.tsv extension)
127
+ yq '.[0].name' data.csv
128
+ yq '.[0].name' data.tsv
85
129
 
86
- const bashTool = createBashTool({
87
- network: {
88
- allowedUrlPrefixes: ["https://api.github.com/"],
89
- },
90
- });
130
+ # Filter rows
131
+ yq '[.[] | select(.status == "active")]' data.csv
132
+
133
+ # Convert CSV to JSON
134
+ yq -o json '.' data.csv
91
135
  ```
92
136
 
93
- ### With Real Filesystem (Read-Only)
137
+ ### Front-matter - `yq --front-matter`
94
138
 
95
- ```typescript
96
- import { createBashTool } from "just-bash/ai";
97
- import { OverlayFs } from "just-bash/fs/overlay-fs";
139
+ ```bash
140
+ # Extract YAML front-matter from markdown
141
+ yq --front-matter '.title' post.md
142
+ yq -f '.tags[]' blog-post.md
98
143
 
99
- const overlay = new OverlayFs({ root: "/path/to/project" });
100
- const bashTool = createBashTool({
101
- fs: overlay,
102
- cwd: overlay.getMountPoint(),
103
- });
144
+ # Works with TOML front-matter (+++) too
145
+ yq -f '.date' hugo-post.md
104
146
  ```
105
147
 
106
- ### Tool Options
148
+ ### XML - `yq -p xml`
107
149
 
108
- - `files` - Initial virtual files
109
- - `fs` - Custom filesystem (e.g., OverlayFs)
110
- - `network` - URL allowlist for curl
111
- - `commands` - Restrict available commands
112
- - `customCommands` - Add custom commands
113
- - `onCall` - Callback before each execution
114
- - `logger` - Execution tracing
150
+ ```bash
151
+ # Extract element
152
+ yq '.root.users.user[0].name' data.xml
115
153
 
116
- ## Key Behaviors
154
+ # Access attributes (use +@ prefix)
155
+ yq '.root.item["+@id"]' data.xml
117
156
 
118
- 1. **Isolation**: Each `exec()` call is isolated. Environment variables, functions, and cwd changes don't persist between calls. Only filesystem changes persist.
157
+ # Convert XML to JSON
158
+ yq -p xml -o json '.' data.xml
159
+ ```
119
160
 
120
- 2. **No real filesystem**: By default, commands only see the virtual filesystem. Use `OverlayFs` to read from a real directory (writes stay in memory).
161
+ ### INI - `yq -p ini`
121
162
 
122
- 3. **No network by default**: `curl` doesn't exist unless you configure `network` options with URL allowlists.
163
+ ```bash
164
+ # Read INI section value
165
+ yq '.database.host' config.ini
123
166
 
124
- 4. **No binaries/WASM**: Only built-in commands work. You cannot run node, python, or other binaries.
167
+ # Convert INI to JSON
168
+ yq -p ini -o json '.' config.ini
169
+ ```
125
170
 
126
- ## Available Commands
171
+ ### HTML - `html-to-markdown`
127
172
 
128
- **Text processing**: `awk`, `cat`, `cut`, `grep`, `head`, `jq`, `sed`, `sort`, `tail`, `tr`, `uniq`, `wc`, `xargs`
173
+ ```bash
174
+ # Convert HTML to markdown
175
+ html-to-markdown page.html
129
176
 
130
- **File operations**: `cp`, `find`, `ls`, `mkdir`, `mv`, `rm`, `touch`, `tree`
177
+ # From stdin
178
+ echo '<h1>Title</h1><p>Text</p>' | html-to-markdown
179
+ ```
131
180
 
132
- **Utilities**: `base64`, `date`, `diff`, `echo`, `env`, `printf`, `seq`, `tee`
181
+ ### Format Conversion with yq
133
182
 
134
- All commands support `--help` for usage details.
183
+ ```bash
184
+ # JSON to YAML
185
+ yq -p json '.' data.json
186
+
187
+ # YAML to JSON
188
+ yq -o json '.' data.yaml
189
+
190
+ # YAML to TOML
191
+ yq -o toml '.' config.yaml
192
+
193
+ # TOML to JSON
194
+ yq -o json '.' Cargo.toml
195
+
196
+ # CSV to JSON
197
+ yq -p csv -o json '.' data.csv
198
+
199
+ # XML to YAML
200
+ yq -p xml '.' data.xml
201
+ ```
135
202
 
136
203
  ## Common Patterns
137
204
 
@@ -215,9 +282,6 @@ cat node_modules/just-bash/dist/index.d.ts
215
282
  # View Bash class options
216
283
  grep -A 30 "interface BashOptions" node_modules/just-bash/dist/Bash.d.ts
217
284
 
218
- # View AI tool options
219
- cat node_modules/just-bash/dist/ai/index.d.ts
220
-
221
285
  # Search for specific types
222
286
  grep -r "interface.*Options" node_modules/just-bash/dist/*.d.ts
223
287
  ```
@@ -225,5 +289,4 @@ grep -r "interface.*Options" node_modules/just-bash/dist/*.d.ts
225
289
  Key types to explore:
226
290
  - `BashOptions` - Constructor options for `new Bash()`
227
291
  - `ExecResult` - Return type of `bash.exec()`
228
- - `CreateBashToolOptions` - Options for `createBashTool()`
229
292
  - `InitialFiles` - File specification format
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ import{i as k}from"./chunk-NWWB2XRE.js";var M=1e4;function D(t){return{vars:new Map,limits:{maxIterations:t?.limits?.maxIterations??M},env:t?.env}}function N(t,e,n){let i=new Map(t.vars);return i.set(e,n),{vars:i,limits:t.limits,env:t.env,root:t.root,currentPath:t.currentPath}}function S(t,e){let n=t;for(let i of e)if(n&&typeof n=="object")n=n[i];else return;return n}function E(t){if(t.type==="Identity")return[];if(t.type==="Field"){let e=t.base?E(t.base):[];return e===null?null:[...e,t.name]}if(t.type==="Index"&&t.index.type==="Literal"){let e=t.base?E(t.base):[];if(e===null)return null;let n=t.index.value;return typeof n=="number"||typeof n=="string"?[...e,n]:null}if(t.type==="Pipe"){let e=E(t.left);return e===null?null:T(e,t.right)}return t.type==="Call"&&(t.name==="parent"||t.name==="root"),null}function T(t,e){if(e.type==="Call"){if(e.name==="parent"){let n=1;if(e.args.length>0&&e.args[0].type==="Literal"){let i=e.args[0].value;typeof i=="number"&&(n=i)}if(n>=0)return t.slice(0,Math.max(0,t.length-n));{let i=-n-1;return t.slice(0,Math.min(i,t.length))}}if(e.name==="root")return[]}if(e.type==="Field"){let n=E(e);if(n!==null)return[...t,...n]}if(e.type==="Index"&&e.index.type==="Literal"){let n=E(e);if(n!==null)return[...t,...n]}if(e.type==="Pipe"){let n=T(t,e.left);return n===null?null:T(n,e.right)}return e.type==="Identity"?t:null}function u(t,e,n){let i=n&&"vars"in n?n:D(n);switch(i.root===void 0&&(i={...i,root:t,currentPath:[]}),e.type){case"Identity":return[t];case"Field":return(e.base?u(t,e.base,i):[t]).flatMap(s=>{if(s&&typeof s=="object"&&!Array.isArray(s)){let o=s[e.name];return[o===void 0?null:o]}return[null]});case"Index":return(e.base?u(t,e.base,i):[t]).flatMap(s=>u(s,e.index,i).flatMap(f=>{if(typeof f=="number"&&Array.isArray(s)){let c=f<0?s.length+f:f;return c>=0&&c<s.length?[s[c]]:[null]}return typeof f=="string"&&s&&typeof s=="object"&&!Array.isArray(s)?[s[f]]:[null]}));case"Slice":return(e.base?u(t,e.base,i):[t]).flatMap(s=>{if(!Array.isArray(s)&&typeof s!="string")return[null];let o=s.length,f=e.start?u(t,e.start,i):[0],c=e.end?u(t,e.end,i):[o];return f.flatMap(p=>c.map(y=>{let h=I(p,o),a=I(y,o);return Array.isArray(s),s.slice(h,a)}))});case"Iterate":return(e.base?u(t,e.base,i):[t]).flatMap(s=>Array.isArray(s)?s:s&&typeof s=="object"?Object.values(s):[]);case"Pipe":{let r=u(t,e.left,i),s=E(e.left);return r.flatMap(o=>{if(s!==null){let f={...i,currentPath:[...i.currentPath??[],...s]};return u(o,e.right,f)}return u(o,e.right,i)})}case"Comma":{let r=u(t,e.left,i),s=u(t,e.right,i);return[...r,...s]}case"Literal":return[e.value];case"Array":return e.elements?[u(t,e.elements,i)]:[[]];case"Object":{let r=[{}];for(let s of e.entries){let o=typeof s.key=="string"?[s.key]:u(t,s.key,i),f=u(t,s.value,i),c=[];for(let p of r)for(let y of o)for(let h of f)c.push({...p,[String(y)]:h});r.length=0,r.push(...c)}return r}case"Paren":return u(t,e.expr,i);case"BinaryOp":return _(t,e.op,e.left,e.right,i);case"UnaryOp":return u(t,e.operand,i).map(s=>e.op==="-"?typeof s=="number"?-s:null:e.op==="not"?!d(s):null);case"Cond":return u(t,e.cond,i).flatMap(s=>{if(d(s))return u(t,e.then,i);for(let o of e.elifs)if(u(t,o.cond,i).some(d))return u(t,o.then,i);return e.else?u(t,e.else,i):[null]});case"Try":try{return u(t,e.body,i)}catch{return e.catch?u(t,e.catch,i):[]}case"Call":return C(t,e.name,e.args,i);case"VarBind":return u(t,e.value,i).flatMap(s=>{let o=N(i,e.name,s);return u(t,e.body,o)});case"VarRef":{if(e.name==="$ENV")return[i.env??{}];let r=i.vars.get(e.name);return r!==void 0?[r]:[null]}case"Recurse":{let r=[],s=new WeakSet,o=f=>{if(f&&typeof f=="object"){if(s.has(f))return;s.add(f)}if(r.push(f),Array.isArray(f))for(let c of f)o(c);else if(f&&typeof f=="object")for(let c of Object.keys(f))o(f[c])};return o(t),r}case"Optional":try{return u(t,e.expr,i)}catch{return[]}case"StringInterp":return[e.parts.map(s=>typeof s=="string"?s:u(t,s,i).map(f=>typeof f=="string"?f:JSON.stringify(f)).join("")).join("")];case"UpdateOp":return[U(t,e.path,e.op,e.value,i)];case"Reduce":{let r=u(t,e.expr,i),s=u(t,e.init,i)[0];for(let o of r){let f=N(i,e.varName,o);s=u(s,e.update,f)[0]}return[s]}case"Foreach":{let r=u(t,e.expr,i),s=u(t,e.init,i)[0],o=[];for(let f of r){let c=N(i,e.varName,f);if(s=u(s,e.update,c)[0],e.extract){let p=u(s,e.extract,c);o.push(...p)}else o.push(s)}return o}default:{let r=e;throw new Error(`Unknown AST node type: ${r.type}`)}}}function I(t,e){return t<0?Math.max(0,e+t):Math.min(t,e)}function U(t,e,n,i,r){function s(c,p){switch(n){case"=":return p;case"|=":return u(c,i,r)[0]??null;case"+=":return typeof c=="number"&&typeof p=="number"||typeof c=="string"&&typeof p=="string"?c+p:Array.isArray(c)&&Array.isArray(p)?[...c,...p]:c&&p&&typeof c=="object"&&typeof p=="object"?{...c,...p}:p;case"-=":return typeof c=="number"&&typeof p=="number"?c-p:c;case"*=":return typeof c=="number"&&typeof p=="number"?c*p:c;case"/=":return typeof c=="number"&&typeof p=="number"?c/p:c;case"%=":return typeof c=="number"&&typeof p=="number"?c%p:c;case"//=":return c===null||c===!1?p:c;default:return p}}function o(c,p,y){switch(p.type){case"Identity":return y(c);case"Field":{if(p.base)return o(c,p.base,h=>{if(h&&typeof h=="object"&&!Array.isArray(h)){let a={...h};return a[p.name]=y(a[p.name]),a}return h});if(c&&typeof c=="object"&&!Array.isArray(c)){let h={...c};return h[p.name]=y(h[p.name]),h}return c}case"Index":{let a=u(t,p.index,r)[0];if(p.base)return o(c,p.base,l=>{if(typeof a=="number"&&Array.isArray(l)){let A=[...l],b=a<0?A.length+a:a;return b>=0&&b<A.length&&(A[b]=y(A[b])),A}if(typeof a=="string"&&l&&typeof l=="object"&&!Array.isArray(l)){let A={...l};return A[a]=y(A[a]),A}return l});if(typeof a=="number"&&Array.isArray(c)){let l=[...c],A=a<0?l.length+a:a;return A>=0&&A<l.length&&(l[A]=y(l[A])),l}if(typeof a=="string"&&c&&typeof c=="object"&&!Array.isArray(c)){let l={...c};return l[a]=y(l[a]),l}return c}case"Iterate":{let h=a=>{if(Array.isArray(a))return a.map(l=>y(l));if(a&&typeof a=="object"){let l={};for(let[A,b]of Object.entries(a))l[A]=y(b);return l}return a};return p.base?o(c,p.base,h):h(c)}case"Pipe":{let h=o(c,p.left,a=>a);return o(h,p.right,y)}default:return y(c)}}return o(t,e,c=>{if(n==="|=")return s(c,c);let p=u(t,i,r);return s(c,p[0]??null)})}function B(t,e,n){function i(r,s){switch(s.type){case"Identity":return null;case"Field":{if(r&&typeof r=="object"&&!Array.isArray(r)){let o={...r};return delete o[s.name],o}return r}case"Index":{let f=u(t,s.index,n)[0];if(typeof f=="number"&&Array.isArray(r)){let c=[...r],p=f<0?c.length+f:f;return p>=0&&p<c.length&&c.splice(p,1),c}if(typeof f=="string"&&r&&typeof r=="object"&&!Array.isArray(r)){let c={...r};return delete c[f],c}return r}case"Iterate":return Array.isArray(r)?[]:r&&typeof r=="object"?{}:r;default:return r}}return i(t,e)}function d(t){return t!==null&&t!==!1}function _(t,e,n,i,r){if(e==="and")return u(t,n,r).flatMap(c=>d(c)?u(t,i,r).map(y=>d(y)):[!1]);if(e==="or")return u(t,n,r).flatMap(c=>d(c)?[!0]:u(t,i,r).map(y=>d(y)));if(e==="//"){let c=u(t,n,r).filter(p=>p!=null&&p!==!1);return c.length>0?c:u(t,i,r)}let s=u(t,n,r),o=u(t,i,r);return s.flatMap(f=>o.map(c=>{switch(e){case"+":return typeof f=="number"&&typeof c=="number"||typeof f=="string"&&typeof c=="string"?f+c:Array.isArray(f)&&Array.isArray(c)?[...f,...c]:f&&c&&typeof f=="object"&&typeof c=="object"&&!Array.isArray(f)&&!Array.isArray(c)?{...f,...c}:null;case"-":if(typeof f=="number"&&typeof c=="number")return f-c;if(Array.isArray(f)&&Array.isArray(c)){let p=new Set(c.map(y=>JSON.stringify(y)));return f.filter(y=>!p.has(JSON.stringify(y)))}return null;case"*":return typeof f=="number"&&typeof c=="number"?f*c:typeof f=="string"&&typeof c=="number"?f.repeat(c):f&&c&&typeof f=="object"&&typeof c=="object"&&!Array.isArray(f)&&!Array.isArray(c)?w(f,c):null;case"/":return typeof f=="number"&&typeof c=="number"?f/c:typeof f=="string"&&typeof c=="string"?f.split(c):null;case"%":return typeof f=="number"&&typeof c=="number"?f%c:null;case"==":return g(f,c);case"!=":return!g(f,c);case"<":return j(f,c)<0;case"<=":return j(f,c)<=0;case">":return j(f,c)>0;case">=":return j(f,c)>=0;default:return null}}))}function g(t,e){return JSON.stringify(t)===JSON.stringify(e)}function j(t,e){return typeof t=="number"&&typeof e=="number"?t-e:typeof t=="string"&&typeof e=="string"?t.localeCompare(e):0}function w(t,e){let n={...t};for(let i of Object.keys(e))i in n&&n[i]&&typeof n[i]=="object"&&!Array.isArray(n[i])&&e[i]&&typeof e[i]=="object"&&!Array.isArray(e[i])?n[i]=w(n[i],e[i]):n[i]=e[i];return n}function C(t,e,n,i){switch(e){case"keys":return Array.isArray(t)?[t.map((r,s)=>s)]:t&&typeof t=="object"?[Object.keys(t).sort()]:[null];case"keys_unsorted":return Array.isArray(t)?[t.map((r,s)=>s)]:t&&typeof t=="object"?[Object.keys(t)]:[null];case"values":return Array.isArray(t)?[t]:t&&typeof t=="object"?[Object.values(t)]:[null];case"length":return typeof t=="string"?[t.length]:Array.isArray(t)?[t.length]:t&&typeof t=="object"?[Object.keys(t).length]:t===null?[0]:[null];case"utf8bytelength":return typeof t=="string"?[new TextEncoder().encode(t).length]:[null];case"type":return t===null?["null"]:Array.isArray(t)?["array"]:typeof t=="boolean"?["boolean"]:typeof t=="number"?["number"]:typeof t=="string"?["string"]:typeof t=="object"?["object"]:["null"];case"empty":return[];case"error":{let r=n.length>0?u(t,n[0],i)[0]:t;throw new Error(String(r))}case"not":return[!d(t)];case"null":return[null];case"true":return[!0];case"false":return[!1];case"first":if(n.length>0){let r=u(t,n[0],i);return r.length>0?[r[0]]:[]}return Array.isArray(t)&&t.length>0?[t[0]]:[null];case"last":if(n.length>0){let r=u(t,n[0],i);return r.length>0?[r[r.length-1]]:[]}return Array.isArray(t)&&t.length>0?[t[t.length-1]]:[null];case"nth":{if(n.length<1)return[null];let s=u(t,n[0],i)[0];if(n.length>1){let o=u(t,n[1],i);return s>=0&&s<o.length?[o[s]]:[]}return Array.isArray(t)?s>=0&&s<t.length?[t[s]]:[null]:[null]}case"range":{if(n.length===0)return[];let r=u(t,n[0],i);if(n.length===1){let p=r[0];return Array.from({length:p},(y,h)=>h)}let s=u(t,n[1],i),o=r[0],f=s[0],c=[];for(let p=o;p<f;p++)c.push(p);return c}case"reverse":return Array.isArray(t)?[[...t].reverse()]:typeof t=="string"?[t.split("").reverse().join("")]:[null];case"sort":return Array.isArray(t)?[[...t].sort(m)]:[null];case"sort_by":return!Array.isArray(t)||n.length===0?[null]:[[...t].sort((s,o)=>{let f=u(s,n[0],i)[0],c=u(o,n[0],i)[0];return m(f,c)})];case"unique":if(Array.isArray(t)){let r=new Set,s=[];for(let o of t){let f=JSON.stringify(o);r.has(f)||(r.add(f),s.push(o))}return[s]}return[null];case"unique_by":{if(!Array.isArray(t)||n.length===0)return[null];let r=new Set,s=[];for(let o of t){let f=JSON.stringify(u(o,n[0],i)[0]);r.has(f)||(r.add(f),s.push(o))}return[s]}case"group_by":{if(!Array.isArray(t)||n.length===0)return[null];let r=new Map;for(let s of t){let o=JSON.stringify(u(s,n[0],i)[0]);r.has(o)||r.set(o,[]),r.get(o)?.push(s)}return[[...r.values()]]}case"max":return Array.isArray(t)&&t.length>0?[t.reduce((r,s)=>m(r,s)>0?r:s)]:[null];case"max_by":return!Array.isArray(t)||t.length===0||n.length===0?[null]:[t.reduce((r,s)=>{let o=u(r,n[0],i)[0],f=u(s,n[0],i)[0];return m(o,f)>0?r:s})];case"min":return Array.isArray(t)&&t.length>0?[t.reduce((r,s)=>m(r,s)<0?r:s)]:[null];case"min_by":return!Array.isArray(t)||t.length===0||n.length===0?[null]:[t.reduce((r,s)=>{let o=u(r,n[0],i)[0],f=u(s,n[0],i)[0];return m(o,f)<0?r:s})];case"flatten":{if(!Array.isArray(t))return[null];let r=n.length>0?u(t,n[0],i)[0]:Number.POSITIVE_INFINITY;return[t.flat(r)]}case"add":if(Array.isArray(t)){if(t.length===0)return[null];if(t.every(r=>typeof r=="number"))return[t.reduce((r,s)=>r+s,0)];if(t.every(r=>typeof r=="string"))return[t.join("")];if(t.every(r=>Array.isArray(r)))return[t.flat()];if(t.every(r=>r&&typeof r=="object"&&!Array.isArray(r)))return[Object.assign({},...t)]}return[null];case"any":return n.length>0?Array.isArray(t)?[t.some(r=>d(u(r,n[0],i)[0]))]:[!1]:Array.isArray(t)?[t.some(d)]:[!1];case"all":return n.length>0?Array.isArray(t)?[t.every(r=>d(u(r,n[0],i)[0]))]:[!0]:Array.isArray(t)?[t.every(d)]:[!0];case"select":return n.length===0?[t]:u(t,n[0],i).some(d)?[t]:[];case"map":return n.length===0||!Array.isArray(t)?[null]:[t.flatMap(s=>u(s,n[0],i))];case"map_values":{if(n.length===0)return[null];if(Array.isArray(t))return[t.flatMap(r=>u(r,n[0],i))];if(t&&typeof t=="object"){let r={};for(let[s,o]of Object.entries(t)){let f=u(o,n[0],i);f.length>0&&(r[s]=f[0])}return[r]}return[null]}case"has":{if(n.length===0)return[!1];let s=u(t,n[0],i)[0];return Array.isArray(t)&&typeof s=="number"?[s>=0&&s<t.length]:t&&typeof t=="object"&&typeof s=="string"?[s in t]:[!1]}case"in":{if(n.length===0)return[!1];let s=u(t,n[0],i)[0];return Array.isArray(s)&&typeof t=="number"?[t>=0&&t<s.length]:s&&typeof s=="object"&&typeof t=="string"?[t in s]:[!1]}case"contains":{if(n.length===0)return[!1];let r=u(t,n[0],i);return[O(t,r[0])]}case"inside":{if(n.length===0)return[!1];let r=u(t,n[0],i);return[O(r[0],t)]}case"getpath":{if(n.length===0)return[null];let s=u(t,n[0],i)[0],o=t;for(let f of s){if(o==null)return[null];if(Array.isArray(o)&&typeof f=="number")o=o[f];else if(typeof o=="object"&&typeof f=="string")o=o[f];else return[null]}return[o]}case"setpath":{if(n.length<2)return[null];let s=u(t,n[0],i)[0],f=u(t,n[1],i)[0];return[R(t,s,f)]}case"delpaths":{if(n.length===0)return[t];let s=u(t,n[0],i)[0],o=t;for(let f of s.sort((c,p)=>p.length-c.length))o=x(o,f);return[o]}case"path":{if(n.length===0)return[[]];let r=[];return $(t,n[0],i,[],r),r}case"del":return n.length===0?[t]:[B(t,n[0],i)];case"paths":{let r=[],s=(o,f)=>{if(o&&typeof o=="object")if(Array.isArray(o))for(let c=0;c<o.length;c++)r.push([...f,c]),s(o[c],[...f,c]);else for(let c of Object.keys(o))r.push([...f,c]),s(o[c],[...f,c])};return s(t,[]),n.length>0?r.filter(o=>{let f=t;for(let p of o)if(Array.isArray(f)&&typeof p=="number")f=f[p];else if(f&&typeof f=="object"&&typeof p=="string")f=f[p];else return!1;return u(f,n[0],i).some(d)}):r}case"leaf_paths":{let r=[],s=(o,f)=>{if(o===null||typeof o!="object")r.push(f);else if(Array.isArray(o))for(let c=0;c<o.length;c++)s(o[c],[...f,c]);else for(let c of Object.keys(o))s(o[c],[...f,c])};return s(t,[]),[r]}case"to_entries":return t&&typeof t=="object"&&!Array.isArray(t)?[Object.entries(t).map(([r,s])=>({key:r,value:s}))]:[null];case"from_entries":if(Array.isArray(t)){let r={};for(let s of t)if(s&&typeof s=="object"){let o=s,f=o.key??o.name??o.k,c=o.value??o.v;f!==void 0&&(r[String(f)]=c)}return[r]}return[null];case"with_entries":{if(n.length===0)return[t];if(t&&typeof t=="object"&&!Array.isArray(t)){let s=Object.entries(t).map(([f,c])=>({key:f,value:c})).flatMap(f=>u(f,n[0],i)),o={};for(let f of s)if(f&&typeof f=="object"){let c=f,p=c.key??c.name??c.k,y=c.value??c.v;p!==void 0&&(o[String(p)]=y)}return[o]}return[null]}case"join":{if(!Array.isArray(t))return[null];let r=n.length>0?u(t,n[0],i):[""],s=String(r[0]);return[t.map(o=>typeof o=="string"?o:JSON.stringify(o)).join(s)]}case"split":{if(typeof t!="string"||n.length===0)return[null];let r=u(t,n[0],i),s=String(r[0]);return[t.split(s)]}case"test":{if(typeof t!="string"||n.length===0)return[!1];let r=u(t,n[0],i),s=String(r[0]);try{let o=n.length>1?String(u(t,n[1],i)[0]):"";return[new RegExp(s,o).test(t)]}catch{return[!1]}}case"match":{if(typeof t!="string"||n.length===0)return[null];let r=u(t,n[0],i),s=String(r[0]);try{let o=n.length>1?String(u(t,n[1],i)[0]):"",c=new RegExp(s,`${o}d`).exec(t);if(!c)return[];let p=c.indices;return[{offset:c.index,length:c[0].length,string:c[0],captures:c.slice(1).map((y,h)=>({offset:p?.[h+1]?.[0]??null,length:y?.length??0,string:y??"",name:null}))}]}catch{return[null]}}case"capture":{if(typeof t!="string"||n.length===0)return[null];let r=u(t,n[0],i),s=String(r[0]);try{let o=n.length>1?String(u(t,n[1],i)[0]):"",f=new RegExp(s,o),c=t.match(f);return!c||!c.groups?[{}]:[c.groups]}catch{return[null]}}case"sub":{if(typeof t!="string"||n.length<2)return[null];let r=u(t,n[0],i),s=u(t,n[1],i),o=String(r[0]),f=String(s[0]);try{let c=n.length>2?String(u(t,n[2],i)[0]):"";return[t.replace(new RegExp(o,c),f)]}catch{return[t]}}case"gsub":{if(typeof t!="string"||n.length<2)return[null];let r=u(t,n[0],i),s=u(t,n[1],i),o=String(r[0]),f=String(s[0]);try{let c=n.length>2?String(u(t,n[2],i)[0]):"g",p=c.includes("g")?c:`${c}g`;return[t.replace(new RegExp(o,p),f)]}catch{return[t]}}case"ascii_downcase":return typeof t=="string"?[t.toLowerCase()]:[null];case"ascii_upcase":return typeof t=="string"?[t.toUpperCase()]:[null];case"ltrimstr":{if(typeof t!="string"||n.length===0)return[t];let r=u(t,n[0],i),s=String(r[0]);return[t.startsWith(s)?t.slice(s.length):t]}case"rtrimstr":{if(typeof t!="string"||n.length===0)return[t];let r=u(t,n[0],i),s=String(r[0]);return[t.endsWith(s)?t.slice(0,-s.length):t]}case"startswith":{if(typeof t!="string"||n.length===0)return[!1];let r=u(t,n[0],i);return[t.startsWith(String(r[0]))]}case"endswith":{if(typeof t!="string"||n.length===0)return[!1];let r=u(t,n[0],i);return[t.endsWith(String(r[0]))]}case"index":{if(n.length===0)return[null];let s=u(t,n[0],i)[0];if(typeof t=="string"&&typeof s=="string"){let o=t.indexOf(s);return[o>=0?o:null]}if(Array.isArray(t)){let o=t.findIndex(f=>g(f,s));return[o>=0?o:null]}return[null]}case"rindex":{if(n.length===0)return[null];let s=u(t,n[0],i)[0];if(typeof t=="string"&&typeof s=="string"){let o=t.lastIndexOf(s);return[o>=0?o:null]}if(Array.isArray(t)){for(let o=t.length-1;o>=0;o--)if(g(t[o],s))return[o];return[null]}return[null]}case"indices":{if(n.length===0)return[[]];let s=u(t,n[0],i)[0],o=[];if(typeof t=="string"&&typeof s=="string"){let f=t.indexOf(s);for(;f!==-1;)o.push(f),f=t.indexOf(s,f+1)}else if(Array.isArray(t))for(let f=0;f<t.length;f++)g(t[f],s)&&o.push(f);return[o]}case"floor":return typeof t=="number"?[Math.floor(t)]:[null];case"ceil":return typeof t=="number"?[Math.ceil(t)]:[null];case"round":return typeof t=="number"?[Math.round(t)]:[null];case"sqrt":return typeof t=="number"?[Math.sqrt(t)]:[null];case"fabs":case"abs":return typeof t=="number"?[Math.abs(t)]:[null];case"log":return typeof t=="number"?[Math.log(t)]:[null];case"log10":return typeof t=="number"?[Math.log10(t)]:[null];case"log2":return typeof t=="number"?[Math.log2(t)]:[null];case"exp":return typeof t=="number"?[Math.exp(t)]:[null];case"exp10":return typeof t=="number"?[10**t]:[null];case"exp2":return typeof t=="number"?[2**t]:[null];case"pow":{if(typeof t!="number"||n.length===0)return[null];let s=u(t,n[0],i)[0];return[t**s]}case"sin":return typeof t=="number"?[Math.sin(t)]:[null];case"cos":return typeof t=="number"?[Math.cos(t)]:[null];case"tan":return typeof t=="number"?[Math.tan(t)]:[null];case"asin":return typeof t=="number"?[Math.asin(t)]:[null];case"acos":return typeof t=="number"?[Math.acos(t)]:[null];case"atan":return typeof t=="number"?[Math.atan(t)]:[null];case"tostring":return typeof t=="string"?[t]:[JSON.stringify(t)];case"tonumber":if(typeof t=="number")return[t];if(typeof t=="string"){let r=Number(t);return[Number.isNaN(r)?null:r]}return[null];case"infinite":return[!Number.isFinite(t)];case"nan":return[Number.isNaN(t)];case"isinfinite":return[typeof t=="number"&&!Number.isFinite(t)];case"isnan":return[typeof t=="number"&&Number.isNaN(t)];case"isnormal":return[typeof t=="number"&&Number.isFinite(t)&&t!==0];case"isfinite":return[typeof t=="number"&&Number.isFinite(t)];case"numbers":return typeof t=="number"?[t]:[];case"strings":return typeof t=="string"?[t]:[];case"booleans":return typeof t=="boolean"?[t]:[];case"nulls":return t===null?[t]:[];case"arrays":return Array.isArray(t)?[t]:[];case"objects":return t&&typeof t=="object"&&!Array.isArray(t)?[t]:[];case"iterables":return Array.isArray(t)||t&&typeof t=="object"&&!Array.isArray(t)?[t]:[];case"scalars":return!Array.isArray(t)&&!(t&&typeof t=="object")?[t]:[];case"now":return[Date.now()/1e3];case"env":return[i.env??{}];case"recurse":{if(n.length===0){let f=[],c=p=>{if(f.push(p),Array.isArray(p))for(let y of p)c(y);else if(p&&typeof p=="object")for(let y of Object.keys(p))c(p[y])};return c(t),f}let r=[],s=new Set,o=f=>{let c=JSON.stringify(f);if(s.has(c))return;s.add(c),r.push(f);let p=u(f,n[0],i);for(let y of p)y!=null&&o(y)};return o(t),r}case"recurse_down":return C(t,"recurse",n,i);case"walk":{if(n.length===0)return[t];let r=new WeakSet,s=o=>{if(o&&typeof o=="object"){if(r.has(o))return o;r.add(o)}let f;if(Array.isArray(o))f=o.map(s);else if(o&&typeof o=="object"){let p={};for(let[y,h]of Object.entries(o))p[y]=s(h);f=p}else f=o;return u(f,n[0],i)[0]};return[s(t)]}case"transpose":{if(!Array.isArray(t))return[null];if(t.length===0)return[[]];let r=Math.max(...t.map(o=>Array.isArray(o)?o.length:0)),s=[];for(let o=0;o<r;o++)s.push(t.map(f=>Array.isArray(f)?f[o]:null));return[s]}case"ascii":return typeof t=="string"&&t.length>0?[t.charCodeAt(0)]:[null];case"explode":return typeof t=="string"?[Array.from(t).map(r=>r.codePointAt(0))]:[null];case"implode":return Array.isArray(t)?[String.fromCodePoint(...t)]:[null];case"tojson":case"tojsonstream":return[JSON.stringify(t)];case"fromjson":{if(typeof t=="string")try{return[JSON.parse(t)]}catch{return[null]}return[null]}case"limit":{if(n.length<2)return[];let s=u(t,n[0],i)[0];return u(t,n[1],i).slice(0,s)}case"until":{if(n.length<2)return[t];let r=t,s=i.limits.maxIterations;for(let o=0;o<s;o++){if(u(r,n[0],i).some(d))return[r];let c=u(r,n[1],i);if(c.length===0)return[r];r=c[0]}throw new k(`jq until: too many iterations (${s}), increase executionLimits.maxJqIterations`,"iterations")}case"while":{if(n.length<2)return[t];let r=[],s=t,o=i.limits.maxIterations;for(let f=0;f<o&&u(s,n[0],i).some(d);f++){r.push(s);let p=u(s,n[1],i);if(p.length===0)break;s=p[0]}if(r.length>=o)throw new k(`jq while: too many iterations (${o}), increase executionLimits.maxJqIterations`,"iterations");return r}case"repeat":{if(n.length===0)return[t];let r=[],s=t,o=i.limits.maxIterations;for(let f=0;f<o;f++){r.push(s);let c=u(s,n[0],i);if(c.length===0)break;s=c[0]}if(r.length>=o)throw new k(`jq repeat: too many iterations (${o}), increase executionLimits.maxJqIterations`,"iterations");return r}case"debug":return[t];case"input_line_number":return[1];case"@base64":return typeof t=="string"?typeof Buffer<"u"?[Buffer.from(t,"utf-8").toString("base64")]:[btoa(t)]:[null];case"@base64d":return typeof t=="string"?typeof Buffer<"u"?[Buffer.from(t,"base64").toString("utf-8")]:[atob(t)]:[null];case"@uri":return typeof t=="string"?[encodeURIComponent(t)]:[null];case"@csv":return Array.isArray(t)?[t.map(s=>{let o=String(s??"");return o.includes(",")||o.includes('"')||o.includes(`
3
+ `)?`"${o.replace(/"/g,'""')}"`:o}).join(",")]:[null];case"@tsv":return Array.isArray(t)?[t.map(r=>String(r??"").replace(/\t/g,"\\t").replace(/\n/g,"\\n")).join(" ")]:[null];case"@json":return[JSON.stringify(t)];case"@html":return typeof t=="string"?[t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")]:[null];case"@sh":return typeof t=="string"?[`'${t.replace(/'/g,"'\\''")}'`]:[null];case"@text":return typeof t=="string"?[t]:t==null?[""]:[String(t)];case"parent":{if(i.root===void 0||i.currentPath===void 0)return[];let r=i.currentPath;if(r.length===0)return[];let s=n.length>0?u(t,n[0],i)[0]:1;if(s>=0){if(s>r.length)return[];let o=r.slice(0,r.length-s);return[S(i.root,o)]}else{let o=-s-1;if(o>=r.length)return[t];let f=r.slice(0,o);return[S(i.root,f)]}}case"parents":{if(i.root===void 0||i.currentPath===void 0)return[[]];let r=i.currentPath,s=[];for(let o=r.length-1;o>=0;o--)s.push(S(i.root,r.slice(0,o)));return[s]}case"root":return i.root!==void 0?[i.root]:[];default:throw new Error(`Unknown function: ${e}`)}}function m(t,e){let n=s=>s===null?0:typeof s=="boolean"?1:typeof s=="number"?2:typeof s=="string"?3:Array.isArray(s)?4:typeof s=="object"?5:6,i=n(t),r=n(e);if(i!==r)return i-r;if(typeof t=="number"&&typeof e=="number")return t-e;if(typeof t=="string"&&typeof e=="string")return t.localeCompare(e);if(typeof t=="boolean"&&typeof e=="boolean")return(t?1:0)-(e?1:0);if(Array.isArray(t)&&Array.isArray(e)){for(let s=0;s<Math.min(t.length,e.length);s++){let o=m(t[s],e[s]);if(o!==0)return o}return t.length-e.length}return 0}function O(t,e){if(g(t,e))return!0;if(Array.isArray(t)&&Array.isArray(e))return e.every(n=>t.some(i=>O(i,n)));if(t&&e&&typeof t=="object"&&typeof e=="object"&&!Array.isArray(t)&&!Array.isArray(e)){let n=t,i=e;return Object.keys(i).every(r=>r in n&&O(n[r],i[r]))}return!1}function R(t,e,n){if(e.length===0)return n;let[i,...r]=e;if(typeof i=="number"){let o=Array.isArray(t)?[...t]:[];for(;o.length<=i;)o.push(null);return o[i]=R(o[i],r,n),o}let s=t&&typeof t=="object"&&!Array.isArray(t)?{...t}:{};return s[i]=R(s[i],r,n),s}function x(t,e){if(e.length===0)return null;if(e.length===1){let r=e[0];if(Array.isArray(t)&&typeof r=="number"){let s=[...t];return s.splice(r,1),s}if(t&&typeof t=="object"&&!Array.isArray(t)){let s={...t};return delete s[String(r)],s}return t}let[n,...i]=e;if(Array.isArray(t)&&typeof n=="number"){let r=[...t];return r[n]=x(r[n],i),r}if(t&&typeof t=="object"&&!Array.isArray(t)){let r={...t};return r[String(n)]=x(r[String(n)],i),r}return t}function $(t,e,n,i,r){u(t,e,n).length>0&&r.push(i)}var F={and:"AND",or:"OR",not:"NOT",if:"IF",then:"THEN",elif:"ELIF",else:"ELSE",end:"END",as:"AS",try:"TRY",catch:"CATCH",true:"TRUE",false:"FALSE",null:"NULL",reduce:"REDUCE",foreach:"FOREACH"};function L(t){let e=[],n=0,i=(p=0)=>t[n+p],r=()=>t[n++],s=()=>n>=t.length,o=p=>p>="0"&&p<="9",f=p=>p>="a"&&p<="z"||p>="A"&&p<="Z"||p==="_",c=p=>f(p)||o(p);for(;!s();){let p=n,y=r();if(!(y===" "||y===" "||y===`
4
+ `||y==="\r")){if(y==="#"){for(;!s()&&i()!==`
5
+ `;)r();continue}if(y==="."&&i()==="."){r(),e.push({type:"DOTDOT",pos:p});continue}if(y==="="&&i()==="="){r(),e.push({type:"EQ",pos:p});continue}if(y==="!"&&i()==="="){r(),e.push({type:"NE",pos:p});continue}if(y==="<"&&i()==="="){r(),e.push({type:"LE",pos:p});continue}if(y===">"&&i()==="="){r(),e.push({type:"GE",pos:p});continue}if(y==="/"&&i()==="/"){r(),i()==="="?(r(),e.push({type:"UPDATE_ALT",pos:p})):e.push({type:"ALT",pos:p});continue}if(y==="+"&&i()==="="){r(),e.push({type:"UPDATE_ADD",pos:p});continue}if(y==="-"&&i()==="="){r(),e.push({type:"UPDATE_SUB",pos:p});continue}if(y==="*"&&i()==="="){r(),e.push({type:"UPDATE_MUL",pos:p});continue}if(y==="/"&&i()==="="){r(),e.push({type:"UPDATE_DIV",pos:p});continue}if(y==="%"&&i()==="="){r(),e.push({type:"UPDATE_MOD",pos:p});continue}if(y==="="&&i()!=="="){e.push({type:"ASSIGN",pos:p});continue}if(y==="."){e.push({type:"DOT",pos:p});continue}if(y==="|"){i()==="="?(r(),e.push({type:"UPDATE_PIPE",pos:p})):e.push({type:"PIPE",pos:p});continue}if(y===","){e.push({type:"COMMA",pos:p});continue}if(y===":"){e.push({type:"COLON",pos:p});continue}if(y===";"){e.push({type:"SEMICOLON",pos:p});continue}if(y==="("){e.push({type:"LPAREN",pos:p});continue}if(y===")"){e.push({type:"RPAREN",pos:p});continue}if(y==="["){e.push({type:"LBRACKET",pos:p});continue}if(y==="]"){e.push({type:"RBRACKET",pos:p});continue}if(y==="{"){e.push({type:"LBRACE",pos:p});continue}if(y==="}"){e.push({type:"RBRACE",pos:p});continue}if(y==="?"){e.push({type:"QUESTION",pos:p});continue}if(y==="+"){e.push({type:"PLUS",pos:p});continue}if(y==="-"){if(o(i())){let h=y;for(;!s()&&(o(i())||i()===".");)h+=r();e.push({type:"NUMBER",value:Number(h),pos:p});continue}e.push({type:"MINUS",pos:p});continue}if(y==="*"){e.push({type:"STAR",pos:p});continue}if(y==="/"){e.push({type:"SLASH",pos:p});continue}if(y==="%"){e.push({type:"PERCENT",pos:p});continue}if(y==="<"){e.push({type:"LT",pos:p});continue}if(y===">"){e.push({type:"GT",pos:p});continue}if(o(y)){let h=y;for(;!s()&&(o(i())||i()==="."||i()==="e"||i()==="E");)(i()==="e"||i()==="E")&&(t[n+1]==="+"||t[n+1]==="-")&&(h+=r()),h+=r();e.push({type:"NUMBER",value:Number(h),pos:p});continue}if(y==='"'){let h="";for(;!s()&&i()!=='"';)if(i()==="\\"){if(r(),s())break;let a=r();switch(a){case"n":h+=`
6
+ `;break;case"r":h+="\r";break;case"t":h+=" ";break;case"\\":h+="\\";break;case'"':h+='"';break;case"(":h+="\\(";break;default:h+=a}}else h+=r();s()||r(),e.push({type:"STRING",value:h,pos:p});continue}if(f(y)||y==="$"||y==="@"){let h=y;for(;!s()&&c(i());)h+=r();let a=F[h];a?e.push({type:a,pos:p}):e.push({type:"IDENT",value:h,pos:p});continue}throw new Error(`Unexpected character '${y}' at position ${p}`)}}return e.push({type:"EOF",pos:n}),e}var P=class t{tokens;pos=0;constructor(e){this.tokens=e}peek(e=0){return this.tokens[this.pos+e]??{type:"EOF",pos:-1}}advance(){return this.tokens[this.pos++]}check(e){return this.peek().type===e}match(...e){for(let n of e)if(this.check(n))return this.advance();return null}expect(e,n){if(!this.check(e))throw new Error(`${n} at position ${this.peek().pos}, got ${this.peek().type}`);return this.advance()}parse(){let e=this.parseExpr();if(!this.check("EOF"))throw new Error(`Unexpected token ${this.peek().type} at position ${this.peek().pos}`);return e}parseExpr(){return this.parsePipe()}parsePipe(){let e=this.parseComma();for(;this.match("PIPE");){let n=this.parseComma();e={type:"Pipe",left:e,right:n}}return e}parseComma(){let e=this.parseVarBind();for(;this.match("COMMA");){let n=this.parseVarBind();e={type:"Comma",left:e,right:n}}return e}parseVarBind(){let e=this.parseUpdate();if(this.match("AS")){let n=this.expect("IDENT","Expected variable name after 'as'"),i=n.value;if(!i.startsWith("$"))throw new Error(`Variable name must start with $ at position ${n.pos}`);this.expect("PIPE","Expected '|' after variable binding");let r=this.parseExpr();return{type:"VarBind",name:i,value:e,body:r}}return e}parseUpdate(){let e=this.parseAlt(),n={ASSIGN:"=",UPDATE_ADD:"+=",UPDATE_SUB:"-=",UPDATE_MUL:"*=",UPDATE_DIV:"/=",UPDATE_MOD:"%=",UPDATE_ALT:"//=",UPDATE_PIPE:"|="},i=this.match("ASSIGN","UPDATE_ADD","UPDATE_SUB","UPDATE_MUL","UPDATE_DIV","UPDATE_MOD","UPDATE_ALT","UPDATE_PIPE");if(i){let r=this.parseVarBind();return{type:"UpdateOp",op:n[i.type],path:e,value:r}}return e}parseAlt(){let e=this.parseOr();for(;this.match("ALT");){let n=this.parseOr();e={type:"BinaryOp",op:"//",left:e,right:n}}return e}parseOr(){let e=this.parseAnd();for(;this.match("OR");){let n=this.parseAnd();e={type:"BinaryOp",op:"or",left:e,right:n}}return e}parseAnd(){let e=this.parseNot();for(;this.match("AND");){let n=this.parseNot();e={type:"BinaryOp",op:"and",left:e,right:n}}return e}parseNot(){return this.parseComparison()}parseComparison(){let e=this.parseAddSub(),n={EQ:"==",NE:"!=",LT:"<",LE:"<=",GT:">",GE:">="},i=this.match("EQ","NE","LT","LE","GT","GE");if(i){let r=this.parseAddSub();e={type:"BinaryOp",op:n[i.type],left:e,right:r}}return e}parseAddSub(){let e=this.parseMulDiv();for(;;)if(this.match("PLUS")){let n=this.parseMulDiv();e={type:"BinaryOp",op:"+",left:e,right:n}}else if(this.match("MINUS")){let n=this.parseMulDiv();e={type:"BinaryOp",op:"-",left:e,right:n}}else break;return e}parseMulDiv(){let e=this.parseUnary();for(;;)if(this.match("STAR")){let n=this.parseUnary();e={type:"BinaryOp",op:"*",left:e,right:n}}else if(this.match("SLASH")){let n=this.parseUnary();e={type:"BinaryOp",op:"/",left:e,right:n}}else if(this.match("PERCENT")){let n=this.parseUnary();e={type:"BinaryOp",op:"%",left:e,right:n}}else break;return e}parseUnary(){return this.match("MINUS")?{type:"UnaryOp",op:"-",operand:this.parseUnary()}:this.parsePostfix()}parsePostfix(){let e=this.parsePrimary();for(;;)if(this.match("QUESTION"))e={type:"Optional",expr:e};else if(this.check("DOT")&&this.peek(1).type==="IDENT")this.advance(),e={type:"Field",name:this.expect("IDENT","Expected field name").value,base:e};else if(this.check("LBRACKET"))if(this.advance(),this.match("RBRACKET"))e={type:"Iterate",base:e};else if(this.check("COLON")){this.advance();let n=this.check("RBRACKET")?void 0:this.parseExpr();this.expect("RBRACKET","Expected ']'"),e={type:"Slice",end:n,base:e}}else{let n=this.parseExpr();if(this.match("COLON")){let i=this.check("RBRACKET")?void 0:this.parseExpr();this.expect("RBRACKET","Expected ']'"),e={type:"Slice",start:n,end:i,base:e}}else this.expect("RBRACKET","Expected ']'"),e={type:"Index",index:n,base:e}}else break;return e}parsePrimary(){if(this.match("DOTDOT"))return{type:"Recurse"};if(this.match("DOT")){if(this.check("LBRACKET")){if(this.advance(),this.match("RBRACKET"))return{type:"Iterate"};if(this.check("COLON")){this.advance();let n=this.check("RBRACKET")?void 0:this.parseExpr();return this.expect("RBRACKET","Expected ']'"),{type:"Slice",end:n}}let e=this.parseExpr();if(this.match("COLON")){let n=this.check("RBRACKET")?void 0:this.parseExpr();return this.expect("RBRACKET","Expected ']'"),{type:"Slice",start:e,end:n}}return this.expect("RBRACKET","Expected ']'"),{type:"Index",index:e}}return this.check("IDENT")?{type:"Field",name:this.advance().value}:{type:"Identity"}}if(this.match("TRUE"))return{type:"Literal",value:!0};if(this.match("FALSE"))return{type:"Literal",value:!1};if(this.match("NULL"))return{type:"Literal",value:null};if(this.check("NUMBER"))return{type:"Literal",value:this.advance().value};if(this.check("STRING")){let n=this.advance().value;return n.includes("\\(")?this.parseStringInterpolation(n):{type:"Literal",value:n}}if(this.match("LBRACKET")){if(this.match("RBRACKET"))return{type:"Array"};let e=this.parseExpr();return this.expect("RBRACKET","Expected ']'"),{type:"Array",elements:e}}if(this.match("LBRACE"))return this.parseObjectConstruction();if(this.match("LPAREN")){let e=this.parseExpr();return this.expect("RPAREN","Expected ')'"),{type:"Paren",expr:e}}if(this.match("IF"))return this.parseIf();if(this.match("TRY")){let e=this.parsePostfix(),n;return this.match("CATCH")&&(n=this.parsePostfix()),{type:"Try",body:e,catch:n}}if(this.match("REDUCE")){let e=this.parsePostfix();this.expect("AS","Expected 'as' after reduce expression");let n=this.expect("IDENT","Expected variable name"),i=n.value;if(!i.startsWith("$"))throw new Error(`Variable name must start with $ at position ${n.pos}`);this.expect("LPAREN","Expected '(' after variable");let r=this.parseExpr();this.expect("SEMICOLON","Expected ';' after init expression");let s=this.parseExpr();return this.expect("RPAREN","Expected ')' after update expression"),{type:"Reduce",expr:e,varName:i,init:r,update:s}}if(this.match("FOREACH")){let e=this.parsePostfix();this.expect("AS","Expected 'as' after foreach expression");let n=this.expect("IDENT","Expected variable name"),i=n.value;if(!i.startsWith("$"))throw new Error(`Variable name must start with $ at position ${n.pos}`);this.expect("LPAREN","Expected '(' after variable");let r=this.parseExpr();this.expect("SEMICOLON","Expected ';' after init expression");let s=this.parseExpr(),o;return this.match("SEMICOLON")&&(o=this.parseExpr()),this.expect("RPAREN","Expected ')' after expressions"),{type:"Foreach",expr:e,varName:i,init:r,update:s,extract:o}}if(this.match("NOT"))return{type:"Call",name:"not",args:[]};if(this.check("IDENT")){let n=this.advance().value;if(n.startsWith("$"))return{type:"VarRef",name:n};if(this.match("LPAREN")){let i=[];if(!this.check("RPAREN"))for(i.push(this.parseExpr());this.match("SEMICOLON");)i.push(this.parseExpr());return this.expect("RPAREN","Expected ')'"),{type:"Call",name:n,args:i}}return{type:"Call",name:n,args:[]}}throw new Error(`Unexpected token ${this.peek().type} at position ${this.peek().pos}`)}parseObjectConstruction(){let e=[];if(!this.check("RBRACE"))do{let n,i;if(this.match("LPAREN"))n=this.parseExpr(),this.expect("RPAREN","Expected ')'"),this.expect("COLON","Expected ':'"),i=this.parseObjectValue();else if(this.check("IDENT")){let r=this.advance().value;this.match("COLON")?(n=r,i=this.parseObjectValue()):(n=r,i={type:"Field",name:r})}else if(this.check("STRING"))n=this.advance().value,this.expect("COLON","Expected ':'"),i=this.parseObjectValue();else throw new Error(`Expected object key at position ${this.peek().pos}`);e.push({key:n,value:i})}while(this.match("COMMA"));return this.expect("RBRACE","Expected '}'"),{type:"Object",entries:e}}parseObjectValue(){let e=this.parseVarBind();for(;this.match("PIPE");){let n=this.parseVarBind();e={type:"Pipe",left:e,right:n}}return e}parseIf(){let e=this.parseExpr();this.expect("THEN","Expected 'then'");let n=this.parseExpr(),i=[];for(;this.match("ELIF");){let s=this.parseExpr();this.expect("THEN","Expected 'then' after elif");let o=this.parseExpr();i.push({cond:s,then:o})}let r;return this.match("ELSE")&&(r=this.parseExpr()),this.expect("END","Expected 'end'"),{type:"Cond",cond:e,then:n,elifs:i,else:r}}parseStringInterpolation(e){let n=[],i="",r=0;for(;r<e.length;)if(e[r]==="\\"&&e[r+1]==="("){i&&(n.push(i),i=""),r+=2;let s=1,o="";for(;r<e.length&&s>0;)e[r]==="("?s++:e[r]===")"&&s--,s>0&&(o+=e[r]),r++;let f=L(o),c=new t(f);n.push(c.parse())}else i+=e[r],r++;return i&&n.push(i),{type:"StringInterp",parts:n}}};function q(t){let e=L(t);return new P(e).parse()}export{u as a,q as b};
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env node
2
+ import{a as y,b as x}from"./chunk-WEONT2KP.js";import{i as q}from"./chunk-NWWB2XRE.js";import{a as w,b as N,c as O}from"./chunk-GTNBSMZR.js";import"./chunk-SJXDWN5X.js";var E={name:"jq",summary:"command-line JSON processor",usage:"jq [OPTIONS] FILTER [FILE]",options:["-r, --raw-output output strings without quotes","-c, --compact compact output (no pretty printing)","-e, --exit-status set exit status based on output","-s, --slurp read entire input into array","-n, --null-input don't read any input","-j, --join-output don't print newlines after each output","-a, --ascii force ASCII output","-S, --sort-keys sort object keys","-C, --color colorize output (ignored)","-M, --monochrome monochrome output (ignored)"," --tab use tabs for indentation"," --help display this help and exit"]};function g(t,o,d,u,f,l=0){if(t===null||t===void 0)return"null";if(typeof t=="boolean")return String(t);if(typeof t=="number")return Number.isFinite(t)?String(t):"null";if(typeof t=="string")return d?t:JSON.stringify(t);let a=f?" ":" ";if(Array.isArray(t))return t.length===0?"[]":o?`[${t.map(p=>g(p,!0,!1,u,f)).join(",")}]`:`[
3
+ ${t.map(p=>a.repeat(l+1)+g(p,!1,!1,u,f,l+1)).join(`,
4
+ `)}
5
+ ${a.repeat(l)}]`;if(typeof t=="object"){let n=Object.keys(t);return u&&(n=n.sort()),n.length===0?"{}":o?`{${n.map(c=>`${JSON.stringify(c)}:${g(t[c],!0,!1,u,f)}`).join(",")}}`:`{
6
+ ${n.map(c=>{let S=g(t[c],!1,!1,u,f,l+1);return`${a.repeat(l+1)}${JSON.stringify(c)}: ${S}`}).join(`,
7
+ `)}
8
+ ${a.repeat(l)}}`}return String(t)}var A={name:"jq",async execute(t,o){if(N(t))return w(E);let d=!1,u=!1,f=!1,l=!1,a=!1,n=!1,p=!1,c=!1,S=".",C=!1,m=[];for(let s=0;s<t.length;s++){let e=t[s];if(e==="-r"||e==="--raw-output")d=!0;else if(e==="-c"||e==="--compact-output")u=!0;else if(e==="-e"||e==="--exit-status")f=!0;else if(e==="-s"||e==="--slurp")l=!0;else if(e==="-n"||e==="--null-input")a=!0;else if(e==="-j"||e==="--join-output")n=!0;else if(!(e==="-a"||e==="--ascii")){if(e==="-S"||e==="--sort-keys")p=!0;else if(!(e==="-C"||e==="--color")){if(!(e==="-M"||e==="--monochrome"))if(e==="--tab")c=!0;else if(e==="-")m.push("-");else{if(e.startsWith("--"))return O("jq",e);if(e.startsWith("-")){for(let r of e.slice(1))if(r==="r")d=!0;else if(r==="c")u=!0;else if(r==="e")f=!0;else if(r==="s")l=!0;else if(r==="n")a=!0;else if(r==="j")n=!0;else if(r!=="a"){if(r==="S")p=!0;else if(r!=="C"){if(r!=="M")return O("jq",`-${r}`)}}}else C?m.push(e):(S=e,C=!0)}}}}let h;if(a)h="";else if(m.length===0||m.length===1&&m[0]==="-")h=o.stdin;else try{let s=o.fs.resolvePath(o.cwd,m[0]);h=await o.fs.readFile(s)}catch{return{stdout:"",stderr:`jq: ${m[0]}: No such file or directory
9
+ `,exitCode:2}}try{let s=x(S),e,r={limits:o.limits?{maxIterations:o.limits.maxJqIterations}:void 0,env:o.env};if(a)e=y(null,s,r);else if(l){let i=[];for(let j of h.trim().split(`
10
+ `))j.trim()&&i.push(JSON.parse(j));e=y(i,s,r)}else{let i=h.trim();if(i.startsWith("{")||i.startsWith("["))e=y(JSON.parse(i),s,r);else{e=[];for(let j of i.split(`
11
+ `))j.trim()&&e.push(...y(JSON.parse(j),s,r))}}let I=e.map(i=>g(i,u,d,p,c)),J=n?"":`
12
+ `,$=I.join(J),b=f&&(e.length===0||e.every(i=>i==null||i===!1))?1:0;return{stdout:$?n?$:`${$}
13
+ `:"",stderr:"",exitCode:b}}catch(s){if(s instanceof q)return{stdout:"",stderr:`jq: ${s.message}
14
+ `,exitCode:q.EXIT_CODE};let e=s.message;return e.includes("Unknown function")?{stdout:"",stderr:`jq: error: ${e}
15
+ `,exitCode:3}:{stdout:"",stderr:`jq: parse error: ${e}
16
+ `,exitCode:5}}}};export{A as jqCommand};