@codexhost/cli-darwin-x64 0.13.3 → 0.14.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.
@@ -27648,10 +27648,19 @@ var model = external_exports.string().min(1).max(512);
27648
27648
  var project = external_exports.string().min(1).max(4096);
27649
27649
  var usageStatisticsParamsSchema = external_exports.strictObject({
27650
27650
  range: external_exports.enum(USAGE_STATISTICS_RANGES),
27651
+ /** Display timezone for ranges, dates and hourly buckets; omitted means the Host's local zone. */
27652
+ timeZone: external_exports.string().min(1).max(128).refine((value) => {
27653
+ try {
27654
+ new Intl.DateTimeFormat("en", { timeZone: value });
27655
+ return true;
27656
+ } catch {
27657
+ return false;
27658
+ }
27659
+ }, "Unsupported usage statistics timezone").optional(),
27651
27660
  harness: harness.optional(),
27652
27661
  model: model.nullable().optional(),
27653
27662
  project: project.nullable().optional(),
27654
- /** One local date inside the range. */
27663
+ /** One date in the query timezone inside the range. */
27655
27664
  date: localDate.optional()
27656
27665
  });
27657
27666
  var usageStatisticsTotalsSchema = external_exports.strictObject({
@@ -27687,7 +27696,7 @@ var usageStatisticsSessionSchema = external_exports.strictObject({
27687
27696
  });
27688
27697
  var usageStatisticsResultSchema = external_exports.strictObject({
27689
27698
  range: external_exports.enum(USAGE_STATISTICS_RANGES),
27690
- /** First local date of the range; null for all time. */
27699
+ /** First date in the query timezone (Host local when omitted); null for all time. */
27691
27700
  from: localDate.nullable(),
27692
27701
  to: localDate,
27693
27702
  /** The filters these figures apply, echoed so a late answer to older filters is recognised. */
@@ -27727,7 +27736,7 @@ var usageStatisticsResultSchema = external_exports.strictObject({
27727
27736
  totals: usageStatisticsTotalsSchema,
27728
27737
  /** Each date and Harness of the range: every filter except the day. */
27729
27738
  daily: external_exports.array(external_exports.strictObject({ date: localDate, harness, ...totals })).max(2e5),
27730
- /** Local weekday (0 = Sunday) and hour, all filters applied. */
27739
+ /** Weekday (0 = Sunday) and hour in the query timezone, all filters applied. */
27731
27740
  hourly: external_exports.array(external_exports.strictObject({
27732
27741
  weekday: external_exports.number().int().min(0).max(6),
27733
27742
  hour: external_exports.number().int().min(0).max(23),
@@ -27787,6 +27796,8 @@ var CONSOLE_HOST_METHODS = Object.freeze([
27787
27796
  "codexhost/harness/display-settings/set",
27788
27797
  "codexhost/harness/inspect",
27789
27798
  "codexhost/harness/installation",
27799
+ "codexhost/harness/installation/start",
27800
+ "codexhost/harness/installation/status",
27790
27801
  "codexhost/harness/launch-settings/get",
27791
27802
  "codexhost/harness/launch-settings/set",
27792
27803
  "codexhost/harness/web-ui/open",
@@ -27862,7 +27873,18 @@ var threadManualCompactionStartedSchema = external_exports.strictObject({
27862
27873
  var nonNegativeSafeIntegerSchema = external_exports.number().int().safe().nonnegative();
27863
27874
  var finiteNonNegativeNumberSchema = external_exports.number().finite().nonnegative();
27864
27875
  var cacheHitRatePercentSchema = external_exports.number().finite().min(0).max(100);
27876
+ var indicatorTextSchema = (maximum) => harnessLocalizedTextSchema.refine((entries) => Object.values(entries).every((text) => text.length <= maximum));
27877
+ var composerIndicatorsSchema = external_exports.array(external_exports.object({
27878
+ kind: external_exports.literal("countdown"),
27879
+ id: external_exports.string().min(1).max(64),
27880
+ expiresAtUnix: nonNegativeSafeIntegerSchema,
27881
+ label: indicatorTextSchema(256).optional(),
27882
+ tooltip: indicatorTextSchema(1024).optional()
27883
+ }).strict()).max(2).refine((entries) => new Set(entries.map(({ id }) => id)).size === entries.length, {
27884
+ message: "Composer indicator IDs must be unique"
27885
+ });
27865
27886
  var threadUsageSnapshotSchema = external_exports.object({
27887
+ composerIndicators: composerIndicatorsSchema.optional(),
27866
27888
  inputTokens: nonNegativeSafeIntegerSchema.optional(),
27867
27889
  cachedInputTokens: nonNegativeSafeIntegerSchema.optional(),
27868
27890
  cacheWriteInputTokens: nonNegativeSafeIntegerSchema.optional(),
@@ -28270,7 +28292,9 @@ var harnessSessionCapabilitiesSchema = external_exports.object({
28270
28292
  }).strict().optional(),
28271
28293
  autonomousTurns: external_exports.object({
28272
28294
  observe: external_exports.boolean()
28273
- }).strict().optional()
28295
+ }).strict().optional(),
28296
+ /** True only when `turn.steer` delivers input into the active Turn through a native primitive. */
28297
+ steer: external_exports.boolean().optional()
28274
28298
  }).strict();
28275
28299
  var harnessConfigurationStateSchema = external_exports.object({
28276
28300
  effectiveModel: harnessModelRefSchema.optional(),
@@ -28317,7 +28341,9 @@ var harnessInspectionSchema = external_exports.union([
28317
28341
  var harnessInspectParamsSchema = external_exports.object({
28318
28342
  harnessId: harnessIdSchema,
28319
28343
  cwd: nonBlankTextSchema2.max(16384).optional(),
28320
- refresh: external_exports.boolean().optional()
28344
+ refresh: external_exports.boolean().optional(),
28345
+ /** `availability` asks only whether the Harness can run; see `InspectHarnessInput.purpose`. */
28346
+ purpose: external_exports.literal("availability").optional()
28321
28347
  }).strict();
28322
28348
  var harnessWebUiOpenParamsSchema = external_exports.object({
28323
28349
  harnessId: harnessIdSchema
@@ -28400,6 +28426,15 @@ var threadOwnershipListResultSchema = external_exports.object({
28400
28426
  seen.add(thread.threadId);
28401
28427
  }
28402
28428
  });
28429
+ var threadSteeringInspectParamsSchema = external_exports.object({
28430
+ threadId: hostThreadIdSchema,
28431
+ /** The text about to be steered; a Harness command always stops and restarts. */
28432
+ text: external_exports.string().optional()
28433
+ }).strict();
28434
+ var threadSteerDeliverySchema = external_exports.enum(["activeTurn", "newTurn"]);
28435
+ var threadSteeringInspectResultSchema = external_exports.object({
28436
+ delivery: external_exports.enum(["official", "activeTurn", "newTurn"])
28437
+ }).strict();
28403
28438
 
28404
28439
  // ../../shared-contracts/dist/harness-plugins.js
28405
28440
  var HARNESS_PLUGIN_MANIFEST_MAX_BYTES = 32 * 1024;
@@ -28501,6 +28536,10 @@ var harnessInstallationStateSchema = external_exports.object({
28501
28536
  latestVersion: external_exports.string().min(1).max(128),
28502
28537
  updateAvailable: external_exports.boolean(),
28503
28538
  canUpdate: external_exports.boolean(),
28539
+ /** Defaults to CLI; some Harnesses ship only inside a desktop application. */
28540
+ versionKind: external_exports.enum(["cli", "application"]).optional(),
28541
+ /** Official download opened by the user; does not imply an automatic installation. */
28542
+ manualUpdateUrl: external_exports.url().max(2048).refine((value) => /^https:\/\/[^/?#@]+(?:[/?#]|$)/iu.test(value), "Manual updates require a credential-free HTTPS URL").optional(),
28504
28543
  // Adapter-owned diagnostic text; UI uses messageCode rather than displaying it verbatim.
28505
28544
  message: external_exports.string().max(2048).optional(),
28506
28545
  messageCode: external_exports.string().min(1).max(128).optional(),
@@ -28508,6 +28547,20 @@ var harnessInstallationStateSchema = external_exports.object({
28508
28547
  notice: harnessLocalizedTextSchema.optional(),
28509
28548
  latestVersionKind: external_exports.enum(["unknown", "tracking-branch"]).optional()
28510
28549
  }).strict();
28550
+ var harnessInstallationTaskParamsSchema = external_exports.object({ taskId: external_exports.string().uuid() }).strict();
28551
+ var harnessInstallationTaskSchema = external_exports.discriminatedUnion("status", [
28552
+ external_exports.object({ taskId: external_exports.string().uuid(), status: external_exports.literal("running") }).strict(),
28553
+ external_exports.object({
28554
+ taskId: external_exports.string().uuid(),
28555
+ status: external_exports.literal("succeeded"),
28556
+ result: harnessInstallationStateSchema
28557
+ }).strict(),
28558
+ external_exports.object({
28559
+ taskId: external_exports.string().uuid(),
28560
+ status: external_exports.literal("failed"),
28561
+ error: external_exports.object({ code: external_exports.number().int(), message: external_exports.string().min(1).max(2048) }).strict()
28562
+ }).strict()
28563
+ ]);
28511
28564
 
28512
28565
  // ../../shared-contracts/dist/codex-accounts.js
28513
28566
  var accountIdSchema = external_exports.string().min(1).max(256).regex(/^[A-Za-z0-9._~-]+$/u);
@@ -29261,6 +29314,18 @@ var HarnessOutputChannel = class {
29261
29314
  }
29262
29315
  };
29263
29316
 
29317
+ // ../../harness-adapter/dist/steer.js
29318
+ function unsupportedSteer(harnessLabel) {
29319
+ return {
29320
+ ok: false,
29321
+ error: {
29322
+ code: "unsupported",
29323
+ message: `${harnessLabel} cannot steer an active Turn natively`,
29324
+ retryable: false
29325
+ }
29326
+ };
29327
+ }
29328
+
29264
29329
  // ../../harness-adapter/dist/usage.js
29265
29330
  var tokenFields = [
29266
29331
  "inputTokens",
@@ -29288,6 +29353,7 @@ var usageFields = /* @__PURE__ */ new Set([
29288
29353
  ...safeIntegerFields,
29289
29354
  ...percentFields,
29290
29355
  "sessionCacheUsage",
29356
+ "composerIndicators",
29291
29357
  "totalCostUsd",
29292
29358
  "totalCredits",
29293
29359
  "contextUsagePercent",
@@ -29310,6 +29376,7 @@ function parseHostUsage(value) {
29310
29376
  throw new Error(`Harness Usage contains unknown field '${key}'`);
29311
29377
  }
29312
29378
  }
29379
+ const indicators = value.composerIndicators === void 0 ? {} : { composerIndicators: composerIndicatorsSchema.parse(value.composerIndicators) };
29313
29380
  for (const field of [
29314
29381
  "totalCredits",
29315
29382
  "contextUsagePercent",
@@ -29380,9 +29447,9 @@ function parseHostUsage(value) {
29380
29447
  if (value.costSource !== "publicPrice") {
29381
29448
  throw new Error("Harness Usage 'unpricedModels' must be provided with a 'publicPrice' cost");
29382
29449
  }
29383
- return { ...value, unpricedModels: [...models] };
29450
+ return { ...value, ...indicators, unpricedModels: [...models] };
29384
29451
  }
29385
- return { ...value };
29452
+ return { ...value, ...indicators };
29386
29453
  }
29387
29454
  var requestTokenFields = [
29388
29455
  "inputTokens",
@@ -52270,6 +52337,8 @@ var QoderSession = class {
52270
52337
  };
52271
52338
  }
52272
52339
  switch (command.type) {
52340
+ case "turn.steer":
52341
+ return unsupportedSteer("Qoder");
52273
52342
  case "turn.start": {
52274
52343
  if (this.#activeTurn) {
52275
52344
  return {
@@ -52980,10 +53049,13 @@ function usageSessionTitle(value) {
52980
53049
  return void 0;
52981
53050
  if (normalized.length <= MAX_SESSION_TITLE_LENGTH)
52982
53051
  return normalized;
52983
- const characters = [...normalized];
52984
- if (characters.length <= MAX_SESSION_TITLE_LENGTH)
52985
- return normalized;
52986
- return `${characters.slice(0, MAX_SESSION_TITLE_LENGTH - 1).join("").trimEnd()}…`;
53052
+ let title = "";
53053
+ for (const character of normalized) {
53054
+ if (title.length + character.length >= MAX_SESSION_TITLE_LENGTH)
53055
+ break;
53056
+ title += character;
53057
+ }
53058
+ return `${title.trimEnd()}…`;
52987
53059
  }
52988
53060
  function sessionIdOk(value) {
52989
53061
  return typeof value === "string" && value.length > 0 && value.length <= MAX_SESSION_ID_LENGTH;
@@ -27245,10 +27245,19 @@ var model = external_exports.string().min(1).max(512);
27245
27245
  var project = external_exports.string().min(1).max(4096);
27246
27246
  var usageStatisticsParamsSchema = external_exports.strictObject({
27247
27247
  range: external_exports.enum(USAGE_STATISTICS_RANGES),
27248
+ /** Display timezone for ranges, dates and hourly buckets; omitted means the Host's local zone. */
27249
+ timeZone: external_exports.string().min(1).max(128).refine((value) => {
27250
+ try {
27251
+ new Intl.DateTimeFormat("en", { timeZone: value });
27252
+ return true;
27253
+ } catch {
27254
+ return false;
27255
+ }
27256
+ }, "Unsupported usage statistics timezone").optional(),
27248
27257
  harness: harness.optional(),
27249
27258
  model: model.nullable().optional(),
27250
27259
  project: project.nullable().optional(),
27251
- /** One local date inside the range. */
27260
+ /** One date in the query timezone inside the range. */
27252
27261
  date: localDate.optional()
27253
27262
  });
27254
27263
  var usageStatisticsTotalsSchema = external_exports.strictObject({
@@ -27284,7 +27293,7 @@ var usageStatisticsSessionSchema = external_exports.strictObject({
27284
27293
  });
27285
27294
  var usageStatisticsResultSchema = external_exports.strictObject({
27286
27295
  range: external_exports.enum(USAGE_STATISTICS_RANGES),
27287
- /** First local date of the range; null for all time. */
27296
+ /** First date in the query timezone (Host local when omitted); null for all time. */
27288
27297
  from: localDate.nullable(),
27289
27298
  to: localDate,
27290
27299
  /** The filters these figures apply, echoed so a late answer to older filters is recognised. */
@@ -27324,7 +27333,7 @@ var usageStatisticsResultSchema = external_exports.strictObject({
27324
27333
  totals: usageStatisticsTotalsSchema,
27325
27334
  /** Each date and Harness of the range: every filter except the day. */
27326
27335
  daily: external_exports.array(external_exports.strictObject({ date: localDate, harness, ...totals })).max(2e5),
27327
- /** Local weekday (0 = Sunday) and hour, all filters applied. */
27336
+ /** Weekday (0 = Sunday) and hour in the query timezone, all filters applied. */
27328
27337
  hourly: external_exports.array(external_exports.strictObject({
27329
27338
  weekday: external_exports.number().int().min(0).max(6),
27330
27339
  hour: external_exports.number().int().min(0).max(23),
@@ -27384,6 +27393,8 @@ var CONSOLE_HOST_METHODS = Object.freeze([
27384
27393
  "codexhost/harness/display-settings/set",
27385
27394
  "codexhost/harness/inspect",
27386
27395
  "codexhost/harness/installation",
27396
+ "codexhost/harness/installation/start",
27397
+ "codexhost/harness/installation/status",
27387
27398
  "codexhost/harness/launch-settings/get",
27388
27399
  "codexhost/harness/launch-settings/set",
27389
27400
  "codexhost/harness/web-ui/open",
@@ -27459,7 +27470,18 @@ var threadManualCompactionStartedSchema = external_exports.strictObject({
27459
27470
  var nonNegativeSafeIntegerSchema = external_exports.number().int().safe().nonnegative();
27460
27471
  var finiteNonNegativeNumberSchema = external_exports.number().finite().nonnegative();
27461
27472
  var cacheHitRatePercentSchema = external_exports.number().finite().min(0).max(100);
27473
+ var indicatorTextSchema = (maximum) => harnessLocalizedTextSchema.refine((entries) => Object.values(entries).every((text) => text.length <= maximum));
27474
+ var composerIndicatorsSchema = external_exports.array(external_exports.object({
27475
+ kind: external_exports.literal("countdown"),
27476
+ id: external_exports.string().min(1).max(64),
27477
+ expiresAtUnix: nonNegativeSafeIntegerSchema,
27478
+ label: indicatorTextSchema(256).optional(),
27479
+ tooltip: indicatorTextSchema(1024).optional()
27480
+ }).strict()).max(2).refine((entries) => new Set(entries.map(({ id }) => id)).size === entries.length, {
27481
+ message: "Composer indicator IDs must be unique"
27482
+ });
27462
27483
  var threadUsageSnapshotSchema = external_exports.object({
27484
+ composerIndicators: composerIndicatorsSchema.optional(),
27463
27485
  inputTokens: nonNegativeSafeIntegerSchema.optional(),
27464
27486
  cachedInputTokens: nonNegativeSafeIntegerSchema.optional(),
27465
27487
  cacheWriteInputTokens: nonNegativeSafeIntegerSchema.optional(),
@@ -27867,7 +27889,9 @@ var harnessSessionCapabilitiesSchema = external_exports.object({
27867
27889
  }).strict().optional(),
27868
27890
  autonomousTurns: external_exports.object({
27869
27891
  observe: external_exports.boolean()
27870
- }).strict().optional()
27892
+ }).strict().optional(),
27893
+ /** True only when `turn.steer` delivers input into the active Turn through a native primitive. */
27894
+ steer: external_exports.boolean().optional()
27871
27895
  }).strict();
27872
27896
  var harnessConfigurationStateSchema = external_exports.object({
27873
27897
  effectiveModel: harnessModelRefSchema.optional(),
@@ -27914,7 +27938,9 @@ var harnessInspectionSchema = external_exports.union([
27914
27938
  var harnessInspectParamsSchema = external_exports.object({
27915
27939
  harnessId: harnessIdSchema,
27916
27940
  cwd: nonBlankTextSchema2.max(16384).optional(),
27917
- refresh: external_exports.boolean().optional()
27941
+ refresh: external_exports.boolean().optional(),
27942
+ /** `availability` asks only whether the Harness can run; see `InspectHarnessInput.purpose`. */
27943
+ purpose: external_exports.literal("availability").optional()
27918
27944
  }).strict();
27919
27945
  var harnessWebUiOpenParamsSchema = external_exports.object({
27920
27946
  harnessId: harnessIdSchema
@@ -27997,6 +28023,15 @@ var threadOwnershipListResultSchema = external_exports.object({
27997
28023
  seen.add(thread.threadId);
27998
28024
  }
27999
28025
  });
28026
+ var threadSteeringInspectParamsSchema = external_exports.object({
28027
+ threadId: hostThreadIdSchema,
28028
+ /** The text about to be steered; a Harness command always stops and restarts. */
28029
+ text: external_exports.string().optional()
28030
+ }).strict();
28031
+ var threadSteerDeliverySchema = external_exports.enum(["activeTurn", "newTurn"]);
28032
+ var threadSteeringInspectResultSchema = external_exports.object({
28033
+ delivery: external_exports.enum(["official", "activeTurn", "newTurn"])
28034
+ }).strict();
28000
28035
 
28001
28036
  // ../../shared-contracts/dist/harness-plugins.js
28002
28037
  var HARNESS_PLUGIN_MANIFEST_MAX_BYTES = 32 * 1024;
@@ -28098,6 +28133,10 @@ var harnessInstallationStateSchema = external_exports.object({
28098
28133
  latestVersion: external_exports.string().min(1).max(128),
28099
28134
  updateAvailable: external_exports.boolean(),
28100
28135
  canUpdate: external_exports.boolean(),
28136
+ /** Defaults to CLI; some Harnesses ship only inside a desktop application. */
28137
+ versionKind: external_exports.enum(["cli", "application"]).optional(),
28138
+ /** Official download opened by the user; does not imply an automatic installation. */
28139
+ manualUpdateUrl: external_exports.url().max(2048).refine((value) => /^https:\/\/[^/?#@]+(?:[/?#]|$)/iu.test(value), "Manual updates require a credential-free HTTPS URL").optional(),
28101
28140
  // Adapter-owned diagnostic text; UI uses messageCode rather than displaying it verbatim.
28102
28141
  message: external_exports.string().max(2048).optional(),
28103
28142
  messageCode: external_exports.string().min(1).max(128).optional(),
@@ -28105,6 +28144,20 @@ var harnessInstallationStateSchema = external_exports.object({
28105
28144
  notice: harnessLocalizedTextSchema.optional(),
28106
28145
  latestVersionKind: external_exports.enum(["unknown", "tracking-branch"]).optional()
28107
28146
  }).strict();
28147
+ var harnessInstallationTaskParamsSchema = external_exports.object({ taskId: external_exports.string().uuid() }).strict();
28148
+ var harnessInstallationTaskSchema = external_exports.discriminatedUnion("status", [
28149
+ external_exports.object({ taskId: external_exports.string().uuid(), status: external_exports.literal("running") }).strict(),
28150
+ external_exports.object({
28151
+ taskId: external_exports.string().uuid(),
28152
+ status: external_exports.literal("succeeded"),
28153
+ result: harnessInstallationStateSchema
28154
+ }).strict(),
28155
+ external_exports.object({
28156
+ taskId: external_exports.string().uuid(),
28157
+ status: external_exports.literal("failed"),
28158
+ error: external_exports.object({ code: external_exports.number().int(), message: external_exports.string().min(1).max(2048) }).strict()
28159
+ }).strict()
28160
+ ]);
28108
28161
 
28109
28162
  // ../../shared-contracts/dist/codex-accounts.js
28110
28163
  var accountIdSchema = external_exports.string().min(1).max(256).regex(/^[A-Za-z0-9._~-]+$/u);
@@ -29263,6 +29316,18 @@ var HarnessOutputChannel = class {
29263
29316
  }
29264
29317
  };
29265
29318
 
29319
+ // ../../harness-adapter/dist/steer.js
29320
+ function unsupportedSteer(harnessLabel) {
29321
+ return {
29322
+ ok: false,
29323
+ error: {
29324
+ code: "unsupported",
29325
+ message: `${harnessLabel} cannot steer an active Turn natively`,
29326
+ retryable: false
29327
+ }
29328
+ };
29329
+ }
29330
+
29266
29331
  // ../../harness-adapter/dist/usage.js
29267
29332
  var tokenFields = [
29268
29333
  "inputTokens",
@@ -29290,6 +29355,7 @@ var usageFields = /* @__PURE__ */ new Set([
29290
29355
  ...safeIntegerFields,
29291
29356
  ...percentFields,
29292
29357
  "sessionCacheUsage",
29358
+ "composerIndicators",
29293
29359
  "totalCostUsd",
29294
29360
  "totalCredits",
29295
29361
  "contextUsagePercent",
@@ -29312,6 +29378,7 @@ function parseHostUsage(value) {
29312
29378
  throw new Error(`Harness Usage contains unknown field '${key}'`);
29313
29379
  }
29314
29380
  }
29381
+ const indicators = value.composerIndicators === void 0 ? {} : { composerIndicators: composerIndicatorsSchema.parse(value.composerIndicators) };
29315
29382
  for (const field of [
29316
29383
  "totalCredits",
29317
29384
  "contextUsagePercent",
@@ -29382,9 +29449,9 @@ function parseHostUsage(value) {
29382
29449
  if (value.costSource !== "publicPrice") {
29383
29450
  throw new Error("Harness Usage 'unpricedModels' must be provided with a 'publicPrice' cost");
29384
29451
  }
29385
- return { ...value, unpricedModels: [...models] };
29452
+ return { ...value, ...indicators, unpricedModels: [...models] };
29386
29453
  }
29387
- return { ...value };
29454
+ return { ...value, ...indicators };
29388
29455
  }
29389
29456
  var requestTokenFields = [
29390
29457
  "inputTokens",
@@ -52272,6 +52339,8 @@ var QoderSession = class {
52272
52339
  };
52273
52340
  }
52274
52341
  switch (command.type) {
52342
+ case "turn.steer":
52343
+ return unsupportedSteer("Qoder");
52275
52344
  case "turn.start": {
52276
52345
  if (this.#activeTurn) {
52277
52346
  return {
@@ -52982,10 +53051,13 @@ function usageSessionTitle(value) {
52982
53051
  return void 0;
52983
53052
  if (normalized.length <= MAX_SESSION_TITLE_LENGTH)
52984
53053
  return normalized;
52985
- const characters = [...normalized];
52986
- if (characters.length <= MAX_SESSION_TITLE_LENGTH)
52987
- return normalized;
52988
- return `${characters.slice(0, MAX_SESSION_TITLE_LENGTH - 1).join("").trimEnd()}…`;
53054
+ let title = "";
53055
+ for (const character of normalized) {
53056
+ if (title.length + character.length >= MAX_SESSION_TITLE_LENGTH)
53057
+ break;
53058
+ title += character;
53059
+ }
53060
+ return `${title.trimEnd()}…`;
52989
53061
  }
52990
53062
  function sessionIdOk(value) {
52991
53063
  return typeof value === "string" && value.length > 0 && value.length <= MAX_SESSION_ID_LENGTH;