@vellumai/cli 0.8.12 → 0.9.0-dev.202606162156.4bad3e5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/bun.lock +49 -56
- package/node_modules/@vellumai/local-mode/src/__tests__/status.test.ts +224 -0
- package/node_modules/@vellumai/local-mode/src/__tests__/wake.test.ts +19 -0
- package/node_modules/@vellumai/local-mode/src/index.ts +8 -1
- package/node_modules/@vellumai/local-mode/src/lockfile-contract.test.ts +0 -15
- package/node_modules/@vellumai/local-mode/src/lockfile-contract.ts +8 -4
- package/node_modules/@vellumai/local-mode/src/sleep.ts +80 -0
- package/node_modules/@vellumai/local-mode/src/status.ts +342 -0
- package/node_modules/@vellumai/local-mode/src/wake.ts +12 -1
- package/package.json +3 -3
- package/src/__tests__/assistant-config.test.ts +1 -2
- package/src/__tests__/device-id.test.ts +6 -14
- package/src/__tests__/helpers/os-mock.ts +27 -0
- package/src/__tests__/login-loopback.test.ts +71 -0
- package/src/__tests__/multi-local.test.ts +2 -10
- package/src/__tests__/nginx-ingress-command.test.ts +69 -0
- package/src/__tests__/nginx-ingress.test.ts +403 -0
- package/src/__tests__/sleep.test.ts +4 -0
- package/src/__tests__/teleport.test.ts +6 -9
- package/src/__tests__/tunnel.test.ts +164 -0
- package/src/__tests__/wake.test.ts +15 -4
- package/src/__tests__/workos-pkce.test.ts +314 -0
- package/src/commands/flags.ts +1 -22
- package/src/commands/hatch.ts +90 -9
- package/src/commands/login.ts +123 -59
- package/src/commands/nginx-ingress.ts +291 -0
- package/src/commands/rollback.ts +0 -6
- package/src/commands/sleep.ts +17 -0
- package/src/commands/teleport.ts +23 -36
- package/src/commands/tunnel.ts +69 -11
- package/src/commands/upgrade.ts +0 -2
- package/src/commands/wake.ts +7 -5
- package/src/commands/workflows.ts +301 -0
- package/src/index.ts +8 -0
- package/src/lib/arg-utils.ts +48 -0
- package/src/lib/assistant-client.ts +2 -0
- package/src/lib/assistant-config.ts +0 -7
- package/src/lib/cloudflare-tunnel.ts +15 -2
- package/src/lib/docker.ts +103 -49
- package/src/lib/feature-flags.test.ts +157 -0
- package/src/lib/feature-flags.ts +38 -0
- package/src/lib/hatch-local.ts +0 -1
- package/src/lib/local.ts +5 -0
- package/src/lib/nginx-ingress.ts +576 -0
- package/src/lib/ngrok.ts +26 -4
- package/src/lib/platform-client.ts +0 -1
- package/src/lib/retire-local.ts +5 -0
- package/src/lib/statefulset.ts +73 -21
- package/src/lib/sync-cloud-assistants.ts +4 -17
- package/src/lib/upgrade-lifecycle.ts +1 -2
- package/src/lib/workos-pkce.ts +160 -0
package/README.md
CHANGED
|
@@ -4,7 +4,7 @@ CLI tools for provisioning and managing Vellum assistant instances.
|
|
|
4
4
|
|
|
5
5
|
## Installation
|
|
6
6
|
|
|
7
|
-
This package is used internally by the
|
|
7
|
+
This package is used internally by the `vel` CLI. You typically don't need to install it directly.
|
|
8
8
|
|
|
9
9
|
To run it standalone with [Bun](https://bun.sh):
|
|
10
10
|
|
package/bun.lock
CHANGED
|
@@ -11,7 +11,6 @@
|
|
|
11
11
|
"ink": "6.8.0",
|
|
12
12
|
"nanoid": "5.1.7",
|
|
13
13
|
"react": "19.2.4",
|
|
14
|
-
"react-devtools-core": "6.1.5",
|
|
15
14
|
},
|
|
16
15
|
"devDependencies": {
|
|
17
16
|
"@types/bun": "1.3.11",
|
|
@@ -27,35 +26,37 @@
|
|
|
27
26
|
"packages": {
|
|
28
27
|
"@alcalzone/ansi-tokenize": ["@alcalzone/ansi-tokenize@0.2.5", "", { "dependencies": { "ansi-styles": "^6.2.1", "is-fullwidth-code-point": "^5.0.0" } }, "sha512-3NX/MpTdroi0aKz134A6RC2Gb2iXVECN4QaAXnvCIxxIm3C3AVB1mkUe8NaaiyvOpDfsrqWhYtj+Q6a62RrTsw=="],
|
|
29
28
|
|
|
30
|
-
"@emnapi/core": ["@emnapi/core@1.
|
|
29
|
+
"@emnapi/core": ["@emnapi/core@1.10.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" } }, "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw=="],
|
|
31
30
|
|
|
32
|
-
"@emnapi/runtime": ["@emnapi/runtime@1.
|
|
31
|
+
"@emnapi/runtime": ["@emnapi/runtime@1.10.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA=="],
|
|
33
32
|
|
|
34
|
-
"@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.
|
|
33
|
+
"@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w=="],
|
|
35
34
|
|
|
36
35
|
"@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.1", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ=="],
|
|
37
36
|
|
|
38
37
|
"@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="],
|
|
39
38
|
|
|
40
|
-
"@eslint/config-array": ["@eslint/config-array@0.23.
|
|
39
|
+
"@eslint/config-array": ["@eslint/config-array@0.23.5", "", { "dependencies": { "@eslint/object-schema": "^3.0.5", "debug": "^4.3.1", "minimatch": "^10.2.4" } }, "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA=="],
|
|
41
40
|
|
|
42
|
-
"@eslint/config-helpers": ["@eslint/config-helpers@0.5.
|
|
41
|
+
"@eslint/config-helpers": ["@eslint/config-helpers@0.5.5", "", { "dependencies": { "@eslint/core": "^1.2.1" } }, "sha512-eIJYKTCECbP/nsKaaruF6LW967mtbQbsw4JTtSVkUQc9MneSkbrgPJAbKl9nWr0ZeowV8BfsarBmPpBzGelA2w=="],
|
|
43
42
|
|
|
44
|
-
"@eslint/core": ["@eslint/core@1.
|
|
43
|
+
"@eslint/core": ["@eslint/core@1.2.1", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ=="],
|
|
45
44
|
|
|
46
|
-
"@eslint/object-schema": ["@eslint/object-schema@3.0.
|
|
45
|
+
"@eslint/object-schema": ["@eslint/object-schema@3.0.5", "", {}, "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw=="],
|
|
47
46
|
|
|
48
47
|
"@eslint/plugin-kit": ["@eslint/plugin-kit@0.6.1", "", { "dependencies": { "@eslint/core": "^1.1.1", "levn": "^0.4.1" } }, "sha512-iH1B076HoAshH1mLpHMgwdGeTs0CYwL0SPMkGuSebZrwBp16v415e9NZXg2jtrqPVQjf6IANe2Vtlr5KswtcZQ=="],
|
|
49
48
|
|
|
50
|
-
"@humanfs/core": ["@humanfs/core@0.19.
|
|
49
|
+
"@humanfs/core": ["@humanfs/core@0.19.2", "", { "dependencies": { "@humanfs/types": "^0.15.0" } }, "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA=="],
|
|
51
50
|
|
|
52
|
-
"@humanfs/node": ["@humanfs/node@0.16.
|
|
51
|
+
"@humanfs/node": ["@humanfs/node@0.16.8", "", { "dependencies": { "@humanfs/core": "^0.19.2", "@humanfs/types": "^0.15.0", "@humanwhocodes/retry": "^0.4.0" } }, "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ=="],
|
|
52
|
+
|
|
53
|
+
"@humanfs/types": ["@humanfs/types@0.15.0", "", {}, "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q=="],
|
|
53
54
|
|
|
54
55
|
"@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="],
|
|
55
56
|
|
|
56
57
|
"@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="],
|
|
57
58
|
|
|
58
|
-
"@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.
|
|
59
|
+
"@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.5", "", { "dependencies": { "@tybys/wasm-util": "^0.10.2" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" } }, "sha512-AWPoBRJ9tsnVhor4sjO7rkni+7p+2IAEFj6cx06UgP10jkQHqay/36uRV/bFkgrh18D9vb4cr8Q0Pthskgzy+Q=="],
|
|
59
60
|
|
|
60
61
|
"@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="],
|
|
61
62
|
|
|
@@ -63,57 +64,55 @@
|
|
|
63
64
|
|
|
64
65
|
"@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="],
|
|
65
66
|
|
|
66
|
-
"@oxc-resolver/binding-android-arm-eabi": ["@oxc-resolver/binding-android-arm-eabi@11.
|
|
67
|
-
|
|
68
|
-
"@oxc-resolver/binding-android-arm64": ["@oxc-resolver/binding-android-arm64@11.19.1", "", { "os": "android", "cpu": "arm64" }, "sha512-oolbkRX+m7Pq2LNjr/kKgYeC7bRDMVTWPgxBGMjSpZi/+UskVo4jsMU3MLheZV55jL6c3rNelPl4oD60ggYmqA=="],
|
|
67
|
+
"@oxc-resolver/binding-android-arm-eabi": ["@oxc-resolver/binding-android-arm-eabi@11.20.0", "", { "os": "android", "cpu": "arm" }, "sha512-IjfWOXRgJFNdORDl+Uf1aibNgZY2guOD3zmOhx1BGVb/MIiqlFTdmjpQNplSN58lhWehnX4UNqC3QwpUo8pjJg=="],
|
|
69
68
|
|
|
70
|
-
"@oxc-resolver/binding-
|
|
69
|
+
"@oxc-resolver/binding-android-arm64": ["@oxc-resolver/binding-android-arm64@11.20.0", "", { "os": "android", "cpu": "arm64" }, "sha512-QqslZAuFQG8Q9xm7JuIn8JUbvywhSBMVhuQHtYW+auirZJloS41oxUUaBXk7uUhZJgp44c5zQLeVvmFaDQB+2Q=="],
|
|
71
70
|
|
|
72
|
-
"@oxc-resolver/binding-darwin-
|
|
71
|
+
"@oxc-resolver/binding-darwin-arm64": ["@oxc-resolver/binding-darwin-arm64@11.20.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-MUcavykj2ewlR+kc5arpg4tC2RvzJkUxWtNv74pf7lcNk00GpIpN43vXMj+j6r4eMmfZhlb8hueKoIb8e9kAGQ=="],
|
|
73
72
|
|
|
74
|
-
"@oxc-resolver/binding-
|
|
73
|
+
"@oxc-resolver/binding-darwin-x64": ["@oxc-resolver/binding-darwin-x64@11.20.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-BGB16nRUK5Etiv//ihPyzj8Lj1px0mhh4YIfe0FDf045ywknfSm0GEbiRESpr6Q4K82AvnyaRIhhluHByvS4bg=="],
|
|
75
74
|
|
|
76
|
-
"@oxc-resolver/binding-
|
|
75
|
+
"@oxc-resolver/binding-freebsd-x64": ["@oxc-resolver/binding-freebsd-x64@11.20.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-JZgtePaqj3qmD5XFHJaSLWzHRxQu0LaPkdoM1KJXYADvAaa83ijXHclV3ej3CueeW0wxfIAbGCZVP45J0CA7uQ=="],
|
|
77
76
|
|
|
78
|
-
"@oxc-resolver/binding-linux-arm-
|
|
77
|
+
"@oxc-resolver/binding-linux-arm-gnueabihf": ["@oxc-resolver/binding-linux-arm-gnueabihf@11.20.0", "", { "os": "linux", "cpu": "arm" }, "sha512-hOQ/p3ry3v3SchUBXicrrnszaI/UmYzM4wtS4RGfwgVUX7a+HbyQSzJ5aOzu+o6XZkFkS3ZXN4PZAzhOb77OSg=="],
|
|
79
78
|
|
|
80
|
-
"@oxc-resolver/binding-linux-
|
|
79
|
+
"@oxc-resolver/binding-linux-arm-musleabihf": ["@oxc-resolver/binding-linux-arm-musleabihf@11.20.0", "", { "os": "linux", "cpu": "arm" }, "sha512-2ArPksaw0AqeuGBfoS715VF+JvJQAhD2niWgjE5hVO+L+nAfikVQopvngCMX9x4BD8itWoQ3dnikrQyl5Ho5Jg=="],
|
|
81
80
|
|
|
82
|
-
"@oxc-resolver/binding-linux-arm64-
|
|
81
|
+
"@oxc-resolver/binding-linux-arm64-gnu": ["@oxc-resolver/binding-linux-arm64-gnu@11.20.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-0bJnmYFp62JdZ4nVMDUZ/C58BCZOCcqgKtnUlp7L9Ojf/czIN+3j72YlLPeWLkzlr6SlYvIQA4SGV/HyO0d+qg=="],
|
|
83
82
|
|
|
84
|
-
"@oxc-resolver/binding-linux-
|
|
83
|
+
"@oxc-resolver/binding-linux-arm64-musl": ["@oxc-resolver/binding-linux-arm64-musl@11.20.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-wKHHzPKZo7Ufhv/Bt6yxT7FOgnIgW4gwXcJUipkShGp68W3wGVqvr1Sr0fY65lN0Oy6y41+g2kIDvkgZaMMUkw=="],
|
|
85
84
|
|
|
86
|
-
"@oxc-resolver/binding-linux-
|
|
85
|
+
"@oxc-resolver/binding-linux-ppc64-gnu": ["@oxc-resolver/binding-linux-ppc64-gnu@11.20.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-RN8goF7Ie0B79L4i4G6OeBocTgSC56vJbQ65VJje+oXnldVpLnOU7j/AQ/dP94TcCS+Yh6WG8u3Qt4ETteXFNQ=="],
|
|
87
86
|
|
|
88
|
-
"@oxc-resolver/binding-linux-riscv64-
|
|
87
|
+
"@oxc-resolver/binding-linux-riscv64-gnu": ["@oxc-resolver/binding-linux-riscv64-gnu@11.20.0", "", { "os": "linux", "cpu": "none" }, "sha512-5l1yU6/xQEqLZRzxqmMxJfWPslpwCmBsdDGaBvABPehxquCXDC7dd7oraNdKSJUMDXSM7VvVj8H2D2FTjU7oWw=="],
|
|
89
88
|
|
|
90
|
-
"@oxc-resolver/binding-linux-
|
|
89
|
+
"@oxc-resolver/binding-linux-riscv64-musl": ["@oxc-resolver/binding-linux-riscv64-musl@11.20.0", "", { "os": "linux", "cpu": "none" }, "sha512-xHEvkbgz6UC+A3JOyDQy76LkUaxsNSfIr3/GV8slwZsnuooJiIB34gzJfsyvR4JdCYNUUPsRJc/w/oWkODu+hg=="],
|
|
91
90
|
|
|
92
|
-
"@oxc-resolver/binding-linux-
|
|
91
|
+
"@oxc-resolver/binding-linux-s390x-gnu": ["@oxc-resolver/binding-linux-s390x-gnu@11.20.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-aWPDUUmSeyHvlW+SoEUd+JIJsQhVhu6a5tBpDRMu058naPAchTgAVGCFy35zjbnFlt0i8hLWziff6HX0D3LU4g=="],
|
|
93
92
|
|
|
94
|
-
"@oxc-resolver/binding-linux-x64-
|
|
93
|
+
"@oxc-resolver/binding-linux-x64-gnu": ["@oxc-resolver/binding-linux-x64-gnu@11.20.0", "", { "os": "linux", "cpu": "x64" }, "sha512-x2YeSimvhJjKLVD8KSu8f/rqU1potcdEMkApIPJqjZWN7c2Fpt4g2X32WDg1p+XDAmyT7nuQGe0vnhvXeLbH+g=="],
|
|
95
94
|
|
|
96
|
-
"@oxc-resolver/binding-
|
|
95
|
+
"@oxc-resolver/binding-linux-x64-musl": ["@oxc-resolver/binding-linux-x64-musl@11.20.0", "", { "os": "linux", "cpu": "x64" }, "sha512-kcRLEIxpZefeYfLChjpgFf3ilBzRDZ+yobMrpRsQlSrxuFGtm3U6PMU7AaEpMqo3NfDGVyJJseAjnRLzMFHjwQ=="],
|
|
97
96
|
|
|
98
|
-
"@oxc-resolver/binding-
|
|
97
|
+
"@oxc-resolver/binding-openharmony-arm64": ["@oxc-resolver/binding-openharmony-arm64@11.20.0", "", { "os": "none", "cpu": "arm64" }, "sha512-HHcfnApSZGtKhTiHqe8OZruOZe5XuFQH5/E0Yhj3u8fnFvzkM4/k6WjacUf4SvA0SPEAbfbgYmVPuo0VX/fIBQ=="],
|
|
99
98
|
|
|
100
|
-
"@oxc-resolver/binding-
|
|
99
|
+
"@oxc-resolver/binding-wasm32-wasi": ["@oxc-resolver/binding-wasm32-wasi@11.20.0", "", { "dependencies": { "@emnapi/core": "1.10.0", "@emnapi/runtime": "1.10.0", "@napi-rs/wasm-runtime": "^1.1.4" }, "cpu": "none" }, "sha512-Tn0y1XOFYHNfK1wp1Z5QK8Rcld/bsOwRISQXfqAZ5IBpv8Gz1IvV39fUWNprqNdRizgcvFhOzWwFun2zkJsyBg=="],
|
|
101
100
|
|
|
102
|
-
"@oxc-resolver/binding-win32-
|
|
101
|
+
"@oxc-resolver/binding-win32-arm64-msvc": ["@oxc-resolver/binding-win32-arm64-msvc@11.20.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-qPi25YNPe4YenS8MgsQU2+bIFHxxpLx1LVna2444cEHqNPhNjvWf9zqj4aWE43H9LpAsTmkkAlA3eL5ElBU3mA=="],
|
|
103
102
|
|
|
104
|
-
"@oxc-resolver/binding-win32-x64-msvc": ["@oxc-resolver/binding-win32-x64-msvc@11.
|
|
103
|
+
"@oxc-resolver/binding-win32-x64-msvc": ["@oxc-resolver/binding-win32-x64-msvc@11.20.0", "", { "os": "win32", "cpu": "x64" }, "sha512-Wb14jWEW8huH6It9F6sXd9vrYmIS7pMrgkU6sxpLxkP+9z+wRgs71hUEhRpcn8FOXAFa27FVWfY2tRpbfTzfLw=="],
|
|
105
104
|
|
|
106
|
-
"@tybys/wasm-util": ["@tybys/wasm-util@0.10.
|
|
105
|
+
"@tybys/wasm-util": ["@tybys/wasm-util@0.10.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg=="],
|
|
107
106
|
|
|
108
107
|
"@types/bun": ["@types/bun@1.3.11", "", { "dependencies": { "bun-types": "1.3.11" } }, "sha512-5vPne5QvtpjGpsGYXiFyycfpDF2ECyPcTSsFBMa0fraoxiQyMJ3SmuQIGhzPg2WJuWxVBoxWJ2kClYTcw/4fAg=="],
|
|
109
108
|
|
|
110
109
|
"@types/esrecurse": ["@types/esrecurse@4.3.1", "", {}, "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw=="],
|
|
111
110
|
|
|
112
|
-
"@types/estree": ["@types/estree@1.0.
|
|
111
|
+
"@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="],
|
|
113
112
|
|
|
114
113
|
"@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="],
|
|
115
114
|
|
|
116
|
-
"@types/node": ["@types/node@25.
|
|
115
|
+
"@types/node": ["@types/node@25.9.3", "", { "dependencies": { "undici-types": ">=7.24.0 <7.24.7" } }, "sha512-603BddQMv3pUcr4U2dhujk83N2tTDVr/34wII2B6bJy6g+8WD6yUb11jszNs0gdi4PesVWl7ABt8nYMVpnLUcg=="],
|
|
117
116
|
|
|
118
117
|
"@types/react": ["@types/react@19.2.14", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w=="],
|
|
119
118
|
|
|
@@ -141,11 +140,11 @@
|
|
|
141
140
|
|
|
142
141
|
"@vellumai/local-mode": ["@vellumai/local-mode@file:../packages/local-mode", { "dependencies": { "@vellumai/environments": "file:../environments" }, "devDependencies": { "@types/bun": "1.3.11", "typescript": "5.9.3" } }],
|
|
143
142
|
|
|
144
|
-
"acorn": ["acorn@8.
|
|
143
|
+
"acorn": ["acorn@8.17.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg=="],
|
|
145
144
|
|
|
146
145
|
"acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="],
|
|
147
146
|
|
|
148
|
-
"ajv": ["ajv@6.
|
|
147
|
+
"ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="],
|
|
149
148
|
|
|
150
149
|
"ansi-escapes": ["ansi-escapes@7.3.0", "", { "dependencies": { "environment": "^1.0.0" } }, "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg=="],
|
|
151
150
|
|
|
@@ -157,7 +156,7 @@
|
|
|
157
156
|
|
|
158
157
|
"balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="],
|
|
159
158
|
|
|
160
|
-
"brace-expansion": ["brace-expansion@5.0.
|
|
159
|
+
"brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="],
|
|
161
160
|
|
|
162
161
|
"braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="],
|
|
163
162
|
|
|
@@ -187,7 +186,7 @@
|
|
|
187
186
|
|
|
188
187
|
"environment": ["environment@1.1.0", "", {}, "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q=="],
|
|
189
188
|
|
|
190
|
-
"es-toolkit": ["es-toolkit@1.
|
|
189
|
+
"es-toolkit": ["es-toolkit@1.47.0", "", {}, "sha512-n1GuoD0WEQZMBk5tttoZSqwgyLx01oqa5XsBmCHwPyNe1S9jPBEmtR2pSgp2kJuWE3ciFZ6yRHmY4pM4C3OOkw=="],
|
|
191
190
|
|
|
192
191
|
"escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="],
|
|
193
192
|
|
|
@@ -233,7 +232,7 @@
|
|
|
233
232
|
|
|
234
233
|
"formatly": ["formatly@0.3.0", "", { "dependencies": { "fd-package-json": "^2.0.0" }, "bin": { "formatly": "bin/index.mjs" } }, "sha512-9XNj/o4wrRFyhSMJOvsuyMwy8aUfBaZ1VrqHVfohyXf0Sw0e+yfKG+xZaY3arGCOMdwFsqObtzVOc1gU9KiT9w=="],
|
|
235
234
|
|
|
236
|
-
"get-east-asian-width": ["get-east-asian-width@1.
|
|
235
|
+
"get-east-asian-width": ["get-east-asian-width@1.6.0", "", {}, "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA=="],
|
|
237
236
|
|
|
238
237
|
"glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="],
|
|
239
238
|
|
|
@@ -257,7 +256,7 @@
|
|
|
257
256
|
|
|
258
257
|
"isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
|
|
259
258
|
|
|
260
|
-
"jiti": ["jiti@2.
|
|
259
|
+
"jiti": ["jiti@2.7.0", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ=="],
|
|
261
260
|
|
|
262
261
|
"json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="],
|
|
263
262
|
|
|
@@ -293,7 +292,7 @@
|
|
|
293
292
|
|
|
294
293
|
"optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="],
|
|
295
294
|
|
|
296
|
-
"oxc-resolver": ["oxc-resolver@11.
|
|
295
|
+
"oxc-resolver": ["oxc-resolver@11.20.0", "", { "optionalDependencies": { "@oxc-resolver/binding-android-arm-eabi": "11.20.0", "@oxc-resolver/binding-android-arm64": "11.20.0", "@oxc-resolver/binding-darwin-arm64": "11.20.0", "@oxc-resolver/binding-darwin-x64": "11.20.0", "@oxc-resolver/binding-freebsd-x64": "11.20.0", "@oxc-resolver/binding-linux-arm-gnueabihf": "11.20.0", "@oxc-resolver/binding-linux-arm-musleabihf": "11.20.0", "@oxc-resolver/binding-linux-arm64-gnu": "11.20.0", "@oxc-resolver/binding-linux-arm64-musl": "11.20.0", "@oxc-resolver/binding-linux-ppc64-gnu": "11.20.0", "@oxc-resolver/binding-linux-riscv64-gnu": "11.20.0", "@oxc-resolver/binding-linux-riscv64-musl": "11.20.0", "@oxc-resolver/binding-linux-s390x-gnu": "11.20.0", "@oxc-resolver/binding-linux-x64-gnu": "11.20.0", "@oxc-resolver/binding-linux-x64-musl": "11.20.0", "@oxc-resolver/binding-openharmony-arm64": "11.20.0", "@oxc-resolver/binding-wasm32-wasi": "11.20.0", "@oxc-resolver/binding-win32-arm64-msvc": "11.20.0", "@oxc-resolver/binding-win32-x64-msvc": "11.20.0" } }, "sha512-CblytBiV/a/ZXY34dsVU2NxhIOxMXst8CvDCtyBelVITgd7PLrKzbEbA6oKLdPjvDKDzCiW48qzmzZ+mYaqn+g=="],
|
|
297
296
|
|
|
298
297
|
"p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="],
|
|
299
298
|
|
|
@@ -319,8 +318,6 @@
|
|
|
319
318
|
|
|
320
319
|
"react": ["react@19.2.4", "", {}, "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ=="],
|
|
321
320
|
|
|
322
|
-
"react-devtools-core": ["react-devtools-core@6.1.5", "", { "dependencies": { "shell-quote": "^1.6.1", "ws": "^7" } }, "sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA=="],
|
|
323
|
-
|
|
324
321
|
"react-reconciler": ["react-reconciler@0.33.0", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.0" } }, "sha512-KetWRytFv1epdpJc3J4G75I4WrplZE5jOL7Yq0p34+OVOKF4Se7WrdIdVC45XsSSmUTlht2FM/fM1FZb1mfQeA=="],
|
|
325
322
|
|
|
326
323
|
"restore-cursor": ["restore-cursor@4.0.0", "", { "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" } }, "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg=="],
|
|
@@ -331,14 +328,12 @@
|
|
|
331
328
|
|
|
332
329
|
"scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="],
|
|
333
330
|
|
|
334
|
-
"semver": ["semver@7.
|
|
331
|
+
"semver": ["semver@7.8.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA=="],
|
|
335
332
|
|
|
336
333
|
"shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="],
|
|
337
334
|
|
|
338
335
|
"shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="],
|
|
339
336
|
|
|
340
|
-
"shell-quote": ["shell-quote@1.8.3", "", {}, "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw=="],
|
|
341
|
-
|
|
342
337
|
"signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="],
|
|
343
338
|
|
|
344
339
|
"slice-ansi": ["slice-ansi@8.0.0", "", { "dependencies": { "ansi-styles": "^6.2.3", "is-fullwidth-code-point": "^5.1.0" } }, "sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg=="],
|
|
@@ -347,7 +342,7 @@
|
|
|
347
342
|
|
|
348
343
|
"stack-utils": ["stack-utils@2.0.6", "", { "dependencies": { "escape-string-regexp": "^2.0.0" } }, "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ=="],
|
|
349
344
|
|
|
350
|
-
"string-width": ["string-width@8.2.
|
|
345
|
+
"string-width": ["string-width@8.2.1", "", { "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" } }, "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA=="],
|
|
351
346
|
|
|
352
347
|
"strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="],
|
|
353
348
|
|
|
@@ -357,7 +352,7 @@
|
|
|
357
352
|
|
|
358
353
|
"terminal-size": ["terminal-size@4.0.1", "", {}, "sha512-avMLDQpUI9I5XFrklECw1ZEUPJhqzcwSWsyyI8blhRLT+8N1jLJWLWWYQpB2q2xthq8xDvjZPISVh53T/+CLYQ=="],
|
|
359
354
|
|
|
360
|
-
"tinyglobby": ["tinyglobby@0.2.
|
|
355
|
+
"tinyglobby": ["tinyglobby@0.2.17", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g=="],
|
|
361
356
|
|
|
362
357
|
"to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="],
|
|
363
358
|
|
|
@@ -367,7 +362,7 @@
|
|
|
367
362
|
|
|
368
363
|
"type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="],
|
|
369
364
|
|
|
370
|
-
"type-fest": ["type-fest@5.
|
|
365
|
+
"type-fest": ["type-fest@5.7.0", "", { "dependencies": { "tagged-tag": "^1.0.0" } }, "sha512-1URUxUqfHFM1c+zfSPsa3gnkO7Aq21qyH75SIduNYz4SzY964rn1X2vCMQaHSHhktiw+0kPa2iyb6PUpXqB6Vg=="],
|
|
371
366
|
|
|
372
367
|
"typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
|
|
373
368
|
|
|
@@ -375,7 +370,7 @@
|
|
|
375
370
|
|
|
376
371
|
"unbash": ["unbash@2.2.0", "", {}, "sha512-X2wH19RAPZE3+ldGicOkoj/SIA83OIxcJ6Cuaw23hf8Xc6fQpvZXY0SftE2JgS0QhYLUG4uwodSI3R53keyh7w=="],
|
|
377
372
|
|
|
378
|
-
"undici-types": ["undici-types@7.
|
|
373
|
+
"undici-types": ["undici-types@7.24.6", "", {}, "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg=="],
|
|
379
374
|
|
|
380
375
|
"uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="],
|
|
381
376
|
|
|
@@ -389,15 +384,15 @@
|
|
|
389
384
|
|
|
390
385
|
"wrap-ansi": ["wrap-ansi@9.0.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww=="],
|
|
391
386
|
|
|
392
|
-
"ws": ["ws@8.
|
|
387
|
+
"ws": ["ws@8.21.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g=="],
|
|
393
388
|
|
|
394
|
-
"yaml": ["yaml@2.
|
|
389
|
+
"yaml": ["yaml@2.9.0", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA=="],
|
|
395
390
|
|
|
396
391
|
"yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="],
|
|
397
392
|
|
|
398
393
|
"yoga-layout": ["yoga-layout@3.2.1", "", {}, "sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ=="],
|
|
399
394
|
|
|
400
|
-
"zod": ["zod@4.3
|
|
395
|
+
"zod": ["zod@4.4.3", "", {}, "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ=="],
|
|
401
396
|
|
|
402
397
|
"@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="],
|
|
403
398
|
|
|
@@ -409,8 +404,6 @@
|
|
|
409
404
|
|
|
410
405
|
"micromatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="],
|
|
411
406
|
|
|
412
|
-
"react-devtools-core/ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="],
|
|
413
|
-
|
|
414
407
|
"stack-utils/escape-string-regexp": ["escape-string-regexp@2.0.0", "", {}, "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w=="],
|
|
415
408
|
|
|
416
409
|
"wrap-ansi/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="],
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, test } from "bun:test";
|
|
2
|
+
import { mkdirSync, rmSync, utimesSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { createServer, type Server } from "node:http";
|
|
4
|
+
import { tmpdir } from "node:os";
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
|
|
7
|
+
import { getLocalAssistantStatus } from "../status";
|
|
8
|
+
|
|
9
|
+
let tempDir: string;
|
|
10
|
+
let lockfilePath: string;
|
|
11
|
+
let instanceDir: string;
|
|
12
|
+
|
|
13
|
+
function writeLockfile(entry: Record<string, unknown>): void {
|
|
14
|
+
writeFileSync(
|
|
15
|
+
lockfilePath,
|
|
16
|
+
JSON.stringify({
|
|
17
|
+
assistants: [entry],
|
|
18
|
+
activeAssistant: entry.assistantId,
|
|
19
|
+
}),
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function writeLocalLockfile(overrides: Record<string, unknown> = {}): void {
|
|
24
|
+
writeLockfile({
|
|
25
|
+
assistantId: "local-1",
|
|
26
|
+
cloud: "local",
|
|
27
|
+
resources: {
|
|
28
|
+
instanceDir,
|
|
29
|
+
daemonPort: 30101,
|
|
30
|
+
gatewayPort: 30102,
|
|
31
|
+
qdrantPort: 30103,
|
|
32
|
+
},
|
|
33
|
+
...overrides,
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function writeAssistantPid(value: string): string {
|
|
38
|
+
const pidDir = path.join(instanceDir, ".vellum", "workspace");
|
|
39
|
+
mkdirSync(pidDir, { recursive: true });
|
|
40
|
+
const pidPath = path.join(pidDir, "vellum.pid");
|
|
41
|
+
writeFileSync(pidPath, value);
|
|
42
|
+
return pidPath;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function markStale(filePath: string): void {
|
|
46
|
+
const stale = new Date(Date.now() - 120_000);
|
|
47
|
+
utimesSync(filePath, stale, stale);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function listen(server: Server, port = 0): Promise<number> {
|
|
51
|
+
return new Promise((resolve) => {
|
|
52
|
+
server.listen(port, "127.0.0.1", () => {
|
|
53
|
+
const address = server.address();
|
|
54
|
+
if (!address || typeof address === "string") {
|
|
55
|
+
throw new Error("expected TCP server address");
|
|
56
|
+
}
|
|
57
|
+
resolve(address.port);
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function close(server: Server): Promise<void> {
|
|
63
|
+
return new Promise((resolve, reject) => {
|
|
64
|
+
server.close((err) => (err ? reject(err) : resolve()));
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
async function unusedPort(): Promise<number> {
|
|
69
|
+
const server = createServer();
|
|
70
|
+
const port = await listen(server);
|
|
71
|
+
await close(server);
|
|
72
|
+
return port;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
beforeEach(() => {
|
|
76
|
+
tempDir = path.join(
|
|
77
|
+
tmpdir(),
|
|
78
|
+
`vellum-local-status-test-${Date.now()}-${Math.random()}`,
|
|
79
|
+
);
|
|
80
|
+
mkdirSync(tempDir, { recursive: true });
|
|
81
|
+
lockfilePath = path.join(tempDir, "lockfile.json");
|
|
82
|
+
instanceDir = path.join(tempDir, "instance");
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
afterEach(() => {
|
|
86
|
+
rmSync(tempDir, { recursive: true, force: true });
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
describe("getLocalAssistantStatus", () => {
|
|
90
|
+
test("returns sleeping when the assistant PID file is absent", async () => {
|
|
91
|
+
writeLocalLockfile();
|
|
92
|
+
|
|
93
|
+
expect(await getLocalAssistantStatus([lockfilePath], "local-1")).toEqual({
|
|
94
|
+
ok: true,
|
|
95
|
+
state: "sleeping",
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
test("returns sleeping for legacy local entries without cloud/resources", async () => {
|
|
100
|
+
writeLockfile({
|
|
101
|
+
assistantId: "legacy-local",
|
|
102
|
+
baseDataDir: instanceDir,
|
|
103
|
+
runtimeUrl: "http://127.0.0.1:30102",
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
expect(
|
|
107
|
+
await getLocalAssistantStatus([lockfilePath], "legacy-local"),
|
|
108
|
+
).toEqual({
|
|
109
|
+
ok: true,
|
|
110
|
+
state: "sleeping",
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
test("returns sleeping when the assistant PID file points at a dead process", async () => {
|
|
115
|
+
writeLocalLockfile();
|
|
116
|
+
writeAssistantPid("999999999");
|
|
117
|
+
|
|
118
|
+
const result = await getLocalAssistantStatus([lockfilePath], "local-1");
|
|
119
|
+
|
|
120
|
+
expect(result.ok).toBe(true);
|
|
121
|
+
if (result.ok) {
|
|
122
|
+
expect(result.state).toBe("sleeping");
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
test("returns crashed when the assistant PID file is invalid", async () => {
|
|
127
|
+
writeLocalLockfile();
|
|
128
|
+
writeAssistantPid("not-a-pid");
|
|
129
|
+
|
|
130
|
+
const result = await getLocalAssistantStatus([lockfilePath], "local-1");
|
|
131
|
+
|
|
132
|
+
expect(result.ok).toBe(true);
|
|
133
|
+
if (result.ok) {
|
|
134
|
+
expect(result.state).toBe("crashed");
|
|
135
|
+
expect(result.detail).toContain("PID file");
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
test("returns starting when a fresh assistant PID is alive but health is not ready yet", async () => {
|
|
140
|
+
writeLocalLockfile({
|
|
141
|
+
resources: {
|
|
142
|
+
instanceDir,
|
|
143
|
+
daemonPort: await unusedPort(),
|
|
144
|
+
gatewayPort: 30102,
|
|
145
|
+
qdrantPort: 30103,
|
|
146
|
+
},
|
|
147
|
+
});
|
|
148
|
+
writeAssistantPid(String(process.pid));
|
|
149
|
+
|
|
150
|
+
const result = await getLocalAssistantStatus([lockfilePath], "local-1");
|
|
151
|
+
|
|
152
|
+
expect(result.ok).toBe(true);
|
|
153
|
+
if (result.ok) {
|
|
154
|
+
expect(result.state).toBe("starting");
|
|
155
|
+
expect(result.pid).toBe(process.pid);
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
test("returns crashed when an old live assistant PID is still not responding", async () => {
|
|
160
|
+
writeLocalLockfile({
|
|
161
|
+
resources: {
|
|
162
|
+
instanceDir,
|
|
163
|
+
daemonPort: await unusedPort(),
|
|
164
|
+
gatewayPort: 30102,
|
|
165
|
+
qdrantPort: 30103,
|
|
166
|
+
},
|
|
167
|
+
});
|
|
168
|
+
const pidPath = writeAssistantPid(String(process.pid));
|
|
169
|
+
markStale(pidPath);
|
|
170
|
+
|
|
171
|
+
const result = await getLocalAssistantStatus([lockfilePath], "local-1");
|
|
172
|
+
|
|
173
|
+
expect(result.ok).toBe(true);
|
|
174
|
+
if (result.ok) {
|
|
175
|
+
expect(result.state).toBe("crashed");
|
|
176
|
+
expect(result.detail).toContain("not responding");
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
test("returns starting while the gateway is coming up for a freshly started assistant", async () => {
|
|
181
|
+
const server = createServer((_req, res) => {
|
|
182
|
+
res.writeHead(200, { "Content-Type": "application/json" });
|
|
183
|
+
res.end(JSON.stringify({ status: "healthy" }));
|
|
184
|
+
});
|
|
185
|
+
const daemonPort = await listen(server);
|
|
186
|
+
try {
|
|
187
|
+
writeLocalLockfile({
|
|
188
|
+
resources: {
|
|
189
|
+
instanceDir,
|
|
190
|
+
daemonPort,
|
|
191
|
+
gatewayPort: await unusedPort(),
|
|
192
|
+
qdrantPort: 30103,
|
|
193
|
+
},
|
|
194
|
+
});
|
|
195
|
+
writeAssistantPid(String(process.pid));
|
|
196
|
+
|
|
197
|
+
const result = await getLocalAssistantStatus([lockfilePath], "local-1");
|
|
198
|
+
|
|
199
|
+
expect(result.ok).toBe(true);
|
|
200
|
+
if (result.ok) {
|
|
201
|
+
expect(result.state).toBe("starting");
|
|
202
|
+
expect(result.pid).toBe(process.pid);
|
|
203
|
+
}
|
|
204
|
+
} finally {
|
|
205
|
+
await close(server);
|
|
206
|
+
}
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
test("rejects non-local assistants", async () => {
|
|
210
|
+
writeLockfile({
|
|
211
|
+
assistantId: "platform-1",
|
|
212
|
+
cloud: "vellum",
|
|
213
|
+
runtimeUrl: "https://example.com",
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
expect(await getLocalAssistantStatus([lockfilePath], "platform-1")).toEqual(
|
|
217
|
+
{
|
|
218
|
+
ok: false,
|
|
219
|
+
status: 404,
|
|
220
|
+
error: "Local assistant not found",
|
|
221
|
+
},
|
|
222
|
+
);
|
|
223
|
+
});
|
|
224
|
+
});
|
|
@@ -41,6 +41,25 @@ describe("runWake", () => {
|
|
|
41
41
|
expect(spawnArgs[0]).toEqual(["bun", ["run", "cli", "wake", "asst-42"]]);
|
|
42
42
|
});
|
|
43
43
|
|
|
44
|
+
test("repairGuardian: true appends --repair-guardian to the CLI args", async () => {
|
|
45
|
+
const pending = runWake(invocation, "asst-42", { repairGuardian: true });
|
|
46
|
+
lastChild.emit("close", 0);
|
|
47
|
+
|
|
48
|
+
expect(await pending).toEqual({ ok: true });
|
|
49
|
+
expect(spawnArgs[0]).toEqual([
|
|
50
|
+
"bun",
|
|
51
|
+
["run", "cli", "wake", "asst-42", "--repair-guardian"],
|
|
52
|
+
]);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
test("repairGuardian: false omits the flag", async () => {
|
|
56
|
+
const pending = runWake(invocation, "asst-42", { repairGuardian: false });
|
|
57
|
+
lastChild.emit("close", 0);
|
|
58
|
+
|
|
59
|
+
expect(await pending).toEqual({ ok: true });
|
|
60
|
+
expect(spawnArgs[0]).toEqual(["bun", ["run", "cli", "wake", "asst-42"]]);
|
|
61
|
+
});
|
|
62
|
+
|
|
44
63
|
test("a non-zero exit resolves to a failure carrying the CLI's output", async () => {
|
|
45
64
|
const pending = runWake(invocation, "asst-42");
|
|
46
65
|
lastChild.stderr.emit("data", Buffer.from("no sibling environment to seed from"));
|
|
@@ -35,8 +35,15 @@ export { runHatch } from "./hatch";
|
|
|
35
35
|
export type { HatchResult } from "./hatch";
|
|
36
36
|
export { runRetire } from "./retire";
|
|
37
37
|
export type { RetireResult } from "./retire";
|
|
38
|
+
export { runSleep } from "./sleep";
|
|
39
|
+
export type { SleepResult } from "./sleep";
|
|
38
40
|
export { runWake } from "./wake";
|
|
39
|
-
export type { WakeResult } from "./wake";
|
|
41
|
+
export type { WakeOptions, WakeResult } from "./wake";
|
|
42
|
+
export { getLocalAssistantStatus } from "./status";
|
|
43
|
+
export type {
|
|
44
|
+
LocalAssistantRuntimeState,
|
|
45
|
+
LocalAssistantStatusResult,
|
|
46
|
+
} from "./status";
|
|
40
47
|
export { getGuardianAccessToken } from "./guardian-token";
|
|
41
48
|
export type { TokenResult } from "./guardian-token";
|
|
42
49
|
export {
|