@epilot/cli 0.1.24 → 0.1.25

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.
@@ -733,8 +733,8 @@
733
733
  "schema": {
734
734
  "type": "string"
735
735
  },
736
- "required": true,
737
- "description": "Hook ID for consumption data."
736
+ "required": false,
737
+ "description": "Optional Hook ID. If omitted, the only matching hook on the extension is used; if the extension has multiple hooks of the relevant type, this becomes required."
738
738
  },
739
739
  {
740
740
  "in": "query",
@@ -828,6 +828,11 @@
828
828
  "min"
829
829
  ],
830
830
  "example": "sum"
831
+ },
832
+ "unit": {
833
+ "type": "string",
834
+ "description": "Optional unit of the consumption value. Defaults to unit present on the relevant Meter Counter.",
835
+ "example": "kWh"
831
836
  }
832
837
  },
833
838
  "required": [
@@ -856,6 +861,110 @@
856
861
  }
857
862
  }
858
863
  },
864
+ "/v2/portal/visualization:export": {
865
+ "post": {
866
+ "operationId": "prepareVisualizationExport",
867
+ "summary": "Prepare Visualization Export",
868
+ "description": "Asks an installed App to prepare a downloadable export of a visualization (consumption chart, dynamic tariff chart, etc.). The export is produced by the third-party App via a configured portal extension hook of type `dataExport` — this endpoint does not generate the file itself, it forwards the request to the configured hook and returns the descriptor the App provides (typically a `download_url`).\n",
869
+ "tags": [
870
+ "ECP"
871
+ ],
872
+ "security": [
873
+ {
874
+ "PortalAuth": []
875
+ }
876
+ ],
877
+ "requestBody": {
878
+ "required": true,
879
+ "content": {
880
+ "application/json": {
881
+ "schema": {
882
+ "type": "object",
883
+ "properties": {
884
+ "app_id": {
885
+ "type": "string",
886
+ "description": "App ID providing the dataExport hook."
887
+ },
888
+ "extension_id": {
889
+ "type": "string",
890
+ "description": "Extension ID providing the dataExport hook."
891
+ },
892
+ "hook_id": {
893
+ "type": "string",
894
+ "description": "Optional Hook ID. If omitted, the only `dataExport` hook on the extension is used; if the extension has multiple `dataExport` hooks, this becomes required."
895
+ },
896
+ "from": {
897
+ "type": "string",
898
+ "format": "date-time",
899
+ "description": "Optional start date for the export window (ISO 8601 format)."
900
+ },
901
+ "to": {
902
+ "type": "string",
903
+ "format": "date-time",
904
+ "description": "Optional end date for the export window (ISO 8601 format)."
905
+ },
906
+ "context_entities": {
907
+ "$ref": "#/components/schemas/ContextEntities"
908
+ }
909
+ },
910
+ "required": [
911
+ "app_id",
912
+ "extension_id"
913
+ ],
914
+ "additionalProperties": false
915
+ }
916
+ }
917
+ }
918
+ },
919
+ "responses": {
920
+ "200": {
921
+ "description": "Export descriptor returned by the App.",
922
+ "content": {
923
+ "application/json": {
924
+ "schema": {
925
+ "type": "object",
926
+ "properties": {
927
+ "download_url": {
928
+ "type": "string",
929
+ "description": "URL the client can use to download the exported file. May be a pre-signed or short-lived URL."
930
+ },
931
+ "filename": {
932
+ "type": "string",
933
+ "description": "Suggested filename for the exported file."
934
+ },
935
+ "content_type": {
936
+ "type": "string",
937
+ "description": "MIME type of the exported file.",
938
+ "example": "text/csv"
939
+ },
940
+ "expires_at": {
941
+ "type": "string",
942
+ "format": "date-time",
943
+ "description": "Optional expiration timestamp for the download URL."
944
+ }
945
+ },
946
+ "required": [
947
+ "download_url"
948
+ ]
949
+ }
950
+ }
951
+ }
952
+ },
953
+ "401": {
954
+ "$ref": "#/components/responses/Unauthorized"
955
+ },
956
+ "403": {
957
+ "$ref": "#/components/responses/Forbidden"
958
+ },
959
+ "404": {
960
+ "$ref": "#/components/responses/NotFound"
961
+ },
962
+ "500": {
963
+ "$ref": "#/components/responses/InternalServerError"
964
+ }
965
+ }
966
+ }
967
+ },
859
968
  "/v2/portal/costs": {
860
969
  "get": {
861
970
  "operationId": "getCosts",
@@ -894,8 +1003,8 @@
894
1003
  "schema": {
895
1004
  "type": "string"
896
1005
  },
897
- "required": true,
898
- "description": "Hook ID for cost data."
1006
+ "required": false,
1007
+ "description": "Optional Hook ID. If omitted, the only matching hook on the extension is used; if the extension has multiple hooks of the relevant type, this becomes required."
899
1008
  },
900
1009
  {
901
1010
  "in": "query",
@@ -1068,8 +1177,8 @@
1068
1177
  "schema": {
1069
1178
  "type": "string"
1070
1179
  },
1071
- "required": true,
1072
- "description": "Hook ID for price data."
1180
+ "required": false,
1181
+ "description": "Optional Hook ID. If omitted, the only matching hook on the extension is used; if the extension has multiple hooks of the relevant type, this becomes required."
1073
1182
  },
1074
1183
  {
1075
1184
  "in": "query",
@@ -10804,6 +10913,14 @@
10804
10913
  "widgets"
10805
10914
  ],
10806
10915
  "properties": {
10916
+ "portal_sk_v3": {
10917
+ "type": "string",
10918
+ "description": "V3 portal-scoped storage key for the widget configuration"
10919
+ },
10920
+ "is_v3_item": {
10921
+ "type": "boolean",
10922
+ "description": "Indicates whether the widget configuration is stored as a V3 portal-scoped item"
10923
+ },
10807
10924
  "widgets": {
10808
10925
  "type": "array",
10809
10926
  "items": {
@@ -13479,6 +13596,12 @@
13479
13596
  "$ref": "#/components/schemas/DataRetrievalItem"
13480
13597
  }
13481
13598
  },
13599
+ "dataExport": {
13600
+ "type": "array",
13601
+ "items": {
13602
+ "$ref": "#/components/schemas/DataRetrievalItem"
13603
+ }
13604
+ },
13482
13605
  "priceDataRetrieval": {
13483
13606
  "type": "array",
13484
13607
  "items": {
@@ -13518,6 +13641,9 @@
13518
13641
  "DataRetrievalItem": {
13519
13642
  "type": "object",
13520
13643
  "properties": {
13644
+ "app": {
13645
+ "$ref": "#/components/schemas/PublicAppDetails"
13646
+ },
13521
13647
  "extension": {
13522
13648
  "$ref": "#/components/schemas/PublicExtensionDetails"
13523
13649
  },
@@ -13526,6 +13652,31 @@
13526
13652
  }
13527
13653
  }
13528
13654
  },
13655
+ "PublicAppDetails": {
13656
+ "type": "object",
13657
+ "properties": {
13658
+ "app_id": {
13659
+ "type": "string",
13660
+ "description": "Identifier of the app."
13661
+ },
13662
+ "name": {
13663
+ "type": "object",
13664
+ "properties": {
13665
+ "en": {
13666
+ "type": "string",
13667
+ "description": "Name of the app in English."
13668
+ }
13669
+ },
13670
+ "additionalProperties": {
13671
+ "type": "string",
13672
+ "description": "Name of the app in some other language denoted by ISO 3166-1 alpha-2 code."
13673
+ },
13674
+ "required": [
13675
+ "en"
13676
+ ]
13677
+ }
13678
+ }
13679
+ },
13529
13680
  "PublicExtensionDetails": {
13530
13681
  "type": "object",
13531
13682
  "properties": {
@@ -13580,6 +13731,13 @@
13580
13731
  "type": "string"
13581
13732
  },
13582
13733
  "description": "The intervals associated with the hook."
13734
+ },
13735
+ "block_types": {
13736
+ "type": "array",
13737
+ "items": {
13738
+ "type": "string"
13739
+ },
13740
+ "description": "Optional list of portal block types the hook supports. Empty/missing means the hook is usable on any export-capable block."
13583
13741
  }
13584
13742
  }
13585
13743
  },
@@ -13774,6 +13932,9 @@
13774
13932
  {
13775
13933
  "$ref": "#/components/schemas/ExtensionHookConsumptionDataRetrieval"
13776
13934
  },
13935
+ {
13936
+ "$ref": "#/components/schemas/ExtensionHookDataExport"
13937
+ },
13777
13938
  {
13778
13939
  "$ref": "#/components/schemas/ExtensionHookCostDataRetrieval"
13779
13940
  },
@@ -13937,7 +14098,8 @@
13937
14098
  },
13938
14099
  "use_static_ips": {
13939
14100
  "type": "boolean",
13940
- "description": "If true, requests are made from a set of static IP addresses and only allow connections to a set of allowed IP addresses. Get in touch with us to add your IP addresses.",
14101
+ "deprecated": true,
14102
+ "description": "Deprecated. Prefer `secure_proxy` instead.\nIf true, requests are made from a set of static IP addresses and only allow connections to a set of allowed IP addresses. Get in touch with us to add your IP addresses.\n",
13941
14103
  "default": false
13942
14104
  },
13943
14105
  "secure_proxy": {
@@ -14039,7 +14201,8 @@
14039
14201
  },
14040
14202
  "use_static_ips": {
14041
14203
  "type": "boolean",
14042
- "description": "If true, requests are made from a set of static IP addresses and only allow connections to a set of allowed IP addresses. Get in touch with us to add your IP addresses.",
14204
+ "deprecated": true,
14205
+ "description": "Deprecated. Prefer `secure_proxy` instead.\nIf true, requests are made from a set of static IP addresses and only allow connections to a set of allowed IP addresses. Get in touch with us to add your IP addresses.\n",
14043
14206
  "default": false
14044
14207
  },
14045
14208
  "secure_proxy": {
@@ -14149,7 +14312,8 @@
14149
14312
  },
14150
14313
  "use_static_ips": {
14151
14314
  "type": "boolean",
14152
- "description": "If true, requests are made from a set of static IP addresses and only allow connections to a set of allowed IP addresses. Get in touch with us to add your IP addresses.",
14315
+ "deprecated": true,
14316
+ "description": "Deprecated. Prefer `secure_proxy` instead.\nIf true, requests are made from a set of static IP addresses and only allow connections to a set of allowed IP addresses. Get in touch with us to add your IP addresses.\n",
14153
14317
  "default": false
14154
14318
  },
14155
14319
  "secure_proxy": {
@@ -14227,7 +14391,8 @@
14227
14391
  },
14228
14392
  "use_static_ips": {
14229
14393
  "type": "boolean",
14230
- "description": "If true, requests are made from a set of static IP addresses and only allow connections to a set of allowed IP addresses. Get in touch with us to add your IP addresses.",
14394
+ "deprecated": true,
14395
+ "description": "Deprecated. Prefer `secure_proxy` instead.\nIf true, requests are made from a set of static IP addresses and only allow connections to a set of allowed IP addresses. Get in touch with us to add your IP addresses.\n",
14231
14396
  "default": false
14232
14397
  },
14233
14398
  "secure_proxy": {
@@ -14304,7 +14469,84 @@
14304
14469
  },
14305
14470
  "use_static_ips": {
14306
14471
  "type": "boolean",
14307
- "description": "If true, requests are made from a set of static IP addresses and only allow connections to a set of allowed IP addresses. Get in touch with us to add your IP addresses.",
14472
+ "deprecated": true,
14473
+ "description": "Deprecated. Prefer `secure_proxy` instead.\nIf true, requests are made from a set of static IP addresses and only allow connections to a set of allowed IP addresses. Get in touch with us to add your IP addresses.\n",
14474
+ "default": false
14475
+ },
14476
+ "secure_proxy": {
14477
+ "$ref": "#/components/schemas/SecureProxyConfig"
14478
+ }
14479
+ },
14480
+ "required": [
14481
+ "type",
14482
+ "call"
14483
+ ]
14484
+ },
14485
+ "ExtensionHookDataExport": {
14486
+ "description": "Generic data export hook. When configured on a visualization block, the portal delegates the export action (e.g. CSV/Excel/PDF download) to the configured external source instead of generating the file itself. Can be used by any block that supports export — consumption charts, dynamic tariff charts, etc. The expected response to the call is:\n - 200 with a JSON body describing the exported file (download_url, optional filename, content_type, expires_at)\n",
14487
+ "type": "object",
14488
+ "properties": {
14489
+ "type": {
14490
+ "type": "string",
14491
+ "enum": [
14492
+ "dataExport"
14493
+ ]
14494
+ },
14495
+ "block_types": {
14496
+ "type": "array",
14497
+ "description": "Optional list of portal block types this hook supports. If omitted,\nthe hook is usable on any export-capable block. Allowed values match\nthe block type identifiers used by the portal builder\n(e.g. `consumption_visualization`, `dynamic_tariff`).\n",
14498
+ "items": {
14499
+ "type": "string"
14500
+ }
14501
+ },
14502
+ "auth": {
14503
+ "$ref": "#/components/schemas/ExtensionAuthBlock"
14504
+ },
14505
+ "call": {
14506
+ "type": "object",
14507
+ "properties": {
14508
+ "method": {
14509
+ "type": "string",
14510
+ "description": "HTTP method to use for the call",
14511
+ "default": "GET"
14512
+ },
14513
+ "url": {
14514
+ "type": "string",
14515
+ "description": "URL to call. Supports variable interpolation."
14516
+ },
14517
+ "params": {
14518
+ "type": "object",
14519
+ "description": "Parameters to append to the URL. Supports variable interpolation.",
14520
+ "additionalProperties": {
14521
+ "type": "string"
14522
+ },
14523
+ "default": {}
14524
+ },
14525
+ "headers": {
14526
+ "type": "object",
14527
+ "description": "Headers to use. Supports variable interpolation.",
14528
+ "additionalProperties": {
14529
+ "type": "string"
14530
+ },
14531
+ "default": {}
14532
+ },
14533
+ "body": {
14534
+ "type": "object",
14535
+ "description": "Request body to send. Supports variable interpolation. Content format is determined by Content-Type header.",
14536
+ "additionalProperties": {
14537
+ "type": "string"
14538
+ },
14539
+ "default": {}
14540
+ }
14541
+ },
14542
+ "required": [
14543
+ "url"
14544
+ ]
14545
+ },
14546
+ "use_static_ips": {
14547
+ "type": "boolean",
14548
+ "deprecated": true,
14549
+ "description": "Deprecated. Prefer `secure_proxy` instead.\nIf true, requests are made from a set of static IP addresses and only allow connections to a set of allowed IP addresses. Get in touch with us to add your IP addresses.\n",
14308
14550
  "default": false
14309
14551
  },
14310
14552
  "secure_proxy": {
@@ -14381,7 +14623,8 @@
14381
14623
  },
14382
14624
  "use_static_ips": {
14383
14625
  "type": "boolean",
14384
- "description": "If true, requests are made from a set of static IP addresses and only allow connections to a set of allowed IP addresses. Get in touch with us to add your IP addresses.",
14626
+ "deprecated": true,
14627
+ "description": "Deprecated. Prefer `secure_proxy` instead.\nIf true, requests are made from a set of static IP addresses and only allow connections to a set of allowed IP addresses. Get in touch with us to add your IP addresses.\n",
14385
14628
  "default": false
14386
14629
  },
14387
14630
  "secure_proxy": {
@@ -14672,6 +14915,11 @@
14672
14915
  "example": [
14673
14916
  "00123456"
14674
14917
  ]
14918
+ },
14919
+ "file_id": {
14920
+ "type": "string",
14921
+ "description": "ID of the created file entity for the uploaded photo.",
14922
+ "example": "abc123def456"
14675
14923
  }
14676
14924
  }
14677
14925
  },
@@ -15397,6 +15645,17 @@
15397
15645
  "type": "string",
15398
15646
  "description": "The id of the portal",
15399
15647
  "example": "453ad7bf-86d5-46c8-8252-bcc868df5e3c"
15648
+ },
15649
+ "past_routes": {
15650
+ "type": "array",
15651
+ "description": "Slugs that previously belonged to this page. The portal redirects requests for these slugs to the current slug. Managed by the server: when a page's slug changes, the old slug is appended here, and when another page claims one of these slugs it is removed from this list.\n",
15652
+ "items": {
15653
+ "type": "string"
15654
+ },
15655
+ "example": [
15656
+ "old-dashboard",
15657
+ "home"
15658
+ ]
15400
15659
  }
15401
15660
  }
15402
15661
  }