@tiangong-ai/cli 0.0.51 → 0.0.56

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 (216) hide show
  1. package/AGENTS.md +22 -2
  2. package/README.md +171 -7
  3. package/dist/cli.js +10 -1
  4. package/dist/cli.js.map +1 -1
  5. package/dist/data/builtins.d.ts +1 -0
  6. package/dist/data/builtins.js +40 -0
  7. package/dist/data/builtins.js.map +1 -0
  8. package/dist/data/catalog.d.ts +25 -0
  9. package/dist/data/catalog.js +305 -0
  10. package/dist/data/catalog.js.map +1 -0
  11. package/dist/data/commands.d.ts +9 -0
  12. package/dist/data/commands.js +307 -0
  13. package/dist/data/commands.js.map +1 -0
  14. package/dist/data/connectors/airnow-hourly-observations.d.ts +2 -0
  15. package/dist/data/connectors/airnow-hourly-observations.js +522 -0
  16. package/dist/data/connectors/airnow-hourly-observations.js.map +1 -0
  17. package/dist/data/connectors/airnow-hourly-observations.schemas.d.ts +299 -0
  18. package/dist/data/connectors/airnow-hourly-observations.schemas.js +188 -0
  19. package/dist/data/connectors/airnow-hourly-observations.schemas.js.map +1 -0
  20. package/dist/data/connectors/bluesky-public-posts.d.ts +2 -0
  21. package/dist/data/connectors/bluesky-public-posts.js +705 -0
  22. package/dist/data/connectors/bluesky-public-posts.js.map +1 -0
  23. package/dist/data/connectors/bluesky-public-posts.schemas.d.ts +733 -0
  24. package/dist/data/connectors/bluesky-public-posts.schemas.js +422 -0
  25. package/dist/data/connectors/bluesky-public-posts.schemas.js.map +1 -0
  26. package/dist/data/connectors/epa-eis-records.d.ts +2 -0
  27. package/dist/data/connectors/epa-eis-records.js +566 -0
  28. package/dist/data/connectors/epa-eis-records.js.map +1 -0
  29. package/dist/data/connectors/epa-eis-records.schemas.d.ts +199 -0
  30. package/dist/data/connectors/epa-eis-records.schemas.js +146 -0
  31. package/dist/data/connectors/epa-eis-records.schemas.js.map +1 -0
  32. package/dist/data/connectors/federal-register-documents.d.ts +2 -0
  33. package/dist/data/connectors/federal-register-documents.js +517 -0
  34. package/dist/data/connectors/federal-register-documents.js.map +1 -0
  35. package/dist/data/connectors/federal-register-documents.schemas.d.ts +357 -0
  36. package/dist/data/connectors/federal-register-documents.schemas.js +243 -0
  37. package/dist/data/connectors/federal-register-documents.schemas.js.map +1 -0
  38. package/dist/data/connectors/gdelt-doc-search.d.ts +2 -0
  39. package/dist/data/connectors/gdelt-doc-search.js +658 -0
  40. package/dist/data/connectors/gdelt-doc-search.js.map +1 -0
  41. package/dist/data/connectors/gdelt-doc-search.schemas.d.ts +446 -0
  42. package/dist/data/connectors/gdelt-doc-search.schemas.js +330 -0
  43. package/dist/data/connectors/gdelt-doc-search.schemas.js.map +1 -0
  44. package/dist/data/connectors/gdelt-file-feeds.d.ts +4 -0
  45. package/dist/data/connectors/gdelt-file-feeds.js +591 -0
  46. package/dist/data/connectors/gdelt-file-feeds.js.map +1 -0
  47. package/dist/data/connectors/gdelt-file-feeds.schemas.d.ts +40 -0
  48. package/dist/data/connectors/gdelt-file-feeds.schemas.js +256 -0
  49. package/dist/data/connectors/gdelt-file-feeds.schemas.js.map +1 -0
  50. package/dist/data/connectors/nasa-firms-fire.d.ts +2 -0
  51. package/dist/data/connectors/nasa-firms-fire.js +578 -0
  52. package/dist/data/connectors/nasa-firms-fire.js.map +1 -0
  53. package/dist/data/connectors/nasa-firms-fire.schemas.d.ts +369 -0
  54. package/dist/data/connectors/nasa-firms-fire.schemas.js +238 -0
  55. package/dist/data/connectors/nasa-firms-fire.schemas.js.map +1 -0
  56. package/dist/data/connectors/open-meteo-air-quality.d.ts +2 -0
  57. package/dist/data/connectors/open-meteo-air-quality.js +401 -0
  58. package/dist/data/connectors/open-meteo-air-quality.js.map +1 -0
  59. package/dist/data/connectors/open-meteo-air-quality.schemas.d.ts +335 -0
  60. package/dist/data/connectors/open-meteo-air-quality.schemas.js +225 -0
  61. package/dist/data/connectors/open-meteo-air-quality.schemas.js.map +1 -0
  62. package/dist/data/connectors/open-meteo-flood.d.ts +2 -0
  63. package/dist/data/connectors/open-meteo-flood.js +446 -0
  64. package/dist/data/connectors/open-meteo-flood.js.map +1 -0
  65. package/dist/data/connectors/open-meteo-flood.schemas.d.ts +388 -0
  66. package/dist/data/connectors/open-meteo-flood.schemas.js +227 -0
  67. package/dist/data/connectors/open-meteo-flood.schemas.js.map +1 -0
  68. package/dist/data/connectors/open-meteo-historical-weather.d.ts +2 -0
  69. package/dist/data/connectors/open-meteo-historical-weather.js +468 -0
  70. package/dist/data/connectors/open-meteo-historical-weather.js.map +1 -0
  71. package/dist/data/connectors/open-meteo-historical-weather.schemas.d.ts +420 -0
  72. package/dist/data/connectors/open-meteo-historical-weather.schemas.js +282 -0
  73. package/dist/data/connectors/open-meteo-historical-weather.schemas.js.map +1 -0
  74. package/dist/data/connectors/openaq-air-quality.d.ts +2 -0
  75. package/dist/data/connectors/openaq-air-quality.js +734 -0
  76. package/dist/data/connectors/openaq-air-quality.js.map +1 -0
  77. package/dist/data/connectors/openaq-air-quality.schemas.d.ts +1067 -0
  78. package/dist/data/connectors/openaq-air-quality.schemas.js +512 -0
  79. package/dist/data/connectors/openaq-air-quality.schemas.js.map +1 -0
  80. package/dist/data/connectors/regulations-gov-attachments.d.ts +2 -0
  81. package/dist/data/connectors/regulations-gov-attachments.js +486 -0
  82. package/dist/data/connectors/regulations-gov-attachments.js.map +1 -0
  83. package/dist/data/connectors/regulations-gov-attachments.schemas.d.ts +270 -0
  84. package/dist/data/connectors/regulations-gov-attachments.schemas.js +181 -0
  85. package/dist/data/connectors/regulations-gov-attachments.schemas.js.map +1 -0
  86. package/dist/data/connectors/regulations-gov-comments.d.ts +2 -0
  87. package/dist/data/connectors/regulations-gov-comments.js +718 -0
  88. package/dist/data/connectors/regulations-gov-comments.js.map +1 -0
  89. package/dist/data/connectors/regulations-gov-comments.schemas.d.ts +717 -0
  90. package/dist/data/connectors/regulations-gov-comments.schemas.js +389 -0
  91. package/dist/data/connectors/regulations-gov-comments.schemas.js.map +1 -0
  92. package/dist/data/connectors/usbr-project-records.d.ts +2 -0
  93. package/dist/data/connectors/usbr-project-records.js +467 -0
  94. package/dist/data/connectors/usbr-project-records.js.map +1 -0
  95. package/dist/data/connectors/usbr-project-records.schemas.d.ts +194 -0
  96. package/dist/data/connectors/usbr-project-records.schemas.js +137 -0
  97. package/dist/data/connectors/usbr-project-records.schemas.js.map +1 -0
  98. package/dist/data/connectors/usbr-rise.d.ts +2 -0
  99. package/dist/data/connectors/usbr-rise.js +625 -0
  100. package/dist/data/connectors/usbr-rise.js.map +1 -0
  101. package/dist/data/connectors/usbr-rise.schemas.d.ts +623 -0
  102. package/dist/data/connectors/usbr-rise.schemas.js +407 -0
  103. package/dist/data/connectors/usbr-rise.schemas.js.map +1 -0
  104. package/dist/data/connectors/usgs-water-instantaneous-values.d.ts +2 -0
  105. package/dist/data/connectors/usgs-water-instantaneous-values.js +521 -0
  106. package/dist/data/connectors/usgs-water-instantaneous-values.js.map +1 -0
  107. package/dist/data/connectors/usgs-water-instantaneous-values.schemas.d.ts +496 -0
  108. package/dist/data/connectors/usgs-water-instantaneous-values.schemas.js +309 -0
  109. package/dist/data/connectors/usgs-water-instantaneous-values.schemas.js.map +1 -0
  110. package/dist/data/connectors/youtube-public-content.d.ts +2 -0
  111. package/dist/data/connectors/youtube-public-content.js +974 -0
  112. package/dist/data/connectors/youtube-public-content.js.map +1 -0
  113. package/dist/data/connectors/youtube-public-content.schemas.d.ts +773 -0
  114. package/dist/data/connectors/youtube-public-content.schemas.js +567 -0
  115. package/dist/data/connectors/youtube-public-content.schemas.js.map +1 -0
  116. package/dist/data/contracts.d.ts +374 -0
  117. package/dist/data/contracts.js +10 -0
  118. package/dist/data/contracts.js.map +1 -0
  119. package/dist/data/runtime/artifacts.d.ts +6 -0
  120. package/dist/data/runtime/artifacts.js +103 -0
  121. package/dist/data/runtime/artifacts.js.map +1 -0
  122. package/dist/data/runtime/bounded-http.d.ts +10 -0
  123. package/dist/data/runtime/bounded-http.js +403 -0
  124. package/dist/data/runtime/bounded-http.js.map +1 -0
  125. package/dist/data/runtime/canonical-json.d.ts +3 -0
  126. package/dist/data/runtime/canonical-json.js +59 -0
  127. package/dist/data/runtime/canonical-json.js.map +1 -0
  128. package/dist/data/runtime/credentials.d.ts +14 -0
  129. package/dist/data/runtime/credentials.js +67 -0
  130. package/dist/data/runtime/credentials.js.map +1 -0
  131. package/dist/data/runtime/csv.d.ts +4 -0
  132. package/dist/data/runtime/csv.js +51 -0
  133. package/dist/data/runtime/csv.js.map +1 -0
  134. package/dist/data/runtime/errors.d.ts +22 -0
  135. package/dist/data/runtime/errors.js +101 -0
  136. package/dist/data/runtime/errors.js.map +1 -0
  137. package/dist/data/runtime/execute.d.ts +11 -0
  138. package/dist/data/runtime/execute.js +358 -0
  139. package/dist/data/runtime/execute.js.map +1 -0
  140. package/dist/data/runtime/receipts.d.ts +13 -0
  141. package/dist/data/runtime/receipts.js +38 -0
  142. package/dist/data/runtime/receipts.js.map +1 -0
  143. package/dist/data/schemas/catalog.v1.json +73 -0
  144. package/dist/data/schemas/core-receipt.v1.json +117 -0
  145. package/dist/data/schemas/describe.v1.json +24 -0
  146. package/dist/data/schemas/discovery.v1.json +130 -0
  147. package/dist/data/schemas/doctor.v1.json +40 -0
  148. package/dist/data/schemas/error.v1.json +48 -0
  149. package/dist/data/schemas/manifest.v1.json +174 -0
  150. package/dist/data/schemas/run-request.v1.json +37 -0
  151. package/dist/data/schemas/run-result.v1.json +77 -0
  152. package/dist/data/schemas.d.ts +27 -0
  153. package/dist/data/schemas.js +69 -0
  154. package/dist/data/schemas.js.map +1 -0
  155. package/dist/env.js.map +1 -1
  156. package/dist/errors.js.map +1 -1
  157. package/dist/http.js.map +1 -1
  158. package/dist/kb/config.js.map +1 -1
  159. package/dist/kb/pipeline-health.js.map +1 -1
  160. package/dist/research/orchestration.js +54 -7
  161. package/dist/research/orchestration.js.map +1 -1
  162. package/dist/research/workspace/acquisition.js.map +1 -1
  163. package/dist/research/workspace/audit-bundle.js +7 -2
  164. package/dist/research/workspace/audit-bundle.js.map +1 -1
  165. package/dist/research/workspace/broker.js.map +1 -1
  166. package/dist/research/workspace/constants.js.map +1 -1
  167. package/dist/research/workspace/credentials.d.ts +3 -0
  168. package/dist/research/workspace/credentials.js +20 -3
  169. package/dist/research/workspace/credentials.js.map +1 -1
  170. package/dist/research/workspace/data-evidence-adapter.d.ts +60 -0
  171. package/dist/research/workspace/data-evidence-adapter.js +314 -0
  172. package/dist/research/workspace/data-evidence-adapter.js.map +1 -0
  173. package/dist/research/workspace/discovery-status.js +10 -7
  174. package/dist/research/workspace/discovery-status.js.map +1 -1
  175. package/dist/research/workspace/discovery.js +12 -11
  176. package/dist/research/workspace/discovery.js.map +1 -1
  177. package/dist/research/workspace/evidence-ledger.d.ts +8 -1
  178. package/dist/research/workspace/evidence-ledger.js +46 -2
  179. package/dist/research/workspace/evidence-ledger.js.map +1 -1
  180. package/dist/research/workspace/evidence.d.ts +31 -0
  181. package/dist/research/workspace/evidence.js +77 -0
  182. package/dist/research/workspace/evidence.js.map +1 -1
  183. package/dist/research/workspace/executor.js.map +1 -1
  184. package/dist/research/workspace/external-skills.d.ts +49 -49
  185. package/dist/research/workspace/external-skills.js.map +1 -1
  186. package/dist/research/workspace/platform-capabilities.js.map +1 -1
  187. package/dist/research/workspace/preflight.d.ts +4 -4
  188. package/dist/research/workspace/preflight.js +33 -8
  189. package/dist/research/workspace/preflight.js.map +1 -1
  190. package/dist/research/workspace/projects.js.map +1 -1
  191. package/dist/research/workspace/publication.js.map +1 -1
  192. package/dist/research/workspace/research-policy-wizard.js.map +1 -1
  193. package/dist/research/workspace/research-policy.js.map +1 -1
  194. package/dist/research/workspace/runtime.d.ts +7 -0
  195. package/dist/research/workspace/runtime.js +77 -20
  196. package/dist/research/workspace/runtime.js.map +1 -1
  197. package/dist/research/workspace/sanitization.js.map +1 -1
  198. package/dist/research/workspace/schemas.js +1 -1
  199. package/dist/research/workspace/schemas.js.map +1 -1
  200. package/dist/research/workspace/scientific-design.js.map +1 -1
  201. package/dist/research/workspace/scientific-review.js.map +1 -1
  202. package/dist/research/workspace/setup-catalog.d.ts +9 -9
  203. package/dist/research/workspace/setup-catalog.js +2 -2
  204. package/dist/research/workspace/setup-catalog.js.map +1 -1
  205. package/dist/research/workspace/setup-declarative.js.map +1 -1
  206. package/dist/research/workspace/setup-instructions.d.ts +42 -0
  207. package/dist/research/workspace/setup-instructions.js +413 -0
  208. package/dist/research/workspace/setup-instructions.js.map +1 -0
  209. package/dist/research/workspace/setup-invocation.js.map +1 -1
  210. package/dist/research/workspace/setup-wizard.js +7 -0
  211. package/dist/research/workspace/setup-wizard.js.map +1 -1
  212. package/dist/research/workspace/setup.d.ts +18 -15
  213. package/dist/research/workspace/setup.js +71 -3
  214. package/dist/research/workspace/setup.js.map +1 -1
  215. package/dist/research/workspace/workspace.js.map +1 -1
  216. package/package.json +3 -3
@@ -0,0 +1,401 @@
1
+ import { DATA_MANIFEST_SCHEMA_VERSION } from "../contracts.js";
2
+ import { DataRuntimeError } from "../runtime/errors.js";
3
+ import { OPEN_METEO_AIR_QUALITY_INPUT_SCHEMA, OPEN_METEO_AIR_QUALITY_OUTPUT_SCHEMA, } from "./open-meteo-air-quality.schemas.js";
4
+ const ENDPOINT_PATH = "/v1/air-quality";
5
+ const MAX_WINDOW_DAYS = 92;
6
+ const MAX_VALIDATION_ISSUES = 50;
7
+ class IssueCollector {
8
+ count = 0;
9
+ issues = [];
10
+ add(path, message) {
11
+ this.count += 1;
12
+ if (this.issues.length < MAX_VALIDATION_ISSUES)
13
+ this.issues.push({ path, message });
14
+ }
15
+ }
16
+ export const openMeteoAirQualityConnector = {
17
+ schemaVersion: DATA_MANIFEST_SCHEMA_VERSION,
18
+ capabilityId: "open-meteo.air-quality",
19
+ capabilityVersion: "1.0.0",
20
+ minimumCliVersion: "0.0.55",
21
+ provider: {
22
+ providerId: "open-meteo",
23
+ name: "Open-Meteo Air Quality API",
24
+ },
25
+ sourceCategory: "modeled-air-quality",
26
+ endpoints: [
27
+ {
28
+ endpointId: "open-meteo-air-quality-public",
29
+ baseUrl: "https://air-quality-api.open-meteo.com",
30
+ pathPrefixes: ["/v1/"],
31
+ allowedMethods: ["GET"],
32
+ allowedContentTypes: ["application/json"],
33
+ },
34
+ ],
35
+ license: {
36
+ name: "CC BY 4.0",
37
+ url: "https://open-meteo.com/en/license",
38
+ restrictions: [
39
+ "Attribution to Open-Meteo and the underlying CAMS data provider is required.",
40
+ "The public free API endpoint is for non-commercial use; commercial use requires a separately governed customer endpoint and API key.",
41
+ "Provider model values and availability may change when CAMS models or Open-Meteo processing are updated.",
42
+ ],
43
+ },
44
+ credentials: [],
45
+ limits: {
46
+ timeoutMs: 45_000,
47
+ maxRequestBytes: 4_096,
48
+ maxResponseBytes: 25_000_000,
49
+ maxPages: 1,
50
+ maxRecords: 25_000,
51
+ maxRetries: 3,
52
+ maxRetryDelayMs: 120_000,
53
+ maxRedirects: 1,
54
+ },
55
+ diagnostics: { static: true, live: false },
56
+ freshness: {
57
+ kind: "forecast-and-reanalysis-model",
58
+ description: "Hourly modeled values combine current forecasts with provider model history; updates and horizons depend on the selected CAMS domain and variable.",
59
+ },
60
+ limitations: [
61
+ "Values describe an atmospheric model grid cell, not a measurement taken at the requested coordinate.",
62
+ "CAMS Europe and CAMS Global have different spatial resolution, forecast horizon, update cadence, and variable coverage.",
63
+ "Pollen variables and some constituent fields are limited to specific domains or geographic coverage.",
64
+ "The public endpoint is restricted to non-commercial use and is subject to Open-Meteo free-tier request limits.",
65
+ "This connector fixes timestamps to GMT and does not interpret exposure, health effects, compliance, or causal mechanisms.",
66
+ ],
67
+ discovery: {
68
+ source: {
69
+ maintainedBy: "Open-Meteo using Copernicus Atmosphere Monitoring Service data",
70
+ summary: "Global and European hourly modeled air-quality, aerosol, pollen, UV, and AQI fields exposed by Open-Meteo.",
71
+ description: "The Air Quality API maps coordinates to CAMS model grid cells and returns hourly background concentrations and derived indices. It is modeled environmental context rather than station-level observation data.",
72
+ coverage: {
73
+ geographic: "CAMS Global coverage worldwide and higher-resolution CAMS Europe coverage in its supported European domain; pollen and individual variables have narrower availability.",
74
+ temporal: "Hourly forecast and recent model-history windows supported by Open-Meteo, bounded here to an explicit inclusive window of at most 92 dates.",
75
+ granularity: "One selected model grid cell, GMT hour, and requested variable value.",
76
+ },
77
+ },
78
+ summary: "Retrieve bounded hourly modeled air-quality variables for up to ten explicit coordinates.",
79
+ description: "This capability sends one deterministic GMT request to the public Open-Meteo Air Quality endpoint, preserves requested coordinate order, and emits aligned columnar time series with grid-cell metadata and explicit partial validation.",
80
+ provides: [
81
+ "Hourly PM, gas, aerosol, pollen, UV, European AQI, and US AQI model variables from the official public endpoint.",
82
+ "Grid latitude, longitude, elevation, timezone metadata, units, timestamps, nullable values, and request lineage.",
83
+ "Explicit domain and grid-cell-selection controls with bounded locations, variables, dates, response size, and records.",
84
+ "Partial results when an individual coordinate or requested variable cannot be normalized safely.",
85
+ ],
86
+ doesNotProvide: [
87
+ "Ground-station observations, sensor identity, regulatory monitoring records, or measurement-quality flags.",
88
+ "Health advice, personal exposure, compliance decisions, forecasts beyond provider availability, or causal interpretation.",
89
+ "Geocoding, place search, automatic source comparison, or interpolation beyond the provider-selected model grid cell.",
90
+ "Commercial API access or customer-endpoint API-key handling.",
91
+ ],
92
+ selectionHints: [
93
+ "Choose this capability for spatially continuous modeled background context at known coordinates.",
94
+ "Choose a station-observation capability such as AirNow when the question requires actual monitoring-site measurements.",
95
+ "Use cams_europe when its geographic and variable coverage fits and higher regional resolution matters; otherwise retain auto.",
96
+ "Treat nulls and partial status as unavailable model cells or fields, not as zero concentration.",
97
+ ],
98
+ typicalUseCases: [
99
+ "Compare modeled PM2.5 and ozone time series for a small set of known coordinates.",
100
+ "Retrieve a bounded pollen or AQI context window for a non-commercial research workflow.",
101
+ ],
102
+ sourceDocumentation: [
103
+ {
104
+ title: "Open-Meteo Air Quality API documentation",
105
+ url: "https://open-meteo.com/en/docs/air-quality-api",
106
+ },
107
+ {
108
+ title: "Open-Meteo data license",
109
+ url: "https://open-meteo.com/en/license",
110
+ },
111
+ {
112
+ title: "Open-Meteo API terms",
113
+ url: "https://open-meteo.com/en/terms",
114
+ },
115
+ ],
116
+ },
117
+ operations: [
118
+ {
119
+ operationId: "fetch-hourly",
120
+ operationVersion: "1.0.0",
121
+ summary: "Fetch one bounded GMT window of Open-Meteo modeled hourly air-quality variables.",
122
+ description: "Builds one stable public-endpoint query for up to ten coordinates and sixteen documented variables, validates aligned hourly arrays independently, and applies the shared byte, retry, timeout, and record limits.",
123
+ inputSchema: OPEN_METEO_AIR_QUALITY_INPUT_SCHEMA,
124
+ outputSchema: OPEN_METEO_AIR_QUALITY_OUTPUT_SCHEMA,
125
+ execute: executeOpenMeteoAirQuality,
126
+ },
127
+ ],
128
+ };
129
+ async function executeOpenMeteoAirQuality(context) {
130
+ const input = normalizeInput(context.input);
131
+ const response = await context.http.request({
132
+ endpointId: "open-meteo-air-quality-public",
133
+ method: "GET",
134
+ path: ENDPOINT_PATH,
135
+ query: {
136
+ latitude: input.locations.map((location) => location.latitude).join(","),
137
+ longitude: input.locations.map((location) => location.longitude).join(","),
138
+ start_date: input.startDate,
139
+ end_date: input.endDate,
140
+ hourly: input.hourlyVariables.join(","),
141
+ timezone: input.timezone,
142
+ domains: input.domain,
143
+ cell_selection: input.cellSelection,
144
+ },
145
+ });
146
+ const normalized = normalizePayload(response.json(), input, context.limits.maxRecords);
147
+ const partial = normalized.issueCount > 0;
148
+ const invalidPaths = normalized.issues.map((issue) => issue.path);
149
+ const errors = partial
150
+ ? [
151
+ {
152
+ code: "partial-result",
153
+ message: "One or more Open-Meteo locations, timestamps, or variables could not be normalized.",
154
+ retryable: false,
155
+ userActionRequired: false,
156
+ details: { issueCount: normalized.issueCount, invalidPaths },
157
+ },
158
+ ]
159
+ : [];
160
+ return {
161
+ status: partial ? "partial" : "success",
162
+ data: {
163
+ source: {
164
+ providerId: "open-meteo",
165
+ service: "Air Quality API",
166
+ endpoint: ENDPOINT_PATH,
167
+ modeled: true,
168
+ timezone: "GMT",
169
+ },
170
+ request: input,
171
+ validation: { issueCount: normalized.issueCount, issues: normalized.issues },
172
+ locations: normalized.locations,
173
+ stopReason: partial ? "partial" : normalized.truncated ? "max-records" : "completed",
174
+ },
175
+ summary: {
176
+ recordCount: normalized.recordCount,
177
+ pageCount: 1,
178
+ chunkCount: 1,
179
+ truncated: normalized.truncated,
180
+ completeness: partial ? "partial" : "complete",
181
+ ...(partial ? { missing: [{ kind: "field", identifiers: invalidPaths }] } : {}),
182
+ },
183
+ warnings: [
184
+ "Open-Meteo air-quality values are modeled grid-cell estimates, not station observations.",
185
+ "Attribute Open-Meteo and the underlying CAMS data provider when using these data.",
186
+ "The configured public endpoint is for non-commercial use.",
187
+ ...(normalized.truncated ? ["The normalized hourly series reached the record limit."] : []),
188
+ ],
189
+ errors,
190
+ observations: [{ ...response.observation, sourceId: "hourly-model" }],
191
+ };
192
+ }
193
+ function normalizeInput(input) {
194
+ const start = parseDate(input.startDate, "startDate");
195
+ const end = parseDate(input.endDate, "endDate");
196
+ if (start.getTime() > end.getTime()) {
197
+ throw new DataRuntimeError("invalid-request", "startDate must not follow endDate.");
198
+ }
199
+ const windowDays = Math.floor((end.getTime() - start.getTime()) / 86_400_000) + 1;
200
+ if (windowDays > MAX_WINDOW_DAYS) {
201
+ throw new DataRuntimeError("invalid-request", `The inclusive Open-Meteo date window must not exceed ${MAX_WINDOW_DAYS} days.`, { details: { windowDays, maximumWindowDays: MAX_WINDOW_DAYS } });
202
+ }
203
+ return {
204
+ locations: input.locations.map((location) => ({ ...location })),
205
+ startDate: input.startDate,
206
+ endDate: input.endDate,
207
+ hourlyVariables: [...input.hourlyVariables].sort(codePointOrder),
208
+ domain: input.domain ?? "auto",
209
+ cellSelection: input.cellSelection ?? "nearest",
210
+ timezone: "GMT",
211
+ };
212
+ }
213
+ function parseDate(value, field) {
214
+ const parsed = new Date(`${value}T00:00:00Z`);
215
+ if (!Number.isFinite(parsed.getTime()) || parsed.toISOString().slice(0, 10) !== value) {
216
+ throw new DataRuntimeError("invalid-request", `${field} must be a real YYYY-MM-DD date.`);
217
+ }
218
+ return parsed;
219
+ }
220
+ function normalizePayload(payload, input, maxRecords) {
221
+ const providerError = recordValue(payload);
222
+ if (providerError?.error === true) {
223
+ throw new DataRuntimeError("provider-response-invalid", "Open-Meteo returned an explicit provider error response.", {
224
+ details: {
225
+ reason: typeof providerError.reason === "string" ? providerError.reason : "Unspecified error",
226
+ },
227
+ });
228
+ }
229
+ const responses = input.locations.length === 1 && !Array.isArray(payload) ? [payload] : payload;
230
+ if (!Array.isArray(responses)) {
231
+ throw new DataRuntimeError("provider-response-invalid", "Open-Meteo must return one object for one coordinate or an array for multiple coordinates.");
232
+ }
233
+ const collector = new IssueCollector();
234
+ if (responses.length !== input.locations.length) {
235
+ collector.add("$", `Expected ${input.locations.length} coordinate responses but received ${responses.length}.`);
236
+ }
237
+ const candidates = [];
238
+ for (let index = 0; index < input.locations.length; index += 1) {
239
+ const normalized = normalizeLocation(responses[index], index, input.locations[index], input, collector);
240
+ if (normalized)
241
+ candidates.push(normalized);
242
+ }
243
+ const totalAvailable = candidates.reduce((total, location) => total + location.timesUtc.length, 0);
244
+ const truncated = totalAvailable > maxRecords;
245
+ let remaining = maxRecords;
246
+ const locations = [];
247
+ for (const location of candidates) {
248
+ if (remaining <= 0)
249
+ break;
250
+ const length = Math.min(location.timesUtc.length, remaining);
251
+ locations.push({
252
+ ...location,
253
+ timesUtc: location.timesUtc.slice(0, length),
254
+ variables: location.variables.map((variable) => ({
255
+ ...variable,
256
+ values: variable.values.slice(0, length),
257
+ })),
258
+ });
259
+ remaining -= length;
260
+ }
261
+ const recordCount = locations.reduce((total, location) => total + location.timesUtc.length, 0);
262
+ return {
263
+ locations,
264
+ issues: collector.issues,
265
+ issueCount: collector.count,
266
+ recordCount,
267
+ truncated,
268
+ };
269
+ }
270
+ function normalizeLocation(value, index, requestedLocation, input, collector) {
271
+ const path = `$[${index}]`;
272
+ const item = recordValue(value);
273
+ if (!item) {
274
+ collector.add(path, "Coordinate response must be an object.");
275
+ return null;
276
+ }
277
+ if (item.error === true) {
278
+ collector.add(path, "Coordinate response contains an explicit provider error.");
279
+ return null;
280
+ }
281
+ const latitude = finiteNumber(item.latitude);
282
+ const longitude = finiteNumber(item.longitude);
283
+ if (latitude === null || longitude === null) {
284
+ collector.add(path, "Coordinate response is missing numeric grid latitude or longitude.");
285
+ return null;
286
+ }
287
+ const hourly = recordValue(item.hourly);
288
+ const units = recordValue(item.hourly_units);
289
+ if (!hourly || !units || !Array.isArray(hourly.time)) {
290
+ collector.add(path, "Coordinate response must contain hourly, hourly.time, and hourly_units.");
291
+ return null;
292
+ }
293
+ const timesUtc = [];
294
+ let previousTime = null;
295
+ for (let timeIndex = 0; timeIndex < hourly.time.length; timeIndex += 1) {
296
+ const normalizedTime = normalizeProviderTime(hourly.time[timeIndex], input);
297
+ if (normalizedTime === null) {
298
+ collector.add(`${path}.hourly.time[${timeIndex}]`, "Invalid or out-of-window GMT timestamp.");
299
+ continue;
300
+ }
301
+ if (previousTime !== null && normalizedTime <= previousTime) {
302
+ collector.add(`${path}.hourly.time[${timeIndex}]`, "GMT timestamps must be strictly ascending.");
303
+ }
304
+ timesUtc.push(normalizedTime);
305
+ previousTime = normalizedTime;
306
+ }
307
+ if (timesUtc.length !== hourly.time.length) {
308
+ collector.add(`${path}.hourly.time`, "One or more invalid timestamps prevent safe alignment for this coordinate.");
309
+ return null;
310
+ }
311
+ const expectedHourCount = inclusiveDayCount(input.startDate, input.endDate) * 24;
312
+ if (timesUtc.length !== expectedHourCount) {
313
+ collector.add(`${path}.hourly.time`, `Expected ${expectedHourCount} GMT hours for the inclusive date window but received ${timesUtc.length}.`);
314
+ }
315
+ const variables = [];
316
+ for (const variable of input.hourlyVariables) {
317
+ const variablePath = `${path}.hourly.${variable}`;
318
+ const rawValues = hourly[variable];
319
+ const unit = units[variable];
320
+ if (!Array.isArray(rawValues)) {
321
+ collector.add(variablePath, "Requested variable is missing or is not an array.");
322
+ continue;
323
+ }
324
+ if (rawValues.length !== timesUtc.length) {
325
+ collector.add(variablePath, "Requested variable length does not match hourly.time.");
326
+ continue;
327
+ }
328
+ if (typeof unit !== "string" || unit.length === 0) {
329
+ collector.add(`${path}.hourly_units.${variable}`, "Requested variable unit is missing.");
330
+ continue;
331
+ }
332
+ const values = rawValues.map((rawValue, valueIndex) => {
333
+ if (rawValue === null)
334
+ return null;
335
+ const number = finiteNumber(rawValue);
336
+ if (number === null) {
337
+ collector.add(`${variablePath}[${valueIndex}]`, "Value must be numeric or null.");
338
+ return null;
339
+ }
340
+ return number;
341
+ });
342
+ variables.push({ variable, unit, values });
343
+ }
344
+ const hasTimezone = typeof item.timezone === "string" && item.timezone.length > 0;
345
+ const timezone = hasTimezone ? item.timezone : "GMT";
346
+ if (!hasTimezone) {
347
+ collector.add(`${path}.timezone`, "Provider timezone metadata is missing.");
348
+ }
349
+ else if (!["GMT", "UTC", "Etc/UTC"].includes(timezone)) {
350
+ collector.add(`${path}.timezone`, "Provider timezone must remain GMT/UTC for this operation.");
351
+ }
352
+ const hasUtcOffset = typeof item.utc_offset_seconds === "number" && Number.isInteger(item.utc_offset_seconds);
353
+ const utcOffsetSeconds = hasUtcOffset ? item.utc_offset_seconds : 0;
354
+ if (!hasUtcOffset) {
355
+ collector.add(`${path}.utc_offset_seconds`, "Provider UTC offset metadata must be an integer.");
356
+ }
357
+ else if (utcOffsetSeconds !== 0) {
358
+ collector.add(`${path}.utc_offset_seconds`, "Provider UTC offset must be zero in GMT mode.");
359
+ }
360
+ return {
361
+ requestedLocationIndex: index,
362
+ requestedLocation,
363
+ gridLocation: { latitude, longitude },
364
+ elevation: finiteNumber(item.elevation),
365
+ timezone,
366
+ timezoneAbbreviation: typeof item.timezone_abbreviation === "string" && item.timezone_abbreviation
367
+ ? item.timezone_abbreviation
368
+ : "GMT",
369
+ utcOffsetSeconds,
370
+ timesUtc,
371
+ variables,
372
+ };
373
+ }
374
+ function inclusiveDayCount(startDate, endDate) {
375
+ return (Math.floor((new Date(`${endDate}T00:00:00Z`).getTime() - new Date(`${startDate}T00:00:00Z`).getTime()) /
376
+ 86_400_000) + 1);
377
+ }
378
+ function normalizeProviderTime(value, input) {
379
+ if (typeof value !== "string" || !/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}$/.test(value)) {
380
+ return null;
381
+ }
382
+ const parsed = new Date(`${value}:00Z`);
383
+ if (!Number.isFinite(parsed.getTime()) || parsed.toISOString().slice(0, 16) !== value)
384
+ return null;
385
+ const date = value.slice(0, 10);
386
+ if (date < input.startDate || date > input.endDate)
387
+ return null;
388
+ return `${value}:00Z`;
389
+ }
390
+ function finiteNumber(value) {
391
+ return typeof value === "number" && Number.isFinite(value) ? value : null;
392
+ }
393
+ function recordValue(value) {
394
+ return value !== null && typeof value === "object" && !Array.isArray(value)
395
+ ? value
396
+ : null;
397
+ }
398
+ function codePointOrder(left, right) {
399
+ return left < right ? -1 : left > right ? 1 : 0;
400
+ }
401
+ //# sourceMappingURL=open-meteo-air-quality.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open-meteo-air-quality.js","sourceRoot":"","sources":["../../../src/data/connectors/open-meteo-air-quality.ts"],"names":[],"mappings":"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"}