@hypequery/cli 1.9.0 → 1.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,8 @@
1
1
  import { type PreparedProtocolDeploymentContract, type ProtocolDeploymentBundleManifest, type ProtocolDeploymentContract } from '@hypequery/protocol';
2
- export declare const DEPLOYMENT_BUNDLE_MANIFEST = "bundle.json";
3
- export declare const DEPLOYMENT_BUNDLE_CONTRACT = "deployment.json";
2
+ import { DEPLOYMENT_BUNDLE_CONTRACT, DEPLOYMENT_BUNDLE_MANIFEST, verifyDeploymentBundle } from '@hypequery/deployment';
3
+ import type { VerifiedDeploymentBundle } from '@hypequery/deployment';
4
+ export { DEPLOYMENT_BUNDLE_CONTRACT, DEPLOYMENT_BUNDLE_MANIFEST, verifyDeploymentBundle, };
5
+ export type { VerifiedDeploymentBundle };
4
6
  export interface DeploymentBundleRuntimeFile {
5
7
  readonly runtime: 'node' | 'python';
6
8
  readonly sha256: string;
@@ -12,8 +14,6 @@ export interface WrittenDeploymentBundle {
12
14
  readonly identity: string;
13
15
  readonly contract: ProtocolDeploymentContract;
14
16
  }
15
- export type VerifiedDeploymentBundle = WrittenDeploymentBundle;
16
17
  export declare function writeDeploymentBundle(outputDirectory: string, prepared: PreparedProtocolDeploymentContract, runtimeFiles: readonly DeploymentBundleRuntimeFile[]): Promise<WrittenDeploymentBundle>;
17
18
  export declare function readDeploymentRuntimeFile(filePath: string): Promise<Uint8Array>;
18
- export declare function verifyDeploymentBundle(bundleDirectory: string): Promise<VerifiedDeploymentBundle>;
19
19
  //# sourceMappingURL=deployment-bundle.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"deployment-bundle.d.ts","sourceRoot":"","sources":["../../src/utils/deployment-bundle.ts"],"names":[],"mappings":"AAaA,OAAO,EAIL,KAAK,kCAAkC,EAEvC,KAAK,gCAAgC,EACrC,KAAK,0BAA0B,EAChC,MAAM,qBAAqB,CAAC;AAG7B,eAAO,MAAM,0BAA0B,gBAAgB,CAAC;AACxD,eAAO,MAAM,0BAA0B,oBAAoB,CAAC;AAE5D,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;CAC5B;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,gCAAgC,CAAC;IACpD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,0BAA0B,CAAC;CAC/C;AAED,MAAM,MAAM,wBAAwB,GAAG,uBAAuB,CAAC;AA+F/D,wBAAsB,qBAAqB,CACzC,eAAe,EAAE,MAAM,EACvB,QAAQ,EAAE,kCAAkC,EAC5C,YAAY,EAAE,SAAS,2BAA2B,EAAE,GACnD,OAAO,CAAC,uBAAuB,CAAC,CA6ElC;AAgDD,wBAAsB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAMrF;AA+FD,wBAAsB,sBAAsB,CAC1C,eAAe,EAAE,MAAM,GACtB,OAAO,CAAC,wBAAwB,CAAC,CA+DnC"}
1
+ {"version":3,"file":"deployment-bundle.d.ts","sourceRoot":"","sources":["../../src/utils/deployment-bundle.ts"],"names":[],"mappings":"AAYA,OAAO,EAGL,KAAK,kCAAkC,EACvC,KAAK,gCAAgC,EACrC,KAAK,0BAA0B,EAChC,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,0BAA0B,EAC1B,0BAA0B,EAC1B,sBAAsB,EACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAGtE,OAAO,EACL,0BAA0B,EAC1B,0BAA0B,EAC1B,sBAAsB,GACvB,CAAC;AACF,YAAY,EAAE,wBAAwB,EAAE,CAAC;AAEzC,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;CAC5B;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,gCAAgC,CAAC;IACpD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,0BAA0B,CAAC;CAC/C;AA+FD,wBAAsB,qBAAqB,CACzC,eAAe,EAAE,MAAM,EACvB,QAAQ,EAAE,kCAAkC,EAC5C,YAAY,EAAE,SAAS,2BAA2B,EAAE,GACnD,OAAO,CAAC,uBAAuB,CAAC,CA6ElC;AAoCD,wBAAsB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAMrF"}
@@ -1,11 +1,10 @@
1
1
  import { createHash, randomUUID } from 'node:crypto';
2
- import { constants, lstat, mkdir, mkdtemp, open, readdir, rename, rm, writeFile, } from 'node:fs/promises';
2
+ import { constants, lstat, mkdir, mkdtemp, open, rename, rm, writeFile, } from 'node:fs/promises';
3
3
  import path from 'node:path';
4
- import { DEFAULT_PROTOCOL_DEPLOYMENT_BUNDLE_LIMITS, prepareProtocolDeploymentBundleManifest, prepareProtocolDeploymentContract, } from '@hypequery/protocol';
4
+ import { DEFAULT_PROTOCOL_DEPLOYMENT_BUNDLE_LIMITS, prepareProtocolDeploymentBundleManifest, } from '@hypequery/protocol';
5
+ import { DEPLOYMENT_BUNDLE_CONTRACT, DEPLOYMENT_BUNDLE_MANIFEST, verifyDeploymentBundle, } from '@hypequery/deployment';
5
6
  import { logger } from './logger.js';
6
- export const DEPLOYMENT_BUNDLE_MANIFEST = 'bundle.json';
7
- export const DEPLOYMENT_BUNDLE_CONTRACT = 'deployment.json';
8
- const utf8Decoder = new TextDecoder('utf-8', { fatal: true });
7
+ export { DEPLOYMENT_BUNDLE_CONTRACT, DEPLOYMENT_BUNDLE_MANIFEST, verifyDeploymentBundle, };
9
8
  const utf8Encoder = new TextEncoder();
10
9
  function sha256(bytes) {
11
10
  return createHash('sha256').update(bytes).digest('hex');
@@ -185,138 +184,6 @@ async function readBoundedAbsoluteRegularFile(absolutePath, displayPath, maximum
185
184
  await handle?.close();
186
185
  }
187
186
  }
188
- async function readBoundedRegularFile(root, relativePath, maximum) {
189
- return readBoundedAbsoluteRegularFile(path.join(root, ...relativePath.split('/')), relativePath, maximum);
190
- }
191
187
  export async function readDeploymentRuntimeFile(filePath) {
192
188
  return readBoundedAbsoluteRegularFile(path.resolve(filePath), filePath, DEFAULT_PROTOCOL_DEPLOYMENT_BUNDLE_LIMITS.maxArtifactBytes);
193
189
  }
194
- function expectedDirectories(files) {
195
- const result = new Set();
196
- for (const file of files) {
197
- const segments = file.split('/');
198
- for (let index = 1; index < segments.length; index += 1) {
199
- result.add(segments.slice(0, index).join('/'));
200
- }
201
- }
202
- return result;
203
- }
204
- async function verifyExactEntries(root, manifest) {
205
- const expectedFiles = new Set([
206
- DEPLOYMENT_BUNDLE_MANIFEST,
207
- manifest.deployment.path,
208
- ...manifest.artifacts.map(artifact => artifact.path),
209
- ]);
210
- const expectedDirectoryPaths = expectedDirectories([...expectedFiles]);
211
- const seenFiles = new Set();
212
- const seenDirectories = new Set();
213
- async function visit(relativeDirectory) {
214
- const absoluteDirectory = relativeDirectory
215
- ? path.join(root, ...relativeDirectory.split('/'))
216
- : root;
217
- const names = await readdir(absoluteDirectory);
218
- names.sort();
219
- for (const name of names) {
220
- const relativePath = relativeDirectory ? `${relativeDirectory}/${name}` : name;
221
- const stat = await lstat(path.join(absoluteDirectory, name));
222
- if (stat.isSymbolicLink()) {
223
- throw new Error(`Bundle entries must not be symbolic links: ${relativePath}`);
224
- }
225
- if (stat.isDirectory()) {
226
- if (!expectedDirectoryPaths.has(relativePath)) {
227
- throw new Error(`Deployment bundle contains an undeclared directory: ${relativePath}`);
228
- }
229
- seenDirectories.add(relativePath);
230
- await visit(relativePath);
231
- }
232
- else if (stat.isFile()) {
233
- if (!expectedFiles.has(relativePath)) {
234
- throw new Error(`Deployment bundle contains an undeclared file: ${relativePath}`);
235
- }
236
- seenFiles.add(relativePath);
237
- }
238
- else {
239
- throw new Error(`Bundle entry is not a regular file or directory: ${relativePath}`);
240
- }
241
- }
242
- }
243
- await visit('');
244
- const missingFiles = [...expectedFiles].filter(file => !seenFiles.has(file)).sort();
245
- if (missingFiles.length > 0) {
246
- throw new Error(`Deployment bundle is missing files: ${missingFiles.join(', ')}`);
247
- }
248
- const missingDirectories = [...expectedDirectoryPaths]
249
- .filter(directory => !seenDirectories.has(directory))
250
- .sort();
251
- if (missingDirectories.length > 0) {
252
- throw new Error(`Deployment bundle is missing directories: ${missingDirectories.join(', ')}`);
253
- }
254
- }
255
- function verifyFile(bytes, file) {
256
- if (bytes.byteLength !== file.byteLength) {
257
- throw new Error(`Bundle entry byte length does not match the manifest: ${file.path}`);
258
- }
259
- if (sha256(bytes) !== file.sha256) {
260
- throw new Error(`Bundle entry SHA-256 does not match the manifest: ${file.path}`);
261
- }
262
- }
263
- function verifyRuntimeReferences(contract, artifacts) {
264
- requireClosedContractArtifactSet(contract);
265
- const declared = new Map(contract.artifacts.map(artifact => [artifact.artifactSha256, artifact.runtime]));
266
- if (declared.size !== artifacts.length) {
267
- throw new Error('Bundle runtime artifacts do not match the deployment contract.');
268
- }
269
- for (const artifact of artifacts) {
270
- if (declared.get(artifact.sha256) !== artifact.runtime) {
271
- throw new Error(`Bundle artifact ${artifact.sha256} does not match a deployment runtime reference.`);
272
- }
273
- }
274
- }
275
- export async function verifyDeploymentBundle(bundleDirectory) {
276
- const root = path.resolve(bundleDirectory);
277
- const rootStat = await lstat(root);
278
- if (rootStat.isSymbolicLink() || !rootStat.isDirectory()) {
279
- throw new Error(`Deployment bundle path must be a regular directory: ${bundleDirectory}`);
280
- }
281
- const manifestBytes = await readBoundedRegularFile(root, DEPLOYMENT_BUNDLE_MANIFEST, 1024 * 1024);
282
- let input;
283
- try {
284
- input = JSON.parse(utf8Decoder.decode(manifestBytes));
285
- }
286
- catch (error) {
287
- throw new Error(`Invalid deployment bundle manifest: ${path.join(root, DEPLOYMENT_BUNDLE_MANIFEST)}\n\n`
288
- + (error instanceof Error ? error.message : String(error)));
289
- }
290
- const preparedManifest = prepareProtocolDeploymentBundleManifest(input);
291
- const expectedManifestBytes = utf8Encoder.encode(`${preparedManifest.canonical}\n`);
292
- if (!Buffer.from(manifestBytes).equals(Buffer.from(expectedManifestBytes))) {
293
- throw new Error('Deployment bundle manifest must contain canonical JSON followed by one newline.');
294
- }
295
- await verifyExactEntries(root, preparedManifest.manifest);
296
- const deployment = preparedManifest.manifest.deployment;
297
- const deploymentBytes = await readBoundedRegularFile(root, deployment.path, DEFAULT_PROTOCOL_DEPLOYMENT_BUNDLE_LIMITS.maxDeploymentBytes);
298
- verifyFile(deploymentBytes, deployment);
299
- let contractInput;
300
- try {
301
- contractInput = JSON.parse(utf8Decoder.decode(deploymentBytes));
302
- }
303
- catch (error) {
304
- throw new Error(`Invalid deployment JSON in bundle: ${deployment.path}\n\n`
305
- + (error instanceof Error ? error.message : String(error)));
306
- }
307
- const preparedContract = prepareProtocolDeploymentContract(contractInput);
308
- if (preparedContract.identity !== deployment.identity) {
309
- throw new Error('Deployment identity does not match the bundle manifest.');
310
- }
311
- for (const artifact of preparedManifest.manifest.artifacts) {
312
- const bytes = await readBoundedRegularFile(root, artifact.path, DEFAULT_PROTOCOL_DEPLOYMENT_BUNDLE_LIMITS.maxArtifactBytes);
313
- verifyFile(bytes, artifact);
314
- }
315
- verifyRuntimeReferences(preparedContract.contract, preparedManifest.manifest.artifacts);
316
- return Object.freeze({
317
- directory: root,
318
- manifest: preparedManifest.manifest,
319
- identity: preparedManifest.identity,
320
- contract: preparedContract.contract,
321
- });
322
- }
@@ -1,19 +1,14 @@
1
1
  import type { ReadableStream } from 'node:stream/web';
2
2
  import { type PreparedProtocolDeploymentReleaseEnvelope } from '@hypequery/protocol';
3
3
  import { type VerifiedDeploymentBundle } from './deployment-bundle.js';
4
+ import type { DeploymentSubmissionResponse } from '@hypequery/deployment';
5
+ export type { DeploymentSubmissionResponse } from '@hypequery/deployment';
4
6
  export type DeploymentUploadErrorCode = 'HQ_UPLOAD_CONFIGURATION' | 'HQ_UPLOAD_IDENTITY_MISMATCH' | 'HQ_UPLOAD_BUNDLE_CHANGED' | 'HQ_UPLOAD_NETWORK' | 'HQ_UPLOAD_REJECTED' | 'HQ_UPLOAD_INVALID_RESPONSE';
5
7
  export declare class DeploymentUploadError extends Error {
6
8
  readonly code: DeploymentUploadErrorCode;
7
9
  readonly status?: number;
8
10
  constructor(code: DeploymentUploadErrorCode, message: string, status?: number);
9
11
  }
10
- export interface DeploymentSubmissionResponse {
11
- readonly kind: 'hypequery-deployment-submission';
12
- readonly version: 1;
13
- readonly status: 'accepted' | 'already-exists';
14
- readonly releaseIdentity: string;
15
- readonly bundleIdentity: string;
16
- }
17
12
  export interface DeploymentHttpResponse {
18
13
  readonly ok: boolean;
19
14
  readonly status: number;
@@ -1 +1 @@
1
- {"version":3,"file":"deployment-upload.d.ts","sourceRoot":"","sources":["../../src/utils/deployment-upload.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAIL,KAAK,yCAAyC,EAC/C,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAEL,KAAK,wBAAwB,EAC9B,MAAM,wBAAwB,CAAC;AAQhC,MAAM,MAAM,yBAAyB,GACjC,yBAAyB,GACzB,6BAA6B,GAC7B,0BAA0B,GAC1B,mBAAmB,GACnB,oBAAoB,GACpB,4BAA4B,CAAC;AAEjC,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,IAAI,EAAE,yBAAyB,CAAC;IACzC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;gBAEb,IAAI,EAAE,yBAAyB,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;CAM9E;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,IAAI,EAAE,iCAAiC,CAAC;IACjD,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,gBAAgB,CAAC;IAC/C,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;CAClD;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IACzC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;CAC9B;AAED,MAAM,MAAM,eAAe,GAAG,CAC5B,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,mBAAmB,KACtB,OAAO,CAAC,sBAAsB,CAAC,CAAC;AAErC,MAAM,WAAW,oCAAoC;IACnD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,eAAe,CAAC;CAClC;AAED,MAAM,WAAW,yBAAyB;IACxC,MAAM,CACJ,MAAM,EAAE,wBAAwB,EAChC,OAAO,EAAE,yCAAyC,GACjD,OAAO,CAAC,4BAA4B,CAAC,CAAC;CAC1C;AAmVD,wBAAgB,mCAAmC,CACjD,OAAO,EAAE,oCAAoC,GAC5C,yBAAyB,CAsF3B"}
1
+ {"version":3,"file":"deployment-upload.d.ts","sourceRoot":"","sources":["../../src/utils/deployment-upload.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAIL,KAAK,yCAAyC,EAC/C,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAEL,KAAK,wBAAwB,EAC9B,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AAE1E,YAAY,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AAQ1E,MAAM,MAAM,yBAAyB,GACjC,yBAAyB,GACzB,6BAA6B,GAC7B,0BAA0B,GAC1B,mBAAmB,GACnB,oBAAoB,GACpB,4BAA4B,CAAC;AAEjC,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,IAAI,EAAE,yBAAyB,CAAC;IACzC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;gBAEb,IAAI,EAAE,yBAAyB,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;CAM9E;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;CAClD;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IACzC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;CAC9B;AAED,MAAM,MAAM,eAAe,GAAG,CAC5B,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,mBAAmB,KACtB,OAAO,CAAC,sBAAsB,CAAC,CAAC;AAErC,MAAM,WAAW,oCAAoC;IACnD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,eAAe,CAAC;CAClC;AAED,MAAM,WAAW,yBAAyB;IACxC,MAAM,CACJ,MAAM,EAAE,wBAAwB,EAChC,OAAO,EAAE,yCAAyC,GACjD,OAAO,CAAC,4BAA4B,CAAC,CAAC;CAC1C;AAmVD,wBAAgB,mCAAmC,CACjD,OAAO,EAAE,oCAAoC,GAC5C,yBAAyB,CAsF3B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hypequery/cli",
3
- "version": "1.9.0",
3
+ "version": "1.9.1",
4
4
  "description": "Command-line interface for hypequery",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -19,7 +19,8 @@
19
19
  "open": "^10.0.0",
20
20
  "ora": "^8.0.1",
21
21
  "prompts": "^2.4.2",
22
- "@hypequery/protocol": "0.5.0"
22
+ "@hypequery/deployment": "0.2.0",
23
+ "@hypequery/protocol": "0.6.0"
23
24
  },
24
25
  "peerDependencies": {
25
26
  "@hypequery/clickhouse": "*",
@@ -37,7 +38,7 @@
37
38
  "typescript": "^5.7.3",
38
39
  "vitest": "^3.2.6",
39
40
  "@hypequery/clickhouse": "2.4.0",
40
- "@hypequery/serve": "0.13.2"
41
+ "@hypequery/serve": "0.13.3"
41
42
  },
42
43
  "repository": {
43
44
  "type": "git",