@codeworksh/plugin 0.3.0-canary.82.1.g33702b61 → 0.3.0-canary.84.1.gce0dac2c

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.
@@ -1,6 +1,6 @@
1
1
  import { Schema } from "effect";
2
2
  declare namespace event_d_exports {
3
- export { AikitAssistantMessage, AikitToolCallTerminalPart, Data, Definition, event_d_exports as EventSchema, ID, Payload, PublishOptions, define, durable, inventory, latest, versionedType };
3
+ export { AikitAssistantMessage, AikitAssistantPart, AikitToolCallTerminalPart, Data, Definition, event_d_exports as EventSchema, ID, Payload, PublishOptions, define, durable, inventory, latest, versionedType };
4
4
  }
5
5
  /**
6
6
  * Effect Schema adapter for aikit's TypeBox assistant message. Durable LLM
@@ -149,25 +149,12 @@ declare const AikitAssistantMessage: Schema.decodeTo<Schema.declare<{
149
149
  completed: number;
150
150
  };
151
151
  parts: ({
152
- type: "text";
153
- text: string;
154
- textSignature?: string;
155
- } | {
156
- type: "image";
157
- data: string;
158
- mimeType: string;
159
- } | {
160
- type: "thinking";
161
- thinking: string;
162
- thinkingSignature?: string;
163
- redacted?: boolean;
164
- } | {
165
152
  arguments: Record<string, any>;
166
153
  callID: string;
167
154
  name: string;
168
155
  namespace?: string;
169
- partial?: {
170
- content?: ({
156
+ result: {
157
+ content: ({
171
158
  type: "text";
172
159
  text: string;
173
160
  textSignature?: string;
@@ -177,8 +164,9 @@ declare const AikitAssistantMessage: Schema.decodeTo<Schema.declare<{
177
164
  mimeType: string;
178
165
  })[];
179
166
  details?: any;
167
+ isError: false;
180
168
  };
181
- status: "running";
169
+ status: "completed";
182
170
  thoughtSignature?: string;
183
171
  time: {
184
172
  start: number;
@@ -201,9 +189,9 @@ declare const AikitAssistantMessage: Schema.decodeTo<Schema.declare<{
201
189
  mimeType: string;
202
190
  })[];
203
191
  details?: any;
204
- isError: false;
192
+ isError: true;
205
193
  };
206
- status: "completed";
194
+ status: "error";
207
195
  thoughtSignature?: string;
208
196
  time: {
209
197
  start: number;
@@ -228,7 +216,7 @@ declare const AikitAssistantMessage: Schema.decodeTo<Schema.declare<{
228
216
  details?: any;
229
217
  isError: true;
230
218
  };
231
- status: "error";
219
+ status: "skipped";
232
220
  thoughtSignature?: string;
233
221
  time: {
234
222
  start: number;
@@ -253,20 +241,33 @@ declare const AikitAssistantMessage: Schema.decodeTo<Schema.declare<{
253
241
  details?: any;
254
242
  isError: true;
255
243
  };
256
- status: "skipped";
244
+ status: "aborted";
257
245
  thoughtSignature?: string;
258
246
  time: {
259
247
  start: number;
260
248
  end: number;
261
249
  };
262
250
  type: "toolCall";
251
+ } | {
252
+ type: "text";
253
+ text: string;
254
+ textSignature?: string;
255
+ } | {
256
+ type: "image";
257
+ data: string;
258
+ mimeType: string;
259
+ } | {
260
+ type: "thinking";
261
+ thinking: string;
262
+ thinkingSignature?: string;
263
+ redacted?: boolean;
263
264
  } | {
264
265
  arguments: Record<string, any>;
265
266
  callID: string;
266
267
  name: string;
267
268
  namespace?: string;
268
- result: {
269
- content: ({
269
+ partial?: {
270
+ content?: ({
270
271
  type: "text";
271
272
  text: string;
272
273
  textSignature?: string;
@@ -276,9 +277,8 @@ declare const AikitAssistantMessage: Schema.decodeTo<Schema.declare<{
276
277
  mimeType: string;
277
278
  })[];
278
279
  details?: any;
279
- isError: true;
280
280
  };
281
- status: "aborted";
281
+ status: "running";
282
282
  thoughtSignature?: string;
283
283
  time: {
284
284
  start: number;
@@ -445,25 +445,12 @@ declare const AikitAssistantMessage: Schema.decodeTo<Schema.declare<{
445
445
  completed: number;
446
446
  };
447
447
  parts: ({
448
- type: "text";
449
- text: string;
450
- textSignature?: string;
451
- } | {
452
- type: "image";
453
- data: string;
454
- mimeType: string;
455
- } | {
456
- type: "thinking";
457
- thinking: string;
458
- thinkingSignature?: string;
459
- redacted?: boolean;
460
- } | {
461
448
  arguments: Record<string, any>;
462
449
  callID: string;
463
450
  name: string;
464
451
  namespace?: string;
465
- partial?: {
466
- content?: ({
452
+ result: {
453
+ content: ({
467
454
  type: "text";
468
455
  text: string;
469
456
  textSignature?: string;
@@ -473,8 +460,9 @@ declare const AikitAssistantMessage: Schema.decodeTo<Schema.declare<{
473
460
  mimeType: string;
474
461
  })[];
475
462
  details?: any;
463
+ isError: false;
476
464
  };
477
- status: "running";
465
+ status: "completed";
478
466
  thoughtSignature?: string;
479
467
  time: {
480
468
  start: number;
@@ -497,9 +485,9 @@ declare const AikitAssistantMessage: Schema.decodeTo<Schema.declare<{
497
485
  mimeType: string;
498
486
  })[];
499
487
  details?: any;
500
- isError: false;
488
+ isError: true;
501
489
  };
502
- status: "completed";
490
+ status: "error";
503
491
  thoughtSignature?: string;
504
492
  time: {
505
493
  start: number;
@@ -524,7 +512,7 @@ declare const AikitAssistantMessage: Schema.decodeTo<Schema.declare<{
524
512
  details?: any;
525
513
  isError: true;
526
514
  };
527
- status: "error";
515
+ status: "skipped";
528
516
  thoughtSignature?: string;
529
517
  time: {
530
518
  start: number;
@@ -549,20 +537,33 @@ declare const AikitAssistantMessage: Schema.decodeTo<Schema.declare<{
549
537
  details?: any;
550
538
  isError: true;
551
539
  };
552
- status: "skipped";
540
+ status: "aborted";
553
541
  thoughtSignature?: string;
554
542
  time: {
555
543
  start: number;
556
544
  end: number;
557
545
  };
558
546
  type: "toolCall";
547
+ } | {
548
+ type: "text";
549
+ text: string;
550
+ textSignature?: string;
551
+ } | {
552
+ type: "image";
553
+ data: string;
554
+ mimeType: string;
555
+ } | {
556
+ type: "thinking";
557
+ thinking: string;
558
+ thinkingSignature?: string;
559
+ redacted?: boolean;
559
560
  } | {
560
561
  arguments: Record<string, any>;
561
562
  callID: string;
562
563
  name: string;
563
564
  namespace?: string;
564
- result: {
565
- content: ({
565
+ partial?: {
566
+ content?: ({
566
567
  type: "text";
567
568
  text: string;
568
569
  textSignature?: string;
@@ -572,9 +573,8 @@ declare const AikitAssistantMessage: Schema.decodeTo<Schema.declare<{
572
573
  mimeType: string;
573
574
  })[];
574
575
  details?: any;
575
- isError: true;
576
576
  };
577
- status: "aborted";
577
+ status: "running";
578
578
  thoughtSignature?: string;
579
579
  time: {
580
580
  start: number;
@@ -600,6 +600,309 @@ declare const AikitAssistantMessage: Schema.decodeTo<Schema.declare<{
600
600
  messageId: string;
601
601
  }>, Schema.Unknown, never, never>;
602
602
  type AikitAssistantMessage = typeof AikitAssistantMessage.Type;
603
+ /** One part of an aikit assistant message, streaming-only fields stripped like {@link AikitAssistantMessage}. */
604
+ declare const AikitAssistantPart: Schema.decodeTo<Schema.declare<{
605
+ arguments: Record<string, any>;
606
+ callID: string;
607
+ name: string;
608
+ namespace?: string;
609
+ result: {
610
+ content: ({
611
+ type: "text";
612
+ text: string;
613
+ textSignature?: string;
614
+ } | {
615
+ type: "image";
616
+ data: string;
617
+ mimeType: string;
618
+ })[];
619
+ details?: any;
620
+ isError: false;
621
+ };
622
+ status: "completed";
623
+ thoughtSignature?: string;
624
+ time: {
625
+ start: number;
626
+ end: number;
627
+ };
628
+ type: "toolCall";
629
+ } | {
630
+ arguments: Record<string, any>;
631
+ callID: string;
632
+ name: string;
633
+ namespace?: string;
634
+ result: {
635
+ content: ({
636
+ type: "text";
637
+ text: string;
638
+ textSignature?: string;
639
+ } | {
640
+ type: "image";
641
+ data: string;
642
+ mimeType: string;
643
+ })[];
644
+ details?: any;
645
+ isError: true;
646
+ };
647
+ status: "error";
648
+ thoughtSignature?: string;
649
+ time: {
650
+ start: number;
651
+ end: number;
652
+ };
653
+ type: "toolCall";
654
+ } | {
655
+ arguments: Record<string, any>;
656
+ callID: string;
657
+ name: string;
658
+ namespace?: string;
659
+ result: {
660
+ content: ({
661
+ type: "text";
662
+ text: string;
663
+ textSignature?: string;
664
+ } | {
665
+ type: "image";
666
+ data: string;
667
+ mimeType: string;
668
+ })[];
669
+ details?: any;
670
+ isError: true;
671
+ };
672
+ status: "skipped";
673
+ thoughtSignature?: string;
674
+ time: {
675
+ start: number;
676
+ end: number;
677
+ };
678
+ type: "toolCall";
679
+ } | {
680
+ arguments: Record<string, any>;
681
+ callID: string;
682
+ name: string;
683
+ namespace?: string;
684
+ result: {
685
+ content: ({
686
+ type: "text";
687
+ text: string;
688
+ textSignature?: string;
689
+ } | {
690
+ type: "image";
691
+ data: string;
692
+ mimeType: string;
693
+ })[];
694
+ details?: any;
695
+ isError: true;
696
+ };
697
+ status: "aborted";
698
+ thoughtSignature?: string;
699
+ time: {
700
+ start: number;
701
+ end: number;
702
+ };
703
+ type: "toolCall";
704
+ } | {
705
+ type: "text";
706
+ text: string;
707
+ textSignature?: string;
708
+ } | {
709
+ type: "image";
710
+ data: string;
711
+ mimeType: string;
712
+ } | {
713
+ type: "thinking";
714
+ thinking: string;
715
+ thinkingSignature?: string;
716
+ redacted?: boolean;
717
+ } | {
718
+ arguments: Record<string, any>;
719
+ callID: string;
720
+ name: string;
721
+ namespace?: string;
722
+ partial?: {
723
+ content?: ({
724
+ type: "text";
725
+ text: string;
726
+ textSignature?: string;
727
+ } | {
728
+ type: "image";
729
+ data: string;
730
+ mimeType: string;
731
+ })[];
732
+ details?: any;
733
+ };
734
+ status: "running";
735
+ thoughtSignature?: string;
736
+ time: {
737
+ start: number;
738
+ end: number;
739
+ };
740
+ type: "toolCall";
741
+ } | ({
742
+ type: "toolCall";
743
+ callID: string;
744
+ name: string;
745
+ arguments: Record<string, any>;
746
+ thoughtSignature?: string;
747
+ namespace?: string;
748
+ time: {
749
+ start: number;
750
+ end: number;
751
+ };
752
+ } & {
753
+ status: "pending";
754
+ }), {
755
+ arguments: Record<string, any>;
756
+ callID: string;
757
+ name: string;
758
+ namespace?: string;
759
+ result: {
760
+ content: ({
761
+ type: "text";
762
+ text: string;
763
+ textSignature?: string;
764
+ } | {
765
+ type: "image";
766
+ data: string;
767
+ mimeType: string;
768
+ })[];
769
+ details?: any;
770
+ isError: false;
771
+ };
772
+ status: "completed";
773
+ thoughtSignature?: string;
774
+ time: {
775
+ start: number;
776
+ end: number;
777
+ };
778
+ type: "toolCall";
779
+ } | {
780
+ arguments: Record<string, any>;
781
+ callID: string;
782
+ name: string;
783
+ namespace?: string;
784
+ result: {
785
+ content: ({
786
+ type: "text";
787
+ text: string;
788
+ textSignature?: string;
789
+ } | {
790
+ type: "image";
791
+ data: string;
792
+ mimeType: string;
793
+ })[];
794
+ details?: any;
795
+ isError: true;
796
+ };
797
+ status: "error";
798
+ thoughtSignature?: string;
799
+ time: {
800
+ start: number;
801
+ end: number;
802
+ };
803
+ type: "toolCall";
804
+ } | {
805
+ arguments: Record<string, any>;
806
+ callID: string;
807
+ name: string;
808
+ namespace?: string;
809
+ result: {
810
+ content: ({
811
+ type: "text";
812
+ text: string;
813
+ textSignature?: string;
814
+ } | {
815
+ type: "image";
816
+ data: string;
817
+ mimeType: string;
818
+ })[];
819
+ details?: any;
820
+ isError: true;
821
+ };
822
+ status: "skipped";
823
+ thoughtSignature?: string;
824
+ time: {
825
+ start: number;
826
+ end: number;
827
+ };
828
+ type: "toolCall";
829
+ } | {
830
+ arguments: Record<string, any>;
831
+ callID: string;
832
+ name: string;
833
+ namespace?: string;
834
+ result: {
835
+ content: ({
836
+ type: "text";
837
+ text: string;
838
+ textSignature?: string;
839
+ } | {
840
+ type: "image";
841
+ data: string;
842
+ mimeType: string;
843
+ })[];
844
+ details?: any;
845
+ isError: true;
846
+ };
847
+ status: "aborted";
848
+ thoughtSignature?: string;
849
+ time: {
850
+ start: number;
851
+ end: number;
852
+ };
853
+ type: "toolCall";
854
+ } | {
855
+ type: "text";
856
+ text: string;
857
+ textSignature?: string;
858
+ } | {
859
+ type: "image";
860
+ data: string;
861
+ mimeType: string;
862
+ } | {
863
+ type: "thinking";
864
+ thinking: string;
865
+ thinkingSignature?: string;
866
+ redacted?: boolean;
867
+ } | {
868
+ arguments: Record<string, any>;
869
+ callID: string;
870
+ name: string;
871
+ namespace?: string;
872
+ partial?: {
873
+ content?: ({
874
+ type: "text";
875
+ text: string;
876
+ textSignature?: string;
877
+ } | {
878
+ type: "image";
879
+ data: string;
880
+ mimeType: string;
881
+ })[];
882
+ details?: any;
883
+ };
884
+ status: "running";
885
+ thoughtSignature?: string;
886
+ time: {
887
+ start: number;
888
+ end: number;
889
+ };
890
+ type: "toolCall";
891
+ } | ({
892
+ type: "toolCall";
893
+ callID: string;
894
+ name: string;
895
+ arguments: Record<string, any>;
896
+ thoughtSignature?: string;
897
+ namespace?: string;
898
+ time: {
899
+ start: number;
900
+ end: number;
901
+ };
902
+ } & {
903
+ status: "pending";
904
+ })>, Schema.Unknown, never, never>;
905
+ type AikitAssistantPart = typeof AikitAssistantPart.Type;
603
906
  declare const AikitToolCallTerminalPart: Schema.decodeTo<Schema.declare<{
604
907
  arguments: Record<string, any>;
605
908
  callID: string;
@@ -875,5 +1178,5 @@ declare function versionedType(type: string, version: number): string;
875
1178
  declare function durable<const Definitions extends ReadonlyArray<Definition>>(definitions: Definitions): ReadonlyMap<string, Definitions[number]>;
876
1179
  declare function latest(definitions: ReadonlyArray<Definition>): ReadonlyMap<string, Definition<string, Schema.Codec<unknown, unknown, never, never>>>;
877
1180
  //#endregion
878
- export { ID as a, define as c, inventory as d, latest as f, Definition as i, durable as l, AikitToolCallTerminalPart as n, Payload as o, versionedType as p, Data as r, PublishOptions as s, AikitAssistantMessage as t, event_d_exports as u };
879
- //# sourceMappingURL=event-C6-oCzlq.d.mts.map
1181
+ export { Definition as a, PublishOptions as c, event_d_exports as d, inventory as f, Data as i, define as l, versionedType as m, AikitAssistantPart as n, ID as o, latest as p, AikitToolCallTerminalPart as r, Payload as s, AikitAssistantMessage as t, durable as u };
1182
+ //# sourceMappingURL=event-B4EXJQcU.d.mts.map
package/event.d.mts CHANGED
@@ -1,2 +1,2 @@
1
- import { a as ID, c as define, d as inventory, f as latest, i as Definition, l as durable, n as AikitToolCallTerminalPart, o as Payload, p as versionedType, r as Data, s as PublishOptions, t as AikitAssistantMessage, u as event_d_exports } from "./event-C6-oCzlq.mjs";
2
- export { AikitAssistantMessage, AikitToolCallTerminalPart, Data, Definition, event_d_exports as EventSchema, ID, Payload, PublishOptions, define, durable, inventory, latest, versionedType };
1
+ import { a as Definition, c as PublishOptions, d as event_d_exports, f as inventory, i as Data, l as define, m as versionedType, n as AikitAssistantPart, o as ID, p as latest, r as AikitToolCallTerminalPart, s as Payload, t as AikitAssistantMessage, u as durable } from "./event-B4EXJQcU.mjs";
2
+ export { AikitAssistantMessage, AikitAssistantPart, AikitToolCallTerminalPart, Data, Definition, event_d_exports as EventSchema, ID, Payload, PublishOptions, define, durable, inventory, latest, versionedType };
package/event.mjs CHANGED
@@ -1,11 +1,12 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.mjs";
2
- import { isAikitAssistantMessage, isAikitToolCallTerminalPart, optional, validateAikitAssistantMessage, validateAikitToolCallTerminalPart, withStatics } from "./schema.mjs";
2
+ import { isAikitAssistantMessage, isAikitAssistantPart, isAikitToolCallTerminalPart, optional, validateAikitAssistantMessage, validateAikitAssistantPart, validateAikitToolCallTerminalPart, withStatics } from "./schema.mjs";
3
3
  import "@codeworksh/aikit";
4
4
  import { Effect, Schema, SchemaGetter, SchemaIssue } from "effect";
5
5
  import { uuidv7 } from "uuidv7";
6
6
  //#region src/event.ts
7
7
  var event_exports = /* @__PURE__ */ __exportAll({
8
8
  AikitAssistantMessage: () => AikitAssistantMessage,
9
+ AikitAssistantPart: () => AikitAssistantPart,
9
10
  AikitToolCallTerminalPart: () => AikitToolCallTerminalPart,
10
11
  EventSchema: () => event_exports,
11
12
  ID: () => ID,
@@ -28,9 +29,10 @@ const omit = (value, keys) => {
28
29
  for (const key of keys) delete copy[key];
29
30
  return copy;
30
31
  };
32
+ const canonicalizeAikitAssistantPart = (part) => omit(part, aikitTransientFields[part.type]);
31
33
  const canonicalizeAikitAssistantMessage = (message) => ({
32
34
  ...message,
33
- parts: message.parts.map((part) => omit(part, aikitTransientFields[part.type]))
35
+ parts: message.parts.map(canonicalizeAikitAssistantPart)
34
36
  });
35
37
  const reasonOf = (cause) => cause instanceof Error ? cause.message : String(cause);
36
38
  const decodeAikitAssistantMessage = (value, options) => Effect.try({
@@ -46,6 +48,16 @@ const AikitAssistantMessage = Schema.Unknown.pipe(Schema.decodeTo(aikitAssistant
46
48
  decode: SchemaGetter.transformEffect(decodeAikitAssistantMessage),
47
49
  encode: SchemaGetter.transformEffect(decodeAikitAssistantMessage)
48
50
  }));
51
+ const decodeAikitAssistantPart = (value, options) => Effect.try({
52
+ try: () => canonicalizeAikitAssistantPart(validateAikitAssistantPart(value, "aikit assistant part")),
53
+ catch: (cause) => new SchemaIssue.InvalidValue({ message: reasonOf(cause) }, value, options)
54
+ });
55
+ const aikitAssistantPartDeclared = Schema.declare(isAikitAssistantPart, { expected: "aikit assistant part" });
56
+ /** One part of an aikit assistant message, streaming-only fields stripped like {@link AikitAssistantMessage}. */
57
+ const AikitAssistantPart = Schema.Unknown.pipe(Schema.decodeTo(aikitAssistantPartDeclared, {
58
+ decode: SchemaGetter.transformEffect(decodeAikitAssistantPart),
59
+ encode: SchemaGetter.transformEffect(decodeAikitAssistantPart)
60
+ }));
49
61
  const decodeAikitToolCallTerminalPart = (value, options) => Effect.try({
50
62
  try: () => validateAikitToolCallTerminalPart(value, "aikit terminal toolcall part"),
51
63
  catch: (cause) => new SchemaIssue.InvalidValue({ message: reasonOf(cause) }, value, options)
@@ -120,6 +132,6 @@ function latest(definitions) {
120
132
  }, /* @__PURE__ */ new Map()));
121
133
  }
122
134
  //#endregion
123
- export { AikitAssistantMessage, AikitToolCallTerminalPart, event_exports as EventSchema, ID, define, durable, inventory, latest, versionedType };
135
+ export { AikitAssistantMessage, AikitAssistantPart, AikitToolCallTerminalPart, event_exports as EventSchema, ID, define, durable, inventory, latest, versionedType };
124
136
 
125
137
  //# sourceMappingURL=event.mjs.map
package/event.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"event.mjs","names":[],"sources":["../../src/event.ts"],"sourcesContent":["import { Message } from \"@codeworksh/aikit\";\nimport { Effect, Schema, type SchemaAST, SchemaGetter, SchemaIssue } from \"effect\";\nimport { uuidv7 } from \"uuidv7\";\nimport {\n\tisAikitAssistantMessage,\n\tisAikitToolCallTerminalPart,\n\toptional,\n\tvalidateAikitAssistantMessage,\n\tvalidateAikitToolCallTerminalPart,\n\twithStatics,\n} from \"./schema.ts\";\n\ntype AikitAssistantPart = Message.AssistantMessage[\"parts\"][number];\n\n/** Undeclared fields used only while aikit is assembling a streamed part. */\nconst aikitTransientFields: Readonly<Record<AikitAssistantPart[\"type\"], ReadonlyArray<string>>> = {\n\ttext: [\"streamId\"],\n\timage: [],\n\tthinking: [\"streamId\"],\n\ttoolCall: [\"partialJson\"],\n};\n\nconst omit = <T extends object>(value: T, keys: ReadonlyArray<string>): T => {\n\tif (!keys.some((key) => key in value)) return value;\n\tconst copy = { ...value } as T & Record<string, unknown>;\n\tfor (const key of keys) delete copy[key];\n\treturn copy;\n};\n\nconst canonicalizeAikitAssistantMessage = (message: Message.AssistantMessage): Message.AssistantMessage => ({\n\t...message,\n\tparts: message.parts.map((part) => omit(part, aikitTransientFields[part.type])),\n});\n\nconst reasonOf = (cause: unknown): string => (cause instanceof Error ? cause.message : String(cause));\n\nconst decodeAikitAssistantMessage = (value: unknown, options: SchemaAST.ParseOptions) =>\n\tEffect.try({\n\t\ttry: () => canonicalizeAikitAssistantMessage(validateAikitAssistantMessage(value, \"aikit assistant message\")),\n\t\tcatch: (cause) => new SchemaIssue.InvalidValue({ message: reasonOf(cause) }, value, options),\n\t});\n\nconst aikitAssistantMessageDeclared = Schema.declare<Message.AssistantMessage>(isAikitAssistantMessage, {\n\texpected: \"aikit AssistantMessage\",\n});\n\n/**\n * Effect Schema adapter for aikit's TypeBox assistant message. Durable LLM\n * events use it to validate their payload and strip streaming-only fields.\n */\nexport const AikitAssistantMessage = Schema.Unknown.pipe(\n\tSchema.decodeTo(aikitAssistantMessageDeclared, {\n\t\tdecode: SchemaGetter.transformEffect(decodeAikitAssistantMessage),\n\t\tencode: SchemaGetter.transformEffect(decodeAikitAssistantMessage),\n\t}),\n);\nexport type AikitAssistantMessage = typeof AikitAssistantMessage.Type;\n\nconst decodeAikitToolCallTerminalPart = (value: unknown, options: SchemaAST.ParseOptions) =>\n\tEffect.try({\n\t\ttry: () => validateAikitToolCallTerminalPart(value, \"aikit terminal toolcall part\"),\n\t\tcatch: (cause) => new SchemaIssue.InvalidValue({ message: reasonOf(cause) }, value, options),\n\t});\n\nconst aikitToolCallTerminalPartDeclared = Schema.declare<Message.ToolCallTerminalPart>(isAikitToolCallTerminalPart, {\n\texpected: \"aikit terminal toolcall part\",\n});\n\nexport const AikitToolCallTerminalPart = Schema.Unknown.pipe(\n\tSchema.decodeTo(aikitToolCallTerminalPartDeclared, {\n\t\tdecode: SchemaGetter.transformEffect(decodeAikitToolCallTerminalPart),\n\t\tencode: SchemaGetter.transformEffect(decodeAikitToolCallTerminalPart),\n\t}),\n);\nexport type AikitToolCallTerminalPart = typeof AikitToolCallTerminalPart.Type;\n\nexport const ID = Schema.String.pipe(\n\tSchema.brand(\"Event.ID\"),\n\twithStatics((schema) => ({\n\t\tcreate: () => schema.make(`evt_${uuidv7()}`),\n\t})),\n);\nexport type ID = typeof ID.Type;\n\nexport type Definition<\n\tType extends string = string,\n\tDataSchema extends Schema.Codec<unknown, unknown> = Schema.Codec<unknown, unknown>,\n> = Schema.Top & {\n\treadonly type: Type;\n\treadonly durable?: {\n\t\treadonly version: number; // event versioning for decoding in later time\n\t\treadonly aggregate: string;\n\t};\n\treadonly data: DataSchema;\n};\n\nexport type Data<D extends Definition> = Schema.Schema.Type<D[\"data\"]>;\n\n/** Publish-time options. Lives beside the definition so the plugin-facing publisher can name it. */\nexport interface PublishOptions {\n\t/** Caller-supplied event ID. Publishing the same ID twice is a defect, not an upsert. */\n\treadonly id?: ID;\n\t/**\n\t * Publish-time context — correlation, tracing — carried to projectors on the\n\t * in-memory payload and deliberately not stored in the event row. A projector\n\t * persists it into its own projection if it means something there; the log\n\t * records what happened, not who asked. It therefore does not survive a\n\t * durable reread or a rebuild, which `event.test.ts` pins explicitly.\n\t */\n\treadonly metadata?: Record<string, string>;\n}\n\nexport type Payload<D extends Definition = Definition> = {\n\treadonly id: ID;\n\treadonly type: D[\"type\"];\n\treadonly data: Data<D>;\n\treadonly durable?: {\n\t\treadonly aggregateId: string;\n\t\treadonly seq: number;\n\t\treadonly version: number;\n\t};\n\treadonly metadata?: Record<string, string>;\n};\n\nexport function define<\n\tconst Type extends string,\n\tconst Fields extends Readonly<Record<PropertyKey, Schema.Codec<unknown, unknown>>>,\n>(input: {\n\treadonly type: Type;\n\treadonly durable?: {\n\t\treadonly version: number;\n\t\treadonly aggregate: string;\n\t};\n\treadonly schema: Fields;\n}) {\n\tconst data = Schema.Struct(input.schema);\n\treturn Schema.Struct({\n\t\tid: ID,\n\t\tmetadata: optional(Schema.Record(Schema.String, Schema.String)),\n\t\ttype: Schema.Literal(input.type),\n\t\tdurable: optional(Schema.Struct({ aggregateId: Schema.String, seq: Schema.Int, version: Schema.Int })),\n\t\tdata,\n\t})\n\t\t.annotate({ identifier: input.type })\n\t\t.pipe(\n\t\t\twithStatics(() => ({\n\t\t\t\ttype: input.type,\n\t\t\t\t...(input.durable === undefined ? {} : { durable: input.durable }),\n\t\t\t\tdata,\n\t\t\t})),\n\t\t) satisfies Definition<Type, typeof data>;\n}\n\n// Register all the event definitions.\nexport function inventory<const Definitions extends ReadonlyArray<Definition>>(...definitions: Definitions) {\n\treturn Object.freeze(definitions);\n}\n\nexport function versionedType(type: string, version: number) {\n\treturn `${type}.${version}`;\n}\n\nexport function durable<const Definitions extends ReadonlyArray<Definition>>(definitions: Definitions) {\n\treturn readonlyMap(\n\t\tdefinitions.reduce((result, definition) => {\n\t\t\tif (!definition.durable) return result;\n\t\t\tconst key = versionedType(definition.type, definition.durable.version);\n\t\t\tif (result.has(key)) throw new Error(`duplicate durable event definition for ${key}`);\n\t\t\tresult.set(key, definition);\n\t\t\treturn result;\n\t\t}, new Map<string, Definitions[number]>()),\n\t);\n}\n\nfunction readonlyMap<Key, Value>(map: Map<Key, Value>): ReadonlyMap<Key, Value> {\n\tconst result: ReadonlyMap<Key, Value> = Object.freeze({\n\t\tget size() {\n\t\t\treturn map.size;\n\t\t},\n\t\tentries: () => map.entries(),\n\t\tforEach: (callback: (value: Value, key: Key, map: ReadonlyMap<Key, Value>) => void, thisArg?: unknown) =>\n\t\t\tmap.forEach((value, key) => callback.call(thisArg, value, key, result)),\n\t\tget: (key: Key) => map.get(key),\n\t\thas: (key: Key) => map.has(key),\n\t\tkeys: () => map.keys(),\n\t\tvalues: () => map.values(),\n\t\t[Symbol.iterator]: () => map[Symbol.iterator](),\n\t});\n\treturn result;\n}\n\nexport function latest(definitions: ReadonlyArray<Definition>) {\n\treturn readonlyMap(\n\t\tdefinitions.reduce((result, definition) => {\n\t\t\tconst existing = result.get(definition.type);\n\t\t\tif (!existing) {\n\t\t\t\tresult.set(definition.type, definition);\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\tif (definition.durable && existing.durable && definition.durable.version !== existing.durable.version) {\n\t\t\t\tif (definition.durable.version > existing.durable.version) result.set(definition.type, definition);\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\tif (definition !== existing) throw new Error(`duplicate latest event definition for ${definition.type}`);\n\t\t\treturn result;\n\t\t}, new Map<string, Definition>()),\n\t);\n}\n\nexport * as EventSchema from \"./event.ts\";\n"],"mappings":"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"}
1
+ {"version":3,"file":"event.mjs","names":[],"sources":["../../src/event.ts"],"sourcesContent":["import { Message } from \"@codeworksh/aikit\";\nimport { Effect, Schema, type SchemaAST, SchemaGetter, SchemaIssue } from \"effect\";\nimport { uuidv7 } from \"uuidv7\";\nimport {\n\tisAikitAssistantMessage,\n\tisAikitAssistantPart,\n\tisAikitToolCallTerminalPart,\n\toptional,\n\tvalidateAikitAssistantMessage,\n\tvalidateAikitAssistantPart,\n\tvalidateAikitToolCallTerminalPart,\n\twithStatics,\n} from \"./schema.ts\";\n\ntype AssistantPart = Message.AssistantMessage[\"parts\"][number];\n\n/** Undeclared fields used only while aikit is assembling a streamed part. */\nconst aikitTransientFields: Readonly<Record<AssistantPart[\"type\"], ReadonlyArray<string>>> = {\n\ttext: [\"streamId\"],\n\timage: [],\n\tthinking: [\"streamId\"],\n\ttoolCall: [\"partialJson\"],\n};\n\nconst omit = <T extends object>(value: T, keys: ReadonlyArray<string>): T => {\n\tif (!keys.some((key) => key in value)) return value;\n\tconst copy = { ...value } as T & Record<string, unknown>;\n\tfor (const key of keys) delete copy[key];\n\treturn copy;\n};\n\nconst canonicalizeAikitAssistantPart = (part: AssistantPart): AssistantPart =>\n\tomit(part, aikitTransientFields[part.type]);\n\nconst canonicalizeAikitAssistantMessage = (message: Message.AssistantMessage): Message.AssistantMessage => ({\n\t...message,\n\tparts: message.parts.map(canonicalizeAikitAssistantPart),\n});\n\nconst reasonOf = (cause: unknown): string => (cause instanceof Error ? cause.message : String(cause));\n\nconst decodeAikitAssistantMessage = (value: unknown, options: SchemaAST.ParseOptions) =>\n\tEffect.try({\n\t\ttry: () => canonicalizeAikitAssistantMessage(validateAikitAssistantMessage(value, \"aikit assistant message\")),\n\t\tcatch: (cause) => new SchemaIssue.InvalidValue({ message: reasonOf(cause) }, value, options),\n\t});\n\nconst aikitAssistantMessageDeclared = Schema.declare<Message.AssistantMessage>(isAikitAssistantMessage, {\n\texpected: \"aikit AssistantMessage\",\n});\n\n/**\n * Effect Schema adapter for aikit's TypeBox assistant message. Durable LLM\n * events use it to validate their payload and strip streaming-only fields.\n */\nexport const AikitAssistantMessage = Schema.Unknown.pipe(\n\tSchema.decodeTo(aikitAssistantMessageDeclared, {\n\t\tdecode: SchemaGetter.transformEffect(decodeAikitAssistantMessage),\n\t\tencode: SchemaGetter.transformEffect(decodeAikitAssistantMessage),\n\t}),\n);\nexport type AikitAssistantMessage = typeof AikitAssistantMessage.Type;\n\nconst decodeAikitAssistantPart = (value: unknown, options: SchemaAST.ParseOptions) =>\n\tEffect.try({\n\t\ttry: () => canonicalizeAikitAssistantPart(validateAikitAssistantPart(value, \"aikit assistant part\")),\n\t\tcatch: (cause) => new SchemaIssue.InvalidValue({ message: reasonOf(cause) }, value, options),\n\t});\n\nconst aikitAssistantPartDeclared = Schema.declare<AssistantPart>(isAikitAssistantPart, {\n\texpected: \"aikit assistant part\",\n});\n\n/** One part of an aikit assistant message, streaming-only fields stripped like {@link AikitAssistantMessage}. */\nexport const AikitAssistantPart = Schema.Unknown.pipe(\n\tSchema.decodeTo(aikitAssistantPartDeclared, {\n\t\tdecode: SchemaGetter.transformEffect(decodeAikitAssistantPart),\n\t\tencode: SchemaGetter.transformEffect(decodeAikitAssistantPart),\n\t}),\n);\nexport type AikitAssistantPart = typeof AikitAssistantPart.Type;\n\nconst decodeAikitToolCallTerminalPart = (value: unknown, options: SchemaAST.ParseOptions) =>\n\tEffect.try({\n\t\ttry: () => validateAikitToolCallTerminalPart(value, \"aikit terminal toolcall part\"),\n\t\tcatch: (cause) => new SchemaIssue.InvalidValue({ message: reasonOf(cause) }, value, options),\n\t});\n\nconst aikitToolCallTerminalPartDeclared = Schema.declare<Message.ToolCallTerminalPart>(isAikitToolCallTerminalPart, {\n\texpected: \"aikit terminal toolcall part\",\n});\n\nexport const AikitToolCallTerminalPart = Schema.Unknown.pipe(\n\tSchema.decodeTo(aikitToolCallTerminalPartDeclared, {\n\t\tdecode: SchemaGetter.transformEffect(decodeAikitToolCallTerminalPart),\n\t\tencode: SchemaGetter.transformEffect(decodeAikitToolCallTerminalPart),\n\t}),\n);\nexport type AikitToolCallTerminalPart = typeof AikitToolCallTerminalPart.Type;\n\nexport const ID = Schema.String.pipe(\n\tSchema.brand(\"Event.ID\"),\n\twithStatics((schema) => ({\n\t\tcreate: () => schema.make(`evt_${uuidv7()}`),\n\t})),\n);\nexport type ID = typeof ID.Type;\n\nexport type Definition<\n\tType extends string = string,\n\tDataSchema extends Schema.Codec<unknown, unknown> = Schema.Codec<unknown, unknown>,\n> = Schema.Top & {\n\treadonly type: Type;\n\treadonly durable?: {\n\t\treadonly version: number; // event versioning for decoding in later time\n\t\treadonly aggregate: string;\n\t};\n\treadonly data: DataSchema;\n};\n\nexport type Data<D extends Definition> = Schema.Schema.Type<D[\"data\"]>;\n\n/** Publish-time options. Lives beside the definition so the plugin-facing publisher can name it. */\nexport interface PublishOptions {\n\t/** Caller-supplied event ID. Publishing the same ID twice is a defect, not an upsert. */\n\treadonly id?: ID;\n\t/**\n\t * Publish-time context — correlation, tracing — carried to projectors on the\n\t * in-memory payload and deliberately not stored in the event row. A projector\n\t * persists it into its own projection if it means something there; the log\n\t * records what happened, not who asked. It therefore does not survive a\n\t * durable reread or a rebuild, which `event.test.ts` pins explicitly.\n\t */\n\treadonly metadata?: Record<string, string>;\n}\n\nexport type Payload<D extends Definition = Definition> = {\n\treadonly id: ID;\n\treadonly type: D[\"type\"];\n\treadonly data: Data<D>;\n\treadonly durable?: {\n\t\treadonly aggregateId: string;\n\t\treadonly seq: number;\n\t\treadonly version: number;\n\t};\n\treadonly metadata?: Record<string, string>;\n};\n\nexport function define<\n\tconst Type extends string,\n\tconst Fields extends Readonly<Record<PropertyKey, Schema.Codec<unknown, unknown>>>,\n>(input: {\n\treadonly type: Type;\n\treadonly durable?: {\n\t\treadonly version: number;\n\t\treadonly aggregate: string;\n\t};\n\treadonly schema: Fields;\n}) {\n\tconst data = Schema.Struct(input.schema);\n\treturn Schema.Struct({\n\t\tid: ID,\n\t\tmetadata: optional(Schema.Record(Schema.String, Schema.String)),\n\t\ttype: Schema.Literal(input.type),\n\t\tdurable: optional(Schema.Struct({ aggregateId: Schema.String, seq: Schema.Int, version: Schema.Int })),\n\t\tdata,\n\t})\n\t\t.annotate({ identifier: input.type })\n\t\t.pipe(\n\t\t\twithStatics(() => ({\n\t\t\t\ttype: input.type,\n\t\t\t\t...(input.durable === undefined ? {} : { durable: input.durable }),\n\t\t\t\tdata,\n\t\t\t})),\n\t\t) satisfies Definition<Type, typeof data>;\n}\n\n// Register all the event definitions.\nexport function inventory<const Definitions extends ReadonlyArray<Definition>>(...definitions: Definitions) {\n\treturn Object.freeze(definitions);\n}\n\nexport function versionedType(type: string, version: number) {\n\treturn `${type}.${version}`;\n}\n\nexport function durable<const Definitions extends ReadonlyArray<Definition>>(definitions: Definitions) {\n\treturn readonlyMap(\n\t\tdefinitions.reduce((result, definition) => {\n\t\t\tif (!definition.durable) return result;\n\t\t\tconst key = versionedType(definition.type, definition.durable.version);\n\t\t\tif (result.has(key)) throw new Error(`duplicate durable event definition for ${key}`);\n\t\t\tresult.set(key, definition);\n\t\t\treturn result;\n\t\t}, new Map<string, Definitions[number]>()),\n\t);\n}\n\nfunction readonlyMap<Key, Value>(map: Map<Key, Value>): ReadonlyMap<Key, Value> {\n\tconst result: ReadonlyMap<Key, Value> = Object.freeze({\n\t\tget size() {\n\t\t\treturn map.size;\n\t\t},\n\t\tentries: () => map.entries(),\n\t\tforEach: (callback: (value: Value, key: Key, map: ReadonlyMap<Key, Value>) => void, thisArg?: unknown) =>\n\t\t\tmap.forEach((value, key) => callback.call(thisArg, value, key, result)),\n\t\tget: (key: Key) => map.get(key),\n\t\thas: (key: Key) => map.has(key),\n\t\tkeys: () => map.keys(),\n\t\tvalues: () => map.values(),\n\t\t[Symbol.iterator]: () => map[Symbol.iterator](),\n\t});\n\treturn result;\n}\n\nexport function latest(definitions: ReadonlyArray<Definition>) {\n\treturn readonlyMap(\n\t\tdefinitions.reduce((result, definition) => {\n\t\t\tconst existing = result.get(definition.type);\n\t\t\tif (!existing) {\n\t\t\t\tresult.set(definition.type, definition);\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\tif (definition.durable && existing.durable && definition.durable.version !== existing.durable.version) {\n\t\t\t\tif (definition.durable.version > existing.durable.version) result.set(definition.type, definition);\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\tif (definition !== existing) throw new Error(`duplicate latest event definition for ${definition.type}`);\n\t\t\treturn result;\n\t\t}, new Map<string, Definition>()),\n\t);\n}\n\nexport * as EventSchema from \"./event.ts\";\n"],"mappings":"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"}
package/index.d.mts CHANGED
@@ -1,4 +1,4 @@
1
1
  import { t as section_d_exports } from "./plugin/section.mjs";
2
2
  import { b as tool_d_exports } from "./tool-C7gcMoga.mjs";
3
- import { t as plugin_d_exports } from "./plugin-Cj56-eXk.mjs";
3
+ import { t as plugin_d_exports } from "./plugin-DWhny4p-.mjs";
4
4
  export { plugin_d_exports as Plugin, section_d_exports as Section, tool_d_exports as Tool };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@codeworksh/plugin",
3
- "version": "0.3.0-canary.82.1.g33702b61",
3
+ "version": "0.3.0-canary.84.1.gce0dac2c",
4
4
  "description": "SDK for building CodeWork plugins — the plugin, tool, and sandbox contracts shared with @codeworksh/harness.",
5
5
  "keywords": [
6
6
  "agent",
@@ -173,7 +173,7 @@
173
173
  "uuidv7": "^1.2.1"
174
174
  },
175
175
  "peerDependencies": {
176
- "@codeworksh/aikit": "0.12.1-canary.82.1.g33702b61",
176
+ "@codeworksh/aikit": "0.12.1-canary.84.1.gce0dac2c",
177
177
  "effect": "4.0.5"
178
178
  }
179
179
  }
@@ -1,4 +1,4 @@
1
- import { i as Definition, o as Payload, r as Data, s as PublishOptions } from "./event-C6-oCzlq.mjs";
1
+ import { a as Definition, c as PublishOptions, i as Data, s as Payload } from "./event-B4EXJQcU.mjs";
2
2
  import { n as SessionID, r as ThreadID } from "./ids-CpPeP5Ks.mjs";
3
3
  import { o as Service, r as Info } from "./location-Q39els63.mjs";
4
4
  import { f as io_d_exports, i as Identity, s as Provides } from "./io-Br9WZTsG.mjs";
@@ -164,4 +164,4 @@ declare namespace plugin_d_exports {
164
164
  }
165
165
  //#endregion
166
166
  export { PluginRegistry as _, define as a, PluginOptions as c, PluginSpec as d, Config as f, SharedPluginContext as g, PromptResolver as h, PluginKind as i, PluginPatch as l, Paths as m, Mount as n, domains as o, Events as p, Plugin as r, rank as s, plugin_d_exports as t, PluginRef as u };
167
- //# sourceMappingURL=plugin-Cj56-eXk.d.mts.map
167
+ //# sourceMappingURL=plugin-DWhny4p-.d.mts.map
package/plugin.d.mts CHANGED
@@ -2,5 +2,5 @@ import { l as mcp_d_exports } from "./mcp-DEWhnBQw.mjs";
2
2
  import { t as section_d_exports } from "./plugin/section.mjs";
3
3
  import { n as prompt_d_exports } from "./prompt-DWaA5ZXj.mjs";
4
4
  import { p as tool_d_exports } from "./tool-C9TzQ9nG.mjs";
5
- import { _ as PluginRegistry, a as define, c as PluginOptions, d as PluginSpec, f as Config, g as SharedPluginContext, h as PromptResolver, i as PluginKind, l as PluginPatch, m as Paths, n as Mount, o as domains, p as Events, r as Plugin, s as rank, u as PluginRef } from "./plugin-Cj56-eXk.mjs";
5
+ import { _ as PluginRegistry, a as define, c as PluginOptions, d as PluginSpec, f as Config, g as SharedPluginContext, h as PromptResolver, i as PluginKind, l as PluginPatch, m as Paths, n as Mount, o as domains, p as Events, r as Plugin, s as rank, u as PluginRef } from "./plugin-DWhny4p-.mjs";
6
6
  export { type Config, type Events, mcp_d_exports as Mcp, type Mount, type Paths, type Plugin, type PluginKind, type PluginOptions, type PluginPatch, type PluginRef, type PluginRegistry, type PluginSpec, prompt_d_exports as Prompt, type PromptResolver, section_d_exports as Section, type SharedPluginContext, tool_d_exports as Tool, define, domains, rank };
package/schema.d.mts CHANGED
@@ -5,10 +5,12 @@ import { Schema } from "effect";
5
5
  export declare const validateAikitMessage: (value: unknown, label: string) => Message.Message;
6
6
  export declare const validateAikitUserMessage: (value: unknown, label: string) => Message.UserMessage;
7
7
  export declare const validateAikitAssistantMessage: (value: unknown, label: string) => Message.AssistantMessage;
8
+ export declare const validateAikitAssistantPart: (value: unknown, label: string) => Message.AssistantMessage["parts"][number];
8
9
  export declare const validateAikitToolCallTerminalPart: (value: unknown, label: string) => Message.ToolCallTerminalPart;
9
10
  export declare const validateAikitModelInfo: (value: unknown, label: string) => Model.Info;
10
11
  export declare const isAikitModelInfo: (value: unknown) => value is Model.Info;
11
12
  export declare const isAikitAssistantMessage: (value: unknown) => value is Message.AssistantMessage;
13
+ export declare const isAikitAssistantPart: (value: unknown) => value is Message.AssistantMessage["parts"][number];
12
14
  export declare const isAikitToolCallTerminalPart: (value: unknown) => value is Message.ToolCallTerminalPart;
13
15
  /**
14
16
  * Integer greater than zero.
package/schema.mjs CHANGED
@@ -26,10 +26,12 @@ const validateAikitSchema = (schema, value, label) => {
26
26
  const validateAikitMessage = (value, label) => validateAikitSchema(Message.MessageSchema, value, label);
27
27
  const validateAikitUserMessage = (value, label) => validateAikitSchema(Message.UserMessageSchema, value, label);
28
28
  const validateAikitAssistantMessage = (value, label) => validateAikitSchema(Message.AssistantMessageSchema, value, label);
29
+ const validateAikitAssistantPart = (value, label) => validateAikitSchema(Message.AssistantMessageSchema.properties.parts.items, value, label);
29
30
  const validateAikitToolCallTerminalPart = (value, label) => validateAikitSchema(Message.ToolCallTerminalPartSchema, value, label);
30
31
  const validateAikitModelInfo = (value, label) => validateAikitSchema(Model.Info, value, label);
31
32
  const isAikitModelInfo = (value) => aikitValidatorFor(Model.Info).Check(value);
32
33
  const isAikitAssistantMessage = (value) => aikitValidatorFor(Message.AssistantMessageSchema).Check(value);
34
+ const isAikitAssistantPart = (value) => aikitValidatorFor(Message.AssistantMessageSchema.properties.parts.items).Check(value);
33
35
  const isAikitToolCallTerminalPart = (value) => aikitValidatorFor(Message.ToolCallTerminalPartSchema).Check(value);
34
36
  /**
35
37
  * Integer greater than zero.
@@ -102,6 +104,6 @@ const DateTimeUtcFromMillis = Schema.Finite.pipe(Schema.decodeTo(Schema.DateTime
102
104
  encode: SchemaGetter.transform((value) => DateTime.toEpochMillis(value))
103
105
  }));
104
106
  //#endregion
105
- export { AbsolutePath, DateTimeUtcFromMillis, Newtype, NonNegativeCost, NonNegativeInt, PositiveInt, isAikitAssistantMessage, isAikitModelInfo, isAikitToolCallTerminalPart, optional, validateAikitAssistantMessage, validateAikitMessage, validateAikitModelInfo, validateAikitToolCallTerminalPart, validateAikitUserMessage, withStatics };
107
+ export { AbsolutePath, DateTimeUtcFromMillis, Newtype, NonNegativeCost, NonNegativeInt, PositiveInt, isAikitAssistantMessage, isAikitAssistantPart, isAikitModelInfo, isAikitToolCallTerminalPart, optional, validateAikitAssistantMessage, validateAikitAssistantPart, validateAikitMessage, validateAikitModelInfo, validateAikitToolCallTerminalPart, validateAikitUserMessage, withStatics };
106
108
 
107
109
  //# sourceMappingURL=schema.mjs.map
package/schema.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"schema.mjs","names":[],"sources":["../../src/schema.ts"],"sourcesContent":["import { Message, Model } from \"@codeworksh/aikit\";\nimport { DateTime, Option, Schema, SchemaGetter } from \"effect\";\nimport type { Static, TSchema } from \"typebox\";\nimport TypeBoxSchema from \"typebox/schema\";\n\nconst aikitValidators = new WeakMap<TSchema, ReturnType<typeof TypeBoxSchema.Compile>>();\n\nconst aikitValidatorFor = <T extends TSchema>(schema: T): ReturnType<typeof TypeBoxSchema.Compile<T>> => {\n\tconst cached = aikitValidators.get(schema) as ReturnType<typeof TypeBoxSchema.Compile<T>> | undefined;\n\tif (cached !== undefined) return cached;\n\tconst compiled = TypeBoxSchema.Compile(schema);\n\taikitValidators.set(schema, compiled);\n\treturn compiled;\n};\n\nconst aikitErrorPath = (error: {\n\treadonly instancePath?: string;\n\treadonly params?: Record<string, unknown>;\n}): string => {\n\tif (error.instancePath) return error.instancePath.substring(1);\n\tconst required = error.params?.requiredProperties;\n\treturn Array.isArray(required) ? required.join(\", \") : \"root\";\n};\n\nconst validateAikitSchema = <T extends TSchema>(schema: T, value: unknown, label: string): Static<T> => {\n\tconst validator = aikitValidatorFor(schema);\n\tif (validator.Check(value)) return value;\n\n\tconst [, issues] = validator.Errors(value);\n\tconst details = issues.map((issue) => ` - ${aikitErrorPath(issue)}: ${issue.message}`).join(\"\\n\") || \"unknown error\";\n\tthrow new Error(`validation failed for ${label}\\n${details}`);\n};\n\n/** Validate an aikit message without coercing or rewriting durable data. */\nexport const validateAikitMessage = (value: unknown, label: string): Message.Message =>\n\tvalidateAikitSchema(Message.MessageSchema, value, label);\n\nexport const validateAikitUserMessage = (value: unknown, label: string): Message.UserMessage =>\n\tvalidateAikitSchema(Message.UserMessageSchema, value, label);\n\nexport const validateAikitAssistantMessage = (value: unknown, label: string): Message.AssistantMessage =>\n\tvalidateAikitSchema(Message.AssistantMessageSchema, value, label);\n\nexport const validateAikitToolCallTerminalPart = (value: unknown, label: string): Message.ToolCallTerminalPart =>\n\tvalidateAikitSchema(Message.ToolCallTerminalPartSchema, value, label);\n\nexport const validateAikitModelInfo = (value: unknown, label: string): Model.Info =>\n\tvalidateAikitSchema(Model.Info, value, label);\n\nexport const isAikitModelInfo = (value: unknown): value is Model.Info => aikitValidatorFor(Model.Info).Check(value);\n\nexport const isAikitAssistantMessage = (value: unknown): value is Message.AssistantMessage =>\n\taikitValidatorFor(Message.AssistantMessageSchema).Check(value);\n\nexport const isAikitToolCallTerminalPart = (value: unknown): value is Message.ToolCallTerminalPart =>\n\taikitValidatorFor(Message.ToolCallTerminalPartSchema).Check(value);\n\n/**\n * Integer greater than zero.\n */\nexport const PositiveInt = Schema.Int.check(Schema.isGreaterThan(0));\n\n/**\n * Integer greater than or equal to zero.\n */\nexport const NonNegativeInt = Schema.Int.check(Schema.isGreaterThanOrEqualTo(0));\n\n/**\n * Cost greater than or equal with finite value\n */\nexport const NonNegativeCost = Schema.Finite.check(Schema.isGreaterThanOrEqualTo(0));\n\n/**\n * Absolute POSIX file path (e.g., `/home/user/projects/myapp/src/main.ts`).\n */\nexport const AbsolutePath = Schema.String.check(Schema.isPattern(/^\\//)).pipe(Schema.brand(\"AbsolutePath\"));\nexport type AbsolutePath = Schema.Schema.Type<typeof AbsolutePath>;\n\n/**\n * Optional public JSON field that can hold explicit `undefined` on the type\n * side but encodes it as an omitted key, matching legacy `JSON.stringify`.\n */\nexport const optional = <S extends Schema.Top>(schema: S) =>\n\tSchema.optionalKey(schema).pipe(\n\t\tSchema.decodeTo(Schema.optional(Schema.toType(schema)), {\n\t\t\tdecode: SchemaGetter.passthrough({ strict: false }),\n\t\t\tencode: SchemaGetter.transformOptional(Option.filter((value) => value !== undefined)),\n\t\t}),\n\t);\n\n/**\n * Strip `readonly` from a nested type. Stand-in for `effect`'s `Types.DeepMutable`\n * until `effect:core/x228my` (\"Types.DeepMutable widens unknown to `{}`\") lands.\n *\n * The upstream version falls through `unknown` into `{ -readonly [K in keyof T]: ... }`\n * where `keyof unknown = never`, so `unknown` collapses to `{}`. This local\n * version gates the object branch on `extends object` (which `unknown` does\n * not) so `unknown` passes through untouched.\n *\n * Primitive bailout matches upstream — without it, branded strings like\n * `string & Brand<\"SessionID\">` fall into the object branch and get their\n * prototype methods walked.\n *\n * Tuple branch preserves readonly tuples (e.g. `ConfigPlugin.Spec`'s\n * `readonly [string, Options]`); the general array branch would otherwise\n * widen them to unbounded arrays.\n */\nexport type DeepMutable<T> = T extends string | number | boolean | bigint | symbol | Function\n\t? T\n\t: T extends readonly [unknown, ...unknown[]]\n\t\t? { -readonly [K in keyof T]: DeepMutable<T[K]> }\n\t\t: T extends readonly (infer U)[]\n\t\t\t? DeepMutable<U>[]\n\t\t\t: T extends object\n\t\t\t\t? { -readonly [K in keyof T]: DeepMutable<T[K]> }\n\t\t\t\t: T;\n\n/**\n * Attach static methods to a schema object. Designed to be used with `.pipe()`:\n *\n * @example\n * export const Foo = fooSchema.pipe(\n * withStatics((schema) => ({\n * zero: schema.make(0),\n * from: Schema.decodeUnknownOption(schema),\n * }))\n * )\n */\nexport const withStatics =\n\t<S extends object, M extends Record<string, unknown>>(methods: (schema: S) => M) =>\n\t(schema: S): S & M =>\n\t\tObject.assign(schema, methods(schema));\n\n/**\n * Nominal wrapper for scalar types. The class itself is a valid schema —\n * pass it directly to `Schema.decode`, `Schema.decodeEffect`, etc.\n *\n * Overrides `~type.make` on the derived `Schema.Opaque` so `Schema.Schema.Type`\n * of a field using this newtype resolves to `Self` rather than the underlying\n * branded phantom. Without that override, passing a class instance to code\n * typed against `Schema.Schema.Type<FieldSchema>` would require a cast even\n * though the values are structurally equivalent at runtime.\n *\n * @example\n * class QuestionID extends Newtype<QuestionID>()(\"QuestionID\", Schema.String) {\n * static make(id: string): QuestionID {\n * return this.make(id)\n * }\n * }\n *\n * Schema.decodeEffect(QuestionID)(input)\n */\nexport function Newtype<Self>() {\n\treturn <const Tag extends string, S extends Schema.Top>(tag: Tag, schema: S) => {\n\t\tabstract class Base {\n\t\t\tdeclare readonly _newtype: Tag;\n\n\t\t\tstatic make(value: Schema.Schema.Type<S>): Self {\n\t\t\t\treturn value as unknown as Self;\n\t\t\t}\n\t\t}\n\n\t\tObject.setPrototypeOf(Base, schema);\n\n\t\treturn Base as unknown as (abstract new (_: never) => { readonly _newtype: Tag }) & {\n\t\t\treadonly make: (value: Schema.Schema.Type<S>) => Self;\n\t\t} & Omit<Schema.Opaque<Self, S, {}>, \"make\" | \"~type.make\"> & {\n\t\t\t\treadonly \"~type.make\": Self;\n\t\t\t};\n\t};\n}\n\nexport const DateTimeUtcFromMillis = Schema.Finite.pipe(\n\tSchema.decodeTo(Schema.DateTimeUtc, {\n\t\tdecode: SchemaGetter.transform((value) => DateTime.makeUnsafe(value)),\n\t\tencode: SchemaGetter.transform((value) => DateTime.toEpochMillis(value)),\n\t}),\n);\n"],"mappings":";;;;AAKA,MAAM,kCAAkB,IAAI,QAA2D;AAEvF,MAAM,qBAAwC,WAA2D;CACxG,MAAM,SAAS,gBAAgB,IAAI,MAAM;CACzC,IAAI,WAAW,KAAA,GAAW,OAAO;CACjC,MAAM,WAAW,cAAc,QAAQ,MAAM;CAC7C,gBAAgB,IAAI,QAAQ,QAAQ;CACpC,OAAO;AACR;AAEA,MAAM,kBAAkB,UAGV;CACb,IAAI,MAAM,cAAc,OAAO,MAAM,aAAa,UAAU,CAAC;CAC7D,MAAM,WAAW,MAAM,QAAQ;CAC/B,OAAO,MAAM,QAAQ,QAAQ,IAAI,SAAS,KAAK,IAAI,IAAI;AACxD;AAEA,MAAM,uBAA0C,QAAW,OAAgB,UAA6B;CACvG,MAAM,YAAY,kBAAkB,MAAM;CAC1C,IAAI,UAAU,MAAM,KAAK,GAAG,OAAO;CAEnC,MAAM,GAAG,UAAU,UAAU,OAAO,KAAK;CACzC,MAAM,UAAU,OAAO,KAAK,UAAU,MAAM,eAAe,KAAK,EAAE,IAAI,MAAM,SAAS,CAAC,CAAC,KAAK,IAAI,KAAK;CACrG,MAAM,IAAI,MAAM,yBAAyB,MAAM,IAAI,SAAS;AAC7D;;AAGA,MAAa,wBAAwB,OAAgB,UACpD,oBAAoB,QAAQ,eAAe,OAAO,KAAK;AAExD,MAAa,4BAA4B,OAAgB,UACxD,oBAAoB,QAAQ,mBAAmB,OAAO,KAAK;AAE5D,MAAa,iCAAiC,OAAgB,UAC7D,oBAAoB,QAAQ,wBAAwB,OAAO,KAAK;AAEjE,MAAa,qCAAqC,OAAgB,UACjE,oBAAoB,QAAQ,4BAA4B,OAAO,KAAK;AAErE,MAAa,0BAA0B,OAAgB,UACtD,oBAAoB,MAAM,MAAM,OAAO,KAAK;AAE7C,MAAa,oBAAoB,UAAwC,kBAAkB,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK;AAElH,MAAa,2BAA2B,UACvC,kBAAkB,QAAQ,sBAAsB,CAAC,CAAC,MAAM,KAAK;AAE9D,MAAa,+BAA+B,UAC3C,kBAAkB,QAAQ,0BAA0B,CAAC,CAAC,MAAM,KAAK;;;;AAKlE,MAAa,cAAc,OAAO,IAAI,MAAM,OAAO,cAAc,CAAC,CAAC;;;;AAKnE,MAAa,iBAAiB,OAAO,IAAI,MAAM,OAAO,uBAAuB,CAAC,CAAC;;;;AAK/E,MAAa,kBAAkB,OAAO,OAAO,MAAM,OAAO,uBAAuB,CAAC,CAAC;;;;AAKnF,MAAa,eAAe,OAAO,OAAO,MAAM,OAAO,UAAU,KAAK,CAAC,CAAC,CAAC,KAAK,OAAO,MAAM,cAAc,CAAC;;;;;AAO1G,MAAa,YAAkC,WAC9C,OAAO,YAAY,MAAM,CAAC,CAAC,KAC1B,OAAO,SAAS,OAAO,SAAS,OAAO,OAAO,MAAM,CAAC,GAAG;CACvD,QAAQ,aAAa,YAAY,EAAE,QAAQ,MAAM,CAAC;CAClD,QAAQ,aAAa,kBAAkB,OAAO,QAAQ,UAAU,UAAU,KAAA,CAAS,CAAC;AACrF,CAAC,CACF;;;;;;;;;;;;AAwCD,MAAa,eAC0C,aACrD,WACA,OAAO,OAAO,QAAQ,QAAQ,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;AAqBvC,SAAgB,UAAgB;CAC/B,QAAwD,KAAU,WAAc;EAC/E,MAAe,KAAK;GAGnB,OAAO,KAAK,OAAoC;IAC/C,OAAO;GACR;EACD;EAEA,OAAO,eAAe,MAAM,MAAM;EAElC,OAAO;CAKR;AACD;AAEA,MAAa,wBAAwB,OAAO,OAAO,KAClD,OAAO,SAAS,OAAO,aAAa;CACnC,QAAQ,aAAa,WAAW,UAAU,SAAS,WAAW,KAAK,CAAC;CACpE,QAAQ,aAAa,WAAW,UAAU,SAAS,cAAc,KAAK,CAAC;AACxE,CAAC,CACF"}
1
+ {"version":3,"file":"schema.mjs","names":[],"sources":["../../src/schema.ts"],"sourcesContent":["import { Message, Model } from \"@codeworksh/aikit\";\nimport { DateTime, Option, Schema, SchemaGetter } from \"effect\";\nimport type { Static, TSchema } from \"typebox\";\nimport TypeBoxSchema from \"typebox/schema\";\n\nconst aikitValidators = new WeakMap<TSchema, ReturnType<typeof TypeBoxSchema.Compile>>();\n\nconst aikitValidatorFor = <T extends TSchema>(schema: T): ReturnType<typeof TypeBoxSchema.Compile<T>> => {\n\tconst cached = aikitValidators.get(schema) as ReturnType<typeof TypeBoxSchema.Compile<T>> | undefined;\n\tif (cached !== undefined) return cached;\n\tconst compiled = TypeBoxSchema.Compile(schema);\n\taikitValidators.set(schema, compiled);\n\treturn compiled;\n};\n\nconst aikitErrorPath = (error: {\n\treadonly instancePath?: string;\n\treadonly params?: Record<string, unknown>;\n}): string => {\n\tif (error.instancePath) return error.instancePath.substring(1);\n\tconst required = error.params?.requiredProperties;\n\treturn Array.isArray(required) ? required.join(\", \") : \"root\";\n};\n\nconst validateAikitSchema = <T extends TSchema>(schema: T, value: unknown, label: string): Static<T> => {\n\tconst validator = aikitValidatorFor(schema);\n\tif (validator.Check(value)) return value;\n\n\tconst [, issues] = validator.Errors(value);\n\tconst details = issues.map((issue) => ` - ${aikitErrorPath(issue)}: ${issue.message}`).join(\"\\n\") || \"unknown error\";\n\tthrow new Error(`validation failed for ${label}\\n${details}`);\n};\n\n/** Validate an aikit message without coercing or rewriting durable data. */\nexport const validateAikitMessage = (value: unknown, label: string): Message.Message =>\n\tvalidateAikitSchema(Message.MessageSchema, value, label);\n\nexport const validateAikitUserMessage = (value: unknown, label: string): Message.UserMessage =>\n\tvalidateAikitSchema(Message.UserMessageSchema, value, label);\n\nexport const validateAikitAssistantMessage = (value: unknown, label: string): Message.AssistantMessage =>\n\tvalidateAikitSchema(Message.AssistantMessageSchema, value, label);\n\nexport const validateAikitAssistantPart = (value: unknown, label: string): Message.AssistantMessage[\"parts\"][number] =>\n\tvalidateAikitSchema(Message.AssistantMessageSchema.properties.parts.items, value, label);\n\nexport const validateAikitToolCallTerminalPart = (value: unknown, label: string): Message.ToolCallTerminalPart =>\n\tvalidateAikitSchema(Message.ToolCallTerminalPartSchema, value, label);\n\nexport const validateAikitModelInfo = (value: unknown, label: string): Model.Info =>\n\tvalidateAikitSchema(Model.Info, value, label);\n\nexport const isAikitModelInfo = (value: unknown): value is Model.Info => aikitValidatorFor(Model.Info).Check(value);\n\nexport const isAikitAssistantMessage = (value: unknown): value is Message.AssistantMessage =>\n\taikitValidatorFor(Message.AssistantMessageSchema).Check(value);\n\nexport const isAikitAssistantPart = (value: unknown): value is Message.AssistantMessage[\"parts\"][number] =>\n\taikitValidatorFor(Message.AssistantMessageSchema.properties.parts.items).Check(value);\n\nexport const isAikitToolCallTerminalPart = (value: unknown): value is Message.ToolCallTerminalPart =>\n\taikitValidatorFor(Message.ToolCallTerminalPartSchema).Check(value);\n\n/**\n * Integer greater than zero.\n */\nexport const PositiveInt = Schema.Int.check(Schema.isGreaterThan(0));\n\n/**\n * Integer greater than or equal to zero.\n */\nexport const NonNegativeInt = Schema.Int.check(Schema.isGreaterThanOrEqualTo(0));\n\n/**\n * Cost greater than or equal with finite value\n */\nexport const NonNegativeCost = Schema.Finite.check(Schema.isGreaterThanOrEqualTo(0));\n\n/**\n * Absolute POSIX file path (e.g., `/home/user/projects/myapp/src/main.ts`).\n */\nexport const AbsolutePath = Schema.String.check(Schema.isPattern(/^\\//)).pipe(Schema.brand(\"AbsolutePath\"));\nexport type AbsolutePath = Schema.Schema.Type<typeof AbsolutePath>;\n\n/**\n * Optional public JSON field that can hold explicit `undefined` on the type\n * side but encodes it as an omitted key, matching legacy `JSON.stringify`.\n */\nexport const optional = <S extends Schema.Top>(schema: S) =>\n\tSchema.optionalKey(schema).pipe(\n\t\tSchema.decodeTo(Schema.optional(Schema.toType(schema)), {\n\t\t\tdecode: SchemaGetter.passthrough({ strict: false }),\n\t\t\tencode: SchemaGetter.transformOptional(Option.filter((value) => value !== undefined)),\n\t\t}),\n\t);\n\n/**\n * Strip `readonly` from a nested type. Stand-in for `effect`'s `Types.DeepMutable`\n * until `effect:core/x228my` (\"Types.DeepMutable widens unknown to `{}`\") lands.\n *\n * The upstream version falls through `unknown` into `{ -readonly [K in keyof T]: ... }`\n * where `keyof unknown = never`, so `unknown` collapses to `{}`. This local\n * version gates the object branch on `extends object` (which `unknown` does\n * not) so `unknown` passes through untouched.\n *\n * Primitive bailout matches upstream — without it, branded strings like\n * `string & Brand<\"SessionID\">` fall into the object branch and get their\n * prototype methods walked.\n *\n * Tuple branch preserves readonly tuples (e.g. `ConfigPlugin.Spec`'s\n * `readonly [string, Options]`); the general array branch would otherwise\n * widen them to unbounded arrays.\n */\nexport type DeepMutable<T> = T extends string | number | boolean | bigint | symbol | Function\n\t? T\n\t: T extends readonly [unknown, ...unknown[]]\n\t\t? { -readonly [K in keyof T]: DeepMutable<T[K]> }\n\t\t: T extends readonly (infer U)[]\n\t\t\t? DeepMutable<U>[]\n\t\t\t: T extends object\n\t\t\t\t? { -readonly [K in keyof T]: DeepMutable<T[K]> }\n\t\t\t\t: T;\n\n/**\n * Attach static methods to a schema object. Designed to be used with `.pipe()`:\n *\n * @example\n * export const Foo = fooSchema.pipe(\n * withStatics((schema) => ({\n * zero: schema.make(0),\n * from: Schema.decodeUnknownOption(schema),\n * }))\n * )\n */\nexport const withStatics =\n\t<S extends object, M extends Record<string, unknown>>(methods: (schema: S) => M) =>\n\t(schema: S): S & M =>\n\t\tObject.assign(schema, methods(schema));\n\n/**\n * Nominal wrapper for scalar types. The class itself is a valid schema —\n * pass it directly to `Schema.decode`, `Schema.decodeEffect`, etc.\n *\n * Overrides `~type.make` on the derived `Schema.Opaque` so `Schema.Schema.Type`\n * of a field using this newtype resolves to `Self` rather than the underlying\n * branded phantom. Without that override, passing a class instance to code\n * typed against `Schema.Schema.Type<FieldSchema>` would require a cast even\n * though the values are structurally equivalent at runtime.\n *\n * @example\n * class QuestionID extends Newtype<QuestionID>()(\"QuestionID\", Schema.String) {\n * static make(id: string): QuestionID {\n * return this.make(id)\n * }\n * }\n *\n * Schema.decodeEffect(QuestionID)(input)\n */\nexport function Newtype<Self>() {\n\treturn <const Tag extends string, S extends Schema.Top>(tag: Tag, schema: S) => {\n\t\tabstract class Base {\n\t\t\tdeclare readonly _newtype: Tag;\n\n\t\t\tstatic make(value: Schema.Schema.Type<S>): Self {\n\t\t\t\treturn value as unknown as Self;\n\t\t\t}\n\t\t}\n\n\t\tObject.setPrototypeOf(Base, schema);\n\n\t\treturn Base as unknown as (abstract new (_: never) => { readonly _newtype: Tag }) & {\n\t\t\treadonly make: (value: Schema.Schema.Type<S>) => Self;\n\t\t} & Omit<Schema.Opaque<Self, S, {}>, \"make\" | \"~type.make\"> & {\n\t\t\t\treadonly \"~type.make\": Self;\n\t\t\t};\n\t};\n}\n\nexport const DateTimeUtcFromMillis = Schema.Finite.pipe(\n\tSchema.decodeTo(Schema.DateTimeUtc, {\n\t\tdecode: SchemaGetter.transform((value) => DateTime.makeUnsafe(value)),\n\t\tencode: SchemaGetter.transform((value) => DateTime.toEpochMillis(value)),\n\t}),\n);\n"],"mappings":"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"}