@vellumai/credential-executor 0.8.3 → 0.8.5

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/bun.lock CHANGED
@@ -13,49 +13,276 @@
13
13
  },
14
14
  "devDependencies": {
15
15
  "@types/bun": "1.3.10",
16
+ "eslint": "10.1.0",
17
+ "knip": "5.88.1",
16
18
  "typescript": "5.9.3",
19
+ "typescript-eslint": "8.58.0",
17
20
  },
18
21
  },
19
22
  },
20
23
  "packages": {
24
+ "@emnapi/core": ["@emnapi/core@1.10.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" } }, "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw=="],
25
+
26
+ "@emnapi/runtime": ["@emnapi/runtime@1.10.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA=="],
27
+
28
+ "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w=="],
29
+
30
+ "@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=="],
31
+
32
+ "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="],
33
+
34
+ "@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=="],
35
+
36
+ "@eslint/config-helpers": ["@eslint/config-helpers@0.5.5", "", { "dependencies": { "@eslint/core": "^1.2.1" } }, "sha512-eIJYKTCECbP/nsKaaruF6LW967mtbQbsw4JTtSVkUQc9MneSkbrgPJAbKl9nWr0ZeowV8BfsarBmPpBzGelA2w=="],
37
+
38
+ "@eslint/core": ["@eslint/core@1.2.1", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ=="],
39
+
40
+ "@eslint/object-schema": ["@eslint/object-schema@3.0.5", "", {}, "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw=="],
41
+
42
+ "@eslint/plugin-kit": ["@eslint/plugin-kit@0.6.1", "", { "dependencies": { "@eslint/core": "^1.1.1", "levn": "^0.4.1" } }, "sha512-iH1B076HoAshH1mLpHMgwdGeTs0CYwL0SPMkGuSebZrwBp16v415e9NZXg2jtrqPVQjf6IANe2Vtlr5KswtcZQ=="],
43
+
44
+ "@humanfs/core": ["@humanfs/core@0.19.2", "", { "dependencies": { "@humanfs/types": "^0.15.0" } }, "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA=="],
45
+
46
+ "@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=="],
47
+
48
+ "@humanfs/types": ["@humanfs/types@0.15.0", "", {}, "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q=="],
49
+
50
+ "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="],
51
+
52
+ "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="],
53
+
54
+ "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.4", "", { "dependencies": { "@tybys/wasm-util": "^0.10.1" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" } }, "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow=="],
55
+
56
+ "@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=="],
57
+
58
+ "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="],
59
+
60
+ "@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=="],
61
+
62
+ "@oxc-resolver/binding-android-arm-eabi": ["@oxc-resolver/binding-android-arm-eabi@11.19.1", "", { "os": "android", "cpu": "arm" }, "sha512-aUs47y+xyXHUKlbhqHUjBABjvycq6YSD7bpxSW7vplUmdzAlJ93yXY6ZR0c1o1x5A/QKbENCvs3+NlY8IpIVzg=="],
63
+
64
+ "@oxc-resolver/binding-android-arm64": ["@oxc-resolver/binding-android-arm64@11.19.1", "", { "os": "android", "cpu": "arm64" }, "sha512-oolbkRX+m7Pq2LNjr/kKgYeC7bRDMVTWPgxBGMjSpZi/+UskVo4jsMU3MLheZV55jL6c3rNelPl4oD60ggYmqA=="],
65
+
66
+ "@oxc-resolver/binding-darwin-arm64": ["@oxc-resolver/binding-darwin-arm64@11.19.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-nUC6d2i3R5B12sUW4O646qD5cnMXf2oBGPLIIeaRfU9doJRORAbE2SGv4eW6rMqhD+G7nf2Y8TTJTLiiO3Q/dQ=="],
67
+
68
+ "@oxc-resolver/binding-darwin-x64": ["@oxc-resolver/binding-darwin-x64@11.19.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-cV50vE5+uAgNcFa3QY1JOeKDSkM/9ReIcc/9wn4TavhW/itkDGrXhw9jaKnkQnGbjJ198Yh5nbX/Gr2mr4Z5jQ=="],
69
+
70
+ "@oxc-resolver/binding-freebsd-x64": ["@oxc-resolver/binding-freebsd-x64@11.19.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-xZOQiYGFxtk48PBKff+Zwoym7ScPAIVp4c14lfLxizO2LTTTJe5sx9vQNGrBymrf/vatSPNMD4FgsaaRigPkqw=="],
71
+
72
+ "@oxc-resolver/binding-linux-arm-gnueabihf": ["@oxc-resolver/binding-linux-arm-gnueabihf@11.19.1", "", { "os": "linux", "cpu": "arm" }, "sha512-lXZYWAC6kaGe/ky2su94e9jN9t6M0/6c+GrSlCqL//XO1cxi5lpAhnJYdyrKfm0ZEr/c7RNyAx3P7FSBcBd5+A=="],
73
+
74
+ "@oxc-resolver/binding-linux-arm-musleabihf": ["@oxc-resolver/binding-linux-arm-musleabihf@11.19.1", "", { "os": "linux", "cpu": "arm" }, "sha512-veG1kKsuK5+t2IsO9q0DErYVSw2azvCVvWHnfTOS73WE0STdLLB7Q1bB9WR+yHPQM76ASkFyRbogWo1GR1+WbQ=="],
75
+
76
+ "@oxc-resolver/binding-linux-arm64-gnu": ["@oxc-resolver/binding-linux-arm64-gnu@11.19.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-heV2+jmXyYnUrpUXSPugqWDRpnsQcDm2AX4wzTuvgdlZfoNYO0O3W2AVpJYaDn9AG4JdM6Kxom8+foE7/BcSig=="],
77
+
78
+ "@oxc-resolver/binding-linux-arm64-musl": ["@oxc-resolver/binding-linux-arm64-musl@11.19.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-jvo2Pjs1c9KPxMuMPIeQsgu0mOJF9rEb3y3TdpsrqwxRM+AN6/nDDwv45n5ZrUnQMsdBy5gIabioMKnQfWo9ew=="],
79
+
80
+ "@oxc-resolver/binding-linux-ppc64-gnu": ["@oxc-resolver/binding-linux-ppc64-gnu@11.19.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-vLmdNxWCdN7Uo5suays6A/+ywBby2PWBBPXctWPg5V0+eVuzsJxgAn6MMB4mPlshskYbppjpN2Zg83ArHze9gQ=="],
81
+
82
+ "@oxc-resolver/binding-linux-riscv64-gnu": ["@oxc-resolver/binding-linux-riscv64-gnu@11.19.1", "", { "os": "linux", "cpu": "none" }, "sha512-/b+WgR+VTSBxzgOhDO7TlMXC1ufPIMR6Vj1zN+/x+MnyXGW7prTLzU9eW85Aj7Th7CCEG9ArCbTeqxCzFWdg2w=="],
83
+
84
+ "@oxc-resolver/binding-linux-riscv64-musl": ["@oxc-resolver/binding-linux-riscv64-musl@11.19.1", "", { "os": "linux", "cpu": "none" }, "sha512-YlRdeWb9j42p29ROh+h4eg/OQ3dTJlpHSa+84pUM9+p6i3djtPz1q55yLJhgW9XfDch7FN1pQ/Vd6YP+xfRIuw=="],
85
+
86
+ "@oxc-resolver/binding-linux-s390x-gnu": ["@oxc-resolver/binding-linux-s390x-gnu@11.19.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-EDpafVOQWF8/MJynsjOGFThcqhRHy417sRyLfQmeiamJ8qVhSKAn2Dn2VVKUGCjVB9C46VGjhNo7nOPUi1x6uA=="],
87
+
88
+ "@oxc-resolver/binding-linux-x64-gnu": ["@oxc-resolver/binding-linux-x64-gnu@11.19.1", "", { "os": "linux", "cpu": "x64" }, "sha512-NxjZe+rqWhr+RT8/Ik+5ptA3oz7tUw361Wa5RWQXKnfqwSSHdHyrw6IdcTfYuml9dM856AlKWZIUXDmA9kkiBQ=="],
89
+
90
+ "@oxc-resolver/binding-linux-x64-musl": ["@oxc-resolver/binding-linux-x64-musl@11.19.1", "", { "os": "linux", "cpu": "x64" }, "sha512-cM/hQwsO3ReJg5kR+SpI69DMfvNCp+A/eVR4b4YClE5bVZwz8rh2Nh05InhwI5HR/9cArbEkzMjcKgTHS6UaNw=="],
91
+
92
+ "@oxc-resolver/binding-openharmony-arm64": ["@oxc-resolver/binding-openharmony-arm64@11.19.1", "", { "os": "none", "cpu": "arm64" }, "sha512-QF080IowFB0+9Rh6RcD19bdgh49BpQHUW5TajG1qvWHvmrQznTZZjYlgE2ltLXyKY+qs4F/v5xuX1XS7Is+3qA=="],
93
+
94
+ "@oxc-resolver/binding-wasm32-wasi": ["@oxc-resolver/binding-wasm32-wasi@11.19.1", "", { "dependencies": { "@napi-rs/wasm-runtime": "^1.1.1" }, "cpu": "none" }, "sha512-w8UCKhX826cP/ZLokXDS6+milN8y4X7zidsAttEdWlVoamTNf6lhBJldaWr3ukTDiye7s4HRcuPEPOXNC432Vg=="],
95
+
96
+ "@oxc-resolver/binding-win32-arm64-msvc": ["@oxc-resolver/binding-win32-arm64-msvc@11.19.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-nJ4AsUVZrVKwnU/QRdzPCCrO0TrabBqgJ8pJhXITdZGYOV28TIYystV1VFLbQ7DtAcaBHpocT5/ZJnF78YJPtQ=="],
97
+
98
+ "@oxc-resolver/binding-win32-ia32-msvc": ["@oxc-resolver/binding-win32-ia32-msvc@11.19.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-EW+ND5q2Tl+a3pH81l1QbfgbF3HmqgwLfDfVithRFheac8OTcnbXt/JxqD2GbDkb7xYEqy1zNaVFRr3oeG8npA=="],
99
+
100
+ "@oxc-resolver/binding-win32-x64-msvc": ["@oxc-resolver/binding-win32-x64-msvc@11.19.1", "", { "os": "win32", "cpu": "x64" }, "sha512-6hIU3RQu45B+VNTY4Ru8ppFwjVS/S5qwYyGhBotmjxfEKk41I2DlGtRfGJndZ5+6lneE2pwloqunlOyZuX/XAw=="],
101
+
21
102
  "@pinojs/redact": ["@pinojs/redact@0.4.0", "", {}, "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg=="],
22
103
 
104
+ "@tybys/wasm-util": ["@tybys/wasm-util@0.10.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg=="],
105
+
23
106
  "@types/bun": ["@types/bun@1.3.10", "", { "dependencies": { "bun-types": "1.3.10" } }, "sha512-0+rlrUrOrTSskibryHbvQkDOWRJwJZqZlxrUs1u4oOoTln8+WIXBPmAuCF35SWB2z4Zl3E84Nl/D0P7803nigQ=="],
24
107
 
108
+ "@types/esrecurse": ["@types/esrecurse@4.3.1", "", {}, "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw=="],
109
+
110
+ "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="],
111
+
112
+ "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="],
113
+
25
114
  "@types/node": ["@types/node@25.6.0", "", { "dependencies": { "undici-types": "~7.19.0" } }, "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ=="],
26
115
 
27
116
  "@types/ws": ["@types/ws@8.5.14", "", { "dependencies": { "@types/node": "*" } }, "sha512-bd/YFLW+URhBzMXurx7lWByOu+xzU9+kb3RboOteXYDfW+tr+JZa99OyNmPINEGB/ahzKrEuc8rcv4gnpJmxTw=="],
28
117
 
118
+ "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.58.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.58.0", "@typescript-eslint/type-utils": "8.58.0", "@typescript-eslint/utils": "8.58.0", "@typescript-eslint/visitor-keys": "8.58.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.58.0", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-RLkVSiNuUP1C2ROIWfqX+YcUfLaSnxGE/8M+Y57lopVwg9VTYYfhuz15Yf1IzCKgZj6/rIbYTmJCUSqr76r0Wg=="],
119
+
120
+ "@typescript-eslint/parser": ["@typescript-eslint/parser@8.58.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.58.0", "@typescript-eslint/types": "8.58.0", "@typescript-eslint/typescript-estree": "8.58.0", "@typescript-eslint/visitor-keys": "8.58.0", "debug": "^4.4.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-rLoGZIf9afaRBYsPUMtvkDWykwXwUPL60HebR4JgTI8mxfFe2cQTu3AGitANp4b9B2QlVru6WzjgB2IzJKiCSA=="],
121
+
122
+ "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.58.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.58.0", "@typescript-eslint/types": "^8.58.0", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-8Q/wBPWLQP1j16NxoPNIKpDZFMaxl7yWIoqXWYeWO+Bbd2mjgvoF0dxP2jKZg5+x49rgKdf7Ck473M8PC3V9lg=="],
123
+
124
+ "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.58.0", "", { "dependencies": { "@typescript-eslint/types": "8.58.0", "@typescript-eslint/visitor-keys": "8.58.0" } }, "sha512-W1Lur1oF50FxSnNdGp3Vs6P+yBRSmZiw4IIjEeYxd8UQJwhUF0gDgDD/W/Tgmh73mxgEU3qX0Bzdl/NGuSPEpQ=="],
125
+
126
+ "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.58.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-doNSZEVJsWEu4htiVC+PR6NpM+pa+a4ClH9INRWOWCUzMst/VA9c4gXq92F8GUD1rwhNvRLkgjfYtFXegXQF7A=="],
127
+
128
+ "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.58.0", "", { "dependencies": { "@typescript-eslint/types": "8.58.0", "@typescript-eslint/typescript-estree": "8.58.0", "@typescript-eslint/utils": "8.58.0", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-aGsCQImkDIqMyx1u4PrVlbi/krmDsQUs4zAcCV6M7yPcPev+RqVlndsJy9kJ8TLihW9TZ0kbDAzctpLn5o+lOg=="],
129
+
130
+ "@typescript-eslint/types": ["@typescript-eslint/types@8.58.0", "", {}, "sha512-O9CjxypDT89fbHxRfETNoAnHj/i6IpRK0CvbVN3qibxlLdo5p5hcLmUuCCrHMpxiWSwKyI8mCP7qRNYuOJ0Uww=="],
131
+
132
+ "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.58.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.58.0", "@typescript-eslint/tsconfig-utils": "8.58.0", "@typescript-eslint/types": "8.58.0", "@typescript-eslint/visitor-keys": "8.58.0", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-7vv5UWbHqew/dvs+D3e1RvLv1v2eeZ9txRHPnEEBUgSNLx5ghdzjHa0sgLWYVKssH+lYmV0JaWdoubo0ncGYLA=="],
133
+
134
+ "@typescript-eslint/utils": ["@typescript-eslint/utils@8.58.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.58.0", "@typescript-eslint/types": "8.58.0", "@typescript-eslint/typescript-estree": "8.58.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-RfeSqcFeHMHlAWzt4TBjWOAtoW9lnsAGiP3GbaX9uVgTYYrMbVnGONEfUCiSss+xMHFl+eHZiipmA8WkQ7FuNA=="],
135
+
136
+ "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.58.0", "", { "dependencies": { "@typescript-eslint/types": "8.58.0", "eslint-visitor-keys": "^5.0.0" } }, "sha512-XJ9UD9+bbDo4a4epraTwG3TsNPeiB9aShrUneAVXy8q4LuwowN+qu89/6ByLMINqvIMeI9H9hOHQtg/ijrYXzQ=="],
137
+
29
138
  "@vellumai/credential-storage": ["@vellumai/credential-storage@file:../packages/credential-storage", { "devDependencies": { "@types/bun": "1.3.10", "typescript": "5.9.3" } }],
30
139
 
31
140
  "@vellumai/egress-proxy": ["@vellumai/egress-proxy@file:../packages/egress-proxy", { "devDependencies": { "@types/bun": "1.3.10", "typescript": "5.9.3" } }],
32
141
 
33
142
  "@vellumai/service-contracts": ["@vellumai/service-contracts@file:../packages/service-contracts", { "dependencies": { "zod": "4.3.6" }, "devDependencies": { "@types/bun": "1.2.4", "typescript": "5.7.3" } }],
34
143
 
144
+ "acorn": ["acorn@8.16.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw=="],
145
+
146
+ "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="],
147
+
148
+ "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
+
35
150
  "atomic-sleep": ["atomic-sleep@1.0.0", "", {}, "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ=="],
36
151
 
152
+ "balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="],
153
+
154
+ "brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="],
155
+
156
+ "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="],
157
+
37
158
  "bun-types": ["bun-types@1.3.10", "", { "dependencies": { "@types/node": "*" } }, "sha512-tcpfCCl6XWo6nCVnpcVrxQ+9AYN1iqMIzgrSKYMB/fjLtV2eyAVEg7AxQJuCq/26R6HpKWykQXuSOq/21RYcbg=="],
38
159
 
39
160
  "colorette": ["colorette@2.0.20", "", {}, "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w=="],
40
161
 
162
+ "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="],
163
+
41
164
  "dateformat": ["dateformat@4.6.3", "", {}, "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA=="],
42
165
 
166
+ "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
167
+
168
+ "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="],
169
+
43
170
  "end-of-stream": ["end-of-stream@1.4.5", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg=="],
44
171
 
172
+ "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="],
173
+
174
+ "eslint": ["eslint@10.1.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.3", "@eslint/config-helpers": "^0.5.3", "@eslint/core": "^1.1.1", "@eslint/plugin-kit": "^0.6.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1", "espree": "^11.2.0", "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "minimatch": "^10.2.4", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-S9jlY/ELKEUwwQnqWDO+f+m6sercqOPSqXM5Go94l7DOmxHVDgmSFGWEzeE/gwgTAr0W103BWt0QLe/7mabIvA=="],
175
+
176
+ "eslint-scope": ["eslint-scope@9.1.2", "", { "dependencies": { "@types/esrecurse": "^4.3.1", "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ=="],
177
+
178
+ "eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="],
179
+
180
+ "espree": ["espree@11.2.0", "", { "dependencies": { "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^5.0.1" } }, "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw=="],
181
+
182
+ "esquery": ["esquery@1.7.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g=="],
183
+
184
+ "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="],
185
+
186
+ "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="],
187
+
188
+ "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="],
189
+
45
190
  "fast-copy": ["fast-copy@4.0.3", "", {}, "sha512-58apWr0GUiDFM8+3afrO6eYwJBn9ZAhDOzG3L+/9llab/haCARS2UIfffmOurYLwbgDRs8n0rfr6qAAPEAuAQw=="],
46
191
 
192
+ "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="],
193
+
194
+ "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="],
195
+
196
+ "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="],
197
+
198
+ "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="],
199
+
47
200
  "fast-safe-stringify": ["fast-safe-stringify@2.1.1", "", {}, "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA=="],
48
201
 
202
+ "fastq": ["fastq@1.20.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw=="],
203
+
204
+ "fd-package-json": ["fd-package-json@2.0.0", "", { "dependencies": { "walk-up-path": "^4.0.0" } }, "sha512-jKmm9YtsNXN789RS/0mSzOC1NUq9mkVd65vbSSVsKdjGvYXBuE4oWe2QOEoFeRmJg+lPuZxpmrfFclNhoRMneQ=="],
205
+
206
+ "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="],
207
+
208
+ "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="],
209
+
210
+ "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="],
211
+
212
+ "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="],
213
+
214
+ "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="],
215
+
216
+ "flatted": ["flatted@3.4.2", "", {}, "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA=="],
217
+
218
+ "formatly": ["formatly@0.3.0", "", { "dependencies": { "fd-package-json": "^2.0.0" }, "bin": { "formatly": "bin/index.mjs" } }, "sha512-9XNj/o4wrRFyhSMJOvsuyMwy8aUfBaZ1VrqHVfohyXf0Sw0e+yfKG+xZaY3arGCOMdwFsqObtzVOc1gU9KiT9w=="],
219
+
220
+ "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="],
221
+
49
222
  "help-me": ["help-me@5.0.0", "", {}, "sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg=="],
50
223
 
224
+ "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="],
225
+
226
+ "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="],
227
+
228
+ "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="],
229
+
230
+ "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="],
231
+
232
+ "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="],
233
+
234
+ "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
235
+
236
+ "jiti": ["jiti@2.7.0", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ=="],
237
+
51
238
  "joycon": ["joycon@3.1.1", "", {}, "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw=="],
52
239
 
240
+ "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="],
241
+
242
+ "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="],
243
+
244
+ "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="],
245
+
246
+ "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="],
247
+
248
+ "knip": ["knip@5.88.1", "", { "dependencies": { "@nodelib/fs.walk": "^1.2.3", "fast-glob": "^3.3.3", "formatly": "^0.3.0", "jiti": "^2.6.0", "minimist": "^1.2.8", "oxc-resolver": "^11.19.1", "picocolors": "^1.1.1", "picomatch": "^4.0.1", "smol-toml": "^1.5.2", "strip-json-comments": "5.0.3", "unbash": "^2.2.0", "yaml": "^2.8.2", "zod": "^4.1.11" }, "peerDependencies": { "@types/node": ">=18", "typescript": ">=5.0.4 <7" }, "bin": { "knip": "bin/knip.js", "knip-bun": "bin/knip-bun.js" } }, "sha512-tpy5o7zu1MjawVkLPuahymVJekYY3kYjvzcoInhIchgePxTlo+api90tBv2KfhAIe5uXh+mez1tAfmbv8/TiZg=="],
249
+
250
+ "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="],
251
+
252
+ "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="],
253
+
254
+ "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="],
255
+
256
+ "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="],
257
+
258
+ "minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="],
259
+
53
260
  "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="],
54
261
 
262
+ "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
263
+
264
+ "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="],
265
+
55
266
  "on-exit-leak-free": ["on-exit-leak-free@2.1.2", "", {}, "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA=="],
56
267
 
57
268
  "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="],
58
269
 
270
+ "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=="],
271
+
272
+ "oxc-resolver": ["oxc-resolver@11.19.1", "", { "optionalDependencies": { "@oxc-resolver/binding-android-arm-eabi": "11.19.1", "@oxc-resolver/binding-android-arm64": "11.19.1", "@oxc-resolver/binding-darwin-arm64": "11.19.1", "@oxc-resolver/binding-darwin-x64": "11.19.1", "@oxc-resolver/binding-freebsd-x64": "11.19.1", "@oxc-resolver/binding-linux-arm-gnueabihf": "11.19.1", "@oxc-resolver/binding-linux-arm-musleabihf": "11.19.1", "@oxc-resolver/binding-linux-arm64-gnu": "11.19.1", "@oxc-resolver/binding-linux-arm64-musl": "11.19.1", "@oxc-resolver/binding-linux-ppc64-gnu": "11.19.1", "@oxc-resolver/binding-linux-riscv64-gnu": "11.19.1", "@oxc-resolver/binding-linux-riscv64-musl": "11.19.1", "@oxc-resolver/binding-linux-s390x-gnu": "11.19.1", "@oxc-resolver/binding-linux-x64-gnu": "11.19.1", "@oxc-resolver/binding-linux-x64-musl": "11.19.1", "@oxc-resolver/binding-openharmony-arm64": "11.19.1", "@oxc-resolver/binding-wasm32-wasi": "11.19.1", "@oxc-resolver/binding-win32-arm64-msvc": "11.19.1", "@oxc-resolver/binding-win32-ia32-msvc": "11.19.1", "@oxc-resolver/binding-win32-x64-msvc": "11.19.1" } }, "sha512-qE/CIg/spwrTBFt5aKmwe3ifeDdLfA2NESN30E42X/lII5ClF8V7Wt6WIJhcGZjp0/Q+nQ+9vgxGk//xZNX2hg=="],
273
+
274
+ "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="],
275
+
276
+ "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="],
277
+
278
+ "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="],
279
+
280
+ "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="],
281
+
282
+ "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
283
+
284
+ "picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="],
285
+
59
286
  "pino": ["pino@9.14.0", "", { "dependencies": { "@pinojs/redact": "^0.4.0", "atomic-sleep": "^1.0.0", "on-exit-leak-free": "^2.1.0", "pino-abstract-transport": "^2.0.0", "pino-std-serializers": "^7.0.0", "process-warning": "^5.0.0", "quick-format-unescaped": "^4.0.3", "real-require": "^0.2.0", "safe-stable-stringify": "^2.3.1", "sonic-boom": "^4.0.1", "thread-stream": "^3.0.0" }, "bin": { "pino": "bin.js" } }, "sha512-8OEwKp5juEvb/MjpIc4hjqfgCNysrS94RIOMXYvpYCdm/jglrKEiAYmiumbmGhCvs+IcInsphYDFwqrjr7398w=="],
60
287
 
61
288
  "pino-abstract-transport": ["pino-abstract-transport@2.0.0", "", { "dependencies": { "split2": "^4.0.0" } }, "sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw=="],
@@ -64,18 +291,36 @@
64
291
 
65
292
  "pino-std-serializers": ["pino-std-serializers@7.1.0", "", {}, "sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw=="],
66
293
 
294
+ "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="],
295
+
67
296
  "process-warning": ["process-warning@5.0.0", "", {}, "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA=="],
68
297
 
69
298
  "pump": ["pump@3.0.4", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA=="],
70
299
 
300
+ "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="],
301
+
302
+ "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="],
303
+
71
304
  "quick-format-unescaped": ["quick-format-unescaped@4.0.4", "", {}, "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg=="],
72
305
 
73
306
  "real-require": ["real-require@0.2.0", "", {}, "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg=="],
74
307
 
308
+ "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="],
309
+
310
+ "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="],
311
+
75
312
  "safe-stable-stringify": ["safe-stable-stringify@2.5.0", "", {}, "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA=="],
76
313
 
77
314
  "secure-json-parse": ["secure-json-parse@4.1.0", "", {}, "sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA=="],
78
315
 
316
+ "semver": ["semver@7.8.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg=="],
317
+
318
+ "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="],
319
+
320
+ "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="],
321
+
322
+ "smol-toml": ["smol-toml@1.6.1", "", {}, "sha512-dWUG8F5sIIARXih1DTaQAX4SsiTXhInKf1buxdY9DIg4ZYPZK5nGM1VRIYmEbDbsHt7USo99xSLFu5Q1IqTmsg=="],
323
+
79
324
  "sonic-boom": ["sonic-boom@4.2.1", "", { "dependencies": { "atomic-sleep": "^1.0.0" } }, "sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q=="],
80
325
 
81
326
  "split2": ["split2@4.2.0", "", {}, "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg=="],
@@ -84,18 +329,52 @@
84
329
 
85
330
  "thread-stream": ["thread-stream@3.1.0", "", { "dependencies": { "real-require": "^0.2.0" } }, "sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A=="],
86
331
 
332
+ "tinyglobby": ["tinyglobby@0.2.16", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg=="],
333
+
334
+ "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="],
335
+
336
+ "ts-api-utils": ["ts-api-utils@2.5.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA=="],
337
+
338
+ "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
339
+
340
+ "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="],
341
+
87
342
  "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
88
343
 
344
+ "typescript-eslint": ["typescript-eslint@8.58.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.58.0", "@typescript-eslint/parser": "8.58.0", "@typescript-eslint/typescript-estree": "8.58.0", "@typescript-eslint/utils": "8.58.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-e2TQzKfaI85fO+F3QywtX+tCTsu/D3WW5LVU6nz8hTFKFZ8yBJ6mSYRpXqdR3mFjPWmO0eWsTa5f+UpAOe/FMA=="],
345
+
346
+ "unbash": ["unbash@2.2.0", "", {}, "sha512-X2wH19RAPZE3+ldGicOkoj/SIA83OIxcJ6Cuaw23hf8Xc6fQpvZXY0SftE2JgS0QhYLUG4uwodSI3R53keyh7w=="],
347
+
89
348
  "undici-types": ["undici-types@7.19.2", "", {}, "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg=="],
90
349
 
350
+ "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="],
351
+
352
+ "walk-up-path": ["walk-up-path@4.0.0", "", {}, "sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A=="],
353
+
354
+ "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
355
+
356
+ "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="],
357
+
91
358
  "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="],
92
359
 
360
+ "yaml": ["yaml@2.9.0", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA=="],
361
+
362
+ "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="],
363
+
93
364
  "zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="],
94
365
 
366
+ "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="],
367
+
368
+ "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="],
369
+
95
370
  "@vellumai/service-contracts/@types/bun": ["@types/bun@1.2.4", "", { "dependencies": { "bun-types": "1.2.4" } }, "sha512-QtuV5OMR8/rdKJs213iwXDpfVvnskPXY/S0ZiFbsTjQZycuqPbMW8Gf/XhLfwE5njW8sxI2WjISURXPlHypMFA=="],
96
371
 
97
372
  "@vellumai/service-contracts/typescript": ["typescript@5.7.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw=="],
98
373
 
374
+ "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
375
+
376
+ "micromatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="],
377
+
99
378
  "pino-pretty/pino-abstract-transport": ["pino-abstract-transport@3.0.0", "", { "dependencies": { "split2": "^4.0.0" } }, "sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg=="],
100
379
 
101
380
  "@vellumai/service-contracts/@types/bun/bun-types": ["bun-types@1.2.4", "", { "dependencies": { "@types/node": "*", "@types/ws": "~8.5.10" } }, "sha512-nDPymR207ZZEoWD4AavvEaa/KZe/qlrbMSchqpQwovPZCKc7pwMoENjEtHgMKaAjJhy+x6vfqSBA1QU3bJgs0Q=="],
@@ -0,0 +1,23 @@
1
+ import { defineConfig, globalIgnores } from "eslint/config";
2
+ import tseslint from "typescript-eslint";
3
+
4
+ const eslintConfig = defineConfig([
5
+ ...tseslint.configs.recommended,
6
+ globalIgnores(["dist/**"]),
7
+ {
8
+ rules: {
9
+ "@typescript-eslint/no-unused-vars": [
10
+ "error",
11
+ { argsIgnorePattern: "^_", varsIgnorePattern: "^_" },
12
+ ],
13
+ },
14
+ },
15
+ {
16
+ files: ["src/__tests__/**"],
17
+ rules: {
18
+ "@typescript-eslint/no-explicit-any": "off",
19
+ },
20
+ },
21
+ ]);
22
+
23
+ export default eslintConfig;
package/knip.json ADDED
@@ -0,0 +1,9 @@
1
+ {
2
+ "entry": ["src/**/*.test.ts", "src/**/__tests__/**/*.ts"],
3
+ "project": ["src/**/*.ts"],
4
+ "ignoreDependencies": [
5
+ "@vellumai/service-contracts",
6
+ "@vellumai/credential-storage",
7
+ "@vellumai/egress-proxy"
8
+ ]
9
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vellumai/credential-executor",
3
- "version": "0.8.3",
3
+ "version": "0.8.5",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "exports": {
@@ -14,6 +14,8 @@
14
14
  "scripts": {
15
15
  "dev": "bun run src/main.ts",
16
16
  "dev:managed": "CES_MODE=managed bun run src/managed-main.ts",
17
+ "lint": "eslint",
18
+ "lint:unused": "knip --include files,dependencies,unlisted",
17
19
  "typecheck": "bunx tsc --noEmit",
18
20
  "test": "bun test src/",
19
21
  "prepack": "node ../scripts/prepack-bundled-deps.mjs"
@@ -32,6 +34,9 @@
32
34
  ],
33
35
  "devDependencies": {
34
36
  "@types/bun": "1.3.10",
35
- "typescript": "5.9.3"
37
+ "eslint": "10.1.0",
38
+ "knip": "5.88.1",
39
+ "typescript": "5.9.3",
40
+ "typescript-eslint": "8.58.0"
36
41
  }
37
42
  }
@@ -35,9 +35,9 @@ const logErrorFn = mock((..._args: unknown[]): void => {});
35
35
  // All other node:fs exports are forwarded unchanged.
36
36
  // ---------------------------------------------------------------------------
37
37
 
38
- /* eslint-disable @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires */
38
+ /* eslint-disable @typescript-eslint/no-require-imports */
39
39
  const _realFs = require("node:fs");
40
- /* eslint-enable @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires */
40
+ /* eslint-enable @typescript-eslint/no-require-imports */
41
41
 
42
42
  mock.module("node:fs", () => {
43
43
  const proxy: Record<string, unknown> = {};
@@ -48,7 +48,7 @@ mock.module("node:fs", () => {
48
48
  // Override only the five functions the migration runner uses.
49
49
  // The proxy captures args as any[] and delegates to either our mocks or the
50
50
  // real fs. We cast through Function.apply to satisfy overloaded signatures.
51
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
51
+ // (no-explicit-any is already off for test files via eslint config.)
52
52
  type AnyFn = (...args: any[]) => any;
53
53
  proxy.existsSync = (...a: unknown[]) =>
54
54
  useMocks ? existsSyncFn(a[0] as string) : (_realFs.existsSync as AnyFn)(...a);
@@ -22,7 +22,6 @@ import { describe, expect, test, beforeEach, afterEach } from "bun:test";
22
22
  import {
23
23
  mkdirSync,
24
24
  writeFileSync,
25
- existsSync,
26
25
  readFileSync,
27
26
  rmSync,
28
27
  chmodSync,
@@ -333,16 +332,11 @@ describe("executeAuthenticatedCommand — bundle resolution", () => {
333
332
  test("rejects bundle with denied binary entrypoint at execution time", async () => {
334
333
  // This is a defense-in-depth test — the manifest validator should
335
334
  // catch this at publish time, but the executor also checks.
336
- const manifest = buildManifest({
337
- entrypoint: "bin/curl",
338
- bundleId: "curl-wrapper",
339
- });
340
-
341
- // We can't actually publish this because the validator will reject it.
342
- // Instead, we verify the executor's own check by using a non-denied
343
- // entrypoint that we manually modify after publication.
344
- // This test verifies the error path exists — the actual denied binary
345
- // list is tested exhaustively in command-validator.test.ts.
335
+ // We can't actually publish a denied-binary bundle because the
336
+ // validator rejects it, so we exercise the unresolved-digest path
337
+ // to verify the executor's own error surface exists. The denied
338
+ // binary list itself is tested exhaustively in
339
+ // command-validator.test.ts.
346
340
  const deps = buildDeps();
347
341
  const request: ExecuteCommandRequest = {
348
342
  bundleDigest: "a".repeat(64),
@@ -1115,7 +1109,6 @@ describe("executeAuthenticatedCommand — output copyback", () => {
1115
1109
  const result = await executeAuthenticatedCommand(request, deps);
1116
1110
 
1117
1111
  if (result.exitCode === 0) {
1118
- const expectedPath = join(testWorkspaceDir, "results/output.json");
1119
1112
  if (result.copybackResult) {
1120
1113
  // Check if the output was detected
1121
1114
  const outputResult = result.copybackResult.outputs[0];
@@ -235,7 +235,6 @@ describe("stageInputs", () => {
235
235
  secrets: new Set(),
236
236
  };
237
237
 
238
- let scratchDir: string | undefined;
239
238
  try {
240
239
  stageInputs(config);
241
240
  } catch {
@@ -42,7 +42,7 @@ import {
42
42
  import { PersistentGrantStore } from "../grants/persistent-store.js";
43
43
  import { TemporaryGrantStore } from "../grants/temporary-store.js";
44
44
  import { LocalMaterialiser } from "../materializers/local.js";
45
- import type { OAuthConnectionLookup, LocalSubjectResolverDeps } from "../subjects/local.js";
45
+ import type { OAuthConnectionLookup } from "../subjects/local.js";
46
46
  import { AuditStore } from "../audit/store.js";
47
47
 
48
48
  // ---------------------------------------------------------------------------
@@ -235,7 +235,7 @@ interface TestFixture {
235
235
  function createFixture(
236
236
  secretEntries: Record<string, string> = {},
237
237
  staticRecords: StaticCredentialRecord[] = [],
238
- oauthConnections: OAuthConnectionRecord[] = [],
238
+ _oauthConnections: OAuthConnectionRecord[] = [],
239
239
  ): TestFixture {
240
240
  const tmpDir = makeTmpDir();
241
241
  const persistentStore = new PersistentGrantStore(tmpDir);
@@ -253,8 +253,6 @@ function createFixture(
253
253
  });
254
254
  }
255
255
 
256
- const oauthLookup = createOAuthLookup(oauthConnections);
257
-
258
256
  const localMaterialiser = new LocalMaterialiser({
259
257
  secureKeyBackend: backend,
260
258
  });
@@ -297,7 +295,6 @@ describe("HTTP executor: local static secrets", () => {
297
295
  let fixture: TestFixture;
298
296
 
299
297
  beforeEach(() => {
300
- const handle = localStaticHandle("github", "api_key");
301
298
  const storageKey = credentialKey("github", "api_key");
302
299
  fixture = createFixture(
303
300
  { [storageKey]: "ghp_testtoken_12345678" },
@@ -1186,8 +1183,6 @@ describe("HTTP executor: audit summary integrity", () => {
1186
1183
  });
1187
1184
 
1188
1185
  test("audit ID is returned on materialisation failure", async () => {
1189
- const handle = localStaticHandle("github", "api_key");
1190
-
1191
1186
  // Grant exists but we'll break materialisation by using a handle that
1192
1187
  // won't resolve (wrong service)
1193
1188
  const badHandle = localStaticHandle("nonexistent", "key");
@@ -18,10 +18,10 @@
18
18
  */
19
19
 
20
20
  import { afterEach, describe, expect, test } from "bun:test";
21
- import { mkdirSync, mkdtempSync, rmSync } from "node:fs";
21
+ import { mkdirSync, mkdtempSync, rmSync, unlinkSync } from "node:fs";
22
22
  import { tmpdir } from "node:os";
23
23
  import { join } from "node:path";
24
- import { createConnection, type Socket } from "node:net";
24
+ import { createConnection, createServer as createNetServer, type Socket } from "node:net";
25
25
  import { Readable, Writable } from "node:stream";
26
26
 
27
27
  import {
@@ -37,13 +37,12 @@ import {
37
37
  } from "@vellumai/service-contracts/credential-rpc";
38
38
 
39
39
  import { PersistentGrantStore } from "../grants/persistent-store.js";
40
- import { TemporaryGrantStore } from "../grants/temporary-store.js";
41
40
  import { AuditStore } from "../audit/store.js";
42
41
  import {
43
42
  createListGrantsHandler,
44
43
  createListAuditRecordsHandler,
45
44
  } from "../grants/rpc-handlers.js";
46
- import { CesRpcServer, type RpcHandlerRegistry, type SessionIdRef } from "../server.js";
45
+ import { CesRpcServer, type RpcHandlerRegistry, type ServeEndReason, type SessionIdRef } from "../server.js";
47
46
  import { createLocalSecureKeyBackend } from "../materializers/local-secure-key-backend.js";
48
47
 
49
48
  // ---------------------------------------------------------------------------
@@ -159,12 +158,11 @@ function acceptOneConnection(socketPath: string, signal: AbortSignal): Promise<{
159
158
  socket: Socket;
160
159
  }> {
161
160
  return new Promise((resolve, reject) => {
162
- const { createServer: createNetServer } = require("node:net");
163
161
  const netServer = createNetServer();
164
162
 
165
163
  const cleanup = () => {
166
164
  netServer.close();
167
- try { require("node:fs").unlinkSync(socketPath); } catch { /* ok */ }
165
+ try { unlinkSync(socketPath); } catch { /* ok */ }
168
166
  };
169
167
 
170
168
  if (signal.aborted) {
@@ -188,7 +186,7 @@ function acceptOneConnection(socketPath: string, signal: AbortSignal): Promise<{
188
186
 
189
187
  netServer.on("connection", (sock: Socket) => {
190
188
  netServer.close();
191
- try { require("node:fs").unlinkSync(socketPath); } catch { /* ok */ }
189
+ try { unlinkSync(socketPath); } catch { /* ok */ }
192
190
 
193
191
  const readable = new Readable({ read() {} });
194
192
  const writable = new Writable({
@@ -356,9 +354,10 @@ describe("managed CES integration (real Unix socket)", () => {
356
354
  // -- Pick a free port for health server ------------------------------------
357
355
  // Use port 0 trick: bind, read the port, close, then use it.
358
356
  const healthPort = await new Promise<number>((resolve) => {
359
- const srv = require("node:net").createServer();
357
+ const srv = createNetServer();
360
358
  srv.listen(0, () => {
361
- const port = srv.address().port;
359
+ const address = srv.address();
360
+ const port = typeof address === "object" && address ? address.port : 0;
362
361
  srv.close(() => resolve(port));
363
362
  });
364
363
  });
@@ -681,7 +680,7 @@ describe("credential CRUD RPC", () => {
681
680
  */
682
681
  async function setupCredentialRpc(): Promise<{
683
682
  clientSock: Socket;
684
- servePromise: Promise<void>;
683
+ servePromise: Promise<ServeEndReason>;
685
684
  }> {
686
685
  savedEnv = saveEnv();
687
686
  tmpDir = mkdtempSync(join(tmpdir(), "ces-cred-integ-"));
@@ -19,13 +19,11 @@ import { platformOAuthHandle } from "@vellumai/service-contracts/credential-rpc"
19
19
  import {
20
20
  type ManagedSubject,
21
21
  resolveManagedSubject,
22
- SubjectResolutionError,
23
22
  type PlatformCatalogEntry,
24
23
  type ResolvedSubject,
25
24
  } from "../subjects/managed.js";
26
25
  import {
27
26
  materializeManagedToken,
28
- MaterializationError,
29
27
  type ManagedMaterializerOptions,
30
28
  } from "../materializers/managed-platform.js";
31
29
 
@@ -82,7 +80,7 @@ function createMockFetch(handlers: {
82
80
  error?: Error;
83
81
  };
84
82
  }): typeof globalThis.fetch {
85
- return (async (input: RequestInfo | URL, init?: RequestInit) => {
83
+ return (async (input: RequestInfo | URL, _init?: RequestInit) => {
86
84
  const url = typeof input === "string" ? input : input.toString();
87
85
 
88
86
  if (url.includes("/oauth/managed/catalog")) {
@@ -4,6 +4,7 @@ import {
4
4
  rmSync,
5
5
  existsSync,
6
6
  readFileSync,
7
+ readdirSync,
7
8
  writeFileSync,
8
9
  symlinkSync,
9
10
  } from "node:fs";
@@ -395,7 +396,6 @@ describe("publishBundle — digest mismatch rejection", () => {
395
396
 
396
397
  // Also check that no staging directories were left behind
397
398
  if (existsSync(toolstoreDir)) {
398
- const { readdirSync } = require("node:fs");
399
399
  const entries = readdirSync(toolstoreDir) as string[];
400
400
  const stagingDirs = entries.filter((e: string) =>
401
401
  e.startsWith(".staging-"),
@@ -160,7 +160,7 @@ describe("health probes", () => {
160
160
  expect(src).toMatch(/\/healthz/);
161
161
  expect(src).toMatch(/\/readyz/);
162
162
  // Health server uses Bun.serve on a dedicated port, not the socket
163
- expect(src).toMatch(/startHealthServer\(healthPort/);
163
+ expect(src).toMatch(/startHealthServer\(\s*healthPort/);
164
164
  });
165
165
 
166
166
  test("getHealthPort defaults to 8090", () => {
@@ -221,7 +221,7 @@ describe("local entrypoint transport isolation", () => {
221
221
  describe("CesRpcServer", () => {
222
222
  test("completes handshake with correct protocol version", async () => {
223
223
  const { server, handshake, input } = createTestServer();
224
- const servePromise = server.serve();
224
+ const _servePromise = server.serve();
225
225
 
226
226
  const ack = await handshake();
227
227
  expect(ack.type).toBe("handshake_ack");
@@ -237,7 +237,7 @@ describe("CesRpcServer", () => {
237
237
 
238
238
  test("rejects handshake with wrong protocol version", async () => {
239
239
  const { server, send, collectOutputLines, input } = createTestServer();
240
- const servePromise = server.serve();
240
+ const _servePromise = server.serve();
241
241
 
242
242
  send({
243
243
  type: "handshake_request",
@@ -259,7 +259,7 @@ describe("CesRpcServer", () => {
259
259
 
260
260
  test("rejects RPC before handshake", async () => {
261
261
  const { server, send, collectOutputLines, input } = createTestServer();
262
- const servePromise = server.serve();
262
+ const _servePromise = server.serve();
263
263
 
264
264
  send({
265
265
  type: "rpc",
@@ -283,13 +283,13 @@ describe("CesRpcServer", () => {
283
283
 
284
284
  test("dispatches RPC to registered handler", async () => {
285
285
  const handlers: RpcHandlerRegistry = {
286
- list_grants: async (req: unknown) => {
286
+ list_grants: async (_req: unknown) => {
287
287
  return { grants: [] };
288
288
  },
289
289
  };
290
290
 
291
291
  const { server, handshake, rpc, input } = createTestServer(handlers);
292
- const servePromise = server.serve();
292
+ const _servePromise = server.serve();
293
293
 
294
294
  await handshake();
295
295
 
@@ -304,7 +304,7 @@ describe("CesRpcServer", () => {
304
304
 
305
305
  test("returns METHOD_NOT_FOUND for unknown methods", async () => {
306
306
  const { server, handshake, rpc, input } = createTestServer();
307
- const servePromise = server.serve();
307
+ const _servePromise = server.serve();
308
308
 
309
309
  await handshake();
310
310
 
@@ -326,7 +326,7 @@ describe("CesRpcServer", () => {
326
326
  };
327
327
 
328
328
  const { server, handshake, rpc, input } = createTestServer(handlers);
329
- const servePromise = server.serve();
329
+ const _servePromise = server.serve();
330
330
 
331
331
  await handshake();
332
332
 
@@ -22,7 +22,10 @@ import { createServer as createNetServer, type Socket } from "node:net";
22
22
  import { dirname, join } from "node:path";
23
23
  import { Readable, Writable } from "node:stream";
24
24
 
25
- import { CES_PROTOCOL_VERSION, CesRpcMethod } from "@vellumai/service-contracts/credential-rpc";
25
+ import {
26
+ CES_PROTOCOL_VERSION,
27
+ CesRpcMethod,
28
+ } from "@vellumai/service-contracts/credential-rpc";
26
29
 
27
30
  import { AuditStore } from "./audit/store.js";
28
31
  import { PersistentGrantStore } from "./grants/persistent-store.js";
@@ -51,17 +54,32 @@ import {
51
54
  type RpcHandlerRegistry,
52
55
  type SessionIdRef,
53
56
  } from "./server.js";
54
- import { deleteBundleFromToolstore, publishBundle } from "./toolstore/publish.js";
57
+ import {
58
+ deleteBundleFromToolstore,
59
+ publishBundle,
60
+ } from "./toolstore/publish.js";
55
61
  import { validateSourceUrl } from "./toolstore/manifest.js";
56
62
  import { buildCesEgressHooks } from "./commands/egress-hooks.js";
57
63
  import { resolveManagedSubject } from "./subjects/managed.js";
58
64
  import { materializeManagedToken } from "./materializers/managed-platform.js";
59
- import { HandleType, parseHandle } from "@vellumai/service-contracts/credential-rpc";
60
- import { buildLazyGetters, type ApiKeyRef, type AssistantIdRef } from "./managed-lazy-getters.js";
65
+ import {
66
+ HandleType,
67
+ parseHandle,
68
+ } from "@vellumai/service-contracts/credential-rpc";
69
+ import {
70
+ buildLazyGetters,
71
+ type ApiKeyRef,
72
+ type AssistantIdRef,
73
+ } from "./managed-lazy-getters.js";
61
74
  import { MANAGED_LOCAL_STATIC_REJECTION_ERROR } from "./managed-errors.js";
62
75
  import type { SecureKeyBackend } from "@vellumai/credential-storage";
63
76
  import { createLocalSecureKeyBackend } from "./materializers/local-secure-key-backend.js";
64
- import { handleCredentialRoute, type CredentialRouteDeps } from "./http/credential-routes.js";
77
+ import type { LocalMaterialiser } from "./materializers/local.js";
78
+ import type { LocalSubjectResolverDeps } from "./subjects/local.js";
79
+ import {
80
+ handleCredentialRoute,
81
+ type CredentialRouteDeps,
82
+ } from "./http/credential-routes.js";
65
83
  import { handleLogExportRoute } from "./http/log-export-routes.js";
66
84
  import { CES_MIGRATIONS } from "./migrations/registry.js";
67
85
  import { runCesMigrations } from "./migrations/runner.js";
@@ -95,7 +113,12 @@ function ensureDataDirs(): void {
95
113
  // Build RPC handler registry (managed mode)
96
114
  // ---------------------------------------------------------------------------
97
115
 
98
- function buildHandlers(sessionIdRef: SessionIdRef, apiKeyRef: ApiKeyRef, assistantIdRef: AssistantIdRef, secureKeyBackend: SecureKeyBackend): RpcHandlerRegistry {
116
+ function buildHandlers(
117
+ sessionIdRef: SessionIdRef,
118
+ apiKeyRef: ApiKeyRef,
119
+ assistantIdRef: AssistantIdRef,
120
+ secureKeyBackend: SecureKeyBackend,
121
+ ): RpcHandlerRegistry {
99
122
  // -- Grant stores ----------------------------------------------------------
100
123
  const persistentGrantStore = new PersistentGrantStore(
101
124
  getCesGrantsDir("managed"),
@@ -117,13 +140,15 @@ function buildHandlers(sessionIdRef: SessionIdRef, apiKeyRef: ApiKeyRef, assista
117
140
  // though handlers are built before the handshake completes.
118
141
  const platformBaseUrl = process.env["VELLUM_PLATFORM_URL"] ?? "";
119
142
 
120
- const { getAssistantApiKey, getManagedSubjectOptions, getManagedMaterializerOptions } =
121
- buildLazyGetters({
122
- platformBaseUrl,
123
- assistantIdRef,
124
- apiKeyRef,
125
- envApiKey: process.env["ASSISTANT_API_KEY"] || "",
126
- });
143
+ const {
144
+ getManagedSubjectOptions,
145
+ getManagedMaterializerOptions,
146
+ } = buildLazyGetters({
147
+ platformBaseUrl,
148
+ assistantIdRef,
149
+ apiKeyRef,
150
+ envApiKey: process.env["ASSISTANT_API_KEY"] || "",
151
+ });
127
152
 
128
153
  if (!platformBaseUrl) {
129
154
  log.warn(
@@ -135,11 +160,13 @@ function buildHandlers(sessionIdRef: SessionIdRef, apiKeyRef: ApiKeyRef, assista
135
160
  // -- Workspace root for command execution cwd ------------------------------
136
161
  // Use VELLUM_WORKSPACE_DIR when set, otherwise fall back to the legacy
137
162
  // path derived from the assistant data mount.
138
- const defaultWorkspaceDir = process.env["VELLUM_WORKSPACE_DIR"] ?? (() => {
139
- const assistantDataMount =
140
- process.env["CES_ASSISTANT_DATA_MOUNT"] ?? "/assistant-data-ro";
141
- return join(join(assistantDataMount, ".vellum"), "workspace");
142
- })();
163
+ const defaultWorkspaceDir =
164
+ process.env["VELLUM_WORKSPACE_DIR"] ??
165
+ (() => {
166
+ const assistantDataMount =
167
+ process.env["CES_ASSISTANT_DATA_MOUNT"] ?? "/assistant-data-ro";
168
+ return join(join(assistantDataMount, ".vellum"), "workspace");
169
+ })();
143
170
 
144
171
  // -- Build handler registry ------------------------------------------------
145
172
  // NOTE: local_static credential handles are NOT supported in managed mode.
@@ -161,8 +188,8 @@ function buildHandlers(sessionIdRef: SessionIdRef, apiKeyRef: ApiKeyRef, assista
161
188
  }),
162
189
  };
163
190
 
164
- const localSubjectDepsStub = {
165
- metadataStore: { getById: () => undefined, list: () => [] } as any,
191
+ const localSubjectDepsStub: LocalSubjectResolverDeps = {
192
+ metadataStore: { getById: () => undefined, list: () => [] } as unknown as LocalSubjectResolverDeps["metadataStore"],
166
193
  oauthConnections: { getById: () => undefined },
167
194
  };
168
195
 
@@ -171,10 +198,14 @@ function buildHandlers(sessionIdRef: SessionIdRef, apiKeyRef: ApiKeyRef, assista
171
198
  const httpDeps = {
172
199
  persistentGrantStore,
173
200
  temporaryGrantStore,
174
- localMaterialiser: localMaterialiserStub as any,
201
+ localMaterialiser: localMaterialiserStub as unknown as LocalMaterialiser,
175
202
  localSubjectDeps: localSubjectDepsStub,
176
- get managedSubjectOptions() { return getManagedSubjectOptions(); },
177
- get managedMaterializerOptions() { return getManagedMaterializerOptions(); },
203
+ get managedSubjectOptions() {
204
+ return getManagedSubjectOptions();
205
+ },
206
+ get managedMaterializerOptions() {
207
+ return getManagedMaterializerOptions();
208
+ },
178
209
  auditStore,
179
210
  sessionId: sessionIdRef,
180
211
  };
@@ -215,10 +246,7 @@ function buildHandlers(sessionIdRef: SessionIdRef, apiKeyRef: ApiKeyRef, assista
215
246
  };
216
247
  }
217
248
 
218
- const subjectResult = await resolveManagedSubject(
219
- handle,
220
- subOpts,
221
- );
249
+ const subjectResult = await resolveManagedSubject(handle, subOpts);
222
250
  if (!subjectResult.ok) {
223
251
  return { ok: false as const, error: subjectResult.error.message };
224
252
  }
@@ -241,7 +269,8 @@ function buildHandlers(sessionIdRef: SessionIdRef, apiKeyRef: ApiKeyRef, assista
241
269
  default:
242
270
  return {
243
271
  ok: false as const,
244
- error: `Handle type "${parseResult.handle.type}" is not supported in managed mode. ` +
272
+ error:
273
+ `Handle type "${parseResult.handle.type}" is not supported in managed mode. ` +
245
274
  `Supported types: platform_oauth.`,
246
275
  };
247
276
  }
@@ -255,7 +284,15 @@ function buildHandlers(sessionIdRef: SessionIdRef, apiKeyRef: ApiKeyRef, assista
255
284
  });
256
285
 
257
286
  // Register manage_secure_command_tool handler
258
- const toolRegistry = new Map<string, { toolName: string; credentialHandle: string; description: string; bundleDigest: string }>();
287
+ const toolRegistry = new Map<
288
+ string,
289
+ {
290
+ toolName: string;
291
+ credentialHandle: string;
292
+ description: string;
293
+ bundleDigest: string;
294
+ }
295
+ >();
259
296
 
260
297
  registerManageSecureCommandToolHandler(handlers, {
261
298
  downloadBundle: async (sourceUrl: string) => {
@@ -264,13 +301,17 @@ function buildHandlers(sessionIdRef: SessionIdRef, apiKeyRef: ApiKeyRef, assista
264
301
  throw new Error(urlError);
265
302
  }
266
303
  const MAX_BUNDLE_SIZE = 100 * 1024 * 1024; // 100 MB
267
- const resp = await fetch(sourceUrl, { signal: AbortSignal.timeout(60_000) });
304
+ const resp = await fetch(sourceUrl, {
305
+ signal: AbortSignal.timeout(60_000),
306
+ });
268
307
  if (!resp.ok) {
269
308
  throw new Error(`HTTP ${resp.status}: ${resp.statusText}`);
270
309
  }
271
310
  const contentLength = resp.headers.get("content-length");
272
311
  if (contentLength && parseInt(contentLength, 10) > MAX_BUNDLE_SIZE) {
273
- throw new Error(`Bundle too large: ${contentLength} bytes (max ${MAX_BUNDLE_SIZE})`);
312
+ throw new Error(
313
+ `Bundle too large: ${contentLength} bytes (max ${MAX_BUNDLE_SIZE})`,
314
+ );
274
315
  }
275
316
  // Stream the body and enforce the size limit on actual bytes received,
276
317
  // since Content-Length can be absent (chunked encoding) or lie.
@@ -283,18 +324,23 @@ function buildHandlers(sessionIdRef: SessionIdRef, apiKeyRef: ApiKeyRef, assista
283
324
  for await (const chunk of body) {
284
325
  totalBytes += chunk.byteLength;
285
326
  if (totalBytes > MAX_BUNDLE_SIZE) {
286
- throw new Error(`Bundle too large: received >${MAX_BUNDLE_SIZE} bytes (max ${MAX_BUNDLE_SIZE})`);
327
+ throw new Error(
328
+ `Bundle too large: received >${MAX_BUNDLE_SIZE} bytes (max ${MAX_BUNDLE_SIZE})`,
329
+ );
287
330
  }
288
331
  chunks.push(chunk);
289
332
  }
290
333
  return Buffer.concat(chunks);
291
334
  },
292
- publishBundle: (request) => publishBundle({ ...request, cesMode: "managed" }),
335
+ publishBundle: (request) =>
336
+ publishBundle({ ...request, cesMode: "managed" }),
293
337
  unregisterTool: (toolName: string) => {
294
338
  const entry = toolRegistry.get(toolName);
295
339
  const removed = toolRegistry.delete(toolName);
296
340
  if (removed && entry?.bundleDigest) {
297
- const stillInUse = Array.from(toolRegistry.values()).some(t => t.bundleDigest === entry.bundleDigest);
341
+ const stillInUse = Array.from(toolRegistry.values()).some(
342
+ (t) => t.bundleDigest === entry.bundleDigest,
343
+ );
298
344
  if (!stillInUse) {
299
345
  deleteBundleFromToolstore(entry.bundleDigest, "managed");
300
346
  }
@@ -310,50 +356,57 @@ function buildHandlers(sessionIdRef: SessionIdRef, apiKeyRef: ApiKeyRef, assista
310
356
  handlers[CesRpcMethod.RecordGrant] = createRecordGrantHandler({
311
357
  persistentGrantStore,
312
358
  temporaryGrantStore,
313
- }) as typeof handlers[string];
359
+ }) as (typeof handlers)[string];
314
360
 
315
361
  handlers[CesRpcMethod.ListGrants] = createListGrantsHandler({
316
362
  persistentGrantStore,
317
- }) as typeof handlers[string];
363
+ }) as (typeof handlers)[string];
318
364
 
319
365
  handlers[CesRpcMethod.RevokeGrant] = createRevokeGrantHandler({
320
366
  persistentGrantStore,
321
- }) as typeof handlers[string];
367
+ }) as (typeof handlers)[string];
322
368
 
323
369
  // Register audit record handler
324
370
  handlers[CesRpcMethod.ListAuditRecords] = createListAuditRecordsHandler({
325
371
  auditStore,
326
- }) as typeof handlers[string];
372
+ }) as (typeof handlers)[string];
327
373
 
328
374
  // Register credential CRUD handlers
329
375
  handlers[CesRpcMethod.GetCredential] = (async (req: { account: string }) => {
330
376
  const value = await secureKeyBackend.get(req.account);
331
377
  return { found: value !== undefined, value };
332
- }) as typeof handlers[string];
378
+ }) as (typeof handlers)[string];
333
379
 
334
- handlers[CesRpcMethod.SetCredential] = (async (req: { account: string; value: string }) => {
380
+ handlers[CesRpcMethod.SetCredential] = (async (req: {
381
+ account: string;
382
+ value: string;
383
+ }) => {
335
384
  const ok = await secureKeyBackend.set(req.account, req.value);
336
385
  return { ok };
337
- }) as typeof handlers[string];
386
+ }) as (typeof handlers)[string];
338
387
 
339
- handlers[CesRpcMethod.DeleteCredential] = (async (req: { account: string }) => {
388
+ handlers[CesRpcMethod.DeleteCredential] = (async (req: {
389
+ account: string;
390
+ }) => {
340
391
  const result = await secureKeyBackend.delete(req.account);
341
392
  return { result };
342
- }) as typeof handlers[string];
393
+ }) as (typeof handlers)[string];
343
394
 
344
395
  handlers[CesRpcMethod.ListCredentials] = (async () => {
345
396
  const accounts = await secureKeyBackend.list();
346
397
  return { accounts };
347
- }) as typeof handlers[string];
398
+ }) as (typeof handlers)[string];
348
399
 
349
- handlers[CesRpcMethod.BulkSetCredentials] = (async (req: { credentials: Array<{ account: string; value: string }> }) => {
400
+ handlers[CesRpcMethod.BulkSetCredentials] = (async (req: {
401
+ credentials: Array<{ account: string; value: string }>;
402
+ }) => {
350
403
  const results = [];
351
404
  for (const { account, value } of req.credentials) {
352
405
  const ok = await secureKeyBackend.set(account, value);
353
406
  results.push({ account, ok });
354
407
  }
355
408
  return { results };
356
- }) as typeof handlers[string];
409
+ }) as (typeof handlers)[string];
357
410
 
358
411
  return handlers;
359
412
  }
@@ -374,10 +427,9 @@ function startHealthServer(
374
427
  async fetch(req) {
375
428
  const url = new URL(req.url);
376
429
  if (url.pathname === "/healthz") {
377
- return new Response(
378
- JSON.stringify({ status: "ok" }),
379
- { headers: { "Content-Type": "application/json" } },
380
- );
430
+ return new Response(JSON.stringify({ status: "ok" }), {
431
+ headers: { "Content-Type": "application/json" },
432
+ });
381
433
  }
382
434
  if (url.pathname === "/readyz") {
383
435
  // Always return 200 — pod readiness must not depend on whether the
@@ -386,32 +438,39 @@ function startHealthServer(
386
438
  // scheduling during dark-launch. The sidecar can't do useful work
387
439
  // without a connection anyway, so readiness is purely about the
388
440
  // process being up and able to accept a future connection.
389
- return new Response(
390
- JSON.stringify({ status: "ok", rpcConnected }),
391
- {
392
- status: 200,
393
- headers: { "Content-Type": "application/json" },
394
- },
395
- );
441
+ return new Response(JSON.stringify({ status: "ok", rpcConnected }), {
442
+ status: 200,
443
+ headers: { "Content-Type": "application/json" },
444
+ });
396
445
  }
397
446
 
398
447
  // Credential CRUD routes (only if service token is configured)
399
448
  if (credentialDeps) {
400
- const credentialResponse = await handleCredentialRoute(req, credentialDeps);
449
+ const credentialResponse = await handleCredentialRoute(
450
+ req,
451
+ credentialDeps,
452
+ );
401
453
  if (credentialResponse) return credentialResponse;
402
454
  }
403
455
 
404
456
  // Log export route
405
- const logExportResponse = await handleLogExportRoute(req, getCesLogDir("managed"));
457
+ const logExportResponse = await handleLogExportRoute(
458
+ req,
459
+ getCesLogDir("managed"),
460
+ );
406
461
  if (logExportResponse) return logExportResponse;
407
462
 
408
463
  return new Response("Not Found", { status: 404 });
409
464
  },
410
465
  });
411
466
 
412
- signal.addEventListener("abort", () => {
413
- server.stop(true);
414
- }, { once: true });
467
+ signal.addEventListener(
468
+ "abort",
469
+ () => {
470
+ server.stop(true);
471
+ },
472
+ { once: true },
473
+ );
415
474
 
416
475
  return server;
417
476
  }
@@ -456,10 +515,14 @@ function acceptOneConnection(
456
515
  return;
457
516
  }
458
517
 
459
- signal.addEventListener("abort", () => {
460
- cleanup();
461
- reject(new Error("Aborted while waiting for connection"));
462
- }, { once: true });
518
+ signal.addEventListener(
519
+ "abort",
520
+ () => {
521
+ cleanup();
522
+ reject(new Error("Aborted while waiting for connection"));
523
+ },
524
+ { once: true },
525
+ );
463
526
 
464
527
  netServer.on("error", (err) => {
465
528
  cleanup();
@@ -529,13 +592,22 @@ async function main(): Promise<void> {
529
592
 
530
593
  const controller = new AbortController();
531
594
 
532
- // Graceful shutdown
533
- const shutdown = () => {
534
- log.info("Shutting down...");
535
- controller.abort();
536
- };
537
- process.on("SIGTERM", shutdown);
538
- process.on("SIGINT", shutdown);
595
+ // Graceful shutdown — pass the signal as the abort reason so consumers
596
+ // of controller.signal can inspect signal.reason for triage.
597
+ process.on("SIGTERM", () => {
598
+ log.warn(
599
+ { signal: "SIGTERM", pid: process.pid, uptime: process.uptime() },
600
+ "Received SIGTERM — shutting down",
601
+ );
602
+ controller.abort("SIGTERM");
603
+ });
604
+ process.on("SIGINT", () => {
605
+ log.warn(
606
+ { signal: "SIGINT", pid: process.pid, uptime: process.uptime() },
607
+ "Received SIGINT — shutting down",
608
+ );
609
+ controller.abort("SIGINT");
610
+ });
539
611
 
540
612
  // Create the secure key backend unconditionally — it's needed by both
541
613
  // HTTP credential routes (when CES_SERVICE_TOKEN is set) and RPC
@@ -546,7 +618,11 @@ async function main(): Promise<void> {
546
618
  const secureKeyBackend = createLocalSecureKeyBackend(vellumRoot);
547
619
 
548
620
  // Run one-time credential store migrations before accepting connections.
549
- await runCesMigrations(getCesDataRoot("managed"), secureKeyBackend, CES_MIGRATIONS);
621
+ await runCesMigrations(
622
+ getCesDataRoot("managed"),
623
+ secureKeyBackend,
624
+ CES_MIGRATIONS,
625
+ );
550
626
  log.info("CES managed startup: migrations complete");
551
627
 
552
628
  // Set up credential CRUD routes if a service token is configured.
@@ -565,9 +641,11 @@ async function main(): Promise<void> {
565
641
  );
566
642
  }
567
643
 
568
- // Start health server on dedicated port
644
+ // Start health server on dedicated port. The returned handle isn't
645
+ // needed because the server lifetime is bound to controller.signal,
646
+ // which fires on shutdown and triggers Bun.serve's stop().
569
647
  const healthPort = getHealthPort();
570
- const healthServer = startHealthServer(healthPort, controller.signal, credentialDeps);
648
+ startHealthServer(healthPort, controller.signal, credentialDeps);
571
649
  log.info(`Health server listening on port ${healthPort}`);
572
650
 
573
651
  // Wait for exactly one assistant connection on the bootstrap socket
@@ -593,7 +671,12 @@ async function main(): Promise<void> {
593
671
  const sessionIdRef: SessionIdRef = { current: `ces-managed-${Date.now()}` };
594
672
  const apiKeyRef: ApiKeyRef = { current: "" };
595
673
  const assistantIdRef: AssistantIdRef = { current: "" };
596
- const handlers = buildHandlers(sessionIdRef, apiKeyRef, assistantIdRef, secureKeyBackend);
674
+ const handlers = buildHandlers(
675
+ sessionIdRef,
676
+ apiKeyRef,
677
+ assistantIdRef,
678
+ secureKeyBackend,
679
+ );
597
680
 
598
681
  const rpcLog = getLogger("rpc");
599
682
  const server = new CesRpcServer({
@@ -627,11 +710,14 @@ async function main(): Promise<void> {
627
710
  },
628
711
  });
629
712
 
630
- await server.serve();
713
+ const endReason = await server.serve();
631
714
 
632
715
  rpcConnected = false;
633
- log.info("RPC session ended. Shutting down...");
634
- controller.abort();
716
+ log.warn(
717
+ { reason: endReason, uptime: process.uptime(), pid: process.pid },
718
+ "RPC session ended — shutting down",
719
+ );
720
+ controller.abort("rpc_session_ended");
635
721
  }
636
722
 
637
723
  main().catch((err) => {
package/src/server.ts CHANGED
@@ -94,6 +94,11 @@ export interface CesServerOptions {
94
94
  onApiKeyUpdate?: (assistantApiKey: string, assistantId?: string) => void;
95
95
  }
96
96
 
97
+ export type ServeEndReason =
98
+ | "input_stream_ended"
99
+ | "signal_aborted"
100
+ | "signal_aborted_before_start";
101
+
97
102
  // ---------------------------------------------------------------------------
98
103
  // Server implementation
99
104
  // ---------------------------------------------------------------------------
@@ -134,17 +139,17 @@ export class CesRpcServer {
134
139
  * Start serving. Returns a promise that resolves when the input stream
135
140
  * ends or the abort signal fires.
136
141
  */
137
- async serve(): Promise<void> {
138
- return new Promise<void>((resolve, reject) => {
142
+ async serve(): Promise<ServeEndReason> {
143
+ return new Promise<ServeEndReason>((resolve, reject) => {
139
144
  if (this.signal?.aborted) {
140
145
  this.close();
141
- resolve();
146
+ resolve("signal_aborted_before_start");
142
147
  return;
143
148
  }
144
149
 
145
150
  const onAbort = () => {
146
151
  this.close();
147
- resolve();
152
+ resolve("signal_aborted");
148
153
  };
149
154
 
150
155
  if (this.signal) {
@@ -162,7 +167,7 @@ export class CesRpcServer {
162
167
  this.signal.removeEventListener("abort", onAbort);
163
168
  }
164
169
  this.close();
165
- resolve();
170
+ resolve("input_stream_ended");
166
171
  });
167
172
 
168
173
  this.input.on("error", (err) => {
@@ -190,7 +195,7 @@ export class CesRpcServer {
190
195
  if (this.closed) return;
191
196
  this.closed = true;
192
197
  this.input.destroy();
193
- if (typeof (this.output as any).destroy === "function") {
198
+ if (typeof (this.output as { destroy?: () => void }).destroy === "function") {
194
199
  this.output.destroy();
195
200
  }
196
201
  }