@cookielab.io/oopst 0.6.3 → 0.6.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -4,7 +4,7 @@ const require = createRequire(import.meta.url);
4
4
 
5
5
  // src/index.ts
6
6
  import { realpathSync } from "fs";
7
- import process4 from "process";
7
+ import process2 from "process";
8
8
  import { fileURLToPath as fileURLToPath2 } from "url";
9
9
  import { NodeRuntime, NodeServices as NodeServices2 } from "@effect/platform-node";
10
10
  import { Effect as Effect27, Layer as Layer12, Option as Option4, Runtime } from "effect";
@@ -14,13 +14,13 @@ import { CliOutput, Command, Flag } from "effect/unstable/cli";
14
14
  import { readFileSync } from "fs";
15
15
  import { homedir as readHomedir, hostname as readHostname } from "os";
16
16
  import { isAbsolute, join, normalize, resolve } from "path";
17
- import process from "process";
17
+ import { env as processEnv } from "process";
18
18
  import { Config, ConfigProvider, Effect, FileSystem, Option, Schema } from "effect";
19
19
  import { parse as parseYaml } from "yaml";
20
20
  var DEFAULT_SERVER_URL = "http://localhost:15433";
21
21
  var DEFAULT_LOOKBACK_DAYS = 2;
22
22
  var USER_CONFIG_FILE = ".oopst.yml";
23
- var runtimeEnv = process["env"];
23
+ var runtimeEnv = processEnv;
24
24
  var NonEmptyString = Schema.String.check(Schema.isNonEmpty());
25
25
  var NonNegativeInteger = Schema.Number.check(Schema.isInt(), Schema.isGreaterThanOrEqualTo(0));
26
26
  var CliConfigSourceSchema = Schema.Struct({
@@ -261,31 +261,42 @@ function resolveSyncConfig(flags, env) {
261
261
 
262
262
  // src/services/command-platform.ts
263
263
  import { homedir as readHomedir2, hostname as readHostname2 } from "os";
264
- import process2 from "process";
264
+ import process from "process";
265
265
  import { fileURLToPath } from "url";
266
266
  import { NodeFileSystem, NodeServices } from "@effect/platform-node";
267
- import { Context, Effect as Effect2, FileSystem as FileSystem2, Layer, Stream } from "effect";
267
+ import { Effect as Effect2, FileSystem as FileSystem2, Layer, Stream } from "effect";
268
268
  import { ChildProcess, ChildProcessSpawner } from "effect/unstable/process";
269
- var PACKAGE_JSON_PATHS = [
270
- fileURLToPath(new URL("../package.json", import.meta.url)),
271
- fileURLToPath(new URL("../../package.json", import.meta.url))
272
- ];
269
+
270
+ // src/services/command-console-services.ts
271
+ import { Context } from "effect";
273
272
  var CliConsole = class extends Context.Service()("@oopst/cli/CliConsole") {
274
273
  };
275
274
  var CliProcess = class extends Context.Service()("@oopst/cli/CliProcess") {
276
275
  };
277
- var CliHost = class extends Context.Service()("@oopst/cli/CliHost") {
276
+
277
+ // src/services/command-host-services.ts
278
+ import { Context as Context2 } from "effect";
279
+ var CliHost = class extends Context2.Service()("@oopst/cli/CliHost") {
278
280
  };
279
- var CliCommandRunner = class extends Context.Service()(
281
+ var CliCommandRunner = class extends Context2.Service()(
280
282
  "@oopst/cli/CliCommandRunner"
281
283
  ) {
282
284
  };
283
- var CliPackageMetadata = class extends Context.Service()(
285
+
286
+ // src/services/command-metadata-services.ts
287
+ import { Context as Context3 } from "effect";
288
+ var CliPackageMetadata = class extends Context3.Service()(
284
289
  "@oopst/cli/CliPackageMetadata"
285
290
  ) {
286
291
  };
287
- var CliConfigReader = class extends Context.Service()("@oopst/cli/CliConfigReader") {
292
+ var CliConfigReader = class extends Context3.Service()("@oopst/cli/CliConfigReader") {
288
293
  };
294
+
295
+ // src/services/command-platform.ts
296
+ var PACKAGE_JSON_PATHS = [
297
+ fileURLToPath(new URL("../package.json", import.meta.url)),
298
+ fileURLToPath(new URL("../../package.json", import.meta.url))
299
+ ];
289
300
  function writeLine(output, message) {
290
301
  output.write(`${message}
291
302
  `);
@@ -340,9 +351,9 @@ var CliConsoleLive = Layer.effect(
340
351
  Effect2.sync(
341
352
  () => CliConsole.of(
342
353
  makeCliConsole({
343
- stdin: process2.stdin,
344
- stdout: process2.stdout,
345
- stderr: process2.stderr
354
+ stdin: process.stdin,
355
+ stdout: process.stdout,
356
+ stderr: process.stderr
346
357
  })
347
358
  )
348
359
  )
@@ -353,7 +364,7 @@ var CliProcessLive = Layer.effect(
353
364
  () => CliProcess.of({
354
365
  execPath: Effect2.fn("CliProcess.execPath")(
355
366
  () => Effect2.try({
356
- try: () => process2.execPath,
367
+ try: () => process.execPath,
357
368
  catch: (err) => err
358
369
  })
359
370
  )()
@@ -443,8 +454,8 @@ var CliCommandPlatformLive = Layer.mergeAll(
443
454
  import { homedir } from "os";
444
455
  import { join as join2 } from "path";
445
456
  import { NodeFileSystem as NodeFileSystem2 } from "@effect/platform-node";
446
- import { Context as Context2, Effect as Effect3, FileSystem as FileSystem3, Layer as Layer2, Schema as Schema2 } from "effect";
447
- var ParserSources = class extends Context2.Service()("@oopst/cli/ParserSources") {
457
+ import { Context as Context4, Effect as Effect3, FileSystem as FileSystem3, Layer as Layer2, Schema as Schema2 } from "effect";
458
+ var ParserSources = class extends Context4.Service()("@oopst/cli/ParserSources") {
448
459
  };
449
460
  var ParserSourceError = class extends Schema2.TaggedErrorClass()("ParserSourceError", {
450
461
  cause: Schema2.optionalKey(Schema2.Defect()),
@@ -521,77 +532,106 @@ var ParserSourcesLive = Layer2.effect(
521
532
  ).pipe(Layer2.provide(NodeFileSystem2.layer));
522
533
 
523
534
  // src/services/sync-program.ts
524
- import { Context as Context6, Effect as Effect10, Layer as Layer5 } from "effect";
535
+ import { Context as Context8, Effect as Effect10, Layer as Layer5 } from "effect";
525
536
 
526
537
  // src/sync/run.ts
527
538
  import { createHash } from "crypto";
528
539
 
529
- // ../../packages/api/src/errors.ts
540
+ // ../../packages/api/src/errors/auth-errors.ts
530
541
  import { Schema as Schema3 } from "effect";
531
542
  var ErrorFields = {
532
543
  message: Schema3.String
533
544
  };
534
- var InfrastructureErrorFields = {
535
- ...ErrorFields,
536
- cause: Schema3.optionalKey(Schema3.Defect())
537
- };
538
545
  var UnauthorizedError = class extends Schema3.TaggedErrorClass()("UnauthorizedError", ErrorFields) {
539
546
  };
540
547
  var ForbiddenError = class extends Schema3.TaggedErrorClass()("ForbiddenError", ErrorFields) {
541
548
  };
542
- var NotFoundError = class extends Schema3.TaggedErrorClass()("NotFoundError", ErrorFields) {
549
+
550
+ // ../../packages/api/src/errors/config-errors.ts
551
+ import { Schema as Schema4 } from "effect";
552
+ var InfrastructureErrorFields = {
553
+ message: Schema4.String,
554
+ cause: Schema4.optionalKey(Schema4.Defect())
543
555
  };
544
- var ConflictError = class extends Schema3.TaggedErrorClass()("ConflictError", ErrorFields) {
556
+ var AppConfigError = class extends Schema4.TaggedErrorClass()("AppConfigError", InfrastructureErrorFields) {
545
557
  };
546
- var ValidationError = class extends Schema3.TaggedErrorClass()("ValidationError", ErrorFields) {
558
+ var PricingRefreshError = class extends Schema4.TaggedErrorClass()(
559
+ "PricingRefreshError",
560
+ InfrastructureErrorFields
561
+ ) {
547
562
  };
548
- var RateLimitedError = class extends Schema3.TaggedErrorClass()("RateLimitedError", ErrorFields) {
563
+
564
+ // ../../packages/api/src/errors/infrastructure-errors.ts
565
+ import { Schema as Schema5 } from "effect";
566
+ var InfrastructureErrorFields2 = {
567
+ message: Schema5.String,
568
+ cause: Schema5.optionalKey(Schema5.Defect())
549
569
  };
550
- var ExternalHttpError = class extends Schema3.TaggedErrorClass()(
570
+ var ExternalHttpError = class extends Schema5.TaggedErrorClass()(
551
571
  "ExternalHttpError",
552
- InfrastructureErrorFields
572
+ InfrastructureErrorFields2
553
573
  ) {
554
574
  };
555
- var DatabaseError = class extends Schema3.TaggedErrorClass()(
556
- "DatabaseError",
557
- InfrastructureErrorFields
558
- ) {
575
+ var DatabaseError = class extends Schema5.TaggedErrorClass()("DatabaseError", InfrastructureErrorFields2) {
559
576
  };
560
- var AppConfigError = class extends Schema3.TaggedErrorClass()(
561
- "AppConfigError",
562
- InfrastructureErrorFields
563
- ) {
577
+
578
+ // ../../packages/api/src/errors/request-errors.ts
579
+ import { Schema as Schema6 } from "effect";
580
+ var ErrorFields2 = {
581
+ message: Schema6.String
564
582
  };
565
- var PricingRefreshError = class extends Schema3.TaggedErrorClass()(
566
- "PricingRefreshError",
567
- InfrastructureErrorFields
568
- ) {
583
+ var ValidationError = class extends Schema6.TaggedErrorClass()("ValidationError", ErrorFields2) {
584
+ };
585
+ var RateLimitedError = class extends Schema6.TaggedErrorClass()("RateLimitedError", ErrorFields2) {
586
+ };
587
+
588
+ // ../../packages/api/src/errors/resource-errors.ts
589
+ import { Schema as Schema7 } from "effect";
590
+ var ErrorFields3 = {
591
+ message: Schema7.String
569
592
  };
570
- var ParserSourceError2 = class extends Schema3.TaggedErrorClass()(
593
+ var NotFoundError = class extends Schema7.TaggedErrorClass()("NotFoundError", ErrorFields3) {
594
+ };
595
+ var ConflictError = class extends Schema7.TaggedErrorClass()("ConflictError", ErrorFields3) {
596
+ };
597
+
598
+ // ../../packages/api/src/errors/source-errors.ts
599
+ import { Schema as Schema8 } from "effect";
600
+ var ErrorFields4 = {
601
+ message: Schema8.String
602
+ };
603
+ var InfrastructureErrorFields3 = {
604
+ ...ErrorFields4,
605
+ cause: Schema8.optionalKey(Schema8.Defect())
606
+ };
607
+ var ParserSourceError2 = class extends Schema8.TaggedErrorClass()(
571
608
  "ParserSourceError",
572
- InfrastructureErrorFields
609
+ InfrastructureErrorFields3
573
610
  ) {
574
611
  };
575
- var SyncQuotaExceededError = class extends Schema3.TaggedErrorClass()(
612
+ var SyncQuotaExceededError = class extends Schema8.TaggedErrorClass()(
576
613
  "SyncQuotaExceededError",
577
- ErrorFields
614
+ ErrorFields4
578
615
  ) {
579
616
  };
580
- var SyncTimestampRejectedError = class extends Schema3.TaggedErrorClass()(
617
+
618
+ // ../../packages/api/src/errors/sync-errors.ts
619
+ import { Schema as Schema9 } from "effect";
620
+ var SyncTimestampRejectedError = class extends Schema9.TaggedErrorClass()(
581
621
  "SyncTimestampRejectedError",
582
- ErrorFields
622
+ { message: Schema9.String }
583
623
  ) {
584
624
  };
585
625
 
586
626
  // ../../packages/api/src/rpc/auth.ts
587
- import { Context as Context3, Schema as Schema6 } from "effect";
627
+ import { Context as Context5, Schema as Schema12 } from "effect";
588
628
  import { Rpc, RpcGroup } from "effect/unstable/rpc";
589
629
 
590
630
  // ../../packages/api/src/schemas/auth.ts
591
- import { Schema as Schema4, SchemaGetter } from "effect";
631
+ import { Schema as Schema10, SchemaGetter } from "effect";
592
632
  var MAX_DISPLAY_NAME_LENGTH = 80;
593
- var displayNameInput = Schema4.String.check(Schema4.isMaxLength(MAX_DISPLAY_NAME_LENGTH)).pipe(
594
- Schema4.decodeTo(Schema4.NullOr(Schema4.String), {
633
+ var displayNameInput = Schema10.String.check(Schema10.isMaxLength(MAX_DISPLAY_NAME_LENGTH)).pipe(
634
+ Schema10.decodeTo(Schema10.NullOr(Schema10.String), {
595
635
  decode: SchemaGetter.transform((value) => {
596
636
  const trimmed = value.trim();
597
637
  return trimmed.length === 0 ? null : trimmed;
@@ -599,12 +639,12 @@ var displayNameInput = Schema4.String.check(Schema4.isMaxLength(MAX_DISPLAY_NAME
599
639
  encode: SchemaGetter.transform((value) => value ?? "")
600
640
  })
601
641
  );
602
- var updateProfileInput = Schema4.Struct({
642
+ var updateProfileInput = Schema10.Struct({
603
643
  displayName: displayNameInput
604
644
  });
605
645
 
606
646
  // ../../packages/api/src/schemas/common.ts
607
- import { Schema as Schema5 } from "effect";
647
+ import { Schema as Schema11 } from "effect";
608
648
  var ISO_UTC_PATTERN = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/u;
609
649
  var CIVIL_DATE_PATTERN = /^\d{4}-\d{2}-\d{2}$/u;
610
650
  var HEX64_PATTERN = /^[0-9a-f]{64}$/u;
@@ -649,49 +689,49 @@ var isApiUrl = (value) => {
649
689
  return false;
650
690
  }
651
691
  };
652
- var nonEmptyTrimmedString = Schema5.String.check(
653
- Schema5.isTrimmed(),
654
- Schema5.isNonEmpty({ message: "Expected a non-empty string" })
692
+ var nonEmptyTrimmedString = Schema11.String.check(
693
+ Schema11.isTrimmed(),
694
+ Schema11.isNonEmpty({ message: "Expected a non-empty string" })
655
695
  );
656
- var safeInteger = Schema5.Number.check(
657
- Schema5.isInt(),
658
- Schema5.isBetween({ minimum: Number.MIN_SAFE_INTEGER, maximum: Number.MAX_SAFE_INTEGER })
696
+ var safeInteger = Schema11.Number.check(
697
+ Schema11.isInt(),
698
+ Schema11.isBetween({ minimum: Number.MIN_SAFE_INTEGER, maximum: Number.MAX_SAFE_INTEGER })
659
699
  );
660
- var nonNegativeSafeInteger = safeInteger.check(Schema5.isGreaterThanOrEqualTo(0));
661
- var isoUtcString = Schema5.String.check(
662
- Schema5.makeFilter(isExactUtcInstant, { expected: "an ISO-8601 UTC timestamp with millisecond precision" })
700
+ var nonNegativeSafeInteger = safeInteger.check(Schema11.isGreaterThanOrEqualTo(0));
701
+ var isoUtcString = Schema11.String.check(
702
+ Schema11.makeFilter(isExactUtcInstant, { expected: "an ISO-8601 UTC timestamp with millisecond precision" })
663
703
  );
664
- var civilDate = Schema5.String.check(
665
- Schema5.makeFilter(isCivilDate, { expected: "a valid calendar date formatted as YYYY-MM-DD" })
704
+ var civilDate = Schema11.String.check(
705
+ Schema11.makeFilter(isCivilDate, { expected: "a valid calendar date formatted as YYYY-MM-DD" })
666
706
  );
667
- var ianaTimezone = Schema5.String.check(
668
- Schema5.makeFilter(isIanaTimezone, { expected: "an IANA timezone identifier" })
707
+ var ianaTimezone = Schema11.String.check(
708
+ Schema11.makeFilter(isIanaTimezone, { expected: "an IANA timezone identifier" })
669
709
  );
670
- var uuidV7 = Schema5.String.check(Schema5.isUUID(UUID_V7_VERSION)).pipe(Schema5.brand("UuidV7"));
671
- var generalUuid = Schema5.String.check(Schema5.isUUID()).pipe(Schema5.brand("GeneralUuid"));
672
- var hex64 = Schema5.String.check(
673
- Schema5.isPattern(HEX64_PATTERN, { expected: "a 64-character lowercase hex string" })
710
+ var uuidV7 = Schema11.String.check(Schema11.isUUID(UUID_V7_VERSION)).pipe(Schema11.brand("UuidV7"));
711
+ var generalUuid = Schema11.String.check(Schema11.isUUID()).pipe(Schema11.brand("GeneralUuid"));
712
+ var hex64 = Schema11.String.check(
713
+ Schema11.isPattern(HEX64_PATTERN, { expected: "a 64-character lowercase hex string" })
674
714
  );
675
- var apiUrl = Schema5.String.check(Schema5.makeFilter(isApiUrl, { expected: "an HTTP(S) URL" }));
715
+ var apiUrl = Schema11.String.check(Schema11.makeFilter(isApiUrl, { expected: "an HTTP(S) URL" }));
676
716
 
677
717
  // ../../packages/api/src/rpc/auth.ts
678
- var AuthUserResponse = Schema6.Struct({
679
- user: Schema6.Struct({
680
- id: Schema6.String,
681
- email: Schema6.String,
682
- displayName: Schema6.NullOr(Schema6.String),
718
+ var AuthUserResponse = Schema12.Struct({
719
+ user: Schema12.Struct({
720
+ id: Schema12.String,
721
+ email: Schema12.String,
722
+ displayName: Schema12.NullOr(Schema12.String),
683
723
  createdAt: isoUtcString
684
724
  })
685
725
  });
686
- var LogoutResponse = Schema6.Struct({
687
- ok: Schema6.Boolean
726
+ var LogoutResponse = Schema12.Struct({
727
+ ok: Schema12.Boolean
688
728
  });
689
- var WebRpcContext = class extends Context3.Service()("@oopst/api/WebRpcContext") {
729
+ var WebRpcContext = class extends Context5.Service()("@oopst/api/WebRpcContext") {
690
730
  };
691
731
  var AuthRpcs = RpcGroup.make(
692
732
  Rpc.make("auth.logout", {
693
733
  success: LogoutResponse,
694
- error: Schema6.Union([DatabaseError, UnauthorizedError])
734
+ error: Schema12.Union([DatabaseError, UnauthorizedError])
695
735
  }),
696
736
  Rpc.make("auth.me", {
697
737
  success: AuthUserResponse,
@@ -700,42 +740,42 @@ var AuthRpcs = RpcGroup.make(
700
740
  Rpc.make("auth.updateProfile", {
701
741
  payload: updateProfileInput,
702
742
  success: AuthUserResponse,
703
- error: Schema6.Union([DatabaseError, UnauthorizedError])
743
+ error: Schema12.Union([DatabaseError, UnauthorizedError])
704
744
  })
705
745
  );
706
746
 
707
747
  // ../../packages/api/src/rpc/devices.ts
708
- import { Schema as Schema8 } from "effect";
748
+ import { Schema as Schema14 } from "effect";
709
749
  import { Rpc as Rpc2, RpcGroup as RpcGroup2 } from "effect/unstable/rpc";
710
750
 
711
751
  // ../../packages/api/src/schemas/devices.ts
712
- import { Schema as Schema7 } from "effect";
752
+ import { Schema as Schema13 } from "effect";
713
753
  var MIN_DEVICE_NAME_LENGTH = 1;
714
754
  var MAX_DEVICE_NAME_LENGTH = 80;
715
755
  var UUID_V7_VERSION2 = 7;
716
- var deviceNameSchema = Schema7.String.check(
717
- Schema7.isMinLength(MIN_DEVICE_NAME_LENGTH),
718
- Schema7.isMaxLength(MAX_DEVICE_NAME_LENGTH)
756
+ var deviceNameSchema = Schema13.String.check(
757
+ Schema13.isMinLength(MIN_DEVICE_NAME_LENGTH),
758
+ Schema13.isMaxLength(MAX_DEVICE_NAME_LENGTH)
719
759
  );
720
- var editableDeviceNameSchema = Schema7.Trim.check(
721
- Schema7.isMinLength(MIN_DEVICE_NAME_LENGTH),
722
- Schema7.isMaxLength(MAX_DEVICE_NAME_LENGTH)
760
+ var editableDeviceNameSchema = Schema13.Trim.check(
761
+ Schema13.isMinLength(MIN_DEVICE_NAME_LENGTH),
762
+ Schema13.isMaxLength(MAX_DEVICE_NAME_LENGTH)
723
763
  );
724
- var deviceIdSchema = Schema7.String.check(Schema7.isUUID(UUID_V7_VERSION2));
725
- var renameDeviceInput = Schema7.Struct({
764
+ var deviceIdSchema = Schema13.String.check(Schema13.isUUID(UUID_V7_VERSION2));
765
+ var renameDeviceInput = Schema13.Struct({
726
766
  id: deviceIdSchema,
727
767
  name: editableDeviceNameSchema
728
768
  });
729
- var deleteDeviceInput = Schema7.Struct({
769
+ var deleteDeviceInput = Schema13.Struct({
730
770
  id: deviceIdSchema
731
771
  });
732
- var renameDeviceOutput = Schema7.Struct({
772
+ var renameDeviceOutput = Schema13.Struct({
733
773
  id: deviceIdSchema,
734
- name: Schema7.String,
774
+ name: Schema13.String,
735
775
  lastSeen: isoUtcString
736
776
  });
737
- var deleteDeviceOutput = Schema7.Struct({
738
- ok: Schema7.Boolean
777
+ var deleteDeviceOutput = Schema13.Struct({
778
+ ok: Schema13.Boolean
739
779
  });
740
780
 
741
781
  // ../../packages/api/src/rpc/devices.ts
@@ -743,27 +783,27 @@ var DevicesRpcs = RpcGroup2.make(
743
783
  Rpc2.make("devices.rename", {
744
784
  payload: renameDeviceInput,
745
785
  success: renameDeviceOutput,
746
- error: Schema8.Union([ConflictError, DatabaseError, NotFoundError, UnauthorizedError])
786
+ error: Schema14.Union([ConflictError, DatabaseError, NotFoundError, UnauthorizedError])
747
787
  }),
748
788
  Rpc2.make("devices.delete", {
749
789
  payload: deleteDeviceInput,
750
790
  success: deleteDeviceOutput,
751
- error: Schema8.Union([DatabaseError, NotFoundError, UnauthorizedError])
791
+ error: Schema14.Union([DatabaseError, NotFoundError, UnauthorizedError])
752
792
  })
753
793
  );
754
794
 
755
795
  // ../../packages/api/src/rpc/stats.ts
756
- import { Schema as Schema10 } from "effect";
796
+ import { Schema as Schema16 } from "effect";
757
797
  import { Rpc as Rpc3, RpcGroup as RpcGroup3 } from "effect/unstable/rpc";
758
798
 
759
799
  // ../../packages/api/src/schemas/stats.ts
760
- import { Effect as Effect4, Schema as Schema9 } from "effect";
761
- var scopeEnum = Schema9.Literals(["all", "me"]);
762
- var costStackByValueEnum = Schema9.Literals(["device", "harness", "model"]);
763
- var costStackByEnum = Schema9.optional(costStackByValueEnum);
764
- var usageDetailStackByEnum = Schema9.Literals(["device", "harness", "model"]);
765
- var stackByValueEnum = Schema9.Literals(["device", "harness"]);
766
- var stackByEnum = Schema9.optional(stackByValueEnum);
800
+ import { Effect as Effect4, Schema as Schema15 } from "effect";
801
+ var scopeEnum = Schema15.Literals(["all", "me"]);
802
+ var costStackByValueEnum = Schema15.Literals(["device", "harness", "model"]);
803
+ var costStackByEnum = Schema15.optional(costStackByValueEnum);
804
+ var usageDetailStackByEnum = Schema15.Literals(["device", "harness", "model"]);
805
+ var stackByValueEnum = Schema15.Literals(["device", "harness"]);
806
+ var stackByEnum = Schema15.optional(stackByValueEnum);
767
807
  var MAX_TIME_ZONE_LENGTH = 64;
768
808
  var DEFAULT_DAYS = 90;
769
809
  var MAX_DAYS = 365;
@@ -781,16 +821,16 @@ var MAX_LEADERBOARD_LIMIT = 50;
781
821
  var DEFAULT_LEADERBOARD_LIMIT = 10;
782
822
  var UUID_V7_VERSION3 = 7;
783
823
  var CIVIL_DATE_PATTERN2 = /^(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})$/u;
784
- var timeZoneSchema = ianaTimezone.check(Schema9.isMaxLength(MAX_TIME_ZONE_LENGTH));
824
+ var timeZoneSchema = ianaTimezone.check(Schema15.isMaxLength(MAX_TIME_ZONE_LENGTH));
785
825
  var civilDateSchema = civilDate;
786
- var daysSchema = safeInteger.check(Schema9.isBetween({ minimum: MIN_LEADERBOARD_LIMIT, maximum: MAX_DAYS })).pipe(Schema9.withDecodingDefaultTypeKey(Effect4.succeed(DEFAULT_DAYS)));
787
- var leaderboardLimitSchema = safeInteger.check(Schema9.isBetween({ minimum: MIN_LEADERBOARD_LIMIT, maximum: MAX_LEADERBOARD_LIMIT })).pipe(Schema9.withDecodingDefaultTypeKey(Effect4.succeed(DEFAULT_LEADERBOARD_LIMIT)));
788
- var defaultTimeZoneSchema = timeZoneSchema.pipe(Schema9.withDecodingDefaultTypeKey(Effect4.succeed("UTC")));
789
- var uuidSchema = Schema9.String.check(Schema9.isUUID(UUID_V7_VERSION3));
826
+ var daysSchema = safeInteger.check(Schema15.isBetween({ minimum: MIN_LEADERBOARD_LIMIT, maximum: MAX_DAYS })).pipe(Schema15.withDecodingDefaultTypeKey(Effect4.succeed(DEFAULT_DAYS)));
827
+ var leaderboardLimitSchema = safeInteger.check(Schema15.isBetween({ minimum: MIN_LEADERBOARD_LIMIT, maximum: MAX_LEADERBOARD_LIMIT })).pipe(Schema15.withDecodingDefaultTypeKey(Effect4.succeed(DEFAULT_LEADERBOARD_LIMIT)));
828
+ var defaultTimeZoneSchema = timeZoneSchema.pipe(Schema15.withDecodingDefaultTypeKey(Effect4.succeed("UTC")));
829
+ var uuidSchema = Schema15.String.check(Schema15.isUUID(UUID_V7_VERSION3));
790
830
  var rangeFields = {
791
831
  days: daysSchema,
792
- endDate: Schema9.optional(civilDateSchema),
793
- startDate: Schema9.optional(civilDateSchema)
832
+ endDate: Schema15.optional(civilDateSchema),
833
+ startDate: Schema15.optional(civilDateSchema)
794
834
  };
795
835
  function validateDateRange(input) {
796
836
  if (!(input.startDate || input.endDate)) {
@@ -830,216 +870,216 @@ function parseCivilDateUtcMs(date) {
830
870
  }
831
871
  return parsed.getTime();
832
872
  }
833
- var dailyCostInput = Schema9.Struct({
873
+ var dailyCostInput = Schema15.Struct({
834
874
  scope: scopeEnum,
835
875
  stackBy: costStackByEnum,
836
876
  ...rangeFields,
837
877
  timeZone: defaultTimeZoneSchema
838
- }).check(Schema9.makeFilter(validateDateRange));
839
- var dailyPointSchema = Schema9.Struct({
878
+ }).check(Schema15.makeFilter(validateDateRange));
879
+ var dailyPointSchema = Schema15.Struct({
840
880
  /** Local civil date in YYYY-MM-DD for the requested stats timezone. */
841
881
  date: civilDateSchema,
842
882
  /** null when stackBy is undefined. */
843
- seriesName: Schema9.NullOr(Schema9.String),
883
+ seriesName: Schema15.NullOr(Schema15.String),
844
884
  /** USD; 0 or positive. */
845
- usd: Schema9.Number
885
+ usd: Schema15.Number
846
886
  });
847
- var dailyCostOutput = Schema9.Array(dailyPointSchema);
848
- var dailySessionsInput = Schema9.Struct({
887
+ var dailyCostOutput = Schema15.Array(dailyPointSchema);
888
+ var dailySessionsInput = Schema15.Struct({
849
889
  scope: scopeEnum,
850
890
  stackBy: stackByEnum,
851
891
  ...rangeFields,
852
892
  timeZone: defaultTimeZoneSchema
853
- }).check(Schema9.makeFilter(validateDateRange));
854
- var dailySessionsPointSchema = Schema9.Struct({
893
+ }).check(Schema15.makeFilter(validateDateRange));
894
+ var dailySessionsPointSchema = Schema15.Struct({
855
895
  date: civilDateSchema,
856
- seriesName: Schema9.NullOr(Schema9.String),
896
+ seriesName: Schema15.NullOr(Schema15.String),
857
897
  sessions: nonNegativeSafeInteger
858
898
  });
859
- var dailySessionsOutput = Schema9.Array(dailySessionsPointSchema);
899
+ var dailySessionsOutput = Schema15.Array(dailySessionsPointSchema);
860
900
  var weekdaySessionsInput = dailySessionsInput;
861
- var weekdaySessionsPointSchema = Schema9.Struct({
901
+ var weekdaySessionsPointSchema = Schema15.Struct({
862
902
  /** Local ISO weekday for the requested stats timezone: 1=Monday, 7=Sunday. */
863
- weekday: safeInteger.check(Schema9.isBetween({ minimum: MIN_ISO_WEEKDAY, maximum: MAX_ISO_WEEKDAY })),
864
- seriesName: Schema9.NullOr(Schema9.String),
903
+ weekday: safeInteger.check(Schema15.isBetween({ minimum: MIN_ISO_WEEKDAY, maximum: MAX_ISO_WEEKDAY })),
904
+ seriesName: Schema15.NullOr(Schema15.String),
865
905
  sessions: nonNegativeSafeInteger
866
906
  });
867
- var weekdaySessionsOutput = Schema9.Array(weekdaySessionsPointSchema);
907
+ var weekdaySessionsOutput = Schema15.Array(weekdaySessionsPointSchema);
868
908
  var hourlySessionsInput = dailySessionsInput;
869
- var hourlySessionsPointSchema = Schema9.Struct({
909
+ var hourlySessionsPointSchema = Schema15.Struct({
870
910
  /** Local hour of day for the requested stats timezone: 0-23. */
871
- hour: safeInteger.check(Schema9.isBetween({ minimum: MIN_HOUR_OF_DAY, maximum: MAX_HOUR_OF_DAY })),
872
- seriesName: Schema9.NullOr(Schema9.String),
911
+ hour: safeInteger.check(Schema15.isBetween({ minimum: MIN_HOUR_OF_DAY, maximum: MAX_HOUR_OF_DAY })),
912
+ seriesName: Schema15.NullOr(Schema15.String),
873
913
  sessions: nonNegativeSafeInteger
874
914
  });
875
- var hourlySessionsOutput = Schema9.Array(hourlySessionsPointSchema);
876
- var summaryInput = Schema9.Struct({
915
+ var hourlySessionsOutput = Schema15.Array(hourlySessionsPointSchema);
916
+ var summaryInput = Schema15.Struct({
877
917
  ...rangeFields,
878
918
  scope: scopeEnum,
879
919
  timeZone: defaultTimeZoneSchema
880
- }).check(Schema9.makeFilter(validateDateRange));
881
- var summaryOutput = Schema9.Struct({
882
- rangeUsd: Schema9.Number.check(Schema9.isGreaterThanOrEqualTo(0)),
920
+ }).check(Schema15.makeFilter(validateDateRange));
921
+ var summaryOutput = Schema15.Struct({
922
+ rangeUsd: Schema15.Number.check(Schema15.isGreaterThanOrEqualTo(0)),
883
923
  rangeSessions: nonNegativeSafeInteger,
884
924
  rangeSubjectCount: nonNegativeSafeInteger,
885
- totalUsd: Schema9.Number.check(Schema9.isGreaterThanOrEqualTo(0)),
925
+ totalUsd: Schema15.Number.check(Schema15.isGreaterThanOrEqualTo(0)),
886
926
  totalSessions: nonNegativeSafeInteger
887
927
  });
888
- var deviceSummarySchema = Schema9.Struct({
928
+ var deviceSummarySchema = Schema15.Struct({
889
929
  id: uuidSchema,
890
- name: Schema9.String,
930
+ name: Schema15.String,
891
931
  /** ISO-8601 UTC. */
892
932
  lastSeen: isoUtcString
893
933
  });
894
- var devicesOutput = Schema9.Array(deviceSummarySchema);
895
- var participantSyncSchema = Schema9.Struct({
934
+ var devicesOutput = Schema15.Array(deviceSummarySchema);
935
+ var participantSyncSchema = Schema15.Struct({
896
936
  userId: uuidSchema,
897
- userLabel: Schema9.String,
937
+ userLabel: Schema15.String,
898
938
  /** ISO-8601 UTC, null when the participant has no synced devices yet. */
899
- latestSyncAt: Schema9.NullOr(isoUtcString)
939
+ latestSyncAt: Schema15.NullOr(isoUtcString)
900
940
  });
901
- var participantsOutput = Schema9.Array(participantSyncSchema);
902
- var leaderboardInput = Schema9.Struct({
941
+ var participantsOutput = Schema15.Array(participantSyncSchema);
942
+ var leaderboardInput = Schema15.Struct({
903
943
  ...rangeFields,
904
944
  limit: leaderboardLimitSchema,
905
945
  timeZone: defaultTimeZoneSchema
906
- }).check(Schema9.makeFilter(validateDateRange));
907
- var leaderboardRowSchema = Schema9.Struct({
908
- rank: safeInteger.check(Schema9.isGreaterThanOrEqualTo(1)),
946
+ }).check(Schema15.makeFilter(validateDateRange));
947
+ var leaderboardRowSchema = Schema15.Struct({
948
+ rank: safeInteger.check(Schema15.isGreaterThanOrEqualTo(1)),
909
949
  userId: uuidSchema,
910
- userLabel: Schema9.String,
911
- usd: Schema9.Number.check(Schema9.isGreaterThanOrEqualTo(0)),
950
+ userLabel: Schema15.String,
951
+ usd: Schema15.Number.check(Schema15.isGreaterThanOrEqualTo(0)),
912
952
  tokens: nonNegativeSafeInteger,
913
953
  sessions: nonNegativeSafeInteger
914
954
  });
915
- var leaderboardOutput = Schema9.Array(leaderboardRowSchema);
955
+ var leaderboardOutput = Schema15.Array(leaderboardRowSchema);
916
956
  var topDimensionsInput = leaderboardInput;
917
- var topDimensionRowSchema = Schema9.Struct({
918
- rank: safeInteger.check(Schema9.isGreaterThanOrEqualTo(1)),
919
- name: Schema9.String,
920
- usd: Schema9.Number.check(Schema9.isGreaterThanOrEqualTo(0)),
957
+ var topDimensionRowSchema = Schema15.Struct({
958
+ rank: safeInteger.check(Schema15.isGreaterThanOrEqualTo(1)),
959
+ name: Schema15.String,
960
+ usd: Schema15.Number.check(Schema15.isGreaterThanOrEqualTo(0)),
921
961
  tokens: nonNegativeSafeInteger,
922
- sessions: Schema9.NullOr(nonNegativeSafeInteger)
962
+ sessions: Schema15.NullOr(nonNegativeSafeInteger)
923
963
  });
924
- var topDimensionsOutput = Schema9.Struct({
925
- harnesses: Schema9.Array(topDimensionRowSchema),
926
- models: Schema9.Array(topDimensionRowSchema)
964
+ var topDimensionsOutput = Schema15.Struct({
965
+ harnesses: Schema15.Array(topDimensionRowSchema),
966
+ models: Schema15.Array(topDimensionRowSchema)
927
967
  });
928
- var usageDetailsInput = Schema9.Struct({
968
+ var usageDetailsInput = Schema15.Struct({
929
969
  ...rangeFields,
930
970
  stackBy: usageDetailStackByEnum,
931
971
  timeZone: defaultTimeZoneSchema
932
- }).check(Schema9.makeFilter(validateDateRange));
933
- var usageDetailsRowSchema = Schema9.Struct({
934
- id: Schema9.String,
935
- name: Schema9.String,
972
+ }).check(Schema15.makeFilter(validateDateRange));
973
+ var usageDetailsRowSchema = Schema15.Struct({
974
+ id: Schema15.String,
975
+ name: Schema15.String,
936
976
  tokens: nonNegativeSafeInteger,
937
- sessions: Schema9.NullOr(nonNegativeSafeInteger),
938
- usd: Schema9.Number.check(Schema9.isGreaterThanOrEqualTo(0)),
939
- totalUsd: Schema9.Number.check(Schema9.isGreaterThanOrEqualTo(0))
977
+ sessions: Schema15.NullOr(nonNegativeSafeInteger),
978
+ usd: Schema15.Number.check(Schema15.isGreaterThanOrEqualTo(0)),
979
+ totalUsd: Schema15.Number.check(Schema15.isGreaterThanOrEqualTo(0))
940
980
  });
941
- var usageDetailsOutput = Schema9.Array(usageDetailsRowSchema);
981
+ var usageDetailsOutput = Schema15.Array(usageDetailsRowSchema);
942
982
 
943
983
  // ../../packages/api/src/rpc/stats.ts
944
984
  var StatsRpcs = RpcGroup3.make(
945
985
  Rpc3.make("stats.devices", {
946
986
  success: devicesOutput,
947
- error: Schema10.Union([DatabaseError, UnauthorizedError])
987
+ error: Schema16.Union([DatabaseError, UnauthorizedError])
948
988
  }),
949
989
  Rpc3.make("stats.participants", {
950
990
  success: participantsOutput,
951
- error: Schema10.Union([DatabaseError, UnauthorizedError])
991
+ error: Schema16.Union([DatabaseError, UnauthorizedError])
952
992
  }),
953
993
  Rpc3.make("stats.leaderboard", {
954
994
  payload: leaderboardInput,
955
995
  success: leaderboardOutput,
956
- error: Schema10.Union([DatabaseError, UnauthorizedError])
996
+ error: Schema16.Union([DatabaseError, UnauthorizedError])
957
997
  }),
958
998
  Rpc3.make("stats.topDimensions", {
959
999
  payload: topDimensionsInput,
960
1000
  success: topDimensionsOutput,
961
- error: Schema10.Union([DatabaseError, UnauthorizedError])
1001
+ error: Schema16.Union([DatabaseError, UnauthorizedError])
962
1002
  }),
963
1003
  Rpc3.make("stats.summary", {
964
1004
  payload: summaryInput,
965
1005
  success: summaryOutput,
966
- error: Schema10.Union([DatabaseError, UnauthorizedError])
1006
+ error: Schema16.Union([DatabaseError, UnauthorizedError])
967
1007
  }),
968
1008
  Rpc3.make("stats.dailyCost", {
969
1009
  payload: dailyCostInput,
970
1010
  success: dailyCostOutput,
971
- error: Schema10.Union([DatabaseError, UnauthorizedError])
1011
+ error: Schema16.Union([DatabaseError, UnauthorizedError])
972
1012
  }),
973
1013
  Rpc3.make("stats.dailySessions", {
974
1014
  payload: dailySessionsInput,
975
1015
  success: dailySessionsOutput,
976
- error: Schema10.Union([DatabaseError, UnauthorizedError])
1016
+ error: Schema16.Union([DatabaseError, UnauthorizedError])
977
1017
  }),
978
1018
  Rpc3.make("stats.weekdaySessions", {
979
1019
  payload: weekdaySessionsInput,
980
1020
  success: weekdaySessionsOutput,
981
- error: Schema10.Union([DatabaseError, UnauthorizedError])
1021
+ error: Schema16.Union([DatabaseError, UnauthorizedError])
982
1022
  }),
983
1023
  Rpc3.make("stats.hourlySessions", {
984
1024
  payload: hourlySessionsInput,
985
1025
  success: hourlySessionsOutput,
986
- error: Schema10.Union([DatabaseError, UnauthorizedError])
1026
+ error: Schema16.Union([DatabaseError, UnauthorizedError])
987
1027
  }),
988
1028
  Rpc3.make("stats.usageDetails", {
989
1029
  payload: usageDetailsInput,
990
1030
  success: usageDetailsOutput,
991
- error: Schema10.Union([DatabaseError, UnauthorizedError])
1031
+ error: Schema16.Union([DatabaseError, UnauthorizedError])
992
1032
  })
993
1033
  );
994
1034
 
995
1035
  // ../../packages/api/src/rpc/tokens.ts
996
- import { Schema as Schema12 } from "effect";
1036
+ import { Schema as Schema18 } from "effect";
997
1037
  import { Rpc as Rpc4, RpcGroup as RpcGroup4 } from "effect/unstable/rpc";
998
1038
 
999
1039
  // ../../packages/api/src/schemas/tokens.ts
1000
- import { Schema as Schema11 } from "effect";
1040
+ import { Schema as Schema17 } from "effect";
1001
1041
  var MIN_TOKEN_NAME_LENGTH = 1;
1002
1042
  var MAX_TOKEN_NAME_LENGTH = 80;
1003
- var createTokenInput = Schema11.Struct({
1004
- name: Schema11.String.check(Schema11.isMinLength(MIN_TOKEN_NAME_LENGTH), Schema11.isMaxLength(MAX_TOKEN_NAME_LENGTH))
1043
+ var createTokenInput = Schema17.Struct({
1044
+ name: Schema17.String.check(Schema17.isMinLength(MIN_TOKEN_NAME_LENGTH), Schema17.isMaxLength(MAX_TOKEN_NAME_LENGTH))
1005
1045
  });
1006
- var revokeTokenInput = Schema11.Struct({
1046
+ var revokeTokenInput = Schema17.Struct({
1007
1047
  id: uuidV7
1008
1048
  });
1009
- var tokenMetadata = Schema11.Struct({
1049
+ var tokenMetadata = Schema17.Struct({
1010
1050
  id: uuidV7,
1011
- name: Schema11.String,
1012
- prefix: Schema11.String,
1051
+ name: Schema17.String,
1052
+ prefix: Schema17.String,
1013
1053
  createdAt: isoUtcString,
1014
- lastUsedAt: Schema11.NullOr(isoUtcString),
1015
- revokedAt: Schema11.NullOr(isoUtcString)
1054
+ lastUsedAt: Schema17.NullOr(isoUtcString),
1055
+ revokedAt: Schema17.NullOr(isoUtcString)
1016
1056
  });
1017
- var listTokensOutput = Schema11.Struct({
1018
- tokens: Schema11.Array(tokenMetadata)
1057
+ var listTokensOutput = Schema17.Struct({
1058
+ tokens: Schema17.Array(tokenMetadata)
1019
1059
  });
1020
- var createTokenOutput = Schema11.Struct({
1021
- token: Schema11.String,
1060
+ var createTokenOutput = Schema17.Struct({
1061
+ token: Schema17.String,
1022
1062
  metadata: tokenMetadata
1023
1063
  });
1024
- var revokeTokenOutput = Schema11.Struct({
1025
- ok: Schema11.Boolean
1064
+ var revokeTokenOutput = Schema17.Struct({
1065
+ ok: Schema17.Boolean
1026
1066
  });
1027
1067
 
1028
1068
  // ../../packages/api/src/rpc/tokens.ts
1029
1069
  var TokensRpcs = RpcGroup4.make(
1030
1070
  Rpc4.make("tokens.list", {
1031
1071
  success: listTokensOutput,
1032
- error: Schema12.Union([DatabaseError, UnauthorizedError])
1072
+ error: Schema18.Union([DatabaseError, UnauthorizedError])
1033
1073
  }),
1034
1074
  Rpc4.make("tokens.create", {
1035
1075
  payload: createTokenInput,
1036
1076
  success: createTokenOutput,
1037
- error: Schema12.Union([DatabaseError, UnauthorizedError])
1077
+ error: Schema18.Union([DatabaseError, UnauthorizedError])
1038
1078
  }),
1039
1079
  Rpc4.make("tokens.revoke", {
1040
1080
  payload: revokeTokenInput,
1041
1081
  success: revokeTokenOutput,
1042
- error: Schema12.Union([DatabaseError, NotFoundError, UnauthorizedError])
1082
+ error: Schema18.Union([DatabaseError, NotFoundError, UnauthorizedError])
1043
1083
  })
1044
1084
  );
1045
1085
 
@@ -1047,13 +1087,15 @@ var TokensRpcs = RpcGroup4.make(
1047
1087
  var WebRpcs = AuthRpcs.merge(StatsRpcs).merge(TokensRpcs).merge(DevicesRpcs);
1048
1088
 
1049
1089
  // ../../packages/api/src/rpc/sync.ts
1050
- import { Schema as Schema14 } from "effect";
1090
+ import { Schema as Schema20 } from "effect";
1051
1091
  import { Rpc as Rpc5, RpcGroup as RpcGroup5 } from "effect/unstable/rpc";
1052
1092
 
1053
1093
  // ../../packages/api/src/schemas/sync.ts
1054
- import { Effect as Effect5, Schema as Schema13 } from "effect";
1094
+ import { Effect as Effect5, Schema as Schema19 } from "effect";
1055
1095
  var MIN_DEVICE_NAME_LENGTH2 = 1;
1056
1096
  var MAX_DEVICE_NAME_LENGTH2 = 80;
1097
+ var MIN_CLI_VERSION_LENGTH = 1;
1098
+ var MAX_CLI_VERSION_LENGTH = 100;
1057
1099
  var MIN_MODEL_LENGTH = 1;
1058
1100
  var MAX_MODEL_LENGTH = 200;
1059
1101
  var SESSION_KEY_LENGTH = 64;
@@ -1066,27 +1108,34 @@ var MAX_REPLACEMENT_BATCHES = 1e4;
1066
1108
  var MAX_REPLACEMENT_FACTS = 1e5;
1067
1109
  var HARNESSES = ["codex", "claude_code", "pi", "hermes", "opencode"];
1068
1110
  var MAX_REPLACEMENT_HARNESSES = HARNESSES.length;
1069
- var harnessEnum = Schema13.Literals(HARNESSES);
1070
- var deviceNameSchema2 = Schema13.String.check(
1071
- Schema13.isMinLength(MIN_DEVICE_NAME_LENGTH2),
1072
- Schema13.isMaxLength(MAX_DEVICE_NAME_LENGTH2)
1111
+ var harnessEnum = Schema19.Literals(HARNESSES);
1112
+ var deviceNameSchema2 = Schema19.String.check(
1113
+ Schema19.isMinLength(MIN_DEVICE_NAME_LENGTH2),
1114
+ Schema19.isMaxLength(MAX_DEVICE_NAME_LENGTH2)
1115
+ );
1116
+ var cliVersionSchema = Schema19.String.check(
1117
+ Schema19.isMinLength(MIN_CLI_VERSION_LENGTH),
1118
+ Schema19.isMaxLength(MAX_CLI_VERSION_LENGTH)
1073
1119
  );
1074
- var getWatermarkInput = Schema13.Struct({
1120
+ var legacyCompatibleCliVersionSchema = Schema19.NullOr(cliVersionSchema).pipe(
1121
+ Schema19.withDecodingDefaultTypeKey(Effect5.succeed(null))
1122
+ );
1123
+ var getWatermarkInput = Schema19.Struct({
1075
1124
  device: deviceNameSchema2
1076
1125
  });
1077
- var getWatermarkOutput = Schema13.Struct({
1078
- watermarkHourUtc: Schema13.NullOr(isoUtcString),
1079
- sessionKeySalt: hex64.check(Schema13.isLengthBetween(SESSION_KEY_SALT_LENGTH, SESSION_KEY_SALT_LENGTH))
1126
+ var getWatermarkOutput = Schema19.Struct({
1127
+ watermarkHourUtc: Schema19.NullOr(isoUtcString),
1128
+ sessionKeySalt: hex64.check(Schema19.isLengthBetween(SESSION_KEY_SALT_LENGTH, SESSION_KEY_SALT_LENGTH))
1080
1129
  });
1081
1130
  function boundedInteger(max) {
1082
1131
  if (max === null) {
1083
1132
  return nonNegativeSafeInteger;
1084
1133
  }
1085
- return nonNegativeSafeInteger.check(Schema13.isLessThanOrEqualTo(max));
1134
+ return nonNegativeSafeInteger.check(Schema19.isLessThanOrEqualTo(max));
1086
1135
  }
1087
- var bucketInput = Schema13.Struct({
1136
+ var bucketInput = Schema19.Struct({
1088
1137
  harness: harnessEnum,
1089
- model: Schema13.String.check(Schema13.isMinLength(MIN_MODEL_LENGTH), Schema13.isMaxLength(MAX_MODEL_LENGTH)),
1138
+ model: Schema19.String.check(Schema19.isMinLength(MIN_MODEL_LENGTH), Schema19.isMaxLength(MAX_MODEL_LENGTH)),
1090
1139
  hourUtc: isoUtcString,
1091
1140
  inputTokens: boundedInteger(MAX_BUCKET_TOKEN_COUNT),
1092
1141
  outputTokens: boundedInteger(MAX_BUCKET_TOKEN_COUNT),
@@ -1094,49 +1143,51 @@ var bucketInput = Schema13.Struct({
1094
1143
  cacheCreateTokens: boundedInteger(MAX_BUCKET_TOKEN_COUNT),
1095
1144
  sessionCount: boundedInteger(MAX_BUCKET_SESSION_COUNT)
1096
1145
  });
1097
- var sessionInput = Schema13.Struct({
1146
+ var sessionInput = Schema19.Struct({
1098
1147
  harness: harnessEnum,
1099
- sessionKey: hex64.check(Schema13.isLengthBetween(SESSION_KEY_LENGTH, SESSION_KEY_LENGTH)),
1148
+ sessionKey: hex64.check(Schema19.isLengthBetween(SESSION_KEY_LENGTH, SESSION_KEY_LENGTH)),
1100
1149
  startedAt: isoUtcString,
1101
1150
  lastSeenAt: isoUtcString
1102
1151
  });
1103
- var upsertBucketsInput = Schema13.Struct({
1152
+ var upsertBucketsInput = Schema19.Struct({
1104
1153
  device: deviceNameSchema2,
1105
- buckets: Schema13.Array(bucketInput).check(Schema13.isMaxLength(MAX_BUCKETS_PER_SYNC)),
1106
- sessions: Schema13.Array(sessionInput).check(Schema13.isMaxLength(MAX_SESSIONS_PER_SYNC)).pipe(Schema13.withDecodingDefaultTypeKey(Effect5.succeed([])))
1154
+ cliVersion: legacyCompatibleCliVersionSchema,
1155
+ buckets: Schema19.Array(bucketInput).check(Schema19.isMaxLength(MAX_BUCKETS_PER_SYNC)),
1156
+ sessions: Schema19.Array(sessionInput).check(Schema19.isMaxLength(MAX_SESSIONS_PER_SYNC)).pipe(Schema19.withDecodingDefaultTypeKey(Effect5.succeed([])))
1107
1157
  });
1108
- var upsertBucketsOutput = Schema13.Struct({
1158
+ var upsertBucketsOutput = Schema19.Struct({
1109
1159
  upserted: boundedInteger(null),
1110
1160
  upsertedSessions: boundedInteger(null)
1111
1161
  });
1112
1162
  var replacementId = uuidV7;
1113
- var createUsageReplacementInput = Schema13.Struct({
1163
+ var createUsageReplacementInput = Schema19.Struct({
1114
1164
  device: deviceNameSchema2,
1165
+ cliVersion: legacyCompatibleCliVersionSchema,
1115
1166
  startHourUtc: isoUtcString,
1116
1167
  endHourUtc: isoUtcString,
1117
- harnesses: Schema13.Array(harnessEnum).check(Schema13.isMinLength(1), Schema13.isMaxLength(MAX_REPLACEMENT_HARNESSES))
1168
+ harnesses: Schema19.Array(harnessEnum).check(Schema19.isMinLength(1), Schema19.isMaxLength(MAX_REPLACEMENT_HARNESSES))
1118
1169
  });
1119
- var createUsageReplacementOutput = Schema13.Struct({
1170
+ var createUsageReplacementOutput = Schema19.Struct({
1120
1171
  replacementId,
1121
1172
  startHourUtc: isoUtcString,
1122
1173
  endHourUtc: isoUtcString,
1123
- harnesses: Schema13.Array(harnessEnum),
1174
+ harnesses: Schema19.Array(harnessEnum),
1124
1175
  expiresAt: isoUtcString
1125
1176
  });
1126
- var stageUsageReplacementBatchInput = Schema13.Struct({
1177
+ var stageUsageReplacementBatchInput = Schema19.Struct({
1127
1178
  device: deviceNameSchema2,
1128
1179
  replacementId,
1129
1180
  batchIndex: boundedInteger(MAX_REPLACEMENT_BATCHES),
1130
1181
  batchDigest: hex64,
1131
- buckets: Schema13.Array(bucketInput).check(Schema13.isMaxLength(MAX_BUCKETS_PER_SYNC)),
1132
- sessions: Schema13.Array(sessionInput).check(Schema13.isMaxLength(MAX_SESSIONS_PER_SYNC))
1182
+ buckets: Schema19.Array(bucketInput).check(Schema19.isMaxLength(MAX_BUCKETS_PER_SYNC)),
1183
+ sessions: Schema19.Array(sessionInput).check(Schema19.isMaxLength(MAX_SESSIONS_PER_SYNC))
1133
1184
  });
1134
- var stageUsageReplacementBatchOutput = Schema13.Struct({
1185
+ var stageUsageReplacementBatchOutput = Schema19.Struct({
1135
1186
  stagedBuckets: boundedInteger(MAX_BUCKETS_PER_SYNC),
1136
1187
  stagedSessions: boundedInteger(MAX_SESSIONS_PER_SYNC),
1137
- alreadyStaged: Schema13.Boolean
1188
+ alreadyStaged: Schema19.Boolean
1138
1189
  });
1139
- var finalizeUsageReplacementInput = Schema13.Struct({
1190
+ var finalizeUsageReplacementInput = Schema19.Struct({
1140
1191
  device: deviceNameSchema2,
1141
1192
  replacementId,
1142
1193
  expectedBatchCount: boundedInteger(MAX_REPLACEMENT_BATCHES),
@@ -1144,7 +1195,7 @@ var finalizeUsageReplacementInput = Schema13.Struct({
1144
1195
  expectedSessionCount: boundedInteger(MAX_REPLACEMENT_FACTS),
1145
1196
  digest: hex64
1146
1197
  });
1147
- var finalizeUsageReplacementOutput = Schema13.Struct({
1198
+ var finalizeUsageReplacementOutput = Schema19.Struct({
1148
1199
  replacementId,
1149
1200
  committedAt: isoUtcString,
1150
1201
  replacedBuckets: boundedInteger(MAX_REPLACEMENT_FACTS),
@@ -1153,7 +1204,7 @@ var finalizeUsageReplacementOutput = Schema13.Struct({
1153
1204
  });
1154
1205
 
1155
1206
  // ../../packages/api/src/rpc/sync.ts
1156
- var replacementErrors = Schema14.Union([
1207
+ var replacementErrors = Schema20.Union([
1157
1208
  ConflictError,
1158
1209
  DatabaseError,
1159
1210
  NotFoundError,
@@ -1166,12 +1217,12 @@ var SyncRpcs = RpcGroup5.make(
1166
1217
  Rpc5.make("sync.getWatermark", {
1167
1218
  payload: getWatermarkInput,
1168
1219
  success: getWatermarkOutput,
1169
- error: Schema14.Union([DatabaseError, UnauthorizedError])
1220
+ error: Schema20.Union([DatabaseError, UnauthorizedError])
1170
1221
  }),
1171
1222
  Rpc5.make("sync.upsertBuckets", {
1172
1223
  payload: upsertBucketsInput,
1173
1224
  success: upsertBucketsOutput,
1174
- error: Schema14.Union([DatabaseError, SyncQuotaExceededError, SyncTimestampRejectedError, UnauthorizedError])
1225
+ error: Schema20.Union([DatabaseError, SyncQuotaExceededError, SyncTimestampRejectedError, UnauthorizedError])
1175
1226
  }),
1176
1227
  Rpc5.make("sync.createUsageReplacement", {
1177
1228
  payload: createUsageReplacementInput,
@@ -1230,12 +1281,12 @@ import { Effect as Effect9, Stream as Stream4 } from "effect";
1230
1281
 
1231
1282
  // src/sync/aggregate.ts
1232
1283
  import { createHmac } from "crypto";
1233
- import { Effect as Effect6, Schema as Schema15, Stream as Stream2 } from "effect";
1284
+ import { Effect as Effect6, Schema as Schema21, Stream as Stream2 } from "effect";
1234
1285
  var UsageAggregationErrorFields = {
1235
- message: Schema15.String,
1236
- cause: Schema15.optionalKey(Schema15.Defect())
1286
+ message: Schema21.String,
1287
+ cause: Schema21.optionalKey(Schema21.Defect())
1237
1288
  };
1238
- var UsageAggregationError = class extends Schema15.TaggedErrorClass()(
1289
+ var UsageAggregationError = class extends Schema21.TaggedErrorClass()(
1239
1290
  "UsageAggregationError",
1240
1291
  UsageAggregationErrorFields
1241
1292
  ) {
@@ -1395,12 +1446,12 @@ function aggregateUsageStream(source, options) {
1395
1446
  }
1396
1447
 
1397
1448
  // src/sync/client.ts
1398
- import { Context as Context4, Effect as Effect7, Layer as Layer3 } from "effect";
1449
+ import { Context as Context6, Effect as Effect7, Layer as Layer3 } from "effect";
1399
1450
  import { FetchHttpClient, HttpClient, HttpClientRequest } from "effect/unstable/http";
1400
1451
  import { RpcClient, RpcSerialization } from "effect/unstable/rpc";
1401
1452
  var AUTHORIZATION_HEADER = "authorization";
1402
1453
  var SYNC_RPC_PATH = "/rpc/sync";
1403
- var SyncRpcClient = class extends Context4.Service()("@oopst/cli/SyncRpcClient") {
1454
+ var SyncRpcClient = class extends Context6.Service()("@oopst/cli/SyncRpcClient") {
1404
1455
  };
1405
1456
  function syncRpcClientFromPromiseClient(client) {
1406
1457
  const getWatermark = Effect7.fn("SyncRpcClient.fromPromise.getWatermark")(
@@ -1491,7 +1542,7 @@ function stripTrailingSlash(url) {
1491
1542
  }
1492
1543
 
1493
1544
  // src/sync/errors.ts
1494
- import { Schema as Schema16 } from "effect";
1545
+ import { Schema as Schema22 } from "effect";
1495
1546
  var SUCCESS_EXIT_CODE = 0;
1496
1547
  var ZERO_BUCKETS_EXIT_CODE = 1;
1497
1548
  var UNAUTHORIZED_EXIT_CODE = 2;
@@ -1514,10 +1565,10 @@ var EXIT = {
1514
1565
  invalidArguments: INVALID_ARGUMENTS_EXIT_CODE,
1515
1566
  generalFailure: GENERAL_FAILURE_EXIT_CODE
1516
1567
  };
1517
- var SyncError = class extends Schema16.TaggedErrorClass()("SyncError", {
1518
- message: Schema16.String,
1519
- exitCode: Schema16.Literals(EXIT_CODES),
1520
- cause: Schema16.optionalKey(Schema16.Defect())
1568
+ var SyncError = class extends Schema22.TaggedErrorClass()("SyncError", {
1569
+ message: Schema22.String,
1570
+ exitCode: Schema22.Literals(EXIT_CODES),
1571
+ cause: Schema22.optionalKey(Schema22.Defect())
1521
1572
  }) {
1522
1573
  constructor(exitCode, message, options = {}) {
1523
1574
  super(
@@ -1550,24 +1601,25 @@ function isNetworkError(err) {
1550
1601
  if (code && NETWORK_ERROR_CODES.includes(code)) {
1551
1602
  return true;
1552
1603
  }
1553
- const message = err.message ?? "";
1604
+ const candidateMessage = err.message;
1605
+ const message = typeof candidateMessage === "string" ? candidateMessage : "";
1554
1606
  return NETWORK_ERROR_PATTERN.test(message);
1555
1607
  }
1556
1608
 
1557
1609
  // src/sync/parser-collection.ts
1558
- import { Context as Context5, Effect as Effect8, Layer as Layer4, Schema as Schema17, Stream as Stream3 } from "effect";
1610
+ import { Context as Context7, Effect as Effect8, Layer as Layer4, Schema as Schema23, Stream as Stream3 } from "effect";
1559
1611
  var SCAN_PROGRESS_SESSION_STEP = 500;
1560
1612
  var ParserCollectionErrorFields = {
1561
- message: Schema17.String,
1562
- source: Schema17.String,
1563
- cause: Schema17.optionalKey(Schema17.Defect())
1613
+ message: Schema23.String,
1614
+ source: Schema23.String,
1615
+ cause: Schema23.optionalKey(Schema23.Defect())
1564
1616
  };
1565
- var ParserCollectionError = class extends Schema17.TaggedErrorClass()(
1617
+ var ParserCollectionError = class extends Schema23.TaggedErrorClass()(
1566
1618
  "ParserCollectionError",
1567
1619
  ParserCollectionErrorFields
1568
1620
  ) {
1569
1621
  };
1570
- var ParserCollection = class extends Context5.Service()(
1622
+ var ParserCollection = class extends Context7.Service()(
1571
1623
  "@oopst/cli/ParserCollection"
1572
1624
  ) {
1573
1625
  };
@@ -1744,6 +1796,7 @@ function runReplacementUsage(input) {
1744
1796
  uploadUsageReplacement({
1745
1797
  batches,
1746
1798
  client,
1799
+ cliVersion: options.cliVersion,
1747
1800
  color,
1748
1801
  device: options.device,
1749
1802
  logger: options.logger,
@@ -1791,6 +1844,7 @@ function uploadOrdinaryUsage(options, client, color, usageBatches) {
1791
1844
  uploadUsageBatchStream({
1792
1845
  batches: usageBatches,
1793
1846
  client,
1847
+ cliVersion: options.cliVersion,
1794
1848
  color,
1795
1849
  device: options.device,
1796
1850
  logger: options.logger
@@ -1986,6 +2040,7 @@ var uploadUsageBatchStream = Effect9.fn("RunSync.uploadUsageBatchStream")(
1986
2040
  );
1987
2041
  const result = yield* options.client.upsertBuckets({
1988
2042
  device: options.device,
2043
+ cliVersion: options.cliVersion,
1989
2044
  buckets: batch.buckets,
1990
2045
  sessions: batch.sessions
1991
2046
  });
@@ -2006,6 +2061,7 @@ var uploadUsageReplacement = Effect9.fn("RunSync.uploadUsageReplacement")(
2006
2061
  yield* logInfo2(options.logger, phase2("Creating atomic replacement scope...", options.color));
2007
2062
  const created = yield* options.client.createUsageReplacement({
2008
2063
  device: options.device,
2064
+ cliVersion: options.cliVersion,
2009
2065
  startHourUtc: options.replacement.startHourUtc,
2010
2066
  endHourUtc: options.replacement.endHourUtc,
2011
2067
  harnesses: options.replacement.harnesses
@@ -2120,7 +2176,7 @@ function uploadRequestText(value) {
2120
2176
  }
2121
2177
 
2122
2178
  // src/services/sync-program.ts
2123
- var SyncProgram = class extends Context6.Service()("@oopst/cli/SyncProgram") {
2179
+ var SyncProgram = class extends Context8.Service()("@oopst/cli/SyncProgram") {
2124
2180
  };
2125
2181
  var SyncProgramLive = Layer5.effect(
2126
2182
  SyncProgram,
@@ -2141,49 +2197,60 @@ function runSyncProgram2(options) {
2141
2197
  import { dirname, join as join3 } from "path";
2142
2198
  import { createInterface } from "readline/promises";
2143
2199
  import { NodeCrypto, NodeFileSystem as NodeFileSystem3 } from "@effect/platform-node";
2144
- import { Context as Context7, Crypto, Effect as Effect11, FileSystem as FileSystem4, Layer as Layer6, Schema as Schema18 } from "effect";
2145
- var CRON_START_MARKER = "# OopsT sync start";
2146
- var CRON_END_MARKER = "# OopsT sync end";
2147
- var DEFAULT_CRON_PATHS = ["/opt/homebrew/bin", "/usr/local/bin", "/usr/bin", "/bin", "/usr/sbin", "/sbin"];
2148
- var DEFAULT_PACKAGE_NAME = "@cookielab.io/oopst";
2149
- var CONFIG_FILE_MODE = 384;
2150
- var LINE_SPLIT_PATTERN = /\r?\n/u;
2151
- var SetupError = class extends Schema18.TaggedErrorClass()("SetupError", {
2152
- message: Schema18.String,
2153
- exitCode: Schema18.Number,
2154
- cause: Schema18.optionalKey(Schema18.Defect())
2155
- }) {
2156
- constructor(message, options = {}) {
2157
- const exitCode = options.exitCode ?? EXIT.generalFailure;
2158
- super(
2159
- options.cause === void 0 ? { message, exitCode } : { message, exitCode, cause: options.cause }
2160
- );
2161
- }
2162
- };
2163
- var SetupPromptService = class extends Context7.Service()(
2164
- "@oopst/cli/SetupPromptService"
2200
+ import { Crypto, Effect as Effect11, FileSystem as FileSystem4, Layer as Layer6, Schema as Schema24 } from "effect";
2201
+
2202
+ // src/services/setup-cron-services.ts
2203
+ import { Context as Context9 } from "effect";
2204
+ var SetupCronCommandService = class extends Context9.Service()(
2205
+ "@oopst/cli/SetupCronCommandService"
2165
2206
  ) {
2166
2207
  };
2167
- var SetupConfigFileService = class extends Context7.Service()(
2168
- "@oopst/cli/SetupConfigFileService"
2208
+ var SetupRandomService = class extends Context9.Service()(
2209
+ "@oopst/cli/SetupRandomService"
2169
2210
  ) {
2170
2211
  };
2171
- var SetupCronCommandService = class extends Context7.Service()(
2172
- "@oopst/cli/SetupCronCommandService"
2212
+
2213
+ // src/services/setup-prompt-services.ts
2214
+ import { Context as Context10 } from "effect";
2215
+ var SetupPromptService = class extends Context10.Service()(
2216
+ "@oopst/cli/SetupPromptService"
2173
2217
  ) {
2174
2218
  };
2175
- var SetupRandomService = class extends Context7.Service()(
2176
- "@oopst/cli/SetupRandomService"
2219
+ var SetupConfigFileService = class extends Context10.Service()(
2220
+ "@oopst/cli/SetupConfigFileService"
2177
2221
  ) {
2178
2222
  };
2179
- var SetupOutputService = class extends Context7.Service()(
2223
+
2224
+ // src/services/setup-runtime-services.ts
2225
+ import { Context as Context11 } from "effect";
2226
+ var SetupOutputService = class extends Context11.Service()(
2180
2227
  "@oopst/cli/SetupOutputService"
2181
2228
  ) {
2182
2229
  };
2183
- var SetupEnvironmentService = class extends Context7.Service()(
2230
+ var SetupEnvironmentService = class extends Context11.Service()(
2184
2231
  "@oopst/cli/SetupEnvironmentService"
2185
2232
  ) {
2186
2233
  };
2234
+
2235
+ // src/setup.ts
2236
+ var CRON_START_MARKER = "# OopsT sync start";
2237
+ var CRON_END_MARKER = "# OopsT sync end";
2238
+ var DEFAULT_CRON_PATHS = ["/opt/homebrew/bin", "/usr/local/bin", "/usr/bin", "/bin", "/usr/sbin", "/sbin"];
2239
+ var DEFAULT_PACKAGE_NAME = "@cookielab.io/oopst";
2240
+ var CONFIG_FILE_MODE = 384;
2241
+ var LINE_SPLIT_PATTERN = /\r?\n/u;
2242
+ var SetupError = class extends Schema24.TaggedErrorClass()("SetupError", {
2243
+ message: Schema24.String,
2244
+ exitCode: Schema24.Number,
2245
+ cause: Schema24.optionalKey(Schema24.Defect())
2246
+ }) {
2247
+ constructor(message, options = {}) {
2248
+ const exitCode = options.exitCode ?? EXIT.generalFailure;
2249
+ super(
2250
+ options.cause === void 0 ? { message, exitCode } : { message, exitCode, cause: options.cause }
2251
+ );
2252
+ }
2253
+ };
2187
2254
  function errorMessage3(cause) {
2188
2255
  return cause instanceof Error ? cause.message : String(cause);
2189
2256
  }
@@ -2373,7 +2440,11 @@ function commandFailureOptions(result) {
2373
2440
  return result.error === void 0 ? {} : { cause: result.error };
2374
2441
  }
2375
2442
  function commandFailureReason(result, fallback) {
2376
- return result.error?.message ?? result.stderr.trim() ?? fallback;
2443
+ if (result.error !== void 0) {
2444
+ return result.error.message;
2445
+ }
2446
+ const stderr2 = result.stderr.trim();
2447
+ return stderr2.length > 0 ? stderr2 : fallback;
2377
2448
  }
2378
2449
  function existingCrontabFromResult(result) {
2379
2450
  if (result.status === 0) {
@@ -2583,24 +2654,24 @@ import { Effect as Effect18, Stream as Stream11 } from "effect";
2583
2654
  // ../../packages/parsers/src/config.ts
2584
2655
  import { homedir as homedir2 } from "os";
2585
2656
  import { isAbsolute as isAbsolute2, join as join4 } from "path";
2586
- import process3 from "process";
2587
- import { Config as Config2, ConfigProvider as ConfigProvider2, Effect as Effect12, Schema as Schema19 } from "effect";
2588
- var runtimeEnv2 = process3["env"];
2589
- var RawParserEnvSchema = Schema19.Struct({
2657
+ import { env as processEnv2 } from "process";
2658
+ import { Config as Config2, ConfigProvider as ConfigProvider2, Effect as Effect12, Schema as Schema25 } from "effect";
2659
+ var runtimeEnv2 = processEnv2;
2660
+ var RawParserEnvSchema = Schema25.Struct({
2590
2661
  // biome-ignore lint/style/useNamingConvention: ENV vars are SCREAMING_SNAKE_CASE by convention
2591
- CLAUDE_CONFIG_DIR: Schema19.optional(Schema19.Trim),
2662
+ CLAUDE_CONFIG_DIR: Schema25.optional(Schema25.Trim),
2592
2663
  // biome-ignore lint/style/useNamingConvention: ENV vars are SCREAMING_SNAKE_CASE by convention
2593
- HERMES_CODING_AGENT_DIR: Schema19.optional(Schema19.Trim),
2664
+ HERMES_CODING_AGENT_DIR: Schema25.optional(Schema25.Trim),
2594
2665
  // biome-ignore lint/style/useNamingConvention: ENV vars are SCREAMING_SNAKE_CASE by convention
2595
- HERMES_CODING_AGENT_SESSION_DIR: Schema19.optional(Schema19.Trim),
2666
+ HERMES_CODING_AGENT_SESSION_DIR: Schema25.optional(Schema25.Trim),
2596
2667
  // biome-ignore lint/style/useNamingConvention: ENV vars are SCREAMING_SNAKE_CASE by convention
2597
- OPENCODE_DATA_DIR: Schema19.optional(Schema19.Trim),
2668
+ OPENCODE_DATA_DIR: Schema25.optional(Schema25.Trim),
2598
2669
  // biome-ignore lint/style/useNamingConvention: ENV vars are SCREAMING_SNAKE_CASE by convention
2599
- OPENCODE_DB: Schema19.optional(Schema19.Trim),
2670
+ OPENCODE_DB: Schema25.optional(Schema25.Trim),
2600
2671
  // biome-ignore lint/style/useNamingConvention: ENV vars are SCREAMING_SNAKE_CASE by convention
2601
- PI_CODING_AGENT_DIR: Schema19.optional(Schema19.Trim),
2672
+ PI_CODING_AGENT_DIR: Schema25.optional(Schema25.Trim),
2602
2673
  // biome-ignore lint/style/useNamingConvention: ENV vars are SCREAMING_SNAKE_CASE by convention
2603
- PI_CODING_AGENT_SESSION_DIR: Schema19.optional(Schema19.Trim)
2674
+ PI_CODING_AGENT_SESSION_DIR: Schema25.optional(Schema25.Trim)
2604
2675
  });
2605
2676
  var parserEnvConfig = Config2.schema(RawParserEnvSchema);
2606
2677
  var emptyToUndefined = (value) => value === void 0 || value.length === 0 ? void 0 : value;
@@ -2654,18 +2725,18 @@ function resolveOpenCodeRoot(config = loadParserConfig(), homeDir = readParserHo
2654
2725
  // ../../packages/parsers/src/effect/file-walker.ts
2655
2726
  import { join as join5 } from "path";
2656
2727
  import { NodeFileSystem as NodeFileSystem4 } from "@effect/platform-node";
2657
- import { Context as Context8, Effect as Effect13, FileSystem as FileSystem5, Layer as Layer7, Option as Option2, Schema as Schema20, Stream as Stream5 } from "effect";
2658
- var FileWalkerFilesystemError = class extends Schema20.TaggedErrorClass()(
2728
+ import { Context as Context12, Effect as Effect13, FileSystem as FileSystem5, Layer as Layer7, Option as Option2, Schema as Schema26, Stream as Stream5 } from "effect";
2729
+ var FileWalkerFilesystemError = class extends Schema26.TaggedErrorClass()(
2659
2730
  "FileWalkerFilesystemError",
2660
2731
  {
2661
- message: Schema20.String,
2662
- operation: Schema20.Literals(["readdir", "stat"]),
2663
- path: Schema20.String,
2664
- cause: Schema20.optionalKey(Schema20.Defect())
2732
+ message: Schema26.String,
2733
+ operation: Schema26.Literals(["readdir", "stat"]),
2734
+ path: Schema26.String,
2735
+ cause: Schema26.optionalKey(Schema26.Defect())
2665
2736
  }
2666
2737
  ) {
2667
2738
  };
2668
- var FileWalker = class extends Context8.Service()("@oopst/parsers/FileWalker") {
2739
+ var FileWalker = class extends Context12.Service()("@oopst/parsers/FileWalker") {
2669
2740
  };
2670
2741
  var toFileWalkerFilesystemError = (operation, path) => (error) => makeFileWalkerFilesystemError(operation, path, error);
2671
2742
  var makeFileWalkerFilesystemError = (operation, path, error) => new FileWalkerFilesystemError({
@@ -3211,11 +3282,11 @@ import { createInterface as createInterface2 } from "readline";
3211
3282
  import { Cause, Effect as Effect15, Queue, Stream as Stream8 } from "effect";
3212
3283
 
3213
3284
  // ../../packages/parsers/src/types.ts
3214
- import { Schema as Schema21, Stream as Stream7 } from "effect";
3215
- var ParserSourceReadError = class extends Schema21.TaggedErrorClass()("ParserSourceReadError", {
3216
- message: Schema21.String,
3217
- path: Schema21.String,
3218
- cause: Schema21.optionalKey(Schema21.Defect())
3285
+ import { Schema as Schema27, Stream as Stream7 } from "effect";
3286
+ var ParserSourceReadError = class extends Schema27.TaggedErrorClass()("ParserSourceReadError", {
3287
+ message: Schema27.String,
3288
+ path: Schema27.String,
3289
+ cause: Schema27.optionalKey(Schema27.Defect())
3219
3290
  }) {
3220
3291
  };
3221
3292
  var makeParserSourceReadError = (path, error) => new ParserSourceReadError({
@@ -4354,14 +4425,14 @@ function bucketizeIndexedCodexFilesStream(files, cutoff, logger, options) {
4354
4425
  }
4355
4426
 
4356
4427
  // ../../packages/parsers/src/effect/hermes-sqlite.ts
4357
- import { Context as Context9, Effect as Effect20, Layer as Layer8, Schema as Schema22 } from "effect";
4428
+ import { Context as Context13, Effect as Effect20, Layer as Layer8, Schema as Schema28 } from "effect";
4358
4429
  var NODE_SQLITE_SPECIFIER = ["node", "sqlite"].join(":");
4359
4430
  var MILLISECONDS_PER_SECOND = 1e3;
4360
- var HermesSqliteError = class extends Schema22.TaggedErrorClass()("HermesSqliteError", {
4361
- message: Schema22.String,
4362
- operation: Schema22.Literals(["close", "load", "open", "query", "schema"]),
4363
- path: Schema22.optionalKey(Schema22.String),
4364
- cause: Schema22.optionalKey(Schema22.Defect())
4431
+ var HermesSqliteError = class extends Schema28.TaggedErrorClass()("HermesSqliteError", {
4432
+ message: Schema28.String,
4433
+ operation: Schema28.Literals(["close", "load", "open", "query", "schema"]),
4434
+ path: Schema28.optionalKey(Schema28.String),
4435
+ cause: Schema28.optionalKey(Schema28.Defect())
4365
4436
  }) {
4366
4437
  };
4367
4438
  function unsupportedSchema(message) {
@@ -4370,7 +4441,7 @@ function unsupportedSchema(message) {
4370
4441
  function isUnsupportedSchema(value) {
4371
4442
  return typeof value === "object" && value !== null && "_tag" in value && value._tag === "UnsupportedHermesSchema";
4372
4443
  }
4373
- var HermesSqlite = class extends Context9.Service()("@oopst/parsers/HermesSqlite") {
4444
+ var HermesSqlite = class extends Context13.Service()("@oopst/parsers/HermesSqlite") {
4374
4445
  };
4375
4446
  var toHermesSqliteError = (operation, path) => (error) => new HermesSqliteError({
4376
4447
  message: `HermesSqlite.${operation} failed: ${error instanceof Error ? error.message : String(error)}`,
@@ -4510,9 +4581,15 @@ var HermesSqliteLive = Layer8.effect(
4510
4581
  // ../../packages/parsers/src/effect/opencode-io.ts
4511
4582
  import { basename as basename2, join as join6 } from "path";
4512
4583
  import { NodeFileSystem as NodeFileSystem5 } from "@effect/platform-node";
4513
- import { Context as Context10, Effect as Effect21, FileSystem as FileSystem6, Layer as Layer9, Option as Option3, Schema as Schema23, Stream as Stream13 } from "effect";
4584
+ import { Context as Context14, Effect as Effect21, FileSystem as FileSystem6, Layer as Layer9, Option as Option3, Schema as Schema29, Stream as Stream13 } from "effect";
4514
4585
  var NODE_SQLITE_SPECIFIER2 = ["node", "sqlite"].join(":");
4515
4586
  var OPENCODE_DB_FILE_PATTERN2 = /^opencode(?:-[^/]+)?\.db$/u;
4587
+ var MESSAGE_QUERY = `
4588
+ select session_id as "sessionId", time_created as "timeCreated", data
4589
+ from message
4590
+ where time_created >= ?
4591
+ order by time_created asc, id asc
4592
+ `;
4516
4593
  var SESSION_MESSAGE_QUERY = `
4517
4594
  select session_id as "sessionId", time_created as "timeCreated", data
4518
4595
  from session_message
@@ -4527,14 +4604,14 @@ var SESSION_PATH_QUERIES = [
4527
4604
  join project p on p.id = s.project_id
4528
4605
  where p.worktree is not null`
4529
4606
  ];
4530
- var OpenCodeIoError = class extends Schema23.TaggedErrorClass()("OpenCodeIoError", {
4531
- message: Schema23.String,
4532
- operation: Schema23.Literals(["stat", "readdir", "readFile", "parseJson", "load", "open", "query", "close"]),
4533
- path: Schema23.optionalKey(Schema23.String),
4534
- cause: Schema23.optionalKey(Schema23.Defect())
4607
+ var OpenCodeIoError = class extends Schema29.TaggedErrorClass()("OpenCodeIoError", {
4608
+ message: Schema29.String,
4609
+ operation: Schema29.Literals(["stat", "readdir", "readFile", "parseJson", "load", "open", "query", "close"]),
4610
+ path: Schema29.optionalKey(Schema29.String),
4611
+ cause: Schema29.optionalKey(Schema29.Defect())
4535
4612
  }) {
4536
4613
  };
4537
- var OpenCodeIo = class extends Context10.Service()("@oopst/parsers/OpenCodeIo") {
4614
+ var OpenCodeIo = class extends Context14.Service()("@oopst/parsers/OpenCodeIo") {
4538
4615
  };
4539
4616
  var toOpenCodeIoError = (operation, path) => (error) => new OpenCodeIoError({
4540
4617
  message: `OpenCodeIo.${operation} failed: ${error instanceof Error ? error.message : String(error)}`,
@@ -4679,14 +4756,38 @@ function readSessionPaths(db) {
4679
4756
  }
4680
4757
  return paths;
4681
4758
  }
4759
+ function queryMessageRows(db, sql, cutoff) {
4760
+ return db.prepare(sql).all(cutoff.getTime());
4761
+ }
4762
+ function isMissingTableError(error, table) {
4763
+ return error instanceof Error && error.message.includes(`no such table: ${table}`);
4764
+ }
4765
+ function readOpenCodeMessages(db, cutoff) {
4766
+ let messages;
4767
+ try {
4768
+ messages = queryMessageRows(db, MESSAGE_QUERY, cutoff);
4769
+ if (messages.length > 0) {
4770
+ return messages;
4771
+ }
4772
+ } catch (error) {
4773
+ if (!isMissingTableError(error, "message")) {
4774
+ throw error;
4775
+ }
4776
+ }
4777
+ try {
4778
+ return queryMessageRows(db, SESSION_MESSAGE_QUERY, cutoff);
4779
+ } catch (error) {
4780
+ if (messages !== void 0 && isMissingTableError(error, "session_message")) {
4781
+ return messages;
4782
+ }
4783
+ throw error;
4784
+ }
4785
+ }
4682
4786
  var querySqliteRows = (path, db, cutoff) => Effect21.try({
4683
- try: () => {
4684
- const statement = db.prepare(SESSION_MESSAGE_QUERY);
4685
- return {
4686
- sessionMessages: statement.all(cutoff.getTime()),
4687
- sessionPaths: readSessionPaths(db)
4688
- };
4689
- },
4787
+ try: () => ({
4788
+ sessionMessages: readOpenCodeMessages(db, cutoff),
4789
+ sessionPaths: readSessionPaths(db)
4790
+ }),
4690
4791
  catch: toOpenCodeIoError("query", path)
4691
4792
  });
4692
4793
  var readSqlite = Effect21.fn("OpenCodeIo.readSqlite")(function* (path, cutoff) {
@@ -5709,7 +5810,7 @@ function optionalValue(value) {
5709
5810
  return Option4.getOrUndefined(value);
5710
5811
  }
5711
5812
  function isEntrypoint() {
5712
- const [, argvPath] = process4.argv;
5813
+ const [, argvPath] = process2.argv;
5713
5814
  return argvPath ? realpathSync(fileURLToPath2(import.meta.url)) === realpathSync(argvPath) : false;
5714
5815
  }
5715
5816
  function parseHarnessFilter(value) {
@@ -5799,6 +5900,7 @@ function runSyncCommand(raw) {
5799
5900
  Effect27.gen(function* () {
5800
5901
  const configReader = yield* CliConfigReader;
5801
5902
  const console = yield* CliConsole;
5903
+ const metadata = yield* CliPackageMetadata;
5802
5904
  const env = yield* configReader.read();
5803
5905
  const config = yield* Effect27.try({
5804
5906
  try: () => resolveSyncConfig(
@@ -5839,6 +5941,7 @@ function runSyncCommand(raw) {
5839
5941
  };
5840
5942
  const result = yield* runSyncProgram2({
5841
5943
  token,
5944
+ cliVersion: metadata.version,
5842
5945
  device,
5843
5946
  serverUrl: config.serverUrl,
5844
5947
  lookbackDays: config.lookbackDays,