@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 +429 -326
- package/dist/index.js.map +1 -1
- package/package.json +8 -8
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
|
|
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
|
|
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 =
|
|
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
|
|
264
|
+
import process from "process";
|
|
265
265
|
import { fileURLToPath } from "url";
|
|
266
266
|
import { NodeFileSystem, NodeServices } from "@effect/platform-node";
|
|
267
|
-
import {
|
|
267
|
+
import { Effect as Effect2, FileSystem as FileSystem2, Layer, Stream } from "effect";
|
|
268
268
|
import { ChildProcess, ChildProcessSpawner } from "effect/unstable/process";
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
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
|
-
|
|
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
|
|
281
|
+
var CliCommandRunner = class extends Context2.Service()(
|
|
280
282
|
"@oopst/cli/CliCommandRunner"
|
|
281
283
|
) {
|
|
282
284
|
};
|
|
283
|
-
|
|
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
|
|
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:
|
|
344
|
-
stdout:
|
|
345
|
-
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: () =>
|
|
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
|
|
447
|
-
var ParserSources = class extends
|
|
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
|
|
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
|
-
|
|
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
|
|
556
|
+
var AppConfigError = class extends Schema4.TaggedErrorClass()("AppConfigError", InfrastructureErrorFields) {
|
|
545
557
|
};
|
|
546
|
-
var
|
|
558
|
+
var PricingRefreshError = class extends Schema4.TaggedErrorClass()(
|
|
559
|
+
"PricingRefreshError",
|
|
560
|
+
InfrastructureErrorFields
|
|
561
|
+
) {
|
|
547
562
|
};
|
|
548
|
-
|
|
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
|
|
570
|
+
var ExternalHttpError = class extends Schema5.TaggedErrorClass()(
|
|
551
571
|
"ExternalHttpError",
|
|
552
|
-
|
|
572
|
+
InfrastructureErrorFields2
|
|
553
573
|
) {
|
|
554
574
|
};
|
|
555
|
-
var DatabaseError = class extends
|
|
556
|
-
"DatabaseError",
|
|
557
|
-
InfrastructureErrorFields
|
|
558
|
-
) {
|
|
575
|
+
var DatabaseError = class extends Schema5.TaggedErrorClass()("DatabaseError", InfrastructureErrorFields2) {
|
|
559
576
|
};
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
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
|
|
566
|
-
|
|
567
|
-
|
|
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
|
|
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
|
-
|
|
609
|
+
InfrastructureErrorFields3
|
|
573
610
|
) {
|
|
574
611
|
};
|
|
575
|
-
var SyncQuotaExceededError = class extends
|
|
612
|
+
var SyncQuotaExceededError = class extends Schema8.TaggedErrorClass()(
|
|
576
613
|
"SyncQuotaExceededError",
|
|
577
|
-
|
|
614
|
+
ErrorFields4
|
|
578
615
|
) {
|
|
579
616
|
};
|
|
580
|
-
|
|
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
|
-
|
|
622
|
+
{ message: Schema9.String }
|
|
583
623
|
) {
|
|
584
624
|
};
|
|
585
625
|
|
|
586
626
|
// ../../packages/api/src/rpc/auth.ts
|
|
587
|
-
import { Context as
|
|
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
|
|
631
|
+
import { Schema as Schema10, SchemaGetter } from "effect";
|
|
592
632
|
var MAX_DISPLAY_NAME_LENGTH = 80;
|
|
593
|
-
var displayNameInput =
|
|
594
|
-
|
|
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 =
|
|
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
|
|
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 =
|
|
653
|
-
|
|
654
|
-
|
|
692
|
+
var nonEmptyTrimmedString = Schema11.String.check(
|
|
693
|
+
Schema11.isTrimmed(),
|
|
694
|
+
Schema11.isNonEmpty({ message: "Expected a non-empty string" })
|
|
655
695
|
);
|
|
656
|
-
var safeInteger =
|
|
657
|
-
|
|
658
|
-
|
|
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(
|
|
661
|
-
var isoUtcString =
|
|
662
|
-
|
|
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 =
|
|
665
|
-
|
|
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 =
|
|
668
|
-
|
|
707
|
+
var ianaTimezone = Schema11.String.check(
|
|
708
|
+
Schema11.makeFilter(isIanaTimezone, { expected: "an IANA timezone identifier" })
|
|
669
709
|
);
|
|
670
|
-
var uuidV7 =
|
|
671
|
-
var generalUuid =
|
|
672
|
-
var hex64 =
|
|
673
|
-
|
|
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 =
|
|
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 =
|
|
679
|
-
user:
|
|
680
|
-
id:
|
|
681
|
-
email:
|
|
682
|
-
displayName:
|
|
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 =
|
|
687
|
-
ok:
|
|
726
|
+
var LogoutResponse = Schema12.Struct({
|
|
727
|
+
ok: Schema12.Boolean
|
|
688
728
|
});
|
|
689
|
-
var WebRpcContext = class extends
|
|
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:
|
|
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:
|
|
743
|
+
error: Schema12.Union([DatabaseError, UnauthorizedError])
|
|
704
744
|
})
|
|
705
745
|
);
|
|
706
746
|
|
|
707
747
|
// ../../packages/api/src/rpc/devices.ts
|
|
708
|
-
import { Schema as
|
|
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
|
|
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 =
|
|
717
|
-
|
|
718
|
-
|
|
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 =
|
|
721
|
-
|
|
722
|
-
|
|
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 =
|
|
725
|
-
var renameDeviceInput =
|
|
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 =
|
|
769
|
+
var deleteDeviceInput = Schema13.Struct({
|
|
730
770
|
id: deviceIdSchema
|
|
731
771
|
});
|
|
732
|
-
var renameDeviceOutput =
|
|
772
|
+
var renameDeviceOutput = Schema13.Struct({
|
|
733
773
|
id: deviceIdSchema,
|
|
734
|
-
name:
|
|
774
|
+
name: Schema13.String,
|
|
735
775
|
lastSeen: isoUtcString
|
|
736
776
|
});
|
|
737
|
-
var deleteDeviceOutput =
|
|
738
|
-
ok:
|
|
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:
|
|
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:
|
|
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
|
|
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
|
|
761
|
-
var scopeEnum =
|
|
762
|
-
var costStackByValueEnum =
|
|
763
|
-
var costStackByEnum =
|
|
764
|
-
var usageDetailStackByEnum =
|
|
765
|
-
var stackByValueEnum =
|
|
766
|
-
var stackByEnum =
|
|
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(
|
|
824
|
+
var timeZoneSchema = ianaTimezone.check(Schema15.isMaxLength(MAX_TIME_ZONE_LENGTH));
|
|
785
825
|
var civilDateSchema = civilDate;
|
|
786
|
-
var daysSchema = safeInteger.check(
|
|
787
|
-
var leaderboardLimitSchema = safeInteger.check(
|
|
788
|
-
var defaultTimeZoneSchema = timeZoneSchema.pipe(
|
|
789
|
-
var uuidSchema =
|
|
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:
|
|
793
|
-
startDate:
|
|
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 =
|
|
873
|
+
var dailyCostInput = Schema15.Struct({
|
|
834
874
|
scope: scopeEnum,
|
|
835
875
|
stackBy: costStackByEnum,
|
|
836
876
|
...rangeFields,
|
|
837
877
|
timeZone: defaultTimeZoneSchema
|
|
838
|
-
}).check(
|
|
839
|
-
var dailyPointSchema =
|
|
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:
|
|
883
|
+
seriesName: Schema15.NullOr(Schema15.String),
|
|
844
884
|
/** USD; 0 or positive. */
|
|
845
|
-
usd:
|
|
885
|
+
usd: Schema15.Number
|
|
846
886
|
});
|
|
847
|
-
var dailyCostOutput =
|
|
848
|
-
var dailySessionsInput =
|
|
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(
|
|
854
|
-
var dailySessionsPointSchema =
|
|
893
|
+
}).check(Schema15.makeFilter(validateDateRange));
|
|
894
|
+
var dailySessionsPointSchema = Schema15.Struct({
|
|
855
895
|
date: civilDateSchema,
|
|
856
|
-
seriesName:
|
|
896
|
+
seriesName: Schema15.NullOr(Schema15.String),
|
|
857
897
|
sessions: nonNegativeSafeInteger
|
|
858
898
|
});
|
|
859
|
-
var dailySessionsOutput =
|
|
899
|
+
var dailySessionsOutput = Schema15.Array(dailySessionsPointSchema);
|
|
860
900
|
var weekdaySessionsInput = dailySessionsInput;
|
|
861
|
-
var weekdaySessionsPointSchema =
|
|
901
|
+
var weekdaySessionsPointSchema = Schema15.Struct({
|
|
862
902
|
/** Local ISO weekday for the requested stats timezone: 1=Monday, 7=Sunday. */
|
|
863
|
-
weekday: safeInteger.check(
|
|
864
|
-
seriesName:
|
|
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 =
|
|
907
|
+
var weekdaySessionsOutput = Schema15.Array(weekdaySessionsPointSchema);
|
|
868
908
|
var hourlySessionsInput = dailySessionsInput;
|
|
869
|
-
var hourlySessionsPointSchema =
|
|
909
|
+
var hourlySessionsPointSchema = Schema15.Struct({
|
|
870
910
|
/** Local hour of day for the requested stats timezone: 0-23. */
|
|
871
|
-
hour: safeInteger.check(
|
|
872
|
-
seriesName:
|
|
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 =
|
|
876
|
-
var summaryInput =
|
|
915
|
+
var hourlySessionsOutput = Schema15.Array(hourlySessionsPointSchema);
|
|
916
|
+
var summaryInput = Schema15.Struct({
|
|
877
917
|
...rangeFields,
|
|
878
918
|
scope: scopeEnum,
|
|
879
919
|
timeZone: defaultTimeZoneSchema
|
|
880
|
-
}).check(
|
|
881
|
-
var summaryOutput =
|
|
882
|
-
rangeUsd:
|
|
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:
|
|
925
|
+
totalUsd: Schema15.Number.check(Schema15.isGreaterThanOrEqualTo(0)),
|
|
886
926
|
totalSessions: nonNegativeSafeInteger
|
|
887
927
|
});
|
|
888
|
-
var deviceSummarySchema =
|
|
928
|
+
var deviceSummarySchema = Schema15.Struct({
|
|
889
929
|
id: uuidSchema,
|
|
890
|
-
name:
|
|
930
|
+
name: Schema15.String,
|
|
891
931
|
/** ISO-8601 UTC. */
|
|
892
932
|
lastSeen: isoUtcString
|
|
893
933
|
});
|
|
894
|
-
var devicesOutput =
|
|
895
|
-
var participantSyncSchema =
|
|
934
|
+
var devicesOutput = Schema15.Array(deviceSummarySchema);
|
|
935
|
+
var participantSyncSchema = Schema15.Struct({
|
|
896
936
|
userId: uuidSchema,
|
|
897
|
-
userLabel:
|
|
937
|
+
userLabel: Schema15.String,
|
|
898
938
|
/** ISO-8601 UTC, null when the participant has no synced devices yet. */
|
|
899
|
-
latestSyncAt:
|
|
939
|
+
latestSyncAt: Schema15.NullOr(isoUtcString)
|
|
900
940
|
});
|
|
901
|
-
var participantsOutput =
|
|
902
|
-
var leaderboardInput =
|
|
941
|
+
var participantsOutput = Schema15.Array(participantSyncSchema);
|
|
942
|
+
var leaderboardInput = Schema15.Struct({
|
|
903
943
|
...rangeFields,
|
|
904
944
|
limit: leaderboardLimitSchema,
|
|
905
945
|
timeZone: defaultTimeZoneSchema
|
|
906
|
-
}).check(
|
|
907
|
-
var leaderboardRowSchema =
|
|
908
|
-
rank: safeInteger.check(
|
|
946
|
+
}).check(Schema15.makeFilter(validateDateRange));
|
|
947
|
+
var leaderboardRowSchema = Schema15.Struct({
|
|
948
|
+
rank: safeInteger.check(Schema15.isGreaterThanOrEqualTo(1)),
|
|
909
949
|
userId: uuidSchema,
|
|
910
|
-
userLabel:
|
|
911
|
-
usd:
|
|
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 =
|
|
955
|
+
var leaderboardOutput = Schema15.Array(leaderboardRowSchema);
|
|
916
956
|
var topDimensionsInput = leaderboardInput;
|
|
917
|
-
var topDimensionRowSchema =
|
|
918
|
-
rank: safeInteger.check(
|
|
919
|
-
name:
|
|
920
|
-
usd:
|
|
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:
|
|
962
|
+
sessions: Schema15.NullOr(nonNegativeSafeInteger)
|
|
923
963
|
});
|
|
924
|
-
var topDimensionsOutput =
|
|
925
|
-
harnesses:
|
|
926
|
-
models:
|
|
964
|
+
var topDimensionsOutput = Schema15.Struct({
|
|
965
|
+
harnesses: Schema15.Array(topDimensionRowSchema),
|
|
966
|
+
models: Schema15.Array(topDimensionRowSchema)
|
|
927
967
|
});
|
|
928
|
-
var usageDetailsInput =
|
|
968
|
+
var usageDetailsInput = Schema15.Struct({
|
|
929
969
|
...rangeFields,
|
|
930
970
|
stackBy: usageDetailStackByEnum,
|
|
931
971
|
timeZone: defaultTimeZoneSchema
|
|
932
|
-
}).check(
|
|
933
|
-
var usageDetailsRowSchema =
|
|
934
|
-
id:
|
|
935
|
-
name:
|
|
972
|
+
}).check(Schema15.makeFilter(validateDateRange));
|
|
973
|
+
var usageDetailsRowSchema = Schema15.Struct({
|
|
974
|
+
id: Schema15.String,
|
|
975
|
+
name: Schema15.String,
|
|
936
976
|
tokens: nonNegativeSafeInteger,
|
|
937
|
-
sessions:
|
|
938
|
-
usd:
|
|
939
|
-
totalUsd:
|
|
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 =
|
|
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:
|
|
987
|
+
error: Schema16.Union([DatabaseError, UnauthorizedError])
|
|
948
988
|
}),
|
|
949
989
|
Rpc3.make("stats.participants", {
|
|
950
990
|
success: participantsOutput,
|
|
951
|
-
error:
|
|
991
|
+
error: Schema16.Union([DatabaseError, UnauthorizedError])
|
|
952
992
|
}),
|
|
953
993
|
Rpc3.make("stats.leaderboard", {
|
|
954
994
|
payload: leaderboardInput,
|
|
955
995
|
success: leaderboardOutput,
|
|
956
|
-
error:
|
|
996
|
+
error: Schema16.Union([DatabaseError, UnauthorizedError])
|
|
957
997
|
}),
|
|
958
998
|
Rpc3.make("stats.topDimensions", {
|
|
959
999
|
payload: topDimensionsInput,
|
|
960
1000
|
success: topDimensionsOutput,
|
|
961
|
-
error:
|
|
1001
|
+
error: Schema16.Union([DatabaseError, UnauthorizedError])
|
|
962
1002
|
}),
|
|
963
1003
|
Rpc3.make("stats.summary", {
|
|
964
1004
|
payload: summaryInput,
|
|
965
1005
|
success: summaryOutput,
|
|
966
|
-
error:
|
|
1006
|
+
error: Schema16.Union([DatabaseError, UnauthorizedError])
|
|
967
1007
|
}),
|
|
968
1008
|
Rpc3.make("stats.dailyCost", {
|
|
969
1009
|
payload: dailyCostInput,
|
|
970
1010
|
success: dailyCostOutput,
|
|
971
|
-
error:
|
|
1011
|
+
error: Schema16.Union([DatabaseError, UnauthorizedError])
|
|
972
1012
|
}),
|
|
973
1013
|
Rpc3.make("stats.dailySessions", {
|
|
974
1014
|
payload: dailySessionsInput,
|
|
975
1015
|
success: dailySessionsOutput,
|
|
976
|
-
error:
|
|
1016
|
+
error: Schema16.Union([DatabaseError, UnauthorizedError])
|
|
977
1017
|
}),
|
|
978
1018
|
Rpc3.make("stats.weekdaySessions", {
|
|
979
1019
|
payload: weekdaySessionsInput,
|
|
980
1020
|
success: weekdaySessionsOutput,
|
|
981
|
-
error:
|
|
1021
|
+
error: Schema16.Union([DatabaseError, UnauthorizedError])
|
|
982
1022
|
}),
|
|
983
1023
|
Rpc3.make("stats.hourlySessions", {
|
|
984
1024
|
payload: hourlySessionsInput,
|
|
985
1025
|
success: hourlySessionsOutput,
|
|
986
|
-
error:
|
|
1026
|
+
error: Schema16.Union([DatabaseError, UnauthorizedError])
|
|
987
1027
|
}),
|
|
988
1028
|
Rpc3.make("stats.usageDetails", {
|
|
989
1029
|
payload: usageDetailsInput,
|
|
990
1030
|
success: usageDetailsOutput,
|
|
991
|
-
error:
|
|
1031
|
+
error: Schema16.Union([DatabaseError, UnauthorizedError])
|
|
992
1032
|
})
|
|
993
1033
|
);
|
|
994
1034
|
|
|
995
1035
|
// ../../packages/api/src/rpc/tokens.ts
|
|
996
|
-
import { Schema as
|
|
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
|
|
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 =
|
|
1004
|
-
name:
|
|
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 =
|
|
1046
|
+
var revokeTokenInput = Schema17.Struct({
|
|
1007
1047
|
id: uuidV7
|
|
1008
1048
|
});
|
|
1009
|
-
var tokenMetadata =
|
|
1049
|
+
var tokenMetadata = Schema17.Struct({
|
|
1010
1050
|
id: uuidV7,
|
|
1011
|
-
name:
|
|
1012
|
-
prefix:
|
|
1051
|
+
name: Schema17.String,
|
|
1052
|
+
prefix: Schema17.String,
|
|
1013
1053
|
createdAt: isoUtcString,
|
|
1014
|
-
lastUsedAt:
|
|
1015
|
-
revokedAt:
|
|
1054
|
+
lastUsedAt: Schema17.NullOr(isoUtcString),
|
|
1055
|
+
revokedAt: Schema17.NullOr(isoUtcString)
|
|
1016
1056
|
});
|
|
1017
|
-
var listTokensOutput =
|
|
1018
|
-
tokens:
|
|
1057
|
+
var listTokensOutput = Schema17.Struct({
|
|
1058
|
+
tokens: Schema17.Array(tokenMetadata)
|
|
1019
1059
|
});
|
|
1020
|
-
var createTokenOutput =
|
|
1021
|
-
token:
|
|
1060
|
+
var createTokenOutput = Schema17.Struct({
|
|
1061
|
+
token: Schema17.String,
|
|
1022
1062
|
metadata: tokenMetadata
|
|
1023
1063
|
});
|
|
1024
|
-
var revokeTokenOutput =
|
|
1025
|
-
ok:
|
|
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:
|
|
1072
|
+
error: Schema18.Union([DatabaseError, UnauthorizedError])
|
|
1033
1073
|
}),
|
|
1034
1074
|
Rpc4.make("tokens.create", {
|
|
1035
1075
|
payload: createTokenInput,
|
|
1036
1076
|
success: createTokenOutput,
|
|
1037
|
-
error:
|
|
1077
|
+
error: Schema18.Union([DatabaseError, UnauthorizedError])
|
|
1038
1078
|
}),
|
|
1039
1079
|
Rpc4.make("tokens.revoke", {
|
|
1040
1080
|
payload: revokeTokenInput,
|
|
1041
1081
|
success: revokeTokenOutput,
|
|
1042
|
-
error:
|
|
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
|
|
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
|
|
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 =
|
|
1070
|
-
var deviceNameSchema2 =
|
|
1071
|
-
|
|
1072
|
-
|
|
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
|
|
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 =
|
|
1078
|
-
watermarkHourUtc:
|
|
1079
|
-
sessionKeySalt: hex64.check(
|
|
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(
|
|
1134
|
+
return nonNegativeSafeInteger.check(Schema19.isLessThanOrEqualTo(max));
|
|
1086
1135
|
}
|
|
1087
|
-
var bucketInput =
|
|
1136
|
+
var bucketInput = Schema19.Struct({
|
|
1088
1137
|
harness: harnessEnum,
|
|
1089
|
-
model:
|
|
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 =
|
|
1146
|
+
var sessionInput = Schema19.Struct({
|
|
1098
1147
|
harness: harnessEnum,
|
|
1099
|
-
sessionKey: hex64.check(
|
|
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 =
|
|
1152
|
+
var upsertBucketsInput = Schema19.Struct({
|
|
1104
1153
|
device: deviceNameSchema2,
|
|
1105
|
-
|
|
1106
|
-
|
|
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 =
|
|
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 =
|
|
1163
|
+
var createUsageReplacementInput = Schema19.Struct({
|
|
1114
1164
|
device: deviceNameSchema2,
|
|
1165
|
+
cliVersion: legacyCompatibleCliVersionSchema,
|
|
1115
1166
|
startHourUtc: isoUtcString,
|
|
1116
1167
|
endHourUtc: isoUtcString,
|
|
1117
|
-
harnesses:
|
|
1168
|
+
harnesses: Schema19.Array(harnessEnum).check(Schema19.isMinLength(1), Schema19.isMaxLength(MAX_REPLACEMENT_HARNESSES))
|
|
1118
1169
|
});
|
|
1119
|
-
var createUsageReplacementOutput =
|
|
1170
|
+
var createUsageReplacementOutput = Schema19.Struct({
|
|
1120
1171
|
replacementId,
|
|
1121
1172
|
startHourUtc: isoUtcString,
|
|
1122
1173
|
endHourUtc: isoUtcString,
|
|
1123
|
-
harnesses:
|
|
1174
|
+
harnesses: Schema19.Array(harnessEnum),
|
|
1124
1175
|
expiresAt: isoUtcString
|
|
1125
1176
|
});
|
|
1126
|
-
var stageUsageReplacementBatchInput =
|
|
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:
|
|
1132
|
-
sessions:
|
|
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 =
|
|
1185
|
+
var stageUsageReplacementBatchOutput = Schema19.Struct({
|
|
1135
1186
|
stagedBuckets: boundedInteger(MAX_BUCKETS_PER_SYNC),
|
|
1136
1187
|
stagedSessions: boundedInteger(MAX_SESSIONS_PER_SYNC),
|
|
1137
|
-
alreadyStaged:
|
|
1188
|
+
alreadyStaged: Schema19.Boolean
|
|
1138
1189
|
});
|
|
1139
|
-
var finalizeUsageReplacementInput =
|
|
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 =
|
|
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 =
|
|
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:
|
|
1220
|
+
error: Schema20.Union([DatabaseError, UnauthorizedError])
|
|
1170
1221
|
}),
|
|
1171
1222
|
Rpc5.make("sync.upsertBuckets", {
|
|
1172
1223
|
payload: upsertBucketsInput,
|
|
1173
1224
|
success: upsertBucketsOutput,
|
|
1174
|
-
error:
|
|
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
|
|
1284
|
+
import { Effect as Effect6, Schema as Schema21, Stream as Stream2 } from "effect";
|
|
1234
1285
|
var UsageAggregationErrorFields = {
|
|
1235
|
-
message:
|
|
1236
|
-
cause:
|
|
1286
|
+
message: Schema21.String,
|
|
1287
|
+
cause: Schema21.optionalKey(Schema21.Defect())
|
|
1237
1288
|
};
|
|
1238
|
-
var UsageAggregationError = class extends
|
|
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
|
|
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
|
|
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
|
|
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
|
|
1518
|
-
message:
|
|
1519
|
-
exitCode:
|
|
1520
|
-
cause:
|
|
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
|
|
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
|
|
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:
|
|
1562
|
-
source:
|
|
1563
|
-
cause:
|
|
1613
|
+
message: Schema23.String,
|
|
1614
|
+
source: Schema23.String,
|
|
1615
|
+
cause: Schema23.optionalKey(Schema23.Defect())
|
|
1564
1616
|
};
|
|
1565
|
-
var ParserCollectionError = class extends
|
|
1617
|
+
var ParserCollectionError = class extends Schema23.TaggedErrorClass()(
|
|
1566
1618
|
"ParserCollectionError",
|
|
1567
1619
|
ParserCollectionErrorFields
|
|
1568
1620
|
) {
|
|
1569
1621
|
};
|
|
1570
|
-
var ParserCollection = class extends
|
|
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
|
|
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 {
|
|
2145
|
-
|
|
2146
|
-
|
|
2147
|
-
|
|
2148
|
-
var
|
|
2149
|
-
|
|
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
|
|
2168
|
-
"@oopst/cli/
|
|
2208
|
+
var SetupRandomService = class extends Context9.Service()(
|
|
2209
|
+
"@oopst/cli/SetupRandomService"
|
|
2169
2210
|
) {
|
|
2170
2211
|
};
|
|
2171
|
-
|
|
2172
|
-
|
|
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
|
|
2176
|
-
"@oopst/cli/
|
|
2219
|
+
var SetupConfigFileService = class extends Context10.Service()(
|
|
2220
|
+
"@oopst/cli/SetupConfigFileService"
|
|
2177
2221
|
) {
|
|
2178
2222
|
};
|
|
2179
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
2587
|
-
import { Config as Config2, ConfigProvider as ConfigProvider2, Effect as Effect12, Schema as
|
|
2588
|
-
var runtimeEnv2 =
|
|
2589
|
-
var RawParserEnvSchema =
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
|
2658
|
-
var FileWalkerFilesystemError = class extends
|
|
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:
|
|
2662
|
-
operation:
|
|
2663
|
-
path:
|
|
2664
|
-
cause:
|
|
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
|
|
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
|
|
3215
|
-
var ParserSourceReadError = class extends
|
|
3216
|
-
message:
|
|
3217
|
-
path:
|
|
3218
|
-
cause:
|
|
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
|
|
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
|
|
4361
|
-
message:
|
|
4362
|
-
operation:
|
|
4363
|
-
path:
|
|
4364
|
-
cause:
|
|
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
|
|
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
|
|
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
|
|
4531
|
-
message:
|
|
4532
|
-
operation:
|
|
4533
|
-
path:
|
|
4534
|
-
cause:
|
|
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
|
|
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
|
-
|
|
4685
|
-
|
|
4686
|
-
|
|
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] =
|
|
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,
|