@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 +279 -0
- package/eslint.config.mjs +23 -0
- package/knip.json +9 -0
- package/package.json +7 -2
- package/src/__tests__/ces-migrations-runner.test.ts +3 -3
- package/src/__tests__/command-executor.test.ts +5 -12
- package/src/__tests__/command-workspace.test.ts +0 -1
- package/src/__tests__/http-executor.test.ts +2 -7
- package/src/__tests__/managed-integration.test.ts +9 -10
- package/src/__tests__/managed-materializers.test.ts +1 -3
- package/src/__tests__/toolstore.test.ts +1 -1
- package/src/__tests__/transport.test.ts +8 -8
- package/src/managed-main.ts +166 -80
- package/src/server.ts +11 -6
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
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vellumai/credential-executor",
|
|
3
|
-
"version": "0.8.
|
|
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
|
-
"
|
|
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
|
|
38
|
+
/* eslint-disable @typescript-eslint/no-require-imports */
|
|
39
39
|
const _realFs = require("node:fs");
|
|
40
|
-
/* eslint-enable @typescript-eslint/no-require-imports
|
|
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
|
-
//
|
|
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
|
-
|
|
337
|
-
|
|
338
|
-
|
|
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];
|
|
@@ -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
|
|
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
|
-
|
|
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 {
|
|
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 {
|
|
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 =
|
|
357
|
+
const srv = createNetServer();
|
|
360
358
|
srv.listen(0, () => {
|
|
361
|
-
const
|
|
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<
|
|
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,
|
|
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
|
|
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
|
|
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
|
|
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 (
|
|
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
|
|
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
|
|
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
|
|
329
|
+
const _servePromise = server.serve();
|
|
330
330
|
|
|
331
331
|
await handshake();
|
|
332
332
|
|
package/src/managed-main.ts
CHANGED
|
@@ -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 {
|
|
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 {
|
|
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 {
|
|
60
|
-
|
|
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 {
|
|
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(
|
|
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 {
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
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 =
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
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
|
|
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
|
|
201
|
+
localMaterialiser: localMaterialiserStub as unknown as LocalMaterialiser,
|
|
175
202
|
localSubjectDeps: localSubjectDepsStub,
|
|
176
|
-
get managedSubjectOptions() {
|
|
177
|
-
|
|
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:
|
|
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<
|
|
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, {
|
|
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(
|
|
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(
|
|
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) =>
|
|
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(
|
|
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: {
|
|
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: {
|
|
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: {
|
|
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
|
-
|
|
379
|
-
|
|
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
|
-
|
|
391
|
-
{
|
|
392
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
413
|
-
|
|
414
|
-
|
|
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(
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
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
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
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(
|
|
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
|
-
|
|
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(
|
|
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.
|
|
634
|
-
|
|
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<
|
|
138
|
-
return new Promise<
|
|
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
|
|
198
|
+
if (typeof (this.output as { destroy?: () => void }).destroy === "function") {
|
|
194
199
|
this.output.destroy();
|
|
195
200
|
}
|
|
196
201
|
}
|