@codexhost/cli-darwin-x64 0.12.1 → 0.13.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 (54) hide show
  1. package/README.md +1 -1
  2. package/THIRD_PARTY_NOTICES.txt +8 -0
  3. package/app/codexhost-distribution.json +1 -1
  4. package/app/console-server.mjs +232 -21
  5. package/app/console-web.js +5434 -1092
  6. package/app/desktop-controller.mjs +252 -41
  7. package/app/host-runtime.mjs +5318 -1448
  8. package/app/plugins/antigravity/manifest.json +18 -1
  9. package/app/plugins/antigravity/plugin.mjs +276 -42
  10. package/app/plugins/claude-code/manifest.json +28 -0
  11. package/app/plugins/claude-code/plugin.mjs +1049 -359
  12. package/app/plugins/codebuddy/manifest.json +17 -0
  13. package/app/plugins/codebuddy/plugin.mjs +5931 -5358
  14. package/app/plugins/codex-usage/manifest.json +9 -0
  15. package/app/plugins/codex-usage/plugin.mjs +16703 -0
  16. package/app/plugins/cursor-cli/manifest.json +17 -0
  17. package/app/plugins/cursor-cli/plugin.mjs +351 -77
  18. package/app/plugins/deepseek-harness/assets/icon.svg +1 -0
  19. package/app/plugins/deepseek-harness/manifest.json +35 -2
  20. package/app/plugins/deepseek-harness/plugin.mjs +798 -242
  21. package/app/plugins/enabled.json +2 -1
  22. package/app/plugins/grok/manifest.json +21 -1
  23. package/app/plugins/grok/plugin.mjs +884 -259
  24. package/app/plugins/hermes/assets/icon.png +0 -0
  25. package/app/plugins/hermes/manifest.json +30 -2
  26. package/app/plugins/hermes/plugin.mjs +278 -33
  27. package/app/plugins/kimi-code/assets/icon.svg +5 -0
  28. package/app/plugins/kimi-code/manifest.json +25 -2
  29. package/app/plugins/kimi-code/plugin.mjs +555 -36
  30. package/app/plugins/kiro-cli/assets/kiro-agent.svg +11 -0
  31. package/app/plugins/kiro-cli/manifest.json +18 -1
  32. package/app/plugins/kiro-cli/plugin.mjs +284 -22
  33. package/app/plugins/omp/manifest.json +21 -1
  34. package/app/plugins/omp/plugin.mjs +2737 -1956
  35. package/app/plugins/opencode/manifest.json +18 -1
  36. package/app/plugins/opencode/plugin.mjs +694 -147
  37. package/app/plugins/pi/manifest.json +32 -0
  38. package/app/plugins/pi/plugin.mjs +2809 -2254
  39. package/app/plugins/qoder/manifest.json +18 -1
  40. package/app/plugins/qoder/plugin.mjs +585 -81
  41. package/app/plugins/qoder-cn/manifest.json +18 -1
  42. package/app/plugins/qoder-cn/plugin.mjs +585 -81
  43. package/app/plugins/workbuddy/manifest.json +18 -0
  44. package/app/plugins/workbuddy/plugin.mjs +6317 -5746
  45. package/app/plugins/zcode/manifest.json +19 -1
  46. package/app/plugins/zcode/plugin.mjs +1066 -260
  47. package/app/renderer-extension.js +1999 -1686
  48. package/bin/codexhost +0 -0
  49. package/libexec/codexhost-shim +0 -0
  50. package/libexec/codexhost-updater +0 -0
  51. package/licenses/Cordis-LICENSE.txt +21 -0
  52. package/licenses/Cosmokit-LICENSE.txt +21 -0
  53. package/package.json +1 -1
  54. package/app/plugins/kiro-cli/assets/icon.svg +0 -5
package/README.md CHANGED
@@ -7,7 +7,7 @@ Run Pi and Claude Code as first-class external harnesses inside Codex Desktop.
7
7
  ## Install
8
8
 
9
9
  ```bash
10
- npm install -g @codexhost/cli@0.12.1
10
+ npm install -g @codexhost/cli@0.13.0
11
11
  ```
12
12
 
13
13
  Do not install this package directly. npm selects it through the optional dependencies of `@codexhost/cli`.
@@ -1,5 +1,13 @@
1
1
  codexhost npm package third-party notices
2
2
 
3
+ @deepseek-ai/cordis 4.0.4
4
+ License: MIT
5
+ License text: licenses/Cordis-LICENSE.txt
6
+
7
+ @deepseek-ai/cosmokit 1.8.5
8
+ License: MIT
9
+ License text: licenses/Cosmokit-LICENSE.txt
10
+
3
11
  @agentclientprotocol/sdk 1.3.0
4
12
  License: Apache-2.0
5
13
  License text: licenses/Agent-Client-Protocol-SDK-LICENSE.txt
@@ -1 +1 @@
1
- {"schemaVersion":1,"version":"0.12.1","distribution":"npm","target":"macos-x64"}
1
+ {"schemaVersion":1,"version":"0.13.0","distribution":"npm","target":"macos-x64"}
@@ -5498,8 +5498,8 @@ function az_default() {
5498
5498
  }
5499
5499
 
5500
5500
  // node_modules/zod/v4/locales/be.js
5501
- function getBelarusianPlural(count, one, few, many) {
5502
- const absCount = Math.abs(count);
5501
+ function getBelarusianPlural(count2, one, few, many) {
5502
+ const absCount = Math.abs(count2);
5503
5503
  const lastDigit = absCount % 10;
5504
5504
  const lastTwoDigits = absCount % 100;
5505
5505
  if (lastTwoDigits >= 11 && lastTwoDigits <= 19) {
@@ -7577,8 +7577,8 @@ function hu_default() {
7577
7577
  }
7578
7578
 
7579
7579
  // node_modules/zod/v4/locales/hy.js
7580
- function getArmenianPlural(count, one, many) {
7581
- return Math.abs(count) === 1 ? one : many;
7580
+ function getArmenianPlural(count2, one, many) {
7581
+ return Math.abs(count2) === 1 ? one : many;
7582
7582
  }
7583
7583
  function withDefiniteArticle(word) {
7584
7584
  if (!word)
@@ -9706,8 +9706,8 @@ function ro_default() {
9706
9706
  }
9707
9707
 
9708
9708
  // node_modules/zod/v4/locales/ru.js
9709
- function getRussianPlural(count, one, few, many) {
9710
- const absCount = Math.abs(count);
9709
+ function getRussianPlural(count2, one, few, many) {
9710
+ const absCount = Math.abs(count2);
9711
9711
  const lastDigit = absCount % 10;
9712
9712
  const lastTwoDigits = absCount % 100;
9713
9713
  if (lastTwoDigits >= 11 && lastTwoDigits <= 19) {
@@ -15376,6 +15376,15 @@ function date4(params) {
15376
15376
  // node_modules/zod/v4/classic/external.js
15377
15377
  config(en_default());
15378
15378
 
15379
+ // packages/shared-contracts/dist/delegation-read.js
15380
+ var REMOTE_THREAD_REPLY_MAX_BYTES = 16 * 1024 * 1024;
15381
+ var delegationReadParamsSchema = external_exports.strictObject({
15382
+ threadId: external_exports.string().min(1).max(1024),
15383
+ view: external_exports.enum(["result", "messages"]),
15384
+ cursor: external_exports.string().min(1).max(8192).optional(),
15385
+ limit: external_exports.number().int().min(1).max(100).optional()
15386
+ });
15387
+
15379
15388
  // packages/shared-contracts/dist/credential-imports.js
15380
15389
  var credentialSourceSchema = external_exports.object({
15381
15390
  id: external_exports.string().min(1).max(256),
@@ -15446,6 +15455,153 @@ var harnessDisplaySetSchema = external_exports.strictObject({
15446
15455
  initializeOnly: external_exports.boolean().optional()
15447
15456
  });
15448
15457
 
15458
+ // packages/shared-contracts/dist/model-price-overrides.js
15459
+ var usdPerMillionTokens = external_exports.number().finite().nonnegative();
15460
+ var modelPriceOverrideSchema = external_exports.strictObject({
15461
+ input: usdPerMillionTokens,
15462
+ output: usdPerMillionTokens,
15463
+ cacheRead: usdPerMillionTokens.optional(),
15464
+ cacheWrite: usdPerMillionTokens.optional(),
15465
+ cacheWrite1h: usdPerMillionTokens.optional()
15466
+ });
15467
+ var modelPriceKeySchema = external_exports.string().max(512).refine((key) => key.trim() === key && key.length > 0, "Model ID is required");
15468
+ var modelPriceOverridesSchema = external_exports.strictObject({
15469
+ /** Absolute path of the Host's `pricing.json`. */
15470
+ path: external_exports.string(),
15471
+ entries: external_exports.array(external_exports.strictObject({ key: external_exports.string(), price: modelPriceOverrideSchema })),
15472
+ /** Why the existing file is unusable; the Host then ignores it and refuses to overwrite it. */
15473
+ error: external_exports.string().nullable()
15474
+ });
15475
+ var modelPriceOverridesGetSchema = external_exports.strictObject({});
15476
+ var modelPriceOverridesSetSchema = external_exports.strictObject({
15477
+ key: modelPriceKeySchema,
15478
+ price: modelPriceOverrideSchema.nullable(),
15479
+ previousKey: modelPriceKeySchema.optional()
15480
+ });
15481
+ var modelPriceDefaultParamsSchema = external_exports.strictObject({
15482
+ model: modelPriceKeySchema
15483
+ });
15484
+ var modelPriceSuggestionSchema = external_exports.strictObject({
15485
+ /** Verified from catalog canonical links, not inferred from names or equal prices. */
15486
+ official: external_exports.boolean().optional(),
15487
+ canonicalModelId: external_exports.string().min(1).optional(),
15488
+ provider: external_exports.string().min(1).max(512),
15489
+ model: external_exports.string().min(1).max(512),
15490
+ price: modelPriceOverrideSchema
15491
+ });
15492
+ var modelPriceDefaultResultSchema = external_exports.strictObject({
15493
+ price: modelPriceOverrideSchema.nullable(),
15494
+ /** Local catalog suggestions only; never used automatically for pricing. */
15495
+ suggestions: external_exports.array(modelPriceSuggestionSchema).max(6).optional()
15496
+ });
15497
+
15498
+ // packages/shared-contracts/dist/usage-statistics.js
15499
+ var USAGE_STATISTICS_RANGES = ["today", "7d", "30d", "90d", "all"];
15500
+ var count = external_exports.number().int().min(0).max(Number.MAX_SAFE_INTEGER);
15501
+ var localDate = external_exports.string().regex(/^\d{4}-\d{2}-\d{2}$/u);
15502
+ var harness = external_exports.string().min(1).max(128);
15503
+ var model = external_exports.string().min(1).max(512);
15504
+ var project = external_exports.string().min(1).max(4096);
15505
+ var usageStatisticsParamsSchema = external_exports.strictObject({
15506
+ range: external_exports.enum(USAGE_STATISTICS_RANGES),
15507
+ harness: harness.optional(),
15508
+ model: model.nullable().optional(),
15509
+ project: project.nullable().optional(),
15510
+ /** One local date inside the range. */
15511
+ date: localDate.optional()
15512
+ });
15513
+ var usageStatisticsTotalsSchema = external_exports.strictObject({
15514
+ requests: count,
15515
+ inputTokens: count,
15516
+ cachedInputTokens: count,
15517
+ cacheWriteInputTokens: count,
15518
+ cacheKnownInputTokens: count,
15519
+ outputTokens: count,
15520
+ reasoningOutputTokens: count,
15521
+ /** USD at the public price, summed over the priced requests only. */
15522
+ costUsd: external_exports.number().finite().min(0),
15523
+ /** Requests without a price (or the cache data the price needs); not in `costUsd`. */
15524
+ unpricedRequests: count,
15525
+ /**
15526
+ * Requests whose storage gave no token counts: counted as requests, with neither tokens nor
15527
+ * cost, and not as unpriced.
15528
+ */
15529
+ unmeteredRequests: count
15530
+ });
15531
+ var totals = usageStatisticsTotalsSchema.shape;
15532
+ var usageStatisticsSessionSchema = external_exports.strictObject({
15533
+ harness,
15534
+ sessionId: external_exports.string().min(1).max(512),
15535
+ project: project.nullable(),
15536
+ /** Models the session used, most requests first. */
15537
+ models: external_exports.array(model).max(16),
15538
+ firstAtMs: count,
15539
+ lastAtMs: count,
15540
+ ...totals
15541
+ });
15542
+ var usageStatisticsResultSchema = external_exports.strictObject({
15543
+ range: external_exports.enum(USAGE_STATISTICS_RANGES),
15544
+ /** First local date of the range; null for all time. */
15545
+ from: localDate.nullable(),
15546
+ to: localDate,
15547
+ /** The filters these figures apply, echoed so a late answer to older filters is recognised. */
15548
+ filters: external_exports.strictObject({
15549
+ harness: harness.nullable(),
15550
+ model: model.nullable(),
15551
+ unknownModel: external_exports.boolean(),
15552
+ project: project.nullable(),
15553
+ unknownProject: external_exports.boolean(),
15554
+ date: localDate.nullable()
15555
+ }),
15556
+ /** Reading of native storage: incomplete while the first read, or a refresh, is under way. */
15557
+ reading: external_exports.strictObject({ complete: external_exports.boolean(), sources: count, read: count }),
15558
+ /** Harnesses whose storage could not be read; their part is missing, the rest is complete. */
15559
+ failures: external_exports.array(external_exports.strictObject({ harness, message: external_exports.string().max(2048) })).max(256),
15560
+ /** Every value seen in the range, ignoring the filters, to choose filters from. */
15561
+ options: external_exports.strictObject({
15562
+ harnesses: external_exports.array(harness).max(256),
15563
+ models: external_exports.array(model.nullable()).max(4096),
15564
+ projects: external_exports.array(project.nullable()).max(4096)
15565
+ }),
15566
+ /** Current display metadata, scoped by Harness. Never a pricing or filter identity.
15567
+ * Optional for older Hosts; missing/conflicting labels fall back to the native model ID.
15568
+ */
15569
+ modelLabels: external_exports.array(external_exports.strictObject({ harness, model, label: model })).max(4096).optional(),
15570
+ /** Native credits, all filters applied, never combined across Harnesses or treated as USD.
15571
+ * Only groups with at least one reported value appear; reportedRequests exposes partial data.
15572
+ */
15573
+ credits: external_exports.array(external_exports.strictObject({
15574
+ harness,
15575
+ model: model.nullable(),
15576
+ credits: external_exports.number().finite().min(0),
15577
+ reportedRequests: count,
15578
+ requests: count
15579
+ })).max(4096).optional(),
15580
+ /** All filters applied. */
15581
+ totals: usageStatisticsTotalsSchema,
15582
+ /** Each date and Harness of the range: every filter except the day. */
15583
+ daily: external_exports.array(external_exports.strictObject({ date: localDate, harness, ...totals })).max(2e5),
15584
+ /** Local weekday (0 = Sunday) and hour, all filters applied. */
15585
+ hourly: external_exports.array(external_exports.strictObject({
15586
+ weekday: external_exports.number().int().min(0).max(6),
15587
+ hour: external_exports.number().int().min(0).max(23),
15588
+ ...totals
15589
+ })).max(168),
15590
+ byHarness: external_exports.array(external_exports.strictObject({ harness, ...totals })).max(256),
15591
+ byModel: external_exports.array(external_exports.strictObject({
15592
+ model: model.nullable(),
15593
+ ...totals,
15594
+ /** Requests priced by what the Harness recorded they cost, not by a price list. */
15595
+ harnessPricedRequests: count
15596
+ })).max(4096),
15597
+ byProject: external_exports.array(external_exports.strictObject({ project: project.nullable(), ...totals })).max(4096),
15598
+ /**
15599
+ * The sessions that spent the most, by cost and by tokens without cache, all filters applied;
15600
+ * requests without a native session are not listed here but count everywhere else.
15601
+ */
15602
+ sessions: external_exports.array(usageStatisticsSessionSchema).max(100)
15603
+ });
15604
+
15449
15605
  // packages/shared-contracts/dist/ids.js
15450
15606
  var opaqueIdSchema = external_exports.string().refine((value) => value.trim().length > 0, {
15451
15607
  message: "Identifier must not be empty or whitespace"
@@ -15493,6 +15649,10 @@ var CONSOLE_HOST_METHODS = Object.freeze([
15493
15649
  "codexhost/account/list",
15494
15650
  "codexhost/account/refresh",
15495
15651
  "codexhost/account/usage/inspect",
15652
+ "codexhost/usage/model-prices/get",
15653
+ "codexhost/usage/model-prices/set",
15654
+ "codexhost/usage/model-prices/default",
15655
+ "codexhost/usage/statistics/get",
15496
15656
  "codexhost/update/check",
15497
15657
  "codexhost/update/start",
15498
15658
  "codexhost/update/status"
@@ -15560,6 +15720,7 @@ var threadUsageSnapshotSchema = external_exports.object({
15560
15720
  cacheWriteInputTokens: nonNegativeSafeIntegerSchema.optional(),
15561
15721
  outputTokens: nonNegativeSafeIntegerSchema.optional(),
15562
15722
  outputTokensPerSecond: finiteNonNegativeNumberSchema.optional(),
15723
+ apiOutputTokensPerSecond: finiteNonNegativeNumberSchema.optional(),
15563
15724
  reasoningOutputTokens: nonNegativeSafeIntegerSchema.optional(),
15564
15725
  totalTokens: nonNegativeSafeIntegerSchema.optional(),
15565
15726
  totalCostUsd: finiteNonNegativeNumberSchema.optional(),
@@ -15571,7 +15732,11 @@ var threadUsageSnapshotSchema = external_exports.object({
15571
15732
  planFiveHourUsedPercent: cacheHitRatePercentSchema.optional(),
15572
15733
  planFiveHourResetsAtUnix: nonNegativeSafeIntegerSchema.optional(),
15573
15734
  planSevenDayUsedPercent: cacheHitRatePercentSchema.optional(),
15574
- planSevenDayResetsAtUnix: nonNegativeSafeIntegerSchema.optional()
15735
+ planSevenDayResetsAtUnix: nonNegativeSafeIntegerSchema.optional(),
15736
+ sessionCacheHitRatePercent: cacheHitRatePercentSchema.optional(),
15737
+ timeToFirstOutputMs: nonNegativeSafeIntegerSchema.optional(),
15738
+ costSource: external_exports.enum(["publicPrice", "native"]).optional(),
15739
+ unpricedModels: external_exports.array(external_exports.string().min(1)).min(1).optional()
15575
15740
  }).strict().superRefine((usage2, context) => {
15576
15741
  if (Object.keys(usage2).length === 0) {
15577
15742
  context.addIssue({ code: "custom", message: "Thread Usage must contain a reliable field" });
@@ -15592,6 +15757,20 @@ var threadUsageSnapshotSchema = external_exports.object({
15592
15757
  path: ["contextWindowTokens"]
15593
15758
  });
15594
15759
  }
15760
+ if (usage2.costSource !== void 0 && usage2.totalCostUsd === void 0) {
15761
+ context.addIssue({
15762
+ code: "custom",
15763
+ message: "Thread Usage costSource must be provided with totalCostUsd",
15764
+ path: ["costSource"]
15765
+ });
15766
+ }
15767
+ if (usage2.unpricedModels !== void 0 && usage2.costSource !== "publicPrice") {
15768
+ context.addIssue({
15769
+ code: "custom",
15770
+ message: "Thread Usage unpricedModels must be provided with a publicPrice cost",
15771
+ path: ["unpricedModels"]
15772
+ });
15773
+ }
15595
15774
  if (usage2.planFiveHourResetsAtUnix !== void 0 && usage2.planFiveHourUsedPercent === void 0) {
15596
15775
  context.addIssue({
15597
15776
  code: "custom",
@@ -15846,27 +16025,27 @@ var harnessModelCatalogSchema = external_exports.object({
15846
16025
  }).strict().superRefine((catalog, context) => {
15847
16026
  const refs = /* @__PURE__ */ new Set();
15848
16027
  const thinkingIds = new Set(catalog.thinkingOptions.map(({ id }) => id));
15849
- for (const [index, model] of catalog.models.entries()) {
15850
- if (refs.has(model.ref.id)) {
16028
+ for (const [index, model2] of catalog.models.entries()) {
16029
+ if (refs.has(model2.ref.id)) {
15851
16030
  context.addIssue({
15852
16031
  code: "custom",
15853
16032
  message: "Model Catalog refs must be unique",
15854
16033
  path: ["models", index, "ref", "id"]
15855
16034
  });
15856
16035
  }
15857
- refs.add(model.ref.id);
15858
- if (model.fastModel) {
15859
- if (refs.has(model.fastModel.id) || catalog.models.some((entry) => entry.ref.id === model.fastModel?.id)) {
16036
+ refs.add(model2.ref.id);
16037
+ if (model2.fastModel) {
16038
+ if (refs.has(model2.fastModel.id) || catalog.models.some((entry) => entry.ref.id === model2.fastModel?.id)) {
15860
16039
  context.addIssue({
15861
16040
  code: "custom",
15862
16041
  message: "Fast Model refs must be distinct and unique",
15863
16042
  path: ["models", index, "fastModel"]
15864
16043
  });
15865
16044
  }
15866
- refs.add(model.fastModel.id);
16045
+ refs.add(model2.fastModel.id);
15867
16046
  }
15868
16047
  const supportedThinkingIds = /* @__PURE__ */ new Set();
15869
- for (const [optionIndex, optionId] of (model.supportedThinkingOptionIds ?? []).entries()) {
16048
+ for (const [optionIndex, optionId] of (model2.supportedThinkingOptionIds ?? []).entries()) {
15870
16049
  if (supportedThinkingIds.has(optionId)) {
15871
16050
  context.addIssue({
15872
16051
  code: "custom",
@@ -16060,13 +16239,40 @@ var HARNESS_PLUGIN_LIMIT = 128;
16060
16239
  var harnessPluginIdSchema = external_exports.string().min(1).max(128).regex(/^[a-z][a-z0-9]*(?:[._-][a-z0-9]+)*$/u).refine((id) => id !== "codex", "The official Codex identity is reserved").pipe(harnessIdSchema);
16061
16240
  var relativeResourceSchema = external_exports.string().min(1).max(512).refine((value) => !/[\\\u0000:#?]/u.test(value) && !value.startsWith("/") && !value.split("/").some((part) => part === ".." || part === ""), "Plugin resources must be relative paths inside the plugin");
16062
16241
  var documentationUrlSchema = external_exports.url().refine((value) => /^https:\/\/[^/?#@]+(?:[/?#]|$)/iu.test(value), "Plugin documentation links must be credential-free HTTPS URLs");
16242
+ var localizedTextSchema = external_exports.object({ en: external_exports.string().max(4096), "zh-CN": external_exports.string().max(4096).optional() }).strict();
16243
+ var harnessInstallationGuideSchema = external_exports.object({
16244
+ commands: external_exports.array(external_exports.object({ terminal: external_exports.string().max(256), command: external_exports.string().max(4096) }).strict()).max(8),
16245
+ before: localizedTextSchema.optional(),
16246
+ after: localizedTextSchema.optional(),
16247
+ downloads: external_exports.array(external_exports.object({ label: external_exports.string().max(128), url: documentationUrlSchema }).strict()).max(8).optional()
16248
+ }).strict();
16063
16249
  var pluginPresentationShape = {
16064
16250
  id: harnessPluginIdSchema,
16065
16251
  name: external_exports.string().trim().min(1).max(128),
16066
16252
  version: external_exports.string().min(1).max(128),
16253
+ /** Capability-only plugin; omitted for existing session-capable plugins. */
16254
+ kind: external_exports.literal("usage").optional(),
16255
+ /** Original image styling or bounded vector paths; never arbitrary CSS/SVG markup. */
16256
+ iconStyle: external_exports.object({
16257
+ vector: external_exports.object({
16258
+ viewBox: external_exports.string().max(128).regex(/^-?\d+(?:\.\d+)?(?: +-?\d+(?:\.\d+)?){3}$/u),
16259
+ color: external_exports.string().regex(/^(?:currentColor|#[a-f0-9]{6})$/iu),
16260
+ paths: external_exports.array(external_exports.object({
16261
+ d: external_exports.string().min(1).max(32768).regex(/^[MmLlHhVvCcSsQqTtAaZz\d.,+eE\s-]+$/u),
16262
+ fillRule: external_exports.enum(["evenodd", "nonzero"]).optional(),
16263
+ fill: external_exports.string().regex(/^(?:currentColor|#[a-f0-9]{6})$/iu).optional()
16264
+ }).strict()).min(1).max(32)
16265
+ }).strict().optional(),
16266
+ background: external_exports.string().regex(/^#[a-f0-9]{6}$/iu).optional(),
16267
+ borderRadius: external_exports.number().min(0).max(50).optional(),
16268
+ paddingRatio: external_exports.number().min(0).max(0.25).optional()
16269
+ }).strict().optional(),
16270
+ installation: harnessInstallationGuideSchema.optional(),
16271
+ notice: localizedTextSchema.optional(),
16067
16272
  /** The factory accepts a persisted local entrypoint through its construction context. */
16068
16273
  launchCommand: external_exports.literal(true).optional(),
16069
16274
  links: external_exports.object({
16275
+ website: documentationUrlSchema.optional(),
16070
16276
  documentation: documentationUrlSchema.optional(),
16071
16277
  installation: documentationUrlSchema.optional()
16072
16278
  }).strict().optional()
@@ -16480,6 +16686,11 @@ var codexSshDraftSchema = external_exports.strictObject({
16480
16686
  });
16481
16687
  var remoteConnectionsRequestSchema = external_exports.discriminatedUnion("action", [
16482
16688
  external_exports.strictObject({ action: external_exports.literal("list") }),
16689
+ external_exports.strictObject({
16690
+ action: external_exports.literal("read-thread"),
16691
+ hostId: hostId.refine((id) => id !== "local"),
16692
+ input: delegationReadParamsSchema
16693
+ }),
16483
16694
  external_exports.strictObject({
16484
16695
  action: external_exports.literal("save"),
16485
16696
  draft: codexSshDraftSchema,
@@ -16772,14 +16983,14 @@ function createConsoleHarnesses(roots, environment = process.env) {
16772
16983
  return {
16773
16984
  list,
16774
16985
  async setLaunchPath(id, value) {
16775
- const harness = (await list()).find((candidate) => candidate.id === id);
16776
- if (!harness) throw new ConsoleHarnessError(404, `Harness '${id}' is not installed`);
16777
- if (!harness.launchCommand) {
16986
+ const harness2 = (await list()).find((candidate) => candidate.id === id);
16987
+ if (!harness2) throw new ConsoleHarnessError(404, `Harness '${id}' is not installed`);
16988
+ if (!harness2.launchCommand) {
16778
16989
  throw new ConsoleHarnessError(400, `Harness '${id}' does not accept an installation path`);
16779
16990
  }
16780
16991
  try {
16781
16992
  const settings = await store.set(id, value);
16782
- return { ...harness, launchPath: settings.path };
16993
+ return { ...harness2, launchPath: settings.path };
16783
16994
  } catch (error51) {
16784
16995
  throw new ConsoleHarnessError(400, error51 instanceof Error ? error51.message : String(error51));
16785
16996
  }
@@ -17840,8 +18051,8 @@ function startConsoleServer(options) {
17840
18051
  return;
17841
18052
  }
17842
18053
  try {
17843
- const harness = await options.harnesses.setLaunchPath(id, value === "" ? null : value);
17844
- sendJson(response, 200, { harness });
18054
+ const harness2 = await options.harnesses.setLaunchPath(id, value === "" ? null : value);
18055
+ sendJson(response, 200, { harness: harness2 });
17845
18056
  } catch (error51) {
17846
18057
  sendJson(response, error51 instanceof ConsoleHarnessError ? error51.status : 500, {
17847
18058
  error: error51 instanceof Error ? error51.message : String(error51)
@@ -17948,7 +18159,7 @@ async function consoleBuildId(entryPath2, environment = process.env) {
17948
18159
  }
17949
18160
  const runtime = await readRuntimeMetadata(entryPath2, environment).catch(() => null);
17950
18161
  if (runtime?.distribution === "development") parts.push(runtime.version);
17951
- return parts.join(".");
18162
+ return JSON.stringify([parts.join("."), dataDirectory(environment)]);
17952
18163
  }
17953
18164
  function startDetachedServer(entryPath2, environment) {
17954
18165
  const child = spawn3(process.execPath, [entryPath2, "serve"], {