@vibe-agent-toolkit/utils 0.1.39-rc.10 → 0.1.39-rc.11

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.
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Compute the SHA-256 hash of a file's raw bytes.
3
+ *
4
+ * Reads the file synchronously and returns the full lowercase hex digest (64
5
+ * characters). The hash is computed over the raw byte content, so it is stable
6
+ * across platforms for identical file content and changes whenever the content
7
+ * changes.
8
+ *
9
+ * @param path - Absolute (or relative) path to the file to hash.
10
+ * @returns Lowercase hex SHA-256 digest string (64 characters).
11
+ *
12
+ * @example
13
+ * const hash = fileContentHash('/path/to/file.txt');
14
+ * // '2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824'
15
+ */
16
+ export declare function fileContentHash(path: string): string;
17
+ //# sourceMappingURL=file-hash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-hash.d.ts","sourceRoot":"","sources":["../../src/fs/file-hash.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIpD"}
@@ -0,0 +1,23 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { readFileSync } from 'node:fs';
3
+ /**
4
+ * Compute the SHA-256 hash of a file's raw bytes.
5
+ *
6
+ * Reads the file synchronously and returns the full lowercase hex digest (64
7
+ * characters). The hash is computed over the raw byte content, so it is stable
8
+ * across platforms for identical file content and changes whenever the content
9
+ * changes.
10
+ *
11
+ * @param path - Absolute (or relative) path to the file to hash.
12
+ * @returns Lowercase hex SHA-256 digest string (64 characters).
13
+ *
14
+ * @example
15
+ * const hash = fileContentHash('/path/to/file.txt');
16
+ * // '2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824'
17
+ */
18
+ export function fileContentHash(path) {
19
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- path is caller-supplied; callers are responsible for path safety
20
+ const bytes = readFileSync(path);
21
+ return createHash('sha256').update(bytes).digest('hex');
22
+ }
23
+ //# sourceMappingURL=file-hash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-hash.js","sourceRoot":"","sources":["../../src/fs/file-hash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,uIAAuI;IACvI,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACjC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Pure string helpers for glob pattern analysis.
3
+ *
4
+ * No filesystem access. These are building blocks for higher-level glob
5
+ * expansion utilities. Glob patterns always use forward slashes by convention —
6
+ * this module treats `/` as the only path separator (never `\`).
7
+ *
8
+ * ### Escape semantics
9
+ * A backslash immediately preceding a metachar (`*`, `?`, `[`) neutralises it.
10
+ * Any other backslash is left as-is. The algorithm scans left-to-right and
11
+ * sets an `escaped` flag when it sees `\`; the *next* character is skipped for
12
+ * magic detection if `escaped` is true.
13
+ */
14
+ /**
15
+ * Returns `true` iff `source` contains at least one unescaped glob metachar
16
+ * (`*`, `?`, `[`). A backslash immediately before a metachar escapes it.
17
+ *
18
+ * @example
19
+ * isGlob('a/b/*.mjs') // true — unescaped *
20
+ * isGlob('packs/**\/*') // true — unescaped **
21
+ * isGlob('x?.txt') // true — unescaped ?
22
+ * isGlob('files[1].txt') // true — unescaped [
23
+ * isGlob('foo\\*.txt') // false — * is backslash-escaped
24
+ * isGlob('foo/bar.txt') // false — no metachar
25
+ */
26
+ export declare function isGlob(source: string): boolean;
27
+ /**
28
+ * The longest leading path prefix of `pattern` that contains no glob magic —
29
+ * i.e. the static directory base suitable as a `cwd` for a glob runner.
30
+ *
31
+ * Algorithm:
32
+ * 1. Split pattern on `/` (glob patterns always use forward slashes).
33
+ * 2. Accumulate segments until (and **excluding**) the first magic segment.
34
+ * 3. Join accumulated segments with `/`.
35
+ * 4. If the very first segment is magic → return `'.'`.
36
+ * 5. If NO segment is magic (not a glob at all) → return the whole pattern.
37
+ *
38
+ * Output always uses forward slashes (pure string ops, no `node:path`).
39
+ *
40
+ * @example
41
+ * staticGlobBase('modules/packs/**\/*') // 'modules/packs'
42
+ * staticGlobBase('a/b/*.mjs') // 'a/b'
43
+ * staticGlobBase('*.mjs') // '.'
44
+ * staticGlobBase('../mycli/dist/*.mjs') // '../mycli/dist'
45
+ * staticGlobBase('foo/bar.txt') // 'foo/bar.txt'
46
+ */
47
+ export declare function staticGlobBase(pattern: string): string;
48
+ /**
49
+ * The sub-pattern remaining after stripping the static base, with no leading
50
+ * `/`. This is the pattern to pass to a glob runner with `cwd` set to the base.
51
+ *
52
+ * Only meaningful when `isGlob(pattern)` is true — for a non-glob input the
53
+ * return value is `''` (the whole pattern was consumed as the base).
54
+ *
55
+ * @example
56
+ * globMagicRemainder('modules/packs/**\/*') // '**\/*'
57
+ * globMagicRemainder('a/b/*.mjs') // '*.mjs'
58
+ * globMagicRemainder('*.mjs') // '*.mjs'
59
+ * globMagicRemainder('../mycli/dist/*.mjs') // '*.mjs'
60
+ */
61
+ export declare function globMagicRemainder(pattern: string): string;
62
+ //# sourceMappingURL=glob-pattern.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glob-pattern.d.ts","sourceRoot":"","sources":["../../src/glob/glob-pattern.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAUH;;;;;;;;;;;GAWG;AACH,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAgB9C;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAsBtD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAY1D"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Pure string helpers for glob pattern analysis.
3
+ *
4
+ * No filesystem access. These are building blocks for higher-level glob
5
+ * expansion utilities. Glob patterns always use forward slashes by convention —
6
+ * this module treats `/` as the only path separator (never `\`).
7
+ *
8
+ * ### Escape semantics
9
+ * A backslash immediately preceding a metachar (`*`, `?`, `[`) neutralises it.
10
+ * Any other backslash is left as-is. The algorithm scans left-to-right and
11
+ * sets an `escaped` flag when it sees `\`; the *next* character is skipped for
12
+ * magic detection if `escaped` is true.
13
+ */
14
+ import { toForwardSlash } from '../path-utils.js';
15
+ /** The glob metacharacters recognised by this module. */
16
+ const MAGIC_CHARS = new Set(['*', '?', '[']);
17
+ /** Sentinel returned by {@link staticGlobBase} when the first segment is magic. */
18
+ const DOT = '.';
19
+ /**
20
+ * Returns `true` iff `source` contains at least one unescaped glob metachar
21
+ * (`*`, `?`, `[`). A backslash immediately before a metachar escapes it.
22
+ *
23
+ * @example
24
+ * isGlob('a/b/*.mjs') // true — unescaped *
25
+ * isGlob('packs/**\/*') // true — unescaped **
26
+ * isGlob('x?.txt') // true — unescaped ?
27
+ * isGlob('files[1].txt') // true — unescaped [
28
+ * isGlob('foo\\*.txt') // false — * is backslash-escaped
29
+ * isGlob('foo/bar.txt') // false — no metachar
30
+ */
31
+ export function isGlob(source) {
32
+ let escaped = false;
33
+ for (const ch of source) {
34
+ if (escaped) {
35
+ escaped = false;
36
+ continue;
37
+ }
38
+ if (ch === '\\') {
39
+ escaped = true;
40
+ continue;
41
+ }
42
+ if (MAGIC_CHARS.has(ch)) {
43
+ return true;
44
+ }
45
+ }
46
+ return false;
47
+ }
48
+ /**
49
+ * The longest leading path prefix of `pattern` that contains no glob magic —
50
+ * i.e. the static directory base suitable as a `cwd` for a glob runner.
51
+ *
52
+ * Algorithm:
53
+ * 1. Split pattern on `/` (glob patterns always use forward slashes).
54
+ * 2. Accumulate segments until (and **excluding**) the first magic segment.
55
+ * 3. Join accumulated segments with `/`.
56
+ * 4. If the very first segment is magic → return `'.'`.
57
+ * 5. If NO segment is magic (not a glob at all) → return the whole pattern.
58
+ *
59
+ * Output always uses forward slashes (pure string ops, no `node:path`).
60
+ *
61
+ * @example
62
+ * staticGlobBase('modules/packs/**\/*') // 'modules/packs'
63
+ * staticGlobBase('a/b/*.mjs') // 'a/b'
64
+ * staticGlobBase('*.mjs') // '.'
65
+ * staticGlobBase('../mycli/dist/*.mjs') // '../mycli/dist'
66
+ * staticGlobBase('foo/bar.txt') // 'foo/bar.txt'
67
+ */
68
+ export function staticGlobBase(pattern) {
69
+ // Glob patterns are always forward-slash; toForwardSlash() satisfies the
70
+ // no-hardcoded-path-split lint rule while being a no-op in practice.
71
+ const normalized = toForwardSlash(pattern);
72
+ const segments = normalized.split('/');
73
+ const staticSegments = [];
74
+ for (const segment of segments) {
75
+ if (isGlob(segment)) {
76
+ break;
77
+ }
78
+ staticSegments.push(segment);
79
+ }
80
+ if (staticSegments.length === 0) {
81
+ return DOT;
82
+ }
83
+ if (staticSegments.length === segments.length) {
84
+ // No magic found — return the whole (normalized) pattern unchanged.
85
+ return normalized;
86
+ }
87
+ return staticSegments.join('/');
88
+ }
89
+ /**
90
+ * The sub-pattern remaining after stripping the static base, with no leading
91
+ * `/`. This is the pattern to pass to a glob runner with `cwd` set to the base.
92
+ *
93
+ * Only meaningful when `isGlob(pattern)` is true — for a non-glob input the
94
+ * return value is `''` (the whole pattern was consumed as the base).
95
+ *
96
+ * @example
97
+ * globMagicRemainder('modules/packs/**\/*') // '**\/*'
98
+ * globMagicRemainder('a/b/*.mjs') // '*.mjs'
99
+ * globMagicRemainder('*.mjs') // '*.mjs'
100
+ * globMagicRemainder('../mycli/dist/*.mjs') // '*.mjs'
101
+ */
102
+ export function globMagicRemainder(pattern) {
103
+ const base = staticGlobBase(pattern);
104
+ if (base === DOT) {
105
+ // First segment was magic — the remainder is the full (forward-slash) pattern.
106
+ return toForwardSlash(pattern);
107
+ }
108
+ if (base === toForwardSlash(pattern)) {
109
+ // No magic at all — degenerate case: remainder is empty.
110
+ return '';
111
+ }
112
+ // Strip the base prefix and the trailing '/' separator.
113
+ return toForwardSlash(pattern).slice(base.length + 1);
114
+ }
115
+ //# sourceMappingURL=glob-pattern.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glob-pattern.js","sourceRoot":"","sources":["../../src/glob/glob-pattern.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,yDAAyD;AACzD,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AAE7C,mFAAmF;AACnF,MAAM,GAAG,GAAG,GAAG,CAAC;AAEhB;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,MAAM,CAAC,MAAc;IACnC,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,KAAK,MAAM,EAAE,IAAI,MAAM,EAAE,CAAC;QACxB,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,GAAG,KAAK,CAAC;YAChB,SAAS;QACX,CAAC;QACD,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;YAChB,OAAO,GAAG,IAAI,CAAC;YACf,SAAS;QACX,CAAC;QACD,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,yEAAyE;IACzE,qEAAqE;IACrE,MAAM,UAAU,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACvC,MAAM,cAAc,GAAa,EAAE,CAAC;IAEpC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YACpB,MAAM;QACR,CAAC;QACD,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAED,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,GAAG,CAAC;IACb,CAAC;IACD,IAAI,cAAc,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC9C,oEAAoE;QACpE,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,OAAO,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClC,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,MAAM,IAAI,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IACrC,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;QACjB,+EAA+E;QAC/E,OAAO,cAAc,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IACD,IAAI,IAAI,KAAK,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;QACrC,yDAAyD;QACzD,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,wDAAwD;IACxD,OAAO,cAAc,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACxD,CAAC"}
package/dist/index.d.ts CHANGED
@@ -24,4 +24,6 @@ export type { RewriteRule } from './link-auth/rewrite.js';
24
24
  export type { TokenSource } from './link-auth/resolve-token.js';
25
25
  export { expandMacro, UnknownMacroError } from './link-auth/expand-macro.js';
26
26
  export * from './skill-test/index.js';
27
+ export * from './glob/glob-pattern.js';
28
+ export * from './fs/file-hash.js';
27
29
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,cAAc,gBAAgB,CAAC;AAG/B,cAAc,iBAAiB,CAAC;AAGhC,cAAc,sBAAsB,CAAC;AAGrC,cAAc,eAAe,CAAC;AAG9B,cAAc,mBAAmB,CAAC;AAGlC,cAAc,wBAAwB,CAAC;AAGvC,cAAc,cAAc,CAAC;AAG7B,cAAc,gBAAgB,CAAC;AAI/B,cAAc,oBAAoB,CAAC;AAGnC,cAAc,kBAAkB,CAAC;AAGjC,cAAc,mBAAmB,CAAC;AAGlC,cAAc,wBAAwB,CAAC;AAGvC,cAAc,eAAe,CAAC;AAG9B,cAAc,oBAAoB,CAAC;AAInC,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,QAAQ,EACb,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,uBAAuB,EACvB,KAAK,cAAc,GACpB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AACpE,YAAY,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,YAAY,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAG7E,cAAc,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,cAAc,gBAAgB,CAAC;AAG/B,cAAc,iBAAiB,CAAC;AAGhC,cAAc,sBAAsB,CAAC;AAGrC,cAAc,eAAe,CAAC;AAG9B,cAAc,mBAAmB,CAAC;AAGlC,cAAc,wBAAwB,CAAC;AAGvC,cAAc,cAAc,CAAC;AAG7B,cAAc,gBAAgB,CAAC;AAI/B,cAAc,oBAAoB,CAAC;AAGnC,cAAc,kBAAkB,CAAC;AAGjC,cAAc,mBAAmB,CAAC;AAGlC,cAAc,wBAAwB,CAAC;AAGvC,cAAc,eAAe,CAAC;AAG9B,cAAc,oBAAoB,CAAC;AAInC,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,QAAQ,EACb,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,uBAAuB,EACvB,KAAK,cAAc,GACpB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AACpE,YAAY,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,YAAY,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAG7E,cAAc,uBAAuB,CAAC;AAGtC,cAAc,wBAAwB,CAAC;AAGvC,cAAc,mBAAmB,CAAC"}
package/dist/index.js CHANGED
@@ -39,4 +39,8 @@ export { resolveAuthenticatedUrl, } from './link-auth/resolve.js';
39
39
  export { expandMacro, UnknownMacroError } from './link-auth/expand-macro.js';
40
40
  // Skill testing utilities (environment management for headless agent runs)
41
41
  export * from './skill-test/index.js';
42
+ // Glob pattern helpers (isGlob, staticGlobBase, globMagicRemainder)
43
+ export * from './glob/glob-pattern.js';
44
+ // Filesystem hashing (sha256 of raw file bytes)
45
+ export * from './fs/file-hash.js';
42
46
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,8DAA8D;AAC9D,cAAc,gBAAgB,CAAC;AAE/B,gCAAgC;AAChC,cAAc,iBAAiB,CAAC;AAEhC,2DAA2D;AAC3D,cAAc,sBAAsB,CAAC;AAErC,uBAAuB;AACvB,cAAc,eAAe,CAAC;AAE9B,wCAAwC;AACxC,cAAc,mBAAmB,CAAC;AAElC,sBAAsB;AACtB,cAAc,wBAAwB,CAAC;AAEvC,uEAAuE;AACvE,cAAc,cAAc,CAAC;AAE7B,8CAA8C;AAC9C,cAAc,gBAAgB,CAAC;AAE/B,2DAA2D;AAC3D,iEAAiE;AACjE,cAAc,oBAAoB,CAAC;AAEnC,yDAAyD;AACzD,cAAc,kBAAkB,CAAC;AAEjC,oDAAoD;AACpD,cAAc,mBAAmB,CAAC;AAElC,4CAA4C;AAC5C,cAAc,wBAAwB,CAAC;AAEvC,2DAA2D;AAC3D,cAAc,eAAe,CAAC;AAE9B,oEAAoE;AACpE,cAAc,oBAAoB,CAAC;AAEnC,uDAAuD;AACvD,uEAAuE;AACvE,OAAO,EAKL,uBAAuB,GAExB,MAAM,wBAAwB,CAAC;AAIhC,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAE7E,2EAA2E;AAC3E,cAAc,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,8DAA8D;AAC9D,cAAc,gBAAgB,CAAC;AAE/B,gCAAgC;AAChC,cAAc,iBAAiB,CAAC;AAEhC,2DAA2D;AAC3D,cAAc,sBAAsB,CAAC;AAErC,uBAAuB;AACvB,cAAc,eAAe,CAAC;AAE9B,wCAAwC;AACxC,cAAc,mBAAmB,CAAC;AAElC,sBAAsB;AACtB,cAAc,wBAAwB,CAAC;AAEvC,uEAAuE;AACvE,cAAc,cAAc,CAAC;AAE7B,8CAA8C;AAC9C,cAAc,gBAAgB,CAAC;AAE/B,2DAA2D;AAC3D,iEAAiE;AACjE,cAAc,oBAAoB,CAAC;AAEnC,yDAAyD;AACzD,cAAc,kBAAkB,CAAC;AAEjC,oDAAoD;AACpD,cAAc,mBAAmB,CAAC;AAElC,4CAA4C;AAC5C,cAAc,wBAAwB,CAAC;AAEvC,2DAA2D;AAC3D,cAAc,eAAe,CAAC;AAE9B,oEAAoE;AACpE,cAAc,oBAAoB,CAAC;AAEnC,uDAAuD;AACvD,uEAAuE;AACvE,OAAO,EAKL,uBAAuB,GAExB,MAAM,wBAAwB,CAAC;AAIhC,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAE7E,2EAA2E;AAC3E,cAAc,uBAAuB,CAAC;AAEtC,oEAAoE;AACpE,cAAc,wBAAwB,CAAC;AAEvC,gDAAgD;AAChD,cAAc,mBAAmB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibe-agent-toolkit/utils",
3
- "version": "0.1.39-rc.10",
3
+ "version": "0.1.39-rc.11",
4
4
  "type": "module",
5
5
  "description": "Core utility functions with no external dependencies",
6
6
  "keywords": [