@tiangong-ai/cli 0.0.50 → 0.0.55

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 (218) hide show
  1. package/AGENTS.md +22 -2
  2. package/README.md +200 -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 +71 -11
  161. package/dist/research/orchestration.js.map +1 -1
  162. package/dist/research/workspace/acquisition.js +70 -5
  163. package/dist/research/workspace/acquisition.js.map +1 -1
  164. package/dist/research/workspace/audit-bundle.js +7 -2
  165. package/dist/research/workspace/audit-bundle.js.map +1 -1
  166. package/dist/research/workspace/broker.js.map +1 -1
  167. package/dist/research/workspace/constants.js.map +1 -1
  168. package/dist/research/workspace/credentials.d.ts +3 -0
  169. package/dist/research/workspace/credentials.js +20 -3
  170. package/dist/research/workspace/credentials.js.map +1 -1
  171. package/dist/research/workspace/data-evidence-adapter.d.ts +60 -0
  172. package/dist/research/workspace/data-evidence-adapter.js +314 -0
  173. package/dist/research/workspace/data-evidence-adapter.js.map +1 -0
  174. package/dist/research/workspace/discovery-status.js +10 -7
  175. package/dist/research/workspace/discovery-status.js.map +1 -1
  176. package/dist/research/workspace/discovery.js +12 -11
  177. package/dist/research/workspace/discovery.js.map +1 -1
  178. package/dist/research/workspace/evidence-ledger.d.ts +8 -1
  179. package/dist/research/workspace/evidence-ledger.js +46 -4
  180. package/dist/research/workspace/evidence-ledger.js.map +1 -1
  181. package/dist/research/workspace/evidence.d.ts +31 -0
  182. package/dist/research/workspace/evidence.js +77 -0
  183. package/dist/research/workspace/evidence.js.map +1 -1
  184. package/dist/research/workspace/executor.js.map +1 -1
  185. package/dist/research/workspace/external-skills.d.ts +49 -49
  186. package/dist/research/workspace/external-skills.js.map +1 -1
  187. package/dist/research/workspace/platform-capabilities.js.map +1 -1
  188. package/dist/research/workspace/preflight.d.ts +4 -4
  189. package/dist/research/workspace/preflight.js +33 -8
  190. package/dist/research/workspace/preflight.js.map +1 -1
  191. package/dist/research/workspace/projects.js +203 -76
  192. package/dist/research/workspace/projects.js.map +1 -1
  193. package/dist/research/workspace/publication.js.map +1 -1
  194. package/dist/research/workspace/research-policy-wizard.js.map +1 -1
  195. package/dist/research/workspace/research-policy.js.map +1 -1
  196. package/dist/research/workspace/runtime.d.ts +7 -0
  197. package/dist/research/workspace/runtime.js +82 -23
  198. package/dist/research/workspace/runtime.js.map +1 -1
  199. package/dist/research/workspace/sanitization.js.map +1 -1
  200. package/dist/research/workspace/schemas.js +1 -1
  201. package/dist/research/workspace/schemas.js.map +1 -1
  202. package/dist/research/workspace/scientific-design.js.map +1 -1
  203. package/dist/research/workspace/scientific-review.js.map +1 -1
  204. package/dist/research/workspace/setup-catalog.d.ts +9 -9
  205. package/dist/research/workspace/setup-catalog.js +2 -2
  206. package/dist/research/workspace/setup-catalog.js.map +1 -1
  207. package/dist/research/workspace/setup-declarative.js.map +1 -1
  208. package/dist/research/workspace/setup-instructions.d.ts +42 -0
  209. package/dist/research/workspace/setup-instructions.js +413 -0
  210. package/dist/research/workspace/setup-instructions.js.map +1 -0
  211. package/dist/research/workspace/setup-invocation.js.map +1 -1
  212. package/dist/research/workspace/setup-wizard.js +7 -0
  213. package/dist/research/workspace/setup-wizard.js.map +1 -1
  214. package/dist/research/workspace/setup.d.ts +18 -15
  215. package/dist/research/workspace/setup.js +68 -3
  216. package/dist/research/workspace/setup.js.map +1 -1
  217. package/dist/research/workspace/workspace.js.map +1 -1
  218. package/package.json +3 -3
@@ -0,0 +1,305 @@
1
+ import { isIP } from "node:net";
2
+ import { Ajv2020 } from "ajv/dist/2020.js";
3
+ import { DATA_CATALOG_SCHEMA_VERSION, DATA_DISCOVERY_SCHEMA_VERSION, DATA_MANIFEST_SCHEMA_VERSION, } from "./contracts.js";
4
+ import { sha256CanonicalJson } from "./runtime/canonical-json.js";
5
+ import { DataRuntimeError } from "./runtime/errors.js";
6
+ import { validateDataPublicContract } from "./schemas.js";
7
+ export class DataRegistry {
8
+ #connectors;
9
+ constructor(definitions) {
10
+ this.#connectors = new Map();
11
+ for (const definition of [...definitions].sort((left, right) => codePointOrder(left.capabilityId, right.capabilityId))) {
12
+ if (this.#connectors.has(definition.capabilityId)) {
13
+ throw new DataRuntimeError("internal-error", `Duplicate data capability ID: ${definition.capabilityId}.`);
14
+ }
15
+ const connector = registerConnector(definition);
16
+ this.#connectors.set(definition.capabilityId, connector);
17
+ }
18
+ }
19
+ catalog() {
20
+ const capabilities = [...this.#connectors.values()].map(toCatalogCapability);
21
+ const stable = { schemaVersion: DATA_CATALOG_SCHEMA_VERSION, capabilities };
22
+ const result = {
23
+ ...stable,
24
+ catalogDigest: sha256CanonicalJson(stable),
25
+ };
26
+ validateDataPublicContract("catalog", result);
27
+ return structuredClone(result);
28
+ }
29
+ describe(capabilityId) {
30
+ const manifest = this.#connectors.get(capabilityId)?.manifest;
31
+ return manifest ? structuredClone(manifest) : undefined;
32
+ }
33
+ discovery(capabilityId) {
34
+ const discovery = this.#connectors.get(capabilityId)?.discovery;
35
+ return discovery ? structuredClone(discovery) : undefined;
36
+ }
37
+ schemas(capabilityId) {
38
+ const schemas = this.#connectors.get(capabilityId)?.schemas;
39
+ return schemas ? structuredClone(schemas) : undefined;
40
+ }
41
+ registered(capabilityId) {
42
+ return this.#connectors.get(capabilityId);
43
+ }
44
+ }
45
+ export function createDataRegistry(definitions = []) {
46
+ return new DataRegistry(definitions);
47
+ }
48
+ function registerConnector(source) {
49
+ const definition = cloneAndFreezeConnector(source);
50
+ assertConnectorDefinition(definition);
51
+ const operations = new Map();
52
+ const schemaDocuments = {};
53
+ const operationManifests = [];
54
+ const operationDiscoveries = [];
55
+ for (const operation of [...definition.operations].sort((left, right) => codePointOrder(left.operationId, right.operationId))) {
56
+ if (operations.has(operation.operationId)) {
57
+ throw new DataRuntimeError("internal-error", `Duplicate operation ID in ${definition.capabilityId}: ${operation.operationId}.`);
58
+ }
59
+ const inputSchemaId = schemaId(operation.inputSchema, "input", operation.operationId);
60
+ const outputSchemaId = schemaId(operation.outputSchema, "output", operation.operationId);
61
+ if (schemaDocuments[inputSchemaId] || schemaDocuments[outputSchemaId]) {
62
+ throw new DataRuntimeError("internal-error", `Duplicate operation schema ID in ${definition.capabilityId}.`);
63
+ }
64
+ const limits = mergeLimits(definition.limits, operation.limits);
65
+ const manifest = {
66
+ operationId: operation.operationId,
67
+ operationVersion: operation.operationVersion,
68
+ inputSchema: {
69
+ schemaId: inputSchemaId,
70
+ digest: sha256CanonicalJson(operation.inputSchema),
71
+ },
72
+ outputSchema: {
73
+ schemaId: outputSchemaId,
74
+ digest: sha256CanonicalJson(operation.outputSchema),
75
+ },
76
+ limits,
77
+ ...(operation.artifactOutput === undefined
78
+ ? {}
79
+ : { artifactOutput: structuredClone(operation.artifactOutput) }),
80
+ };
81
+ const inputAjv = operationAjv();
82
+ const outputAjv = operationAjv();
83
+ const validateInput = inputAjv.compile(operation.inputSchema);
84
+ const validateOutput = outputAjv.compile(operation.outputSchema);
85
+ operations.set(operation.operationId, {
86
+ definition: operation,
87
+ manifest,
88
+ validateInput,
89
+ validateOutput,
90
+ });
91
+ schemaDocuments[inputSchemaId] = structuredClone(operation.inputSchema);
92
+ schemaDocuments[outputSchemaId] = structuredClone(operation.outputSchema);
93
+ operationManifests.push(manifest);
94
+ operationDiscoveries.push({
95
+ operationId: operation.operationId,
96
+ summary: operation.summary,
97
+ description: operation.description,
98
+ });
99
+ }
100
+ const stableManifest = {
101
+ schemaVersion: DATA_MANIFEST_SCHEMA_VERSION,
102
+ capabilityId: definition.capabilityId,
103
+ capabilityVersion: definition.capabilityVersion,
104
+ minimumCliVersion: definition.minimumCliVersion,
105
+ providerId: definition.provider.providerId,
106
+ endpoints: [...definition.endpoints]
107
+ .sort((left, right) => codePointOrder(left.endpointId, right.endpointId))
108
+ .map((endpoint) => ({
109
+ ...structuredClone(endpoint),
110
+ pathPrefixes: [...endpoint.pathPrefixes].sort(codePointOrder),
111
+ allowedMethods: [...endpoint.allowedMethods].sort(codePointOrder),
112
+ allowedContentTypes: [...endpoint.allowedContentTypes].sort(codePointOrder),
113
+ })),
114
+ credentials: [...definition.credentials]
115
+ .sort((left, right) => codePointOrder(left.credentialId, right.credentialId))
116
+ .map((credential) => ({
117
+ ...structuredClone(credential),
118
+ endpointIds: [...credential.endpointIds].sort(codePointOrder),
119
+ })),
120
+ limits: structuredClone(definition.limits),
121
+ diagnostics: structuredClone(definition.diagnostics),
122
+ operations: operationManifests,
123
+ };
124
+ const published = {
125
+ ...stableManifest,
126
+ manifestDigest: sha256CanonicalJson(stableManifest),
127
+ };
128
+ validateDataPublicContract("manifest", published);
129
+ const stableDiscovery = {
130
+ schemaVersion: DATA_DISCOVERY_SCHEMA_VERSION,
131
+ capabilityId: definition.capabilityId,
132
+ capabilityVersion: definition.capabilityVersion,
133
+ source: {
134
+ providerId: definition.provider.providerId,
135
+ name: definition.provider.name,
136
+ maintainedBy: definition.discovery.source.maintainedBy,
137
+ sourceCategory: definition.sourceCategory,
138
+ summary: definition.discovery.source.summary,
139
+ description: definition.discovery.source.description,
140
+ coverage: structuredClone(definition.discovery.source.coverage),
141
+ },
142
+ summary: definition.discovery.summary,
143
+ description: definition.discovery.description,
144
+ provides: [...definition.discovery.provides].sort(codePointOrder),
145
+ doesNotProvide: [...definition.discovery.doesNotProvide].sort(codePointOrder),
146
+ selectionHints: [...definition.discovery.selectionHints].sort(codePointOrder),
147
+ typicalUseCases: [...definition.discovery.typicalUseCases].sort(codePointOrder),
148
+ sourceDocumentation: [...definition.discovery.sourceDocumentation]
149
+ .sort((left, right) => codePointOrder(left.url, right.url) || codePointOrder(left.title, right.title))
150
+ .map((document) => structuredClone(document)),
151
+ license: {
152
+ ...structuredClone(definition.license),
153
+ restrictions: [...definition.license.restrictions].sort(codePointOrder),
154
+ },
155
+ freshness: structuredClone(definition.freshness),
156
+ limitations: [...definition.limitations].sort(codePointOrder),
157
+ operations: operationDiscoveries,
158
+ };
159
+ const discovery = {
160
+ ...stableDiscovery,
161
+ discoveryDigest: sha256CanonicalJson(stableDiscovery),
162
+ };
163
+ validateDataPublicContract("discovery", discovery);
164
+ return {
165
+ definition,
166
+ manifest: published,
167
+ discovery,
168
+ operations,
169
+ schemas: schemaDocuments,
170
+ };
171
+ }
172
+ function cloneAndFreezeConnector(source) {
173
+ const clone = {
174
+ ...source,
175
+ provider: structuredClone(source.provider),
176
+ endpoints: source.endpoints.map((endpoint) => structuredClone(endpoint)),
177
+ license: structuredClone(source.license),
178
+ credentials: source.credentials.map((credential) => structuredClone(credential)),
179
+ limits: structuredClone(source.limits),
180
+ diagnostics: structuredClone(source.diagnostics),
181
+ freshness: structuredClone(source.freshness),
182
+ limitations: [...source.limitations],
183
+ discovery: structuredClone(source.discovery),
184
+ operations: source.operations.map((operation) => ({
185
+ ...operation,
186
+ inputSchema: structuredClone(operation.inputSchema),
187
+ outputSchema: structuredClone(operation.outputSchema),
188
+ ...(operation.limits === undefined ? {} : { limits: structuredClone(operation.limits) }),
189
+ ...(operation.artifactOutput === undefined
190
+ ? {}
191
+ : { artifactOutput: structuredClone(operation.artifactOutput) }),
192
+ })),
193
+ };
194
+ return deepFreeze(clone);
195
+ }
196
+ function deepFreeze(value) {
197
+ if (value === null || typeof value !== "object" || Object.isFrozen(value))
198
+ return value;
199
+ for (const item of Object.values(value))
200
+ deepFreeze(item);
201
+ return Object.freeze(value);
202
+ }
203
+ function assertConnectorDefinition(definition) {
204
+ if (definition.schemaVersion !== DATA_MANIFEST_SCHEMA_VERSION) {
205
+ throw new DataRuntimeError("incompatible-contract", "Unsupported data manifest version.");
206
+ }
207
+ if (definition.operations.length === 0) {
208
+ throw new DataRuntimeError("internal-error", "A data connector must define an operation.");
209
+ }
210
+ assertLimits(definition.limits);
211
+ const endpointIds = new Set();
212
+ for (const endpoint of definition.endpoints) {
213
+ if (endpointIds.has(endpoint.endpointId)) {
214
+ throw new DataRuntimeError("internal-error", "Data endpoint IDs must be unique.");
215
+ }
216
+ endpointIds.add(endpoint.endpointId);
217
+ const base = new URL(endpoint.baseUrl);
218
+ if (base.protocol !== "https:" ||
219
+ base.username ||
220
+ base.password ||
221
+ base.search ||
222
+ base.hash ||
223
+ (base.pathname !== "/" && base.pathname !== "") ||
224
+ isIP(base.hostname) !== 0) {
225
+ throw new DataRuntimeError("endpoint-policy-blocked", "Data endpoint base URLs must be credential-free HTTPS origins with DNS hostnames.");
226
+ }
227
+ if (endpoint.pathPrefixes.length === 0 ||
228
+ endpoint.pathPrefixes.some((prefix) => !prefix.startsWith("/") || !prefix.endsWith("/") || prefix.includes("\\"))) {
229
+ throw new DataRuntimeError("endpoint-policy-blocked", "Data endpoint path prefixes must be absolute slash-delimited directory prefixes.");
230
+ }
231
+ }
232
+ for (const credential of definition.credentials) {
233
+ if (credential.endpointIds.some((endpointId) => !endpointIds.has(endpointId))) {
234
+ throw new DataRuntimeError("endpoint-policy-blocked", "A logical credential references an undeclared endpoint.");
235
+ }
236
+ }
237
+ if (definition.diagnostics.live !== Boolean(definition.liveDoctor)) {
238
+ throw new DataRuntimeError("internal-error", "Live doctor support must match the connector diagnostics declaration.");
239
+ }
240
+ }
241
+ function assertLimits(limits) {
242
+ const positive = [
243
+ limits.timeoutMs,
244
+ limits.maxRequestBytes,
245
+ limits.maxResponseBytes,
246
+ limits.maxPages,
247
+ limits.maxRecords,
248
+ ];
249
+ const nonNegative = [limits.maxRetries, limits.maxRetryDelayMs, limits.maxRedirects];
250
+ if (positive.some((value) => !Number.isInteger(value) || value < 1) ||
251
+ nonNegative.some((value) => !Number.isInteger(value) || value < 0)) {
252
+ throw new DataRuntimeError("internal-error", "Data connector limits are invalid.");
253
+ }
254
+ }
255
+ function mergeLimits(base, override) {
256
+ const merged = { ...base, ...override };
257
+ assertLimits(merged);
258
+ for (const key of Object.keys(base)) {
259
+ if (merged[key] > base[key]) {
260
+ throw new DataRuntimeError("internal-error", `Operation limit ${key} cannot exceed its capability limit.`);
261
+ }
262
+ }
263
+ return merged;
264
+ }
265
+ function schemaId(schema, direction, operationId) {
266
+ const id = schema.$id;
267
+ if (typeof id !== "string" || !id.trim()) {
268
+ throw new DataRuntimeError("internal-error", `The ${operationId} ${direction} schema must declare a stable $id.`);
269
+ }
270
+ if (schema.$schema !== "https://json-schema.org/draft/2020-12/schema") {
271
+ throw new DataRuntimeError("incompatible-contract", `The ${operationId} ${direction} schema must use JSON Schema 2020-12.`);
272
+ }
273
+ return id;
274
+ }
275
+ function operationAjv() {
276
+ return new Ajv2020({ allErrors: true, strict: true, validateFormats: false });
277
+ }
278
+ function toCatalogCapability(connector) {
279
+ const manifest = connector.manifest;
280
+ const discovery = connector.discovery;
281
+ return {
282
+ capabilityId: manifest.capabilityId,
283
+ capabilityVersion: manifest.capabilityVersion,
284
+ minimumCliVersion: manifest.minimumCliVersion,
285
+ providerId: manifest.providerId,
286
+ sourceCategory: discovery.source.sourceCategory,
287
+ summary: discovery.summary,
288
+ provides: [...discovery.provides],
289
+ doesNotProvide: [...discovery.doesNotProvide],
290
+ manifestDigest: manifest.manifestDigest,
291
+ discoveryDigest: discovery.discoveryDigest,
292
+ operations: manifest.operations.map((operation) => ({
293
+ operationId: operation.operationId,
294
+ operationVersion: operation.operationVersion,
295
+ summary: discovery.operations.find((item) => item.operationId === operation.operationId)?.summary ??
296
+ operation.operationId,
297
+ inputSchemaDigest: operation.inputSchema.digest,
298
+ outputSchemaDigest: operation.outputSchema.digest,
299
+ })),
300
+ };
301
+ }
302
+ function codePointOrder(left, right) {
303
+ return left < right ? -1 : left > right ? 1 : 0;
304
+ }
305
+ //# sourceMappingURL=catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/data/catalog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { CliIO } from "../io.js";
2
+ import type { DataRegistry } from "./catalog.js";
3
+ export interface RunDataCommandOptions {
4
+ registry?: DataRegistry | undefined;
5
+ fetchImpl?: typeof fetch | undefined;
6
+ clock?: (() => Date) | undefined;
7
+ }
8
+ export declare function runDataCommand(argv: string[], io: CliIO, options?: RunDataCommandOptions): Promise<number>;
9
+ export declare function dataHelp(): string;
@@ -0,0 +1,307 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { CliError } from "../errors.js";
3
+ import { stringifyJson, write } from "../io.js";
4
+ import { parseStrictArgs, strictBoolean, strictString } from "../strict-args.js";
5
+ import { builtInDataRegistry } from "./builtins.js";
6
+ import { DATA_DESCRIBE_SCHEMA_VERSION, DATA_DOCTOR_SCHEMA_VERSION, DATA_ERROR_SCHEMA_VERSION, } from "./contracts.js";
7
+ import { createBoundedHttpClient } from "./runtime/bounded-http.js";
8
+ import { resolveDataCredentials } from "./runtime/credentials.js";
9
+ import { dataErrorExitCode, DataRuntimeError, toDataMachineError } from "./runtime/errors.js";
10
+ import { executeDataRun } from "./runtime/execute.js";
11
+ import { validateDataPublicContract } from "./schemas.js";
12
+ const MAX_DATA_INPUT_BYTES = 1024 * 1024;
13
+ export async function runDataCommand(argv, io, options = {}) {
14
+ const json = argv.includes("--json");
15
+ const registry = options.registry ?? builtInDataRegistry;
16
+ try {
17
+ const [subcommand, ...rest] = argv;
18
+ if (!subcommand || subcommand === "--help" || subcommand === "-h") {
19
+ write(io.stdout, dataHelp());
20
+ return 0;
21
+ }
22
+ if (subcommand === "catalog")
23
+ return runCatalog(rest, io, registry);
24
+ if (subcommand === "describe")
25
+ return runDescribe(rest, io, registry);
26
+ if (subcommand === "doctor")
27
+ return runDoctor(rest, io, registry, options);
28
+ if (subcommand === "run")
29
+ return runOperation(rest, io, registry, options);
30
+ throw new DataRuntimeError("unsupported-operation", "Unknown data command. Use tiangong-ai data --help.", { details: { subcommand } });
31
+ }
32
+ catch (error) {
33
+ const normalized = error instanceof CliError
34
+ ? new DataRuntimeError("invalid-request", error.message, { exitCode: 2 })
35
+ : error;
36
+ const machine = toDataMachineError(normalized);
37
+ if (json) {
38
+ const envelope = {
39
+ schemaVersion: DATA_ERROR_SCHEMA_VERSION,
40
+ status: "blocked",
41
+ errors: [machine],
42
+ };
43
+ validateDataPublicContract("error", envelope);
44
+ write(io.stdout, stringifyJson(envelope, true));
45
+ }
46
+ else {
47
+ write(io.stderr, `${machine.message}\n`);
48
+ }
49
+ return normalized instanceof DataRuntimeError
50
+ ? normalized.exitCode
51
+ : dataErrorExitCode(machine.code);
52
+ }
53
+ }
54
+ export function dataHelp() {
55
+ return `Tiangong atomic data commands
56
+
57
+ Usage:
58
+ tiangong-ai data catalog [--json]
59
+ tiangong-ai data describe <capability-id> [--json]
60
+ tiangong-ai data doctor <capability-id> [--live] [--json]
61
+ tiangong-ai data run <capability-id> <operation-id> --input <path|-> [--artifact-dir <absolute-existing-directory>] [--json]
62
+
63
+ Data commands use closed, versioned machine contracts. catalog, describe, and
64
+ static doctor are offline. Only an explicit doctor --live or data run may use
65
+ the network. Credentials are resolved from manifest-declared environment
66
+ variables and must never be placed in argv or input JSON.
67
+ `;
68
+ }
69
+ function runCatalog(argv, io, registry) {
70
+ const args = parseStrictArgs(argv, { help: "boolean", json: "boolean" }, "data catalog");
71
+ if (strictBoolean(args, "help")) {
72
+ write(io.stdout, dataHelp());
73
+ return 0;
74
+ }
75
+ assertPositionals(args.positionals, 0, "data catalog");
76
+ const result = registry.catalog();
77
+ if (strictBoolean(args, "json")) {
78
+ write(io.stdout, stringifyJson(result, true));
79
+ }
80
+ else if (result.capabilities.length === 0) {
81
+ write(io.stdout, "No built-in data capabilities are registered.\n");
82
+ }
83
+ else {
84
+ for (const capability of result.capabilities) {
85
+ write(io.stdout, `${capability.capabilityId}\t${capability.capabilityVersion}\t${capability.providerId}\t${capability.summary}\n`);
86
+ }
87
+ }
88
+ return 0;
89
+ }
90
+ function runDescribe(argv, io, registry) {
91
+ const args = parseStrictArgs(argv, { help: "boolean", json: "boolean" }, "data describe");
92
+ if (strictBoolean(args, "help")) {
93
+ write(io.stdout, dataHelp());
94
+ return 0;
95
+ }
96
+ assertPositionals(args.positionals, 1, "data describe");
97
+ const capabilityId = args.positionals[0];
98
+ const manifest = registry.describe(capabilityId);
99
+ const discovery = registry.discovery(capabilityId);
100
+ const schemas = registry.schemas(capabilityId);
101
+ if (!manifest || !discovery || !schemas) {
102
+ throw new DataRuntimeError("invalid-request", "The requested data capability is not registered.", {
103
+ details: { capabilityId },
104
+ });
105
+ }
106
+ const result = {
107
+ schemaVersion: DATA_DESCRIBE_SCHEMA_VERSION,
108
+ manifest,
109
+ discovery,
110
+ schemas,
111
+ };
112
+ validateDataPublicContract("describe", result);
113
+ if (strictBoolean(args, "json")) {
114
+ write(io.stdout, stringifyJson(result, true));
115
+ }
116
+ else {
117
+ write(io.stdout, `${manifest.capabilityId} ${manifest.capabilityVersion}\n`);
118
+ write(io.stdout, `${discovery.summary}\n`);
119
+ write(io.stdout, `source ${discovery.source.name}\n`);
120
+ write(io.stdout, `manifest ${manifest.manifestDigest}\n`);
121
+ write(io.stdout, `discovery ${discovery.discoveryDigest}\n`);
122
+ for (const item of discovery.provides)
123
+ write(io.stdout, `provides ${item}\n`);
124
+ for (const item of discovery.doesNotProvide) {
125
+ write(io.stdout, `does-not-provide ${item}\n`);
126
+ }
127
+ for (const operation of manifest.operations) {
128
+ const operationDiscovery = discovery.operations.find((item) => item.operationId === operation.operationId);
129
+ write(io.stdout, `${operation.operationId} ${operation.operationVersion}\t${operationDiscovery?.summary ?? ""}\n`);
130
+ }
131
+ }
132
+ return 0;
133
+ }
134
+ async function runDoctor(argv, io, registry, options) {
135
+ const args = parseStrictArgs(argv, { help: "boolean", json: "boolean", live: "boolean" }, "data doctor");
136
+ if (strictBoolean(args, "help")) {
137
+ write(io.stdout, dataHelp());
138
+ return 0;
139
+ }
140
+ assertPositionals(args.positionals, 1, "data doctor");
141
+ const capabilityId = args.positionals[0];
142
+ const connector = registry.registered(capabilityId);
143
+ if (!connector) {
144
+ throw new DataRuntimeError("invalid-request", "The requested data capability is not registered.", {
145
+ details: { capabilityId },
146
+ });
147
+ }
148
+ const live = strictBoolean(args, "live");
149
+ const resolved = resolveDataCredentials(connector.definition.credentials, io.env);
150
+ let checks = [
151
+ {
152
+ checkId: "manifest",
153
+ status: "pass",
154
+ message: "The built-in manifest and operation schemas are valid.",
155
+ },
156
+ ...resolved.checks,
157
+ ];
158
+ let networkAttempted = false;
159
+ if (live) {
160
+ if (!connector.definition.diagnostics.live || !connector.definition.liveDoctor) {
161
+ throw new DataRuntimeError("unsupported-operation", "This data capability does not provide a live doctor probe.");
162
+ }
163
+ if (!checks.some((check) => check.status === "fail")) {
164
+ const http = createBoundedHttpClient({
165
+ capabilityId: connector.manifest.capabilityId,
166
+ endpoints: connector.definition.endpoints,
167
+ credentials: connector.definition.credentials,
168
+ environment: io.env,
169
+ limits: connector.definition.limits,
170
+ ...(options.fetchImpl === undefined ? {} : { fetchImpl: options.fetchImpl }),
171
+ });
172
+ const liveResult = await connector.definition.liveDoctor({ http });
173
+ checks = [...checks, ...liveResult.checks];
174
+ networkAttempted = liveResult.networkAttempted ?? true;
175
+ }
176
+ }
177
+ const status = checks.some((check) => check.status === "fail")
178
+ ? "blocked"
179
+ : checks.some((check) => check.status === "warn")
180
+ ? "degraded"
181
+ : "ready";
182
+ const result = {
183
+ schemaVersion: DATA_DOCTOR_SCHEMA_VERSION,
184
+ capabilityId: connector.manifest.capabilityId,
185
+ capabilityVersion: connector.manifest.capabilityVersion,
186
+ manifestDigest: connector.manifest.manifestDigest,
187
+ mode: live ? "live" : "static",
188
+ status,
189
+ networkAttempted,
190
+ checks,
191
+ };
192
+ validateDataPublicContract("doctor", result);
193
+ if (strictBoolean(args, "json")) {
194
+ write(io.stdout, stringifyJson(result, true));
195
+ }
196
+ else {
197
+ write(io.stdout, `${result.capabilityId}\t${result.mode}\t${result.status}\n`);
198
+ for (const check of checks)
199
+ write(io.stdout, `${check.status}\t${check.message}\n`);
200
+ }
201
+ return status === "blocked" ? 3 : 0;
202
+ }
203
+ async function runOperation(argv, io, registry, options) {
204
+ const args = parseStrictArgs(argv, { "artifact-dir": "string", help: "boolean", input: "string", json: "boolean" }, "data run");
205
+ if (strictBoolean(args, "help")) {
206
+ write(io.stdout, dataHelp());
207
+ return 0;
208
+ }
209
+ assertPositionals(args.positionals, 2, "data run");
210
+ const inputSource = strictString(args, "input");
211
+ if (!inputSource) {
212
+ throw new DataRuntimeError("invalid-request", "data run requires --input <path|->.", {
213
+ exitCode: 2,
214
+ });
215
+ }
216
+ const rawRequest = await readDataInput(inputSource, io);
217
+ assertCommandBinding(rawRequest, args.positionals[0], args.positionals[1]);
218
+ const artifactOutputDirectory = strictString(args, "artifact-dir");
219
+ const result = await executeDataRun(rawRequest, {
220
+ registry,
221
+ environment: io.env,
222
+ ...(options.fetchImpl === undefined ? {} : { fetchImpl: options.fetchImpl }),
223
+ ...(options.clock === undefined ? {} : { clock: options.clock }),
224
+ ...(artifactOutputDirectory === undefined ? {} : { artifactOutputDirectory }),
225
+ });
226
+ if (strictBoolean(args, "json")) {
227
+ write(io.stdout, stringifyJson(result, true));
228
+ }
229
+ else {
230
+ writeHumanRunResult(io, result);
231
+ }
232
+ if (result.status === "success")
233
+ return 0;
234
+ if (result.status === "partial")
235
+ return 4;
236
+ return dataErrorExitCode(result.errors[0]?.code ?? "internal-error");
237
+ }
238
+ async function readDataInput(source, io) {
239
+ let bytes;
240
+ if (source === "-") {
241
+ if (!io.stdin) {
242
+ throw new DataRuntimeError("invalid-request", "Standard input is unavailable.", {
243
+ exitCode: 2,
244
+ });
245
+ }
246
+ const chunks = [];
247
+ let total = 0;
248
+ for await (const chunk of io.stdin) {
249
+ const bytesChunk = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
250
+ total += bytesChunk.byteLength;
251
+ if (total > MAX_DATA_INPUT_BYTES) {
252
+ throw new DataRuntimeError("invalid-request", "The data run input exceeds 1 MiB.", {
253
+ exitCode: 2,
254
+ });
255
+ }
256
+ chunks.push(bytesChunk);
257
+ }
258
+ bytes = Buffer.concat(chunks);
259
+ }
260
+ else {
261
+ try {
262
+ bytes = await readFile(source);
263
+ }
264
+ catch {
265
+ throw new DataRuntimeError("invalid-request", "The data run input file could not be read.", {
266
+ exitCode: 2,
267
+ });
268
+ }
269
+ if (bytes.byteLength > MAX_DATA_INPUT_BYTES) {
270
+ throw new DataRuntimeError("invalid-request", "The data run input exceeds 1 MiB.", {
271
+ exitCode: 2,
272
+ });
273
+ }
274
+ }
275
+ try {
276
+ return JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(bytes));
277
+ }
278
+ catch {
279
+ throw new DataRuntimeError("invalid-request", "The data run input is not valid UTF-8 JSON.", {
280
+ exitCode: 2,
281
+ });
282
+ }
283
+ }
284
+ function assertCommandBinding(value, capabilityId, operationId) {
285
+ const request = value;
286
+ if (!request ||
287
+ typeof request !== "object" ||
288
+ request.capabilityId !== capabilityId ||
289
+ request.operationId !== operationId) {
290
+ throw new DataRuntimeError("invalid-request", "The command capability and operation must match the input request contract.", { exitCode: 2 });
291
+ }
292
+ }
293
+ function assertPositionals(positionals, count, command) {
294
+ if (positionals.length !== count) {
295
+ throw new DataRuntimeError("invalid-request", `${command} expects exactly ${count} positional argument${count === 1 ? "" : "s"}.`, { exitCode: 2 });
296
+ }
297
+ }
298
+ function writeHumanRunResult(io, result) {
299
+ write(io.stdout, `${result.status}\t${result.contract.capabilityId}/${result.contract.operationId}\n`);
300
+ write(io.stdout, `records\t${result.summary.recordCount}\n`);
301
+ write(io.stdout, `receipt\t${result.receipt.receiptDigest}\n`);
302
+ for (const warning of result.warnings)
303
+ write(io.stdout, `warning\t${warning}\n`);
304
+ for (const error of result.errors)
305
+ write(io.stdout, `error\t${error.code}\t${error.message}\n`);
306
+ }
307
+ //# sourceMappingURL=commands.js.map