@deeeed/metamask-harness 0.23.0 → 0.24.0

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.
@@ -826,23 +826,38 @@
826
826
  "description": "Alias for order_type."
827
827
  },
828
828
  "limit_price": {
829
- "type": "string",
829
+ "type": [
830
+ "string",
831
+ "number"
832
+ ],
830
833
  "description": "Absolute resting limit price (limit orders). Takes precedence over offset_pct. Alias: price/limitPrice."
831
834
  },
832
835
  "limitPrice": {
833
- "type": "string",
836
+ "type": [
837
+ "string",
838
+ "number"
839
+ ],
834
840
  "description": "Alias for limit_price."
835
841
  },
836
842
  "price": {
837
- "type": "string",
843
+ "type": [
844
+ "string",
845
+ "number"
846
+ ],
838
847
  "description": "Alias for limit_price."
839
848
  },
840
849
  "offset_pct": {
841
- "type": "number",
850
+ "type": [
851
+ "string",
852
+ "number"
853
+ ],
842
854
  "description": "Limit price as a percent offset from live mid for plain limits, or from the trigger for *_limit orders. Plain limits default to -30 buy / +30 sell; trigger limits default to +1 buy / -1 sell so they are executable after activation. Alias: offsetPct."
843
855
  },
844
856
  "offsetPct": {
845
- "type": "number",
857
+ "type": [
858
+ "string",
859
+ "number"
860
+ ],
846
861
  "description": "Alias for offset_pct."
847
862
  },
848
863
  "amount": {
@@ -871,19 +886,31 @@
871
886
  "type": "number"
872
887
  },
873
888
  "trigger_price": {
874
- "type": "string",
889
+ "type": [
890
+ "string",
891
+ "number"
892
+ ],
875
893
  "description": "Absolute trigger price for stop_*/take_profit_* placements. Takes precedence over trigger_offset_pct. Alias: triggerPrice."
876
894
  },
877
895
  "triggerPrice": {
878
- "type": "string",
896
+ "type": [
897
+ "string",
898
+ "number"
899
+ ],
879
900
  "description": "Alias for trigger_price."
880
901
  },
881
902
  "trigger_offset_pct": {
882
- "type": "number",
903
+ "type": [
904
+ "string",
905
+ "number"
906
+ ],
883
907
  "description": "Trigger price as a percent offset from live mid (default keeps the trigger ~30% away so it does not fire during a proof). Alias: triggerOffsetPct."
884
908
  },
885
909
  "triggerOffsetPct": {
886
- "type": "number",
910
+ "type": [
911
+ "string",
912
+ "number"
913
+ ],
887
914
  "description": "Alias for trigger_offset_pct."
888
915
  },
889
916
  "reduce_only": {
@@ -895,40 +922,65 @@
895
922
  "description": "Alias for reduce_only."
896
923
  },
897
924
  "take_profit_price": {
898
- "type": "string",
925
+ "type": [
926
+ "string",
927
+ "number"
928
+ ],
899
929
  "description": "Attached take profit price. Alias: takeProfitPrice."
900
930
  },
901
931
  "takeProfitPrice": {
902
- "type": "string",
932
+ "type": [
933
+ "string",
934
+ "number"
935
+ ],
903
936
  "description": "Alias for take_profit_price."
904
937
  },
905
938
  "take_profit_size": {
906
- "type": "string",
939
+ "type": [
940
+ "string",
941
+ "number"
942
+ ],
907
943
  "description": "Quantity covered by the attached take profit (partial TP). Omit to cover the whole order. Alias: takeProfitSize."
908
944
  },
909
945
  "takeProfitSize": {
910
- "type": "string",
946
+ "type": [
947
+ "string",
948
+ "number"
949
+ ],
911
950
  "description": "Alias for take_profit_size."
912
951
  },
913
952
  "stop_loss_price": {
914
- "type": "string",
953
+ "type": [
954
+ "string",
955
+ "number"
956
+ ],
915
957
  "description": "Attached stop loss price. Alias: stopLossPrice."
916
958
  },
917
959
  "stopLossPrice": {
918
- "type": "string",
960
+ "type": [
961
+ "string",
962
+ "number"
963
+ ],
919
964
  "description": "Alias for stop_loss_price."
920
965
  },
921
966
  "stop_loss_size": {
922
- "type": "string",
967
+ "type": [
968
+ "string",
969
+ "number"
970
+ ],
923
971
  "description": "Quantity covered by the attached stop loss (partial SL). Omit to cover the whole order. Alias: stopLossSize."
924
972
  },
925
973
  "stopLossSize": {
926
- "type": "string",
974
+ "type": [
975
+ "string",
976
+ "number"
977
+ ],
927
978
  "description": "Alias for stop_loss_size."
928
979
  },
929
980
  "tpsl_linkage": {
930
981
  "type": "string",
931
982
  "enum": [
983
+ "",
932
984
  "none",
933
985
  "order",
934
986
  "position"
@@ -938,6 +990,7 @@
938
990
  "tpslLinkage": {
939
991
  "type": "string",
940
992
  "enum": [
993
+ "",
941
994
  "none",
942
995
  "order",
943
996
  "position"
@@ -963,6 +1016,7 @@
963
1016
  "time_in_force": {
964
1017
  "type": "string",
965
1018
  "enum": [
1019
+ "",
966
1020
  "GTC",
967
1021
  "ALO"
968
1022
  ],
@@ -971,6 +1025,7 @@
971
1025
  "timeInForce": {
972
1026
  "type": "string",
973
1027
  "enum": [
1028
+ "",
974
1029
  "GTC",
975
1030
  "ALO"
976
1031
  ],
@@ -983,6 +1038,38 @@
983
1038
  "postOnly": {
984
1039
  "type": "boolean",
985
1040
  "description": "Alias for post_only."
1041
+ },
1042
+ "expect_error": {
1043
+ "type": "string",
1044
+ "description": "Typed controller error code this call must be refused with, e.g. ORDER_TPSL_SIZE_INVALID. The refusal must carry the code as data: a message that merely mentions it does not match. Empty expects the call to succeed."
1045
+ },
1046
+ "take_profit_offset_pct": {
1047
+ "type": [
1048
+ "string",
1049
+ "number"
1050
+ ],
1051
+ "description": "Attached take profit price as a percentage from live mid. Preferred over take_profit_price: it holds across markets and over time."
1052
+ },
1053
+ "takeProfitOffsetPct": {
1054
+ "type": [
1055
+ "string",
1056
+ "number"
1057
+ ],
1058
+ "description": "camelCase alias of take_profit_offset_pct."
1059
+ },
1060
+ "stop_loss_offset_pct": {
1061
+ "type": [
1062
+ "string",
1063
+ "number"
1064
+ ],
1065
+ "description": "Attached stop loss price as a percentage from live mid. Preferred over stop_loss_price for the same reason."
1066
+ },
1067
+ "stopLossOffsetPct": {
1068
+ "type": [
1069
+ "string",
1070
+ "number"
1071
+ ],
1072
+ "description": "camelCase alias of stop_loss_offset_pct."
986
1073
  }
987
1074
  },
988
1075
  "additionalProperties": false
@@ -1109,6 +1196,10 @@
1109
1196
  "mainnet"
1110
1197
  ],
1111
1198
  "description": "Venue to act on. Defaults to testnet. Mainnet uses REAL funds: reads work with network=mainnet alone, while signing additionally requires CORE_PERPS_ALLOW_MAINNET_WRITES=1 in the environment."
1199
+ },
1200
+ "expect_error": {
1201
+ "type": "string",
1202
+ "description": "Typed controller error code this call must be refused with, e.g. ORDER_TPSL_SIZE_INVALID. The refusal must carry the code as data: a message that merely mentions it does not match. Empty expects the call to succeed."
1112
1203
  }
1113
1204
  },
1114
1205
  "additionalProperties": false
@@ -1233,6 +1324,20 @@
1233
1324
  },
1234
1325
  "timeout_ms": {
1235
1326
  "type": "number"
1327
+ },
1328
+ "expect_count": {
1329
+ "type": [
1330
+ "string",
1331
+ "number"
1332
+ ],
1333
+ "description": "Assert the exact number of matching items. Stronger than the default at-least-one check: it catches a replace that added an order beside the previous one instead of sweeping it."
1334
+ },
1335
+ "expectCount": {
1336
+ "type": [
1337
+ "string",
1338
+ "number"
1339
+ ],
1340
+ "description": "camelCase alias of expect_count."
1236
1341
  }
1237
1342
  },
1238
1343
  "required": [
@@ -1495,6 +1600,10 @@
1495
1600
  "mainnet"
1496
1601
  ],
1497
1602
  "description": "Venue to act on. Defaults to testnet. Mainnet uses REAL funds: reads work with network=mainnet alone, while signing additionally requires CORE_PERPS_ALLOW_MAINNET_WRITES=1 in the environment."
1603
+ },
1604
+ "expect_error": {
1605
+ "type": "string",
1606
+ "description": "Typed controller error code this call must be refused with, e.g. ORDER_TPSL_SIZE_INVALID. The refusal must carry the code as data: a message that merely mentions it does not match. Empty expects the call to succeed."
1498
1607
  }
1499
1608
  },
1500
1609
  "additionalProperties": false
@@ -1633,7 +1742,10 @@
1633
1742
  "description": "Require every matching order to be this trigger placement type (read back from the exchange)."
1634
1743
  },
1635
1744
  "expect_trigger_price": {
1636
- "type": "string",
1745
+ "type": [
1746
+ "string",
1747
+ "number"
1748
+ ],
1637
1749
  "description": "Require every matching order to carry this trigger price."
1638
1750
  },
1639
1751
  "expect_execution": {
@@ -1649,12 +1761,57 @@
1649
1761
  "description": "Require the reduce-only flag on every matching order."
1650
1762
  },
1651
1763
  "expect_size": {
1652
- "type": "string",
1764
+ "type": [
1765
+ "string",
1766
+ "number"
1767
+ ],
1653
1768
  "description": "Require this size on every matching order (proves a partial TP/SL quantity)."
1654
1769
  },
1655
1770
  "only_trigger_orders": {
1656
1771
  "type": "boolean",
1657
1772
  "description": "Consider only trigger orders (stop / take profit) on the selected market, so expectations are not applied to a plain parent order resting alongside them. Alias: onlyTriggerOrders."
1773
+ },
1774
+ "expect_count": {
1775
+ "type": [
1776
+ "string",
1777
+ "number"
1778
+ ],
1779
+ "description": "Assert the exact number of matching items. Stronger than the default at-least-one check: it catches a replace that added an order beside the previous one instead of sweeping it."
1780
+ },
1781
+ "expectCount": {
1782
+ "type": [
1783
+ "string",
1784
+ "number"
1785
+ ],
1786
+ "description": "camelCase alias of expect_count."
1787
+ },
1788
+ "expect_take_profit_child": {
1789
+ "type": [
1790
+ "string",
1791
+ "boolean"
1792
+ ],
1793
+ "description": "Assert a matching order exposes takeProfitOrderId, and that the take profit child it names is live as a reduce-only trigger. Proves the child was linked, which a count cannot."
1794
+ },
1795
+ "expect_stop_loss_child": {
1796
+ "type": [
1797
+ "string",
1798
+ "boolean"
1799
+ ],
1800
+ "description": "Assert a matching order exposes stopLossOrderId, and that the stop loss child it names is live as a reduce-only trigger. Proves the child was linked, which a count cannot."
1801
+ },
1802
+ "expectTakeProfitChild": {
1803
+ "type": [
1804
+ "string",
1805
+ "boolean"
1806
+ ],
1807
+ "description": "Alias for expect_take_profit_child."
1808
+ },
1809
+ "expectStopLossChild": {
1810
+ "type": [
1811
+ "string",
1812
+ "boolean"
1813
+ ],
1814
+ "description": "Alias for expect_stop_loss_child."
1658
1815
  }
1659
1816
  },
1660
1817
  "required": [
@@ -2488,35 +2645,59 @@
2488
2645
  "description": "Optional structured selector with mode and symbols/markets."
2489
2646
  },
2490
2647
  "take_profit_price": {
2491
- "type": "string",
2648
+ "type": [
2649
+ "string",
2650
+ "number"
2651
+ ],
2492
2652
  "description": "Take profit trigger price. Omit to leave the take profit unset. Alias: takeProfitPrice."
2493
2653
  },
2494
2654
  "takeProfitPrice": {
2495
- "type": "string",
2655
+ "type": [
2656
+ "string",
2657
+ "number"
2658
+ ],
2496
2659
  "description": "Alias for take_profit_price."
2497
2660
  },
2498
2661
  "take_profit_size": {
2499
- "type": "string",
2662
+ "type": [
2663
+ "string",
2664
+ "number"
2665
+ ],
2500
2666
  "description": "Quantity the take profit covers (partial TP). Omit to cover the whole position. Alias: takeProfitSize."
2501
2667
  },
2502
2668
  "takeProfitSize": {
2503
- "type": "string",
2669
+ "type": [
2670
+ "string",
2671
+ "number"
2672
+ ],
2504
2673
  "description": "Alias for take_profit_size."
2505
2674
  },
2506
2675
  "stop_loss_price": {
2507
- "type": "string",
2676
+ "type": [
2677
+ "string",
2678
+ "number"
2679
+ ],
2508
2680
  "description": "Stop loss trigger price. Omit to leave the stop loss unset. Alias: stopLossPrice."
2509
2681
  },
2510
2682
  "stopLossPrice": {
2511
- "type": "string",
2683
+ "type": [
2684
+ "string",
2685
+ "number"
2686
+ ],
2512
2687
  "description": "Alias for stop_loss_price."
2513
2688
  },
2514
2689
  "stop_loss_size": {
2515
- "type": "string",
2690
+ "type": [
2691
+ "string",
2692
+ "number"
2693
+ ],
2516
2694
  "description": "Quantity the stop loss covers (partial SL). Omit to cover the whole position. Alias: stopLossSize."
2517
2695
  },
2518
2696
  "stopLossSize": {
2519
- "type": "string",
2697
+ "type": [
2698
+ "string",
2699
+ "number"
2700
+ ],
2520
2701
  "description": "Alias for stop_loss_size."
2521
2702
  },
2522
2703
  "network": {
@@ -2533,6 +2714,66 @@
2533
2714
  },
2534
2715
  "timeout_ms": {
2535
2716
  "type": "number"
2717
+ },
2718
+ "expect_error": {
2719
+ "type": "string",
2720
+ "description": "Typed controller error code this call must be refused with, e.g. ORDER_TPSL_SIZE_INVALID. The refusal must carry the code as data: a message that merely mentions it does not match. Empty expects the call to succeed."
2721
+ },
2722
+ "take_profit_offset_pct": {
2723
+ "type": [
2724
+ "string",
2725
+ "number"
2726
+ ],
2727
+ "description": "Take profit price as a percentage from live mid. Preferred over take_profit_price: it holds across markets and over time, where an absolute price only suits one market at one moment."
2728
+ },
2729
+ "takeProfitOffsetPct": {
2730
+ "type": [
2731
+ "string",
2732
+ "number"
2733
+ ],
2734
+ "description": "camelCase alias of take_profit_offset_pct."
2735
+ },
2736
+ "stop_loss_offset_pct": {
2737
+ "type": [
2738
+ "string",
2739
+ "number"
2740
+ ],
2741
+ "description": "Stop loss price as a percentage from live mid. Preferred over stop_loss_price for the same reason."
2742
+ },
2743
+ "stopLossOffsetPct": {
2744
+ "type": [
2745
+ "string",
2746
+ "number"
2747
+ ],
2748
+ "description": "camelCase alias of stop_loss_offset_pct."
2749
+ },
2750
+ "take_profit_fraction": {
2751
+ "type": [
2752
+ "string",
2753
+ "number"
2754
+ ],
2755
+ "description": "Partial take profit size as a fraction of the live position size, in (0, 1]. Preferred over take_profit_size: an absolute size that suits one market can round away or exceed the position on another."
2756
+ },
2757
+ "takeProfitFraction": {
2758
+ "type": [
2759
+ "string",
2760
+ "number"
2761
+ ],
2762
+ "description": "camelCase alias of take_profit_fraction."
2763
+ },
2764
+ "stop_loss_fraction": {
2765
+ "type": [
2766
+ "string",
2767
+ "number"
2768
+ ],
2769
+ "description": "Partial stop loss size as a fraction of the live position size, in (0, 1]."
2770
+ },
2771
+ "stopLossFraction": {
2772
+ "type": [
2773
+ "string",
2774
+ "number"
2775
+ ],
2776
+ "description": "camelCase alias of stop_loss_fraction."
2536
2777
  }
2537
2778
  },
2538
2779
  "additionalProperties": false
@@ -2558,6 +2799,206 @@
2558
2799
  "app-mutation",
2559
2800
  "external-mutation"
2560
2801
  ]
2802
+ },
2803
+ "metamask.perps.edit_order": {
2804
+ "description": "core Modify a RESTING Perps open order by driving the headless perps controller editOrder() through the full signing/provider path. HyperLiquid modify rebuilds the order as a plain limit/market order, so a trigger on either side of the edit would be silently dropped: the controller refuses editing a resting trigger order and refuses editing INTO one (ORDER_EDIT_TRIGGER_UNSUPPORTED), and fails closed when the resting order cannot be verified (ORDER_EDIT_ORDER_UNVERIFIABLE). Pair with expect_error to prove those refusals. Venue is selected with network (testnet default; mainnet signs with REAL funds and also requires CORE_PERPS_ALLOW_MAINNET_WRITES=1).",
2805
+ "schema": {
2806
+ "type": "object",
2807
+ "properties": {
2808
+ "market": {
2809
+ "type": "string",
2810
+ "description": "Single market symbol whose position the TP/SL attaches to. Alias: symbol."
2811
+ },
2812
+ "symbol": {
2813
+ "type": "string",
2814
+ "description": "Alias for market."
2815
+ },
2816
+ "markets": {
2817
+ "type": "array",
2818
+ "items": {
2819
+ "type": "string"
2820
+ },
2821
+ "description": "Explicit market list (requires exactly one)."
2822
+ },
2823
+ "symbols": {
2824
+ "type": "array",
2825
+ "items": {
2826
+ "type": "string"
2827
+ },
2828
+ "description": "Alias for markets."
2829
+ },
2830
+ "selector": {
2831
+ "type": "object",
2832
+ "description": "Optional structured selector with mode and symbols/markets."
2833
+ },
2834
+ "account": {
2835
+ "type": "string",
2836
+ "description": "EVM address to act for; defaults to MM_TEST_ACCOUNT_ADDRESS."
2837
+ },
2838
+ "timeout_ms": {
2839
+ "type": "number"
2840
+ },
2841
+ "network": {
2842
+ "type": "string",
2843
+ "enum": [
2844
+ "testnet",
2845
+ "mainnet"
2846
+ ],
2847
+ "description": "Venue to act on. Defaults to testnet. Mainnet uses REAL funds and additionally requires CORE_PERPS_ALLOW_MAINNET_WRITES=1."
2848
+ },
2849
+ "expect_error": {
2850
+ "type": "string",
2851
+ "description": "Typed controller error code this call must be refused with, e.g. ORDER_TPSL_SIZE_INVALID. The refusal must carry the code as data: a message that merely mentions it does not match. Empty expects the call to succeed."
2852
+ },
2853
+ "order_id": {
2854
+ "type": [
2855
+ "string",
2856
+ "number"
2857
+ ],
2858
+ "description": "Exchange order ID of the resting order to edit. Required unless the selection resolves to exactly one open order."
2859
+ },
2860
+ "orderId": {
2861
+ "type": [
2862
+ "string",
2863
+ "number"
2864
+ ],
2865
+ "description": "camelCase alias of order_id."
2866
+ },
2867
+ "size": {
2868
+ "type": [
2869
+ "string",
2870
+ "number"
2871
+ ],
2872
+ "description": "New order size in contracts. Defaults to the resting order's current size, so a reprice does not have to restate a size that only suits one market."
2873
+ },
2874
+ "price": {
2875
+ "type": [
2876
+ "string",
2877
+ "number"
2878
+ ],
2879
+ "description": "New limit price. Required when order_type is limit."
2880
+ },
2881
+ "order_type": {
2882
+ "type": "string",
2883
+ "enum": [
2884
+ "limit",
2885
+ "stop_market",
2886
+ "stop_limit",
2887
+ "take_profit_market",
2888
+ "take_profit_limit"
2889
+ ],
2890
+ "description": "New placement type. Limit only for a successful edit: a market edit fills rather than rests, so the resting-order verification this action performs could never confirm it. HyperLiquid modify rebuilds the order as a plain order, so a trigger type is refused with ORDER_EDIT_TRIGGER_UNSUPPORTED; trigger types stay in this schema so that refusal can be proven."
2891
+ },
2892
+ "orderType": {
2893
+ "type": "string",
2894
+ "enum": [
2895
+ "limit",
2896
+ "stop_market",
2897
+ "stop_limit",
2898
+ "take_profit_market",
2899
+ "take_profit_limit"
2900
+ ],
2901
+ "description": "camelCase alias of order_type."
2902
+ },
2903
+ "trigger_price": {
2904
+ "type": [
2905
+ "string",
2906
+ "number"
2907
+ ],
2908
+ "description": "Trigger price. Supplying one asks to edit INTO a trigger placement, which is refused with ORDER_EDIT_TRIGGER_UNSUPPORTED; present so that refusal can be proven."
2909
+ },
2910
+ "triggerPrice": {
2911
+ "type": [
2912
+ "string",
2913
+ "number"
2914
+ ],
2915
+ "description": "camelCase alias of trigger_price."
2916
+ },
2917
+ "time_in_force": {
2918
+ "type": "string",
2919
+ "enum": [
2920
+ "",
2921
+ "GTC",
2922
+ "ALO"
2923
+ ],
2924
+ "description": "Time in force for a resting plain limit order. IOC is unsupported because a canceled or immediately-filled replacement cannot satisfy this action's resting-order postcondition."
2925
+ },
2926
+ "timeInForce": {
2927
+ "type": "string",
2928
+ "enum": [
2929
+ "",
2930
+ "GTC",
2931
+ "ALO"
2932
+ ],
2933
+ "description": "camelCase alias of time_in_force."
2934
+ },
2935
+ "reduce_only": {
2936
+ "type": "boolean",
2937
+ "description": "Whether the edited order may only reduce the position."
2938
+ },
2939
+ "reduceOnly": {
2940
+ "type": "boolean",
2941
+ "description": "camelCase alias of reduce_only."
2942
+ },
2943
+ "side": {
2944
+ "type": "string",
2945
+ "enum": [
2946
+ "long",
2947
+ "short"
2948
+ ],
2949
+ "description": "Required order direction."
2950
+ },
2951
+ "offset_pct": {
2952
+ "type": [
2953
+ "string",
2954
+ "number"
2955
+ ],
2956
+ "description": "New limit price as a percentage from live mid, used when no absolute price is given. Mirrors place_order so a recipe can reprice far from mid without hard-coding a per-market number."
2957
+ },
2958
+ "offsetPct": {
2959
+ "type": [
2960
+ "string",
2961
+ "number"
2962
+ ],
2963
+ "description": "camelCase alias of offset_pct."
2964
+ },
2965
+ "notional": {
2966
+ "type": [
2967
+ "string",
2968
+ "number"
2969
+ ],
2970
+ "description": "USD notional used to derive a size when the resting order cannot be read — the case a refusal proof against an unheld order needs, since editOrder validates size before reporting that the order was unverifiable."
2971
+ }
2972
+ },
2973
+ "additionalProperties": false
2974
+ },
2975
+ "examples": [
2976
+ {
2977
+ "action": "metamask.perps.edit_order",
2978
+ "market": "BTC",
2979
+ "side": "long",
2980
+ "size": "0.001",
2981
+ "price": "40000",
2982
+ "order_type": "limit",
2983
+ "intent": "Reprice a resting BTC limit order",
2984
+ "next": "done"
2985
+ },
2986
+ {
2987
+ "action": "metamask.perps.edit_order",
2988
+ "market": "BTC",
2989
+ "side": "short",
2990
+ "size": "0.001",
2991
+ "price": "45000",
2992
+ "order_type": "limit",
2993
+ "expect_error": "ORDER_EDIT_TRIGGER_UNSUPPORTED",
2994
+ "intent": "Prove a resting trigger order cannot be rebuilt as a plain order",
2995
+ "next": "done"
2996
+ }
2997
+ ],
2998
+ "execution_capabilities": [
2999
+ "app-mutation",
3000
+ "external-mutation"
3001
+ ]
2561
3002
  }
2562
3003
  }
2563
3004
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deeeed/metamask-harness",
3
- "version": "0.23.0",
3
+ "version": "0.24.0",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "mm-harness": "bin/mm-harness"