@vm0/cli 9.244.8 → 9.245.0

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.
Files changed (100) hide show
  1. package/{agent-QLXX4WY7.js → agent-VZXA6XR3.js} +6 -5
  2. package/{agent-QLXX4WY7.js.map → agent-VZXA6XR3.js.map} +1 -1
  3. package/{banking-WY3J5BTJ.js → banking-QOV2GZE6.js} +4 -3
  4. package/{banking-WY3J5BTJ.js.map → banking-QOV2GZE6.js.map} +1 -1
  5. package/{chat-L3EFI2XJ.js → chat-7PONFLUP.js} +5 -4
  6. package/{chat-L3EFI2XJ.js.map → chat-7PONFLUP.js.map} +1 -1
  7. package/{chunk-MX32FFQR.js → chunk-5XVBOER3.js} +60 -506
  8. package/chunk-5XVBOER3.js.map +1 -0
  9. package/{chunk-65MTNZ44.js → chunk-6P7XBY46.js} +767 -1217
  10. package/chunk-6P7XBY46.js.map +1 -0
  11. package/{chunk-43PGP5OI.js → chunk-ARENVRJY.js} +4 -4
  12. package/{chunk-JVIFZRZ7.js → chunk-DE4HMRSU.js} +3 -3
  13. package/{chunk-TTP663DN.js → chunk-FVYB5CBP.js} +2 -2
  14. package/chunk-HOIDOML4.js +678 -0
  15. package/chunk-HOIDOML4.js.map +1 -0
  16. package/{chunk-KMLBXZVR.js → chunk-VN4PPSXU.js} +2 -2
  17. package/{chunk-MA37R4QS.js → chunk-XYZN3XWH.js} +3 -665
  18. package/chunk-XYZN3XWH.js.map +1 -0
  19. package/{chunk-LHR5Z775.js → chunk-YSVL5RAP.js} +2 -2
  20. package/{chunk-WCRXAO2G.js → chunk-ZXCF4ARW.js} +2 -2
  21. package/{computer-use-7FYLJXZS.js → computer-use-Y54YFGNC.js} +4 -3
  22. package/{computer-use-7FYLJXZS.js.map → computer-use-Y54YFGNC.js.map} +1 -1
  23. package/{connector-BSBQIFMQ.js → connector-2PAPMRZG.js} +7 -6
  24. package/{connector-BSBQIFMQ.js.map → connector-2PAPMRZG.js.map} +1 -1
  25. package/{credit-JBFJY5US.js → credit-PX6354BA.js} +5 -4
  26. package/{credit-JBFJY5US.js.map → credit-PX6354BA.js.map} +1 -1
  27. package/{developer-support-RUWSZBFP.js → developer-support-R5K6XKFG.js} +4 -3
  28. package/{developer-support-RUWSZBFP.js.map → developer-support-R5K6XKFG.js.map} +1 -1
  29. package/{doctor-YLD526OE.js → doctor-JNHZPFHW.js} +4 -3
  30. package/{doctor-YLD526OE.js.map → doctor-JNHZPFHW.js.map} +1 -1
  31. package/{generate-5EMJ3PE6.js → generate-TY4LZA3R.js} +10 -8
  32. package/{generate-5EMJ3PE6.js.map → generate-TY4LZA3R.js.map} +1 -1
  33. package/{github-36XCAIUP.js → github-UHTFPDZJ.js} +4 -3
  34. package/{github-36XCAIUP.js.map → github-UHTFPDZJ.js.map} +1 -1
  35. package/{goal-FRXLYRUG.js → goal-CKBOG76D.js} +4 -3
  36. package/{goal-FRXLYRUG.js.map → goal-CKBOG76D.js.map} +1 -1
  37. package/{host-X2KS3WTS.js → host-HAVFML26.js} +28 -7
  38. package/host-HAVFML26.js.map +1 -0
  39. package/index.js +4 -715
  40. package/index.js.map +1 -1
  41. package/{logs-WHQES7BY.js → logs-OXZZHIMA.js} +13 -14
  42. package/logs-OXZZHIMA.js.map +1 -0
  43. package/{mail-LOXCIZZN.js → mail-QCU47LFX.js} +6 -5
  44. package/{mail-LOXCIZZN.js.map → mail-QCU47LFX.js.map} +1 -1
  45. package/{maps-KQWCQLHW.js → maps-F3YPBNGC.js} +4 -3
  46. package/{maps-KQWCQLHW.js.map → maps-F3YPBNGC.js.map} +1 -1
  47. package/{model-2BBROTMX.js → model-5CYADUCZ.js} +5 -4
  48. package/{model-2BBROTMX.js.map → model-5CYADUCZ.js.map} +1 -1
  49. package/{model-provider-BOMTZ6JA.js → model-provider-676BK2JF.js} +5 -4
  50. package/{model-provider-BOMTZ6JA.js.map → model-provider-676BK2JF.js.map} +1 -1
  51. package/{org-SO7ELOV6.js → org-M637OTRU.js} +4 -3
  52. package/{org-SO7ELOV6.js.map → org-M637OTRU.js.map} +1 -1
  53. package/package.json +1 -1
  54. package/{phone-IYUG3RGY.js → phone-WBFLXP4V.js} +4 -3
  55. package/{phone-IYUG3RGY.js.map → phone-WBFLXP4V.js.map} +1 -1
  56. package/{preference-TGBWXIP7.js → preference-5AVRP7UU.js} +4 -3
  57. package/{preference-TGBWXIP7.js.map → preference-5AVRP7UU.js.map} +1 -1
  58. package/{resource-EA5OUVG4.js → resource-N6ADJPCL.js} +4 -3
  59. package/{resource-EA5OUVG4.js.map → resource-N6ADJPCL.js.map} +1 -1
  60. package/{scrape-2S3B33RA.js → scrape-XIJ5J6LW.js} +4 -3
  61. package/{scrape-2S3B33RA.js.map → scrape-XIJ5J6LW.js.map} +1 -1
  62. package/{search-LCGK3BJI.js → search-V2PWSYSL.js} +9 -10
  63. package/search-V2PWSYSL.js.map +1 -0
  64. package/{secret-M5C54VAT.js → secret-JLGGOPTX.js} +4 -3
  65. package/{secret-M5C54VAT.js.map → secret-JLGGOPTX.js.map} +1 -1
  66. package/{slack-FJV2NEOT.js → slack-QNQY6TVX.js} +4 -3
  67. package/{slack-FJV2NEOT.js.map → slack-QNQY6TVX.js.map} +1 -1
  68. package/{teams-XBLEN2XV.js → teams-QZZG5ERQ.js} +4 -3
  69. package/{teams-XBLEN2XV.js.map → teams-QZZG5ERQ.js.map} +1 -1
  70. package/{telegram-RE6IO7ZT.js → telegram-JEQYIW2X.js} +4 -3
  71. package/{telegram-RE6IO7ZT.js.map → telegram-JEQYIW2X.js.map} +1 -1
  72. package/{variable-5MVUR6U4.js → variable-LDKUIYU7.js} +4 -3
  73. package/{variable-5MVUR6U4.js.map → variable-LDKUIYU7.js.map} +1 -1
  74. package/{video-DIVG6CMM.js → video-D3AUHQL2.js} +6 -4
  75. package/{video-DIVG6CMM.js.map → video-D3AUHQL2.js.map} +1 -1
  76. package/{web-KVZL6WM4.js → web-MUTRFMMA.js} +7 -5
  77. package/{web-KVZL6WM4.js.map → web-MUTRFMMA.js.map} +1 -1
  78. package/{web-search-XNJH2FXZ.js → web-search-KBLKNBIF.js} +4 -3
  79. package/{web-search-XNJH2FXZ.js.map → web-search-KBLKNBIF.js.map} +1 -1
  80. package/{whoami-NQYYRWEE.js → whoami-POJMF7BB.js} +6 -5
  81. package/{whoami-NQYYRWEE.js.map → whoami-POJMF7BB.js.map} +1 -1
  82. package/{workflow-5CGPRRAY.js → workflow-GXTNSIWC.js} +4 -3
  83. package/{workflow-5CGPRRAY.js.map → workflow-GXTNSIWC.js.map} +1 -1
  84. package/zero.js +35 -35
  85. package/chunk-65MTNZ44.js.map +0 -1
  86. package/chunk-MA37R4QS.js.map +0 -1
  87. package/chunk-MPSVIFKZ.js +0 -240
  88. package/chunk-MPSVIFKZ.js.map +0 -1
  89. package/chunk-MX32FFQR.js.map +0 -1
  90. package/chunk-ZUSDQG2O.js +0 -50
  91. package/chunk-ZUSDQG2O.js.map +0 -1
  92. package/host-X2KS3WTS.js.map +0 -1
  93. package/logs-WHQES7BY.js.map +0 -1
  94. package/search-LCGK3BJI.js.map +0 -1
  95. /package/{chunk-43PGP5OI.js.map → chunk-ARENVRJY.js.map} +0 -0
  96. /package/{chunk-JVIFZRZ7.js.map → chunk-DE4HMRSU.js.map} +0 -0
  97. /package/{chunk-TTP663DN.js.map → chunk-FVYB5CBP.js.map} +0 -0
  98. /package/{chunk-KMLBXZVR.js.map → chunk-VN4PPSXU.js.map} +0 -0
  99. /package/{chunk-LHR5Z775.js.map → chunk-YSVL5RAP.js.map} +0 -0
  100. /package/{chunk-WCRXAO2G.js.map → chunk-ZXCF4ARW.js.map} +0 -0
@@ -6,13 +6,12 @@ import {
6
6
  } from "./chunk-DWWE7STW.js";
7
7
  import {
8
8
  authHeadersSchema,
9
- composeListItemSchema,
10
9
  connectorCatalogRefSchema,
11
- firewallPoliciesSchema,
12
- getEvents,
10
+ firewallsSchema,
13
11
  runnerGroupSchema,
12
+ searchZeroLogs,
14
13
  zeroAgentVisibilitySchema
15
- } from "./chunk-MX32FFQR.js";
14
+ } from "./chunk-5XVBOER3.js";
16
15
  import {
17
16
  apiErrorSchema,
18
17
  external_exports,
@@ -23,8 +22,12 @@ import {
23
22
  source_default,
24
23
  supportedRunModelSchema,
25
24
  upsertModelProviderRequestSchema,
26
- upsertModelProviderResponseSchema
27
- } from "./chunk-MA37R4QS.js";
25
+ upsertModelProviderResponseSchema,
26
+ withErrorHandler
27
+ } from "./chunk-XYZN3XWH.js";
28
+ import {
29
+ Command
30
+ } from "./chunk-B3W2RUBP.js";
28
31
  import {
29
32
  __commonJS,
30
33
  __require,
@@ -6955,14 +6958,14 @@ var require_parser = __commonJS({
6955
6958
  case "scalar":
6956
6959
  case "single-quoted-scalar":
6957
6960
  case "double-quoted-scalar": {
6958
- const fs2 = this.flowScalar(this.type);
6961
+ const fs = this.flowScalar(this.type);
6959
6962
  if (atNextItem || it.value) {
6960
- map.items.push({ start, key: fs2, sep: [] });
6963
+ map.items.push({ start, key: fs, sep: [] });
6961
6964
  this.onKeyLine = true;
6962
6965
  } else if (it.sep) {
6963
- this.stack.push(fs2);
6966
+ this.stack.push(fs);
6964
6967
  } else {
6965
- Object.assign(it, { key: fs2, sep: [] });
6968
+ Object.assign(it, { key: fs, sep: [] });
6966
6969
  this.onKeyLine = true;
6967
6970
  }
6968
6971
  return;
@@ -7090,13 +7093,13 @@ var require_parser = __commonJS({
7090
7093
  case "scalar":
7091
7094
  case "single-quoted-scalar":
7092
7095
  case "double-quoted-scalar": {
7093
- const fs2 = this.flowScalar(this.type);
7096
+ const fs = this.flowScalar(this.type);
7094
7097
  if (!it || it.value)
7095
- fc.items.push({ start: [], key: fs2, sep: [] });
7098
+ fc.items.push({ start: [], key: fs, sep: [] });
7096
7099
  else if (it.sep)
7097
- this.stack.push(fs2);
7100
+ this.stack.push(fs);
7098
7101
  else
7099
- Object.assign(it, { key: fs2, sep: [] });
7102
+ Object.assign(it, { key: fs, sep: [] });
7100
7103
  return;
7101
7104
  }
7102
7105
  case "flow-map-end":
@@ -7406,401 +7409,89 @@ var require_dist = __commonJS({
7406
7409
  }
7407
7410
  });
7408
7411
 
7409
- // ../../node_modules/.pnpm/dotenv@17.3.1/node_modules/dotenv/package.json
7410
- var require_package = __commonJS({
7411
- "../../node_modules/.pnpm/dotenv@17.3.1/node_modules/dotenv/package.json"(exports, module) {
7412
- module.exports = {
7413
- name: "dotenv",
7414
- version: "17.3.1",
7415
- description: "Loads environment variables from .env file",
7416
- main: "lib/main.js",
7417
- types: "lib/main.d.ts",
7418
- exports: {
7419
- ".": {
7420
- types: "./lib/main.d.ts",
7421
- require: "./lib/main.js",
7422
- default: "./lib/main.js"
7423
- },
7424
- "./config": "./config.js",
7425
- "./config.js": "./config.js",
7426
- "./lib/env-options": "./lib/env-options.js",
7427
- "./lib/env-options.js": "./lib/env-options.js",
7428
- "./lib/cli-options": "./lib/cli-options.js",
7429
- "./lib/cli-options.js": "./lib/cli-options.js",
7430
- "./package.json": "./package.json"
7431
- },
7432
- scripts: {
7433
- "dts-check": "tsc --project tests/types/tsconfig.json",
7434
- lint: "standard",
7435
- pretest: "npm run lint && npm run dts-check",
7436
- test: "tap run tests/**/*.js --allow-empty-coverage --disable-coverage --timeout=60000",
7437
- "test:coverage": "tap run tests/**/*.js --show-full-coverage --timeout=60000 --coverage-report=text --coverage-report=lcov",
7438
- prerelease: "npm test",
7439
- release: "standard-version"
7440
- },
7441
- repository: {
7442
- type: "git",
7443
- url: "git://github.com/motdotla/dotenv.git"
7444
- },
7445
- homepage: "https://github.com/motdotla/dotenv#readme",
7446
- funding: "https://dotenvx.com",
7447
- keywords: [
7448
- "dotenv",
7449
- "env",
7450
- ".env",
7451
- "environment",
7452
- "variables",
7453
- "config",
7454
- "settings"
7455
- ],
7456
- readmeFilename: "README.md",
7457
- license: "BSD-2-Clause",
7458
- devDependencies: {
7459
- "@types/node": "^18.11.3",
7460
- decache: "^4.6.2",
7461
- sinon: "^14.0.1",
7462
- standard: "^17.0.0",
7463
- "standard-version": "^9.5.0",
7464
- tap: "^19.2.0",
7465
- typescript: "^4.8.4"
7466
- },
7467
- engines: {
7468
- node: ">=12"
7469
- },
7470
- browser: {
7471
- fs: false
7472
- }
7473
- };
7474
- }
7475
- });
7476
-
7477
- // ../../node_modules/.pnpm/dotenv@17.3.1/node_modules/dotenv/lib/main.js
7478
- var require_main = __commonJS({
7479
- "../../node_modules/.pnpm/dotenv@17.3.1/node_modules/dotenv/lib/main.js"(exports, module) {
7480
- "use strict";
7481
- init_esm_shims();
7482
- var fs2 = __require("fs");
7483
- var path = __require("path");
7484
- var os = __require("os");
7485
- var crypto = __require("crypto");
7486
- var packageJson = require_package();
7487
- var version = packageJson.version;
7488
- var TIPS = [
7489
- "\u{1F510} encrypt with Dotenvx: https://dotenvx.com",
7490
- "\u{1F510} prevent committing .env to code: https://dotenvx.com/precommit",
7491
- "\u{1F510} prevent building .env in docker: https://dotenvx.com/prebuild",
7492
- "\u{1F916} agentic secret storage: https://dotenvx.com/as2",
7493
- "\u26A1\uFE0F secrets for agents: https://dotenvx.com/as2",
7494
- "\u{1F6E1}\uFE0F auth for agents: https://vestauth.com",
7495
- "\u{1F6E0}\uFE0F run anywhere with `dotenvx run -- yourcommand`",
7496
- "\u2699\uFE0F specify custom .env file path with { path: '/custom/path/.env' }",
7497
- "\u2699\uFE0F enable debug logging with { debug: true }",
7498
- "\u2699\uFE0F override existing env vars with { override: true }",
7499
- "\u2699\uFE0F suppress all logs with { quiet: true }",
7500
- "\u2699\uFE0F write to custom object with { processEnv: myObject }",
7501
- "\u2699\uFE0F load multiple .env files with { path: ['.env.local', '.env'] }"
7502
- ];
7503
- function _getRandomTip() {
7504
- return TIPS[Math.floor(Math.random() * TIPS.length)];
7505
- }
7506
- function parseBoolean(value) {
7507
- if (typeof value === "string") {
7508
- return !["false", "0", "no", "off", ""].includes(value.toLowerCase());
7509
- }
7510
- return Boolean(value);
7511
- }
7512
- function supportsAnsi() {
7513
- return process.stdout.isTTY;
7514
- }
7515
- function dim(text) {
7516
- return supportsAnsi() ? `\x1B[2m${text}\x1B[0m` : text;
7517
- }
7518
- var LINE = /(?:^|^)\s*(?:export\s+)?([\w.-]+)(?:\s*=\s*?|:\s+?)(\s*'(?:\\'|[^'])*'|\s*"(?:\\"|[^"])*"|\s*`(?:\\`|[^`])*`|[^#\r\n]+)?\s*(?:#.*)?(?:$|$)/mg;
7519
- function parse(src) {
7520
- const obj = {};
7521
- let lines = src.toString();
7522
- lines = lines.replace(/\r\n?/mg, "\n");
7523
- let match;
7524
- while ((match = LINE.exec(lines)) != null) {
7525
- const key = match[1];
7526
- let value = match[2] || "";
7527
- value = value.trim();
7528
- const maybeQuote = value[0];
7529
- value = value.replace(/^(['"`])([\s\S]*)\1$/mg, "$2");
7530
- if (maybeQuote === '"') {
7531
- value = value.replace(/\\n/g, "\n");
7532
- value = value.replace(/\\r/g, "\r");
7533
- }
7534
- obj[key] = value;
7535
- }
7536
- return obj;
7537
- }
7538
- function _parseVault(options) {
7539
- options = options || {};
7540
- const vaultPath = _vaultPath(options);
7541
- options.path = vaultPath;
7542
- const result = DotenvModule.configDotenv(options);
7543
- if (!result.parsed) {
7544
- const err = new Error(`MISSING_DATA: Cannot parse ${vaultPath} for an unknown reason`);
7545
- err.code = "MISSING_DATA";
7546
- throw err;
7547
- }
7548
- const keys = _dotenvKey(options).split(",");
7549
- const length = keys.length;
7550
- let decrypted;
7551
- for (let i = 0; i < length; i++) {
7552
- try {
7553
- const key = keys[i].trim();
7554
- const attrs = _instructions(result, key);
7555
- decrypted = DotenvModule.decrypt(attrs.ciphertext, attrs.key);
7556
- break;
7557
- } catch (error) {
7558
- if (i + 1 >= length) {
7559
- throw error;
7560
- }
7561
- }
7562
- }
7563
- return DotenvModule.parse(decrypted);
7564
- }
7565
- function _warn(message) {
7566
- console.error(`[dotenv@${version}][WARN] ${message}`);
7567
- }
7568
- function _debug(message) {
7569
- console.log(`[dotenv@${version}][DEBUG] ${message}`);
7570
- }
7571
- function _log(message) {
7572
- console.log(`[dotenv@${version}] ${message}`);
7573
- }
7574
- function _dotenvKey(options) {
7575
- if (options && options.DOTENV_KEY && options.DOTENV_KEY.length > 0) {
7576
- return options.DOTENV_KEY;
7577
- }
7578
- if (process.env.DOTENV_KEY && process.env.DOTENV_KEY.length > 0) {
7579
- return process.env.DOTENV_KEY;
7580
- }
7581
- return "";
7582
- }
7583
- function _instructions(result, dotenvKey) {
7584
- let uri;
7585
- try {
7586
- uri = new URL(dotenvKey);
7587
- } catch (error) {
7588
- if (error.code === "ERR_INVALID_URL") {
7589
- const err = new Error("INVALID_DOTENV_KEY: Wrong format. Must be in valid uri format like dotenv://:key_1234@dotenvx.com/vault/.env.vault?environment=development");
7590
- err.code = "INVALID_DOTENV_KEY";
7591
- throw err;
7592
- }
7593
- throw error;
7594
- }
7595
- const key = uri.password;
7596
- if (!key) {
7597
- const err = new Error("INVALID_DOTENV_KEY: Missing key part");
7598
- err.code = "INVALID_DOTENV_KEY";
7599
- throw err;
7600
- }
7601
- const environment = uri.searchParams.get("environment");
7602
- if (!environment) {
7603
- const err = new Error("INVALID_DOTENV_KEY: Missing environment part");
7604
- err.code = "INVALID_DOTENV_KEY";
7605
- throw err;
7606
- }
7607
- const environmentKey = `DOTENV_VAULT_${environment.toUpperCase()}`;
7608
- const ciphertext = result.parsed[environmentKey];
7609
- if (!ciphertext) {
7610
- const err = new Error(`NOT_FOUND_DOTENV_ENVIRONMENT: Cannot locate environment ${environmentKey} in your .env.vault file.`);
7611
- err.code = "NOT_FOUND_DOTENV_ENVIRONMENT";
7612
- throw err;
7613
- }
7614
- return { ciphertext, key };
7615
- }
7616
- function _vaultPath(options) {
7617
- let possibleVaultPath = null;
7618
- if (options && options.path && options.path.length > 0) {
7619
- if (Array.isArray(options.path)) {
7620
- for (const filepath of options.path) {
7621
- if (fs2.existsSync(filepath)) {
7622
- possibleVaultPath = filepath.endsWith(".vault") ? filepath : `${filepath}.vault`;
7623
- }
7624
- }
7625
- } else {
7626
- possibleVaultPath = options.path.endsWith(".vault") ? options.path : `${options.path}.vault`;
7627
- }
7628
- } else {
7629
- possibleVaultPath = path.resolve(process.cwd(), ".env.vault");
7630
- }
7631
- if (fs2.existsSync(possibleVaultPath)) {
7632
- return possibleVaultPath;
7633
- }
7634
- return null;
7635
- }
7636
- function _resolveHome(envPath) {
7637
- return envPath[0] === "~" ? path.join(os.homedir(), envPath.slice(1)) : envPath;
7638
- }
7639
- function _configVault(options) {
7640
- const debug = parseBoolean(process.env.DOTENV_CONFIG_DEBUG || options && options.debug);
7641
- const quiet = parseBoolean(process.env.DOTENV_CONFIG_QUIET || options && options.quiet);
7642
- if (debug || !quiet) {
7643
- _log("Loading env from encrypted .env.vault");
7644
- }
7645
- const parsed = DotenvModule._parseVault(options);
7646
- let processEnv = process.env;
7647
- if (options && options.processEnv != null) {
7648
- processEnv = options.processEnv;
7649
- }
7650
- DotenvModule.populate(processEnv, parsed, options);
7651
- return { parsed };
7652
- }
7653
- function configDotenv(options) {
7654
- const dotenvPath = path.resolve(process.cwd(), ".env");
7655
- let encoding = "utf8";
7656
- let processEnv = process.env;
7657
- if (options && options.processEnv != null) {
7658
- processEnv = options.processEnv;
7659
- }
7660
- let debug = parseBoolean(processEnv.DOTENV_CONFIG_DEBUG || options && options.debug);
7661
- let quiet = parseBoolean(processEnv.DOTENV_CONFIG_QUIET || options && options.quiet);
7662
- if (options && options.encoding) {
7663
- encoding = options.encoding;
7664
- } else {
7665
- if (debug) {
7666
- _debug("No encoding is specified. UTF-8 is used by default");
7667
- }
7668
- }
7669
- let optionPaths = [dotenvPath];
7670
- if (options && options.path) {
7671
- if (!Array.isArray(options.path)) {
7672
- optionPaths = [_resolveHome(options.path)];
7673
- } else {
7674
- optionPaths = [];
7675
- for (const filepath of options.path) {
7676
- optionPaths.push(_resolveHome(filepath));
7677
- }
7678
- }
7679
- }
7680
- let lastError;
7681
- const parsedAll = {};
7682
- for (const path2 of optionPaths) {
7683
- try {
7684
- const parsed = DotenvModule.parse(fs2.readFileSync(path2, { encoding }));
7685
- DotenvModule.populate(parsedAll, parsed, options);
7686
- } catch (e) {
7687
- if (debug) {
7688
- _debug(`Failed to load ${path2} ${e.message}`);
7689
- }
7690
- lastError = e;
7691
- }
7692
- }
7693
- const populated = DotenvModule.populate(processEnv, parsedAll, options);
7694
- debug = parseBoolean(processEnv.DOTENV_CONFIG_DEBUG || debug);
7695
- quiet = parseBoolean(processEnv.DOTENV_CONFIG_QUIET || quiet);
7696
- if (debug || !quiet) {
7697
- const keysCount = Object.keys(populated).length;
7698
- const shortPaths = [];
7699
- for (const filePath of optionPaths) {
7700
- try {
7701
- const relative = path.relative(process.cwd(), filePath);
7702
- shortPaths.push(relative);
7703
- } catch (e) {
7704
- if (debug) {
7705
- _debug(`Failed to load ${filePath} ${e.message}`);
7706
- }
7707
- lastError = e;
7708
- }
7709
- }
7710
- _log(`injecting env (${keysCount}) from ${shortPaths.join(",")} ${dim(`-- tip: ${_getRandomTip()}`)}`);
7711
- }
7712
- if (lastError) {
7713
- return { parsed: parsedAll, error: lastError };
7714
- } else {
7715
- return { parsed: parsedAll };
7716
- }
7717
- }
7718
- function config(options) {
7719
- if (_dotenvKey(options).length === 0) {
7720
- return DotenvModule.configDotenv(options);
7721
- }
7722
- const vaultPath = _vaultPath(options);
7723
- if (!vaultPath) {
7724
- _warn(`You set DOTENV_KEY but you are missing a .env.vault file at ${vaultPath}. Did you forget to build it?`);
7725
- return DotenvModule.configDotenv(options);
7726
- }
7727
- return DotenvModule._configVault(options);
7728
- }
7729
- function decrypt(encrypted, keyStr) {
7730
- const key = Buffer.from(keyStr.slice(-64), "hex");
7731
- let ciphertext = Buffer.from(encrypted, "base64");
7732
- const nonce = ciphertext.subarray(0, 12);
7733
- const authTag = ciphertext.subarray(-16);
7734
- ciphertext = ciphertext.subarray(12, -16);
7735
- try {
7736
- const aesgcm = crypto.createDecipheriv("aes-256-gcm", key, nonce);
7737
- aesgcm.setAuthTag(authTag);
7738
- return `${aesgcm.update(ciphertext)}${aesgcm.final()}`;
7739
- } catch (error) {
7740
- const isRange = error instanceof RangeError;
7741
- const invalidKeyLength = error.message === "Invalid key length";
7742
- const decryptionFailed = error.message === "Unsupported state or unable to authenticate data";
7743
- if (isRange || invalidKeyLength) {
7744
- const err = new Error("INVALID_DOTENV_KEY: It must be 64 characters long (or more)");
7745
- err.code = "INVALID_DOTENV_KEY";
7746
- throw err;
7747
- } else if (decryptionFailed) {
7748
- const err = new Error("DECRYPTION_FAILED: Please check your DOTENV_KEY");
7749
- err.code = "DECRYPTION_FAILED";
7750
- throw err;
7751
- } else {
7752
- throw error;
7753
- }
7754
- }
7412
+ // src/lib/utils/time-parser.ts
7413
+ init_esm_shims();
7414
+ var ISO_8601_PATTERN = /^(\d{4})-(\d{2})-(\d{2})(?:[Tt](\d{2}):(\d{2})(?::(\d{2})(?:\.\d{1,9})?)?(?:[Zz]|[+-]\d{2}:?\d{2})?)?$/;
7415
+ var DAYS_BY_MONTH = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
7416
+ var MAX_DATE_TIMESTAMP_MS = 864e13;
7417
+ function parseTime(timeStr) {
7418
+ const relativeMatch = timeStr.match(/^(\d+)([smhdw])$/);
7419
+ if (relativeMatch) {
7420
+ const value = Number(relativeMatch[1]);
7421
+ const unit = relativeMatch[2];
7422
+ const timestamp2 = parseRelativeTime(value, unit);
7423
+ if (timestamp2 !== void 0) {
7424
+ return timestamp2;
7755
7425
  }
7756
- function populate(processEnv, parsed, options = {}) {
7757
- const debug = Boolean(options && options.debug);
7758
- const override = Boolean(options && options.override);
7759
- const populated = {};
7760
- if (typeof parsed !== "object") {
7761
- const err = new Error("OBJECT_REQUIRED: Please check the processEnv argument being passed to populate");
7762
- err.code = "OBJECT_REQUIRED";
7763
- throw err;
7764
- }
7765
- for (const key of Object.keys(parsed)) {
7766
- if (Object.prototype.hasOwnProperty.call(processEnv, key)) {
7767
- if (override === true) {
7768
- processEnv[key] = parsed[key];
7769
- populated[key] = parsed[key];
7770
- }
7771
- if (debug) {
7772
- if (override === true) {
7773
- _debug(`"${key}" is already defined and WAS overwritten`);
7774
- } else {
7775
- _debug(`"${key}" is already defined and was NOT overwritten`);
7776
- }
7777
- }
7778
- } else {
7779
- processEnv[key] = parsed[key];
7780
- populated[key] = parsed[key];
7781
- }
7782
- }
7783
- return populated;
7426
+ }
7427
+ if (/^\d+$/.test(timeStr)) {
7428
+ const rawTimestamp = Number(timeStr);
7429
+ const timestamp2 = rawTimestamp < 1e10 ? rawTimestamp * 1e3 : rawTimestamp;
7430
+ if (isValidTimestamp(timestamp2)) {
7431
+ return timestamp2;
7784
7432
  }
7785
- var DotenvModule = {
7786
- configDotenv,
7787
- _configVault,
7788
- _parseVault,
7789
- config,
7790
- decrypt,
7791
- parse,
7792
- populate
7793
- };
7794
- module.exports.configDotenv = DotenvModule.configDotenv;
7795
- module.exports._configVault = DotenvModule._configVault;
7796
- module.exports._parseVault = DotenvModule._parseVault;
7797
- module.exports.config = DotenvModule.config;
7798
- module.exports.decrypt = DotenvModule.decrypt;
7799
- module.exports.parse = DotenvModule.parse;
7800
- module.exports.populate = DotenvModule.populate;
7801
- module.exports = DotenvModule;
7802
7433
  }
7803
- });
7434
+ const timestamp = parseIsoTime(timeStr);
7435
+ if (timestamp !== void 0) {
7436
+ return timestamp;
7437
+ }
7438
+ throw new Error(
7439
+ `Invalid time format: "${timeStr}". Supported formats: relative (5m, 2h, 1d), ISO 8601 (2024-01-15T10:30:00Z), Unix timestamp`
7440
+ );
7441
+ }
7442
+ function parseIsoTime(timeStr) {
7443
+ const match = ISO_8601_PATTERN.exec(timeStr);
7444
+ if (!match) {
7445
+ return void 0;
7446
+ }
7447
+ const year = Number(match[1]);
7448
+ const month = Number(match[2]);
7449
+ const day = Number(match[3]);
7450
+ const hour = match[4] ? Number(match[4]) : 0;
7451
+ const minute = match[5] ? Number(match[5]) : 0;
7452
+ const second = match[6] ? Number(match[6]) : 0;
7453
+ if (!Number.isInteger(year) || !Number.isInteger(month) || !Number.isInteger(day) || !Number.isInteger(hour) || !Number.isInteger(minute) || !Number.isInteger(second) || month < 1 || month > 12 || day < 1 || day > daysInMonth(year, month) || hour > 23 || minute > 59 || second > 59) {
7454
+ return void 0;
7455
+ }
7456
+ const timestamp = new Date(timeStr).getTime();
7457
+ return isValidTimestamp(timestamp) ? timestamp : void 0;
7458
+ }
7459
+ function daysInMonth(year, month) {
7460
+ if (month === 2) {
7461
+ return isLeapYear(year) ? 29 : 28;
7462
+ }
7463
+ return DAYS_BY_MONTH[month - 1] ?? 0;
7464
+ }
7465
+ function isLeapYear(year) {
7466
+ return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);
7467
+ }
7468
+ function parseRelativeTime(value, unit) {
7469
+ if (!Number.isSafeInteger(value)) {
7470
+ return void 0;
7471
+ }
7472
+ const now = Date.now();
7473
+ const multipliers = {
7474
+ s: 1e3,
7475
+ // seconds
7476
+ m: 60 * 1e3,
7477
+ // minutes
7478
+ h: 60 * 60 * 1e3,
7479
+ // hours
7480
+ d: 24 * 60 * 60 * 1e3,
7481
+ // days
7482
+ w: 7 * 24 * 60 * 60 * 1e3
7483
+ // weeks
7484
+ };
7485
+ const multiplier = multipliers[unit];
7486
+ if (!multiplier) {
7487
+ throw new Error(`Unknown time unit: ${unit}`);
7488
+ }
7489
+ const timestamp = now - value * multiplier;
7490
+ return isValidTimestamp(timestamp) ? timestamp : void 0;
7491
+ }
7492
+ function isValidTimestamp(timestamp) {
7493
+ return Number.isSafeInteger(timestamp) && Math.abs(timestamp) <= MAX_DATE_TIMESTAMP_MS;
7494
+ }
7804
7495
 
7805
7496
  // ../../packages/core/src/frameworks.ts
7806
7497
  init_esm_shims();
@@ -7844,57 +7535,6 @@ init_esm_shims();
7844
7535
 
7845
7536
  // ../../packages/core/src/variable-expander.ts
7846
7537
  init_esm_shims();
7847
- var VARIABLE_PATTERN = /\$\{\{\s*(env|vars|secrets)\.([a-zA-Z_][a-zA-Z0-9_]*)\s*\}\}/g;
7848
- function extractVariableReferencesFromString(value) {
7849
- const refs = [];
7850
- const matches = value.matchAll(VARIABLE_PATTERN);
7851
- for (const match of matches) {
7852
- const source = match[1];
7853
- const name = match[2];
7854
- refs.push({ source, name });
7855
- }
7856
- return refs;
7857
- }
7858
- function extractVariableReferences(obj) {
7859
- const refs = [];
7860
- const seen = /* @__PURE__ */ new Set();
7861
- function scan(value) {
7862
- if (typeof value === "string") {
7863
- const stringRefs = extractVariableReferencesFromString(value);
7864
- for (const ref of stringRefs) {
7865
- const key = `${ref.source}.${ref.name}`;
7866
- if (!seen.has(key)) {
7867
- seen.add(key);
7868
- refs.push(ref);
7869
- }
7870
- }
7871
- } else if (Array.isArray(value)) {
7872
- for (const item of value) {
7873
- scan(item);
7874
- }
7875
- } else if (value !== null && typeof value === "object") {
7876
- for (const val of Object.values(value)) {
7877
- scan(val);
7878
- }
7879
- }
7880
- }
7881
- scan(obj);
7882
- return refs;
7883
- }
7884
- function groupVariablesBySource(refs) {
7885
- const groups = {
7886
- env: [],
7887
- vars: [],
7888
- secrets: []
7889
- };
7890
- for (const ref of refs) {
7891
- groups[ref.source].push(ref);
7892
- }
7893
- return groups;
7894
- }
7895
- function extractAndGroupVariables(obj) {
7896
- return groupVariablesBySource(extractVariableReferences(obj));
7897
- }
7898
7538
 
7899
7539
  // ../../packages/core/src/usage-source-bucket.ts
7900
7540
  init_esm_shims();
@@ -10845,9 +10485,235 @@ var desktopAuthConsumeContract = c3.router({
10845
10485
  }
10846
10486
  });
10847
10487
 
10848
- // ../../packages/api-contracts/src/contracts/zero-user-model-preference.ts
10488
+ // ../../packages/api-contracts/src/contracts/composes.ts
10849
10489
  init_esm_shims();
10850
10490
  var c4 = initContract();
10491
+ var MOUNT_PATH_TEMPLATE = "${{ working_dir }}";
10492
+ var composeVersionQuerySchema = external_exports.string().min(1, "Missing version query parameter").regex(
10493
+ /^[a-f0-9]{8,64}$|^latest$/i,
10494
+ "Version must be 8-64 hex characters or 'latest'"
10495
+ );
10496
+ var AGENT_NAME_REGEX = /^[a-zA-Z0-9][a-zA-Z0-9-]{1,62}[a-zA-Z0-9]$/;
10497
+ var agentNameSchema = external_exports.string().min(3, "Agent name must be at least 3 characters").max(64, "Agent name must be 64 characters or less").regex(
10498
+ AGENT_NAME_REGEX,
10499
+ "Agent name must start and end with letter or number, and contain only letters, numbers, and hyphens"
10500
+ );
10501
+ var volumeConfigSchema = external_exports.object({
10502
+ name: external_exports.string().min(1, "Volume name is required"),
10503
+ version: external_exports.string().min(1, "Volume version is required"),
10504
+ /** When true, skip mounting without error if volume doesn't exist */
10505
+ optional: external_exports.boolean().optional()
10506
+ });
10507
+ var mountPathSchema = external_exports.string().min(1, "mount_path cannot be empty").refine((val) => {
10508
+ return val === MOUNT_PATH_TEMPLATE || val.startsWith("/");
10509
+ }, "mount_path must be an absolute path or ${{ working_dir }}");
10510
+ var artifactConfigSchema = external_exports.object({
10511
+ name: external_exports.string().min(1, "Artifact name is required"),
10512
+ version: external_exports.string().min(1).optional(),
10513
+ mount_path: mountPathSchema.optional()
10514
+ });
10515
+ var artifactsArraySchema = external_exports.array(artifactConfigSchema).refine((items) => {
10516
+ const names = items.map((i) => {
10517
+ return i.name;
10518
+ });
10519
+ return new Set(names).size === names.length;
10520
+ }, "Artifact names must be unique");
10521
+ var agentFirewallsMapSchema = external_exports.record(
10522
+ external_exports.string(),
10523
+ external_exports.object({
10524
+ permissions: external_exports.union([external_exports.literal("all"), external_exports.array(external_exports.string()).min(1)])
10525
+ })
10526
+ );
10527
+ var legacyAgentFirewallsSchema = external_exports.union([
10528
+ agentFirewallsMapSchema,
10529
+ firewallsSchema
10530
+ ]);
10531
+ var agentDefinitionSchema = external_exports.object({
10532
+ description: external_exports.string().optional(),
10533
+ framework: external_exports.enum(["claude-code", "codex"]),
10534
+ volumes: external_exports.array(external_exports.string()).optional(),
10535
+ environment: external_exports.record(external_exports.string(), external_exports.string()).optional(),
10536
+ /**
10537
+ * Path to instructions file (e.g., AGENTS.md).
10538
+ * Auto-uploaded as volume and mounted at /home/user/.claude/CLAUDE.md
10539
+ */
10540
+ instructions: external_exports.string().min(1, "Instructions path cannot be empty").refine((val) => {
10541
+ return !val.includes("..") && !val.startsWith("/") && !val.startsWith("\\");
10542
+ }, "Instructions path must be a relative path without '..' segments").optional(),
10543
+ /**
10544
+ * @deprecated Skills are no longer processed by the CLI path. Declare
10545
+ * mounts via `volumes:` / `--volume` instead. Field retained as optional
10546
+ * so older CLI clients posting `skills:` are not rejected; server strips
10547
+ * the field before persisting compose content.
10548
+ */
10549
+ skills: external_exports.array(external_exports.string()).optional(),
10550
+ /**
10551
+ * Route this agent to a self-hosted runner instead of E2B.
10552
+ * When specified, runs will be queued for the specified runner group.
10553
+ */
10554
+ experimental_runner: external_exports.object({
10555
+ group: external_exports.string().regex(
10556
+ /^[a-z0-9-]+\/[a-z0-9-]+$/,
10557
+ "Runner group must be in vm0/<name> format (e.g., vm0/production)"
10558
+ )
10559
+ }).optional(),
10560
+ /**
10561
+ * VM profile for resource allocation (e.g., "vm0/default").
10562
+ * Determines rootfs image and VM resources (vCPU, memory).
10563
+ * Defaults to "vm0/default" when omitted.
10564
+ */
10565
+ experimental_profile: external_exports.string().regex(
10566
+ /^[a-z0-9-]+\/[a-z0-9-]+$/,
10567
+ "Profile must be in org/name format (e.g., vm0/default)"
10568
+ ).optional(),
10569
+ /**
10570
+ * External firewall rules for proxy-side token replacement.
10571
+ * Map format: { slack: { permissions: [...] | "all" } }
10572
+ * Resolved to full ExpandedFirewallConfig[] at runtime.
10573
+ */
10574
+ firewalls: agentFirewallsMapSchema.optional()
10575
+ });
10576
+ var agentComposeContentSchema = external_exports.object({
10577
+ version: external_exports.string().min(1, "Version is required"),
10578
+ agents: external_exports.record(external_exports.string(), agentDefinitionSchema),
10579
+ volumes: external_exports.record(external_exports.string(), volumeConfigSchema).optional(),
10580
+ artifacts: artifactsArraySchema.optional()
10581
+ });
10582
+ var agentComposeApiContentSchema = external_exports.object({
10583
+ version: external_exports.string().min(1, "Version is required"),
10584
+ agents: external_exports.record(
10585
+ external_exports.string(),
10586
+ agentDefinitionSchema.extend({
10587
+ // Legacy: older compose versions may have this field (map or expanded array).
10588
+ // Accepted for backward compat but ignored at runtime.
10589
+ firewalls: legacyAgentFirewallsSchema.optional()
10590
+ })
10591
+ ),
10592
+ volumes: external_exports.record(external_exports.string(), volumeConfigSchema).optional(),
10593
+ artifacts: artifactsArraySchema.optional()
10594
+ });
10595
+ var composeResponseSchema = external_exports.object({
10596
+ id: external_exports.string(),
10597
+ name: external_exports.string(),
10598
+ headVersionId: external_exports.string().nullable(),
10599
+ content: agentComposeApiContentSchema.nullable(),
10600
+ createdAt: external_exports.string(),
10601
+ updatedAt: external_exports.string()
10602
+ });
10603
+ var createComposeResponseSchema = external_exports.object({
10604
+ composeId: external_exports.string(),
10605
+ name: external_exports.string(),
10606
+ versionId: external_exports.string(),
10607
+ action: external_exports.enum(["created", "existing"]),
10608
+ updatedAt: external_exports.string()
10609
+ });
10610
+ var composesMainContract = c4.router({
10611
+ /**
10612
+ * GET /api/agent/composes?name={name}&org={org}
10613
+ * Get agent compose by name with HEAD version content
10614
+ * If org is not provided, uses the authenticated user's default org
10615
+ */
10616
+ getByName: {
10617
+ method: "GET",
10618
+ path: "/api/agent/composes",
10619
+ headers: authHeadersSchema,
10620
+ query: external_exports.object({
10621
+ name: external_exports.string().min(1, "Missing name query parameter")
10622
+ }),
10623
+ responses: {
10624
+ 200: composeResponseSchema,
10625
+ 400: apiErrorSchema,
10626
+ 401: apiErrorSchema,
10627
+ 403: apiErrorSchema,
10628
+ 404: apiErrorSchema
10629
+ },
10630
+ summary: "Get agent compose by name"
10631
+ },
10632
+ /**
10633
+ * POST /api/agent/composes
10634
+ * Create or update an agent compose version
10635
+ *
10636
+ * Returns 201 when a new compose is created, 200 when updating an existing compose.
10637
+ * The action field indicates whether a new version was created or an existing one reused.
10638
+ */
10639
+ create: {
10640
+ method: "POST",
10641
+ path: "/api/agent/composes",
10642
+ headers: authHeadersSchema,
10643
+ body: external_exports.object({
10644
+ content: agentComposeApiContentSchema
10645
+ }),
10646
+ responses: {
10647
+ 200: createComposeResponseSchema,
10648
+ 201: createComposeResponseSchema,
10649
+ 400: apiErrorSchema,
10650
+ 401: apiErrorSchema,
10651
+ 403: apiErrorSchema
10652
+ },
10653
+ summary: "Create or update agent compose version"
10654
+ }
10655
+ });
10656
+ var composesByIdContract = c4.router({
10657
+ /**
10658
+ * GET /api/agent/composes/:id
10659
+ * Get agent compose by ID with HEAD version content
10660
+ */
10661
+ getById: {
10662
+ method: "GET",
10663
+ path: "/api/agent/composes/:id",
10664
+ headers: authHeadersSchema,
10665
+ pathParams: external_exports.object({
10666
+ id: external_exports.string().uuid("Compose ID must be a valid UUID")
10667
+ }),
10668
+ responses: {
10669
+ 200: composeResponseSchema,
10670
+ 400: apiErrorSchema,
10671
+ 401: apiErrorSchema,
10672
+ 403: apiErrorSchema,
10673
+ 404: apiErrorSchema
10674
+ },
10675
+ summary: "Get agent compose by ID"
10676
+ }
10677
+ });
10678
+ var composesVersionsContract = c4.router({
10679
+ /**
10680
+ * GET /api/agent/composes/versions?composeId={id}&version={hash|tag}
10681
+ * Resolve a version specifier to a full version ID
10682
+ */
10683
+ resolveVersion: {
10684
+ method: "GET",
10685
+ path: "/api/agent/composes/versions",
10686
+ headers: authHeadersSchema,
10687
+ query: external_exports.object({
10688
+ composeId: external_exports.string().min(1, "Missing composeId query parameter"),
10689
+ version: composeVersionQuerySchema
10690
+ }),
10691
+ responses: {
10692
+ 200: external_exports.object({
10693
+ versionId: external_exports.string(),
10694
+ tag: external_exports.string().optional()
10695
+ }),
10696
+ 400: apiErrorSchema,
10697
+ 401: apiErrorSchema,
10698
+ 403: apiErrorSchema,
10699
+ 404: apiErrorSchema
10700
+ },
10701
+ summary: "Resolve version specifier to full version ID"
10702
+ }
10703
+ });
10704
+ var composeListItemSchema = external_exports.object({
10705
+ id: external_exports.string(),
10706
+ name: external_exports.string(),
10707
+ displayName: external_exports.string().nullable().optional(),
10708
+ description: external_exports.string().nullable().optional(),
10709
+ sound: external_exports.string().nullable().optional(),
10710
+ headVersionId: external_exports.string().nullable(),
10711
+ updatedAt: external_exports.string()
10712
+ });
10713
+
10714
+ // ../../packages/api-contracts/src/contracts/zero-user-model-preference.ts
10715
+ init_esm_shims();
10716
+ var c5 = initContract();
10851
10717
  var userModelPreferenceResponseSchema = external_exports.object({
10852
10718
  selectedModel: supportedRunModelSchema.nullable(),
10853
10719
  updatedAt: external_exports.string().nullable()
@@ -10855,7 +10721,7 @@ var userModelPreferenceResponseSchema = external_exports.object({
10855
10721
  var updateUserModelPreferenceRequestSchema = external_exports.object({
10856
10722
  selectedModel: supportedRunModelSchema.nullable()
10857
10723
  });
10858
- var zeroUserModelPreferenceContract = c4.router({
10724
+ var zeroUserModelPreferenceContract = c5.router({
10859
10725
  get: {
10860
10726
  method: "GET",
10861
10727
  path: "/api/zero/user-model-preference",
@@ -10888,7 +10754,7 @@ var zeroUserModelPreferenceContract = c4.router({
10888
10754
 
10889
10755
  // ../../packages/api-contracts/src/contracts/presentation-images.ts
10890
10756
  init_esm_shims();
10891
- var c5 = initContract();
10757
+ var c6 = initContract();
10892
10758
  var presentationImageOrientationSchema = external_exports.enum([
10893
10759
  "landscape",
10894
10760
  "portrait",
@@ -10946,7 +10812,7 @@ var presentationImageResolveResponseSchema = external_exports.object({
10946
10812
  ])
10947
10813
  )
10948
10814
  }).strict();
10949
- var presentationImagesContract = c5.router({
10815
+ var presentationImagesContract = c6.router({
10950
10816
  resolve: {
10951
10817
  method: "POST",
10952
10818
  path: "/api/presentation/images/resolve",
@@ -10965,7 +10831,7 @@ var presentationImagesContract = c5.router({
10965
10831
 
10966
10832
  // ../../packages/api-contracts/src/contracts/test-telegram-dispatch-probe.ts
10967
10833
  init_esm_shims();
10968
- var c6 = initContract();
10834
+ var c7 = initContract();
10969
10835
  var testTelegramDispatchProbeBodySchema = external_exports.object({
10970
10836
  bot_id: external_exports.string(),
10971
10837
  chat_id: external_exports.string(),
@@ -10990,7 +10856,7 @@ var testTelegramDispatchProbeHandlerErrorSchema = external_exports.object({
10990
10856
  stack: external_exports.string().optional()
10991
10857
  })
10992
10858
  });
10993
- var testTelegramDispatchProbeContract = c6.router({
10859
+ var testTelegramDispatchProbeContract = c7.router({
10994
10860
  post: {
10995
10861
  method: "POST",
10996
10862
  path: "/api/test/telegram-dispatch-probe",
@@ -11009,7 +10875,7 @@ var testTelegramDispatchProbeContract = c6.router({
11009
10875
 
11010
10876
  // ../../packages/api-contracts/src/contracts/test-teams-dispatch-probe.ts
11011
10877
  init_esm_shims();
11012
- var c7 = initContract();
10878
+ var c8 = initContract();
11013
10879
  var testTeamsDispatchProbeBodySchema = external_exports.object({
11014
10880
  tenant_id: external_exports.string(),
11015
10881
  conversation_id: external_exports.string(),
@@ -11048,7 +10914,7 @@ var testTeamsDispatchProbeResponseSchema = external_exports.union([
11048
10914
  testTeamsDispatchProbeSuccessResponseSchema,
11049
10915
  testTeamsDispatchProbeFailureResponseSchema
11050
10916
  ]);
11051
- var testTeamsDispatchProbeContract = c7.router({
10917
+ var testTeamsDispatchProbeContract = c8.router({
11052
10918
  post: {
11053
10919
  method: "POST",
11054
10920
  path: "/api/test/teams-dispatch-probe",
@@ -11091,7 +10957,7 @@ var internalCallbackErrorSchema = external_exports.object({
11091
10957
  });
11092
10958
 
11093
10959
  // ../../packages/api-contracts/src/contracts/zero-email.ts
11094
- var c8 = initContract();
10960
+ var c9 = initContract();
11095
10961
  var emailRecipientsSchema = external_exports.array(external_exports.string()).optional();
11096
10962
  var zeroEmailReplyCallbackPayloadSchema = external_exports.object({
11097
10963
  emailThreadSessionId: external_exports.string(),
@@ -11114,7 +10980,7 @@ var zeroEmailTriggerCallbackPayloadSchema = external_exports.object({
11114
10980
  replyRecipientTo: emailRecipientsSchema,
11115
10981
  replyRecipientCc: emailRecipientsSchema
11116
10982
  }).passthrough();
11117
- var zeroEmailReplyCallbackContract = c8.router({
10983
+ var zeroEmailReplyCallbackContract = c9.router({
11118
10984
  post: {
11119
10985
  method: "POST",
11120
10986
  path: "/api/zero/email/callbacks/reply",
@@ -11131,7 +10997,7 @@ var zeroEmailReplyCallbackContract = c8.router({
11131
10997
  summary: "Handle Zero email reply completion callbacks"
11132
10998
  }
11133
10999
  });
11134
- var zeroEmailTriggerCallbackContract = c8.router({
11000
+ var zeroEmailTriggerCallbackContract = c9.router({
11135
11001
  post: {
11136
11002
  method: "POST",
11137
11003
  path: "/api/zero/email/callbacks/trigger",
@@ -11148,7 +11014,7 @@ var zeroEmailTriggerCallbackContract = c8.router({
11148
11014
  summary: "Handle Zero email trigger completion callbacks"
11149
11015
  }
11150
11016
  });
11151
- var zeroEmailInboundContract = c8.router({
11017
+ var zeroEmailInboundContract = c9.router({
11152
11018
  post: {
11153
11019
  method: "POST",
11154
11020
  path: "/api/zero/email/inbound",
@@ -11168,8 +11034,8 @@ var zeroEmailInboundContract = c8.router({
11168
11034
 
11169
11035
  // ../../packages/api-contracts/src/contracts/auth.ts
11170
11036
  init_esm_shims();
11171
- var c9 = initContract();
11172
- var authContract = c9.router({
11037
+ var c10 = initContract();
11038
+ var authContract = c10.router({
11173
11039
  /**
11174
11040
  * GET /api/auth/me
11175
11041
  * Get current user information
@@ -11194,7 +11060,7 @@ var authContract = c9.router({
11194
11060
 
11195
11061
  // ../../packages/api-contracts/src/contracts/user-export.ts
11196
11062
  init_esm_shims();
11197
- var c10 = initContract();
11063
+ var c11 = initContract();
11198
11064
  var exportJobStatusSchema = external_exports.enum([
11199
11065
  "pending",
11200
11066
  "running",
@@ -11219,7 +11085,7 @@ var userExportStartResponseSchema = external_exports.object({
11219
11085
  jobId: external_exports.string().uuid(),
11220
11086
  status: external_exports.enum(["pending", "running"])
11221
11087
  });
11222
- var userExportContract = c10.router({
11088
+ var userExportContract = c11.router({
11223
11089
  get: {
11224
11090
  method: "GET",
11225
11091
  path: "/api/user/export",
@@ -11250,7 +11116,7 @@ var userExportContract = c10.router({
11250
11116
 
11251
11117
  // ../../packages/api-contracts/src/contracts/email-unsubscribe.ts
11252
11118
  init_esm_shims();
11253
- var c11 = initContract();
11119
+ var c12 = initContract();
11254
11120
  var emailUnsubscribeQuerySchema = external_exports.object({
11255
11121
  token: external_exports.string().optional()
11256
11122
  });
@@ -11260,13 +11126,13 @@ var emailUnsubscribeResponseSchema = external_exports.object({
11260
11126
  var emailUnsubscribeErrorSchema = external_exports.object({
11261
11127
  error: external_exports.string()
11262
11128
  });
11263
- var emailUnsubscribeContract = c11.router({
11129
+ var emailUnsubscribeContract = c12.router({
11264
11130
  get: {
11265
11131
  method: "GET",
11266
11132
  path: "/api/email/unsubscribe",
11267
11133
  query: emailUnsubscribeQuerySchema,
11268
11134
  responses: {
11269
- 200: c11.otherResponse({
11135
+ 200: c12.otherResponse({
11270
11136
  contentType: "text/html",
11271
11137
  body: external_exports.unknown()
11272
11138
  }),
@@ -11287,10 +11153,73 @@ var emailUnsubscribeContract = c11.router({
11287
11153
  }
11288
11154
  });
11289
11155
 
11156
+ // ../../packages/api-contracts/src/contracts/zero-morning-brief.ts
11157
+ init_esm_shims();
11158
+ var c13 = initContract();
11159
+ var triggerMorningBriefResponseSchema = external_exports.object({
11160
+ runId: external_exports.string(),
11161
+ briefDate: external_exports.string()
11162
+ });
11163
+ var zeroMorningBriefContract = c13.router({
11164
+ trigger: {
11165
+ method: "POST",
11166
+ path: "/api/zero/morning-brief/trigger",
11167
+ headers: authHeadersSchema,
11168
+ body: external_exports.object({}),
11169
+ responses: {
11170
+ 200: triggerMorningBriefResponseSchema,
11171
+ 400: apiErrorSchema,
11172
+ 401: apiErrorSchema,
11173
+ 403: apiErrorSchema,
11174
+ 500: apiErrorSchema
11175
+ },
11176
+ summary: "Trigger a morning brief immediately for the current user"
11177
+ }
11178
+ });
11179
+
11180
+ // ../../packages/api-contracts/src/contracts/email-morning-brief-unsubscribe.ts
11181
+ init_esm_shims();
11182
+ var c14 = initContract();
11183
+ var emailMorningBriefUnsubscribeQuerySchema = external_exports.object({
11184
+ token: external_exports.string().optional()
11185
+ });
11186
+ var emailMorningBriefUnsubscribeResponseSchema = external_exports.object({
11187
+ unsubscribed: external_exports.literal(true)
11188
+ });
11189
+ var emailMorningBriefUnsubscribeErrorSchema = external_exports.object({
11190
+ error: external_exports.string()
11191
+ });
11192
+ var emailMorningBriefUnsubscribeContract = c14.router({
11193
+ get: {
11194
+ method: "GET",
11195
+ path: "/api/email/morning-brief/unsubscribe",
11196
+ query: emailMorningBriefUnsubscribeQuerySchema,
11197
+ responses: {
11198
+ 200: c14.otherResponse({
11199
+ contentType: "text/html",
11200
+ body: external_exports.unknown()
11201
+ }),
11202
+ 400: emailMorningBriefUnsubscribeErrorSchema
11203
+ },
11204
+ summary: "Turn off the Morning Brief from an email link"
11205
+ },
11206
+ unsubscribe: {
11207
+ method: "POST",
11208
+ path: "/api/email/morning-brief/unsubscribe",
11209
+ query: emailMorningBriefUnsubscribeQuerySchema,
11210
+ body: external_exports.undefined(),
11211
+ responses: {
11212
+ 200: emailMorningBriefUnsubscribeResponseSchema,
11213
+ 400: emailMorningBriefUnsubscribeErrorSchema
11214
+ },
11215
+ summary: "One-click List-Unsubscribe for the Morning Brief"
11216
+ }
11217
+ });
11218
+
11290
11219
  // ../../packages/api-contracts/src/contracts/connectors-type-callback.ts
11291
11220
  init_esm_shims();
11292
- var c12 = initContract();
11293
- var connectorsTypeCallbackContract = c12.router({
11221
+ var c15 = initContract();
11222
+ var connectorsTypeCallbackContract = c15.router({
11294
11223
  callback: {
11295
11224
  method: "GET",
11296
11225
  path: "/api/connectors/:type/callback",
@@ -11316,7 +11245,7 @@ var connectorsTypeCallbackContract = c12.router({
11316
11245
  "openid.realm": external_exports.string().optional()
11317
11246
  }).catchall(external_exports.string()),
11318
11247
  responses: {
11319
- 307: c12.noBody()
11248
+ 307: c15.noBody()
11320
11249
  },
11321
11250
  summary: "Complete connector browser authorization"
11322
11251
  }
@@ -11324,7 +11253,7 @@ var connectorsTypeCallbackContract = c12.router({
11324
11253
 
11325
11254
  // ../../packages/api-contracts/src/contracts/test-oauth-provider-authorize.ts
11326
11255
  init_esm_shims();
11327
- var c13 = initContract();
11256
+ var c16 = initContract();
11328
11257
  var testOAuthProviderAuthorizeErrorSchema = external_exports.object({
11329
11258
  error: external_exports.string()
11330
11259
  });
@@ -11336,13 +11265,13 @@ var testOAuthProviderAuthorizeQuerySchema = external_exports.object({
11336
11265
  scope: external_exports.string().optional(),
11337
11266
  state: external_exports.string().optional()
11338
11267
  });
11339
- var testOAuthProviderAuthorizeContract = c13.router({
11268
+ var testOAuthProviderAuthorizeContract = c16.router({
11340
11269
  authorize: {
11341
11270
  method: "GET",
11342
11271
  path: "/api/test/oauth-provider/authorize",
11343
11272
  query: testOAuthProviderAuthorizeQuerySchema,
11344
11273
  responses: {
11345
- 302: c13.noBody(),
11274
+ 302: c16.noBody(),
11346
11275
  400: testOAuthProviderAuthorizeErrorSchema,
11347
11276
  404: external_exports.string()
11348
11277
  },
@@ -11352,7 +11281,7 @@ var testOAuthProviderAuthorizeContract = c13.router({
11352
11281
 
11353
11282
  // ../../packages/api-contracts/src/contracts/test-oauth-provider-echo.ts
11354
11283
  init_esm_shims();
11355
- var c14 = initContract();
11284
+ var c17 = initContract();
11356
11285
  var testOAuthProviderEchoErrorSchema = external_exports.object({
11357
11286
  error: external_exports.string()
11358
11287
  });
@@ -11360,7 +11289,7 @@ var testOAuthProviderEchoResponseSchema = external_exports.object({
11360
11289
  authorization: external_exports.string(),
11361
11290
  receivedAt: external_exports.string()
11362
11291
  });
11363
- var testOAuthProviderEchoContract = c14.router({
11292
+ var testOAuthProviderEchoContract = c17.router({
11364
11293
  echo: {
11365
11294
  method: "GET",
11366
11295
  path: "/api/test/oauth-provider/echo",
@@ -11375,7 +11304,7 @@ var testOAuthProviderEchoContract = c14.router({
11375
11304
 
11376
11305
  // ../../packages/api-contracts/src/contracts/test-oauth-provider-token.ts
11377
11306
  init_esm_shims();
11378
- var c15 = initContract();
11307
+ var c18 = initContract();
11379
11308
  var testOAuthProviderTokenErrorSchema = external_exports.object({
11380
11309
  error: external_exports.string(),
11381
11310
  error_description: external_exports.string().optional()
@@ -11387,11 +11316,11 @@ var testOAuthProviderTokenResponseSchema = external_exports.object({
11387
11316
  expires_in: external_exports.number(),
11388
11317
  scope: external_exports.string()
11389
11318
  });
11390
- var testOAuthProviderTokenContract = c15.router({
11319
+ var testOAuthProviderTokenContract = c18.router({
11391
11320
  token: {
11392
11321
  method: "POST",
11393
11322
  path: "/api/test/oauth-provider/token",
11394
- body: c15.type(),
11323
+ body: c18.type(),
11395
11324
  responses: {
11396
11325
  200: testOAuthProviderTokenResponseSchema,
11397
11326
  400: testOAuthProviderTokenErrorSchema,
@@ -11404,7 +11333,7 @@ var testOAuthProviderTokenContract = c15.router({
11404
11333
 
11405
11334
  // ../../packages/api-contracts/src/contracts/test-oauth-provider-device-auth.ts
11406
11335
  init_esm_shims();
11407
- var c16 = initContract();
11336
+ var c19 = initContract();
11408
11337
  var testOAuthProviderDeviceAuthErrorSchema = external_exports.object({
11409
11338
  error: external_exports.string(),
11410
11339
  error_description: external_exports.string().optional()
@@ -11417,11 +11346,11 @@ var testOAuthProviderDeviceAuthResponseSchema = external_exports.object({
11417
11346
  expires_in: external_exports.number(),
11418
11347
  interval: external_exports.number()
11419
11348
  });
11420
- var testOAuthProviderDeviceAuthContract = c16.router({
11349
+ var testOAuthProviderDeviceAuthContract = c19.router({
11421
11350
  deviceAuth: {
11422
11351
  method: "POST",
11423
11352
  path: "/api/test/oauth-provider/device/code",
11424
- body: c16.type(),
11353
+ body: c19.type(),
11425
11354
  responses: {
11426
11355
  200: testOAuthProviderDeviceAuthResponseSchema,
11427
11356
  400: testOAuthProviderDeviceAuthErrorSchema,
@@ -11434,7 +11363,7 @@ var testOAuthProviderDeviceAuthContract = c16.router({
11434
11363
 
11435
11364
  // ../../packages/api-contracts/src/contracts/test-oauth-provider-userinfo.ts
11436
11365
  init_esm_shims();
11437
- var c17 = initContract();
11366
+ var c20 = initContract();
11438
11367
  var testOAuthProviderUserinfoErrorSchema = external_exports.object({
11439
11368
  error: external_exports.string()
11440
11369
  });
@@ -11443,7 +11372,7 @@ var testOAuthProviderUserinfoResponseSchema = external_exports.object({
11443
11372
  id: external_exports.string(),
11444
11373
  username: external_exports.string()
11445
11374
  });
11446
- var testOAuthProviderUserinfoContract = c17.router({
11375
+ var testOAuthProviderUserinfoContract = c20.router({
11447
11376
  userinfo: {
11448
11377
  method: "GET",
11449
11378
  path: "/api/test/oauth-provider/userinfo",
@@ -11458,7 +11387,7 @@ var testOAuthProviderUserinfoContract = c17.router({
11458
11387
 
11459
11388
  // ../../packages/api-contracts/src/contracts/test-computer-use-state.ts
11460
11389
  init_esm_shims();
11461
- var c18 = initContract();
11390
+ var c21 = initContract();
11462
11391
  var testComputerUseStateErrorSchema = external_exports.object({
11463
11392
  error: external_exports.string()
11464
11393
  });
@@ -11491,7 +11420,7 @@ var testComputerUseStateGetResponseSchema = external_exports.object({
11491
11420
  var testComputerUseStateDeleteResponseSchema = external_exports.object({
11492
11421
  ok: external_exports.literal(true)
11493
11422
  });
11494
- var testComputerUseStateContract = c18.router({
11423
+ var testComputerUseStateContract = c21.router({
11495
11424
  post: {
11496
11425
  method: "POST",
11497
11426
  path: "/api/test/computer-use-state",
@@ -11533,7 +11462,7 @@ var testComputerUseStateContract = c18.router({
11533
11462
 
11534
11463
  // ../../packages/api-contracts/src/contracts/test-runtime-state.ts
11535
11464
  init_esm_shims();
11536
- var c19 = initContract();
11465
+ var c22 = initContract();
11537
11466
  var testRuntimeStateErrorSchema = external_exports.object({
11538
11467
  error: external_exports.string()
11539
11468
  });
@@ -11590,7 +11519,7 @@ var testRuntimeStateActionResponseSchema = external_exports.object({
11590
11519
  admission_lock_waiting: external_exports.boolean().optional(),
11591
11520
  uploaded_file_sources: external_exports.array(external_exports.string()).optional()
11592
11521
  });
11593
- var testRuntimeStateContract = c19.router({
11522
+ var testRuntimeStateContract = c22.router({
11594
11523
  action: {
11595
11524
  method: "POST",
11596
11525
  path: "/api/test/runtime-state/action",
@@ -11606,7 +11535,7 @@ var testRuntimeStateContract = c19.router({
11606
11535
 
11607
11536
  // ../../packages/api-contracts/src/contracts/test-zero-agent-state.ts
11608
11537
  init_esm_shims();
11609
- var c20 = initContract();
11538
+ var c23 = initContract();
11610
11539
  var testZeroAgentStateErrorSchema = external_exports.object({
11611
11540
  error: external_exports.string()
11612
11541
  });
@@ -11628,7 +11557,7 @@ var testZeroAgentStateActionBodySchema = external_exports.discriminatedUnion(
11628
11557
  var testZeroAgentStateActionResponseSchema = external_exports.object({
11629
11558
  ok: external_exports.literal(true)
11630
11559
  });
11631
- var testZeroAgentStateContract = c20.router({
11560
+ var testZeroAgentStateContract = c23.router({
11632
11561
  action: {
11633
11562
  method: "POST",
11634
11563
  path: "/api/test/zero-agent-state/action",
@@ -11644,7 +11573,7 @@ var testZeroAgentStateContract = c20.router({
11644
11573
 
11645
11574
  // ../../packages/api-contracts/src/contracts/test-model-provider-state.ts
11646
11575
  init_esm_shims();
11647
- var c21 = initContract();
11576
+ var c24 = initContract();
11648
11577
  var testModelProviderStateErrorSchema = external_exports.object({
11649
11578
  error: external_exports.string()
11650
11579
  });
@@ -11662,7 +11591,7 @@ var testModelProviderStateActionBodySchema = external_exports.discriminatedUnion
11662
11591
  var testModelProviderStateActionResponseSchema = external_exports.object({
11663
11592
  ok: external_exports.literal(true)
11664
11593
  });
11665
- var testModelProviderStateContract = c21.router({
11594
+ var testModelProviderStateContract = c24.router({
11666
11595
  action: {
11667
11596
  method: "POST",
11668
11597
  path: "/api/test/model-provider-state/action",
@@ -11678,8 +11607,8 @@ var testModelProviderStateContract = c21.router({
11678
11607
 
11679
11608
  // ../../packages/api-contracts/src/contracts/test-mail-draft-state.ts
11680
11609
  init_esm_shims();
11681
- var c22 = initContract();
11682
- var testMailDraftStateContract = c22.router({
11610
+ var c25 = initContract();
11611
+ var testMailDraftStateContract = c25.router({
11683
11612
  get: {
11684
11613
  method: "GET",
11685
11614
  path: "/api/test/mail-draft-state/:mailDraftId",
@@ -11694,7 +11623,7 @@ var testMailDraftStateContract = c22.router({
11694
11623
 
11695
11624
  // ../../packages/api-contracts/src/contracts/test-usage-insight-state.ts
11696
11625
  init_esm_shims();
11697
- var c23 = initContract();
11626
+ var c26 = initContract();
11698
11627
  var nullableDateStringSchema = external_exports.string().nullable();
11699
11628
  var optionalDateStringSchema = external_exports.string().optional();
11700
11629
  var testUsageInsightStateErrorSchema = external_exports.object({
@@ -11792,7 +11721,7 @@ var testUsageInsightStateActionResponseSchema = external_exports.object({
11792
11721
  chat_thread_id: external_exports.string().optional(),
11793
11722
  usage_event_id: external_exports.string().optional()
11794
11723
  });
11795
- var testUsageInsightStateContract = c23.router({
11724
+ var testUsageInsightStateContract = c26.router({
11796
11725
  action: {
11797
11726
  method: "POST",
11798
11727
  path: "/api/test/usage-insight-state/action",
@@ -11808,7 +11737,7 @@ var testUsageInsightStateContract = c23.router({
11808
11737
 
11809
11738
  // ../../packages/api-contracts/src/contracts/test-cron-cleanup-sandboxes-state.ts
11810
11739
  init_esm_shims();
11811
- var c24 = initContract();
11740
+ var c27 = initContract();
11812
11741
  var testCronCleanupSandboxesStateActionBodySchema = external_exports.object({
11813
11742
  action: external_exports.enum([
11814
11743
  "seed-run",
@@ -11833,7 +11762,7 @@ var testCronCleanupSandboxesStateActionResponseSchema = external_exports.object(
11833
11762
  var testCronCleanupSandboxesStateErrorSchema = external_exports.object({
11834
11763
  error: external_exports.string()
11835
11764
  });
11836
- var testCronCleanupSandboxesStateContract = c24.router({
11765
+ var testCronCleanupSandboxesStateContract = c27.router({
11837
11766
  action: {
11838
11767
  method: "POST",
11839
11768
  path: "/api/test/cron-cleanup-sandboxes-state/action",
@@ -11849,7 +11778,7 @@ var testCronCleanupSandboxesStateContract = c24.router({
11849
11778
 
11850
11779
  // ../../packages/api-contracts/src/contracts/test-slack-dispatch-probe.ts
11851
11780
  init_esm_shims();
11852
- var c25 = initContract();
11781
+ var c28 = initContract();
11853
11782
  var testSlackDispatchProbeBodySchema = external_exports.object({
11854
11783
  team_id: external_exports.string(),
11855
11784
  channel_id: external_exports.string(),
@@ -11877,7 +11806,7 @@ var testSlackDispatchProbeResponseSchema = external_exports.union([
11877
11806
  testSlackDispatchProbeSuccessResponseSchema,
11878
11807
  testSlackDispatchProbeFailureResponseSchema
11879
11808
  ]);
11880
- var testSlackDispatchProbeContract = c25.router({
11809
+ var testSlackDispatchProbeContract = c28.router({
11881
11810
  post: {
11882
11811
  method: "POST",
11883
11812
  path: "/api/test/slack-dispatch-probe",
@@ -11893,7 +11822,7 @@ var testSlackDispatchProbeContract = c25.router({
11893
11822
 
11894
11823
  // ../../packages/api-contracts/src/contracts/test-slack-state.ts
11895
11824
  init_esm_shims();
11896
- var c26 = initContract();
11825
+ var c29 = initContract();
11897
11826
  var testSlackStateErrorSchema = external_exports.object({
11898
11827
  error: external_exports.string()
11899
11828
  });
@@ -11986,13 +11915,6 @@ var testSlackStateResponseSchema = external_exports.object({
11986
11915
  promptPreview: external_exports.string().nullable()
11987
11916
  })
11988
11917
  ),
11989
- artifact_storage: external_exports.object({
11990
- id: external_exports.string(),
11991
- headVersionId: external_exports.string().nullable(),
11992
- s3Prefix: external_exports.string(),
11993
- versionId: external_exports.string().nullable(),
11994
- versionS3Key: external_exports.string().nullable()
11995
- }).nullable(),
11996
11918
  org_metadata: external_exports.object({
11997
11919
  orgId: external_exports.string(),
11998
11920
  defaultAgentId: external_exports.string().nullable(),
@@ -12024,15 +11946,14 @@ var testSlackStateResponseSchema = external_exports.object({
12024
11946
  })
12025
11947
  )
12026
11948
  });
12027
- var testSlackStateContract = c26.router({
11949
+ var testSlackStateContract = c29.router({
12028
11950
  get: {
12029
11951
  method: "GET",
12030
11952
  path: "/api/test/slack-state",
12031
11953
  query: external_exports.object({
12032
11954
  team_id: external_exports.string().optional(),
12033
11955
  empty_team_id: external_exports.literal("1").optional(),
12034
- org_id: external_exports.string().optional(),
12035
- user_id: external_exports.string().optional()
11956
+ org_id: external_exports.string().optional()
12036
11957
  }),
12037
11958
  responses: {
12038
11959
  200: testSlackStateResponseSchema,
@@ -12070,7 +11991,7 @@ var testSlackStateContract = c26.router({
12070
11991
 
12071
11992
  // ../../packages/api-contracts/src/contracts/test-slack-mock.ts
12072
11993
  init_esm_shims();
12073
- var c27 = initContract();
11994
+ var c30 = initContract();
12074
11995
  var slackMockRequestBodySchema = external_exports.record(external_exports.string(), external_exports.unknown()).optional();
12075
11996
  var slackMockNotFoundSchema = external_exports.string();
12076
11997
  var testSlackMockOkResponseSchema = external_exports.object({
@@ -12136,7 +12057,7 @@ var testSlackMockUsersInfoResponseSchema = testSlackMockOkResponseSchema.extend(
12136
12057
  })
12137
12058
  })
12138
12059
  });
12139
- var testSlackMockContract = c27.router({
12060
+ var testSlackMockContract = c30.router({
12140
12061
  assistantThreadsSetStatus: {
12141
12062
  method: "POST",
12142
12063
  path: "/api/test/slack-mock/assistant.threads.setStatus",
@@ -12241,7 +12162,7 @@ var testSlackMockContract = c27.router({
12241
12162
 
12242
12163
  // ../../packages/api-contracts/src/contracts/test-telegram-mock.ts
12243
12164
  init_esm_shims();
12244
- var c28 = initContract();
12165
+ var c31 = initContract();
12245
12166
  var testTelegramMockPathParamsSchema = external_exports.object({
12246
12167
  botToken: external_exports.string(),
12247
12168
  method: external_exports.string()
@@ -12254,7 +12175,7 @@ var testTelegramMockErrorResponseSchema = external_exports.object({
12254
12175
  ok: external_exports.literal(false),
12255
12176
  description: external_exports.string()
12256
12177
  });
12257
- var testTelegramMockContract = c28.router({
12178
+ var testTelegramMockContract = c31.router({
12258
12179
  post: {
12259
12180
  method: "POST",
12260
12181
  path: "/api/test/telegram-mock/:botToken/:method",
@@ -12270,7 +12191,7 @@ var testTelegramMockContract = c28.router({
12270
12191
 
12271
12192
  // ../../packages/api-contracts/src/contracts/test-teams-mock.ts
12272
12193
  init_esm_shims();
12273
- var c29 = initContract();
12194
+ var c32 = initContract();
12274
12195
  var teamsMockBodySchema = external_exports.record(external_exports.string(), external_exports.unknown()).optional();
12275
12196
  var teamsMockOkSchema = external_exports.object({ ok: external_exports.literal(true) });
12276
12197
  var teamsMockTokenResponseSchema = external_exports.object({
@@ -12306,7 +12227,7 @@ var testTeamsMockGraphMessagePathParamsSchema = testTeamsMockGraphMessagesPathPa
12306
12227
  var testTeamsMockGraphUserPathParamsSchema = external_exports.object({
12307
12228
  userId: external_exports.string()
12308
12229
  });
12309
- var testTeamsMockContract = c29.router({
12230
+ var testTeamsMockContract = c32.router({
12310
12231
  token: {
12311
12232
  method: "POST",
12312
12233
  path: "/api/test/teams-mock/token",
@@ -12415,7 +12336,7 @@ var testTeamsMockContract = c29.router({
12415
12336
 
12416
12337
  // ../../packages/api-contracts/src/contracts/test-teams-state.ts
12417
12338
  init_esm_shims();
12418
- var c30 = initContract();
12339
+ var c33 = initContract();
12419
12340
  var testTeamsStateErrorSchema = external_exports.object({
12420
12341
  error: external_exports.string()
12421
12342
  });
@@ -12536,7 +12457,7 @@ var testTeamsStateResponseSchema = external_exports.object({
12536
12457
  })
12537
12458
  )
12538
12459
  });
12539
- var testTeamsStateContract = c30.router({
12460
+ var testTeamsStateContract = c33.router({
12540
12461
  get: {
12541
12462
  method: "GET",
12542
12463
  path: "/api/test/teams-state",
@@ -12580,7 +12501,7 @@ var testTeamsStateContract = c30.router({
12580
12501
 
12581
12502
  // ../../packages/api-contracts/src/contracts/test-telegram-state.ts
12582
12503
  init_esm_shims();
12583
- var c31 = initContract();
12504
+ var c34 = initContract();
12584
12505
  var testTelegramStateQuerySchema = external_exports.object({
12585
12506
  bot_id: external_exports.string().optional()
12586
12507
  });
@@ -12656,7 +12577,7 @@ var testTelegramStateSeedResponseSchema = external_exports.object({
12656
12577
  user_link_id: external_exports.string().nullable(),
12657
12578
  default_agent_id: external_exports.string()
12658
12579
  });
12659
- var testTelegramStateContract = c31.router({
12580
+ var testTelegramStateContract = c34.router({
12660
12581
  get: {
12661
12582
  method: "GET",
12662
12583
  path: "/api/test/telegram-state",
@@ -12705,7 +12626,7 @@ var testTelegramStateContract = c31.router({
12705
12626
 
12706
12627
  // ../../packages/api-contracts/src/contracts/cron.ts
12707
12628
  init_esm_shims();
12708
- var c32 = initContract();
12629
+ var c35 = initContract();
12709
12630
  var cleanupResultSchema = external_exports.object({
12710
12631
  runId: external_exports.string(),
12711
12632
  sandboxId: external_exports.string().nullable(),
@@ -12720,7 +12641,7 @@ var cleanupResponseSchema = external_exports.object({
12720
12641
  exportJobsCleaned: external_exports.number(),
12721
12642
  exportJobsStuck: external_exports.number()
12722
12643
  });
12723
- var cronCleanupSandboxesContract = c32.router({
12644
+ var cronCleanupSandboxesContract = c35.router({
12724
12645
  /**
12725
12646
  * GET /api/cron/cleanup-sandboxes
12726
12647
  * Cron job to cleanup sandboxes that have stopped sending heartbeats
@@ -12846,6 +12767,11 @@ var cronExecuteWorkflowAutomationsResponseSchema = external_exports.object({
12846
12767
  executed: external_exports.number(),
12847
12768
  skipped: external_exports.number()
12848
12769
  });
12770
+ var cronExecuteMorningBriefsResponseSchema = external_exports.object({
12771
+ success: external_exports.literal(true),
12772
+ executed: external_exports.number(),
12773
+ skipped: external_exports.number()
12774
+ });
12849
12775
  var cronRenewGmailWatchesResponseSchema = external_exports.object({
12850
12776
  success: external_exports.literal(true),
12851
12777
  renewed: external_exports.number(),
@@ -12902,7 +12828,7 @@ var cronAggregateModelStatsResponseSchema = external_exports.object({
12902
12828
  windowEnd: external_exports.string(),
12903
12829
  aggregated: external_exports.number()
12904
12830
  });
12905
- var cronAggregateUsageContract = c32.router({
12831
+ var cronAggregateUsageContract = c35.router({
12906
12832
  aggregate: {
12907
12833
  method: "GET",
12908
12834
  path: "/api/cron/aggregate-usage",
@@ -12914,7 +12840,7 @@ var cronAggregateUsageContract = c32.router({
12914
12840
  summary: "Aggregate daily usage cache"
12915
12841
  }
12916
12842
  });
12917
- var cronProcessUsageEventsContract = c32.router({
12843
+ var cronProcessUsageEventsContract = c35.router({
12918
12844
  process: {
12919
12845
  method: "GET",
12920
12846
  path: "/api/cron/process-usage-events",
@@ -12926,7 +12852,7 @@ var cronProcessUsageEventsContract = c32.router({
12926
12852
  summary: "Process pending usage events"
12927
12853
  }
12928
12854
  });
12929
- var cronCompactChatThreadSnapshotsContract = c32.router({
12855
+ var cronCompactChatThreadSnapshotsContract = c35.router({
12930
12856
  compact: {
12931
12857
  method: "GET",
12932
12858
  path: "/api/cron/compact-chat-thread-snapshots",
@@ -12938,7 +12864,7 @@ var cronCompactChatThreadSnapshotsContract = c32.router({
12938
12864
  summary: "Compact chat thread snapshots from lifecycle events"
12939
12865
  }
12940
12866
  });
12941
- var cronMonitorChatMessageQueueContract = c32.router({
12867
+ var cronMonitorChatMessageQueueContract = c35.router({
12942
12868
  monitor: {
12943
12869
  method: "GET",
12944
12870
  path: "/api/cron/monitor-chat-message-queue",
@@ -12951,7 +12877,7 @@ var cronMonitorChatMessageQueueContract = c32.router({
12951
12877
  summary: "Monitor for orphaned queued chat messages"
12952
12878
  }
12953
12879
  });
12954
- var cronReconcileBillingEntitlementsContract = c32.router({
12880
+ var cronReconcileBillingEntitlementsContract = c35.router({
12955
12881
  reconcile: {
12956
12882
  method: "GET",
12957
12883
  path: "/api/cron/reconcile-billing-entitlements",
@@ -12963,7 +12889,7 @@ var cronReconcileBillingEntitlementsContract = c32.router({
12963
12889
  summary: "Reconcile billing entitlements"
12964
12890
  }
12965
12891
  });
12966
- var cronTelegramCleanupContract = c32.router({
12892
+ var cronTelegramCleanupContract = c35.router({
12967
12893
  cleanup: {
12968
12894
  method: "GET",
12969
12895
  path: "/api/cron/telegram-cleanup",
@@ -12975,7 +12901,7 @@ var cronTelegramCleanupContract = c32.router({
12975
12901
  summary: "Delete expired Telegram messages"
12976
12902
  }
12977
12903
  });
12978
- var cronComputerUseScreenshotCleanupContract = c32.router({
12904
+ var cronComputerUseScreenshotCleanupContract = c35.router({
12979
12905
  cleanup: {
12980
12906
  method: "GET",
12981
12907
  path: "/api/cron/computer-use-screenshot-cleanup",
@@ -12987,7 +12913,7 @@ var cronComputerUseScreenshotCleanupContract = c32.router({
12987
12913
  summary: "Delete expired desktop computer-use screenshots"
12988
12914
  }
12989
12915
  });
12990
- var cronArtifactPreviewContract = c32.router({
12916
+ var cronArtifactPreviewContract = c35.router({
12991
12917
  generate: {
12992
12918
  method: "GET",
12993
12919
  path: "/api/cron/artifact-preview",
@@ -12999,7 +12925,7 @@ var cronArtifactPreviewContract = c32.router({
12999
12925
  summary: "Render static preview images for HTML/website artifacts"
13000
12926
  }
13001
12927
  });
13002
- var cronDrainEmailOutboxContract = c32.router({
12928
+ var cronDrainEmailOutboxContract = c35.router({
13003
12929
  drain: {
13004
12930
  method: "GET",
13005
12931
  path: "/api/cron/drain-email-outbox",
@@ -13011,7 +12937,7 @@ var cronDrainEmailOutboxContract = c32.router({
13011
12937
  summary: "Drain pending email outbox messages"
13012
12938
  }
13013
12939
  });
13014
- var cronRenewGmailWatchesContract = c32.router({
12940
+ var cronRenewGmailWatchesContract = c35.router({
13015
12941
  renew: {
13016
12942
  method: "GET",
13017
12943
  path: "/api/cron/renew-gmail-watches",
@@ -13023,7 +12949,7 @@ var cronRenewGmailWatchesContract = c32.router({
13023
12949
  summary: "Renew Gmail push notification watches"
13024
12950
  }
13025
12951
  });
13026
- var cronRenewGoogleCalendarWatchesContract = c32.router({
12952
+ var cronRenewGoogleCalendarWatchesContract = c35.router({
13027
12953
  renew: {
13028
12954
  method: "GET",
13029
12955
  path: "/api/cron/renew-google-calendar-watches",
@@ -13035,7 +12961,7 @@ var cronRenewGoogleCalendarWatchesContract = c32.router({
13035
12961
  summary: "Renew Google Calendar push notification watches"
13036
12962
  }
13037
12963
  });
13038
- var cronRenewGoogleWorkspaceEventSubscriptionsContract = c32.router({
12964
+ var cronRenewGoogleWorkspaceEventSubscriptionsContract = c35.router({
13039
12965
  renew: {
13040
12966
  method: "GET",
13041
12967
  path: "/api/cron/renew-google-workspace-event-subscriptions",
@@ -13047,7 +12973,7 @@ var cronRenewGoogleWorkspaceEventSubscriptionsContract = c32.router({
13047
12973
  summary: "Renew Google Workspace Events subscriptions"
13048
12974
  }
13049
12975
  });
13050
- var cronSyncSkillsContract = c32.router({
12976
+ var cronSyncSkillsContract = c35.router({
13051
12977
  sync: {
13052
12978
  method: "GET",
13053
12979
  path: "/api/cron/sync-skills",
@@ -13059,7 +12985,7 @@ var cronSyncSkillsContract = c32.router({
13059
12985
  summary: "Sync official skills from the skills repository"
13060
12986
  }
13061
12987
  });
13062
- var cronConnectorCatalogContract = c32.router({
12988
+ var cronConnectorCatalogContract = c35.router({
13063
12989
  sync: {
13064
12990
  method: "GET",
13065
12991
  path: "/api/cron/sync-connector-catalog",
@@ -13081,7 +13007,7 @@ var cronConnectorCatalogContract = c32.router({
13081
13007
  summary: "Read connector catalog sync status"
13082
13008
  }
13083
13009
  });
13084
- var cronExecuteWorkflowAutomationsContract = c32.router({
13010
+ var cronExecuteWorkflowAutomationsContract = c35.router({
13085
13011
  execute: {
13086
13012
  method: "GET",
13087
13013
  path: "/api/cron/execute-workflow-automations",
@@ -13093,7 +13019,19 @@ var cronExecuteWorkflowAutomationsContract = c32.router({
13093
13019
  summary: "Execute due workflow automations"
13094
13020
  }
13095
13021
  });
13096
- var cronAggregateInsightsContract = c32.router({
13022
+ var cronExecuteMorningBriefsContract = c35.router({
13023
+ execute: {
13024
+ method: "GET",
13025
+ path: "/api/cron/execute-morning-briefs",
13026
+ headers: authHeadersSchema,
13027
+ responses: {
13028
+ 200: cronExecuteMorningBriefsResponseSchema,
13029
+ 401: apiErrorSchema
13030
+ },
13031
+ summary: "Execute due morning briefs"
13032
+ }
13033
+ });
13034
+ var cronAggregateInsightsContract = c35.router({
13097
13035
  aggregate: {
13098
13036
  method: "GET",
13099
13037
  path: "/api/cron/aggregate-insights",
@@ -13105,7 +13043,7 @@ var cronAggregateInsightsContract = c32.router({
13105
13043
  summary: "Aggregate daily usage insights"
13106
13044
  }
13107
13045
  });
13108
- var cronAggregateModelStatsContract = c32.router({
13046
+ var cronAggregateModelStatsContract = c35.router({
13109
13047
  aggregate: {
13110
13048
  method: "GET",
13111
13049
  path: "/api/cron/aggregate-model-stats",
@@ -13120,7 +13058,7 @@ var cronAggregateModelStatsContract = c32.router({
13120
13058
  summary: "Aggregate hourly model usage statistics"
13121
13059
  }
13122
13060
  });
13123
- var cronSummarizeMemoryContract = c32.router({
13061
+ var cronSummarizeMemoryContract = c35.router({
13124
13062
  summarize: {
13125
13063
  method: "GET",
13126
13064
  path: "/api/cron/summarize-memory",
@@ -13132,7 +13070,7 @@ var cronSummarizeMemoryContract = c32.router({
13132
13070
  summary: "Summarize daily memory changes per user"
13133
13071
  }
13134
13072
  });
13135
- var cronRefreshStoragePresignedUrlsContract = c32.router({
13073
+ var cronRefreshStoragePresignedUrlsContract = c35.router({
13136
13074
  refresh: {
13137
13075
  method: "GET",
13138
13076
  path: "/api/cron/refresh-storage-presigned-urls",
@@ -13145,199 +13083,83 @@ var cronRefreshStoragePresignedUrlsContract = c32.router({
13145
13083
  }
13146
13084
  });
13147
13085
 
13148
- // ../../packages/api-contracts/src/contracts/chat-threads-v1.ts
13086
+ // ../../packages/api-contracts/src/contracts/sessions.ts
13149
13087
  init_esm_shims();
13150
- var c33 = initContract();
13151
- var v1ThreadSchema = external_exports.object({
13088
+ var c36 = initContract();
13089
+ var sessionResponseSchema = external_exports.object({
13152
13090
  id: external_exports.string(),
13153
- title: external_exports.string().nullable(),
13091
+ agentComposeId: external_exports.string(),
13092
+ conversationId: external_exports.string().nullable(),
13093
+ artifactNames: external_exports.array(external_exports.string()),
13094
+ secretNames: external_exports.array(external_exports.string()).nullable(),
13154
13095
  createdAt: external_exports.string(),
13155
13096
  updatedAt: external_exports.string()
13156
13097
  });
13157
- var v1MessageSchema = external_exports.object({
13098
+ var agentComposeSnapshotSchema = external_exports.object({
13099
+ agentComposeVersionId: external_exports.string(),
13100
+ vars: external_exports.record(external_exports.string(), external_exports.string()).optional(),
13101
+ secretNames: external_exports.array(external_exports.string()).optional()
13102
+ });
13103
+ var volumeVersionsSnapshotSchema = external_exports.object({
13104
+ versions: external_exports.record(external_exports.string(), external_exports.string())
13105
+ });
13106
+ var checkpointResponseSchema = external_exports.object({
13158
13107
  id: external_exports.string(),
13159
- role: external_exports.enum(["user", "assistant"]),
13160
- content: external_exports.string().nullable(),
13161
- error: external_exports.string().optional(),
13108
+ runId: external_exports.string(),
13109
+ conversationId: external_exports.string(),
13110
+ agentComposeSnapshot: agentComposeSnapshotSchema,
13111
+ // Checkpoints persist context-artifact arrays, while the GET handler
13112
+ // projects them to this stable name-to-version response map.
13113
+ artifactSnapshots: external_exports.record(external_exports.string(), external_exports.string()).nullable(),
13114
+ volumeVersionsSnapshot: volumeVersionsSnapshotSchema.nullable(),
13162
13115
  createdAt: external_exports.string()
13163
13116
  });
13164
- var chatThreadV1GetContract = c33.router({
13165
- get: {
13117
+ var sessionsByIdContract = c36.router({
13118
+ /**
13119
+ * GET /api/agent/sessions/:id
13120
+ * Get session by ID
13121
+ */
13122
+ getById: {
13166
13123
  method: "GET",
13167
- path: "/api/v1/chat-threads/:threadId",
13124
+ path: "/api/agent/sessions/:id",
13168
13125
  headers: authHeadersSchema,
13169
- pathParams: external_exports.object({ threadId: external_exports.string().uuid() }),
13126
+ pathParams: external_exports.object({
13127
+ id: external_exports.string().min(1, "Session ID is required")
13128
+ }),
13170
13129
  responses: {
13171
- 200: v1ThreadSchema,
13130
+ 200: sessionResponseSchema,
13172
13131
  401: apiErrorSchema,
13173
13132
  403: apiErrorSchema,
13174
13133
  404: apiErrorSchema
13175
13134
  },
13176
- summary: "Get a chat thread"
13135
+ summary: "Get session by ID"
13177
13136
  }
13178
13137
  });
13179
- var chatThreadV1MessagesContract = c33.router({
13180
- list: {
13138
+ var checkpointsByIdContract = c36.router({
13139
+ /**
13140
+ * GET /api/agent/checkpoints/:id
13141
+ * Get checkpoint by ID
13142
+ */
13143
+ getById: {
13181
13144
  method: "GET",
13182
- path: "/api/v1/chat-threads/:threadId/messages",
13145
+ path: "/api/agent/checkpoints/:id",
13183
13146
  headers: authHeadersSchema,
13184
- pathParams: external_exports.object({ threadId: external_exports.string().uuid() }),
13185
- query: external_exports.object({
13186
- sinceId: external_exports.string().uuid().optional(),
13187
- beforeId: external_exports.string().uuid().optional(),
13188
- limit: external_exports.coerce.number().min(1).max(100).default(50)
13147
+ pathParams: external_exports.object({
13148
+ id: external_exports.string().min(1, "Checkpoint ID is required")
13189
13149
  }),
13190
13150
  responses: {
13191
- 200: external_exports.object({ messages: external_exports.array(v1MessageSchema) }),
13151
+ 200: checkpointResponseSchema,
13192
13152
  401: apiErrorSchema,
13193
13153
  403: apiErrorSchema,
13194
13154
  404: apiErrorSchema
13195
13155
  },
13196
- summary: "List messages in a chat thread"
13197
- }
13198
- });
13199
- var chatThreadV1SendContract = c33.router({
13200
- send: {
13201
- method: "POST",
13202
- path: "/api/v1/chat-threads/messages",
13203
- headers: authHeadersSchema,
13204
- body: external_exports.object({
13205
- prompt: external_exports.string().min(1),
13206
- threadId: external_exports.string().uuid()
13207
- }),
13208
- responses: {
13209
- 201: external_exports.object({
13210
- threadId: external_exports.string(),
13211
- messageId: external_exports.string(),
13212
- runId: external_exports.string().nullable(),
13213
- createdAt: external_exports.string()
13214
- }),
13215
- 400: apiErrorSchema,
13216
- 401: apiErrorSchema,
13217
- 402: apiErrorSchema,
13218
- 403: apiErrorSchema,
13219
- 404: apiErrorSchema,
13220
- 409: apiErrorSchema,
13221
- 422: apiErrorSchema,
13222
- 429: apiErrorSchema,
13223
- 503: apiErrorSchema
13224
- },
13225
- summary: "Send a chat message to an existing thread"
13226
- }
13227
- });
13228
-
13229
- // ../../packages/api-contracts/src/contracts/device-token.ts
13230
- init_esm_shims();
13231
- var c34 = initContract();
13232
- var bb0DeviceCodeSchema = external_exports.string().regex(/^[A-Z2-9]{4}-[A-Z2-9]{4}$/);
13233
- var bleSessionNonceSchema = external_exports.string().min(16).max(128).regex(/^[A-Za-z0-9._:-]+$/);
13234
- var pollTokenSchema = external_exports.string().min(32).max(256).regex(/^[A-Za-z0-9._-]+$/);
13235
- var createDeviceTokenRequestSchema = external_exports.object({
13236
- device_type: external_exports.literal("bb0"),
13237
- ble_session_nonce: bleSessionNonceSchema.optional()
13238
- });
13239
- var createDeviceTokenResponseSchema = external_exports.object({
13240
- device_code: bb0DeviceCodeSchema,
13241
- expires_in: external_exports.number().int().positive(),
13242
- interval: external_exports.number().int().positive(),
13243
- poll_token: pollTokenSchema
13244
- });
13245
- var pollDeviceTokenRequestSchema = external_exports.object({
13246
- device_code: bb0DeviceCodeSchema,
13247
- poll_token: pollTokenSchema
13248
- });
13249
- var pollDeviceTokenPendingResponseSchema = external_exports.object({
13250
- status: external_exports.literal("pending"),
13251
- interval: external_exports.number().int().positive()
13252
- });
13253
- var pollDeviceTokenApprovedResponseSchema = external_exports.object({
13254
- status: external_exports.literal("approved"),
13255
- api_token: external_exports.string(),
13256
- thread_id: external_exports.string().uuid()
13257
- });
13258
- var pollDeviceTokenExpiredResponseSchema = external_exports.object({
13259
- status: external_exports.literal("expired")
13260
- });
13261
- var pollDeviceTokenInvalidResponseSchema = external_exports.object({
13262
- status: external_exports.literal("invalid")
13263
- });
13264
- var confirmBb0DeviceRequestSchema = external_exports.object({
13265
- device_code: bb0DeviceCodeSchema
13266
- });
13267
- var confirmBb0DeviceResponseSchema = external_exports.object({
13268
- status: external_exports.literal("approved")
13269
- });
13270
- var deviceTokenContract = c34.router({
13271
- create: {
13272
- method: "POST",
13273
- path: "/api/device-token",
13274
- body: createDeviceTokenRequestSchema,
13275
- responses: {
13276
- 200: createDeviceTokenResponseSchema,
13277
- 400: apiErrorSchema
13278
- },
13279
- summary: "Create a short-lived device code for embedded device onboarding"
13280
- },
13281
- poll: {
13282
- method: "POST",
13283
- path: "/api/device-token/poll",
13284
- body: pollDeviceTokenRequestSchema,
13285
- responses: {
13286
- 200: pollDeviceTokenApprovedResponseSchema,
13287
- 202: pollDeviceTokenPendingResponseSchema,
13288
- 400: apiErrorSchema,
13289
- 404: pollDeviceTokenInvalidResponseSchema,
13290
- 410: pollDeviceTokenExpiredResponseSchema
13291
- },
13292
- summary: "Poll a bb0 device code for approval and final credentials"
13293
- }
13294
- });
13295
- var bb0DeviceConfirmContract = c34.router({
13296
- confirm: {
13297
- method: "POST",
13298
- path: "/api/zero/devices/bb0/confirm",
13299
- headers: authHeadersSchema,
13300
- body: confirmBb0DeviceRequestSchema,
13301
- responses: {
13302
- 200: confirmBb0DeviceResponseSchema,
13303
- 400: apiErrorSchema,
13304
- 401: apiErrorSchema,
13305
- 403: apiErrorSchema,
13306
- 404: apiErrorSchema
13307
- },
13308
- summary: "Confirm a bb0 device code for the authenticated user"
13309
- }
13310
- });
13311
-
13312
- // ../../packages/api-contracts/src/contracts/audio-transcriptions-v1.ts
13313
- init_esm_shims();
13314
- var c35 = initContract();
13315
- var audioTranscriptionV1Schema = external_exports.object({
13316
- text: external_exports.string()
13317
- });
13318
- var audioTranscriptionsV1Contract = c35.router({
13319
- transcribe: {
13320
- method: "POST",
13321
- path: "/api/v1/audio/transcriptions",
13322
- headers: authHeadersSchema,
13323
- body: c35.type(),
13324
- responses: {
13325
- 200: audioTranscriptionV1Schema,
13326
- 400: apiErrorSchema,
13327
- 401: apiErrorSchema,
13328
- 402: apiErrorSchema,
13329
- 403: apiErrorSchema,
13330
- 413: apiErrorSchema,
13331
- 429: apiErrorSchema,
13332
- 500: apiErrorSchema
13333
- },
13334
- summary: "Transcribe raw 16 kHz mono signed 16-bit PCM audio using the existing voice input pipeline"
13156
+ summary: "Get checkpoint by ID"
13335
13157
  }
13336
13158
  });
13337
13159
 
13338
13160
  // ../../packages/api-contracts/src/contracts/realtime.ts
13339
13161
  init_esm_shims();
13340
- var c36 = initContract();
13162
+ var c37 = initContract();
13341
13163
  var ablyTokenRequestSchema = external_exports.object({
13342
13164
  keyName: external_exports.string(),
13343
13165
  ttl: external_exports.number().optional(),
@@ -13347,7 +13169,7 @@ var ablyTokenRequestSchema = external_exports.object({
13347
13169
  nonce: external_exports.string(),
13348
13170
  mac: external_exports.string()
13349
13171
  });
13350
- var runnerRealtimeTokenContract = c36.router({
13172
+ var runnerRealtimeTokenContract = c37.router({
13351
13173
  /**
13352
13174
  * POST /api/runners/realtime/token
13353
13175
  * Get an Ably token to subscribe to a runner group's job notification channel
@@ -13369,7 +13191,7 @@ var runnerRealtimeTokenContract = c36.router({
13369
13191
  summary: "Get Ably token for runner group job notifications"
13370
13192
  }
13371
13193
  });
13372
- var platformRealtimeTokenContract = c36.router({
13194
+ var platformRealtimeTokenContract = c37.router({
13373
13195
  /**
13374
13196
  * POST /api/zero/realtime/token
13375
13197
  * Get an Ably token to subscribe to the authenticated user's push channel
@@ -28824,7 +28646,7 @@ var HEX_DIGITS = new Set("0123456789abcdefABCDEF".split(""));
28824
28646
 
28825
28647
  // ../../packages/api-contracts/src/contracts/zero-feature-switches.ts
28826
28648
  init_esm_shims();
28827
- var c37 = initContract();
28649
+ var c38 = initContract();
28828
28650
  var featureSwitchesResponseSchema = external_exports.object({
28829
28651
  switches: external_exports.record(external_exports.string(), external_exports.boolean()),
28830
28652
  effectiveSwitches: external_exports.record(external_exports.string(), external_exports.boolean())
@@ -28832,7 +28654,7 @@ var featureSwitchesResponseSchema = external_exports.object({
28832
28654
  var updateFeatureSwitchesRequestSchema = external_exports.object({
28833
28655
  switches: external_exports.record(external_exports.string(), external_exports.boolean())
28834
28656
  });
28835
- var zeroFeatureSwitchesContract = c37.router({
28657
+ var zeroFeatureSwitchesContract = c38.router({
28836
28658
  get: {
28837
28659
  method: "GET",
28838
28660
  path: "/api/zero/feature-switches",
@@ -28861,7 +28683,7 @@ var zeroFeatureSwitchesContract = c37.router({
28861
28683
  method: "DELETE",
28862
28684
  path: "/api/zero/feature-switches",
28863
28685
  headers: authHeadersSchema,
28864
- body: c37.noBody(),
28686
+ body: c38.noBody(),
28865
28687
  responses: {
28866
28688
  200: external_exports.object({ deleted: external_exports.literal(true) }),
28867
28689
  401: apiErrorSchema,
@@ -28873,7 +28695,7 @@ var zeroFeatureSwitchesContract = c37.router({
28873
28695
 
28874
28696
  // ../../packages/api-contracts/src/contracts/zero-memory.ts
28875
28697
  init_esm_shims();
28876
- var c38 = initContract();
28698
+ var c39 = initContract();
28877
28699
  var memoryFileSchema = external_exports.object({
28878
28700
  path: external_exports.string(),
28879
28701
  size: external_exports.number()
@@ -28891,7 +28713,7 @@ var memoryDetailResponseSchema = external_exports.object({
28891
28713
  files: external_exports.array(memoryFileSchema),
28892
28714
  fileContents: external_exports.array(memoryFileContentSchema)
28893
28715
  });
28894
- var zeroMemoryContract = c38.router({
28716
+ var zeroMemoryContract = c39.router({
28895
28717
  get: {
28896
28718
  method: "GET",
28897
28719
  path: "/api/zero/memory",
@@ -28907,7 +28729,7 @@ var zeroMemoryContract = c38.router({
28907
28729
 
28908
28730
  // ../../packages/api-contracts/src/contracts/onboarding.ts
28909
28731
  init_esm_shims();
28910
- var c39 = initContract();
28732
+ var c40 = initContract();
28911
28733
  var onboardingStatusResponseSchema = external_exports.object({
28912
28734
  needsOnboarding: external_exports.boolean(),
28913
28735
  onboardingComplete: external_exports.boolean(),
@@ -28922,7 +28744,7 @@ var onboardingStatusResponseSchema = external_exports.object({
28922
28744
  avatarUrl: external_exports.string().optional()
28923
28745
  }).nullable()
28924
28746
  });
28925
- var onboardingStatusContract = c39.router({
28747
+ var onboardingStatusContract = c40.router({
28926
28748
  getStatus: {
28927
28749
  method: "GET",
28928
28750
  path: "/api/zero/onboarding/status",
@@ -28934,7 +28756,7 @@ var onboardingStatusContract = c39.router({
28934
28756
  summary: "Get onboarding status for current user"
28935
28757
  }
28936
28758
  });
28937
- var onboardingCompleteContract = c39.router({
28759
+ var onboardingCompleteContract = c40.router({
28938
28760
  complete: {
28939
28761
  method: "POST",
28940
28762
  path: "/api/zero/onboarding/complete",
@@ -28962,7 +28784,7 @@ var skillFrontmatterSchema = external_exports.object({
28962
28784
 
28963
28785
  // ../../packages/api-contracts/src/contracts/zero-codex-device-auth.ts
28964
28786
  init_esm_shims();
28965
- var c40 = initContract();
28787
+ var c41 = initContract();
28966
28788
  var codexDeviceAuthScopeSchema = external_exports.enum(["org", "personal"]);
28967
28789
  var codexDeviceAuthStartResponseSchema = external_exports.object({
28968
28790
  sessionToken: external_exports.string(),
@@ -28988,7 +28810,7 @@ var codexDeviceAuthCompleteResponseSchema = external_exports.discriminatedUnion(
28988
28810
  var codexDeviceAuthCancelResponseSchema = external_exports.object({
28989
28811
  status: external_exports.literal("cancelled")
28990
28812
  });
28991
- var zeroCodexDeviceAuthContract = c40.router({
28813
+ var zeroCodexDeviceAuthContract = c41.router({
28992
28814
  start: {
28993
28815
  method: "POST",
28994
28816
  path: "/api/zero/model-providers/codex/device-auth/sessions",
@@ -29036,7 +28858,7 @@ var zeroCodexDeviceAuthContract = c40.router({
29036
28858
 
29037
28859
  // ../../packages/api-contracts/src/contracts/zero-claude-code-device-auth.ts
29038
28860
  init_esm_shims();
29039
- var c41 = initContract();
28861
+ var c42 = initContract();
29040
28862
  var claudeCodeDeviceAuthScopeSchema = external_exports.enum(["org", "personal"]);
29041
28863
  var claudeCodeDeviceAuthStartResponseSchema = external_exports.object({
29042
28864
  sessionToken: external_exports.string(),
@@ -29054,7 +28876,7 @@ var claudeCodeDeviceAuthCompleteResponseSchema = external_exports.object({
29054
28876
  var claudeCodeDeviceAuthCancelResponseSchema = external_exports.object({
29055
28877
  status: external_exports.literal("cancelled")
29056
28878
  });
29057
- var zeroClaudeCodeDeviceAuthContract = c41.router({
28879
+ var zeroClaudeCodeDeviceAuthContract = c42.router({
29058
28880
  start: {
29059
28881
  method: "POST",
29060
28882
  path: "/api/zero/model-providers/claude-code/device-auth/sessions",
@@ -29105,12 +28927,12 @@ var zeroClaudeCodeDeviceAuthContract = c41.router({
29105
28927
 
29106
28928
  // ../../packages/api-contracts/src/contracts/zero-org-logo.ts
29107
28929
  init_esm_shims();
29108
- var c42 = initContract();
28930
+ var c43 = initContract();
29109
28931
  var zeroOrgLogoResponseSchema = external_exports.object({
29110
28932
  logoUrl: external_exports.string().nullable(),
29111
28933
  hasImage: external_exports.boolean()
29112
28934
  });
29113
- var zeroOrgLogoContract = c42.router({
28935
+ var zeroOrgLogoContract = c43.router({
29114
28936
  get: {
29115
28937
  method: "GET",
29116
28938
  path: "/api/zero/org/logo",
@@ -29128,7 +28950,7 @@ var zeroOrgLogoContract = c42.router({
29128
28950
  path: "/api/zero/org/logo",
29129
28951
  headers: authHeadersSchema,
29130
28952
  contentType: "multipart/form-data",
29131
- body: c42.type(),
28953
+ body: c43.type(),
29132
28954
  responses: {
29133
28955
  200: zeroOrgLogoResponseSchema,
29134
28956
  400: apiErrorSchema,
@@ -29155,8 +28977,8 @@ var zeroOrgLogoContract = c42.router({
29155
28977
 
29156
28978
  // ../../packages/api-contracts/src/contracts/zero-composes.ts
29157
28979
  init_esm_shims();
29158
- var c43 = initContract();
29159
- var zeroComposesListContract = c43.router({
28980
+ var c44 = initContract();
28981
+ var zeroComposesListContract = c44.router({
29160
28982
  list: {
29161
28983
  method: "GET",
29162
28984
  path: "/api/zero/composes/list",
@@ -29176,14 +28998,14 @@ var zeroComposesListContract = c43.router({
29176
28998
 
29177
28999
  // ../../packages/api-contracts/src/contracts/zero-personal-model-providers.ts
29178
29000
  init_esm_shims();
29179
- var c44 = initContract();
29001
+ var c45 = initContract();
29180
29002
  var resetPersonalModelProviderSubscriptionUsageRequestSchema = external_exports.object({
29181
29003
  idempotencyKey: external_exports.uuid()
29182
29004
  });
29183
29005
  var resetPersonalModelProviderSubscriptionUsageResponseSchema = external_exports.object({
29184
29006
  outcome: external_exports.enum(["reset", "nothingToReset", "noCredit", "alreadyRedeemed"])
29185
29007
  });
29186
- var zeroPersonalModelProvidersMainContract = c44.router({
29008
+ var zeroPersonalModelProvidersMainContract = c45.router({
29187
29009
  list: {
29188
29010
  method: "GET",
29189
29011
  path: "/api/zero/me/model-providers",
@@ -29212,7 +29034,7 @@ var zeroPersonalModelProvidersMainContract = c44.router({
29212
29034
  summary: "Create or update a personal model provider for the requesting user"
29213
29035
  }
29214
29036
  });
29215
- var zeroPersonalModelProvidersByTypeContract = c44.router({
29037
+ var zeroPersonalModelProvidersByTypeContract = c45.router({
29216
29038
  delete: {
29217
29039
  method: "DELETE",
29218
29040
  path: "/api/zero/me/model-providers/:type",
@@ -29221,7 +29043,7 @@ var zeroPersonalModelProvidersByTypeContract = c44.router({
29221
29043
  type: modelProviderTypeSchema
29222
29044
  }),
29223
29045
  responses: {
29224
- 204: c44.noBody(),
29046
+ 204: c45.noBody(),
29225
29047
  401: apiErrorSchema,
29226
29048
  404: apiErrorSchema,
29227
29049
  500: apiErrorSchema
@@ -29249,7 +29071,7 @@ var zeroPersonalModelProvidersByTypeContract = c44.router({
29249
29071
 
29250
29072
  // ../../packages/api-contracts/src/contracts/zero-memory-dev-refresh.ts
29251
29073
  init_esm_shims();
29252
- var c45 = initContract();
29074
+ var c46 = initContract();
29253
29075
  var memoryDevRefreshSkippedResponseSchema = external_exports.object({
29254
29076
  skipped: external_exports.literal(true)
29255
29077
  });
@@ -29260,12 +29082,12 @@ var memoryDevRefreshResponseSchema = external_exports.union([
29260
29082
  memoryDevRefreshSkippedResponseSchema,
29261
29083
  memoryDevRefreshSummarizedResponseSchema
29262
29084
  ]);
29263
- var zeroMemoryDevRefreshContract = c45.router({
29085
+ var zeroMemoryDevRefreshContract = c46.router({
29264
29086
  refresh: {
29265
29087
  method: "POST",
29266
29088
  path: "/api/zero/memory/dev-refresh",
29267
29089
  headers: authHeadersSchema,
29268
- body: c45.noBody(),
29090
+ body: c46.noBody(),
29269
29091
  responses: {
29270
29092
  200: memoryDevRefreshResponseSchema,
29271
29093
  401: apiErrorSchema,
@@ -29276,69 +29098,6 @@ var zeroMemoryDevRefreshContract = c45.router({
29276
29098
  }
29277
29099
  });
29278
29100
 
29279
- // ../../packages/api-contracts/src/contracts/api-keys.ts
29280
- init_esm_shims();
29281
- var c46 = initContract();
29282
- var apiKeyItemSchema = external_exports.object({
29283
- id: external_exports.string().uuid(),
29284
- name: external_exports.string(),
29285
- tokenPrefix: external_exports.string(),
29286
- createdAt: external_exports.string(),
29287
- expiresAt: external_exports.string(),
29288
- lastUsedAt: external_exports.string().nullable()
29289
- });
29290
- var apiKeyListResponseSchema = external_exports.object({
29291
- apiKeys: external_exports.array(apiKeyItemSchema)
29292
- });
29293
- var createApiKeyRequestSchema = external_exports.object({
29294
- name: external_exports.string().min(1).max(100),
29295
- expiresInDays: external_exports.number().int().positive().max(3650)
29296
- });
29297
- var createApiKeyResponseSchema = apiKeyItemSchema.extend({
29298
- token: external_exports.string()
29299
- });
29300
- var apiKeysContract = c46.router({
29301
- list: {
29302
- method: "GET",
29303
- path: "/api/zero/api-keys",
29304
- headers: authHeadersSchema,
29305
- responses: {
29306
- 200: apiKeyListResponseSchema,
29307
- 401: apiErrorSchema,
29308
- 500: apiErrorSchema
29309
- },
29310
- summary: "List caller's API keys (metadata only)"
29311
- },
29312
- create: {
29313
- method: "POST",
29314
- path: "/api/zero/api-keys",
29315
- headers: authHeadersSchema,
29316
- body: createApiKeyRequestSchema,
29317
- responses: {
29318
- 201: createApiKeyResponseSchema,
29319
- 400: apiErrorSchema,
29320
- 401: apiErrorSchema,
29321
- 500: apiErrorSchema
29322
- },
29323
- summary: "Create a new API key (token returned once)"
29324
- }
29325
- });
29326
- var apiKeysByIdContract = c46.router({
29327
- delete: {
29328
- method: "DELETE",
29329
- path: "/api/zero/api-keys/:id",
29330
- headers: authHeadersSchema,
29331
- pathParams: external_exports.object({ id: external_exports.string().uuid() }),
29332
- responses: {
29333
- 204: c46.noBody(),
29334
- 401: apiErrorSchema,
29335
- 404: apiErrorSchema,
29336
- 500: apiErrorSchema
29337
- },
29338
- summary: "Revoke (delete) an API key"
29339
- }
29340
- });
29341
-
29342
29101
  // ../../packages/api-contracts/src/contracts/integrations-github.ts
29343
29102
  init_esm_shims();
29344
29103
  var c47 = initContract();
@@ -31925,6 +31684,20 @@ var FEATURE_SWITCHES = {
31925
31684
  enabled: false,
31926
31685
  enabledOrgIdHashes: STAFF_ORG_ID_HASHES
31927
31686
  },
31687
+ ["morningBrief" /* MorningBrief */]: {
31688
+ maintainer: "ethan@vm0.ai",
31689
+ description: "Enable the daily 7:00 local-time Morning Brief email built from GitHub, Gmail, and Google Calendar.",
31690
+ enabled: false,
31691
+ enabledOrgIdHashes: STAFF_ORG_ID_HASHES,
31692
+ userOverridable: true
31693
+ },
31694
+ ["manualMorningBrief" /* ManualMorningBrief */]: {
31695
+ maintainer: "ethan@vm0.ai",
31696
+ description: "Show a Send now button in Settings that triggers a Morning Brief immediately for testing.",
31697
+ enabled: false,
31698
+ enabledOrgIdHashes: STAFF_ORG_ID_HASHES,
31699
+ userOverridable: true
31700
+ },
31928
31701
  ["notionWorkflowAutomations" /* NotionWorkflowAutomations */]: {
31929
31702
  maintainer: "lancy@vm0.ai",
31930
31703
  description: "Enable Notion event workflow automations, starting with child pages created under a configured parent page.",
@@ -31956,12 +31729,6 @@ var FEATURE_SWITCHES = {
31956
31729
  description: "Enable the Workday HCM and finance connector",
31957
31730
  enabled: false
31958
31731
  },
31959
- ["apiKeys" /* ApiKeys */]: {
31960
- maintainer: "ethan@vm0.ai",
31961
- description: "Gate the custom /settings/api-keys UI for issuing personal access tokens used by the /api/v1 public surface. When disabled, the settings page redirects to / and the sidebar menu item is hidden. The backend /api/v1 verification does NOT consult this flag \u2014 previously issued PATs continue to work.",
31962
- enabled: false,
31963
- enabledOrgIdHashes: STAFF_ORG_ID_HASHES
31964
- },
31965
31732
  ["codexFastMode" /* CodexFastMode */]: {
31966
31733
  maintainer: "lancy@vm0.ai",
31967
31734
  description: "Enable Codex fast mode for ChatGPT subscription GPT 5.5 and GPT 5.6 web chat runs.",
@@ -31984,6 +31751,12 @@ var FEATURE_SWITCHES = {
31984
31751
  enabled: false,
31985
31752
  userOverridable: false
31986
31753
  },
31754
+ ["structuredPrompt" /* StructuredPrompt */]: {
31755
+ maintainer: "bingjie@vm0.ai",
31756
+ description: "Enable structured user prompt rendering, sends, and drafts while preserving the legacy content fallback.",
31757
+ enabled: false,
31758
+ enabledOrgIdHashes: STAFF_ORG_ID_HASHES
31759
+ },
31987
31760
  ["zapierConnector" /* ZapierConnector */]: {
31988
31761
  maintainer: "yuma@vm0.ai",
31989
31762
  description: "Enable the Zapier connector. When disabled, Zapier is hidden from the connectors list and cannot be connected.",
@@ -33929,454 +33702,231 @@ var EventRenderer = class _EventRenderer {
33929
33702
  }
33930
33703
  };
33931
33704
 
33932
- // src/commands/run/shared.ts
33705
+ // src/lib/utils/log-pagination.ts
33933
33706
  init_esm_shims();
33934
- var import_dotenv = __toESM(require_main(), 1);
33935
- import * as fs from "fs";
33936
- function collectKeyValue(value, previous) {
33937
- const [key, ...valueParts] = value.split("=");
33938
- const val = valueParts.join("=");
33939
- if (!key || val === void 0 || val === "") {
33940
- throw new Error(`Invalid format: ${value} (expected KEY=value)`);
33707
+ function parsePositiveLogCount(value, optionName) {
33708
+ const trimmed = value.trim();
33709
+ if (!/^0*[1-9]\d*$/.test(trimmed)) {
33710
+ throw new Error(`Option ${optionName} must be a positive integer`);
33941
33711
  }
33942
- return { ...previous, [key]: val };
33943
- }
33944
- function collectVolumeVersions(value, previous) {
33945
- const [volumeName, ...versionParts] = value.split("=");
33946
- const version = versionParts.join("=");
33947
- if (!volumeName || version === void 0 || version === "") {
33948
- throw new Error(
33949
- `Invalid volume-version format: ${value} (expected volumeName=version)`
33950
- );
33712
+ const count = Number(trimmed);
33713
+ if (!Number.isSafeInteger(count)) {
33714
+ throw new Error(`Option ${optionName} must be a positive integer`);
33951
33715
  }
33952
- return { ...previous, [volumeName]: version };
33716
+ return count;
33953
33717
  }
33954
- function parseMount(value, flagLabel) {
33955
- const parts = value.split(":");
33956
- if (parts.length < 2 || parts.length > 3) {
33957
- throw new Error(
33958
- `Invalid ${flagLabel} format: ${value} (expected name:/path or name:version:/path)`
33959
- );
33718
+ function parseBoundedLogCount(value, optionName, min, max) {
33719
+ const trimmed = value.trim();
33720
+ if (!/^\d+$/.test(trimmed)) {
33721
+ throw new Error(`${optionName} must be between ${min} and ${max}`);
33960
33722
  }
33961
- const name = parts[0];
33962
- const mountPath = parts.length === 3 ? parts[2] : parts[1];
33963
- if (!name) {
33964
- throw new Error(
33965
- `Invalid ${flagLabel} format: ${value} (name cannot be empty)`
33966
- );
33967
- }
33968
- if (!mountPath.startsWith("/")) {
33969
- throw new Error(
33970
- `Invalid ${flagLabel} mount path: ${mountPath} (must start with /)`
33971
- );
33972
- }
33973
- if (parts.length === 2) {
33974
- return { name, mountPath };
33975
- }
33976
- const version = parts[1];
33977
- if (!version) {
33978
- throw new Error(
33979
- `Invalid ${flagLabel} format: ${value} (version cannot be empty)`
33980
- );
33723
+ const count = Number(trimmed);
33724
+ if (!Number.isSafeInteger(count) || count < min || count > max) {
33725
+ throw new Error(`${optionName} must be between ${min} and ${max}`);
33981
33726
  }
33982
- return { name, version, mountPath };
33983
- }
33984
- function collectMounts(value, previous) {
33985
- return [...previous, parseMount(value, "volume")];
33727
+ return count;
33986
33728
  }
33987
- function collectArtifacts(value, previous) {
33988
- return [...previous, parseMount(value, "artifact")];
33989
- }
33990
- function parsePermissionPolicies(json) {
33991
- if (!json) return void 0;
33992
- let parsed;
33993
- try {
33994
- parsed = JSON.parse(json);
33995
- } catch {
33996
- throw new Error(
33997
- `Invalid --permission-policies JSON: ${json}
33998
- Expected format: '{"ref": {"permissions": {"perm": "allow|deny|ask"}}}'`
33999
- );
34000
- }
34001
- const result = firewallPoliciesSchema.safeParse(parsed);
34002
- if (!result.success) {
34003
- throw new Error(
34004
- `Invalid --permission-policies: ${result.error.issues.map((i) => {
34005
- return i.message;
34006
- }).join(", ")}`
34007
- );
33729
+ async function collectLogItems(options) {
33730
+ const collected = [];
33731
+ const seenCursors = /* @__PURE__ */ new Set();
33732
+ let cursor2;
33733
+ while (true) {
33734
+ const requestLimit = options.targetCount === "all" ? options.pageLimit : Math.min(options.pageLimit, options.targetCount - collected.length);
33735
+ const page = await options.fetchPage({
33736
+ sinceTime: options.sinceTime,
33737
+ cursor: cursor2,
33738
+ limit: requestLimit,
33739
+ order: options.order
33740
+ });
33741
+ collected.push(...page.items);
33742
+ if (options.targetCount !== "all" && collected.length >= options.targetCount) {
33743
+ break;
33744
+ }
33745
+ const nextCursor = page.nextCursor ?? null;
33746
+ if (!page.hasMore || !nextCursor || seenCursors.has(nextCursor)) {
33747
+ break;
33748
+ }
33749
+ seenCursors.add(nextCursor);
33750
+ cursor2 = nextCursor;
34008
33751
  }
34009
- return result.data;
33752
+ const entries = options.targetCount === "all" ? collected : collected.slice(0, options.targetCount);
33753
+ return options.order === "desc" ? entries.reverse() : entries;
34010
33754
  }
33755
+
33756
+ // src/lib/utils/uuid.ts
33757
+ init_esm_shims();
34011
33758
  var UUID_PATTERN = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;
34012
- function isUUID(str) {
34013
- return UUID_PATTERN.test(str);
34014
- }
34015
- function extractVarNames(composeContent) {
34016
- const grouped = extractAndGroupVariables(composeContent);
34017
- return grouped.vars.map((r) => {
34018
- return r.name;
34019
- });
34020
- }
34021
- function extractSecretNames(composeContent) {
34022
- const grouped = extractAndGroupVariables(composeContent);
34023
- return grouped.secrets.map((r) => {
34024
- return r.name;
34025
- });
33759
+ function isUuid(value) {
33760
+ return UUID_PATTERN.test(value);
34026
33761
  }
34027
- function loadValues(cliValues, configNames, envFilePath) {
34028
- const result = { ...cliValues };
34029
- const missingNames = configNames.filter((name) => {
34030
- return !(name in result);
34031
- });
34032
- if (missingNames.length > 0) {
34033
- const envValues = {};
34034
- for (const name of missingNames) {
34035
- const envValue = process.env[name];
34036
- if (envValue !== void 0) {
34037
- envValues[name] = envValue;
34038
- }
34039
- }
34040
- let fileValues = {};
34041
- if (envFilePath) {
34042
- if (!fs.existsSync(envFilePath)) {
34043
- throw new Error(`Environment file not found: ${envFilePath}`);
34044
- }
34045
- const dotenvResult = (0, import_dotenv.config)({ path: envFilePath, quiet: true });
34046
- if (dotenvResult.parsed) {
34047
- fileValues = Object.fromEntries(
34048
- Object.entries(dotenvResult.parsed).filter(([key]) => {
34049
- return missingNames.includes(key);
34050
- })
34051
- );
34052
- }
34053
- }
34054
- Object.assign(result, envValues, fileValues);
33762
+
33763
+ // src/lib/utils/search-query.ts
33764
+ init_esm_shims();
33765
+ function parseSearchQuery(value, label) {
33766
+ const trimmed = value.trim();
33767
+ if (!trimmed) {
33768
+ throw new Error(`${label} cannot be empty.`);
34055
33769
  }
34056
- return Object.keys(result).length > 0 ? result : void 0;
33770
+ return trimmed;
34057
33771
  }
34058
- function parseIdentifier(identifier) {
34059
- if (isUUID(identifier)) {
34060
- return { name: identifier };
34061
- }
34062
- const colonIndex = identifier.indexOf(":");
34063
- if (colonIndex > 0 && colonIndex < identifier.length - 1) {
34064
- return {
34065
- name: identifier.slice(0, colonIndex),
34066
- version: identifier.slice(colonIndex + 1)
34067
- };
34068
- }
34069
- return { name: identifier };
33772
+
33773
+ // src/commands/zero/logs/search.ts
33774
+ init_esm_shims();
33775
+ var SEVEN_DAYS_MS = 7 * 24 * 60 * 60 * 1e3;
33776
+ function supportedSearchFramework(framework) {
33777
+ const normalized = framework ?? void 0;
33778
+ return isSupportedFramework(normalized) ? normalized : void 0;
34070
33779
  }
34071
- function renderRunCreated(response) {
34072
- if (response.status === "queued") {
34073
- console.log(source_default.yellow("\u26A0 Run queued \u2014 concurrency limit reached"));
34074
- console.log(` Run ID: ${source_default.dim(response.runId)}`);
34075
- console.log(
34076
- source_default.dim(" Will start automatically when a slot is available")
34077
- );
34078
- console.log();
34079
- } else {
34080
- EventRenderer.renderRunStarted({
34081
- runId: response.runId,
34082
- sandboxId: response.sandboxId
34083
- });
33780
+ function renderSearchEvent(event, framework, renderer, normalizer) {
33781
+ const parsedEvents = normalizer.process(
33782
+ event.eventData,
33783
+ supportedSearchFramework(framework),
33784
+ new Date(event.createdAt)
33785
+ );
33786
+ for (const parsed of parsedEvents) {
33787
+ renderer.render(parsed);
34084
33788
  }
34085
33789
  }
34086
- var TERMINAL_RUN_STATUSES = [
34087
- "completed",
34088
- "failed",
34089
- "timeout",
34090
- "cancelled"
34091
- ];
34092
- var POLL_INTERVAL_MS = 1e3;
34093
- var TERMINAL_DRAIN_POLL_INTERVAL_MS = 500;
34094
- var TERMINAL_DRAIN_IDLE_MS = 1e3;
34095
- var TERMINAL_DRAIN_MAX_MS = 3e3;
34096
- function supportedEventFramework(framework) {
34097
- return isSupportedFramework(framework) ? framework : void 0;
34098
- }
34099
- function isTerminalRunState(run) {
34100
- return TERMINAL_RUN_STATUSES.includes(run.status);
34101
- }
34102
- function shouldDrainNextEventPage(response, madeSequenceProgress) {
34103
- return response.hasMore && response.events.length > 0 && madeSequenceProgress;
34104
- }
34105
- function isBlockedBySequenceGap(response, madeSequenceProgress) {
34106
- return response.hasMore && !madeSequenceProgress;
34107
- }
34108
- function hasTerminalWatermark(run) {
34109
- return run.lastEventSequence !== void 0;
34110
- }
34111
- function hasReachedTerminalWatermark(run, nextSequence) {
34112
- return run.lastEventSequence !== void 0 && nextSequence >= run.lastEventSequence;
34113
- }
34114
- function shouldCompleteTerminalDrain(terminalSeenAt, lastTerminalProgressAt, blockedByGap) {
34115
- const now = Date.now();
34116
- const terminalElapsedMs = now - terminalSeenAt;
34117
- const terminalIdleMs = now - lastTerminalProgressAt;
34118
- return terminalElapsedMs >= TERMINAL_DRAIN_MAX_MS || !blockedByGap && terminalIdleMs >= TERMINAL_DRAIN_IDLE_MS;
34119
- }
34120
- function updateTerminalDrainState(state, run, madeSequenceProgress, now) {
34121
- if (isTerminalRunState(run)) {
34122
- if (!state.runState) {
34123
- state.seenAt = now;
34124
- state.lastProgressAt = now;
34125
- } else if (madeSequenceProgress) {
34126
- state.lastProgressAt = now;
34127
- }
34128
- state.runState = run;
34129
- return;
34130
- }
34131
- if (state.runState && madeSequenceProgress) {
34132
- state.lastProgressAt = now;
33790
+ function flushSearchRenderer(renderer, normalizer) {
33791
+ for (const parsed of normalizer.flush()) {
33792
+ renderer.render(parsed);
34133
33793
  }
33794
+ renderer.flush();
34134
33795
  }
34135
- function isBlockedByTerminalWatermark(run, nextSequence) {
34136
- return hasTerminalWatermark(run) && !hasReachedTerminalWatermark(run, nextSequence);
34137
- }
34138
- function shouldReturnTerminalRunResult(state, response, nextSequence, madeSequenceProgress, seenResultEvent) {
34139
- const run = state.runState;
34140
- if (!run) {
34141
- return false;
34142
- }
34143
- if (!hasTerminalWatermark(run) && run.status !== "completed") {
34144
- if (run.status === "timeout" && shouldDrainNextEventPage(response, madeSequenceProgress)) {
34145
- return false;
34146
- }
34147
- return true;
34148
- }
34149
- if (!hasTerminalWatermark(run) && seenResultEvent) {
34150
- return true;
34151
- }
34152
- return shouldCompleteTerminalDrain(
34153
- state.seenAt,
34154
- state.lastProgressAt,
34155
- isBlockedBySequenceGap(response, madeSequenceProgress) || isBlockedByTerminalWatermark(run, nextSequence)
34156
- );
33796
+ function formatRunHeader(runId, agentName, timestamp) {
33797
+ const time = formatIsoTimestamp(timestamp);
33798
+ return `\u2500\u2500 Run ${runId} (${agentName}, ${time}) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500`;
34157
33799
  }
34158
- function renderTerminalRunResult(runId, run) {
34159
- if (run.status === "completed") {
34160
- EventRenderer.renderRunCompleted(run.result);
34161
- return {
34162
- succeeded: true,
34163
- runId,
34164
- sessionId: run.result?.agentSessionId,
34165
- checkpointId: run.result?.checkpointId
34166
- };
34167
- }
34168
- if (run.status === "failed") {
34169
- EventRenderer.renderRunFailed(run.error, runId);
34170
- return { succeeded: false, runId };
34171
- }
34172
- if (run.status === "timeout") {
34173
- console.error(source_default.red("\n\u2717 Run timed out"));
34174
- console.error(source_default.dim(` (use "zero logs ${runId}" to view logs)`));
34175
- return { succeeded: false, runId };
34176
- }
34177
- console.error(source_default.yellow("\n\u2717 Run cancelled"));
34178
- return { succeeded: false, runId };
33800
+ function parseContextOptions(options) {
33801
+ const contextN = options.context !== void 0 ? parseBoundedLogCount(options.context, "--context", 0, 10) : 0;
33802
+ const before = options.beforeContext !== void 0 ? parseBoundedLogCount(options.beforeContext, "--before-context", 0, 10) : contextN;
33803
+ const after = options.afterContext !== void 0 ? parseBoundedLogCount(options.afterContext, "--after-context", 0, 10) : contextN;
33804
+ return { before, after };
34179
33805
  }
34180
- function sleep(ms) {
34181
- return new Promise((resolve) => {
34182
- return setTimeout(resolve, ms);
34183
- });
33806
+ function parseLimit(value) {
33807
+ if (value === void 0) return void 0;
33808
+ return parseBoundedLogCount(value, "--limit", 1, 50);
34184
33809
  }
34185
- async function pollEvents(runId, options) {
34186
- const renderer = new EventRenderer({ verbose: options?.verbose });
34187
- const normalizer = new EventStreamNormalizer();
34188
- let nextSequence = -1;
34189
- const terminalDrain = {
34190
- seenAt: 0,
34191
- lastProgressAt: 0
34192
- };
34193
- let seenResultEvent = false;
34194
- const flushPendingEvents = () => {
34195
- for (const parsed of normalizer.flush()) {
34196
- renderer.render(parsed);
34197
- }
34198
- renderer.flush();
34199
- };
34200
- for (; ; ) {
34201
- const previousSequence = nextSequence;
34202
- const response = await getEvents(runId, {
34203
- since: nextSequence
34204
- });
34205
- const now = Date.now();
34206
- const madeSequenceProgress = response.nextSequence > previousSequence;
34207
- let pageHasResultEvent = false;
34208
- if (madeSequenceProgress) {
34209
- for (const event of response.events) {
34210
- const parsedEvents = normalizer.process(
34211
- event.eventData,
34212
- supportedEventFramework(response.framework)
34213
- );
34214
- for (const parsed of parsedEvents) {
34215
- renderer.render(parsed);
34216
- if (parsed.type === "result") {
34217
- pageHasResultEvent = true;
34218
- }
34219
- }
34220
- }
33810
+ function renderResults(response) {
33811
+ const grouped = /* @__PURE__ */ new Map();
33812
+ for (const result of response.results) {
33813
+ const existing = grouped.get(result.runId);
33814
+ if (existing) {
33815
+ existing.results.push(result);
33816
+ } else {
33817
+ grouped.set(result.runId, {
33818
+ agentName: result.agentName,
33819
+ results: [result]
33820
+ });
34221
33821
  }
34222
- if (madeSequenceProgress) {
34223
- if (pageHasResultEvent) {
34224
- seenResultEvent = true;
34225
- }
34226
- nextSequence = response.nextSequence;
33822
+ }
33823
+ let isFirstGroup = true;
33824
+ for (const [runId, group] of grouped) {
33825
+ if (!isFirstGroup) {
33826
+ console.log();
34227
33827
  }
34228
- updateTerminalDrainState(
34229
- terminalDrain,
34230
- response.run,
34231
- madeSequenceProgress,
34232
- now
33828
+ isFirstGroup = false;
33829
+ const firstTimestamp = group.results[0].matchedEvent.createdAt;
33830
+ console.log(
33831
+ source_default.bold(formatRunHeader(runId, group.agentName, firstTimestamp))
34233
33832
  );
34234
- if (terminalDrain.runState && hasReachedTerminalWatermark(terminalDrain.runState, nextSequence)) {
34235
- flushPendingEvents();
34236
- return renderTerminalRunResult(runId, terminalDrain.runState);
34237
- }
34238
- const terminalRunState = terminalDrain.runState;
34239
- if (terminalRunState && shouldReturnTerminalRunResult(
34240
- terminalDrain,
34241
- response,
34242
- nextSequence,
34243
- madeSequenceProgress,
34244
- seenResultEvent
34245
- )) {
34246
- flushPendingEvents();
34247
- return renderTerminalRunResult(runId, terminalRunState);
34248
- }
34249
- if (shouldDrainNextEventPage(response, madeSequenceProgress)) {
34250
- continue;
33833
+ for (const result of group.results) {
33834
+ const renderer = new EventRenderer({
33835
+ showTimestamp: true,
33836
+ verbose: false
33837
+ });
33838
+ const normalizer = new EventStreamNormalizer();
33839
+ for (const event of result.contextBefore) {
33840
+ renderSearchEvent(event, result.framework, renderer, normalizer);
33841
+ }
33842
+ renderSearchEvent(
33843
+ result.matchedEvent,
33844
+ result.framework,
33845
+ renderer,
33846
+ normalizer
33847
+ );
33848
+ for (const event of result.contextAfter) {
33849
+ renderSearchEvent(event, result.framework, renderer, normalizer);
33850
+ }
33851
+ flushSearchRenderer(renderer, normalizer);
34251
33852
  }
34252
- await sleep(
34253
- terminalDrain.runState ? TERMINAL_DRAIN_POLL_INTERVAL_MS : POLL_INTERVAL_MS
33853
+ }
33854
+ if (response.hasMore) {
33855
+ console.log();
33856
+ console.log(
33857
+ source_default.dim(
33858
+ ` Showing first ${response.results.length} matches. Use --limit to see more.`
33859
+ )
34254
33860
  );
34255
33861
  }
34256
33862
  }
34257
- function showNextSteps(result) {
34258
- const { runId, sessionId, checkpointId } = result;
34259
- console.log();
34260
- console.log(" View agent logs:");
34261
- console.log(source_default.cyan(` zero logs ${runId}`));
34262
- if (sessionId) {
34263
- console.log(" Continue with session (latest conversation and artifact):");
34264
- console.log(
34265
- source_default.cyan(` vm0 run continue ${sessionId} "your next prompt"`)
33863
+ async function runLogsSearch(keyword, options) {
33864
+ const searchKeyword = parseSearchQuery(keyword, "Keyword");
33865
+ const { before, after } = parseContextOptions(options);
33866
+ if (options.agentId !== void 0 && !isUuid(options.agentId)) {
33867
+ console.error(
33868
+ source_default.red(`\u2717 Invalid agent ID "${options.agentId}" \u2014 expected a UUID`)
34266
33869
  );
33870
+ console.error(source_default.dim(" Run: zero logs list to find agent IDs"));
33871
+ process.exit(1);
34267
33872
  }
34268
- if (checkpointId) {
34269
- console.log(
34270
- " Resume from checkpoint (snapshotted conversation and artifact):"
33873
+ if (options.run !== void 0 && !isUuid(options.run)) {
33874
+ console.error(
33875
+ source_default.red(`\u2717 Invalid run ID "${options.run}" \u2014 expected a UUID`)
34271
33876
  );
33877
+ console.error(source_default.dim(" Run: zero logs list to find run IDs"));
33878
+ process.exit(1);
33879
+ }
33880
+ const since = options.since !== void 0 ? parseTime(options.since) : Date.now() - SEVEN_DAYS_MS;
33881
+ const limit = parseLimit(options.limit);
33882
+ const response = await searchZeroLogs({
33883
+ keyword: searchKeyword,
33884
+ agentId: options.agentId,
33885
+ runId: options.run,
33886
+ since,
33887
+ limit,
33888
+ before,
33889
+ after
33890
+ });
33891
+ if (response.results.length === 0) {
33892
+ console.log(source_default.dim("No matches found"));
34272
33893
  console.log(
34273
- source_default.cyan(` vm0 run resume ${checkpointId} "your next prompt"`)
33894
+ source_default.dim(
33895
+ " Try a broader search with --since 30d or a different keyword"
33896
+ )
34274
33897
  );
33898
+ return;
34275
33899
  }
33900
+ renderResults(response);
34276
33901
  }
34277
-
34278
- // src/lib/utils/time-parser.ts
34279
- init_esm_shims();
34280
- var ISO_8601_PATTERN = /^(\d{4})-(\d{2})-(\d{2})(?:[Tt](\d{2}):(\d{2})(?::(\d{2})(?:\.\d{1,9})?)?(?:[Zz]|[+-]\d{2}:?\d{2})?)?$/;
34281
- var DAYS_BY_MONTH = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
34282
- var MAX_DATE_TIMESTAMP_MS = 864e13;
34283
- function parseTime(timeStr) {
34284
- const relativeMatch = timeStr.match(/^(\d+)([smhdw])$/);
34285
- if (relativeMatch) {
34286
- const value = Number(relativeMatch[1]);
34287
- const unit = relativeMatch[2];
34288
- const timestamp2 = parseRelativeTime(value, unit);
34289
- if (timestamp2 !== void 0) {
34290
- return timestamp2;
34291
- }
34292
- }
34293
- if (/^\d+$/.test(timeStr)) {
34294
- const rawTimestamp = Number(timeStr);
34295
- const timestamp2 = rawTimestamp < 1e10 ? rawTimestamp * 1e3 : rawTimestamp;
34296
- if (isValidTimestamp(timestamp2)) {
34297
- return timestamp2;
33902
+ var searchCommand = new Command().name("search").description("Search agent events across runs").argument("<keyword>", "Search keyword").option("-A, --after-context <n>", "Show n events after each match").option("-B, --before-context <n>", "Show n events before each match").option("-C, --context <n>", "Show n events before and after each match").option("--agent <id>", "Filter by Zero agent ID").option("--run <id>", "Filter by specific run ID").option("--since <time>", "Search logs since (default: 7d)").option("--limit <n>", "Maximum number of matches (default: 20)").addHelpText(
33903
+ "after",
33904
+ `
33905
+ Examples:
33906
+ zero logs search "error"
33907
+ zero logs search "timeout" --agent 123e4567-e89b-12d3-a456-426614174000 -C 2
33908
+ zero logs search "failed" --since 30d --limit 50`
33909
+ ).action(
33910
+ withErrorHandler(
33911
+ async (keyword, options) => {
33912
+ const { agent, ...searchOptions } = options;
33913
+ await runLogsSearch(keyword, { ...searchOptions, agentId: agent });
34298
33914
  }
34299
- }
34300
- const timestamp = parseIsoTime(timeStr);
34301
- if (timestamp !== void 0) {
34302
- return timestamp;
34303
- }
34304
- throw new Error(
34305
- `Invalid time format: "${timeStr}". Supported formats: relative (5m, 2h, 1d), ISO 8601 (2024-01-15T10:30:00Z), Unix timestamp`
34306
- );
34307
- }
34308
- function parseIsoTime(timeStr) {
34309
- const match = ISO_8601_PATTERN.exec(timeStr);
34310
- if (!match) {
34311
- return void 0;
34312
- }
34313
- const year = Number(match[1]);
34314
- const month = Number(match[2]);
34315
- const day = Number(match[3]);
34316
- const hour = match[4] ? Number(match[4]) : 0;
34317
- const minute = match[5] ? Number(match[5]) : 0;
34318
- const second = match[6] ? Number(match[6]) : 0;
34319
- if (!Number.isInteger(year) || !Number.isInteger(month) || !Number.isInteger(day) || !Number.isInteger(hour) || !Number.isInteger(minute) || !Number.isInteger(second) || month < 1 || month > 12 || day < 1 || day > daysInMonth(year, month) || hour > 23 || minute > 59 || second > 59) {
34320
- return void 0;
34321
- }
34322
- const timestamp = new Date(timeStr).getTime();
34323
- return isValidTimestamp(timestamp) ? timestamp : void 0;
34324
- }
34325
- function daysInMonth(year, month) {
34326
- if (month === 2) {
34327
- return isLeapYear(year) ? 29 : 28;
34328
- }
34329
- return DAYS_BY_MONTH[month - 1] ?? 0;
34330
- }
34331
- function isLeapYear(year) {
34332
- return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);
34333
- }
34334
- function parseRelativeTime(value, unit) {
34335
- if (!Number.isSafeInteger(value)) {
34336
- return void 0;
34337
- }
34338
- const now = Date.now();
34339
- const multipliers = {
34340
- s: 1e3,
34341
- // seconds
34342
- m: 60 * 1e3,
34343
- // minutes
34344
- h: 60 * 60 * 1e3,
34345
- // hours
34346
- d: 24 * 60 * 60 * 1e3,
34347
- // days
34348
- w: 7 * 24 * 60 * 60 * 1e3
34349
- // weeks
34350
- };
34351
- const multiplier = multipliers[unit];
34352
- if (!multiplier) {
34353
- throw new Error(`Unknown time unit: ${unit}`);
34354
- }
34355
- const timestamp = now - value * multiplier;
34356
- return isValidTimestamp(timestamp) ? timestamp : void 0;
34357
- }
34358
- function isValidTimestamp(timestamp) {
34359
- return Number.isSafeInteger(timestamp) && Math.abs(timestamp) <= MAX_DATE_TIMESTAMP_MS;
34360
- }
33915
+ )
33916
+ );
34361
33917
 
34362
33918
  export {
33919
+ parseTime,
34363
33920
  isSupportedFramework,
34364
33921
  EventStreamNormalizer,
34365
33922
  formatIsoTimestamp,
34366
33923
  EventRenderer,
34367
- collectKeyValue,
34368
- collectVolumeVersions,
34369
- collectMounts,
34370
- collectArtifacts,
34371
- parsePermissionPolicies,
34372
- isUUID,
34373
- extractVarNames,
34374
- extractSecretNames,
34375
- loadValues,
34376
- parseIdentifier,
34377
- renderRunCreated,
34378
- pollEvents,
34379
- showNextSteps,
34380
- parseTime
34381
- };
34382
- //# sourceMappingURL=chunk-65MTNZ44.js.map
33924
+ parsePositiveLogCount,
33925
+ parseBoundedLogCount,
33926
+ collectLogItems,
33927
+ isUuid,
33928
+ parseSearchQuery,
33929
+ runLogsSearch,
33930
+ searchCommand
33931
+ };
33932
+ //# sourceMappingURL=chunk-6P7XBY46.js.map