@oxygen-agent/cli 1.700.10 → 1.717.9

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.
Files changed (43) hide show
  1. package/README.md +1 -1
  2. package/dist/help.js +2 -0
  3. package/dist/http-client.js +11 -1
  4. package/dist/index.js +523 -85
  5. package/dist/transcript.js +2 -2
  6. package/node_modules/@oxygen/recipe-sdk/dist/index.d.ts +4 -0
  7. package/node_modules/@oxygen/shared/dist/billing.d.ts +1 -1
  8. package/node_modules/@oxygen/shared/dist/billing.js +7 -6
  9. package/node_modules/@oxygen/shared/dist/dnc-identities.d.ts +53 -0
  10. package/node_modules/@oxygen/shared/dist/dnc-identities.js +175 -0
  11. package/node_modules/@oxygen/shared/dist/file-import.d.ts +36 -1
  12. package/node_modules/@oxygen/shared/dist/file-import.js +80 -1
  13. package/node_modules/@oxygen/shared/dist/image-sniff.d.ts +39 -0
  14. package/node_modules/@oxygen/shared/dist/image-sniff.js +75 -0
  15. package/node_modules/@oxygen/shared/dist/import-limits.d.ts +28 -0
  16. package/node_modules/@oxygen/shared/dist/import-limits.js +30 -0
  17. package/node_modules/@oxygen/shared/dist/index.d.ts +2 -0
  18. package/node_modules/@oxygen/shared/dist/index.js +2 -0
  19. package/node_modules/@oxygen/shared/dist/mailbox-import.d.ts +10 -4
  20. package/node_modules/@oxygen/shared/dist/mailbox-import.js +18 -10
  21. package/node_modules/@oxygen/shared/dist/member-columns.d.ts +64 -0
  22. package/node_modules/@oxygen/shared/dist/member-columns.js +111 -0
  23. package/node_modules/@oxygen/shared/dist/object-storage.d.ts +65 -0
  24. package/node_modules/@oxygen/shared/dist/object-storage.js +100 -0
  25. package/node_modules/@oxygen/shared/dist/plan-limits.d.ts +2 -1
  26. package/node_modules/@oxygen/shared/dist/plan-limits.js +12 -2
  27. package/node_modules/@oxygen/shared/dist/spend-safety.d.ts +9 -0
  28. package/node_modules/@oxygen/shared/dist/spend-safety.js +10 -0
  29. package/node_modules/@oxygen/shared/dist/version.d.ts +1 -1
  30. package/node_modules/@oxygen/shared/dist/version.js +1 -1
  31. package/node_modules/@oxygen/shared/package.json +20 -0
  32. package/node_modules/@oxygen/workflows/dist/graph/lint.js +79 -11
  33. package/node_modules/@oxygen/workflows/dist/graph/manifest-schema.d.ts +679 -0
  34. package/node_modules/@oxygen/workflows/dist/graph/manifest-schema.js +80 -1
  35. package/node_modules/@oxygen/workflows/dist/graph/remap.js +8 -1
  36. package/node_modules/@oxygen/workflows/dist/graph/types.d.ts +72 -3
  37. package/node_modules/@oxygen/workflows/dist/graph/types.js +12 -0
  38. package/node_modules/@oxygen/workflows/dist/index.d.ts +16 -0
  39. package/node_modules/@oxygen/workflows/dist/index.js +45 -3
  40. package/node_modules/@oxygen/workflows/dist/portable.d.ts +43 -0
  41. package/node_modules/@oxygen/workflows/dist/portable.js +319 -0
  42. package/node_modules/@oxygen/workflows/dist/usage-estimate.js +18 -4
  43. package/package.json +1 -1
@@ -147,6 +147,15 @@ export declare const workflowGraphManifestSchema: {
147
147
  readonly required: readonly ["type"];
148
148
  };
149
149
  };
150
+ readonly payload_source: {
151
+ readonly type: "string";
152
+ readonly description: "Imported v1 tool nodes only: sandboxed payload function preserved until converted to mapped params.";
153
+ };
154
+ readonly legacy_context: {
155
+ readonly type: "string";
156
+ readonly enum: readonly ["v1"];
157
+ readonly description: "Imported v1 source receives the original raw-step-output context shape.";
158
+ };
150
159
  readonly when: {
151
160
  readonly type: "object";
152
161
  readonly description: "A structured predicate: { type: 'group', op: 'all' | 'any', not?: boolean, children: [...] } or { type: 'compare', left, op, right? }. 'is_empty' / 'is_not_empty' take no right operand.";
@@ -429,6 +438,40 @@ export declare const workflowGraphManifestSchema: {
429
438
  readonly type: "string";
430
439
  readonly description: "code nodes: sandboxed pure-function source.";
431
440
  };
441
+ readonly recipe: {
442
+ readonly type: "object";
443
+ readonly description: "Imported durable-recipe code nodes: the complete executable recipe manifest. Exactly one of run_source or recipe is required.";
444
+ readonly additionalProperties: true;
445
+ };
446
+ readonly configuration: {
447
+ readonly type: "object";
448
+ readonly description: "Imported durable-recipe code nodes: configuration field -> value ref.";
449
+ readonly additionalProperties: {
450
+ readonly type: "object";
451
+ readonly description: "How a node input is bound at run time. Scope paths are 'trigger.input.x', 'steps.<node_id>.output.y', or 'loop.<loop_node_id>.item.z'.";
452
+ readonly properties: {
453
+ readonly type: {
454
+ readonly enum: readonly ["literal", "template", "ref", "formula", "context_profile", "context_asset"];
455
+ };
456
+ readonly value: {
457
+ readonly description: "literal: used verbatim. template: interpolated string, e.g. 'Hi {{ steps.find.output.first_name }}'.";
458
+ };
459
+ readonly path: {
460
+ readonly type: "string";
461
+ readonly description: "ref: a scope path. context_*: an optional path inside the context value.";
462
+ };
463
+ readonly expression: {
464
+ readonly type: "string";
465
+ readonly description: "formula: an OXYGEN formula-language expression.";
466
+ };
467
+ readonly assetId: {
468
+ readonly type: "string";
469
+ readonly description: "context_asset: the Knowledge-layer asset id.";
470
+ };
471
+ };
472
+ readonly required: readonly ["type"];
473
+ };
474
+ };
432
475
  readonly workflow_id: {
433
476
  readonly type: "string";
434
477
  readonly description: "workflow nodes: the child workflow to run.";
@@ -504,3 +547,639 @@ export declare const workflowGraphManifestSchema: {
504
547
  };
505
548
  readonly required: readonly ["manifest_version", "workflow", "nodes", "edges", "source_hash", "compiler_version"];
506
549
  };
550
+ export declare const portableWorkflowDefinitionSchema: {
551
+ readonly $schema: "https://json-schema.org/draft/2020-12/schema";
552
+ readonly title: "OXYGEN Portable Workflow Definition";
553
+ readonly description: "A portable, editable oxygen-workflows-v2 graph. It never contains source-workspace connection UUIDs or standing trigger authority.";
554
+ readonly type: "object";
555
+ readonly additionalProperties: false;
556
+ readonly properties: {
557
+ readonly kind: {
558
+ readonly const: "oxygen-workflow-definition";
559
+ };
560
+ readonly definition_version: {
561
+ readonly const: 1;
562
+ };
563
+ readonly graph: {
564
+ readonly $schema: "https://json-schema.org/draft/2020-12/schema";
565
+ readonly title: "OXYGEN Workflow Graph Manifest (oxygen-workflows-v2)";
566
+ readonly description: "A node + edge workflow graph. Exactly one trigger node; every node reachable from it; cycles are illegal except a single back-edge from inside a loop's body to that loop node.";
567
+ readonly type: "object";
568
+ readonly additionalProperties: true;
569
+ readonly properties: {
570
+ readonly manifest_version: {
571
+ readonly const: 2;
572
+ };
573
+ readonly compiler_version: {
574
+ readonly const: "oxygen-workflows-v2";
575
+ };
576
+ readonly workflow: {
577
+ readonly type: "object";
578
+ readonly properties: {
579
+ readonly id: {
580
+ readonly type: "string";
581
+ };
582
+ readonly name: {
583
+ readonly type: "string";
584
+ };
585
+ readonly status: {
586
+ readonly enum: readonly ["active", "disabled"];
587
+ };
588
+ };
589
+ readonly required: readonly ["id", "name"];
590
+ };
591
+ readonly specification: {
592
+ readonly type: "string";
593
+ };
594
+ readonly trigger: {
595
+ readonly type: "object";
596
+ readonly additionalProperties: true;
597
+ readonly description: "See the 'trigger' schema subject.";
598
+ };
599
+ readonly input_schema: {
600
+ readonly type: "object";
601
+ readonly additionalProperties: true;
602
+ };
603
+ readonly nodes: {
604
+ readonly type: "array";
605
+ readonly items: {
606
+ readonly type: "object";
607
+ readonly additionalProperties: true;
608
+ readonly properties: {
609
+ readonly id: {
610
+ readonly type: "string";
611
+ readonly description: "Unique node id. Becomes a key on the run scope ('steps.<id>.output'), so '__proto__', 'constructor' and 'prototype' are rejected.";
612
+ };
613
+ readonly name: {
614
+ readonly type: "string";
615
+ };
616
+ readonly description: {
617
+ readonly type: "string";
618
+ };
619
+ readonly kind: {
620
+ readonly enum: readonly ["trigger", "tool", "filter", "switch", "loop", "merge", "set", "wait", "approval", "code", "workflow"];
621
+ };
622
+ readonly ui: {
623
+ readonly type: "object";
624
+ readonly description: "Canvas position. Presentation only — it never affects execution order.";
625
+ readonly properties: {
626
+ readonly x: {
627
+ readonly type: "number";
628
+ };
629
+ readonly y: {
630
+ readonly type: "number";
631
+ };
632
+ };
633
+ readonly required: readonly ["x", "y"];
634
+ };
635
+ readonly disabled: {
636
+ readonly type: "boolean";
637
+ readonly description: "Kept in the graph but skipped at run time.";
638
+ };
639
+ readonly continue_on_error: {
640
+ readonly type: "boolean";
641
+ readonly description: "Route failures to the 'error' handle instead of failing the run.";
642
+ };
643
+ readonly retry: {
644
+ readonly type: "object";
645
+ readonly description: string;
646
+ readonly properties: {
647
+ readonly max_attempts: {
648
+ readonly type: "integer";
649
+ readonly minimum: 1;
650
+ readonly maximum: 5;
651
+ readonly description: "Attempts for this node, counting the first.";
652
+ };
653
+ readonly wait_seconds: {
654
+ readonly type: "number";
655
+ readonly minimum: 0;
656
+ readonly maximum: 3600;
657
+ readonly description: "Fixed pause between attempts. Omit to use the run's own backoff.";
658
+ };
659
+ };
660
+ readonly required: readonly ["max_attempts"];
661
+ };
662
+ readonly tool: {
663
+ readonly type: "string";
664
+ readonly description: "tool nodes: the tool id to call.";
665
+ };
666
+ readonly effect: {
667
+ readonly enum: readonly ["none", "external_read", "external_write"];
668
+ readonly description: "tool nodes: must equal the tool's canonical effect.";
669
+ };
670
+ readonly mode: {
671
+ readonly enum: readonly ["dry_run", "live", "smoke_test"];
672
+ };
673
+ readonly connection_id: {
674
+ readonly type: "string";
675
+ readonly minLength: 1;
676
+ readonly description: "tool nodes: optional active organization connection id to pin for execution.";
677
+ };
678
+ readonly max_credits: {
679
+ readonly type: "number";
680
+ readonly exclusiveMinimum: 0;
681
+ readonly description: "Per-node managed-credit ceiling.";
682
+ };
683
+ readonly params: {
684
+ readonly type: "object";
685
+ readonly description: "tool nodes: parameter name -> value ref.";
686
+ readonly additionalProperties: {
687
+ readonly type: "object";
688
+ readonly description: "How a node input is bound at run time. Scope paths are 'trigger.input.x', 'steps.<node_id>.output.y', or 'loop.<loop_node_id>.item.z'.";
689
+ readonly properties: {
690
+ readonly type: {
691
+ readonly enum: readonly ["literal", "template", "ref", "formula", "context_profile", "context_asset"];
692
+ };
693
+ readonly value: {
694
+ readonly description: "literal: used verbatim. template: interpolated string, e.g. 'Hi {{ steps.find.output.first_name }}'.";
695
+ };
696
+ readonly path: {
697
+ readonly type: "string";
698
+ readonly description: "ref: a scope path. context_*: an optional path inside the context value.";
699
+ };
700
+ readonly expression: {
701
+ readonly type: "string";
702
+ readonly description: "formula: an OXYGEN formula-language expression.";
703
+ };
704
+ readonly assetId: {
705
+ readonly type: "string";
706
+ readonly description: "context_asset: the Knowledge-layer asset id.";
707
+ };
708
+ };
709
+ readonly required: readonly ["type"];
710
+ };
711
+ };
712
+ readonly payload_source: {
713
+ readonly type: "string";
714
+ readonly description: "Imported v1 tool nodes only: sandboxed payload function preserved until converted to mapped params.";
715
+ };
716
+ readonly legacy_context: {
717
+ readonly type: "string";
718
+ readonly enum: readonly ["v1"];
719
+ readonly description: "Imported v1 source receives the original raw-step-output context shape.";
720
+ };
721
+ readonly when: {
722
+ readonly type: "object";
723
+ readonly description: "A structured predicate: { type: 'group', op: 'all' | 'any', not?: boolean, children: [...] } or { type: 'compare', left, op, right? }. 'is_empty' / 'is_not_empty' take no right operand.";
724
+ readonly properties: {
725
+ readonly type: {
726
+ readonly enum: readonly ["group", "compare"];
727
+ };
728
+ readonly op: {
729
+ readonly enum: readonly ["all", "any", "eq", "neq", "gt", "gte", "lt", "lte", "contains", "not_contains", "starts_with", "ends_with", "is_empty", "is_not_empty", "in", "not_in", "matches"];
730
+ };
731
+ readonly not: {
732
+ readonly type: "boolean";
733
+ };
734
+ readonly children: {
735
+ readonly type: "array";
736
+ readonly items: {
737
+ readonly type: "object";
738
+ readonly additionalProperties: true;
739
+ };
740
+ };
741
+ readonly left: {
742
+ readonly type: "object";
743
+ readonly description: "How a node input is bound at run time. Scope paths are 'trigger.input.x', 'steps.<node_id>.output.y', or 'loop.<loop_node_id>.item.z'.";
744
+ readonly properties: {
745
+ readonly type: {
746
+ readonly enum: readonly ["literal", "template", "ref", "formula", "context_profile", "context_asset"];
747
+ };
748
+ readonly value: {
749
+ readonly description: "literal: used verbatim. template: interpolated string, e.g. 'Hi {{ steps.find.output.first_name }}'.";
750
+ };
751
+ readonly path: {
752
+ readonly type: "string";
753
+ readonly description: "ref: a scope path. context_*: an optional path inside the context value.";
754
+ };
755
+ readonly expression: {
756
+ readonly type: "string";
757
+ readonly description: "formula: an OXYGEN formula-language expression.";
758
+ };
759
+ readonly assetId: {
760
+ readonly type: "string";
761
+ readonly description: "context_asset: the Knowledge-layer asset id.";
762
+ };
763
+ };
764
+ readonly required: readonly ["type"];
765
+ };
766
+ readonly right: {
767
+ readonly type: "object";
768
+ readonly description: "How a node input is bound at run time. Scope paths are 'trigger.input.x', 'steps.<node_id>.output.y', or 'loop.<loop_node_id>.item.z'.";
769
+ readonly properties: {
770
+ readonly type: {
771
+ readonly enum: readonly ["literal", "template", "ref", "formula", "context_profile", "context_asset"];
772
+ };
773
+ readonly value: {
774
+ readonly description: "literal: used verbatim. template: interpolated string, e.g. 'Hi {{ steps.find.output.first_name }}'.";
775
+ };
776
+ readonly path: {
777
+ readonly type: "string";
778
+ readonly description: "ref: a scope path. context_*: an optional path inside the context value.";
779
+ };
780
+ readonly expression: {
781
+ readonly type: "string";
782
+ readonly description: "formula: an OXYGEN formula-language expression.";
783
+ };
784
+ readonly assetId: {
785
+ readonly type: "string";
786
+ readonly description: "context_asset: the Knowledge-layer asset id.";
787
+ };
788
+ };
789
+ readonly required: readonly ["type"];
790
+ };
791
+ };
792
+ readonly required: readonly ["type"];
793
+ };
794
+ readonly cases: {
795
+ readonly type: "array";
796
+ readonly description: "switch nodes: each case id names the outgoing edge handle it owns.";
797
+ readonly items: {
798
+ readonly type: "object";
799
+ readonly properties: {
800
+ readonly id: {
801
+ readonly type: "string";
802
+ };
803
+ readonly label: {
804
+ readonly type: "string";
805
+ };
806
+ readonly when: {
807
+ readonly type: "object";
808
+ readonly description: "A structured predicate: { type: 'group', op: 'all' | 'any', not?: boolean, children: [...] } or { type: 'compare', left, op, right? }. 'is_empty' / 'is_not_empty' take no right operand.";
809
+ readonly properties: {
810
+ readonly type: {
811
+ readonly enum: readonly ["group", "compare"];
812
+ };
813
+ readonly op: {
814
+ readonly enum: readonly ["all", "any", "eq", "neq", "gt", "gte", "lt", "lte", "contains", "not_contains", "starts_with", "ends_with", "is_empty", "is_not_empty", "in", "not_in", "matches"];
815
+ };
816
+ readonly not: {
817
+ readonly type: "boolean";
818
+ };
819
+ readonly children: {
820
+ readonly type: "array";
821
+ readonly items: {
822
+ readonly type: "object";
823
+ readonly additionalProperties: true;
824
+ };
825
+ };
826
+ readonly left: {
827
+ readonly type: "object";
828
+ readonly description: "How a node input is bound at run time. Scope paths are 'trigger.input.x', 'steps.<node_id>.output.y', or 'loop.<loop_node_id>.item.z'.";
829
+ readonly properties: {
830
+ readonly type: {
831
+ readonly enum: readonly ["literal", "template", "ref", "formula", "context_profile", "context_asset"];
832
+ };
833
+ readonly value: {
834
+ readonly description: "literal: used verbatim. template: interpolated string, e.g. 'Hi {{ steps.find.output.first_name }}'.";
835
+ };
836
+ readonly path: {
837
+ readonly type: "string";
838
+ readonly description: "ref: a scope path. context_*: an optional path inside the context value.";
839
+ };
840
+ readonly expression: {
841
+ readonly type: "string";
842
+ readonly description: "formula: an OXYGEN formula-language expression.";
843
+ };
844
+ readonly assetId: {
845
+ readonly type: "string";
846
+ readonly description: "context_asset: the Knowledge-layer asset id.";
847
+ };
848
+ };
849
+ readonly required: readonly ["type"];
850
+ };
851
+ readonly right: {
852
+ readonly type: "object";
853
+ readonly description: "How a node input is bound at run time. Scope paths are 'trigger.input.x', 'steps.<node_id>.output.y', or 'loop.<loop_node_id>.item.z'.";
854
+ readonly properties: {
855
+ readonly type: {
856
+ readonly enum: readonly ["literal", "template", "ref", "formula", "context_profile", "context_asset"];
857
+ };
858
+ readonly value: {
859
+ readonly description: "literal: used verbatim. template: interpolated string, e.g. 'Hi {{ steps.find.output.first_name }}'.";
860
+ };
861
+ readonly path: {
862
+ readonly type: "string";
863
+ readonly description: "ref: a scope path. context_*: an optional path inside the context value.";
864
+ };
865
+ readonly expression: {
866
+ readonly type: "string";
867
+ readonly description: "formula: an OXYGEN formula-language expression.";
868
+ };
869
+ readonly assetId: {
870
+ readonly type: "string";
871
+ readonly description: "context_asset: the Knowledge-layer asset id.";
872
+ };
873
+ };
874
+ readonly required: readonly ["type"];
875
+ };
876
+ };
877
+ readonly required: readonly ["type"];
878
+ };
879
+ };
880
+ readonly required: readonly ["id", "label", "when"];
881
+ };
882
+ };
883
+ readonly fallthrough: {
884
+ readonly type: "boolean";
885
+ readonly description: "switch nodes: fire every matching case, not only the first.";
886
+ };
887
+ readonly over: {
888
+ readonly type: "object";
889
+ readonly description: "How a node input is bound at run time. Scope paths are 'trigger.input.x', 'steps.<node_id>.output.y', or 'loop.<loop_node_id>.item.z'.";
890
+ readonly properties: {
891
+ readonly type: {
892
+ readonly enum: readonly ["literal", "template", "ref", "formula", "context_profile", "context_asset"];
893
+ };
894
+ readonly value: {
895
+ readonly description: "literal: used verbatim. template: interpolated string, e.g. 'Hi {{ steps.find.output.first_name }}'.";
896
+ };
897
+ readonly path: {
898
+ readonly type: "string";
899
+ readonly description: "ref: a scope path. context_*: an optional path inside the context value.";
900
+ };
901
+ readonly expression: {
902
+ readonly type: "string";
903
+ readonly description: "formula: an OXYGEN formula-language expression.";
904
+ };
905
+ readonly assetId: {
906
+ readonly type: "string";
907
+ readonly description: "context_asset: the Knowledge-layer asset id.";
908
+ };
909
+ };
910
+ readonly required: readonly ["type"];
911
+ };
912
+ readonly item_name: {
913
+ readonly type: "string";
914
+ };
915
+ readonly max_iterations: {
916
+ readonly type: "integer";
917
+ readonly exclusiveMinimum: 0;
918
+ readonly description: "loop nodes: declared iteration cap. Without it the workflow's automation-action estimate can only assume a single pass, and cron cadence checks treat the run cost as unbounded.";
919
+ };
920
+ readonly concurrency: {
921
+ readonly type: "integer";
922
+ readonly exclusiveMinimum: 0;
923
+ };
924
+ readonly strategy: {
925
+ readonly enum: readonly ["append", "first", "wait_all"];
926
+ readonly description: "merge nodes: how inbound branches are joined.";
927
+ };
928
+ readonly fields: {
929
+ readonly type: "array";
930
+ readonly description: "set nodes: the object built from bound fields.";
931
+ readonly items: {
932
+ readonly type: "object";
933
+ readonly properties: {
934
+ readonly key: {
935
+ readonly type: "string";
936
+ };
937
+ readonly value: {
938
+ readonly type: "object";
939
+ readonly description: "How a node input is bound at run time. Scope paths are 'trigger.input.x', 'steps.<node_id>.output.y', or 'loop.<loop_node_id>.item.z'.";
940
+ readonly properties: {
941
+ readonly type: {
942
+ readonly enum: readonly ["literal", "template", "ref", "formula", "context_profile", "context_asset"];
943
+ };
944
+ readonly value: {
945
+ readonly description: "literal: used verbatim. template: interpolated string, e.g. 'Hi {{ steps.find.output.first_name }}'.";
946
+ };
947
+ readonly path: {
948
+ readonly type: "string";
949
+ readonly description: "ref: a scope path. context_*: an optional path inside the context value.";
950
+ };
951
+ readonly expression: {
952
+ readonly type: "string";
953
+ readonly description: "formula: an OXYGEN formula-language expression.";
954
+ };
955
+ readonly assetId: {
956
+ readonly type: "string";
957
+ readonly description: "context_asset: the Knowledge-layer asset id.";
958
+ };
959
+ };
960
+ readonly required: readonly ["type"];
961
+ };
962
+ };
963
+ readonly required: readonly ["key", "value"];
964
+ };
965
+ };
966
+ readonly keep_input: {
967
+ readonly type: "boolean";
968
+ };
969
+ readonly duration_seconds: {
970
+ readonly type: "number";
971
+ readonly exclusiveMinimum: 0;
972
+ readonly description: "wait nodes: exactly one of duration_seconds or until.";
973
+ };
974
+ readonly until: {
975
+ readonly type: "object";
976
+ readonly description: "How a node input is bound at run time. Scope paths are 'trigger.input.x', 'steps.<node_id>.output.y', or 'loop.<loop_node_id>.item.z'.";
977
+ readonly properties: {
978
+ readonly type: {
979
+ readonly enum: readonly ["literal", "template", "ref", "formula", "context_profile", "context_asset"];
980
+ };
981
+ readonly value: {
982
+ readonly description: "literal: used verbatim. template: interpolated string, e.g. 'Hi {{ steps.find.output.first_name }}'.";
983
+ };
984
+ readonly path: {
985
+ readonly type: "string";
986
+ readonly description: "ref: a scope path. context_*: an optional path inside the context value.";
987
+ };
988
+ readonly expression: {
989
+ readonly type: "string";
990
+ readonly description: "formula: an OXYGEN formula-language expression.";
991
+ };
992
+ readonly assetId: {
993
+ readonly type: "string";
994
+ readonly description: "context_asset: the Knowledge-layer asset id.";
995
+ };
996
+ };
997
+ readonly required: readonly ["type"];
998
+ };
999
+ readonly run_source: {
1000
+ readonly type: "string";
1001
+ readonly description: "code nodes: sandboxed pure-function source.";
1002
+ };
1003
+ readonly recipe: {
1004
+ readonly type: "object";
1005
+ readonly description: "Imported durable-recipe code nodes: the complete executable recipe manifest. Exactly one of run_source or recipe is required.";
1006
+ readonly additionalProperties: true;
1007
+ };
1008
+ readonly configuration: {
1009
+ readonly type: "object";
1010
+ readonly description: "Imported durable-recipe code nodes: configuration field -> value ref.";
1011
+ readonly additionalProperties: {
1012
+ readonly type: "object";
1013
+ readonly description: "How a node input is bound at run time. Scope paths are 'trigger.input.x', 'steps.<node_id>.output.y', or 'loop.<loop_node_id>.item.z'.";
1014
+ readonly properties: {
1015
+ readonly type: {
1016
+ readonly enum: readonly ["literal", "template", "ref", "formula", "context_profile", "context_asset"];
1017
+ };
1018
+ readonly value: {
1019
+ readonly description: "literal: used verbatim. template: interpolated string, e.g. 'Hi {{ steps.find.output.first_name }}'.";
1020
+ };
1021
+ readonly path: {
1022
+ readonly type: "string";
1023
+ readonly description: "ref: a scope path. context_*: an optional path inside the context value.";
1024
+ };
1025
+ readonly expression: {
1026
+ readonly type: "string";
1027
+ readonly description: "formula: an OXYGEN formula-language expression.";
1028
+ };
1029
+ readonly assetId: {
1030
+ readonly type: "string";
1031
+ readonly description: "context_asset: the Knowledge-layer asset id.";
1032
+ };
1033
+ };
1034
+ readonly required: readonly ["type"];
1035
+ };
1036
+ };
1037
+ readonly workflow_id: {
1038
+ readonly type: "string";
1039
+ readonly description: "workflow nodes: the child workflow to run.";
1040
+ };
1041
+ readonly input: {
1042
+ readonly type: "object";
1043
+ readonly description: "workflow nodes: child input name -> value ref.";
1044
+ readonly additionalProperties: {
1045
+ readonly type: "object";
1046
+ readonly description: "How a node input is bound at run time. Scope paths are 'trigger.input.x', 'steps.<node_id>.output.y', or 'loop.<loop_node_id>.item.z'.";
1047
+ readonly properties: {
1048
+ readonly type: {
1049
+ readonly enum: readonly ["literal", "template", "ref", "formula", "context_profile", "context_asset"];
1050
+ };
1051
+ readonly value: {
1052
+ readonly description: "literal: used verbatim. template: interpolated string, e.g. 'Hi {{ steps.find.output.first_name }}'.";
1053
+ };
1054
+ readonly path: {
1055
+ readonly type: "string";
1056
+ readonly description: "ref: a scope path. context_*: an optional path inside the context value.";
1057
+ };
1058
+ readonly expression: {
1059
+ readonly type: "string";
1060
+ readonly description: "formula: an OXYGEN formula-language expression.";
1061
+ };
1062
+ readonly assetId: {
1063
+ readonly type: "string";
1064
+ readonly description: "context_asset: the Knowledge-layer asset id.";
1065
+ };
1066
+ };
1067
+ readonly required: readonly ["type"];
1068
+ };
1069
+ };
1070
+ };
1071
+ readonly required: readonly ["id", "name", "kind", "ui"];
1072
+ };
1073
+ readonly minItems: 1;
1074
+ };
1075
+ readonly edges: {
1076
+ readonly type: "array";
1077
+ readonly items: {
1078
+ readonly type: "object";
1079
+ readonly additionalProperties: false;
1080
+ readonly properties: {
1081
+ readonly id: {
1082
+ readonly type: "string";
1083
+ };
1084
+ readonly source: {
1085
+ readonly type: "string";
1086
+ };
1087
+ readonly source_handle: {
1088
+ readonly type: "string";
1089
+ readonly description: "Which output of the source node this edge leaves from: a switch case id, 'loop_body', 'loop_done', 'error', or omitted for the default output.";
1090
+ };
1091
+ readonly target: {
1092
+ readonly type: "string";
1093
+ };
1094
+ };
1095
+ readonly required: readonly ["id", "source", "target"];
1096
+ };
1097
+ };
1098
+ readonly max_credits: {
1099
+ readonly type: "number";
1100
+ readonly exclusiveMinimum: 0;
1101
+ readonly description: "Per-RUN managed-credit ceiling.";
1102
+ };
1103
+ readonly source_hash: {
1104
+ readonly type: "string";
1105
+ };
1106
+ readonly created_at: {
1107
+ readonly type: "string";
1108
+ };
1109
+ };
1110
+ readonly required: readonly ["manifest_version", "workflow", "nodes", "edges", "source_hash", "compiler_version"];
1111
+ };
1112
+ readonly requirements: {
1113
+ readonly type: "object";
1114
+ readonly additionalProperties: false;
1115
+ readonly properties: {
1116
+ readonly connections: {
1117
+ readonly type: "array";
1118
+ readonly items: {
1119
+ readonly type: "object";
1120
+ readonly additionalProperties: false;
1121
+ readonly properties: {
1122
+ readonly binding_id: {
1123
+ readonly type: "string";
1124
+ readonly minLength: 1;
1125
+ };
1126
+ readonly integration_id: {
1127
+ readonly type: "string";
1128
+ readonly minLength: 1;
1129
+ };
1130
+ readonly node_ids: {
1131
+ readonly type: "array";
1132
+ readonly minItems: 1;
1133
+ readonly items: {
1134
+ readonly type: "string";
1135
+ readonly minLength: 1;
1136
+ };
1137
+ };
1138
+ readonly account_hint: {
1139
+ readonly type: "object";
1140
+ readonly additionalProperties: false;
1141
+ readonly properties: {
1142
+ readonly external_account_id: {
1143
+ readonly type: "string";
1144
+ };
1145
+ readonly display_name: {
1146
+ readonly type: "string";
1147
+ };
1148
+ readonly auth_scheme: {
1149
+ readonly type: "string";
1150
+ };
1151
+ };
1152
+ };
1153
+ };
1154
+ readonly required: readonly ["binding_id", "integration_id", "node_ids"];
1155
+ };
1156
+ };
1157
+ };
1158
+ readonly required: readonly ["connections"];
1159
+ };
1160
+ readonly exported_at: {
1161
+ readonly type: "string";
1162
+ readonly format: "date-time";
1163
+ };
1164
+ readonly exported_from: {
1165
+ readonly type: "object";
1166
+ readonly additionalProperties: false;
1167
+ readonly properties: {
1168
+ readonly workflow_slug: {
1169
+ readonly type: "string";
1170
+ };
1171
+ readonly revision_version: {
1172
+ readonly type: "integer";
1173
+ readonly minimum: 1;
1174
+ };
1175
+ readonly oxygen_version: {
1176
+ readonly type: "string";
1177
+ };
1178
+ };
1179
+ };
1180
+ readonly compiler_version: {
1181
+ readonly const: "oxygen-workflow-definition-v1";
1182
+ };
1183
+ };
1184
+ readonly required: readonly ["kind", "definition_version", "graph", "requirements", "exported_at", "compiler_version"];
1185
+ };