@codeworksh/plugin 0.3.0-canary.82.1.g33702b61 → 0.3.0-canary.83.1.g5b425b57

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
@@ -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
+ type: "text";
606
+ text: string;
607
+ textSignature?: string;
608
+ } | {
609
+ type: "image";
610
+ data: string;
611
+ mimeType: string;
612
+ } | {
613
+ type: "thinking";
614
+ thinking: string;
615
+ thinkingSignature?: string;
616
+ redacted?: boolean;
617
+ } | {
618
+ arguments: Record<string, any>;
619
+ callID: string;
620
+ name: string;
621
+ namespace?: string;
622
+ partial?: {
623
+ content?: ({
624
+ type: "text";
625
+ text: string;
626
+ textSignature?: string;
627
+ } | {
628
+ type: "image";
629
+ data: string;
630
+ mimeType: string;
631
+ })[];
632
+ details?: any;
633
+ };
634
+ status: "running";
635
+ thoughtSignature?: string;
636
+ time: {
637
+ start: number;
638
+ end: number;
639
+ };
640
+ type: "toolCall";
641
+ } | {
642
+ arguments: Record<string, any>;
643
+ callID: string;
644
+ name: string;
645
+ namespace?: string;
646
+ result: {
647
+ content: ({
648
+ type: "text";
649
+ text: string;
650
+ textSignature?: string;
651
+ } | {
652
+ type: "image";
653
+ data: string;
654
+ mimeType: string;
655
+ })[];
656
+ details?: any;
657
+ isError: false;
658
+ };
659
+ status: "completed";
660
+ thoughtSignature?: string;
661
+ time: {
662
+ start: number;
663
+ end: number;
664
+ };
665
+ type: "toolCall";
666
+ } | {
667
+ arguments: Record<string, any>;
668
+ callID: string;
669
+ name: string;
670
+ namespace?: string;
671
+ result: {
672
+ content: ({
673
+ type: "text";
674
+ text: string;
675
+ textSignature?: string;
676
+ } | {
677
+ type: "image";
678
+ data: string;
679
+ mimeType: string;
680
+ })[];
681
+ details?: any;
682
+ isError: true;
683
+ };
684
+ status: "error";
685
+ thoughtSignature?: string;
686
+ time: {
687
+ start: number;
688
+ end: number;
689
+ };
690
+ type: "toolCall";
691
+ } | {
692
+ arguments: Record<string, any>;
693
+ callID: string;
694
+ name: string;
695
+ namespace?: string;
696
+ result: {
697
+ content: ({
698
+ type: "text";
699
+ text: string;
700
+ textSignature?: string;
701
+ } | {
702
+ type: "image";
703
+ data: string;
704
+ mimeType: string;
705
+ })[];
706
+ details?: any;
707
+ isError: true;
708
+ };
709
+ status: "skipped";
710
+ thoughtSignature?: string;
711
+ time: {
712
+ start: number;
713
+ end: number;
714
+ };
715
+ type: "toolCall";
716
+ } | {
717
+ arguments: Record<string, any>;
718
+ callID: string;
719
+ name: string;
720
+ namespace?: string;
721
+ result: {
722
+ content: ({
723
+ type: "text";
724
+ text: string;
725
+ textSignature?: string;
726
+ } | {
727
+ type: "image";
728
+ data: string;
729
+ mimeType: string;
730
+ })[];
731
+ details?: any;
732
+ isError: true;
733
+ };
734
+ status: "aborted";
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
+ type: "text";
756
+ text: string;
757
+ textSignature?: string;
758
+ } | {
759
+ type: "image";
760
+ data: string;
761
+ mimeType: string;
762
+ } | {
763
+ type: "thinking";
764
+ thinking: string;
765
+ thinkingSignature?: string;
766
+ redacted?: boolean;
767
+ } | {
768
+ arguments: Record<string, any>;
769
+ callID: string;
770
+ name: string;
771
+ namespace?: string;
772
+ partial?: {
773
+ content?: ({
774
+ type: "text";
775
+ text: string;
776
+ textSignature?: string;
777
+ } | {
778
+ type: "image";
779
+ data: string;
780
+ mimeType: string;
781
+ })[];
782
+ details?: any;
783
+ };
784
+ status: "running";
785
+ thoughtSignature?: string;
786
+ time: {
787
+ start: number;
788
+ end: number;
789
+ };
790
+ type: "toolCall";
791
+ } | {
792
+ arguments: Record<string, any>;
793
+ callID: string;
794
+ name: string;
795
+ namespace?: string;
796
+ result: {
797
+ content: ({
798
+ type: "text";
799
+ text: string;
800
+ textSignature?: string;
801
+ } | {
802
+ type: "image";
803
+ data: string;
804
+ mimeType: string;
805
+ })[];
806
+ details?: any;
807
+ isError: false;
808
+ };
809
+ status: "completed";
810
+ thoughtSignature?: string;
811
+ time: {
812
+ start: number;
813
+ end: number;
814
+ };
815
+ type: "toolCall";
816
+ } | {
817
+ arguments: Record<string, any>;
818
+ callID: string;
819
+ name: string;
820
+ namespace?: string;
821
+ result: {
822
+ content: ({
823
+ type: "text";
824
+ text: string;
825
+ textSignature?: string;
826
+ } | {
827
+ type: "image";
828
+ data: string;
829
+ mimeType: string;
830
+ })[];
831
+ details?: any;
832
+ isError: true;
833
+ };
834
+ status: "error";
835
+ thoughtSignature?: string;
836
+ time: {
837
+ start: number;
838
+ end: number;
839
+ };
840
+ type: "toolCall";
841
+ } | {
842
+ arguments: Record<string, any>;
843
+ callID: string;
844
+ name: string;
845
+ namespace?: string;
846
+ result: {
847
+ content: ({
848
+ type: "text";
849
+ text: string;
850
+ textSignature?: string;
851
+ } | {
852
+ type: "image";
853
+ data: string;
854
+ mimeType: string;
855
+ })[];
856
+ details?: any;
857
+ isError: true;
858
+ };
859
+ status: "skipped";
860
+ thoughtSignature?: string;
861
+ time: {
862
+ start: number;
863
+ end: number;
864
+ };
865
+ type: "toolCall";
866
+ } | {
867
+ arguments: Record<string, any>;
868
+ callID: string;
869
+ name: string;
870
+ namespace?: string;
871
+ result: {
872
+ content: ({
873
+ type: "text";
874
+ text: string;
875
+ textSignature?: string;
876
+ } | {
877
+ type: "image";
878
+ data: string;
879
+ mimeType: string;
880
+ })[];
881
+ details?: any;
882
+ isError: true;
883
+ };
884
+ status: "aborted";
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-CE0D5YvD.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-CE0D5YvD.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-D_e29nKR.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.83.1.g5b425b57",
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.83.1.g5b425b57",
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-CE0D5YvD.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-D_e29nKR.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-D_e29nKR.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":";;;;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,8BAA8B,OAAgB,UAC1D,oBAAoB,QAAQ,uBAAuB,WAAW,MAAM,OAAO,OAAO,KAAK;AAExF,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,wBAAwB,UACpC,kBAAkB,QAAQ,uBAAuB,WAAW,MAAM,KAAK,CAAC,CAAC,MAAM,KAAK;AAErF,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"}