@zaly/agent 0.0.11 → 0.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.
Files changed (47) hide show
  1. package/dist/{agent-D3wVIibN.mjs → agent-D5NrjvG5.mjs} +16 -16
  2. package/dist/agent-D5NrjvG5.mjs.map +1 -0
  3. package/dist/{bash-COgq4W7U.mjs → bash-9x8PPg0A.mjs} +6 -6
  4. package/dist/bash-9x8PPg0A.mjs.map +1 -0
  5. package/dist/{compactions-B8VdZJoU.mjs → compactions-D9XlwQGO.mjs} +4 -3
  6. package/dist/{compactions-B8VdZJoU.mjs.map → compactions-D9XlwQGO.mjs.map} +1 -1
  7. package/dist/fetch-D0IeDN6H.mjs +159 -0
  8. package/dist/fetch-D0IeDN6H.mjs.map +1 -0
  9. package/dist/{find-CimUGn-L.mjs → find-D1Z2ac_b.mjs} +28 -10
  10. package/dist/find-D1Z2ac_b.mjs.map +1 -0
  11. package/dist/{grep-6O3mjSvV.mjs → grep-By4wLRDk.mjs} +17 -7
  12. package/dist/grep-By4wLRDk.mjs.map +1 -0
  13. package/dist/html-J629LNIm.mjs +33225 -0
  14. package/dist/html-J629LNIm.mjs.map +1 -0
  15. package/dist/index.d.mts +77 -21
  16. package/dist/index.d.mts.map +1 -1
  17. package/dist/index.mjs +2 -2
  18. package/dist/{manager-BqlbCGYV.mjs → manager-BJLjayBz.mjs} +2 -2
  19. package/dist/{manager-BqlbCGYV.mjs.map → manager-BJLjayBz.mjs.map} +1 -1
  20. package/dist/{masker-DRFztUwc.mjs → masker-jgSUXzjY.mjs} +2 -2
  21. package/dist/{masker-DRFztUwc.mjs.map → masker-jgSUXzjY.mjs.map} +1 -1
  22. package/dist/{read-CSL_8nAk.mjs → read-B-hwcc2Q.mjs} +7 -4
  23. package/dist/read-B-hwcc2Q.mjs.map +1 -0
  24. package/dist/{registry-L9GDccS0.mjs → registry-Zo0QmKdR.mjs} +14 -16
  25. package/dist/registry-Zo0QmKdR.mjs.map +1 -0
  26. package/dist/rolldown-runtime-DktXgydw.mjs +35 -0
  27. package/dist/{search-CRw247ES.mjs → search-CH0D5CkV.mjs} +19 -15
  28. package/dist/search-CH0D5CkV.mjs.map +1 -0
  29. package/dist/{session-BSvUrr12.mjs → session-CACkHyDR.mjs} +2 -2
  30. package/dist/{session-BSvUrr12.mjs.map → session-CACkHyDR.mjs.map} +1 -1
  31. package/dist/session.mjs +1 -1
  32. package/dist/{src-fK6DL2bg.mjs → src-DoXC_gDY.mjs} +15 -14
  33. package/dist/{src-fK6DL2bg.mjs.map → src-DoXC_gDY.mjs.map} +1 -1
  34. package/dist/{subagent-C8XCEecM.mjs → subagent-BMQMbANL.mjs} +2 -2
  35. package/dist/{subagent-C8XCEecM.mjs.map → subagent-BMQMbANL.mjs.map} +1 -1
  36. package/dist/{tools-wvkkuXWH.mjs → tools-CJ2x45EZ.mjs} +3 -34
  37. package/dist/{tools-wvkkuXWH.mjs.map → tools-CJ2x45EZ.mjs.map} +1 -1
  38. package/package.json +46 -8
  39. package/dist/agent-D3wVIibN.mjs.map +0 -1
  40. package/dist/bash-COgq4W7U.mjs.map +0 -1
  41. package/dist/fetch-VKhSWdEh.mjs +0 -111
  42. package/dist/fetch-VKhSWdEh.mjs.map +0 -1
  43. package/dist/find-CimUGn-L.mjs.map +0 -1
  44. package/dist/grep-6O3mjSvV.mjs.map +0 -1
  45. package/dist/read-CSL_8nAk.mjs.map +0 -1
  46. package/dist/registry-L9GDccS0.mjs.map +0 -1
  47. package/dist/search-CRw247ES.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"tools-wvkkuXWH.mjs","names":["shellParse"],"sources":["../../../node_modules/.bun/shell-quote@1.12.0/node_modules/shell-quote/quote.js","../../../node_modules/.bun/shell-quote@1.12.0/node_modules/shell-quote/parse.js","../../../node_modules/.bun/shell-quote@1.12.0/node_modules/shell-quote/index.js","../src/utils/bash/parser.ts","../src/utils/bash/tools.ts"],"sourcesContent":["'use strict';\n\n/** @import { ControlOperator } from './parse' */\n\n/** @type {ControlOperator['op'][]} */\nvar OPS = /** @type {const} */ ([\n\t'||',\n\t'&&',\n\t';;&',\n\t';;',\n\t';&',\n\t'|&',\n\t'<(',\n\t'>(',\n\t'<<<',\n\t'<<-',\n\t'<<',\n\t'>>',\n\t'>&',\n\t'>|',\n\t'&>>',\n\t'&>',\n\t'<&',\n\t'<>',\n\t'&',\n\t';',\n\t'(',\n\t')',\n\t'|',\n\t'<',\n\t'>'\n]);\nvar LINE_TERMINATORS = /[\\n\\r\\u2028\\u2029]/;\nvar GLOB_SHELL_SPECIAL = /[\\s#!\"$&'():;<=>@\\\\^`|~]/g;\n\n/** @type {typeof import('./quote')} */\nmodule.exports = function quote(xs) {\n\tvar sawComment = false;\n\treturn xs.map(function (s) {\n\t\tif (sawComment && typeof s === 'string' && LINE_TERMINATORS.test(s)) {\n\t\t\tthrow new TypeError('a token after a `comment` must not contain line terminators');\n\t\t}\n\t\tif (s === '') {\n\t\t\treturn /** @type {const} */ ('\\'\\'');\n\t\t}\n\t\tif (s && typeof s === 'object') {\n\t\t\tif ('op' in s && s.op === 'glob') {\n\t\t\t\tif (typeof s.pattern !== 'string') {\n\t\t\t\t\tthrow new TypeError('glob token requires a string `pattern`');\n\t\t\t\t}\n\t\t\t\tif (LINE_TERMINATORS.test(s.pattern)) {\n\t\t\t\t\tthrow new TypeError('glob `pattern` must not contain line terminators');\n\t\t\t\t}\n\t\t\t\tif (s.pattern === '') {\n\t\t\t\t\treturn /** @type {const} */ ('\\'\\'');\n\t\t\t\t}\n\t\t\t\treturn s.pattern.replace(GLOB_SHELL_SPECIAL, '\\\\$&');\n\t\t\t}\n\t\t\tif ('op' in s && typeof s.op === 'string') {\n\t\t\t\tif (OPS.indexOf(s.op) < 0) {\n\t\t\t\t\tthrow new TypeError('invalid `op` value: ' + JSON.stringify(s.op));\n\t\t\t\t}\n\t\t\t\treturn s.op.replace(/[\\s\\S]/g, '\\\\$&');\n\t\t\t}\n\t\t\tif ('comment' in s && typeof s.comment === 'string') {\n\t\t\t\tif (LINE_TERMINATORS.test(s.comment)) {\n\t\t\t\t\tthrow new TypeError('`comment` must not contain line terminators');\n\t\t\t\t}\n\t\t\t\tsawComment = true;\n\t\t\t\treturn '#' + s.comment;\n\t\t\t}\n\t\t\tthrow new TypeError('unrecognized object token shape');\n\t\t}\n\t\tif ((/'/).test(s) && (/!/).test(s)) {\n\t\t\treturn \"'\" + s.replace(/'/g, \"'\\\"'\\\"'\") + \"'\";\n\t\t}\n\t\tif ((/[\"\\s\\\\]/).test(s) && !(/'/).test(s)) {\n\t\t\treturn \"'\" + s + \"'\";\n\t\t}\n\t\tif ((/[\"'\\s]/).test(s)) {\n\t\t\treturn '\"' + s.replace(/([\"\\\\$`])/g, '\\\\$1') + '\"';\n\t\t}\n\t\treturn String(s).replace(/([A-Za-z]:)?([#!\"$&'()*,:;<=>?@[\\\\\\]^`{|}~])/g, '$1\\\\$2');\n\t}).join(' ');\n};\n","'use strict';\n\n/**\n * @import {\n * \tControlOperator,\n * \tEnv,\n * \tGlobPattern,\n * \tParseEntry,\n * } from './parse' */\n\n// '<(' and '>(' are process substitution operators and\n// can be parsed the same as control operator\nvar CONTROL = /** @type {const} */ ('(?:') + /** @type {const} */ ([\n\t'\\\\|\\\\|',\n\t'\\\\&(?:\\\\&|>>?)', // `&&`, `&>`, and `&>>`\n\t';;\\\\&?', // `;;` and `;;&`\n\t'[;|]\\\\&', // `;&` and `|&`\n\t'\\\\<\\\\(',\n\t'\\\\<\\\\<\\\\<',\n\t'\\\\<\\\\<-',\n\t'\\\\<\\\\<(?!\\\\()', // `<<(` stays `<` and `<(`, as zsh reads it; other shells reject it\n\t'>>',\n\t'>[&|(]', // `>&`, `>|`, and `>(`\n\t'<[&>]', // `<&` and `<>`\n\t'[&;()|<>]'\n]).join(/** @type {const} */ ('|')) + /** @type {const} */ (')');\nvar controlRE = new RegExp('^' + CONTROL + '$');\nvar META = /** @type {const} */ ('|&;()<> \\\\t');\nvar SINGLE_QUOTE = /** @type {const} */ ('\\'([^\\']*?)\\'');\n// bash ANSI-C quoting, `$'...'`: a backslash escapes the next character, including `'`\nvar ANSI_C_BODY = '(?:\\\\\\\\[\\\\s\\\\S]|[^\\\\\\\\\\'])*?';\nvar ANSI_C_QUOTE = '\\\\$\\'' + ANSI_C_BODY + '\\'';\nvar ansiCAt = new RegExp('\\\\$\\'' + ANSI_C_BODY + '(?:(\\')|\\\\\\\\?$)', 'g');\nvar ANSI_C_LETTERS = 'abeEfnrtv';\nvar ANSI_C_CHARS = '\\x07\\b\\x1B\\x1B\\f\\n\\r\\t\\v';\nvar hash = /^#$/;\n\nvar SQ = /** @type {const} */ (\"'\");\nvar DQ = /** @type {const} */ ('\"');\nvar DS = /** @type {const} */ ('$');\n\nvar TOKEN = '';\nvar mult = /** @type {const} */ (0x100000000); // Math.pow(16, 8);\nfor (var i = 0; i < 4; i++) {\n\tTOKEN += (mult * Math.random()).toString(16);\n}\nvar startsWithToken = new RegExp('^' + TOKEN);\n\n/**\n * @param {string} s\n * @param {RegExp} r\n */\nfunction matchAll(s, r) {\n\tvar origIndex = r.lastIndex;\n\n\tvar matches = [];\n\tvar matchObj;\n\n\twhile ((matchObj = r.exec(s))) {\n\t\tmatches[matches.length] = matchObj;\n\t\tif (r.lastIndex === matchObj.index) {\n\t\t\tr.lastIndex += 1;\n\t\t}\n\t}\n\n\tr.lastIndex = origIndex;\n\n\treturn matches;\n}\n\n/**\n * @param {Env} env\n * @param {string} pre\n * @param {string} key\n */\nfunction getVar(env, pre, key) {\n\tvar r = typeof env === 'function' ? env(key) : env[key];\n\tif (typeof r === 'undefined' && key != '') {\n\t\tr = '';\n\t} else if (typeof r === 'undefined') {\n\t\tr = '$';\n\t}\n\n\tif (typeof r === 'object') {\n\t\treturn pre + TOKEN + JSON.stringify(r) + TOKEN;\n\t}\n\treturn pre + r;\n}\n\nvar ansiCEscape = /\\\\([0-7]{1,3}|x[\\dA-Fa-f]{1,2}|u[\\dA-Fa-f]{1,4}|U[\\dA-Fa-f]{1,8}|c(?:\\\\\\\\|[\\s\\S])|[abeEfnrtv\\\\'\"?])/g;\n\n/**\n * @param {string} m\n * @param {string} escape\n */\nfunction expandAnsiCEscape(m, escape) {\n\tvar kind = escape.charAt(0);\n\tif (kind === 'c') {\n\t\tvar ctrl = escape.charAt(1);\n\t\treturn ctrl === '?' ? '\\x7F' : String.fromCharCode(ctrl.charCodeAt(0) & 0x1F);\n\t}\n\tif (kind === 'x' || kind === 'u' || kind === 'U') {\n\t\tvar cp = parseInt(escape.slice(1), 16);\n\t\tif (cp > 0x10FFFF) {\n\t\t\treturn m;\n\t\t}\n\t\treturn String.fromCharCode.apply(null, cp > 0xFFFF ? [0xD7C0 + (cp >> 10), 0xDC00 + (cp & 0x3FF)] : [cp]);\n\t}\n\tif (kind >= '0' && kind <= '7') {\n\t\treturn String.fromCharCode(parseInt(escape, 8) & 0xFF);\n\t}\n\tvar letter = ANSI_C_LETTERS.indexOf(escape);\n\treturn letter < 0 ? escape : ANSI_C_CHARS.charAt(letter);\n}\n\n/** @param {string} body */\nfunction expandAnsiC(body) {\n\treturn body.replace(ansiCEscape, expandAnsiCEscape).split('\\0')[0]; // like bash, a NUL ends the string\n}\n\n/**\n * @param {string} s\n * @param {number} i\n */\nfunction closesAnsiC(s, i) {\n\tansiCAt.lastIndex = i;\n\treturn !!(/** @type {RegExpExecArray} */ (ansiCAt.exec(s)))[1];\n}\n\n/**\n * @param {string} string\n * @param {Env} [env]\n * @param {{ escape?: string, splitUnquoted?: boolean | string }} [opts]\n * @returns {ParseEntry[]}\n */\nfunction parseInternal(string, env, opts) {\n\tif (!opts) {\n\t\topts = {};\n\t}\n\tvar BS = opts.escape || '\\\\';\n\tvar ifs = opts.splitUnquoted === true ? ' \\t\\n' : (typeof opts.splitUnquoted === 'string' ? opts.splitUnquoted : '');\n\tvar BAREWORD = '(\\\\' + BS + '[\\'\"$\\\\' + BS + META + ']|\\\\$\\\\$|\\\\$(?!' + ANSI_C_QUOTE.slice(2) + ')|[^\\\\s\\'\"$' + META + '])+';\n\tvar DOUBLE_QUOTE = '\"(?:\\\\' + BS + '[\\\\s\\\\S]|[^\"\\\\' + BS + '])*\"';\n\n\tvar chunker = new RegExp([\n\t\t'(' + CONTROL + ')', // control chars\n\t\t'(' + ANSI_C_QUOTE + '|' + BAREWORD + '|' + DOUBLE_QUOTE + '|' + SINGLE_QUOTE + ')+'\n\t].join('|'), 'g');\n\n\tvar matches = matchAll(string, chunker);\n\n\tif (matches.length === 0) {\n\t\treturn [];\n\t}\n\tif (!env) {\n\t\tenv = {};\n\t}\n\n\tvar commented = false;\n\n\treturn matches.map(function (match) {\n\t\tvar s = match[0];\n\t\tif (!s || commented) {\n\t\t\treturn void undefined;\n\t\t}\n\t\tif (controlRE.test(s)) {\n\t\t\treturn /** @type {ControlOperator} */ ({ op: s });\n\t\t}\n\n\t\t// Hand-written scanner/parser for Bash quoting rules:\n\t\t//\n\t\t// 1. inside single quotes, all characters are printed literally.\n\t\t// 2. inside double quotes, all characters are printed literally\n\t\t// except variables prefixed by '$' and backslashes followed by\n\t\t// either a double quote or another backslash.\n\t\t// 3. outside of any quotes, backslashes are treated as escape\n\t\t// characters and not printed (unless they are themselves escaped)\n\t\t// 4. quote context can switch mid-token if there is no whitespace\n\t\t// between the two quote contexts (e.g. all'one'\"token\" parses as\n\t\t// \"allonetoken\")\n\t\t/** @type {string | boolean} */\n\t\tvar quote = false;\n\t\tvar esc = false;\n\t\tvar out = '';\n\t\t/** @type {string[]} */\n\t\tvar words = [];\n\t\tvar sawQuote = false;\n\t\t/** @type {number | null} */\n\t\tvar pendingNw = null;\n\t\tvar isGlob = false;\n\t\t/** @type {number} */\n\t\tvar i;\n\n\t\tfunction parseEnvVar() {\n\t\t\ti += 1;\n\t\t\t/** @type {number | RegExpMatchArray | null} */\n\t\t\tvar varend;\n\t\t\t/** @type {string} */\n\t\t\tvar varname;\n\t\t\tvar char = s.charAt(i);\n\n\t\t\tif (char === '{') {\n\t\t\t\ti += 1;\n\t\t\t\tif (s.charAt(i) === '}') {\n\t\t\t\t\tthrow new Error('Bad substitution: ' + s.slice(i - 2, i + 1));\n\t\t\t\t}\n\t\t\t\t// match braces by depth so a nested `${` keeps its inner `}` from ending the outer substitution\n\t\t\t\tvar depth = 1;\n\t\t\t\tvarend = i;\n\t\t\t\twhile (depth > 0 && varend < s.length) {\n\t\t\t\t\tif (s.charAt(varend) === '{' && s.charAt(varend - 1) === '$') {\n\t\t\t\t\t\tdepth += 1;\n\t\t\t\t\t} else if (s.charAt(varend) === '}') {\n\t\t\t\t\t\tdepth -= 1;\n\t\t\t\t\t}\n\t\t\t\t\tvarend += 1;\n\t\t\t\t}\n\t\t\t\tif (depth !== 0) {\n\t\t\t\t\tthrow new Error('Bad substitution: ' + s.slice(i));\n\t\t\t\t}\n\t\t\t\tvarend -= 1;\n\t\t\t\tvarname = s.slice(i, varend);\n\t\t\t\ti = varend;\n\t\t\t} else if ((/[*@#?$!-]/).test(char)) {\n\t\t\t\tvarname = char;\n\t\t\t} else {\n\t\t\t\tvar slicedFromI = s.slice(i);\n\t\t\t\tvarend = slicedFromI.match(/[^\\w\\d_]/);\n\t\t\t\tif (!varend) {\n\t\t\t\t\tvarname = slicedFromI;\n\t\t\t\t\ti = s.length;\n\t\t\t\t} else {\n\t\t\t\t\tvarname = slicedFromI.slice(0, varend.index);\n\t\t\t\t\ti += /** @type {number} */ (varend.index) - 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn getVar(/** @type {NonNullable<typeof env>} */ (env), '', varname);\n\t\t}\n\n\t\tfunction flushRun() {\n\t\t\tif (pendingNw === null) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (pendingNw === 0) {\n\t\t\t\tif (out !== '') {\n\t\t\t\t\twords[words.length] = out;\n\t\t\t\t\tout = '';\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twords[words.length] = out;\n\t\t\t\tout = '';\n\t\t\t\tfor (var fe = 1; fe < pendingNw; fe += 1) {\n\t\t\t\t\twords[words.length] = '';\n\t\t\t\t}\n\t\t\t}\n\t\t\tpendingNw = null;\n\t\t}\n\n\t\tfor (i = 0; i < s.length; i++) {\n\t\t\tvar c = s.charAt(i);\n\t\t\tif (ifs && c !== DS) {\n\t\t\t\tflushRun();\n\t\t\t}\n\t\t\tisGlob = isGlob || (!quote && (c === '*' || c === '?'));\n\t\t\tif (esc) {\n\t\t\t\tout += c;\n\t\t\t\tesc = false;\n\t\t\t} else if (quote) {\n\t\t\t\tif (c === quote) {\n\t\t\t\t\tquote = false;\n\t\t\t\t} else if (quote == SQ) {\n\t\t\t\t\tout += c;\n\t\t\t\t} else { // Double quote\n\t\t\t\t\tif (c === BS) {\n\t\t\t\t\t\ti += 1;\n\t\t\t\t\t\tc = s.charAt(i);\n\t\t\t\t\t\tif (c === DQ || c === BS || c === DS) {\n\t\t\t\t\t\t\tout += c;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tout += BS + c;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (c === DS) {\n\t\t\t\t\t\tout += parseEnvVar();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tout += c;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (c === DQ || c === SQ) {\n\t\t\t\tquote = c;\n\t\t\t\tsawQuote = true;\n\t\t\t} else if (controlRE.test(c)) {\n\t\t\t\treturn /** @type {ControlOperator} */ ({ op: s });\n\t\t\t} else if (hash.test(c)) {\n\t\t\t\tcommented = true;\n\t\t\t\tvar commentObj = { comment: string.slice(match.index + i + 1) };\n\t\t\t\tif (out.length) {\n\t\t\t\t\treturn /** @type {const} */ ([out, commentObj]);\n\t\t\t\t}\n\t\t\t\treturn /** @type {const} */ ([commentObj]);\n\t\t\t} else if (c === BS) {\n\t\t\t\tesc = true;\n\t\t\t} else if (c === DS && s.charAt(i + 1) === SQ && closesAnsiC(s, i)) {\n\t\t\t\tflushRun();\n\t\t\t\tsawQuote = true;\n\t\t\t\tout += expandAnsiC(s.slice(i + 2, ansiCAt.lastIndex - 1));\n\t\t\t\ti = ansiCAt.lastIndex - 1;\n\t\t\t} else if (c === DS) {\n\t\t\t\tvar value = parseEnvVar();\n\t\t\t\tif (!ifs) {\n\t\t\t\t\tout += value;\n\t\t\t\t} else {\n\t\t\t\t\tfor (var vi = 0; vi < value.length; vi += 1) {\n\t\t\t\t\t\tvar vc = value.charAt(vi);\n\t\t\t\t\t\tif (ifs.indexOf(vc) < 0) {\n\t\t\t\t\t\t\tflushRun();\n\t\t\t\t\t\t\tout += vc;\n\t\t\t\t\t\t} else if (pendingNw === null) {\n\t\t\t\t\t\t\tpendingNw = vc === ' ' || vc === '\\t' || vc === '\\n' ? 0 : 1;\n\t\t\t\t\t\t} else if (vc !== ' ' && vc !== '\\t' && vc !== '\\n') {\n\t\t\t\t\t\t\tpendingNw += 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tout += c;\n\t\t\t}\n\t\t}\n\n\t\tif (isGlob) {\n\t\t\treturn /** @type {GlobPattern} */ ({ op: 'glob', pattern: out });\n\t\t}\n\n\t\tif (ifs) {\n\t\t\tif (pendingNw !== null && pendingNw > 0) {\n\t\t\t\twords[words.length] = out;\n\t\t\t\tout = '';\n\t\t\t\tfor (var te = 1; te < pendingNw; te += 1) {\n\t\t\t\t\twords[words.length] = '';\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (out !== '' || (sawQuote && words.length === 0)) {\n\t\t\t\twords[words.length] = out;\n\t\t\t}\n\t\t\treturn words;\n\t\t}\n\n\t\treturn out;\n\t}).reduce(function (prev, arg) { // finalize parsed arguments\n\t\tif (typeof arg === 'undefined') {\n\t\t\treturn prev;\n\t\t}\n\t\t/** @type {ParseEntry[]} */ ([]).concat(arg).forEach(function (entry) {\n\t\t\tprev[prev.length] = entry;\n\t\t});\n\t\treturn prev;\n\t}, /** @type {ParseEntry[]} */ ([]));\n}\n\n/** @type {typeof import('./parse')} */\nmodule.exports = function parse(s, env, opts) {\n\tvar mapped = parseInternal(s, env, opts);\n\tif (typeof env !== 'function') {\n\t\treturn mapped;\n\t}\n\treturn mapped.reduce(function (acc, s) {\n\t\tif (typeof s === 'object') {\n\t\t\tacc[acc.length] = s;\n\t\t\treturn acc;\n\t\t}\n\t\tvar xs = s.split(RegExp('(' + TOKEN + '.*?' + TOKEN + ')', 'g'));\n\t\tif (xs.length === 1) {\n\t\t\tacc[acc.length] = xs[0];\n\t\t\treturn acc;\n\t\t}\n\t\txs.filter(Boolean).forEach(function (x) {\n\t\t\tacc[acc.length] = startsWithToken.test(x)\n\t\t\t\t? JSON.parse(x.split(TOKEN)[1])\n\t\t\t\t: x;\n\t\t});\n\t\treturn acc;\n\t}, /** @type {ParseEntry[]} */ ([]));\n};\n","'use strict';\n\nexports.quote = require('./quote');\nexports.parse = require('./parse');\n","import { safeStringify } from \"@zaly/shared\"\nimport { parse as shellParse } from \"shell-quote\"\n\n/** A shell command broken down into its structural parts. One bash\n * input may parse to multiple segments (joined by `|`, `&&`, `||`, `;`).\n * Each segment is evaluated independently by the policy. */\nexport interface Segment {\n cmd: string\n args: string[]\n dyn?: Set<string>\n /** File paths the segment reads from (`< file` redirects). Built-in\n * tools may add inferred reads in the policy layer. */\n reads: string[]\n /** File paths the segment writes to (`> file` / `>> file`). */\n writes: { path: string; mode: \"trunc\" | \"append\" }[]\n /** True if the input contains command substitution (`$()` or backticks)\n * or any other dynamic-evaluation construct. Forces ask. */\n hasCommandSubst: boolean\n}\n\nexport type ParseResult = { ok: true; segments: Segment[] } | { ok: false; reason: string }\n\n/** Targets a redirect can write to without filesystem implications.\n * Anything else is treated as a file write and goes through fileWrite\n * policy. */\nconst SAFE_REDIRECT_TARGETS = new Set([\"/dev/null\", \"/dev/stderr\", \"/dev/stdout\"])\n\n/** A redirect target like `&1`, `&2`, `&-` — duplicates an existing fd,\n * no filesystem effect. */\nfunction isFdRedirect(target: string): boolean {\n return /^&(?:\\d+|-)$/.test(target)\n}\n\ntype Op = { op: string }\ntype Glob = { op: \"glob\"; pattern: string }\ntype Comment = { comment: string }\ntype Token = string | Op | Glob | Comment\n\nconst COMMAND_SEPS = new Set([\"|\", \"&&\", \"||\", \";\"])\nconst REDIRECT_OPS = new Set([\">\", \">>\", \"<\", \">&\", \"<&\"])\nconst DYN_SENTINEL = \"\\u{E000}\"\n\n/** Parse a bash command line. Returns segments with a flag for\n * unsupported constructs that force \"ask\" downstream. Heredocs,\n * subshells, command substitution, and backticks all surface as\n * `hasCommandSubst: true` (the umbrella \"we can't reason about this\"\n * signal) rather than parse failures, so the policy can still decide. */\nexport function parseBash(input: string): ParseResult {\n // Heredocs derail shell-quote (the body bleeds into surrounding tokens),\n // so we bail to ok:false here. checkBash maps that to ask.\n if (/<<-?\\s*['\"]?\\w+/.test(input)) {\n return { ok: false, reason: \"heredoc not supported\" }\n }\n // Backticks command-substitute in bash unless inside single quotes\n // (single quotes preserve everything literally; double quotes don't\n // suppress substitution). Flag only the unquoted form so embedded\n // template literals in `bun -e '... ${x} `tpl` ...'` don't trip us.\n const hasBackticks = hasUnquotedBacktick(input)\n\n let rawTokens: Token[]\n try {\n rawTokens = shellParse(input, (e) =>\n e === \"\" ? undefined : `${DYN_SENTINEL}\\${${e}}`\n ) as Token[]\n } catch (error) {\n return { ok: false, reason: `tokenize: ${(error as Error).message}` }\n }\n\n // Inline plain `(subshell)` contents as separate segments; strip\n // `$(...)` regions and flag as command substitution. Backticks\n // already detected via the pre-scan above.\n const flat = flattenParens(rawTokens)\n const hasCommandSubst = hasBackticks || flat.hasCommandSubst\n\n const segmentTokens: Token[][] = [[]]\n for (const t of flat.tokens) {\n if (typeof t === \"object\" && \"comment\" in t) continue\n\n if (typeof t === \"object\" && \"op\" in t && COMMAND_SEPS.has(t.op)) {\n if (segmentTokens.at(-1)!.length > 0) segmentTokens.push([])\n continue\n }\n\n segmentTokens.at(-1)!.push(t)\n }\n\n if (segmentTokens.at(-1)!.length === 0) segmentTokens.pop()\n\n const segments: Segment[] = []\n for (const segToks of segmentTokens) {\n const seg = parseSegment(segToks)\n if (!seg.ok) return seg\n if (seg.segment) segments.push({ ...seg.segment, hasCommandSubst })\n }\n\n if (segments.length === 0) {\n return { ok: false, reason: \"empty input\" }\n }\n return { ok: true, segments }\n}\n\nfunction parseSegment(\n tokens: Token[]\n):\n | { ok: true; segment: Omit<Segment, \"hasCommandSubst\"> | undefined }\n | { ok: false; reason: string } {\n let args: string[] = []\n let reads: string[] = []\n let writes: { path: string; mode: \"trunc\" | \"append\" }[] = []\n const dyn = new Set<string>()\n\n for (let i = 0; i < tokens.length; i++) {\n const t = tokens[i]\n\n if (typeof t === \"string\") {\n // FD prefix on a redirect (`2>&1`, `2>file`, `1<&-`) — shell-quote\n // splits the leading digit off as its own token. Don't treat it\n // as a regular arg; the redirect handler below picks up the op.\n if (/^\\d+$/.test(t)) {\n const next = tokens[i + 1]\n if (typeof next === \"object\" && \"op\" in next && REDIRECT_OPS.has(next.op)) {\n continue\n }\n }\n args.push(t)\n continue\n }\n\n if (\"comment\" in t) continue\n\n if (\"pattern\" in t) {\n // Pass globs through as their pattern — policy layer decides.\n args.push(t.pattern)\n dyn.add(t.pattern)\n continue\n }\n\n if (!(\"op\" in t)) {\n return { ok: false, reason: `unsupported token: ${safeStringify(t)}` }\n }\n\n if (REDIRECT_OPS.has(t.op)) {\n const next = tokens[i + 1]\n if (typeof next !== \"string\") {\n return { ok: false, reason: `redirect target missing after ${t.op}` }\n }\n i++ // consume target\n\n if (t.op === \">\" || t.op === \">>\") {\n // Skip safe targets (/dev/null etc.) and fd redirects entirely.\n if (SAFE_REDIRECT_TARGETS.has(next) || isFdRedirect(next)) continue\n writes.push({ mode: t.op === \">>\" ? \"append\" : \"trunc\", path: next })\n } else if (t.op === \"<\") {\n if (SAFE_REDIRECT_TARGETS.has(next) || isFdRedirect(next)) continue\n reads.push(next)\n }\n // `>&` / `<&` are fd-duplicating (`2>&1`-style) — no fs impact.\n continue\n }\n\n return { ok: false, reason: `unsupported op: ${t.op}` }\n }\n\n const dynPath = (p: string) => {\n if (!p.includes(DYN_SENTINEL)) return p\n p = p.replaceAll(DYN_SENTINEL, \"\")\n dyn.add(p)\n return p\n }\n\n args = args.map((a) => dynPath(a))\n writes = writes.map((w) => ({ ...w, path: dynPath(w.path) }))\n reads = reads.map(dynPath)\n\n // Strip leading wrapper commands (`time`, `nohup`, `nice`, …) so the\n // policy sees the real command being run. `time bun test` evaluates\n // as `bun test`; a bare `time` (or `time (subshell)` after flatten)\n // leaves nothing and signals the caller to drop the segment.\n const unwrapped = unwrapWrappers(args)\n if (unwrapped.length === 0) {\n return { ok: true, segment: undefined }\n }\n\n return {\n ok: true,\n segment: {\n args: unwrapped.slice(1),\n cmd: unwrapped[0],\n dyn,\n reads,\n writes,\n },\n }\n}\n\ninterface WrapperSpec {\n /** Flags that consume the next arg as their value. */\n valueFlags?: Set<string>\n}\n\n/** Commands that wrap another command — they're transparent for\n * permission purposes, since the security-relevant action is whatever\n * they run. `sudo` is intentionally absent: it changes the effective\n * user and must always be flagged. */\nconst WRAPPERS: Partial<Record<string, WrapperSpec>> = {\n command: {}, // bash builtin, bypasses aliases\n ionice: { valueFlags: new Set([\"-c\", \"-n\", \"-p\", \"-P\", \"-u\"]) },\n nice: { valueFlags: new Set([\"-n\", \"--adjustment\"]) },\n nohup: {},\n time: {}, // bash reserved word, also GNU /usr/bin/time\n}\n\n/** Detect backticks outside single-quoted regions. Single quotes in\n * bash can't be escaped from within, so the toggle is a simple state\n * flip on every `'`. Double quotes do not suppress backtick\n * substitution and are ignored here. */\nfunction hasUnquotedBacktick(input: string): boolean {\n let inSingle = false\n for (const c of input) {\n if (c === \"'\") {\n inSingle = !inSingle\n continue\n }\n if (c === \"`\" && !inSingle) return true\n }\n return false\n}\n\n/** Strip leading wrapper-command prefixes from an arg list. Repeats\n * while the head is a wrapper (so `time nice -n 5 cmd` → `cmd`).\n * Wrapper-flags (and their values, where applicable) are consumed\n * along with the wrapper itself. */\nfunction unwrapWrappers(args: string[]): string[] {\n let current = args\n while (current.length > 0) {\n const spec = WRAPPERS[current[0]]\n if (!spec) break\n const valueFlags = spec.valueFlags ?? new Set()\n let i = 1\n while (i < current.length && current[i].startsWith(\"-\")) {\n const flag = current[i]\n i++\n if (valueFlags.has(flag) && i < current.length) i++ // consume flag value\n }\n current = current.slice(i)\n }\n return current\n}\n\n/** Walk a token list and resolve paren constructs:\n * - Plain `(subshell)` → tokens inlined with `;` boundaries on each\n * side, so the contents become independent segments evaluated by\n * the same policy. The subshell's own scope (cwd changes etc.) is\n * irrelevant to permissions — each command is checked individually.\n * - `$(...)` (command substitution) → stripped entirely, with the\n * `hasCommandSubst` flag raised. The dynamic value can't be\n * statically reasoned about. Detected by the leading `$` token\n * that shell-quote emits before the `(`.\n *\n * Recurses into subshell contents to handle nesting and to catch\n * `$(...)` constructs nested inside subshells. */\nfunction flattenParens(tokens: Token[]): { tokens: Token[]; hasCommandSubst: boolean } {\n const out: Token[] = []\n let hasCommandSubst = false\n let i = 0\n while (i < tokens.length) {\n const t = tokens[i]\n if (typeof t === \"object\" && \"op\" in t && t.op === \"(\") {\n const isSubst = out.at(-1) === \"$\"\n if (isSubst) out.pop()\n\n // Find matching `)`, accounting for nesting.\n let depth = 1\n let j = i + 1\n while (j < tokens.length && depth > 0) {\n const tj = tokens[j]\n if (typeof tj === \"object\" && \"op\" in tj) {\n if (tj.op === \"(\") depth++\n else if (tj.op === \")\") depth--\n }\n if (depth > 0) j++\n }\n const inner = tokens.slice(i + 1, j)\n\n if (isSubst) {\n hasCommandSubst = true\n // Drop the entire $(...) — its value is dynamic.\n } else {\n const sub = flattenParens(inner)\n if (sub.hasCommandSubst) hasCommandSubst = true\n // Surround with separators so subshell contents form their own\n // segments regardless of what's adjacent in the outer chain.\n out.push({ op: \";\" }, ...sub.tokens, { op: \";\" })\n }\n i = j + 1\n continue\n }\n\n if (typeof t === \"object\" && \"op\" in t && t.op === \")\") {\n // Stray closing paren (unbalanced input). Skip — the parser's\n // overall result will likely fail downstream on a malformed segment.\n i++\n continue\n }\n\n out.push(t)\n i++\n }\n return { hasCommandSubst, tokens: out }\n}\n","/**\n * Built-in tool registry — per-command knowledge of which args are\n * input files, output files, and which invocation modes are too\n * complex to safely model.\n *\n * The policy engine consults this registry alongside explicit redirect\n * info from the parser to determine per-command file I/O for the\n * fileRead/fileWrite policy hooks.\n */\nexport interface ToolSpec {\n /** File paths the command will read from, derived from args. */\n reads?: (args: string[]) => string[]\n /** File paths the command will write to. */\n writes?: (args: string[]) => string[]\n /** Returns true if the args invoke a mode the parser can't safely\n * reason about (e.g. `sed -e 'w out'`, `find -exec`). Forces ask. */\n unsafe?: (args: string[]) => boolean\n}\n\n/** All bare positional args (no leading dash). Default for many\n * read-only utilities. */\nfunction positionals(args: string[]): string[] {\n return args.filter((a) => !a.startsWith(\"-\") && a !== \"\")\n}\n\n/** All positionals after the first one (e.g. `grep PATTERN file...`). */\nfunction positionalsAfterFirst(args: string[]): string[] {\n const out: string[] = []\n let seenFirst = false\n for (const a of args) {\n if (a.startsWith(\"-\") || a === \"\") continue\n if (!seenFirst) {\n seenFirst = true\n continue\n }\n out.push(a)\n }\n return out\n}\n\n// ── sed ──────────────────────────────────────────────────────────────────\n\n/** Flags whose value is the *next* arg, not part of the script. */\nconst SED_VALUE_FLAGS = new Set([\"-e\", \"--expression\", \"-f\", \"--file\"])\n\n/** Walk sed args, returning [scripts, positionalsAfterScript]. The\n * \"script\" is everything passed via `-e` plus the first bare arg\n * (the implicit script when no `-e` is given). Positionals after\n * that are input files. */\nfunction sedSplit(args: string[]): { scripts: string[]; files: string[] } {\n const scripts: string[] = []\n const files: string[] = []\n let needsImplicitScript = !args.some(\n (a) => a === \"-e\" || a === \"--expression\" || a === \"-f\" || a === \"--file\"\n )\n\n for (let i = 0; i < args.length; i++) {\n const a = args[i]\n if (a.startsWith(\"-\")) {\n if (SED_VALUE_FLAGS.has(a) && i + 1 < args.length) {\n if (a === \"-e\" || a === \"--expression\") scripts.push(args[i + 1])\n i++ // consume value\n }\n continue\n }\n if (needsImplicitScript) {\n scripts.push(a)\n needsImplicitScript = false\n continue\n }\n files.push(a)\n }\n return { files, scripts }\n}\n\nconst SED_INPLACE = new Set([\"-i\", \"--in-place\"])\n\nfunction sedReads(args: string[]): string[] {\n return sedSplit(args).files\n}\n\nfunction sedWrites(args: string[]): string[] {\n // `-i` rewrites positional input files; also supports `-i.bak` form.\n const inPlace = args.some((a) => SED_INPLACE.has(a) || a.startsWith(\"-i.\"))\n return inPlace ? sedSplit(args).files : []\n}\n\nfunction sedUnsafe(args: string[]): boolean {\n // `w` / `W` write commands and `r` / `R` read commands inside the\n // script can do file I/O the parser can't see. Bail to ask.\n for (const script of sedSplit(args).scripts) {\n if (/(?:^|;|\\n)\\s*[wWrR]\\s+\\S/.test(script)) return true\n }\n return false\n}\n\n// ── awk ──────────────────────────────────────────────────────────────────\n\nfunction awkReads(args: string[]): string[] {\n // awk usage: `awk [opts] 'script' [files...]` or `awk [opts] -f file [files...]`\n // Files come after the script. Skip flags + their values.\n let sawScript = false\n let usingFFlag = false\n const files: string[] = []\n for (let i = 0; i < args.length; i++) {\n const a = args[i]\n if (a === \"-f\" || a === \"--file\") {\n if (i + 1 < args.length) files.push(args[i + 1]) // script file is read too\n i++\n sawScript = true\n usingFFlag = true\n continue\n }\n if (a.startsWith(\"-\")) {\n // Some awk flags take a value (-v, -F)\n if (a === \"-v\" || a === \"-F\") i++\n continue\n }\n if (!sawScript) {\n sawScript = true\n continue\n }\n files.push(a)\n }\n return usingFFlag ? files : files\n}\n\nfunction awkUnsafe(args: string[]): boolean {\n // awk's `print > file` and `printf > file` inside a script write to\n // files. Detecting reliably without parsing the script is hard, so\n // bail to ask if the script (or any -e value) contains a `>` operator.\n // Conservative — false positives are fine for \"ask\".\n let sawScript = false\n for (let i = 0; i < args.length; i++) {\n const a = args[i]\n if (a === \"-f\" || a === \"--file\" || a === \"-v\" || a === \"-F\") {\n i++\n continue\n }\n if (a.startsWith(\"-\")) continue\n if (!sawScript) {\n sawScript = true\n if (/[>|]/.test(a)) return true\n }\n }\n return false\n}\n\n// ── find ─────────────────────────────────────────────────────────────────\n\nfunction findReads(args: string[]): string[] {\n // First positional (or `.`) is the path. Multiple paths possible\n // before the first `-action` flag.\n const out: string[] = []\n for (const a of args) {\n if (a.startsWith(\"-\")) break\n out.push(a)\n }\n return out.length > 0 ? out : [\".\"]\n}\n\nfunction findUnsafe(args: string[]): boolean {\n // `-delete`, `-exec`, `-execdir`, `-ok`, `-okdir` all do work we\n // can't trace.\n return args.some(\n (a) => a === \"-delete\" || a === \"-exec\" || a === \"-execdir\" || a === \"-ok\" || a === \"-okdir\"\n )\n}\n\n// ── dynamic execution ────────────────────────────────────────────────────\n//\n// These commands run arbitrary code passed as arguments or sourced from\n// files. We can't reason about their effects from the parser; force ask.\n\nconst dynamicExec = (): boolean => true\n\n// ── registry ─────────────────────────────────────────────────────────────\n\nexport const TOOLS: Partial<Record<string, ToolSpec>> = {\n \".\": { unsafe: dynamicExec }, // sh: source alias\n awk: { reads: awkReads, unsafe: awkUnsafe },\n basename: {},\n cat: { reads: positionals },\n cd: {},\n cut: { reads: positionals },\n diff: { reads: positionals },\n dirname: {},\n echo: {},\n eval: { unsafe: dynamicExec }, // runs its argument as shell input\n exec: { unsafe: dynamicExec }, // replaces the shell process\n file: { reads: positionals },\n find: { reads: findReads, unsafe: findUnsafe },\n grep: { reads: positionalsAfterFirst },\n head: { reads: positionals },\n hexdump: { reads: positionals },\n less: { reads: positionals },\n ls: { reads: positionals },\n more: { reads: positionals },\n od: { reads: positionals },\n printf: {},\n pwd: {},\n readlink: { reads: positionals },\n realpath: { reads: positionals },\n rg: { reads: positionalsAfterFirst },\n sed: { reads: sedReads, unsafe: sedUnsafe, writes: sedWrites },\n sort: { reads: positionals },\n source: { unsafe: dynamicExec }, // bash: runs the file in current shell\n stat: { reads: positionals },\n tail: { reads: positionals },\n tree: { reads: positionals },\n uniq: { reads: positionals },\n wc: { reads: positionals },\n xxd: { reads: positionals },\n}\n"],"ignoreList":[0,1,2],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAKA,IAAI,MAA4B;EAC/B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACD;CACA,IAAI,mBAAmB;CACvB,IAAI,qBAAqB;;CAGzB,OAAO,UAAU,SAAS,MAAM,IAAI;EACnC,IAAI,aAAa;EACjB,OAAO,GAAG,IAAI,SAAU,GAAG;GAC1B,IAAI,cAAc,OAAO,MAAM,YAAY,iBAAiB,KAAK,CAAC,GACjE,MAAM,IAAI,UAAU,6DAA6D;GAElF,IAAI,MAAM,IACT,OAA6B;GAE9B,IAAI,KAAK,OAAO,MAAM,UAAU;IAC/B,IAAI,QAAQ,KAAK,EAAE,OAAO,QAAQ;KACjC,IAAI,OAAO,EAAE,YAAY,UACxB,MAAM,IAAI,UAAU,wCAAwC;KAE7D,IAAI,iBAAiB,KAAK,EAAE,OAAO,GAClC,MAAM,IAAI,UAAU,kDAAkD;KAEvE,IAAI,EAAE,YAAY,IACjB,OAA6B;KAE9B,OAAO,EAAE,QAAQ,QAAQ,oBAAoB,MAAM;IACpD;IACA,IAAI,QAAQ,KAAK,OAAO,EAAE,OAAO,UAAU;KAC1C,IAAI,IAAI,QAAQ,EAAE,EAAE,IAAI,GACvB,MAAM,IAAI,UAAU,yBAAyB,KAAK,UAAU,EAAE,EAAE,CAAC;KAElE,OAAO,EAAE,GAAG,QAAQ,WAAW,MAAM;IACtC;IACA,IAAI,aAAa,KAAK,OAAO,EAAE,YAAY,UAAU;KACpD,IAAI,iBAAiB,KAAK,EAAE,OAAO,GAClC,MAAM,IAAI,UAAU,6CAA6C;KAElE,aAAa;KACb,OAAO,MAAM,EAAE;IAChB;IACA,MAAM,IAAI,UAAU,iCAAiC;GACtD;GACA,IAAK,IAAK,KAAK,CAAC,KAAM,IAAK,KAAK,CAAC,GAChC,OAAO,MAAM,EAAE,QAAQ,MAAM,SAAS,IAAI;GAE3C,IAAK,UAAW,KAAK,CAAC,KAAK,CAAE,IAAK,KAAK,CAAC,GACvC,OAAO,MAAM,IAAI;GAElB,IAAK,SAAU,KAAK,CAAC,GACpB,OAAO,OAAM,EAAE,QAAQ,cAAc,MAAM,IAAI;GAEhD,OAAO,OAAO,CAAC,CAAC,CAAC,QAAQ,iDAAiD,QAAQ;EACnF,CAAC,CAAC,CAAC,KAAK,GAAG;CACZ;;;;;;;;;;;;CCxEA,IAAI,UAAgC,QAA+B;EAClE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACD,CAAC,CAAE,KAA2B,GAAI,IAA0B;CAC5D,IAAI,YAAY,IAAI,OAAO,MAAM,UAAU,GAAG;CAC9C,IAAI,OAA6B;CACjC,IAAI,eAAqC;CAEzC,IAAI,cAAc;CAClB,IAAI,eAAe,SAAU,cAAc;CAC3C,IAAI,UAAU,IAAI,OAAO,SAAU,cAAc,kBAAmB,GAAG;CACvE,IAAI,iBAAiB;CACrB,IAAI,eAAe;CACnB,IAAI,OAAO;CAEX,IAAI,KAA2B;CAC/B,IAAI,KAA2B;CAC/B,IAAI,KAA2B;CAE/B,IAAI,QAAQ;CACZ,IAAI,OAA6B;CACjC,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KACtB,UAAU,OAAO,KAAK,OAAO,EAAA,CAAG,SAAS,EAAE;CAE5C,IAAI,kBAAkB,IAAI,OAAO,MAAM,KAAK;;;;;CAM5C,SAAS,SAAS,GAAG,GAAG;EACvB,IAAI,YAAY,EAAE;EAElB,IAAI,UAAU,CAAC;EACf,IAAI;EAEJ,OAAQ,WAAW,EAAE,KAAK,CAAC,GAAI;GAC9B,QAAQ,QAAQ,UAAU;GAC1B,IAAI,EAAE,cAAc,SAAS,OAC5B,EAAE,aAAa;EAEjB;EAEA,EAAE,YAAY;EAEd,OAAO;CACR;;;;;;CAOA,SAAS,OAAO,KAAK,KAAK,KAAK;EAC9B,IAAI,IAAI,OAAO,QAAQ,aAAa,IAAI,GAAG,IAAI,IAAI;EACnD,IAAI,OAAO,MAAM,eAAe,OAAO,IACtC,IAAI;OACE,IAAI,OAAO,MAAM,aACvB,IAAI;EAGL,IAAI,OAAO,MAAM,UAChB,OAAO,MAAM,QAAQ,KAAK,UAAU,CAAC,IAAI;EAE1C,OAAO,MAAM;CACd;CAEA,IAAI,cAAc;;;;;CAMlB,SAAS,kBAAkB,GAAG,QAAQ;EACrC,IAAI,OAAO,OAAO,OAAO,CAAC;EAC1B,IAAI,SAAS,KAAK;GACjB,IAAI,OAAO,OAAO,OAAO,CAAC;GAC1B,OAAO,SAAS,MAAM,MAAS,OAAO,aAAa,KAAK,WAAW,CAAC,IAAI,EAAI;EAC7E;EACA,IAAI,SAAS,OAAO,SAAS,OAAO,SAAS,KAAK;GACjD,IAAI,KAAK,SAAS,OAAO,MAAM,CAAC,GAAG,EAAE;GACrC,IAAI,KAAK,SACR,OAAO;GAER,OAAO,OAAO,aAAa,MAAM,MAAM,KAAK,QAAS,CAAC,SAAU,MAAM,KAAK,SAAU,KAAK,KAAM,IAAI,CAAC,EAAE,CAAC;EACzG;EACA,IAAI,QAAQ,OAAO,QAAQ,KAC1B,OAAO,OAAO,aAAa,SAAS,QAAQ,CAAC,IAAI,GAAI;EAEtD,IAAI,SAAS,eAAe,QAAQ,MAAM;EAC1C,OAAO,SAAS,IAAI,SAAS,aAAa,OAAO,MAAM;CACxD;;CAGA,SAAS,YAAY,MAAM;EAC1B,OAAO,KAAK,QAAQ,aAAa,iBAAiB,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;CACjE;;;;;CAMA,SAAS,YAAY,GAAG,GAAG;EAC1B,QAAQ,YAAY;EACpB,OAAO,CAAC,CAAkC,QAAQ,KAAK,CAAC,CAAC,CAAG;CAC7D;;;;;;;CAQA,SAAS,cAAc,QAAQ,KAAK,MAAM;EACzC,IAAI,CAAC,MACJ,OAAO,CAAC;EAET,IAAI,KAAK,KAAK,UAAU;EACxB,IAAI,MAAM,KAAK,kBAAkB,OAAO,SAAW,OAAO,KAAK,kBAAkB,WAAW,KAAK,gBAAgB;EACjH,IAAI,WAAW,QAAQ,KAAK,YAAY,KAAK,OAAO,oBAAoB,aAAa,MAAM,CAAC,IAAI,gBAAgB,OAAO;EACvH,IAAI,eAAe,YAAW,KAAK,oBAAmB,KAAK;EAO3D,IAAI,UAAU,SAAS,QAAQ,IALb,OAAO,CACxB,MAAM,UAAU,KAChB,MAAM,eAAe,MAAM,WAAW,MAAM,eAAe,MAAM,eAAe,IACjF,CAAC,CAAC,KAAK,GAAG,GAAG,GAEwB,CAAC;EAEtC,IAAI,QAAQ,WAAW,GACtB,OAAO,CAAC;EAET,IAAI,CAAC,KACJ,MAAM,CAAC;EAGR,IAAI,YAAY;EAEhB,OAAO,QAAQ,IAAI,SAAU,OAAO;GACnC,IAAI,IAAI,MAAM;GACd,IAAI,CAAC,KAAK,WACT;GAED,IAAI,UAAU,KAAK,CAAC,GACnB,OAAuC,EAAE,IAAI,EAAE;;GAehD,IAAI,QAAQ;GACZ,IAAI,MAAM;GACV,IAAI,MAAM;;GAEV,IAAI,QAAQ,CAAC;GACb,IAAI,WAAW;;GAEf,IAAI,YAAY;GAChB,IAAI,SAAS;;GAEb,IAAI;GAEJ,SAAS,cAAc;IACtB,KAAK;;IAEL,IAAI;;IAEJ,IAAI;IACJ,IAAI,OAAO,EAAE,OAAO,CAAC;IAErB,IAAI,SAAS,KAAK;KACjB,KAAK;KACL,IAAI,EAAE,OAAO,CAAC,MAAM,KACnB,MAAM,IAAI,MAAM,uBAAuB,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC;KAG7D,IAAI,QAAQ;KACZ,SAAS;KACT,OAAO,QAAQ,KAAK,SAAS,EAAE,QAAQ;MACtC,IAAI,EAAE,OAAO,MAAM,MAAM,OAAO,EAAE,OAAO,SAAS,CAAC,MAAM,KACxD,SAAS;WACH,IAAI,EAAE,OAAO,MAAM,MAAM,KAC/B,SAAS;MAEV,UAAU;KACX;KACA,IAAI,UAAU,GACb,MAAM,IAAI,MAAM,uBAAuB,EAAE,MAAM,CAAC,CAAC;KAElD,UAAU;KACV,UAAU,EAAE,MAAM,GAAG,MAAM;KAC3B,IAAI;IACL,OAAO,IAAK,YAAa,KAAK,IAAI,GACjC,UAAU;SACJ;KACN,IAAI,cAAc,EAAE,MAAM,CAAC;KAC3B,SAAS,YAAY,MAAM,UAAU;KACrC,IAAI,CAAC,QAAQ;MACZ,UAAU;MACV,IAAI,EAAE;KACP,OAAO;MACN,UAAU,YAAY,MAAM,GAAG,OAAO,KAAK;MAC3C,KAA4B,OAAO,QAAS;KAC7C;IACD;IACA,OAAO,OAA+C,KAAM,IAAI,OAAO;GACxE;GAEA,SAAS,WAAW;IACnB,IAAI,cAAc,MACjB;IAED,IAAI,cAAc,GACb;SAAA,QAAQ,IAAI;MACf,MAAM,MAAM,UAAU;MACtB,MAAM;KACP;WACM;KACN,MAAM,MAAM,UAAU;KACtB,MAAM;KACN,KAAK,IAAI,KAAK,GAAG,KAAK,WAAW,MAAM,GACtC,MAAM,MAAM,UAAU;IAExB;IACA,YAAY;GACb;GAEA,KAAK,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK;IAC9B,IAAI,IAAI,EAAE,OAAO,CAAC;IAClB,IAAI,OAAO,MAAM,IAChB,SAAS;IAEV,SAAS,UAAW,CAAC,UAAU,MAAM,OAAO,MAAM;IAClD,IAAI,KAAK;KACR,OAAO;KACP,MAAM;IACP,OAAO,IAAI,OAAO;KACjB,IAAI,MAAM,OACT,QAAQ;UACF,IAAI,SAAS,IACnB,OAAO;UAEP,IAAI,MAAM,IAAI;MACb,KAAK;MACL,IAAI,EAAE,OAAO,CAAC;MACd,IAAI,MAAM,MAAM,MAAM,MAAM,MAAM,IACjC,OAAO;WAEP,OAAO,KAAK;KAEd,OAAO,IAAI,MAAM,IAChB,OAAO,YAAY;UAEnB,OAAO;IAGV,OAAO,IAAI,MAAM,MAAM,MAAM,IAAI;KAChC,QAAQ;KACR,WAAW;IACZ,OAAO,IAAI,UAAU,KAAK,CAAC,GAC1B,OAAuC,EAAE,IAAI,EAAE;SACzC,IAAI,KAAK,KAAK,CAAC,GAAG;KACxB,YAAY;KACZ,IAAI,aAAa,EAAE,SAAS,OAAO,MAAM,MAAM,QAAQ,IAAI,CAAC,EAAE;KAC9D,IAAI,IAAI,QACP,OAA6B,CAAC,KAAK,UAAU;KAE9C,OAA6B,CAAC,UAAU;IACzC,OAAO,IAAI,MAAM,IAChB,MAAM;SACA,IAAI,MAAM,MAAM,EAAE,OAAO,IAAI,CAAC,MAAM,MAAM,YAAY,GAAG,CAAC,GAAG;KACnE,SAAS;KACT,WAAW;KACX,OAAO,YAAY,EAAE,MAAM,IAAI,GAAG,QAAQ,YAAY,CAAC,CAAC;KACxD,IAAI,QAAQ,YAAY;IACzB,OAAO,IAAI,MAAM,IAAI;KACpB,IAAI,QAAQ,YAAY;KACxB,IAAI,CAAC,KACJ,OAAO;UAEP,KAAK,IAAI,KAAK,GAAG,KAAK,MAAM,QAAQ,MAAM,GAAG;MAC5C,IAAI,KAAK,MAAM,OAAO,EAAE;MACxB,IAAI,IAAI,QAAQ,EAAE,IAAI,GAAG;OACxB,SAAS;OACT,OAAO;MACR,OAAO,IAAI,cAAc,MACxB,YAAY,OAAO,OAAO,OAAO,OAAQ,OAAO,OAAO,IAAI;WACrD,IAAI,OAAO,OAAO,OAAO,OAAQ,OAAO,MAC9C,aAAa;KAEf;IAEF,OACC,OAAO;GAET;GAEA,IAAI,QACH,OAAmC;IAAE,IAAI;IAAQ,SAAS;GAAI;GAG/D,IAAI,KAAK;IACR,IAAI,cAAc,QAAQ,YAAY,GAAG;KACxC,MAAM,MAAM,UAAU;KACtB,MAAM;KACN,KAAK,IAAI,KAAK,GAAG,KAAK,WAAW,MAAM,GACtC,MAAM,MAAM,UAAU;IAExB;IACA,IAAI,QAAQ,MAAO,YAAY,MAAM,WAAW,GAC/C,MAAM,MAAM,UAAU;IAEvB,OAAO;GACR;GAEA,OAAO;EACR,CAAC,CAAC,CAAC,OAAO,SAAU,MAAM,KAAK;GAC9B,IAAI,OAAO,QAAQ,aAClB,OAAO;+BAEoB,CAAE,CAAC,CAAE,OAAO,GAAG,CAAC,CAAC,QAAQ,SAAU,OAAO;IACrE,KAAK,KAAK,UAAU;GACrB,CAAC;GACD,OAAO;EACR,GAAgC,CAAC,CAAE;CACpC;;CAGA,OAAO,UAAU,SAAS,MAAM,GAAG,KAAK,MAAM;EAC7C,IAAI,SAAS,cAAc,GAAG,KAAK,IAAI;EACvC,IAAI,OAAO,QAAQ,YAClB,OAAO;EAER,OAAO,OAAO,OAAO,SAAU,KAAK,GAAG;GACtC,IAAI,OAAO,MAAM,UAAU;IAC1B,IAAI,IAAI,UAAU;IAClB,OAAO;GACR;GACA,IAAI,KAAK,EAAE,MAAM,OAAO,MAAM,QAAQ,QAAQ,QAAQ,KAAK,GAAG,CAAC;GAC/D,IAAI,GAAG,WAAW,GAAG;IACpB,IAAI,IAAI,UAAU,GAAG;IACrB,OAAO;GACR;GACA,GAAG,OAAO,OAAO,CAAC,CAAC,QAAQ,SAAU,GAAG;IACvC,IAAI,IAAI,UAAU,gBAAgB,KAAK,CAAC,IACrC,KAAK,MAAM,EAAE,MAAM,KAAK,CAAC,CAAC,EAAE,IAC5B;GACJ,CAAC;GACD,OAAO;EACR,GAAgC,CAAC,CAAE;CACpC;;;;;CC3XA,QAAQ,QAAA,cAAA;CACR,QAAQ,QAAA,cAAA;;;;;ACsBR,MAAM,wCAAwB,IAAI,IAAI;CAAC;CAAa;CAAe;AAAa,CAAC;;;AAIjF,SAAS,aAAa,QAAyB;CAC7C,OAAO,eAAe,KAAK,MAAM;AACnC;AAOA,MAAM,+BAAe,IAAI,IAAI;CAAC;CAAK;CAAM;CAAM;AAAG,CAAC;AACnD,MAAM,+BAAe,IAAI,IAAI;CAAC;CAAK;CAAM;CAAK;CAAM;AAAI,CAAC;AACzD,MAAM,eAAe;;;;;;AAOrB,SAAgB,UAAU,OAA4B;CAGpD,IAAI,kBAAkB,KAAK,KAAK,GAC9B,OAAO;EAAE,IAAI;EAAO,QAAQ;CAAwB;CAMtD,MAAM,eAAe,oBAAoB,KAAK;CAE9C,IAAI;CACJ,IAAI;EACF,aAAA,GAAYA,mBAAAA,MAAAA,CAAW,QAAQ,MAC7B,MAAM,KAAK,KAAA,IAAY,GAAG,aAAa,KAAK,EAAE,EAChD;CACF,SAAS,OAAO;EACd,OAAO;GAAE,IAAI;GAAO,QAAQ,aAAc,MAAgB;EAAU;CACtE;CAKA,MAAM,OAAO,cAAc,SAAS;CACpC,MAAM,kBAAkB,gBAAgB,KAAK;CAE7C,MAAM,gBAA2B,CAAC,CAAC,CAAC;CACpC,KAAK,MAAM,KAAK,KAAK,QAAQ;EAC3B,IAAI,OAAO,MAAM,YAAY,aAAa,GAAG;EAE7C,IAAI,OAAO,MAAM,YAAY,QAAQ,KAAK,aAAa,IAAI,EAAE,EAAE,GAAG;GAChE,IAAI,cAAc,GAAG,EAAE,CAAC,CAAE,SAAS,GAAG,cAAc,KAAK,CAAC,CAAC;GAC3D;EACF;EAEA,cAAc,GAAG,EAAE,CAAC,CAAE,KAAK,CAAC;CAC9B;CAEA,IAAI,cAAc,GAAG,EAAE,CAAC,CAAE,WAAW,GAAG,cAAc,IAAI;CAE1D,MAAM,WAAsB,CAAC;CAC7B,KAAK,MAAM,WAAW,eAAe;EACnC,MAAM,MAAM,aAAa,OAAO;EAChC,IAAI,CAAC,IAAI,IAAI,OAAO;EACpB,IAAI,IAAI,SAAS,SAAS,KAAK;GAAE,GAAG,IAAI;GAAS;EAAgB,CAAC;CACpE;CAEA,IAAI,SAAS,WAAW,GACtB,OAAO;EAAE,IAAI;EAAO,QAAQ;CAAc;CAE5C,OAAO;EAAE,IAAI;EAAM;CAAS;AAC9B;AAEA,SAAS,aACP,QAGgC;CAChC,IAAI,OAAiB,CAAC;CACtB,IAAI,QAAkB,CAAC;CACvB,IAAI,SAAuD,CAAC;CAC5D,MAAM,sBAAM,IAAI,IAAY;CAE5B,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;EACtC,MAAM,IAAI,OAAO;EAEjB,IAAI,OAAO,MAAM,UAAU;GAIzB,IAAI,QAAQ,KAAK,CAAC,GAAG;IACnB,MAAM,OAAO,OAAO,IAAI;IACxB,IAAI,OAAO,SAAS,YAAY,QAAQ,QAAQ,aAAa,IAAI,KAAK,EAAE,GACtE;GAEJ;GACA,KAAK,KAAK,CAAC;GACX;EACF;EAEA,IAAI,aAAa,GAAG;EAEpB,IAAI,aAAa,GAAG;GAElB,KAAK,KAAK,EAAE,OAAO;GACnB,IAAI,IAAI,EAAE,OAAO;GACjB;EACF;EAEA,IAAI,EAAE,QAAQ,IACZ,OAAO;GAAE,IAAI;GAAO,QAAQ,sBAAsB,cAAc,CAAC;EAAI;EAGvE,IAAI,aAAa,IAAI,EAAE,EAAE,GAAG;GAC1B,MAAM,OAAO,OAAO,IAAI;GACxB,IAAI,OAAO,SAAS,UAClB,OAAO;IAAE,IAAI;IAAO,QAAQ,iCAAiC,EAAE;GAAK;GAEtE;GAEA,IAAI,EAAE,OAAO,OAAO,EAAE,OAAO,MAAM;IAEjC,IAAI,sBAAsB,IAAI,IAAI,KAAK,aAAa,IAAI,GAAG;IAC3D,OAAO,KAAK;KAAE,MAAM,EAAE,OAAO,OAAO,WAAW;KAAS,MAAM;IAAK,CAAC;GACtE,OAAO,IAAI,EAAE,OAAO,KAAK;IACvB,IAAI,sBAAsB,IAAI,IAAI,KAAK,aAAa,IAAI,GAAG;IAC3D,MAAM,KAAK,IAAI;GACjB;GAEA;EACF;EAEA,OAAO;GAAE,IAAI;GAAO,QAAQ,mBAAmB,EAAE;EAAK;CACxD;CAEA,MAAM,WAAW,MAAc;EAC7B,IAAI,CAAC,EAAE,SAAS,YAAY,GAAG,OAAO;EACtC,IAAI,EAAE,WAAW,cAAc,EAAE;EACjC,IAAI,IAAI,CAAC;EACT,OAAO;CACT;CAEA,OAAO,KAAK,KAAK,MAAM,QAAQ,CAAC,CAAC;CACjC,SAAS,OAAO,KAAK,OAAO;EAAE,GAAG;EAAG,MAAM,QAAQ,EAAE,IAAI;CAAE,EAAE;CAC5D,QAAQ,MAAM,IAAI,OAAO;CAMzB,MAAM,YAAY,eAAe,IAAI;CACrC,IAAI,UAAU,WAAW,GACvB,OAAO;EAAE,IAAI;EAAM,SAAS,KAAA;CAAU;CAGxC,OAAO;EACL,IAAI;EACJ,SAAS;GACP,MAAM,UAAU,MAAM,CAAC;GACvB,KAAK,UAAU;GACf;GACA;GACA;EACF;CACF;AACF;;;;;AAWA,MAAM,WAAiD;CACrD,SAAS,CAAC;CACV,QAAQ,EAAE,4BAAY,IAAI,IAAI;EAAC;EAAM;EAAM;EAAM;EAAM;CAAI,CAAC,EAAE;CAC9D,MAAM,EAAE,4BAAY,IAAI,IAAI,CAAC,MAAM,cAAc,CAAC,EAAE;CACpD,OAAO,CAAC;CACR,MAAM,CAAC;AACT;;;;;AAMA,SAAS,oBAAoB,OAAwB;CACnD,IAAI,WAAW;CACf,KAAK,MAAM,KAAK,OAAO;EACrB,IAAI,MAAM,KAAK;GACb,WAAW,CAAC;GACZ;EACF;EACA,IAAI,MAAM,OAAO,CAAC,UAAU,OAAO;CACrC;CACA,OAAO;AACT;;;;;AAMA,SAAS,eAAe,MAA0B;CAChD,IAAI,UAAU;CACd,OAAO,QAAQ,SAAS,GAAG;EACzB,MAAM,OAAO,SAAS,QAAQ;EAC9B,IAAI,CAAC,MAAM;EACX,MAAM,aAAa,KAAK,8BAAc,IAAI,IAAI;EAC9C,IAAI,IAAI;EACR,OAAO,IAAI,QAAQ,UAAU,QAAQ,EAAE,CAAC,WAAW,GAAG,GAAG;GACvD,MAAM,OAAO,QAAQ;GACrB;GACA,IAAI,WAAW,IAAI,IAAI,KAAK,IAAI,QAAQ,QAAQ;EAClD;EACA,UAAU,QAAQ,MAAM,CAAC;CAC3B;CACA,OAAO;AACT;;;;;;;;;;;;;AAcA,SAAS,cAAc,QAAgE;CACrF,MAAM,MAAe,CAAC;CACtB,IAAI,kBAAkB;CACtB,IAAI,IAAI;CACR,OAAO,IAAI,OAAO,QAAQ;EACxB,MAAM,IAAI,OAAO;EACjB,IAAI,OAAO,MAAM,YAAY,QAAQ,KAAK,EAAE,OAAO,KAAK;GACtD,MAAM,UAAU,IAAI,GAAG,EAAE,MAAM;GAC/B,IAAI,SAAS,IAAI,IAAI;GAGrB,IAAI,QAAQ;GACZ,IAAI,IAAI,IAAI;GACZ,OAAO,IAAI,OAAO,UAAU,QAAQ,GAAG;IACrC,MAAM,KAAK,OAAO;IAClB,IAAI,OAAO,OAAO,YAAY,QAAQ,IAAI;KACxC,IAAI,GAAG,OAAO,KAAK;UACd,IAAI,GAAG,OAAO,KAAK;IAC1B;IACA,IAAI,QAAQ,GAAG;GACjB;GACA,MAAM,QAAQ,OAAO,MAAM,IAAI,GAAG,CAAC;GAEnC,IAAI,SACF,kBAAkB;QAEb;IACL,MAAM,MAAM,cAAc,KAAK;IAC/B,IAAI,IAAI,iBAAiB,kBAAkB;IAG3C,IAAI,KAAK,EAAE,IAAI,IAAI,GAAG,GAAG,IAAI,QAAQ,EAAE,IAAI,IAAI,CAAC;GAClD;GACA,IAAI,IAAI;GACR;EACF;EAEA,IAAI,OAAO,MAAM,YAAY,QAAQ,KAAK,EAAE,OAAO,KAAK;GAGtD;GACA;EACF;EAEA,IAAI,KAAK,CAAC;EACV;CACF;CACA,OAAO;EAAE;EAAiB,QAAQ;CAAI;AACxC;;;;;AChSA,SAAS,YAAY,MAA0B;CAC7C,OAAO,KAAK,QAAQ,MAAM,CAAC,EAAE,WAAW,GAAG,KAAK,MAAM,EAAE;AAC1D;;AAGA,SAAS,sBAAsB,MAA0B;CACvD,MAAM,MAAgB,CAAC;CACvB,IAAI,YAAY;CAChB,KAAK,MAAM,KAAK,MAAM;EACpB,IAAI,EAAE,WAAW,GAAG,KAAK,MAAM,IAAI;EACnC,IAAI,CAAC,WAAW;GACd,YAAY;GACZ;EACF;EACA,IAAI,KAAK,CAAC;CACZ;CACA,OAAO;AACT;;AAKA,MAAM,kCAAkB,IAAI,IAAI;CAAC;CAAM;CAAgB;CAAM;AAAQ,CAAC;;;;;AAMtE,SAAS,SAAS,MAAwD;CACxE,MAAM,UAAoB,CAAC;CAC3B,MAAM,QAAkB,CAAC;CACzB,IAAI,sBAAsB,CAAC,KAAK,MAC7B,MAAM,MAAM,QAAQ,MAAM,kBAAkB,MAAM,QAAQ,MAAM,QACnE;CAEA,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;EACpC,MAAM,IAAI,KAAK;EACf,IAAI,EAAE,WAAW,GAAG,GAAG;GACrB,IAAI,gBAAgB,IAAI,CAAC,KAAK,IAAI,IAAI,KAAK,QAAQ;IACjD,IAAI,MAAM,QAAQ,MAAM,gBAAgB,QAAQ,KAAK,KAAK,IAAI,EAAE;IAChE;GACF;GACA;EACF;EACA,IAAI,qBAAqB;GACvB,QAAQ,KAAK,CAAC;GACd,sBAAsB;GACtB;EACF;EACA,MAAM,KAAK,CAAC;CACd;CACA,OAAO;EAAE;EAAO;CAAQ;AAC1B;AAEA,MAAM,8BAAc,IAAI,IAAI,CAAC,MAAM,YAAY,CAAC;AAEhD,SAAS,SAAS,MAA0B;CAC1C,OAAO,SAAS,IAAI,CAAC,CAAC;AACxB;AAEA,SAAS,UAAU,MAA0B;CAG3C,OADgB,KAAK,MAAM,MAAM,YAAY,IAAI,CAAC,KAAK,EAAE,WAAW,KAAK,CAC5D,IAAI,SAAS,IAAI,CAAC,CAAC,QAAQ,CAAC;AAC3C;AAEA,SAAS,UAAU,MAAyB;CAG1C,KAAK,MAAM,UAAU,SAAS,IAAI,CAAC,CAAC,SAClC,IAAI,2BAA2B,KAAK,MAAM,GAAG,OAAO;CAEtD,OAAO;AACT;AAIA,SAAS,SAAS,MAA0B;CAG1C,IAAI,YAAY;CAChB,IAAI,aAAa;CACjB,MAAM,QAAkB,CAAC;CACzB,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;EACpC,MAAM,IAAI,KAAK;EACf,IAAI,MAAM,QAAQ,MAAM,UAAU;GAChC,IAAI,IAAI,IAAI,KAAK,QAAQ,MAAM,KAAK,KAAK,IAAI,EAAE;GAC/C;GACA,YAAY;GACZ,aAAa;GACb;EACF;EACA,IAAI,EAAE,WAAW,GAAG,GAAG;GAErB,IAAI,MAAM,QAAQ,MAAM,MAAM;GAC9B;EACF;EACA,IAAI,CAAC,WAAW;GACd,YAAY;GACZ;EACF;EACA,MAAM,KAAK,CAAC;CACd;CACA,OAAO,aAAa,QAAQ;AAC9B;AAEA,SAAS,UAAU,MAAyB;CAK1C,IAAI,YAAY;CAChB,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;EACpC,MAAM,IAAI,KAAK;EACf,IAAI,MAAM,QAAQ,MAAM,YAAY,MAAM,QAAQ,MAAM,MAAM;GAC5D;GACA;EACF;EACA,IAAI,EAAE,WAAW,GAAG,GAAG;EACvB,IAAI,CAAC,WAAW;GACd,YAAY;GACZ,IAAI,OAAO,KAAK,CAAC,GAAG,OAAO;EAC7B;CACF;CACA,OAAO;AACT;AAIA,SAAS,UAAU,MAA0B;CAG3C,MAAM,MAAgB,CAAC;CACvB,KAAK,MAAM,KAAK,MAAM;EACpB,IAAI,EAAE,WAAW,GAAG,GAAG;EACvB,IAAI,KAAK,CAAC;CACZ;CACA,OAAO,IAAI,SAAS,IAAI,MAAM,CAAC,GAAG;AACpC;AAEA,SAAS,WAAW,MAAyB;CAG3C,OAAO,KAAK,MACT,MAAM,MAAM,aAAa,MAAM,WAAW,MAAM,cAAc,MAAM,SAAS,MAAM,QACtF;AACF;AAOA,MAAM,oBAA6B;AAInC,MAAa,QAA2C;CACtD,KAAK,EAAE,QAAQ,YAAY;CAC3B,KAAK;EAAE,OAAO;EAAU,QAAQ;CAAU;CAC1C,UAAU,CAAC;CACX,KAAK,EAAE,OAAO,YAAY;CAC1B,IAAI,CAAC;CACL,KAAK,EAAE,OAAO,YAAY;CAC1B,MAAM,EAAE,OAAO,YAAY;CAC3B,SAAS,CAAC;CACV,MAAM,CAAC;CACP,MAAM,EAAE,QAAQ,YAAY;CAC5B,MAAM,EAAE,QAAQ,YAAY;CAC5B,MAAM,EAAE,OAAO,YAAY;CAC3B,MAAM;EAAE,OAAO;EAAW,QAAQ;CAAW;CAC7C,MAAM,EAAE,OAAO,sBAAsB;CACrC,MAAM,EAAE,OAAO,YAAY;CAC3B,SAAS,EAAE,OAAO,YAAY;CAC9B,MAAM,EAAE,OAAO,YAAY;CAC3B,IAAI,EAAE,OAAO,YAAY;CACzB,MAAM,EAAE,OAAO,YAAY;CAC3B,IAAI,EAAE,OAAO,YAAY;CACzB,QAAQ,CAAC;CACT,KAAK,CAAC;CACN,UAAU,EAAE,OAAO,YAAY;CAC/B,UAAU,EAAE,OAAO,YAAY;CAC/B,IAAI,EAAE,OAAO,sBAAsB;CACnC,KAAK;EAAE,OAAO;EAAU,QAAQ;EAAW,QAAQ;CAAU;CAC7D,MAAM,EAAE,OAAO,YAAY;CAC3B,QAAQ,EAAE,QAAQ,YAAY;CAC9B,MAAM,EAAE,OAAO,YAAY;CAC3B,MAAM,EAAE,OAAO,YAAY;CAC3B,MAAM,EAAE,OAAO,YAAY;CAC3B,MAAM,EAAE,OAAO,YAAY;CAC3B,IAAI,EAAE,OAAO,YAAY;CACzB,KAAK,EAAE,OAAO,YAAY;AAC5B"}
1
+ {"version":3,"file":"tools-CJ2x45EZ.mjs","names":["shellParse"],"sources":["../../../node_modules/.bun/shell-quote@1.12.0/node_modules/shell-quote/quote.js","../../../node_modules/.bun/shell-quote@1.12.0/node_modules/shell-quote/parse.js","../../../node_modules/.bun/shell-quote@1.12.0/node_modules/shell-quote/index.js","../src/utils/bash/parser.ts","../src/utils/bash/tools.ts"],"sourcesContent":["'use strict';\n\n/** @import { ControlOperator } from './parse' */\n\n/** @type {ControlOperator['op'][]} */\nvar OPS = /** @type {const} */ ([\n\t'||',\n\t'&&',\n\t';;&',\n\t';;',\n\t';&',\n\t'|&',\n\t'<(',\n\t'>(',\n\t'<<<',\n\t'<<-',\n\t'<<',\n\t'>>',\n\t'>&',\n\t'>|',\n\t'&>>',\n\t'&>',\n\t'<&',\n\t'<>',\n\t'&',\n\t';',\n\t'(',\n\t')',\n\t'|',\n\t'<',\n\t'>'\n]);\nvar LINE_TERMINATORS = /[\\n\\r\\u2028\\u2029]/;\nvar GLOB_SHELL_SPECIAL = /[\\s#!\"$&'():;<=>@\\\\^`|~]/g;\n\n/** @type {typeof import('./quote')} */\nmodule.exports = function quote(xs) {\n\tvar sawComment = false;\n\treturn xs.map(function (s) {\n\t\tif (sawComment && typeof s === 'string' && LINE_TERMINATORS.test(s)) {\n\t\t\tthrow new TypeError('a token after a `comment` must not contain line terminators');\n\t\t}\n\t\tif (s === '') {\n\t\t\treturn /** @type {const} */ ('\\'\\'');\n\t\t}\n\t\tif (s && typeof s === 'object') {\n\t\t\tif ('op' in s && s.op === 'glob') {\n\t\t\t\tif (typeof s.pattern !== 'string') {\n\t\t\t\t\tthrow new TypeError('glob token requires a string `pattern`');\n\t\t\t\t}\n\t\t\t\tif (LINE_TERMINATORS.test(s.pattern)) {\n\t\t\t\t\tthrow new TypeError('glob `pattern` must not contain line terminators');\n\t\t\t\t}\n\t\t\t\tif (s.pattern === '') {\n\t\t\t\t\treturn /** @type {const} */ ('\\'\\'');\n\t\t\t\t}\n\t\t\t\treturn s.pattern.replace(GLOB_SHELL_SPECIAL, '\\\\$&');\n\t\t\t}\n\t\t\tif ('op' in s && typeof s.op === 'string') {\n\t\t\t\tif (OPS.indexOf(s.op) < 0) {\n\t\t\t\t\tthrow new TypeError('invalid `op` value: ' + JSON.stringify(s.op));\n\t\t\t\t}\n\t\t\t\treturn s.op.replace(/[\\s\\S]/g, '\\\\$&');\n\t\t\t}\n\t\t\tif ('comment' in s && typeof s.comment === 'string') {\n\t\t\t\tif (LINE_TERMINATORS.test(s.comment)) {\n\t\t\t\t\tthrow new TypeError('`comment` must not contain line terminators');\n\t\t\t\t}\n\t\t\t\tsawComment = true;\n\t\t\t\treturn '#' + s.comment;\n\t\t\t}\n\t\t\tthrow new TypeError('unrecognized object token shape');\n\t\t}\n\t\tif ((/'/).test(s) && (/!/).test(s)) {\n\t\t\treturn \"'\" + s.replace(/'/g, \"'\\\"'\\\"'\") + \"'\";\n\t\t}\n\t\tif ((/[\"\\s\\\\]/).test(s) && !(/'/).test(s)) {\n\t\t\treturn \"'\" + s + \"'\";\n\t\t}\n\t\tif ((/[\"'\\s]/).test(s)) {\n\t\t\treturn '\"' + s.replace(/([\"\\\\$`])/g, '\\\\$1') + '\"';\n\t\t}\n\t\treturn String(s).replace(/([A-Za-z]:)?([#!\"$&'()*,:;<=>?@[\\\\\\]^`{|}~])/g, '$1\\\\$2');\n\t}).join(' ');\n};\n","'use strict';\n\n/**\n * @import {\n * \tControlOperator,\n * \tEnv,\n * \tGlobPattern,\n * \tParseEntry,\n * } from './parse' */\n\n// '<(' and '>(' are process substitution operators and\n// can be parsed the same as control operator\nvar CONTROL = /** @type {const} */ ('(?:') + /** @type {const} */ ([\n\t'\\\\|\\\\|',\n\t'\\\\&(?:\\\\&|>>?)', // `&&`, `&>`, and `&>>`\n\t';;\\\\&?', // `;;` and `;;&`\n\t'[;|]\\\\&', // `;&` and `|&`\n\t'\\\\<\\\\(',\n\t'\\\\<\\\\<\\\\<',\n\t'\\\\<\\\\<-',\n\t'\\\\<\\\\<(?!\\\\()', // `<<(` stays `<` and `<(`, as zsh reads it; other shells reject it\n\t'>>',\n\t'>[&|(]', // `>&`, `>|`, and `>(`\n\t'<[&>]', // `<&` and `<>`\n\t'[&;()|<>]'\n]).join(/** @type {const} */ ('|')) + /** @type {const} */ (')');\nvar controlRE = new RegExp('^' + CONTROL + '$');\nvar META = /** @type {const} */ ('|&;()<> \\\\t');\nvar SINGLE_QUOTE = /** @type {const} */ ('\\'([^\\']*?)\\'');\n// bash ANSI-C quoting, `$'...'`: a backslash escapes the next character, including `'`\nvar ANSI_C_BODY = '(?:\\\\\\\\[\\\\s\\\\S]|[^\\\\\\\\\\'])*?';\nvar ANSI_C_QUOTE = '\\\\$\\'' + ANSI_C_BODY + '\\'';\nvar ansiCAt = new RegExp('\\\\$\\'' + ANSI_C_BODY + '(?:(\\')|\\\\\\\\?$)', 'g');\nvar ANSI_C_LETTERS = 'abeEfnrtv';\nvar ANSI_C_CHARS = '\\x07\\b\\x1B\\x1B\\f\\n\\r\\t\\v';\nvar hash = /^#$/;\n\nvar SQ = /** @type {const} */ (\"'\");\nvar DQ = /** @type {const} */ ('\"');\nvar DS = /** @type {const} */ ('$');\n\nvar TOKEN = '';\nvar mult = /** @type {const} */ (0x100000000); // Math.pow(16, 8);\nfor (var i = 0; i < 4; i++) {\n\tTOKEN += (mult * Math.random()).toString(16);\n}\nvar startsWithToken = new RegExp('^' + TOKEN);\n\n/**\n * @param {string} s\n * @param {RegExp} r\n */\nfunction matchAll(s, r) {\n\tvar origIndex = r.lastIndex;\n\n\tvar matches = [];\n\tvar matchObj;\n\n\twhile ((matchObj = r.exec(s))) {\n\t\tmatches[matches.length] = matchObj;\n\t\tif (r.lastIndex === matchObj.index) {\n\t\t\tr.lastIndex += 1;\n\t\t}\n\t}\n\n\tr.lastIndex = origIndex;\n\n\treturn matches;\n}\n\n/**\n * @param {Env} env\n * @param {string} pre\n * @param {string} key\n */\nfunction getVar(env, pre, key) {\n\tvar r = typeof env === 'function' ? env(key) : env[key];\n\tif (typeof r === 'undefined' && key != '') {\n\t\tr = '';\n\t} else if (typeof r === 'undefined') {\n\t\tr = '$';\n\t}\n\n\tif (typeof r === 'object') {\n\t\treturn pre + TOKEN + JSON.stringify(r) + TOKEN;\n\t}\n\treturn pre + r;\n}\n\nvar ansiCEscape = /\\\\([0-7]{1,3}|x[\\dA-Fa-f]{1,2}|u[\\dA-Fa-f]{1,4}|U[\\dA-Fa-f]{1,8}|c(?:\\\\\\\\|[\\s\\S])|[abeEfnrtv\\\\'\"?])/g;\n\n/**\n * @param {string} m\n * @param {string} escape\n */\nfunction expandAnsiCEscape(m, escape) {\n\tvar kind = escape.charAt(0);\n\tif (kind === 'c') {\n\t\tvar ctrl = escape.charAt(1);\n\t\treturn ctrl === '?' ? '\\x7F' : String.fromCharCode(ctrl.charCodeAt(0) & 0x1F);\n\t}\n\tif (kind === 'x' || kind === 'u' || kind === 'U') {\n\t\tvar cp = parseInt(escape.slice(1), 16);\n\t\tif (cp > 0x10FFFF) {\n\t\t\treturn m;\n\t\t}\n\t\treturn String.fromCharCode.apply(null, cp > 0xFFFF ? [0xD7C0 + (cp >> 10), 0xDC00 + (cp & 0x3FF)] : [cp]);\n\t}\n\tif (kind >= '0' && kind <= '7') {\n\t\treturn String.fromCharCode(parseInt(escape, 8) & 0xFF);\n\t}\n\tvar letter = ANSI_C_LETTERS.indexOf(escape);\n\treturn letter < 0 ? escape : ANSI_C_CHARS.charAt(letter);\n}\n\n/** @param {string} body */\nfunction expandAnsiC(body) {\n\treturn body.replace(ansiCEscape, expandAnsiCEscape).split('\\0')[0]; // like bash, a NUL ends the string\n}\n\n/**\n * @param {string} s\n * @param {number} i\n */\nfunction closesAnsiC(s, i) {\n\tansiCAt.lastIndex = i;\n\treturn !!(/** @type {RegExpExecArray} */ (ansiCAt.exec(s)))[1];\n}\n\n/**\n * @param {string} string\n * @param {Env} [env]\n * @param {{ escape?: string, splitUnquoted?: boolean | string }} [opts]\n * @returns {ParseEntry[]}\n */\nfunction parseInternal(string, env, opts) {\n\tif (!opts) {\n\t\topts = {};\n\t}\n\tvar BS = opts.escape || '\\\\';\n\tvar ifs = opts.splitUnquoted === true ? ' \\t\\n' : (typeof opts.splitUnquoted === 'string' ? opts.splitUnquoted : '');\n\tvar BAREWORD = '(\\\\' + BS + '[\\'\"$\\\\' + BS + META + ']|\\\\$\\\\$|\\\\$(?!' + ANSI_C_QUOTE.slice(2) + ')|[^\\\\s\\'\"$' + META + '])+';\n\tvar DOUBLE_QUOTE = '\"(?:\\\\' + BS + '[\\\\s\\\\S]|[^\"\\\\' + BS + '])*\"';\n\n\tvar chunker = new RegExp([\n\t\t'(' + CONTROL + ')', // control chars\n\t\t'(' + ANSI_C_QUOTE + '|' + BAREWORD + '|' + DOUBLE_QUOTE + '|' + SINGLE_QUOTE + ')+'\n\t].join('|'), 'g');\n\n\tvar matches = matchAll(string, chunker);\n\n\tif (matches.length === 0) {\n\t\treturn [];\n\t}\n\tif (!env) {\n\t\tenv = {};\n\t}\n\n\tvar commented = false;\n\n\treturn matches.map(function (match) {\n\t\tvar s = match[0];\n\t\tif (!s || commented) {\n\t\t\treturn void undefined;\n\t\t}\n\t\tif (controlRE.test(s)) {\n\t\t\treturn /** @type {ControlOperator} */ ({ op: s });\n\t\t}\n\n\t\t// Hand-written scanner/parser for Bash quoting rules:\n\t\t//\n\t\t// 1. inside single quotes, all characters are printed literally.\n\t\t// 2. inside double quotes, all characters are printed literally\n\t\t// except variables prefixed by '$' and backslashes followed by\n\t\t// either a double quote or another backslash.\n\t\t// 3. outside of any quotes, backslashes are treated as escape\n\t\t// characters and not printed (unless they are themselves escaped)\n\t\t// 4. quote context can switch mid-token if there is no whitespace\n\t\t// between the two quote contexts (e.g. all'one'\"token\" parses as\n\t\t// \"allonetoken\")\n\t\t/** @type {string | boolean} */\n\t\tvar quote = false;\n\t\tvar esc = false;\n\t\tvar out = '';\n\t\t/** @type {string[]} */\n\t\tvar words = [];\n\t\tvar sawQuote = false;\n\t\t/** @type {number | null} */\n\t\tvar pendingNw = null;\n\t\tvar isGlob = false;\n\t\t/** @type {number} */\n\t\tvar i;\n\n\t\tfunction parseEnvVar() {\n\t\t\ti += 1;\n\t\t\t/** @type {number | RegExpMatchArray | null} */\n\t\t\tvar varend;\n\t\t\t/** @type {string} */\n\t\t\tvar varname;\n\t\t\tvar char = s.charAt(i);\n\n\t\t\tif (char === '{') {\n\t\t\t\ti += 1;\n\t\t\t\tif (s.charAt(i) === '}') {\n\t\t\t\t\tthrow new Error('Bad substitution: ' + s.slice(i - 2, i + 1));\n\t\t\t\t}\n\t\t\t\t// match braces by depth so a nested `${` keeps its inner `}` from ending the outer substitution\n\t\t\t\tvar depth = 1;\n\t\t\t\tvarend = i;\n\t\t\t\twhile (depth > 0 && varend < s.length) {\n\t\t\t\t\tif (s.charAt(varend) === '{' && s.charAt(varend - 1) === '$') {\n\t\t\t\t\t\tdepth += 1;\n\t\t\t\t\t} else if (s.charAt(varend) === '}') {\n\t\t\t\t\t\tdepth -= 1;\n\t\t\t\t\t}\n\t\t\t\t\tvarend += 1;\n\t\t\t\t}\n\t\t\t\tif (depth !== 0) {\n\t\t\t\t\tthrow new Error('Bad substitution: ' + s.slice(i));\n\t\t\t\t}\n\t\t\t\tvarend -= 1;\n\t\t\t\tvarname = s.slice(i, varend);\n\t\t\t\ti = varend;\n\t\t\t} else if ((/[*@#?$!-]/).test(char)) {\n\t\t\t\tvarname = char;\n\t\t\t} else {\n\t\t\t\tvar slicedFromI = s.slice(i);\n\t\t\t\tvarend = slicedFromI.match(/[^\\w\\d_]/);\n\t\t\t\tif (!varend) {\n\t\t\t\t\tvarname = slicedFromI;\n\t\t\t\t\ti = s.length;\n\t\t\t\t} else {\n\t\t\t\t\tvarname = slicedFromI.slice(0, varend.index);\n\t\t\t\t\ti += /** @type {number} */ (varend.index) - 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn getVar(/** @type {NonNullable<typeof env>} */ (env), '', varname);\n\t\t}\n\n\t\tfunction flushRun() {\n\t\t\tif (pendingNw === null) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (pendingNw === 0) {\n\t\t\t\tif (out !== '') {\n\t\t\t\t\twords[words.length] = out;\n\t\t\t\t\tout = '';\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twords[words.length] = out;\n\t\t\t\tout = '';\n\t\t\t\tfor (var fe = 1; fe < pendingNw; fe += 1) {\n\t\t\t\t\twords[words.length] = '';\n\t\t\t\t}\n\t\t\t}\n\t\t\tpendingNw = null;\n\t\t}\n\n\t\tfor (i = 0; i < s.length; i++) {\n\t\t\tvar c = s.charAt(i);\n\t\t\tif (ifs && c !== DS) {\n\t\t\t\tflushRun();\n\t\t\t}\n\t\t\tisGlob = isGlob || (!quote && (c === '*' || c === '?'));\n\t\t\tif (esc) {\n\t\t\t\tout += c;\n\t\t\t\tesc = false;\n\t\t\t} else if (quote) {\n\t\t\t\tif (c === quote) {\n\t\t\t\t\tquote = false;\n\t\t\t\t} else if (quote == SQ) {\n\t\t\t\t\tout += c;\n\t\t\t\t} else { // Double quote\n\t\t\t\t\tif (c === BS) {\n\t\t\t\t\t\ti += 1;\n\t\t\t\t\t\tc = s.charAt(i);\n\t\t\t\t\t\tif (c === DQ || c === BS || c === DS) {\n\t\t\t\t\t\t\tout += c;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tout += BS + c;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (c === DS) {\n\t\t\t\t\t\tout += parseEnvVar();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tout += c;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (c === DQ || c === SQ) {\n\t\t\t\tquote = c;\n\t\t\t\tsawQuote = true;\n\t\t\t} else if (controlRE.test(c)) {\n\t\t\t\treturn /** @type {ControlOperator} */ ({ op: s });\n\t\t\t} else if (hash.test(c)) {\n\t\t\t\tcommented = true;\n\t\t\t\tvar commentObj = { comment: string.slice(match.index + i + 1) };\n\t\t\t\tif (out.length) {\n\t\t\t\t\treturn /** @type {const} */ ([out, commentObj]);\n\t\t\t\t}\n\t\t\t\treturn /** @type {const} */ ([commentObj]);\n\t\t\t} else if (c === BS) {\n\t\t\t\tesc = true;\n\t\t\t} else if (c === DS && s.charAt(i + 1) === SQ && closesAnsiC(s, i)) {\n\t\t\t\tflushRun();\n\t\t\t\tsawQuote = true;\n\t\t\t\tout += expandAnsiC(s.slice(i + 2, ansiCAt.lastIndex - 1));\n\t\t\t\ti = ansiCAt.lastIndex - 1;\n\t\t\t} else if (c === DS) {\n\t\t\t\tvar value = parseEnvVar();\n\t\t\t\tif (!ifs) {\n\t\t\t\t\tout += value;\n\t\t\t\t} else {\n\t\t\t\t\tfor (var vi = 0; vi < value.length; vi += 1) {\n\t\t\t\t\t\tvar vc = value.charAt(vi);\n\t\t\t\t\t\tif (ifs.indexOf(vc) < 0) {\n\t\t\t\t\t\t\tflushRun();\n\t\t\t\t\t\t\tout += vc;\n\t\t\t\t\t\t} else if (pendingNw === null) {\n\t\t\t\t\t\t\tpendingNw = vc === ' ' || vc === '\\t' || vc === '\\n' ? 0 : 1;\n\t\t\t\t\t\t} else if (vc !== ' ' && vc !== '\\t' && vc !== '\\n') {\n\t\t\t\t\t\t\tpendingNw += 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tout += c;\n\t\t\t}\n\t\t}\n\n\t\tif (isGlob) {\n\t\t\treturn /** @type {GlobPattern} */ ({ op: 'glob', pattern: out });\n\t\t}\n\n\t\tif (ifs) {\n\t\t\tif (pendingNw !== null && pendingNw > 0) {\n\t\t\t\twords[words.length] = out;\n\t\t\t\tout = '';\n\t\t\t\tfor (var te = 1; te < pendingNw; te += 1) {\n\t\t\t\t\twords[words.length] = '';\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (out !== '' || (sawQuote && words.length === 0)) {\n\t\t\t\twords[words.length] = out;\n\t\t\t}\n\t\t\treturn words;\n\t\t}\n\n\t\treturn out;\n\t}).reduce(function (prev, arg) { // finalize parsed arguments\n\t\tif (typeof arg === 'undefined') {\n\t\t\treturn prev;\n\t\t}\n\t\t/** @type {ParseEntry[]} */ ([]).concat(arg).forEach(function (entry) {\n\t\t\tprev[prev.length] = entry;\n\t\t});\n\t\treturn prev;\n\t}, /** @type {ParseEntry[]} */ ([]));\n}\n\n/** @type {typeof import('./parse')} */\nmodule.exports = function parse(s, env, opts) {\n\tvar mapped = parseInternal(s, env, opts);\n\tif (typeof env !== 'function') {\n\t\treturn mapped;\n\t}\n\treturn mapped.reduce(function (acc, s) {\n\t\tif (typeof s === 'object') {\n\t\t\tacc[acc.length] = s;\n\t\t\treturn acc;\n\t\t}\n\t\tvar xs = s.split(RegExp('(' + TOKEN + '.*?' + TOKEN + ')', 'g'));\n\t\tif (xs.length === 1) {\n\t\t\tacc[acc.length] = xs[0];\n\t\t\treturn acc;\n\t\t}\n\t\txs.filter(Boolean).forEach(function (x) {\n\t\t\tacc[acc.length] = startsWithToken.test(x)\n\t\t\t\t? JSON.parse(x.split(TOKEN)[1])\n\t\t\t\t: x;\n\t\t});\n\t\treturn acc;\n\t}, /** @type {ParseEntry[]} */ ([]));\n};\n","'use strict';\n\nexports.quote = require('./quote');\nexports.parse = require('./parse');\n","import { safeStringify } from \"@zaly/shared\"\nimport { parse as shellParse } from \"shell-quote\"\n\n/** A shell command broken down into its structural parts. One bash\n * input may parse to multiple segments (joined by `|`, `&&`, `||`, `;`).\n * Each segment is evaluated independently by the policy. */\nexport interface Segment {\n cmd: string\n args: string[]\n dyn?: Set<string>\n /** File paths the segment reads from (`< file` redirects). Built-in\n * tools may add inferred reads in the policy layer. */\n reads: string[]\n /** File paths the segment writes to (`> file` / `>> file`). */\n writes: { path: string; mode: \"trunc\" | \"append\" }[]\n /** True if the input contains command substitution (`$()` or backticks)\n * or any other dynamic-evaluation construct. Forces ask. */\n hasCommandSubst: boolean\n}\n\nexport type ParseResult = { ok: true; segments: Segment[] } | { ok: false; reason: string }\n\n/** Targets a redirect can write to without filesystem implications.\n * Anything else is treated as a file write and goes through fileWrite\n * policy. */\nconst SAFE_REDIRECT_TARGETS = new Set([\"/dev/null\", \"/dev/stderr\", \"/dev/stdout\"])\n\n/** A redirect target like `&1`, `&2`, `&-` — duplicates an existing fd,\n * no filesystem effect. */\nfunction isFdRedirect(target: string): boolean {\n return /^&(?:\\d+|-)$/.test(target)\n}\n\ntype Op = { op: string }\ntype Glob = { op: \"glob\"; pattern: string }\ntype Comment = { comment: string }\ntype Token = string | Op | Glob | Comment\n\nconst COMMAND_SEPS = new Set([\"|\", \"&&\", \"||\", \";\"])\nconst REDIRECT_OPS = new Set([\">\", \">>\", \"<\", \">&\", \"<&\"])\nconst DYN_SENTINEL = \"\\u{E000}\"\n\n/** Parse a bash command line. Returns segments with a flag for\n * unsupported constructs that force \"ask\" downstream. Heredocs,\n * subshells, command substitution, and backticks all surface as\n * `hasCommandSubst: true` (the umbrella \"we can't reason about this\"\n * signal) rather than parse failures, so the policy can still decide. */\nexport function parseBash(input: string): ParseResult {\n // Heredocs derail shell-quote (the body bleeds into surrounding tokens),\n // so we bail to ok:false here. checkBash maps that to ask.\n if (/<<-?\\s*['\"]?\\w+/.test(input)) {\n return { ok: false, reason: \"heredoc not supported\" }\n }\n // Backticks command-substitute in bash unless inside single quotes\n // (single quotes preserve everything literally; double quotes don't\n // suppress substitution). Flag only the unquoted form so embedded\n // template literals in `bun -e '... ${x} `tpl` ...'` don't trip us.\n const hasBackticks = hasUnquotedBacktick(input)\n\n let rawTokens: Token[]\n try {\n rawTokens = shellParse(input, (e) =>\n e === \"\" ? undefined : `${DYN_SENTINEL}\\${${e}}`\n ) as Token[]\n } catch (error) {\n return { ok: false, reason: `tokenize: ${(error as Error).message}` }\n }\n\n // Inline plain `(subshell)` contents as separate segments; strip\n // `$(...)` regions and flag as command substitution. Backticks\n // already detected via the pre-scan above.\n const flat = flattenParens(rawTokens)\n const hasCommandSubst = hasBackticks || flat.hasCommandSubst\n\n const segmentTokens: Token[][] = [[]]\n for (const t of flat.tokens) {\n if (typeof t === \"object\" && \"comment\" in t) continue\n\n if (typeof t === \"object\" && \"op\" in t && COMMAND_SEPS.has(t.op)) {\n if (segmentTokens.at(-1)!.length > 0) segmentTokens.push([])\n continue\n }\n\n segmentTokens.at(-1)!.push(t)\n }\n\n if (segmentTokens.at(-1)!.length === 0) segmentTokens.pop()\n\n const segments: Segment[] = []\n for (const segToks of segmentTokens) {\n const seg = parseSegment(segToks)\n if (!seg.ok) return seg\n if (seg.segment) segments.push({ ...seg.segment, hasCommandSubst })\n }\n\n if (segments.length === 0) {\n return { ok: false, reason: \"empty input\" }\n }\n return { ok: true, segments }\n}\n\nfunction parseSegment(\n tokens: Token[]\n):\n | { ok: true; segment: Omit<Segment, \"hasCommandSubst\"> | undefined }\n | { ok: false; reason: string } {\n let args: string[] = []\n let reads: string[] = []\n let writes: { path: string; mode: \"trunc\" | \"append\" }[] = []\n const dyn = new Set<string>()\n\n for (let i = 0; i < tokens.length; i++) {\n const t = tokens[i]\n\n if (typeof t === \"string\") {\n // FD prefix on a redirect (`2>&1`, `2>file`, `1<&-`) — shell-quote\n // splits the leading digit off as its own token. Don't treat it\n // as a regular arg; the redirect handler below picks up the op.\n if (/^\\d+$/.test(t)) {\n const next = tokens[i + 1]\n if (typeof next === \"object\" && \"op\" in next && REDIRECT_OPS.has(next.op)) {\n continue\n }\n }\n args.push(t)\n continue\n }\n\n if (\"comment\" in t) continue\n\n if (\"pattern\" in t) {\n // Pass globs through as their pattern — policy layer decides.\n args.push(t.pattern)\n dyn.add(t.pattern)\n continue\n }\n\n if (!(\"op\" in t)) {\n return { ok: false, reason: `unsupported token: ${safeStringify(t)}` }\n }\n\n if (REDIRECT_OPS.has(t.op)) {\n const next = tokens[i + 1]\n if (typeof next !== \"string\") {\n return { ok: false, reason: `redirect target missing after ${t.op}` }\n }\n i++ // consume target\n\n if (t.op === \">\" || t.op === \">>\") {\n // Skip safe targets (/dev/null etc.) and fd redirects entirely.\n if (SAFE_REDIRECT_TARGETS.has(next) || isFdRedirect(next)) continue\n writes.push({ mode: t.op === \">>\" ? \"append\" : \"trunc\", path: next })\n } else if (t.op === \"<\") {\n if (SAFE_REDIRECT_TARGETS.has(next) || isFdRedirect(next)) continue\n reads.push(next)\n }\n // `>&` / `<&` are fd-duplicating (`2>&1`-style) — no fs impact.\n continue\n }\n\n return { ok: false, reason: `unsupported op: ${t.op}` }\n }\n\n const dynPath = (p: string) => {\n if (!p.includes(DYN_SENTINEL)) return p\n p = p.replaceAll(DYN_SENTINEL, \"\")\n dyn.add(p)\n return p\n }\n\n args = args.map((a) => dynPath(a))\n writes = writes.map((w) => ({ ...w, path: dynPath(w.path) }))\n reads = reads.map(dynPath)\n\n // Strip leading wrapper commands (`time`, `nohup`, `nice`, …) so the\n // policy sees the real command being run. `time bun test` evaluates\n // as `bun test`; a bare `time` (or `time (subshell)` after flatten)\n // leaves nothing and signals the caller to drop the segment.\n const unwrapped = unwrapWrappers(args)\n if (unwrapped.length === 0) {\n return { ok: true, segment: undefined }\n }\n\n return {\n ok: true,\n segment: {\n args: unwrapped.slice(1),\n cmd: unwrapped[0],\n dyn,\n reads,\n writes,\n },\n }\n}\n\ninterface WrapperSpec {\n /** Flags that consume the next arg as their value. */\n valueFlags?: Set<string>\n}\n\n/** Commands that wrap another command — they're transparent for\n * permission purposes, since the security-relevant action is whatever\n * they run. `sudo` is intentionally absent: it changes the effective\n * user and must always be flagged. */\nconst WRAPPERS: Partial<Record<string, WrapperSpec>> = {\n command: {}, // bash builtin, bypasses aliases\n ionice: { valueFlags: new Set([\"-c\", \"-n\", \"-p\", \"-P\", \"-u\"]) },\n nice: { valueFlags: new Set([\"-n\", \"--adjustment\"]) },\n nohup: {},\n time: {}, // bash reserved word, also GNU /usr/bin/time\n}\n\n/** Detect backticks outside single-quoted regions. Single quotes in\n * bash can't be escaped from within, so the toggle is a simple state\n * flip on every `'`. Double quotes do not suppress backtick\n * substitution and are ignored here. */\nfunction hasUnquotedBacktick(input: string): boolean {\n let inSingle = false\n for (const c of input) {\n if (c === \"'\") {\n inSingle = !inSingle\n continue\n }\n if (c === \"`\" && !inSingle) return true\n }\n return false\n}\n\n/** Strip leading wrapper-command prefixes from an arg list. Repeats\n * while the head is a wrapper (so `time nice -n 5 cmd` → `cmd`).\n * Wrapper-flags (and their values, where applicable) are consumed\n * along with the wrapper itself. */\nfunction unwrapWrappers(args: string[]): string[] {\n let current = args\n while (current.length > 0) {\n const spec = WRAPPERS[current[0]]\n if (!spec) break\n const valueFlags = spec.valueFlags ?? new Set()\n let i = 1\n while (i < current.length && current[i].startsWith(\"-\")) {\n const flag = current[i]\n i++\n if (valueFlags.has(flag) && i < current.length) i++ // consume flag value\n }\n current = current.slice(i)\n }\n return current\n}\n\n/** Walk a token list and resolve paren constructs:\n * - Plain `(subshell)` → tokens inlined with `;` boundaries on each\n * side, so the contents become independent segments evaluated by\n * the same policy. The subshell's own scope (cwd changes etc.) is\n * irrelevant to permissions — each command is checked individually.\n * - `$(...)` (command substitution) → stripped entirely, with the\n * `hasCommandSubst` flag raised. The dynamic value can't be\n * statically reasoned about. Detected by the leading `$` token\n * that shell-quote emits before the `(`.\n *\n * Recurses into subshell contents to handle nesting and to catch\n * `$(...)` constructs nested inside subshells. */\nfunction flattenParens(tokens: Token[]): { tokens: Token[]; hasCommandSubst: boolean } {\n const out: Token[] = []\n let hasCommandSubst = false\n let i = 0\n while (i < tokens.length) {\n const t = tokens[i]\n if (typeof t === \"object\" && \"op\" in t && t.op === \"(\") {\n const isSubst = out.at(-1) === \"$\"\n if (isSubst) out.pop()\n\n // Find matching `)`, accounting for nesting.\n let depth = 1\n let j = i + 1\n while (j < tokens.length && depth > 0) {\n const tj = tokens[j]\n if (typeof tj === \"object\" && \"op\" in tj) {\n if (tj.op === \"(\") depth++\n else if (tj.op === \")\") depth--\n }\n if (depth > 0) j++\n }\n const inner = tokens.slice(i + 1, j)\n\n if (isSubst) {\n hasCommandSubst = true\n // Drop the entire $(...) — its value is dynamic.\n } else {\n const sub = flattenParens(inner)\n if (sub.hasCommandSubst) hasCommandSubst = true\n // Surround with separators so subshell contents form their own\n // segments regardless of what's adjacent in the outer chain.\n out.push({ op: \";\" }, ...sub.tokens, { op: \";\" })\n }\n i = j + 1\n continue\n }\n\n if (typeof t === \"object\" && \"op\" in t && t.op === \")\") {\n // Stray closing paren (unbalanced input). Skip — the parser's\n // overall result will likely fail downstream on a malformed segment.\n i++\n continue\n }\n\n out.push(t)\n i++\n }\n return { hasCommandSubst, tokens: out }\n}\n","/**\n * Built-in tool registry — per-command knowledge of which args are\n * input files, output files, and which invocation modes are too\n * complex to safely model.\n *\n * The policy engine consults this registry alongside explicit redirect\n * info from the parser to determine per-command file I/O for the\n * fileRead/fileWrite policy hooks.\n */\nexport interface ToolSpec {\n /** File paths the command will read from, derived from args. */\n reads?: (args: string[]) => string[]\n /** File paths the command will write to. */\n writes?: (args: string[]) => string[]\n /** Returns true if the args invoke a mode the parser can't safely\n * reason about (e.g. `sed -e 'w out'`, `find -exec`). Forces ask. */\n unsafe?: (args: string[]) => boolean\n}\n\n/** All bare positional args (no leading dash). Default for many\n * read-only utilities. */\nfunction positionals(args: string[]): string[] {\n return args.filter((a) => !a.startsWith(\"-\") && a !== \"\")\n}\n\n/** All positionals after the first one (e.g. `grep PATTERN file...`). */\nfunction positionalsAfterFirst(args: string[]): string[] {\n const out: string[] = []\n let seenFirst = false\n for (const a of args) {\n if (a.startsWith(\"-\") || a === \"\") continue\n if (!seenFirst) {\n seenFirst = true\n continue\n }\n out.push(a)\n }\n return out\n}\n\n// ── sed ──────────────────────────────────────────────────────────────────\n\n/** Flags whose value is the *next* arg, not part of the script. */\nconst SED_VALUE_FLAGS = new Set([\"-e\", \"--expression\", \"-f\", \"--file\"])\n\n/** Walk sed args, returning [scripts, positionalsAfterScript]. The\n * \"script\" is everything passed via `-e` plus the first bare arg\n * (the implicit script when no `-e` is given). Positionals after\n * that are input files. */\nfunction sedSplit(args: string[]): { scripts: string[]; files: string[] } {\n const scripts: string[] = []\n const files: string[] = []\n let needsImplicitScript = !args.some(\n (a) => a === \"-e\" || a === \"--expression\" || a === \"-f\" || a === \"--file\"\n )\n\n for (let i = 0; i < args.length; i++) {\n const a = args[i]\n if (a.startsWith(\"-\")) {\n if (SED_VALUE_FLAGS.has(a) && i + 1 < args.length) {\n if (a === \"-e\" || a === \"--expression\") scripts.push(args[i + 1])\n i++ // consume value\n }\n continue\n }\n if (needsImplicitScript) {\n scripts.push(a)\n needsImplicitScript = false\n continue\n }\n files.push(a)\n }\n return { files, scripts }\n}\n\nconst SED_INPLACE = new Set([\"-i\", \"--in-place\"])\n\nfunction sedReads(args: string[]): string[] {\n return sedSplit(args).files\n}\n\nfunction sedWrites(args: string[]): string[] {\n // `-i` rewrites positional input files; also supports `-i.bak` form.\n const inPlace = args.some((a) => SED_INPLACE.has(a) || a.startsWith(\"-i.\"))\n return inPlace ? sedSplit(args).files : []\n}\n\nfunction sedUnsafe(args: string[]): boolean {\n // `w` / `W` write commands and `r` / `R` read commands inside the\n // script can do file I/O the parser can't see. Bail to ask.\n for (const script of sedSplit(args).scripts) {\n if (/(?:^|;|\\n)\\s*[wWrR]\\s+\\S/.test(script)) return true\n }\n return false\n}\n\n// ── awk ──────────────────────────────────────────────────────────────────\n\nfunction awkReads(args: string[]): string[] {\n // awk usage: `awk [opts] 'script' [files...]` or `awk [opts] -f file [files...]`\n // Files come after the script. Skip flags + their values.\n let sawScript = false\n let usingFFlag = false\n const files: string[] = []\n for (let i = 0; i < args.length; i++) {\n const a = args[i]\n if (a === \"-f\" || a === \"--file\") {\n if (i + 1 < args.length) files.push(args[i + 1]) // script file is read too\n i++\n sawScript = true\n usingFFlag = true\n continue\n }\n if (a.startsWith(\"-\")) {\n // Some awk flags take a value (-v, -F)\n if (a === \"-v\" || a === \"-F\") i++\n continue\n }\n if (!sawScript) {\n sawScript = true\n continue\n }\n files.push(a)\n }\n return usingFFlag ? files : files\n}\n\nfunction awkUnsafe(args: string[]): boolean {\n // awk's `print > file` and `printf > file` inside a script write to\n // files. Detecting reliably without parsing the script is hard, so\n // bail to ask if the script (or any -e value) contains a `>` operator.\n // Conservative — false positives are fine for \"ask\".\n let sawScript = false\n for (let i = 0; i < args.length; i++) {\n const a = args[i]\n if (a === \"-f\" || a === \"--file\" || a === \"-v\" || a === \"-F\") {\n i++\n continue\n }\n if (a.startsWith(\"-\")) continue\n if (!sawScript) {\n sawScript = true\n if (/[>|]/.test(a)) return true\n }\n }\n return false\n}\n\n// ── find ─────────────────────────────────────────────────────────────────\n\nfunction findReads(args: string[]): string[] {\n // First positional (or `.`) is the path. Multiple paths possible\n // before the first `-action` flag.\n const out: string[] = []\n for (const a of args) {\n if (a.startsWith(\"-\")) break\n out.push(a)\n }\n return out.length > 0 ? out : [\".\"]\n}\n\nfunction findUnsafe(args: string[]): boolean {\n // `-delete`, `-exec`, `-execdir`, `-ok`, `-okdir` all do work we\n // can't trace.\n return args.some(\n (a) => a === \"-delete\" || a === \"-exec\" || a === \"-execdir\" || a === \"-ok\" || a === \"-okdir\"\n )\n}\n\n// ── dynamic execution ────────────────────────────────────────────────────\n//\n// These commands run arbitrary code passed as arguments or sourced from\n// files. We can't reason about their effects from the parser; force ask.\n\nconst dynamicExec = (): boolean => true\n\n// ── registry ─────────────────────────────────────────────────────────────\n\nexport const TOOLS: Partial<Record<string, ToolSpec>> = {\n \".\": { unsafe: dynamicExec }, // sh: source alias\n awk: { reads: awkReads, unsafe: awkUnsafe },\n basename: {},\n cat: { reads: positionals },\n cd: {},\n cut: { reads: positionals },\n diff: { reads: positionals },\n dirname: {},\n echo: {},\n eval: { unsafe: dynamicExec }, // runs its argument as shell input\n exec: { unsafe: dynamicExec }, // replaces the shell process\n file: { reads: positionals },\n find: { reads: findReads, unsafe: findUnsafe },\n grep: { reads: positionalsAfterFirst },\n head: { reads: positionals },\n hexdump: { reads: positionals },\n less: { reads: positionals },\n ls: { reads: positionals },\n more: { reads: positionals },\n od: { reads: positionals },\n printf: {},\n pwd: {},\n readlink: { reads: positionals },\n realpath: { reads: positionals },\n rg: { reads: positionalsAfterFirst },\n sed: { reads: sedReads, unsafe: sedUnsafe, writes: sedWrites },\n sort: { reads: positionals },\n source: { unsafe: dynamicExec }, // bash: runs the file in current shell\n stat: { reads: positionals },\n tail: { reads: positionals },\n tree: { reads: positionals },\n uniq: { reads: positionals },\n wc: { reads: positionals },\n xxd: { reads: positionals },\n}\n"],"ignoreList":[0,1,2],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zaly/agent",
3
- "version": "0.0.11",
3
+ "version": "0.1.0",
4
4
  "description": "Agent runtime, sessions, tools, permissions, compaction, and tasks for zaly.",
5
5
  "keywords": [
6
6
  "agent",
@@ -33,27 +33,65 @@
33
33
  "access": "public"
34
34
  },
35
35
  "dependencies": {
36
- "@zaly/ai": "0.0.11",
37
- "@zaly/shared": "0.0.11",
36
+ "@zaly/ai": "0.1.0",
37
+ "@zaly/shared": "0.1.0",
38
38
  "pathe": "^2.0.3"
39
39
  },
40
40
  "devDependencies": {
41
+ "@joplin/turndown-plugin-gfm": "^1.0.68",
42
+ "@mozilla/readability": "^0.6.0",
41
43
  "@types/shell-quote": "^1.7.5",
42
- "ignore": "^7.0.12",
44
+ "@types/turndown": "^5.0.6",
45
+ "ignore": "^7.0.13",
43
46
  "jsonpath-plus": "^11.2.1",
44
- "shell-quote": "^1.12.0"
47
+ "linkedom": "^0.18.14",
48
+ "shell-quote": "^1.12.0",
49
+ "turndown": "^7.2.4"
45
50
  },
46
51
  "peerDependencies": {
47
- "typebox": "^1.3.37"
52
+ "typebox": "^1.4.2"
48
53
  },
49
54
  "engines": {
50
55
  "bun": ">=1.2",
51
56
  "node": ">=22.18.0"
52
57
  },
53
58
  "inlinedDependencies": {
54
- "ignore": "7.0.12",
59
+ "@acemir/cssom": "0.9.32",
60
+ "@joplin/turndown-plugin-gfm": "1.0.68",
61
+ "@mixmark-io/domino": "2.2.0",
62
+ "@mozilla/readability": "0.6.0",
63
+ "boolbase": "2.0.0",
64
+ "css-select": "7.0.0",
65
+ "css-what": "8.0.0",
66
+ "dom-serializer": [
67
+ "2.0.0",
68
+ "3.1.1"
69
+ ],
70
+ "domelementtype": [
71
+ "2.3.0",
72
+ "3.0.0"
73
+ ],
74
+ "domhandler": [
75
+ "5.0.3",
76
+ "6.0.1"
77
+ ],
78
+ "domutils": [
79
+ "3.2.2",
80
+ "4.0.2"
81
+ ],
82
+ "entities": [
83
+ "4.5.0",
84
+ "7.0.1",
85
+ "8.1.0"
86
+ ],
87
+ "htmlparser2": "10.1.0",
88
+ "ignore": "7.0.13",
55
89
  "jsonpath-plus": "11.2.1",
56
- "shell-quote": "1.12.0"
90
+ "linkedom": "0.18.14",
91
+ "nth-check": "3.0.1",
92
+ "shell-quote": "1.12.0",
93
+ "turndown": "7.2.4",
94
+ "uhyphen": "0.2.0"
57
95
  },
58
96
  "scripts": {
59
97
  "build": "z build",
@@ -1 +0,0 @@
1
- {"version":3,"file":"agent-D3wVIibN.mjs","names":[],"sources":["../src/utils/usage.ts","../src/stop.ts","../src/agent.ts"],"sourcesContent":["import type { Message, TokenCount, Usage } from \"@zaly/ai\"\n\n/** Sum two Usages. Optional fields are only present in the result\n * when at least one input had them set, so callers can tell \"no\n * reasoning happened this turn\" apart from \"0 reasoning tokens.\" */\nexport function addUsage(a: Usage, b: Usage): Usage {\n const out: Usage = {\n input: a.input + b.input,\n output: a.output + b.output,\n }\n if (a.cacheRead !== undefined || b.cacheRead !== undefined) {\n out.cacheRead = (a.cacheRead ?? 0) + (b.cacheRead ?? 0)\n }\n if (a.cacheWrite !== undefined || b.cacheWrite !== undefined) {\n out.cacheWrite = (a.cacheWrite ?? 0) + (b.cacheWrite ?? 0)\n }\n if (a.reasoning !== undefined || b.reasoning !== undefined) {\n out.reasoning = (a.reasoning ?? 0) + (b.reasoning ?? 0)\n }\n if (a.cost || b.cost) out.cost = addUsage(a.cost ?? empty(), b.cost ?? empty())\n return out\n}\n\nexport class TokenUsage implements Usage {\n #last: Usage = empty()\n #total: Usage = empty()\n\n constructor(messages?: readonly Message[]) {\n for (const m of messages ?? [])\n if (m.role === \"assistant\" && m.meta?.usage) this.add(m.meta.usage)\n }\n\n get cost(): Usage {\n return this.total.cost ?? empty()\n }\n\n get input(): number {\n return this.last.input\n }\n\n get output(): number {\n return this.last.output\n }\n\n get cacheRead(): number {\n return this.last.cacheRead ?? 0\n }\n\n get cacheWrite(): number {\n return this.last.cacheWrite ?? 0\n }\n\n get reasoning(): number {\n return this.last.reasoning ?? 0\n }\n\n add(count: Usage): void {\n this.#last = count\n this.#total = addUsage(this.#total, count)\n }\n\n resetLast(): void {\n this.#last = empty()\n }\n\n get last(): Usage {\n return this.#last\n }\n\n get total(): Usage {\n return this.#total\n }\n\n get contextSize(): number {\n return (\n this.last.input + this.last.output + (this.last.cacheRead ?? 0) + (this.last.cacheWrite ?? 0)\n )\n }\n}\n\nfunction empty(): TokenCount {\n return { input: 0, output: 0 }\n}\n","import type { TokenCount, ToolCallPart } from \"@zaly/ai\"\nimport type { Emitter, Envelope } from \"@zaly/shared\"\nimport type { AgentEvents, AgentStopKind } from \"./events.ts\"\n\nimport { safeStringify } from \"@zaly/shared\"\nimport { addUsage } from \"./utils/usage.ts\"\n\n/** Caps + heuristics that can end a run early. Wired into the\n * `AgentSession` loop via a single `detect()` call after each step. */\nexport interface StopOptions {\n /** Hard ceiling on provider round-trips per `run()`. Default: 50. */\n maxSteps?: number\n /** Cumulative token cap across the whole `run()`\n * (`totalUsage.input + totalUsage.output`). */\n tokenBudget?: number\n /** Bail after this many consecutive failing tool calls. A successful\n * tool result resets the streak. */\n maxToolErrors?: number\n\n // ── Loop detection ──────────────────────────────────────────────────\n // Two cheap heuristics over the running tool-call history. Hash is\n // `name + JSON.stringify(params)`; property order matters (rare false\n // negative if the model alternates key order on the same logical call,\n // accepted in exchange for a much cheaper hash). Set either limit to\n // `Infinity` to disable that arm.\n\n /** Same `(name, params)` appearing N times in a row → loop. Catches\n * the most common failure mode: re-calling `read_file` with the same\n * path expecting different output. Default 3. */\n loopConsecutive?: number\n /** Bounded window for duplicate detection. Default 10. */\n loopWindow?: number\n /** Within the window, this many duplicates of one call → loop.\n * Catches alternation patterns (`A B A B …`) the consecutive arm\n * alone won't see. Default 4. */\n loopWindowRepeats?: number\n}\n\n/**\n * Subscribes to an `AgentEvent` stream, accumulates the bookkeeping\n * the loop needs to make stop-or-continue decisions, and exposes a\n * single `detect()` to consult after each step.\n *\n * Lives outside `AgentSession` so concerns separate cleanly:\n * - the session owns conversation, queues, status, and loop control;\n * - the policy owns counters and the rules that act on them.\n *\n * Wire it up via `attach(session)` (returns an unsubscribe), or feed\n * events manually with `handle(event)` for custom drivers.\n */\nexport class StopPolicy {\n readonly #opts: StopOptions\n\n #steps = 0\n #consecutiveErrors = 0\n #calls: ToolCallPart[] = []\n #usage: TokenCount = { input: 0, output: 0 }\n #totalUsage: TokenCount = { input: 0, output: 0 }\n\n constructor(opts: StopOptions = {}) {\n this.#opts = opts\n }\n\n // ── Read ──────────────────────────────────────────────────────────────\n\n /** Token usage from the most recent step's response. */\n get usage(): TokenCount {\n return this.#usage\n }\n /** Cumulative token usage across every step in the current run. */\n get totalUsage(): TokenCount {\n return this.#totalUsage\n }\n get steps(): number {\n return this.#steps\n }\n get consecutiveErrors(): number {\n return this.#consecutiveErrors\n }\n /** Tool-call history fed to the loop detector. Read-only. */\n get calls(): readonly ToolCallPart[] {\n return this.#calls\n }\n\n // ── Wiring ────────────────────────────────────────────────────────────\n\n /** Subscribe to an emitter. To detach later, register the listener\n * yourself and pass the same fn to `emitter.off(fn)`:\n *\n * const handler = (e) => policy.handle(e)\n * emitter.all(handler)\n * // later:\n * emitter.off(handler) */\n attach(emitter: Emitter<AgentEvents>): void {\n emitter.onAny((event) => this.handle(event))\n }\n\n /** Feed a single event into the policy. Public so custom drivers\n * can drive it without going through `attach`. */\n handle(event: Envelope<AgentEvents>): void {\n switch (event.type) {\n case \"step-end\": {\n this.#steps++\n break\n }\n case \"tool-call\": {\n this.#calls.push(event.call)\n break\n }\n case \"tool-result\": {\n this.#consecutiveErrors = event.result.isError ? this.#consecutiveErrors + 1 : 0\n break\n }\n case \"stream-event\": {\n if (event.event.type === \"finish\") {\n this.#usage = event.event.usage\n this.#totalUsage = addUsage(this.#totalUsage, event.event.usage)\n }\n break\n }\n // status / stop — no policy state to update.\n }\n }\n\n /** Reset per-run counters. Token totals (`usage` / `totalUsage`)\n * persist unless `keepUsage: false` is passed — billing-style\n * displays usually want them sticky across resets. */\n reset(opts: { keepUsage?: boolean } = {}): void {\n this.#steps = 0\n this.#consecutiveErrors = 0\n this.#calls = []\n if (opts.keepUsage === false) {\n this.#usage = { input: 0, output: 0 }\n this.#totalUsage = { input: 0, output: 0 }\n }\n }\n\n /** Decide whether the loop should stop. Returns the stop reason or\n * `undefined` to continue. Order matters — `loop-detected` wins\n * over `max-tool-errors` if both fire, since a model in a tight\n * loop is the more pressing thing to surface. */\n detect(): AgentStopKind | undefined {\n if (this.#opts.maxSteps !== undefined && this.#steps >= this.#opts.maxSteps) {\n return \"max-steps\"\n }\n if (this.#detectLoop()) {\n return \"loop-detected\"\n }\n if (\n this.#opts.maxToolErrors !== undefined &&\n this.#consecutiveErrors >= this.#opts.maxToolErrors\n ) {\n return \"max-tool-errors\"\n }\n if (\n this.#opts.tokenBudget !== undefined &&\n this.#totalUsage.input + this.#totalUsage.output > this.#opts.tokenBudget\n ) {\n return \"token-budget\"\n }\n return undefined\n }\n\n // ── Loop detection internals ─────────────────────────────────────────\n\n #detectLoop(): boolean {\n const calls = this.#calls\n if (calls.length === 0) return false\n\n const consecutive = this.#opts.loopConsecutive ?? 3\n if (Number.isFinite(consecutive) && calls.length >= consecutive) {\n const last = hashCall(calls[calls.length - 1])\n let run = 1\n for (let i = calls.length - 2; i >= 0 && run < consecutive; i--) {\n if (hashCall(calls[i]) === last) run++\n else break\n }\n if (run >= consecutive) return true\n }\n\n const window = this.#opts.loopWindow ?? 10\n const windowRepeats = this.#opts.loopWindowRepeats ?? 4\n if (Number.isFinite(windowRepeats) && calls.length >= windowRepeats) {\n const slice = calls.slice(Math.max(0, calls.length - window))\n const counts = new Map<string, number>()\n for (const call of slice) {\n const h = hashCall(call)\n const next = (counts.get(h) ?? 0) + 1\n if (next >= windowRepeats) return true\n counts.set(h, next)\n }\n }\n\n return false\n }\n}\n\nfunction hashCall(call: ToolCallPart): string {\n return `${call.name}\\0${safeStringify(call.params)}`\n}\n","// oxlint-disable no-await-in-loop\nimport type {\n AssistantMessage,\n Content,\n Context,\n Message,\n MetaOf,\n MetaPart,\n Model,\n ModelStreamOptions,\n ParamsOf,\n TokenCount,\n Tool,\n ToolCallPart,\n ToolContext,\n ToolResult,\n} from \"@zaly/ai\"\nimport type { CompactionOptions } from \"./compaction/compactions.ts\"\nimport type { AgentContext } from \"./ctx.ts\"\nimport type { AgentEvents, AgentStatus, AgentStop, AgentStopKind } from \"./events.ts\"\nimport type { Session } from \"./session/session.ts\"\nimport type { AgentOptions, ContextPressure, SendMode, StepResult, TurnResult } from \"./types.ts\"\n\nimport { AiError, isContextOverflow, runTool } from \"@zaly/ai\"\nimport { Emitter, toValue, toError } from \"@zaly/shared\"\nimport { StopPolicy } from \"./stop.ts\"\nimport { Tasks, taskCompletionMessage, taskInfoPart } from \"./tasks.ts\"\nimport { TokenUsage } from \"./utils/usage.ts\"\nimport { uuidv7 } from \"./utils/uuid.ts\"\n\nconst PRESSURE_LEVELS = [0.75, 0.85, 0.95] as const\n\n/**\n * Long-lived agent — drives the multi-turn loop, owns the run-time\n * status / queues, and delegates conversation state to a `Session`.\n *\n * Typical interactive use:\n *\n * ```ts\n * const agent = await Agent.load({ model, tools })\n * agent.session.on(\"node\", (e) => render(e))\n * agent.send({ role: \"user\", content: \"hi\" }) // auto-runs\n * // …user types again later…\n * agent.send({ role: \"user\", content: \"follow-up\" }) // queues if running\n * ```\n *\n * Headless / one-shot use is just a thin wrapper on top — see\n * `runAgent` in the test helpers.\n */\nexport class Agent extends Emitter<AgentEvents> {\n readonly #opts: AgentOptions\n readonly #ctx: AgentContext\n readonly #stopPolicy: StopPolicy\n readonly #tasks: Tasks\n /** Nesting depth — see `AgentOptions.depth`. Read-only; subagents pass\n * `parent.depth + 1` when constructing their child. */\n readonly depth: number\n /** Cap on `depth` — see `AgentOptions.maxDepth`. */\n readonly maxDepth: number\n #started = false\n\n #parent?: Agent\n\n #injectQueue: Message[] = []\n #appendQueue: Message[] = []\n #notifyQueue: MetaPart[] = []\n\n #status: AgentStatus = \"idle\"\n #abortController?: AbortController\n #pauseRequested?: string\n #running?: Promise<AgentStopKind>\n #usage: TokenUsage\n\n /** Pending future-injects scheduled via `scheduleWakeup`. Cleared\n * whenever the loop becomes active for any reason — the scheduled\n * inject was a fallback \"wake me up at time T if nothing else does,\"\n * and once something else has, the timer is moot. Hints from cancelled\n * wakeups carry over as a system message so the intent doesn't\n * evaporate. */\n readonly #wakeups = new Map<string, { timer: ReturnType<typeof setTimeout>; hint?: string }>()\n\n #lastStop?: AgentStop\n\n /** Synchronous, low-level constructor. Prefer `Agent.load(opts)` —\n * it runs the same construction *plus* any async setup (resolving\n * `session: SessionOptions` to a built `Session`, skills discovery,\n * future warm-ups). The constructor is `protected` so test doubles /\n * subclasses can still call `super(init)` directly; they're\n * responsible for providing a pre-built `Session` on `init.session`. */\n public constructor(ctx: AgentContext) {\n super()\n const opts = ctx.opts\n this.#ctx = ctx\n this.#opts = ctx.opts\n this.depth = opts.depth ?? 0\n this.maxDepth = opts.maxDepth ?? 2\n\n // Note: session.update() + initial messages are committed\n // asynchronously from `Agent.load`, NOT here. Constructors can't\n // be async; deferring those writes until after construction also\n // gives consumers a window to subscribe to session events before\n // the first node fires.\n\n this.#tasks = new Tasks()\n this.#tasks.$tools = async () => this.tools\n this.#tasks.heartbeatMs = opts.heartbeatMs\n this.#tasks.onEmitError = (error) => opts.logger?.child(\"tasks\").error(error)\n // Post-round task completions inject a system message into the next\n // step, surfacing the result to the model. Round-internal completions\n // are folded into the round's returned parts and don't fire here.\n this.#tasks.on(\"task-done\", ({ task }) => {\n this.send(taskCompletionMessage(task))\n })\n // Heartbeats keep the agent loop alive while long-running tasks are\n // in flight. Each pulse injects a small system note listing what's\n // still going. Tasks with incremental output ready to read get a\n // `*new*` marker so the model knows to call `task_poll` if it cares.\n this.#tasks.on(\"heartbeat\", ({ running }) => {\n this.send({\n content: [{ content: [taskInfoPart(running)], tag: \"heartbeat\", type: \"meta\" }],\n role: \"system\",\n })\n })\n\n this.#stopPolicy = new StopPolicy(opts.stop)\n this.#stopPolicy.attach(this)\n this.onEmitError = (error) => opts.logger?.child(\"events\").error(error)\n this.#ctx.attach(this)\n\n // Seed usage\n this.#usage = new TokenUsage(this.messages)\n this.#ctx.on(\"session\", () => this.reset())\n }\n\n async reset(): Promise<void> {\n this.stop({ abort: true, reason: \"reset\" })\n await this.waitIdle()\n await this.#tasks.killAll()\n this.#cancelAllWakeups()\n this.#usage = new TokenUsage(this.messages)\n this.#stopPolicy.reset({ keepUsage: false })\n this.#injectQueue = []\n this.#appendQueue = []\n this.#notifyQueue = []\n this.#wakeups.clear()\n this.#stop(\"natural\")\n }\n\n /** Spawn a child agent that inherits this agent's runtime defaults —\n * cwd, model, permissions, full effective tool list (user tools +\n * the loaded skill tool), `depth + 1`, and `maxDepth`. Pass\n * `overrides` to specialize: typical ones are `prompt` (the child\n * has its own role), `session` (the child writes to its own JSONL),\n * and `tools` (curated subset).\n *\n * Used by the `subagent` tool for delegation; equally useful for\n * ad-hoc parallel-agent patterns (multiple children working on\n * pieces of a task in parallel).\n *\n * Depth cap: when the child would be at `maxDepth`, the `subagent`\n * tool is filtered out of its inherited tool list so recursion\n * bottoms out cleanly. The model just doesn't see the tool — no\n * error path. */\n async child(overrides: Partial<AgentOptions> = {}): Promise<Agent> {\n const childDepth = overrides.depth ?? this.depth + 1\n // Inherit the *effective* step tool list (includes the loaded\n // `skill` tool). The child opts out of its own skill scan since\n // the catalog is shared.\n\n let tools = [...this.tools].filter((t) => t.name !== \"skill\")\n if (childDepth >= this.maxDepth) tools = tools.filter((t) => t.name !== \"subagent\")\n const { createAgent } = await import(\"./ctx.ts\")\n\n const ret = await createAgent({\n cwd: this.cwd,\n depth: childDepth,\n mask: this.#opts.mask,\n maxDepth: this.maxDepth,\n model: this.model,\n // Inherit the parent's `notify` setting so test roots that\n // disable the notifier (`notify: false`) propagate that to\n // children — otherwise spawning a child would silently re-enable\n // session-started / time / etc. injections that the harness\n // explicitly opted out of.\n notify: this.#opts.notify,\n permissions: await this.ctx.permissions(),\n skills: this.#ctx.skills, // shared catalog; child doesn't reload\n // Propagate the swarm so the child + every grandchild address\n // each other through the same registry. Override-able via\n // `overrides.swarm` if a caller wants the child outside the\n // tree (rare).\n swarm: await this.#ctx.swarm(),\n tools,\n ...overrides,\n })\n ret.#parent = this\n // Children are spawned ready — subagent dispatch typically calls\n // `.send()` immediately after, and inspecting `child.tools` /\n // `child.prompt` before sending should just work.\n await ret.start()\n return ret\n }\n\n // ── Read ──────────────────────────────────────────────────────────────\n\n /** Active conversation — delegates to the underlying `Session`. */\n get messages(): readonly Message[] {\n return this.session.messages\n }\n\n get status(): AgentStatus {\n return this.#status\n }\n\n get cwd(): string {\n return this.#ctx.cwd\n }\n\n get model(): Model | undefined {\n return this.#ctx.model\n }\n\n get session(): Session {\n return this.#ctx.session\n }\n\n get signal(): AbortSignal | undefined {\n return this.#abortController?.signal\n }\n\n /** Token usage from the most recent step's response. Drives\n * `contextSize` and any \"this turn used N tokens\" UI. */\n get usage(): TokenUsage {\n return this.#usage\n }\n\n /** Cumulative token usage across every step in the current run.\n * Useful for billing-style displays. */\n get totalUsage(): TokenCount {\n return this.#usage.total\n }\n /** Logical size of the current conversation in tokens — what the\n * next request will send as input. Equals the last step's\n * `input + output` (since the model's reply becomes part of the\n * next prompt). Returns 0 before any step has run. */\n get contextSize(): number {\n return this.#usage.contextSize\n }\n\n get pressure(): ContextPressure {\n const used = this.contextSize\n const limit = this.model?.spec.contextSize ?? 0\n const ratio = limit > 0 ? used / limit : 0\n const level = PRESSURE_LEVELS.findLast((t) => ratio >= t) ?? 0\n return { level, limit, ratio, used }\n }\n\n get lastStop(): AgentStop | undefined {\n return this.#lastStop\n }\n\n get steps(): number {\n return this.#stopPolicy.steps\n }\n\n get parent(): Agent | undefined {\n return this.#parent\n }\n\n get tools() {\n return this.#ctx.tools\n }\n\n get prompt() {\n return this.#ctx.prompt\n }\n\n get ctx(): AgentContext {\n return this.#ctx\n }\n\n /** Long-running task registry — exposed for the TUI / introspection\n * tools (`task_list`, etc.). Mutating directly is a foot-gun;\n * prefer the agent's higher-level surface. */\n get tasks(): Tasks {\n return this.#tasks\n }\n\n // ── Input ────────────────────────────────────────────────────────────\n\n #enqueue(message: Message | Message[], opts: { mode?: SendMode } = {}): void {\n const messages = Array.isArray(message) ? message : [message]\n if (!messages.length) return\n for (const m of messages) m.id ??= uuidv7()\n const queue = opts.mode === \"append\" ? this.#appendQueue : this.#injectQueue\n queue.push(...messages)\n void this.emit(\"pending\", { messages })\n }\n\n /** Append a message and (re)start the loop. The user spoke; the agent\n * responds. If a loop is currently running, the message lands on the\n * follow-up queue and is processed after the current turn naturally\n * stops. Otherwise the loop starts immediately. */\n send(message?: Message | Message[], opts: { mode?: SendMode; run?: boolean } = {}): void {\n this.#enqueue(message ?? [], opts)\n if (opts.run === false) return\n if (this.#status === \"idle\" || this.#status === \"paused\") void this.run()\n }\n\n async useTool<T extends Tool = Tool>(\n name: T[\"name\"],\n params: ParamsOf<T>,\n msg: string,\n opts: { hidden?: boolean } = {}\n ): Promise<{\n call: ToolCallPart<T[\"name\"], ParamsOf<T>>\n result: ToolResult<MetaOf<T>>\n messages: [Message<\"system\">, Message<\"assistant\">, Message<\"tool\">]\n }> {\n const tool = this.tools.find((t) => t.name === name) as T | undefined\n if (!tool) throw new Error(`cannot inject tool use: no tool named \"${name}\"`)\n\n const id = uuidv7()\n const call: ToolCallPart = { id, name, params, type: \"tool-call\" }\n const result = await runTool(tool, params, await this.#toolContext(), { preflight: false })\n const messages: [Message<\"system\">, Message<\"assistant\">, Message<\"tool\">] = [\n {\n content: [\n {\n content: msg,\n data: { tool: name },\n tag: \"user-tool-use\",\n type: \"meta\",\n },\n ],\n role: \"system\",\n },\n {\n content: [call],\n role: \"assistant\",\n },\n {\n content: [\n {\n content: result.content,\n error: result.error,\n id,\n isError: result.isError,\n meta: result.meta,\n name,\n type: \"tool-result\",\n },\n ],\n role: \"tool\",\n },\n ]\n\n if (opts.hidden) for (const m of messages) m.hidden = true\n\n return { call, messages, result: result as ToolResult<MetaOf<T>> }\n }\n\n notify(type: string, data: Content | Record<string, unknown>): void {\n const meta: MetaPart =\n typeof data === \"string\" || Array.isArray(data)\n ? { content: data, tag: type, type: \"meta\" }\n : { data, tag: type, type: \"meta\" }\n this.#notifyQueue.push(meta)\n }\n\n /** Schedule a one-shot wake-up at `delayMs` from now. The agent will\n * receive a system message at that time IF nothing else has woken\n * the loop in the meantime — task-done injects, heartbeats, and user\n * messages all auto-cancel pending wakeups (their job was to ensure\n * the agent gets a turn; if it's already getting one, the timer is\n * redundant).\n *\n * Cancelled wakeups don't silently disappear — their `hint`s, if any,\n * are folded into a system message that lands in the next step\n * alongside whatever woke the loop. The model sees the hints with a\n * `status=\"cancelled\"` marker so it knows the timer didn't fire.\n *\n * Returns the wakeup id (mostly for telemetry / TUI display — the\n * model can't usefully cancel it later, since by the time it has a\n * turn to call cancel, the wakeup has either fired or been cancelled\n * for it). */\n scheduleWakeup(opts: { delayMs: number; hint?: string }): string {\n const id = uuidv7()\n const timer = setTimeout(() => {\n this.#wakeups.delete(id)\n this.send({\n content: [{ data: { hint: opts.hint, id }, tag: \"wakeup\", type: \"meta\" }],\n role: \"system\",\n })\n }, opts.delayMs)\n timer.unref()\n this.#wakeups.set(id, { hint: opts.hint, timer })\n return id\n }\n\n /** Cancel all pending wakeups, surfacing their hints as a single\n * system message so the model can see what was queued. Called from\n * `#setStatus` whenever the agent transitions to `streaming` — that's\n * the unambiguous \"loop is active\" signal. */\n #cancelAllWakeups(): void {\n if (this.#wakeups.size === 0) return\n const carried: { id: string; hint: string }[] = []\n for (const [id, { hint, timer }] of this.#wakeups) {\n clearTimeout(timer)\n if (hint) carried.push({ hint, id })\n }\n this.#wakeups.clear()\n if (carried.length > 0) {\n const parts: MetaPart[] = carried.map((c) => ({\n data: { hint: c.hint, id: c.id, status: \"cancelled\" as const },\n tag: \"wakeup\",\n type: \"meta\",\n }))\n this.#injectQueue.push({ content: parts, role: \"system\" })\n }\n }\n\n // ── Loop control ─────────────────────────────────────────────────────\n\n /** Drive steps until the agent goes idle (no queued messages and\n * the model stopped naturally) or hits a non-recoverable stop.\n * Doubles as a resume from `paused` — drains queued messages and\n * picks the loop back up. If a run is already in flight, returns\n * the existing promise. */\n run(): Promise<AgentStopKind> {\n if (this.#running) return this.#running\n this.#pauseRequested = undefined\n this.#abortController = undefined\n this.#running = this.#loop()\n .catch((error) => {\n this.#opts.logger?.child(\"run\").error(error)\n return this.#stop(\n error instanceof Error && error.name === \"AbortError\" ? \"aborted\" : \"error\",\n error\n )\n })\n .finally(() => {\n this.#abortController = undefined\n this.#running = undefined\n })\n return this.#running\n }\n\n async #collect() {\n this.#abortController = new AbortController()\n const context = {\n cacheKey: this.ctx.session.id,\n messages: [...this.ctx.messages],\n prompt: this.prompt,\n tools: this.tools,\n } satisfies Context\n await this.emitSerial(\"context\", context)\n const model = this.model\n if (!model) throw new Error(\"model must be loaded to collect\")\n return model.stream(context, this.#streamOpts())\n }\n\n #shouldAutoCompact(): boolean {\n const opts = toValue(this.#opts.compaction)\n const auto = opts?.enabled ?? true\n if (!auto) return false\n const threshold = opts?.threshold ?? 0.95\n return this.pressure.ratio >= threshold\n }\n\n #streamOpts(): ModelStreamOptions {\n const base = this.#opts.request ?? {}\n return {\n ...base,\n onEvent: (event) => {\n void this.emit(\"stream-event\", { event })\n try {\n void this.#opts.onEvent?.(event)\n } catch (error) {\n this.#opts.logger?.child(\"stream\").error(error)\n }\n },\n onUpdate: this.#opts.onUpdate,\n reasoning: { ...base.reasoning, effort: this.#ctx.reasoning },\n signal: this.#abortController?.signal,\n }\n }\n\n /** Run exactly one step. Useful for tests and custom drivers\n * that want to interleave logic between steps. */\n async step(): Promise<StepResult> {\n if (this.#shouldAutoCompact()) await this.compact()\n // Drain the notify queue into the inject queue as a single system message\n if (this.#notifyQueue.length > 0) {\n this.#injectQueue.push({\n content: this.#notifyQueue.splice(0),\n role: \"system\",\n })\n }\n\n // Drain the send queue (user-submitted via `send()`) and the inject\n // queue (notifier / wakeup / hooks). Sequential await preserves\n // chronological order on the session.\n for (const m of this.#injectQueue.splice(0)) await this.session.add(m)\n for (const m of this.#appendQueue.splice(0)) await this.session.add(m)\n\n this.#setStatus(\"streaming\")\n\n let collected: AssistantMessage\n\n try {\n collected = await this.#collect()\n } catch (error) {\n const err = toError(error)\n const overflow = isContextOverflow({ message: err.message })\n if (overflow) this.#opts.logger?.warn(\"Context overflow detected:\", err)\n return {\n error: err,\n finishReason: overflow ? \"length\" : \"error\",\n kind: overflow ? \"context-overflow\" : \"error\",\n usage: { input: 0, output: 0 },\n }\n }\n\n this.#usage.add(collected.meta.usage)\n\n const result: Omit<StepResult, \"kind\"> = {\n finishReason: collected.meta.finishReason,\n message: collected,\n usage: collected.meta.usage,\n }\n\n // Silent-overflow check BEFORE committing the message — gives the\n // session a chance to drop it and retry on a compacted history.\n if (\n this.#opts.contextLimit !== undefined &&\n isContextOverflow({\n contextLimit: this.#opts.contextLimit,\n // Total prompt size = uncached input + cached reads + cached\n // writes. `usage.input` is uncached-only; the cache fields are\n // separate billing tiers that still occupy the context window.\n usageInput:\n result.usage.input + (result.usage.cacheRead ?? 0) + (result.usage.cacheWrite ?? 0),\n })\n )\n return { kind: \"context-overflow\", ...result }\n\n const calls = await this.#parseToolCalls(collected)\n await this.session.add(collected)\n\n if (calls.length === 0) return { kind: \"natural\", ...result }\n\n return {\n kind: \"tool-calls\",\n toolMessage: await this.#runTools(calls),\n ...result,\n }\n }\n\n async #parseToolCalls(message: Message): Promise<ToolCallPart[]> {\n if (typeof message.content === \"string\") return []\n const calls = message.content.filter((p): p is ToolCallPart => p.type === \"tool-call\")\n for (const call of calls) {\n const tool = this.tools.find((t) => t.name === call.name)\n if (!tool) continue\n try {\n call.params = (await tool.validator.cleanParams(call.params)) ?? call.params\n } catch {}\n }\n return calls\n }\n\n async compact(): Promise<void> {\n const prev = this.#status\n const pressure = this.pressure\n this.#setStatus(\"compacting\")\n this.#usage.resetLast()\n try {\n const { Compaction } = await import(\"./compaction/compactions.ts\")\n const opts: Partial<CompactionOptions> = {\n ...toValue(this.#opts.compaction),\n signal: this.#abortController?.signal,\n }\n const compactor = new Compaction(this, opts)\n await compactor.compact(pressure)\n } finally {\n this.#setStatus(prev)\n }\n }\n\n async #runTools(calls: ToolCallPart[]) {\n this.#setStatus(\"running-tools\")\n void this.emit(\"tool-calls\", { calls })\n for (const call of calls) void this.emit(\"tool-call\", { call })\n\n const emitted = new Set<string>()\n // The whole batch — including streamable promotion, parallel chains,\n // grace timing, and ownerRound suppression — lives in Tasks.run().\n // What lands back here is a 1:1 array of result parts ready to commit.\n // The skill tool (when active) is passed via `extraTools` so dispatch\n // can resolve `name: \"skill\"` calls without polluting `tasks.tools`.\n const resultParts = await this.#tasks.run(calls, await this.#toolContext(), {\n onResult: (call, result) => {\n emitted.add(call.id)\n void this.emit(\"tool-result\", { call, result })\n },\n })\n\n for (let i = 0; i < calls.length; i++) {\n const call = calls[i]\n const part = resultParts[i]\n if (emitted.has(call.id)) continue\n void this.emit(\"tool-result\", {\n call,\n result: {\n content: part.content,\n error: part.error,\n isError: part.isError ?? false,\n meta: part.meta,\n },\n })\n }\n const message: Message<\"tool\"> = { content: resultParts, role: \"tool\" }\n await this.session.add(message)\n return message\n }\n\n /** Resolve when the agent is in a quiescent state — `idle` or\n * `paused`. If a run is currently in flight (or was just kicked off\n * synchronously by `send` / `inject` / a wakeup), waits for it to\n * settle before returning the final status. If no run is in flight,\n * resolves immediately with the current status.\n *\n * Use this in REPL-style drivers to await the loop without racing\n * with internally-triggered runs (the wakeup timer, heartbeat, or\n * task-completion injects all spawn `void this.run()` independently\n * of caller-driven `await agent.run()`). The `#running` promise is\n * set synchronously inside `run()` before any await point, so this\n * catches every kicked-off cycle including the one `send` just fired.\n *\n * Errors from the loop are swallowed — callers read `agent.lastError`\n * / `agent.lastStopReason` for diagnostics. The point of `waitIdle`\n * is just to know \"the loop is no longer driving.\" */\n async waitIdle(timeout?: number): Promise<AgentStatus> {\n if (!this.#running) return this.#status\n const wait = [this.#running.catch(() => undefined)]\n if (timeout !== undefined) wait.push(new Promise((resolve) => setTimeout(resolve, timeout)))\n await Promise.race(wait)\n return this.#status\n }\n\n /** Stop the loop with a custom reason.\n * When `abort: true` (the default), also trigger the abort signal so any\n * in-flight stream or tool calls can react to the stop.\n * When `abort: false`, the agent still stops immediately, but any active\n * stream or tool calls are left to run to completion */\n stop(opts: { abort?: boolean; reason?: string } = {}): void {\n this.#pauseRequested ??= opts.reason ?? \"stop\"\n if (opts.abort ?? true) this.#abortController?.abort(opts.reason)\n }\n\n async start() {\n if (this.#started) return\n this.#started = true\n await this.emit(\"start\")\n }\n\n get started() {\n return this.#started\n }\n\n // ── Internals ────────────────────────────────────────────────────────\n\n async #turn(): Promise<TurnResult> {\n for (let step = 1; ; step++) {\n if (this.#abortController?.signal.aborted)\n return { kind: \"aborted\", reason: this.#abortController.signal.reason }\n if (this.#pauseRequested !== undefined)\n return { kind: \"paused\", reason: this.#pauseRequested }\n\n void this.emit(\"step-start\", { step })\n const outcome = await this.step()\n void this.emit(\"step-end\", { outcome: outcome.kind, step })\n\n if (outcome.kind === \"error\") {\n return {\n kind: outcome.error?.name === \"AbortError\" ? \"aborted\" : \"error\",\n reason: outcome.error,\n }\n }\n\n if (outcome.kind === \"natural\") {\n return { kind: \"natural\" }\n }\n\n if (outcome.kind === \"context-overflow\") {\n // Auto-compaction also gates the overflow recovery path. With\n // `auto: false`, overflow stops cleanly instead of attempting\n // a recovery the user explicitly opted out of.\n if (toValue(this.#opts.compaction)?.enabled === false) return { kind: \"context-overflow\" }\n // Compactor mutates the conversation; the rejected message is\n // not committed — next step retries on the compacted state.\n this.#opts.logger\n ?.child(\"compaction\")\n .warn(\n `context overflow detected (size ${this.contextSize}, limit ${this.pressure.limit}); running compaction`\n )\n await this.compact()\n continue\n }\n\n // outcome.kind === \"tool-calls\" — consult the policy.\n const stop = this.#stopPolicy.detect()\n if (stop) return { kind: stop }\n }\n }\n\n async #loop(): Promise<AgentStopKind> {\n if (!this.#started) await this.start()\n // Reset per-run counters (steps, consecutive errors, call history).\n // Token totals stay sticky across resets — they're billing-style\n // displays, not per-turn caps.\n this.#stopPolicy.reset()\n for (let turn = 1; ; turn++) {\n void this.emit(\"turn-start\", { turn })\n const result = await this.#turn()\n const reason = result.reason ? toError(result.reason).message : undefined\n void this.emit(\"turn-end\", { outcome: result.kind, reason, turn })\n\n if (result.kind === \"natural\") {\n // Drain follow-up queue if anything arrived during the turn.\n if (this.#appendQueue.length > 0) {\n for (const m of this.#appendQueue.splice(0)) await this.session.add(m)\n continue\n }\n // Wakeups (or any other inject) that fired while the agent was\n // streaming / running-tools land in `#injectQueue`. If we stop\n // here without giving them a turn, they get drained at the top\n // of the next unrelated user turn — surfacing the wakeup AFTER\n // the user's reply, with no `status=\"cancelled\"` marker since it\n // never went through `#cancelAllWakeups`. Continue the loop so\n // `step()` drains them next iteration.\n if (this.#injectQueue.length > 0) continue\n }\n return this.#stop(result.kind, result.reason)\n }\n }\n\n #stop(kind: AgentStopKind, reason?: unknown): AgentStopKind {\n this.#lastStop = {\n error: reason instanceof Error ? reason : undefined,\n kind,\n reason: reason === undefined ? undefined : toError(reason).message,\n }\n this.#setStatus(kind === \"natural\" ? \"idle\" : \"paused\")\n void this.emit(\"stop\", {\n status: this.#status,\n usage: this.usage,\n ...this.#lastStop,\n })\n return kind\n }\n\n /** Build the per-step `ToolContext` handed to each tool. The session\n * cwd, an abort signal scoped to the in-flight stream, and the\n * long-running spawn registry are all surfaced here. */\n async #toolContext(): Promise<ToolContext> {\n const masker = await this.#ctx.masker()\n return {\n agent: this,\n bash: this.#opts.bash,\n cwd: this.cwd,\n isMasked: (msgId: string, partIdx?: number) => masker?.isMasked(msgId, partIdx) ?? false,\n messages: this.session.messages,\n need: (scope, input) => this.#need(scope, input),\n perms: await this.ctx.permissions(),\n sessionDir: this.session.dir,\n signal: this.#abortController?.signal,\n swarm: () => this.#ctx.swarm(),\n tasks: this.#tasks,\n }\n }\n\n /** Implementation of `ctx.need(scope, input)`. Resolves on `allow`,\n * throws a `PERMISSION_DENIED` `AiError` on `deny`, and escalates\n * `ask` to `AgentOptions.allow` (treating it as `deny` when no\n * callback is configured). */\n async #need(scope: string, input: string): Promise<void> {\n const perms = await this.ctx.permissions()\n const r = perms.validate(scope, input)\n if (r.verdict === \"allow\") return\n if (r.verdict === \"ask\" && this.#opts.allow) {\n const ok = await this.#opts.allow({\n ask: r.ask,\n input,\n reason: r.reason,\n scope,\n suggestions: r.suggestions,\n })\n if (ok) return\n }\n throw new AiError({\n code: \"PERMISSION_DENIED\",\n data: { input, scope, suggestions: r.suggestions, verdict: r.verdict },\n message: r.reason,\n // `ask` verdicts that the user denied this turn are retryable —\n // they may add a rule later. Hard `deny` is not.\n retryable: r.verdict === \"ask\",\n })\n }\n\n /** Tear down session-scoped resources. Called on agent disposal — the\n * agent doesn't auto-dispose today, so callers (TUI on quit, headless\n * runner on completion) should invoke this explicitly. */\n async dispose(): Promise<void> {\n this.clearListeners()\n this.#cancelAllWakeups()\n await this.#tasks.killAll()\n }\n\n #setStatus(status: AgentStatus): void {\n const prev = this.#status\n if (prev === status) return\n // Cancel wakeups only when an EXTERNAL wake-up brings the loop back\n // to active (idle/paused → streaming). Mid-turn transitions\n // (running-tools → streaming) are the same turn continuing — a\n // wakeup the model just scheduled mid-tool-call would otherwise be\n // killed before it ever fires. The \"external wake-up\" cases that\n // *should* cancel: a `task-done` inject, a heartbeat, a user\n // message — all route through `inject` → `send` → `run` from the\n // idle/paused state, hitting this branch correctly.\n if (status === \"streaming\" && (prev === \"idle\" || prev === \"paused\")) {\n this.#cancelAllWakeups()\n }\n this.#status = status\n void this.emit(\"status\", { status })\n }\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"bash-COgq4W7U.mjs","names":[],"sources":["../src/tools/bash.ts"],"sourcesContent":["import type { MetaOf, MetaPart, Streamable, TextPart, ToolResult } from \"@zaly/ai\"\n\nimport { defineTool } from \"@zaly/ai\"\nimport { normPath, randomHash } from \"@zaly/shared\"\nimport { bufferedTailStream, Spawn, TextStream } from \"@zaly/shared/process\"\nimport { cleanTextTui } from \"@zaly/shared/text\"\nimport { tmpdir } from \"node:os\"\nimport { join } from \"pathe\"\nimport { Type } from \"typebox\"\nimport { truncate } from \"../utils/truncate.ts\"\n\nexport type BashTool = typeof bashTool\nexport type BashToolMeta = MetaOf<BashTool>\n\n/**\n * Run a bash command and capture its output.\n *\n * Lifecycle is fully owned by the Tasks harness:\n *\n * - The tool returns a `Streamable` immediately. Tasks races its `done`\n * against a grace window. Sub-grace commands appear synchronous to the\n * model; longer ones promote to a background task and the model gets\n * a partial snapshot now plus a system-message completion later.\n * - There's no blocking wait: a backgrounded command's result arrives\n * automatically as a `task-done` system message. `task_poll` peeks at\n * incremental output, `task_stop` aborts, and `wakeup` covers\n * poll-cadence re-checks. (No more bash_wait / bash_kill — the generic\n * surface covers it.)\n * - `timeout` is now a real kill deadline. The Spawn aborts itself when\n * it elapses; the streamable's `done` resolves with `killReason: \"timeout\"`\n * in the snapshot. Defaults to 10 minutes (long enough for builds, tests,\n * installs); pass shorter for tighter deadlines.\n *\n * Output truncation — large outputs are summarised inline as head + tail\n * (split from `max_lines`). Only when truncation actually fires does\n * the tool flush the captured bytes to a per-spawn log file under\n * `tmpdir()/zaly-bash/` and surface `truncated.fullOutputPath`; small\n * outputs that fit inline never touch disk. The model can `read({ path })`\n * the surfaced log to inspect the full bytes.\n *\n * Cancellation — `ctx.signal` (agent abort) propagates to the spawn.\n * `task_stop(id)` calls the streamable's `abort()`, which aborts the spawn.\n */\nconst DEFAULT_TIMEOUT_MS = 600_000 // 10 min — real kill deadline\nconst DEFAULT_MAX_BUFFER = 5 * 1024 * 1024 // 5 MB\n\n// oxlint-disable-next-line sort-keys -- semantic field order: name, desc, params, call\nexport const bashTool = defineTool({\n name: \"bash\",\n desc:\n \"Run a bash command. Returns its output once the command exits, or a \" +\n \"partial snapshot if the command is still running after the harness's \" +\n \"grace window — in that case the eventual result arrives as a system \" +\n \"message. Its result then arrives automatically when it finishes; use \" +\n \"`task_poll` to peek at output, `task_stop` to terminate one. `timeout` \" +\n \"is a real kill deadline.\",\n params: Type.Object({\n command: Type.String({ description: \"The shell command to run, evaluated by `bash -c`.\" }),\n description: Type.Optional(\n Type.String({\n description:\n \"Short, human-readable description of what this command does. \" +\n \"Shown to the user in the TUI alongside the command. Keep it under \" +\n \"~10 words. Don't restate the command itself — describe the intent \" +\n '(e.g. \"check the test suite passes\", not \"run bun test\").',\n })\n ),\n max_lines: Type.Optional(\n Type.Integer({\n default: 200,\n description:\n \"Cap on lines kept inline in the result. Split as head + tail \" +\n \"(half each). Lower for commands you only need pass/fail on \" +\n \"(`max_lines: 20`); raise when middle output matters. Output \" +\n \"above the cap is elided in the inline result, but the full \" +\n \"log is always written to disk and surfaced as \" +\n \"`truncated.fullOutputPath` — `read` it if you need to dig deeper.\",\n minimum: 10,\n })\n ),\n timeout: Type.Optional(\n Type.Integer({\n default: DEFAULT_TIMEOUT_MS,\n description:\n \"Kill deadline in ms. The process IS killed when this elapses (SIGTERM → SIGKILL).\",\n minimum: 1,\n })\n ),\n }),\n\n async preflight(args, ctx) {\n // Permission gate. The bash handler validates the parsed command\n // (segments, redirects, sensitive paths) and composes file-scope\n // checks for any redirect targets via `ctx.validate`.\n await ctx.need?.(\"bash\", args.command)\n },\n\n async call(args, ctx): Promise<Streamable> {\n const cwd = normPath(ctx.cwd)\n const timeout = args.timeout\n const startedAt = Date.now()\n\n // Buffer in memory; only flip to disk if a snapshot reports the\n // output exceeded the inline cap.\n const { stream, startTailing } = bufferedTailStream(new TextStream())\n const logState: { path?: string } = {}\n const logPath = (): string => {\n if (!logState.path) {\n logState.path = join(\n ctx.sessionDir ?? join(tmpdir(), \"zaly-bash\"),\n `bash-${randomHash()}.log`\n )\n startTailing(logState.path)\n }\n return logState.path\n }\n\n const proc = new Spawn(args.command, [], {\n bash: true,\n cwd,\n maxBuffer: DEFAULT_MAX_BUFFER,\n signal: ctx.signal,\n stderr: stream,\n stdout: stream,\n timeout,\n })\n\n const cursor = { combined: 0 }\n\n return {\n abort: () => {\n if (!proc.done) proc.abort({ delay: 5000 })\n },\n done: proc.result.then(\n () => undefined,\n () => undefined\n ),\n // Non-consuming check used by heartbeats: is there incremental\n // output the model hasn't seen since the last `poll()`? Lets the\n // heartbeat flag this task with `*new*` without advancing the\n // cursor (which would consume the bytes for any later poll).\n hasNew: () => proc.stdout.length > cursor.combined,\n poll: () => snapshot({ cursor, logPath, maxLines: args.max_lines ?? 200, proc, startedAt }),\n }\n },\n})\n\n// ── Internals ─────────────────────────────────────────────────────────\n\ninterface SnapshotOpts {\n proc: Spawn<string, string>\n startedAt: number\n /** Lazily allocate the log path on first call — flips\n * bufferedTailStream into tailing mode so subsequent chunks land on\n * disk too. Idempotent. */\n logPath: () => string\n cursor: { combined: number }\n maxLines: number\n}\n\n/** Build the current `ToolResult` snapshot for a running or exited bash\n * command. Slices incremental output since the last poll, summarises\n * it head+tail, and stamps a `<bash>` MetaPart with status info. */\nfunction snapshot({\n proc,\n startedAt,\n logPath,\n cursor,\n maxLines,\n}: SnapshotOpts): ToolResult & { running: boolean } {\n // Slice incremental combined output since the cursor and advance.\n let text = proc.stdout.slice(cursor.combined)\n cursor.combined += text.length // cursor is over bytes, not cleaned text\n\n // clean text, but keep styles. Styles are stripped in the provider\n // content transform pipelines\n text = cleanTextTui(text)\n\n const status: \"exited\" | \"running\" = proc.done ? \"exited\" : \"running\"\n const meta: Record<string, unknown> = {\n durationMs: Date.now() - startedAt,\n status,\n }\n if (status === \"exited\") {\n meta.code = proc.exitCode ?? -1\n if (proc.killReason) meta.killReason = proc.killReason\n }\n\n const summary = truncate(text, { maxLines, strategy: \"head+tail\" })\n if (summary.truncated) {\n const log = logPath()\n meta.truncated = {\n fullOutputPath: log,\n totalLines: summary.origLines,\n }\n }\n\n const parts: (MetaPart | TextPart)[] = [{ data: meta, tag: \"bash\", type: \"meta\" }]\n if (summary.text !== \"\") parts.push({ text: summary.text, type: \"text\" })\n\n return {\n content: parts,\n isError: false,\n running: !proc.done,\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2CA,MAAM,qBAAqB;AAC3B,MAAM,qBAAqB;AAG3B,MAAa,WAAW,WAAW;CACjC,MAAM;CACN,MACE;CAMF,QAAQ,KAAK,OAAO;EAClB,SAAS,KAAK,OAAO,EAAE,aAAa,oDAAoD,CAAC;EACzF,aAAa,KAAK,SAChB,KAAK,OAAO,EACV,aACE,iQAIJ,CAAC,CACH;EACA,WAAW,KAAK,SACd,KAAK,QAAQ;GACX,SAAS;GACT,aACE;GAMF,SAAS;EACX,CAAC,CACH;EACA,SAAS,KAAK,SACZ,KAAK,QAAQ;GACX,SAAS;GACT,aACE;GACF,SAAS;EACX,CAAC,CACH;CACF,CAAC;CAED,MAAM,UAAU,MAAM,KAAK;EAIzB,MAAM,IAAI,OAAO,QAAQ,KAAK,OAAO;CACvC;CAEA,MAAM,KAAK,MAAM,KAA0B;EACzC,MAAM,MAAM,SAAS,IAAI,GAAG;EAC5B,MAAM,UAAU,KAAK;EACrB,MAAM,YAAY,KAAK,IAAI;EAI3B,MAAM,EAAE,QAAQ,iBAAiB,mBAAmB,IAAI,WAAW,CAAC;EACpE,MAAM,WAA8B,CAAC;EACrC,MAAM,gBAAwB;GAC5B,IAAI,CAAC,SAAS,MAAM;IAClB,SAAS,OAAO,KACd,IAAI,cAAc,KAAK,OAAO,GAAG,WAAW,GAC5C,QAAQ,WAAW,EAAE,KACvB;IACA,aAAa,SAAS,IAAI;GAC5B;GACA,OAAO,SAAS;EAClB;EAEA,MAAM,OAAO,IAAI,MAAM,KAAK,SAAS,CAAC,GAAG;GACvC,MAAM;GACN;GACA,WAAW;GACX,QAAQ,IAAI;GACZ,QAAQ;GACR,QAAQ;GACR;EACF,CAAC;EAED,MAAM,SAAS,EAAE,UAAU,EAAE;EAE7B,OAAO;GACL,aAAa;IACX,IAAI,CAAC,KAAK,MAAM,KAAK,MAAM,EAAE,OAAO,IAAK,CAAC;GAC5C;GACA,MAAM,KAAK,OAAO,WACV,KAAA,SACA,KAAA,CACR;GAKA,cAAc,KAAK,OAAO,SAAS,OAAO;GAC1C,YAAY,SAAS;IAAE;IAAQ;IAAS,UAAU,KAAK,aAAa;IAAK;IAAM;GAAU,CAAC;EAC5F;CACF;AACF,CAAC;;;;AAkBD,SAAS,SAAS,EAChB,MACA,WACA,SACA,QACA,YACkD;CAElD,IAAI,OAAO,KAAK,OAAO,MAAM,OAAO,QAAQ;CAC5C,OAAO,YAAY,KAAK;CAIxB,OAAO,aAAa,IAAI;CAExB,MAAM,SAA+B,KAAK,OAAO,WAAW;CAC5D,MAAM,OAAgC;EACpC,YAAY,KAAK,IAAI,IAAI;EACzB;CACF;CACA,IAAI,WAAW,UAAU;EACvB,KAAK,OAAO,KAAK,YAAY;EAC7B,IAAI,KAAK,YAAY,KAAK,aAAa,KAAK;CAC9C;CAEA,MAAM,UAAU,SAAS,MAAM;EAAE;EAAU,UAAU;CAAY,CAAC;CAClE,IAAI,QAAQ,WAEV,KAAK,YAAY;EACf,gBAFU,QAEQ;EAClB,YAAY,QAAQ;CACtB;CAGF,MAAM,QAAiC,CAAC;EAAE,MAAM;EAAM,KAAK;EAAQ,MAAM;CAAO,CAAC;CACjF,IAAI,QAAQ,SAAS,IAAI,MAAM,KAAK;EAAE,MAAM,QAAQ;EAAM,MAAM;CAAO,CAAC;CAExE,OAAO;EACL,SAAS;EACT,SAAS;EACT,SAAS,CAAC,KAAK;CACjB;AACF"}
@@ -1,111 +0,0 @@
1
- import { defineTool, toAttachment } from "@zaly/ai";
2
- import { Type } from "typebox";
3
- //#region src/tools/fetch.ts
4
- const DEFAULT_MAX_BODY_BYTES = 262144;
5
- /**
6
- * Fetch a URL and return the response — JSON when the server speaks JSON,
7
- * raw text otherwise. Optional `jsonpath` filters the parsed JSON to a
8
- * subset, which keeps tokens down on chatty APIs.
9
- *
10
- * Scope: API endpoints. For HTML pages (browsing, content extraction),
11
- * the optional `@zaly/browser` package provides browser-backed tools that
12
- * return a structured a11y tree — much better than raw HTML through this
13
- * tool. Pointing this at an HTML URL works but the response is a string
14
- * blob the model has to slog through.
15
- *
16
- * Permissions: routes through the `fetch` scope when the agent wires up
17
- * tool-side permission checks. Until then, callers should restrict via
18
- * a wrapping permission layer (rule-based or explicit allowlist).
19
- */
20
- const fetchTool = defineTool({
21
- desc: "Fetch a URL and return the response. JSON responses are parsed; use `jsonpath` (e.g. `$.items[*].name`) to extract a subset and minimise tokens.Image & PDF are returned as attachments. Best for APIs — for web pages, use the browser tool.",
22
- name: "fetch",
23
- parallel: true,
24
- params: Type.Object({
25
- url: Type.String({ description: "Absolute URL." }),
26
- method: Type.Optional(Type.Union([
27
- Type.Literal("GET"),
28
- Type.Literal("POST"),
29
- Type.Literal("PUT"),
30
- Type.Literal("PATCH"),
31
- Type.Literal("DELETE")
32
- ], {
33
- default: "GET",
34
- description: "HTTP method."
35
- })),
36
- headers: Type.Optional(Type.Record(Type.String(), Type.String(), { description: "Request headers." })),
37
- query: Type.Optional(Type.Record(Type.String(), Type.String(), { description: "Query string params, appended to the URL." })),
38
- body: Type.Optional(Type.String({ description: "Request body as a string. For JSON, stringify it yourself and set `headers: { 'Content-Type': 'application/json' }`." })),
39
- jsonpath: Type.Optional(Type.String({ description: "JSONPath expression applied to a JSON response, e.g. `$.items[*].name`. Returns the matched values as an array." }))
40
- }),
41
- async call(args) {
42
- const t0 = Date.now();
43
- const url = new URL(args.url);
44
- if (args.query) for (const [k, v] of Object.entries(args.query)) url.searchParams.set(k, v);
45
- const res = await fetch(url, {
46
- body: args.body,
47
- headers: args.headers,
48
- method: args.method
49
- });
50
- const contentType = res.headers.get("content-type") ?? "";
51
- const bytes = new Uint8Array(await res.arrayBuffer());
52
- const meta = {
53
- contentType: contentType || void 0,
54
- durationMs: Date.now() - t0,
55
- ok: res.ok,
56
- status: res.status,
57
- statusText: res.statusText
58
- };
59
- const { fileDetect } = await import("@zaly/shared/detect");
60
- const file = await fileDetect({
61
- data: bytes,
62
- mime: contentType || void 0,
63
- url: url.toString()
64
- });
65
- if (file) {
66
- const att = await toAttachment(file);
67
- if (att) return [{
68
- data: meta,
69
- tag: "fetch",
70
- type: "meta"
71
- }, att];
72
- }
73
- const text = new TextDecoder().decode(bytes);
74
- const isJson = file?.type === "text" && file.format === "json";
75
- let body = text;
76
- if (isJson) try {
77
- body = JSON.parse(text);
78
- } catch {}
79
- if (args.jsonpath !== void 0 && body !== text) {
80
- const { JSONPath } = await import("./index-node-esm-CJsN8G51.mjs");
81
- body = JSONPath({
82
- json: body,
83
- path: args.jsonpath
84
- });
85
- }
86
- const bodyText = typeof body === "string" ? body : JSON.stringify(body, void 0, 2);
87
- const totalBytes = Buffer.byteLength(bodyText, "utf8");
88
- const truncated = totalBytes > DEFAULT_MAX_BODY_BYTES;
89
- const displayed = truncated ? bodyText.slice(0, DEFAULT_MAX_BODY_BYTES) : bodyText;
90
- if (truncated) meta.truncated = {
91
- bytes: totalBytes,
92
- hint: args.jsonpath === void 0 ? "body exceeded limit; pass `jsonpath` to filter, or use the browser tool for HTML." : "filtered body still exceeded limit; tighten the JSONPath expression.",
93
- limit: DEFAULT_MAX_BODY_BYTES
94
- };
95
- const parts = [{
96
- data: meta,
97
- tag: "fetch",
98
- type: "meta"
99
- }];
100
- if (displayed !== "") parts.push({
101
- format: isJson ? "json" : void 0,
102
- text: displayed,
103
- type: "text"
104
- });
105
- return parts;
106
- }
107
- });
108
- //#endregion
109
- export { fetchTool };
110
-
111
- //# sourceMappingURL=fetch-VKhSWdEh.mjs.map