@happyvertical/smrt-core 0.40.46 → 0.40.48

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.
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "version": "1.0.0",
3
- "timestamp": 1785677910019,
3
+ "timestamp": 1785787485850,
4
4
  "packageName": "@happyvertical/smrt-core",
5
- "packageVersion": "0.40.46",
5
+ "packageVersion": "0.40.48",
6
6
  "objects": {
7
7
  "@happyvertical/smrt-core:SmrtClass": {
8
8
  "name": "smrtclass",
@@ -1,5 +1,5 @@
1
1
  import { balanced } from "../../../../../balanced-match@4.0.4/node_modules/balanced-match/dist/esm/index.js";
2
- //#region ../../node_modules/.pnpm/brace-expansion@5.0.8/node_modules/brace-expansion/dist/esm/index.js
2
+ //#region ../../node_modules/.pnpm/brace-expansion@5.0.9/node_modules/brace-expansion/dist/esm/index.js
3
3
  var escSlash = "\0SLASH" + Math.random() + "\0";
4
4
  var escOpen = "\0OPEN" + Math.random() + "\0";
5
5
  var escClose = "\0CLOSE" + Math.random() + "\0";
@@ -78,7 +78,7 @@ function combine(acc, pre, values, max, maxLength, dropEmpties) {
78
78
  }
79
79
  return out;
80
80
  }
81
- function expandSequence(body, isAlphaSequence, max) {
81
+ function expandSequence(body, isAlphaSequence, max, maxLength) {
82
82
  const n = body.split(/\.\./);
83
83
  const N = [];
84
84
  /* c8 ignore start */
@@ -94,6 +94,7 @@ function expandSequence(body, isAlphaSequence, max) {
94
94
  test = gte;
95
95
  }
96
96
  const pad = n.some(isPadded);
97
+ let length = 0;
97
98
  for (let i = x; test(i, y) && N.length < max; i += incr) {
98
99
  let c;
99
100
  if (isAlphaSequence) {
@@ -110,7 +111,9 @@ function expandSequence(body, isAlphaSequence, max) {
110
111
  }
111
112
  }
112
113
  }
114
+ if (length + c.length > maxLength) break;
113
115
  N.push(c);
116
+ length += c.length;
114
117
  }
115
118
  return N;
116
119
  }
@@ -146,7 +149,7 @@ function expand_(str, max, maxLength, isTop) {
146
149
  firstGroup = false;
147
150
  }
148
151
  let values;
149
- if (isSequence) values = expandSequence(m.body, isAlphaSequence, max);
152
+ if (isSequence) values = expandSequence(m.body, isAlphaSequence, max, maxLength);
150
153
  else {
151
154
  let n = parseCommaParts(m.body);
152
155
  if (n.length === 1 && n[0] !== void 0) {
@@ -159,8 +162,20 @@ function expand_(str, max, maxLength, isTop) {
159
162
  continue;
160
163
  }
161
164
  }
165
+ let dropsEmpties = dropEmpties && !m.post.length && !pre;
166
+ for (let d = 0; dropsEmpties && d < acc.length; d++) if (acc[d]) dropsEmpties = false;
162
167
  values = [];
163
- for (let j = 0; j < n.length; j++) values.push.apply(values, expand_(n[j], max, maxLength, false));
168
+ let valuesLength = 0;
169
+ outer: for (let j = 0; j < n.length; j++) {
170
+ const expanded = expand_(n[j], max, maxLength, false);
171
+ for (let k = 0; k < expanded.length; k++) {
172
+ const v = expanded[k];
173
+ if (dropsEmpties && !v) continue;
174
+ if (values.length >= max || valuesLength + v.length > maxLength) break outer;
175
+ values.push(v);
176
+ valuesLength += v.length;
177
+ }
178
+ }
164
179
  }
165
180
  acc = combine(acc, pre, values, max, maxLength, dropEmpties && !m.post.length);
166
181
  if (!m.post.length) break;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../../../../../../../node_modules/.pnpm/brace-expansion@5.0.9/node_modules/brace-expansion/dist/esm/index.js"],"sourcesContent":["import { balanced } from 'balanced-match';\nconst escSlash = '\\0SLASH' + Math.random() + '\\0';\nconst escOpen = '\\0OPEN' + Math.random() + '\\0';\nconst escClose = '\\0CLOSE' + Math.random() + '\\0';\nconst escComma = '\\0COMMA' + Math.random() + '\\0';\nconst escPeriod = '\\0PERIOD' + Math.random() + '\\0';\nconst escSlashPattern = new RegExp(escSlash, 'g');\nconst escOpenPattern = new RegExp(escOpen, 'g');\nconst escClosePattern = new RegExp(escClose, 'g');\nconst escCommaPattern = new RegExp(escComma, 'g');\nconst escPeriodPattern = new RegExp(escPeriod, 'g');\nconst slashPattern = /\\\\\\\\/g;\nconst openPattern = /\\\\{/g;\nconst closePattern = /\\\\}/g;\nconst commaPattern = /\\\\,/g;\nconst periodPattern = /\\\\\\./g;\nexport const EXPANSION_MAX = 100_000;\n// `EXPANSION_MAX` caps the *number* of expansions, but not their length. An\n// input like `'{a,b}'.repeat(1500)` stays under that count - its output is\n// truncated to 100k results - while making every result ~1500 characters\n// long. The result set, and the intermediate arrays built while combining\n// brace sets, then grow large enough to exhaust memory and crash the process\n// (CVE-2026-14257). `EXPANSION_MAX_LENGTH` bounds the total number of\n// characters the accumulator may hold at any point, so memory stays flat no\n// matter how many brace groups are chained. The limit sits well above any\n// realistic expansion (100k results hitting `EXPANSION_MAX` measure ~1M\n// characters) so legitimate input is unaffected.\nexport const EXPANSION_MAX_LENGTH = 4_000_000;\nfunction numeric(str) {\n return !isNaN(str) ? parseInt(str, 10) : str.charCodeAt(0);\n}\nfunction escapeBraces(str) {\n return str\n .replace(slashPattern, escSlash)\n .replace(openPattern, escOpen)\n .replace(closePattern, escClose)\n .replace(commaPattern, escComma)\n .replace(periodPattern, escPeriod);\n}\nfunction unescapeBraces(str) {\n return str\n .replace(escSlashPattern, '\\\\')\n .replace(escOpenPattern, '{')\n .replace(escClosePattern, '}')\n .replace(escCommaPattern, ',')\n .replace(escPeriodPattern, '.');\n}\n/**\n * Basically just str.split(\",\"), but handling cases\n * where we have nested braced sections, which should be\n * treated as individual members, like {a,{b,c},d}\n */\nfunction parseCommaParts(str) {\n if (!str) {\n return [''];\n }\n const parts = [];\n const m = balanced('{', '}', str);\n if (!m) {\n return str.split(',');\n }\n const { pre, body, post } = m;\n const p = pre.split(',');\n p[p.length - 1] += '{' + body + '}';\n const postParts = parseCommaParts(post);\n if (post.length) {\n ;\n p[p.length - 1] += postParts.shift();\n p.push.apply(p, postParts);\n }\n parts.push.apply(parts, p);\n return parts;\n}\nexport function expand(str, options = {}) {\n if (!str) {\n return [];\n }\n const { max = EXPANSION_MAX, maxLength = EXPANSION_MAX_LENGTH } = options;\n // I don't know why Bash 4.3 does this, but it does.\n // Anything starting with {} will have the first two bytes preserved\n // but *only* at the top level, so {},a}b will not expand to anything,\n // but a{},b}c will be expanded to [a}c,abc].\n // One could argue that this is a bug in Bash, but since the goal of\n // this module is to match Bash's rules, we escape a leading {}\n if (str.slice(0, 2) === '{}') {\n str = '\\\\{\\\\}' + str.slice(2);\n }\n return expand_(escapeBraces(str), max, maxLength, true).map(unescapeBraces);\n}\nfunction embrace(str) {\n return '{' + str + '}';\n}\nfunction isPadded(el) {\n return /^-?0\\d/.test(el);\n}\nfunction lte(i, y) {\n return i <= y;\n}\nfunction gte(i, y) {\n return i >= y;\n}\n// Build `{ acc[a] + pre + values[v] }` for every combination, capping the\n// number of results at `max` and the total number of characters at `maxLength`.\n// This is the one place output grows, so bounding it here keeps the single\n// accumulator - and therefore memory - flat regardless of how many brace groups\n// are combined (CVE-2026-14257).\nfunction combine(acc, pre, values, max, maxLength, dropEmpties) {\n const out = [];\n let length = 0;\n for (let a = 0; a < acc.length; a++) {\n for (let v = 0; v < values.length; v++) {\n if (out.length >= max)\n return out;\n const expansion = acc[a] + pre + values[v];\n // Bash drops empty results at the top level. Skip them before they count\n // against `max`, so `max` bounds the number of *kept* results.\n if (dropEmpties && !expansion)\n continue;\n if (length + expansion.length > maxLength)\n return out;\n out.push(expansion);\n length += expansion.length;\n }\n }\n return out;\n}\n// The expansion values of a single numeric (`1..5`) or alphabetic (`a..e..2`)\n// sequence body.\nfunction expandSequence(body, isAlphaSequence, max, maxLength) {\n const n = body.split(/\\.\\./);\n const N = [];\n // A sequence body always splits into two or three parts, but the compiler\n // can't know that.\n /* c8 ignore start */\n if (n[0] === undefined || n[1] === undefined) {\n return N;\n }\n /* c8 ignore stop */\n const x = numeric(n[0]);\n const y = numeric(n[1]);\n const width = Math.max(n[0].length, n[1].length);\n let incr = n.length === 3 && n[2] !== undefined ?\n Math.max(Math.abs(numeric(n[2])), 1)\n : 1;\n let test = lte;\n const reverse = y < x;\n if (reverse) {\n incr *= -1;\n test = gte;\n }\n const pad = n.some(isPadded);\n let length = 0;\n for (let i = x; test(i, y) && N.length < max; i += incr) {\n let c;\n if (isAlphaSequence) {\n c = String.fromCharCode(i);\n if (c === '\\\\') {\n c = '';\n }\n }\n else {\n c = String(i);\n if (pad) {\n const need = width - c.length;\n if (need > 0) {\n const z = new Array(need + 1).join('0');\n if (i < 0) {\n c = '-' + z + c.slice(1);\n }\n else {\n c = z + c;\n }\n }\n }\n }\n if (length + c.length > maxLength)\n break;\n N.push(c);\n length += c.length;\n }\n return N;\n}\nfunction expand_(str, max, maxLength, isTop) {\n // Consume the string's top-level brace groups left to right, threading a\n // running set of combined prefixes (`acc`). Expanding the tail iteratively -\n // rather than recursing on `m.post` once per group - keeps the native stack\n // depth constant, so deeply chained input (`'{a,b}'.repeat(3000)`) can no\n // longer overflow the stack, and leaves a single accumulator whose size\n // `maxLength` bounds directly (CVE-2026-14257).\n let acc = [''];\n // Bash drops empty results, but only when the *first* top-level group is a\n // comma set - a sequence like `{a..\\}` may legitimately yield ''. The drop\n // is on the final strings, so it is applied to whichever `combine` produces\n // them (the one with no brace set left in the tail).\n let dropEmpties = false;\n let firstGroup = true;\n for (;;) {\n const m = balanced('{', '}', str);\n // No brace set left: the rest of the string is literal.\n if (!m) {\n return combine(acc, str, [''], max, maxLength, dropEmpties);\n }\n // no need to expand pre, since it is guaranteed to be free of brace-sets\n const pre = m.pre;\n if (/\\$$/.test(pre)) {\n acc = combine(acc, pre + '{' + m.body + '}', [''], max, maxLength, dropEmpties && !m.post.length);\n firstGroup = false;\n if (!m.post.length)\n break;\n str = m.post;\n continue;\n }\n const isNumericSequence = /^-?\\d+\\.\\.-?\\d+(?:\\.\\.-?\\d+)?$/.test(m.body);\n const isAlphaSequence = /^[a-zA-Z]\\.\\.[a-zA-Z](?:\\.\\.-?\\d+)?$/.test(m.body);\n const isSequence = isNumericSequence || isAlphaSequence;\n const isOptions = m.body.indexOf(',') >= 0;\n if (!isSequence && !isOptions) {\n // {a},b}\n if (m.post.match(/,(?!,).*\\}/)) {\n str = m.pre + '{' + m.body + escClose + m.post;\n isTop = true;\n continue;\n }\n // Nothing here expands, so the whole remaining string is literal.\n return combine(acc, pre + '{' + m.body + '}' + m.post, [''], max, maxLength, dropEmpties);\n }\n if (firstGroup) {\n dropEmpties = isTop && !isSequence;\n firstGroup = false;\n }\n let values;\n if (isSequence) {\n values = expandSequence(m.body, isAlphaSequence, max, maxLength);\n }\n else {\n let n = parseCommaParts(m.body);\n if (n.length === 1 && n[0] !== undefined) {\n // x{{a,b}}y ==> x{a}y x{b}y\n n = expand_(n[0], max, maxLength, false).map(embrace);\n //XXX is this necessary? Can't seem to hit it in tests.\n /* c8 ignore start */\n if (n.length === 1) {\n acc = combine(acc, pre + n[0], [''], max, maxLength, dropEmpties && !m.post.length);\n if (!m.post.length)\n break;\n str = m.post;\n continue;\n }\n /* c8 ignore stop */\n }\n // Values that `combine` is going to drop as empty produce no result, so\n // they must not count against `max` - otherwise `{a,,b}` with `max: 2`\n // would stop at `['a', '']` and yield one result instead of two. Skipping\n // them outright keeps `values` bounded while leaving `max` a bound on\n // *kept* results.\n let dropsEmpties = dropEmpties && !m.post.length && !pre;\n for (let d = 0; dropsEmpties && d < acc.length; d++) {\n if (acc[d]) {\n dropsEmpties = false;\n }\n }\n values = [];\n let valuesLength = 0;\n outer: for (let j = 0; j < n.length; j++) {\n const expanded = expand_(n[j], max, maxLength, false);\n for (let k = 0; k < expanded.length; k++) {\n const v = expanded[k];\n if (dropsEmpties && !v)\n continue;\n if (values.length >= max || valuesLength + v.length > maxLength) {\n break outer;\n }\n values.push(v);\n valuesLength += v.length;\n }\n }\n }\n acc = combine(acc, pre, values, max, maxLength, dropEmpties && !m.post.length);\n if (!m.post.length)\n break;\n str = m.post;\n }\n return acc;\n}\n//# sourceMappingURL=index.js.map"],"x_google_ignoreList":[0],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { expand } from "../../../../../brace-expansion@5.0.8/node_modules/brace-expansion/dist/esm/index.js";
1
+ import { expand } from "../../../../../brace-expansion@5.0.9/node_modules/brace-expansion/dist/esm/index.js";
2
2
  import { assertValidPattern } from "./assert-valid-pattern.js";
3
3
  import { unescape } from "./unescape.js";
4
4
  import { AST } from "./ast.js";
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "generatedAt": "2026-08-02T13:38:27.994Z",
3
+ "generatedAt": "2026-08-03T20:04:41.689Z",
4
4
  "packageName": "@happyvertical/smrt-core",
5
- "packageVersion": "0.40.46",
5
+ "packageVersion": "0.40.48",
6
6
  "sourceManifestPath": "dist/manifest.json",
7
7
  "agentDocPath": "AGENTS.md",
8
8
  "sourceHashes": {
9
- "manifest": "06ca65eb70d384a95dd3695e74d0f76d6f9c4eed0afe9c22c37ccb3ff6ec0719",
10
- "packageJson": "40ddc80e308c0bac301eb0ba86b556890dcdeab0a09aab98cb75700c510d182b",
9
+ "manifest": "df78aabf6dbc46cb7d4689dc33704d947ae0cde29be5b6fc1e0bf7b04bfc892f",
10
+ "packageJson": "9944a769b6d3c3f1687aa7b127f01bfeb60ce02eedaafe9aa40e36a4ea18bf24",
11
11
  "agents": "ab30f2e4beb8d45e210d596794be5e7d93c99c21a517876f09d08d9a3b5f13df",
12
12
  "moduleDoc:agents/change-feed.md": "5278797d6c049ea21071b011182a9fcd79d17f9d74e0f90a93caa4c05c25294f",
13
13
  "moduleDoc:agents/change-signals.md": "d9cb6a5541728ffea46607a6b1d4fa61d4621849f2b4ea86a0645fbb0af892e9",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@happyvertical/smrt-core",
3
- "version": "0.40.46",
3
+ "version": "0.40.48",
4
4
  "description": "Core AI agent framework with standardized collections, object-relational mapping, and code generators",
5
5
  "author": "HappyVertical",
6
6
  "type": "module",
@@ -165,9 +165,9 @@
165
165
  "tsx": "^4.23.0",
166
166
  "typescript": "5.9.3",
167
167
  "yaml": "^2.9.0",
168
- "@happyvertical/smrt-config": "0.40.46",
169
- "@happyvertical/smrt-scanner": "0.40.46",
170
- "@happyvertical/smrt-types": "0.40.46"
168
+ "@happyvertical/smrt-config": "0.40.48",
169
+ "@happyvertical/smrt-scanner": "0.40.48",
170
+ "@happyvertical/smrt-types": "0.40.48"
171
171
  },
172
172
  "peerDependencies": {
173
173
  "@huggingface/transformers": ">=3.0.0 <4.0.0",
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../../../../../../../node_modules/.pnpm/brace-expansion@5.0.8/node_modules/brace-expansion/dist/esm/index.js"],"sourcesContent":["import { balanced } from 'balanced-match';\nconst escSlash = '\\0SLASH' + Math.random() + '\\0';\nconst escOpen = '\\0OPEN' + Math.random() + '\\0';\nconst escClose = '\\0CLOSE' + Math.random() + '\\0';\nconst escComma = '\\0COMMA' + Math.random() + '\\0';\nconst escPeriod = '\\0PERIOD' + Math.random() + '\\0';\nconst escSlashPattern = new RegExp(escSlash, 'g');\nconst escOpenPattern = new RegExp(escOpen, 'g');\nconst escClosePattern = new RegExp(escClose, 'g');\nconst escCommaPattern = new RegExp(escComma, 'g');\nconst escPeriodPattern = new RegExp(escPeriod, 'g');\nconst slashPattern = /\\\\\\\\/g;\nconst openPattern = /\\\\{/g;\nconst closePattern = /\\\\}/g;\nconst commaPattern = /\\\\,/g;\nconst periodPattern = /\\\\\\./g;\nexport const EXPANSION_MAX = 100_000;\n// `EXPANSION_MAX` caps the *number* of expansions, but not their length. An\n// input like `'{a,b}'.repeat(1500)` stays under that count - its output is\n// truncated to 100k results - while making every result ~1500 characters\n// long. The result set, and the intermediate arrays built while combining\n// brace sets, then grow large enough to exhaust memory and crash the process\n// (CVE-2026-14257). `EXPANSION_MAX_LENGTH` bounds the total number of\n// characters the accumulator may hold at any point, so memory stays flat no\n// matter how many brace groups are chained. The limit sits well above any\n// realistic expansion (100k results hitting `EXPANSION_MAX` measure ~1M\n// characters) so legitimate input is unaffected.\nexport const EXPANSION_MAX_LENGTH = 4_000_000;\nfunction numeric(str) {\n return !isNaN(str) ? parseInt(str, 10) : str.charCodeAt(0);\n}\nfunction escapeBraces(str) {\n return str\n .replace(slashPattern, escSlash)\n .replace(openPattern, escOpen)\n .replace(closePattern, escClose)\n .replace(commaPattern, escComma)\n .replace(periodPattern, escPeriod);\n}\nfunction unescapeBraces(str) {\n return str\n .replace(escSlashPattern, '\\\\')\n .replace(escOpenPattern, '{')\n .replace(escClosePattern, '}')\n .replace(escCommaPattern, ',')\n .replace(escPeriodPattern, '.');\n}\n/**\n * Basically just str.split(\",\"), but handling cases\n * where we have nested braced sections, which should be\n * treated as individual members, like {a,{b,c},d}\n */\nfunction parseCommaParts(str) {\n if (!str) {\n return [''];\n }\n const parts = [];\n const m = balanced('{', '}', str);\n if (!m) {\n return str.split(',');\n }\n const { pre, body, post } = m;\n const p = pre.split(',');\n p[p.length - 1] += '{' + body + '}';\n const postParts = parseCommaParts(post);\n if (post.length) {\n ;\n p[p.length - 1] += postParts.shift();\n p.push.apply(p, postParts);\n }\n parts.push.apply(parts, p);\n return parts;\n}\nexport function expand(str, options = {}) {\n if (!str) {\n return [];\n }\n const { max = EXPANSION_MAX, maxLength = EXPANSION_MAX_LENGTH } = options;\n // I don't know why Bash 4.3 does this, but it does.\n // Anything starting with {} will have the first two bytes preserved\n // but *only* at the top level, so {},a}b will not expand to anything,\n // but a{},b}c will be expanded to [a}c,abc].\n // One could argue that this is a bug in Bash, but since the goal of\n // this module is to match Bash's rules, we escape a leading {}\n if (str.slice(0, 2) === '{}') {\n str = '\\\\{\\\\}' + str.slice(2);\n }\n return expand_(escapeBraces(str), max, maxLength, true).map(unescapeBraces);\n}\nfunction embrace(str) {\n return '{' + str + '}';\n}\nfunction isPadded(el) {\n return /^-?0\\d/.test(el);\n}\nfunction lte(i, y) {\n return i <= y;\n}\nfunction gte(i, y) {\n return i >= y;\n}\n// Build `{ acc[a] + pre + values[v] }` for every combination, capping the\n// number of results at `max` and the total number of characters at `maxLength`.\n// This is the one place output grows, so bounding it here keeps the single\n// accumulator - and therefore memory - flat regardless of how many brace groups\n// are combined (CVE-2026-14257).\nfunction combine(acc, pre, values, max, maxLength, dropEmpties) {\n const out = [];\n let length = 0;\n for (let a = 0; a < acc.length; a++) {\n for (let v = 0; v < values.length; v++) {\n if (out.length >= max)\n return out;\n const expansion = acc[a] + pre + values[v];\n // Bash drops empty results at the top level. Skip them before they count\n // against `max`, so `max` bounds the number of *kept* results.\n if (dropEmpties && !expansion)\n continue;\n if (length + expansion.length > maxLength)\n return out;\n out.push(expansion);\n length += expansion.length;\n }\n }\n return out;\n}\n// The expansion values of a single numeric (`1..5`) or alphabetic (`a..e..2`)\n// sequence body.\nfunction expandSequence(body, isAlphaSequence, max) {\n const n = body.split(/\\.\\./);\n const N = [];\n // A sequence body always splits into two or three parts, but the compiler\n // can't know that.\n /* c8 ignore start */\n if (n[0] === undefined || n[1] === undefined) {\n return N;\n }\n /* c8 ignore stop */\n const x = numeric(n[0]);\n const y = numeric(n[1]);\n const width = Math.max(n[0].length, n[1].length);\n let incr = n.length === 3 && n[2] !== undefined ?\n Math.max(Math.abs(numeric(n[2])), 1)\n : 1;\n let test = lte;\n const reverse = y < x;\n if (reverse) {\n incr *= -1;\n test = gte;\n }\n const pad = n.some(isPadded);\n for (let i = x; test(i, y) && N.length < max; i += incr) {\n let c;\n if (isAlphaSequence) {\n c = String.fromCharCode(i);\n if (c === '\\\\') {\n c = '';\n }\n }\n else {\n c = String(i);\n if (pad) {\n const need = width - c.length;\n if (need > 0) {\n const z = new Array(need + 1).join('0');\n if (i < 0) {\n c = '-' + z + c.slice(1);\n }\n else {\n c = z + c;\n }\n }\n }\n }\n N.push(c);\n }\n return N;\n}\nfunction expand_(str, max, maxLength, isTop) {\n // Consume the string's top-level brace groups left to right, threading a\n // running set of combined prefixes (`acc`). Expanding the tail iteratively -\n // rather than recursing on `m.post` once per group - keeps the native stack\n // depth constant, so deeply chained input (`'{a,b}'.repeat(3000)`) can no\n // longer overflow the stack, and leaves a single accumulator whose size\n // `maxLength` bounds directly (CVE-2026-14257).\n let acc = [''];\n // Bash drops empty results, but only when the *first* top-level group is a\n // comma set - a sequence like `{a..\\}` may legitimately yield ''. The drop\n // is on the final strings, so it is applied to whichever `combine` produces\n // them (the one with no brace set left in the tail).\n let dropEmpties = false;\n let firstGroup = true;\n for (;;) {\n const m = balanced('{', '}', str);\n // No brace set left: the rest of the string is literal.\n if (!m) {\n return combine(acc, str, [''], max, maxLength, dropEmpties);\n }\n // no need to expand pre, since it is guaranteed to be free of brace-sets\n const pre = m.pre;\n if (/\\$$/.test(pre)) {\n acc = combine(acc, pre + '{' + m.body + '}', [''], max, maxLength, dropEmpties && !m.post.length);\n firstGroup = false;\n if (!m.post.length)\n break;\n str = m.post;\n continue;\n }\n const isNumericSequence = /^-?\\d+\\.\\.-?\\d+(?:\\.\\.-?\\d+)?$/.test(m.body);\n const isAlphaSequence = /^[a-zA-Z]\\.\\.[a-zA-Z](?:\\.\\.-?\\d+)?$/.test(m.body);\n const isSequence = isNumericSequence || isAlphaSequence;\n const isOptions = m.body.indexOf(',') >= 0;\n if (!isSequence && !isOptions) {\n // {a},b}\n if (m.post.match(/,(?!,).*\\}/)) {\n str = m.pre + '{' + m.body + escClose + m.post;\n isTop = true;\n continue;\n }\n // Nothing here expands, so the whole remaining string is literal.\n return combine(acc, pre + '{' + m.body + '}' + m.post, [''], max, maxLength, dropEmpties);\n }\n if (firstGroup) {\n dropEmpties = isTop && !isSequence;\n firstGroup = false;\n }\n let values;\n if (isSequence) {\n values = expandSequence(m.body, isAlphaSequence, max);\n }\n else {\n let n = parseCommaParts(m.body);\n if (n.length === 1 && n[0] !== undefined) {\n // x{{a,b}}y ==> x{a}y x{b}y\n n = expand_(n[0], max, maxLength, false).map(embrace);\n //XXX is this necessary? Can't seem to hit it in tests.\n /* c8 ignore start */\n if (n.length === 1) {\n acc = combine(acc, pre + n[0], [''], max, maxLength, dropEmpties && !m.post.length);\n if (!m.post.length)\n break;\n str = m.post;\n continue;\n }\n /* c8 ignore stop */\n }\n values = [];\n for (let j = 0; j < n.length; j++) {\n values.push.apply(values, expand_(n[j], max, maxLength, false));\n }\n }\n acc = combine(acc, pre, values, max, maxLength, dropEmpties && !m.post.length);\n if (!m.post.length)\n break;\n str = m.post;\n }\n return acc;\n}\n//# sourceMappingURL=index.js.map"],"x_google_ignoreList":[0],"mappings":"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"}