@tiangong-ai/cli 0.0.61 → 0.0.63

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 +17 -6
  2. package/CONTRIBUTING.md +5 -5
  3. package/README.md +417 -36
  4. package/dist/cli.js +2 -2
  5. package/dist/data/builtins.js +33 -5
  6. package/dist/data/builtins.js.map +1 -1
  7. package/dist/data/catalog.js +46 -0
  8. package/dist/data/catalog.js.map +1 -1
  9. package/dist/data/commands.js +15 -1
  10. package/dist/data/commands.js.map +1 -1
  11. package/dist/data/connectors/airnow-hourly-observations.js +60 -10
  12. package/dist/data/connectors/airnow-hourly-observations.js.map +1 -1
  13. package/dist/data/connectors/epa-eis-records.js +16 -2
  14. package/dist/data/connectors/epa-eis-records.js.map +1 -1
  15. package/dist/data/connectors/gdelt-doc-search.js +54 -18
  16. package/dist/data/connectors/gdelt-doc-search.js.map +1 -1
  17. package/dist/data/connectors/gdelt-file-feeds.js +20 -11
  18. package/dist/data/connectors/gdelt-file-feeds.js.map +1 -1
  19. package/dist/data/connectors/gdelt-web-ngrams.d.ts +2 -0
  20. package/dist/data/connectors/gdelt-web-ngrams.js +350 -0
  21. package/dist/data/connectors/gdelt-web-ngrams.js.map +1 -0
  22. package/dist/data/connectors/gdelt-web-ngrams.schemas.d.ts +188 -0
  23. package/dist/data/connectors/gdelt-web-ngrams.schemas.js +138 -0
  24. package/dist/data/connectors/gdelt-web-ngrams.schemas.js.map +1 -0
  25. package/dist/data/connectors/nasa-firms-fire.js +4 -0
  26. package/dist/data/connectors/nasa-firms-fire.js.map +1 -1
  27. package/dist/data/connectors/open-meteo-air-quality.js +27 -22
  28. package/dist/data/connectors/open-meteo-air-quality.js.map +1 -1
  29. package/dist/data/connectors/open-meteo-air-quality.schemas.d.ts +4 -1
  30. package/dist/data/connectors/open-meteo-air-quality.schemas.js +21 -1
  31. package/dist/data/connectors/open-meteo-air-quality.schemas.js.map +1 -1
  32. package/dist/data/connectors/open-meteo-flood.js +28 -23
  33. package/dist/data/connectors/open-meteo-flood.js.map +1 -1
  34. package/dist/data/connectors/open-meteo-flood.schemas.d.ts +4 -1
  35. package/dist/data/connectors/open-meteo-flood.schemas.js +21 -1
  36. package/dist/data/connectors/open-meteo-flood.schemas.js.map +1 -1
  37. package/dist/data/connectors/open-meteo-historical-weather.js +26 -21
  38. package/dist/data/connectors/open-meteo-historical-weather.js.map +1 -1
  39. package/dist/data/connectors/open-meteo-historical-weather.schemas.d.ts +4 -1
  40. package/dist/data/connectors/open-meteo-historical-weather.schemas.js +21 -1
  41. package/dist/data/connectors/open-meteo-historical-weather.schemas.js.map +1 -1
  42. package/dist/data/connectors/openaq-air-quality.js +50 -12
  43. package/dist/data/connectors/openaq-air-quality.js.map +1 -1
  44. package/dist/data/connectors/openaq-air-quality.schemas.d.ts +0 -4
  45. package/dist/data/connectors/openaq-air-quality.schemas.js +2 -2
  46. package/dist/data/connectors/openaq-air-quality.schemas.js.map +1 -1
  47. package/dist/data/connectors/youtube-public-content.js +76 -6
  48. package/dist/data/connectors/youtube-public-content.js.map +1 -1
  49. package/dist/data/connectors/youtube-public-content.schemas.d.ts +63 -3
  50. package/dist/data/connectors/youtube-public-content.schemas.js +56 -2
  51. package/dist/data/connectors/youtube-public-content.schemas.js.map +1 -1
  52. package/dist/data/contracts.d.ts +22 -1
  53. package/dist/data/runtime/bounded-http.d.ts +2 -0
  54. package/dist/data/runtime/bounded-http.js +221 -59
  55. package/dist/data/runtime/bounded-http.js.map +1 -1
  56. package/dist/data/runtime/execute.d.ts +2 -0
  57. package/dist/data/runtime/execute.js +82 -60
  58. package/dist/data/runtime/execute.js.map +1 -1
  59. package/dist/data/runtime/http-timing.d.ts +15 -0
  60. package/dist/data/runtime/http-timing.js +59 -0
  61. package/dist/data/runtime/http-timing.js.map +1 -0
  62. package/dist/data/runtime/http-transport.d.ts +1 -0
  63. package/dist/data/runtime/http-transport.js +27 -0
  64. package/dist/data/runtime/http-transport.js.map +1 -0
  65. package/dist/data/schemas/catalog.v1.json +46 -0
  66. package/dist/data/schemas/discovery.v1.json +12 -0
  67. package/dist/data/schemas/error.v1.json +1 -0
  68. package/dist/data/schemas/manifest.v1.json +19 -1
  69. package/dist/research/orchestration.js +233 -10
  70. package/dist/research/orchestration.js.map +1 -1
  71. package/dist/research/setup-command.js +37 -6
  72. package/dist/research/setup-command.js.map +1 -1
  73. package/dist/research/workspace/audit-bundle.js +28 -8
  74. package/dist/research/workspace/audit-bundle.js.map +1 -1
  75. package/dist/research/workspace/broker.js +25 -4
  76. package/dist/research/workspace/broker.js.map +1 -1
  77. package/dist/research/workspace/constants.d.ts +1 -0
  78. package/dist/research/workspace/constants.js +1 -0
  79. package/dist/research/workspace/constants.js.map +1 -1
  80. package/dist/research/workspace/content-evidence.d.ts +1 -0
  81. package/dist/research/workspace/content-evidence.js +1 -1
  82. package/dist/research/workspace/content-evidence.js.map +1 -1
  83. package/dist/research/workspace/credentials.js +2 -1
  84. package/dist/research/workspace/credentials.js.map +1 -1
  85. package/dist/research/workspace/data-evidence-adapter.d.ts +71 -0
  86. package/dist/research/workspace/data-evidence-adapter.js +269 -59
  87. package/dist/research/workspace/data-evidence-adapter.js.map +1 -1
  88. package/dist/research/workspace/data-evidence-view.d.ts +58 -0
  89. package/dist/research/workspace/data-evidence-view.js +411 -0
  90. package/dist/research/workspace/data-evidence-view.js.map +1 -0
  91. package/dist/research/workspace/evidence-ledger.js +32 -29
  92. package/dist/research/workspace/evidence-ledger.js.map +1 -1
  93. package/dist/research/workspace/evidence.d.ts +28 -0
  94. package/dist/research/workspace/evidence.js +48 -0
  95. package/dist/research/workspace/evidence.js.map +1 -1
  96. package/dist/research/workspace/executor.d.ts +27 -1
  97. package/dist/research/workspace/executor.js +180 -20
  98. package/dist/research/workspace/executor.js.map +1 -1
  99. package/dist/research/workspace/external-skills.d.ts +1 -0
  100. package/dist/research/workspace/external-skills.js +4 -2
  101. package/dist/research/workspace/external-skills.js.map +1 -1
  102. package/dist/research/workspace/investigation-attempt.d.ts +159 -0
  103. package/dist/research/workspace/investigation-attempt.js +619 -0
  104. package/dist/research/workspace/investigation-attempt.js.map +1 -0
  105. package/dist/research/workspace/investigation-audit.d.ts +20 -0
  106. package/dist/research/workspace/investigation-audit.js +306 -0
  107. package/dist/research/workspace/investigation-audit.js.map +1 -0
  108. package/dist/research/workspace/investigation-candidate.d.ts +84 -0
  109. package/dist/research/workspace/investigation-candidate.js +156 -0
  110. package/dist/research/workspace/investigation-candidate.js.map +1 -0
  111. package/dist/research/workspace/investigation-certification.d.ts +39 -0
  112. package/dist/research/workspace/investigation-certification.js +152 -0
  113. package/dist/research/workspace/investigation-certification.js.map +1 -0
  114. package/dist/research/workspace/investigation-close.d.ts +47 -0
  115. package/dist/research/workspace/investigation-close.js +153 -0
  116. package/dist/research/workspace/investigation-close.js.map +1 -0
  117. package/dist/research/workspace/investigation-lineage.d.ts +8 -0
  118. package/dist/research/workspace/investigation-lineage.js +10 -0
  119. package/dist/research/workspace/investigation-lineage.js.map +1 -0
  120. package/dist/research/workspace/investigation-observer.d.ts +22 -0
  121. package/dist/research/workspace/investigation-observer.js +122 -0
  122. package/dist/research/workspace/investigation-observer.js.map +1 -0
  123. package/dist/research/workspace/investigation-promotion.d.ts +129 -0
  124. package/dist/research/workspace/investigation-promotion.js +316 -0
  125. package/dist/research/workspace/investigation-promotion.js.map +1 -0
  126. package/dist/research/workspace/investigation-requirements.d.ts +5 -0
  127. package/dist/research/workspace/investigation-requirements.js +32 -0
  128. package/dist/research/workspace/investigation-requirements.js.map +1 -0
  129. package/dist/research/workspace/investigation-resources.d.ts +12 -0
  130. package/dist/research/workspace/investigation-resources.js +78 -0
  131. package/dist/research/workspace/investigation-resources.js.map +1 -0
  132. package/dist/research/workspace/investigation-source-export.d.ts +6 -0
  133. package/dist/research/workspace/investigation-source-export.js +68 -0
  134. package/dist/research/workspace/investigation-source-export.js.map +1 -0
  135. package/dist/research/workspace/investigation-store.d.ts +9 -0
  136. package/dist/research/workspace/investigation-store.js +55 -0
  137. package/dist/research/workspace/investigation-store.js.map +1 -0
  138. package/dist/research/workspace/investigation.d.ts +424 -0
  139. package/dist/research/workspace/investigation.js +716 -0
  140. package/dist/research/workspace/investigation.js.map +1 -0
  141. package/dist/research/workspace/native-process-supervisor.d.ts +1 -0
  142. package/dist/research/workspace/native-process-supervisor.js +97 -0
  143. package/dist/research/workspace/native-process-supervisor.js.map +1 -0
  144. package/dist/research/workspace/native-run.d.ts +79 -6
  145. package/dist/research/workspace/native-run.js +293 -51
  146. package/dist/research/workspace/native-run.js.map +1 -1
  147. package/dist/research/workspace/preflight.d.ts +3 -0
  148. package/dist/research/workspace/preflight.js +11 -6
  149. package/dist/research/workspace/preflight.js.map +1 -1
  150. package/dist/research/workspace/project-authority.js +2 -0
  151. package/dist/research/workspace/project-authority.js.map +1 -1
  152. package/dist/research/workspace/project-budget.d.ts +41 -0
  153. package/dist/research/workspace/project-budget.js +265 -0
  154. package/dist/research/workspace/project-budget.js.map +1 -0
  155. package/dist/research/workspace/project-mutations.d.ts +1 -1
  156. package/dist/research/workspace/project-mutations.js +27 -3
  157. package/dist/research/workspace/project-mutations.js.map +1 -1
  158. package/dist/research/workspace/projects.d.ts +66 -0
  159. package/dist/research/workspace/projects.js +181 -3
  160. package/dist/research/workspace/projects.js.map +1 -1
  161. package/dist/research/workspace/provider-budget.d.ts +3 -0
  162. package/dist/research/workspace/provider-budget.js +45 -0
  163. package/dist/research/workspace/provider-budget.js.map +1 -0
  164. package/dist/research/workspace/provider-state.d.ts +1 -0
  165. package/dist/research/workspace/provider-state.js +20 -0
  166. package/dist/research/workspace/provider-state.js.map +1 -0
  167. package/dist/research/workspace/publication-lineage.d.ts +34 -0
  168. package/dist/research/workspace/publication-lineage.js +165 -0
  169. package/dist/research/workspace/publication-lineage.js.map +1 -0
  170. package/dist/research/workspace/publication-workflow.d.ts +24 -0
  171. package/dist/research/workspace/publication-workflow.js +118 -14
  172. package/dist/research/workspace/publication-workflow.js.map +1 -1
  173. package/dist/research/workspace/review-executor.d.ts +6 -1
  174. package/dist/research/workspace/review-executor.js +17 -3
  175. package/dist/research/workspace/review-executor.js.map +1 -1
  176. package/dist/research/workspace/runtime.d.ts +12 -1
  177. package/dist/research/workspace/runtime.js +143 -19
  178. package/dist/research/workspace/runtime.js.map +1 -1
  179. package/dist/research/workspace/scientific-amendment.d.ts +103 -0
  180. package/dist/research/workspace/scientific-amendment.js +537 -0
  181. package/dist/research/workspace/scientific-amendment.js.map +1 -0
  182. package/dist/research/workspace/scientific-fulfillment-audit.d.ts +20 -2
  183. package/dist/research/workspace/scientific-fulfillment-audit.js +87 -7
  184. package/dist/research/workspace/scientific-fulfillment-audit.js.map +1 -1
  185. package/dist/research/workspace/scientific-fulfillment.d.ts +10 -1
  186. package/dist/research/workspace/scientific-fulfillment.js +20 -6
  187. package/dist/research/workspace/scientific-fulfillment.js.map +1 -1
  188. package/dist/research/workspace/scientific-review-execution.js +162 -22
  189. package/dist/research/workspace/scientific-review-execution.js.map +1 -1
  190. package/dist/research/workspace/scientific-review.d.ts +2 -1
  191. package/dist/research/workspace/scientific-review.js +33 -2
  192. package/dist/research/workspace/scientific-review.js.map +1 -1
  193. package/dist/research/workspace/setup-catalog.js +13 -13
  194. package/dist/research/workspace/setup-catalog.js.map +1 -1
  195. package/dist/research/workspace/setup-release.d.ts +22 -0
  196. package/dist/research/workspace/setup-release.js +426 -0
  197. package/dist/research/workspace/setup-release.js.map +1 -0
  198. package/dist/research/workspace/setup-runtime-integrity.d.ts +2 -0
  199. package/dist/research/workspace/setup-runtime-integrity.js +31 -0
  200. package/dist/research/workspace/setup-runtime-integrity.js.map +1 -0
  201. package/dist/research/workspace/setup-upgrade.d.ts +17 -0
  202. package/dist/research/workspace/setup-upgrade.js +784 -0
  203. package/dist/research/workspace/setup-upgrade.js.map +1 -0
  204. package/dist/research/workspace/setup.d.ts +31 -39
  205. package/dist/research/workspace/setup.js +228 -19
  206. package/dist/research/workspace/setup.js.map +1 -1
  207. package/dist/research/workspace/task-acceptance.d.ts +8 -1
  208. package/dist/research/workspace/task-acceptance.js +37 -5
  209. package/dist/research/workspace/task-acceptance.js.map +1 -1
  210. package/dist/research/workspace/task-audit.d.ts +5 -1
  211. package/dist/research/workspace/task-audit.js +33 -18
  212. package/dist/research/workspace/task-audit.js.map +1 -1
  213. package/dist/research/workspace/types.d.ts +44 -0
  214. package/dist/research/workspace/workspace.js +34 -4
  215. package/dist/research/workspace/workspace.js.map +1 -1
  216. package/package.json +5 -4
@@ -0,0 +1,350 @@
1
+ import { gunzipSync } from "node:zlib";
2
+ import { DATA_MANIFEST_SCHEMA_VERSION } from "../contracts.js";
3
+ import { DataRuntimeError } from "../runtime/errors.js";
4
+ import { GDELT_WEB_NGRAMS_INPUT_SCHEMA, GDELT_WEB_NGRAMS_OUTPUT_SCHEMA, } from "./gdelt-web-ngrams.schemas.js";
5
+ const BASE_URL = "https://data.gdeltproject.org";
6
+ const PREFIX = "/gdeltv5/weblegacy/ngrams/";
7
+ const MAX_UNCOMPRESSED_BYTES = 64 * 1024 * 1024;
8
+ const DOCUMENTATION = "https://blog.gdeltproject.org/using-the-new-web-ngrams-dataset-to-find-relevant-coverage/";
9
+ export const gdeltWebNgramsConnector = {
10
+ schemaVersion: DATA_MANIFEST_SCHEMA_VERSION,
11
+ capabilityId: "gdelt.web-ngrams",
12
+ capabilityVersion: "1.0.0",
13
+ minimumCliVersion: "0.0.61",
14
+ provider: { providerId: "gdelt", name: "GDELT Project" },
15
+ sourceCategory: "global-news-metadata",
16
+ endpoints: [
17
+ {
18
+ endpointId: "gdelt-web-ngrams",
19
+ baseUrl: BASE_URL,
20
+ pathPrefixes: [PREFIX],
21
+ allowedMethods: ["GET"],
22
+ allowedContentTypes: [
23
+ "application/json",
24
+ "text/plain",
25
+ "application/gzip",
26
+ "application/x-gzip",
27
+ "application/octet-stream",
28
+ ],
29
+ },
30
+ ],
31
+ license: {
32
+ name: "GDELT Project data",
33
+ url: "https://www.gdeltproject.org/about.html",
34
+ restrictions: [
35
+ "Non-consumptive quadgram histograms and link metadata, not article full text.",
36
+ "Source-specific rights still apply when following or reusing linked content.",
37
+ ],
38
+ },
39
+ credentials: [],
40
+ limits: {
41
+ timeoutMs: 60_000,
42
+ maxRequestBytes: 4_096,
43
+ maxResponseBytes: 20 * 1024 * 1024,
44
+ maxPages: 2,
45
+ maxRecords: 5_000,
46
+ maxRetries: 2,
47
+ maxRetryDelayMs: 60_000,
48
+ maxRedirects: 2,
49
+ },
50
+ diagnostics: { static: true, live: false },
51
+ freshness: {
52
+ kind: "provider-current",
53
+ description: "Explicit provider minute files; nominal publication lag and missing minutes do not establish continuous coverage.",
54
+ },
55
+ limitations: [
56
+ "One explicit paired minute per call; at most 64 MiB decompressed per file. Missing or corrupt files are blocked, never an empty successful search.",
57
+ "Literal 1–4-word phrases only. No DOC query-language equivalence, tone timeline, ranking, translation, or complete corpus guarantee.",
58
+ "DOCIDs reset per minute; use fileTimestamp plus documentId. Repeated URLs across minutes are not silently deduplicated.",
59
+ ],
60
+ discovery: {
61
+ source: {
62
+ maintainedBy: "The GDELT Project",
63
+ summary: "Web NGrams quadgram histograms and paired article tables of contents.",
64
+ description: "A file-based keyword-search route recommended during legacy search infrastructure migration. The official paired files associate per-document quadgrams with URLs and titles without article bodies.",
65
+ coverage: {
66
+ geographic: "Monitored global web news with uneven source and language coverage.",
67
+ temporal: "Explicit published UTC minutes. Legacy 15-minute processing can leave missing minutes; an arbitrary time range is not guaranteed covered.",
68
+ granularity: "Per-minute, per-document quadgram presence joined to the same minute's TOC.",
69
+ },
70
+ },
71
+ summary: "Find article links containing literal words or short phrases in one published minute.",
72
+ description: "Fetch both official GZIP files, validate and join file-scoped document IDs, and scan every valid quadgram before returning bounded matching article metadata.",
73
+ provides: [
74
+ "Literal case-insensitive word/phrase matching with any/all document selection and optional TOC language filters.",
75
+ "Matched phrases, file provenance, validation counts, and explicit omitted-result counts.",
76
+ ],
77
+ doesNotProvide: [
78
+ "DOC operators, DOC sentiment/volume timelines, semantic search, or relevance ranking.",
79
+ "Article bodies, reconstructed text, reliable phrase-frequency sums, or all-news coverage.",
80
+ ],
81
+ selectionHints: [
82
+ "Choose for literal topic discovery when a published minute is known, including when DOC is load-shedding. It does not automatically replace a DOC query.",
83
+ "Choose GKG for machine-coded themes/entities/tone, Events for coded events, and Mentions for event-document linkage. Join only when the research question needs those semantics.",
84
+ "For ranges, the caller must explicitly enumerate intended minutes and report missing minutes; a successful single minute is not a complete range.",
85
+ ],
86
+ typicalUseCases: ["Find candidate article URLs containing a disease name in a known minute."],
87
+ sourceDocumentation: [{ title: "Using the new Web NGrams dataset", url: DOCUMENTATION }],
88
+ },
89
+ operations: [
90
+ {
91
+ operationId: "search",
92
+ operationVersion: "1.0.0",
93
+ summary: "Search one explicit NGrams/TOC minute pair.",
94
+ description: "Validate both files and join document-scoped literal matches to metadata; report malformed rows and output truncation separately from no matches.",
95
+ inputSchema: GDELT_WEB_NGRAMS_INPUT_SCHEMA,
96
+ outputSchema: GDELT_WEB_NGRAMS_OUTPUT_SCHEMA,
97
+ execute: search,
98
+ },
99
+ ],
100
+ };
101
+ async function search(context) {
102
+ const input = context.input;
103
+ const parsedDate = new Date(input.fileTimestamp);
104
+ const phrases = input.phrases.map((phrase) => phrase.trim().replace(/\s+/gu, " "));
105
+ if (!Number.isFinite(parsedDate.getTime()) ||
106
+ parsedDate.toISOString() !== input.fileTimestamp.replace("Z", ".000Z") ||
107
+ phrases.some((phrase) => !phrase || phrase.split(" ").length > 4 || !/[\p{L}\p{N}]/u.test(phrase)) ||
108
+ new Set(phrases.map((phrase) => phrase.toLowerCase())).size !== phrases.length ||
109
+ context.limits.maxPages < 2) {
110
+ throw new DataRuntimeError("invalid-request", "Use an actual UTC minute, unique literal 1–4-word phrases, and a request budget for both files.");
111
+ }
112
+ const stem = input.fileTimestamp.replace(/[-:TZ]/gu, "");
113
+ const observations = [];
114
+ const files = [];
115
+ async function read(kind) {
116
+ const path = `${PREFIX}${stem}.${kind === "toc" ? "toc.json" : "ngrams.txt"}.gz`;
117
+ const response = await context.http.request({
118
+ endpointId: "gdelt-web-ngrams",
119
+ method: "GET",
120
+ path,
121
+ });
122
+ let bytes;
123
+ let content;
124
+ try {
125
+ bytes = gunzipSync(response.bytes, { maxOutputLength: MAX_UNCOMPRESSED_BYTES });
126
+ content = new TextDecoder("utf-8", { fatal: true }).decode(bytes);
127
+ }
128
+ catch {
129
+ throw new DataRuntimeError("provider-response-invalid", "GDELT minute file is not valid bounded UTF-8 GZIP data.", {
130
+ details: {
131
+ kind,
132
+ fileTimestamp: input.fileTimestamp,
133
+ maxUncompressedBytes: MAX_UNCOMPRESSED_BYTES,
134
+ },
135
+ });
136
+ }
137
+ observations.push(response.observation);
138
+ files.push({
139
+ kind,
140
+ sourceUrl: BASE_URL + path,
141
+ compressedBytes: response.bytes.byteLength,
142
+ uncompressedBytes: bytes.byteLength,
143
+ responseDigest: response.observation.responseDigest,
144
+ });
145
+ return content;
146
+ }
147
+ const statistics = {
148
+ tocRows: 0,
149
+ ngramRows: 0,
150
+ invalidTocRows: 0,
151
+ invalidNgramRows: 0,
152
+ orphanNgramRows: 0,
153
+ ambiguousDocumentCount: 0,
154
+ duplicateTocRows: 0,
155
+ };
156
+ const articles = new Map();
157
+ const ambiguous = new Set();
158
+ for (const line of lines(await read("toc"))) {
159
+ statistics.tocRows++;
160
+ const article = parseArticle(line, input.fileTimestamp);
161
+ if (!article) {
162
+ statistics.invalidTocRows++;
163
+ continue;
164
+ }
165
+ if (ambiguous.has(article.documentId)) {
166
+ statistics.duplicateTocRows++;
167
+ continue;
168
+ }
169
+ const previous = articles.get(article.documentId);
170
+ if (previous) {
171
+ statistics.duplicateTocRows++;
172
+ if (JSON.stringify(previous) !== JSON.stringify(article)) {
173
+ articles.delete(article.documentId);
174
+ ambiguous.add(article.documentId);
175
+ }
176
+ }
177
+ else
178
+ articles.set(article.documentId, article);
179
+ }
180
+ statistics.ambiguousDocumentCount = ambiguous.size;
181
+ const patterns = phrases.map((phrase) => new RegExp(`(?<![\\p{L}\\p{M}\\p{N}_])${phrase.replace(/[.*+?^${}()|[\]\\]/gu, "\\$&")}(?![\\p{L}\\p{M}\\p{N}_])`, "iu"));
182
+ const matches = new Map();
183
+ for (const line of lines(await read("ngrams"))) {
184
+ statistics.ngramRows++;
185
+ const fields = line.split("\t");
186
+ const id = Number(fields[0]);
187
+ const count = Number(fields[2]);
188
+ if (fields.length !== 3 ||
189
+ !/^\d+$/u.test(fields[0]) ||
190
+ !Number.isSafeInteger(id) ||
191
+ !fields[1].trim() ||
192
+ !/^\d+$/u.test(fields[2]) ||
193
+ !Number.isSafeInteger(count) ||
194
+ count < 1) {
195
+ statistics.invalidNgramRows++;
196
+ continue;
197
+ }
198
+ const article = articles.get(id);
199
+ if (!article) {
200
+ statistics.orphanNgramRows++;
201
+ continue;
202
+ }
203
+ if (input.languages && (!article.language || !input.languages.includes(article.language)))
204
+ continue;
205
+ const gram = fields[1].trim().replace(/\s+/gu, " ");
206
+ patterns.forEach((pattern, index) => {
207
+ if (pattern.test(gram)) {
208
+ const found = matches.get(id) ?? new Set();
209
+ found.add(index);
210
+ matches.set(id, found);
211
+ }
212
+ });
213
+ }
214
+ if (!statistics.tocRows || !statistics.ngramRows) {
215
+ throw new DataRuntimeError("provider-response-invalid", "A published GDELT pair contains an empty file; no searchable coverage is established.");
216
+ }
217
+ const match = input.match ?? "any";
218
+ const matched = [...matches.entries()]
219
+ .filter(([, found]) => match === "any" || found.size === phrases.length)
220
+ .sort(([a], [b]) => a - b);
221
+ const records = matched.slice(0, context.limits.maxRecords).map(([id, found]) => ({
222
+ ...articles.get(id),
223
+ matchedPhrases: phrases.filter((_, index) => found.has(index)),
224
+ }));
225
+ const omittedRecordCount = matched.length - records.length;
226
+ const invalid = statistics.invalidTocRows +
227
+ statistics.invalidNgramRows +
228
+ statistics.orphanNgramRows +
229
+ statistics.ambiguousDocumentCount >
230
+ 0;
231
+ const partial = invalid || omittedRecordCount > 0;
232
+ return {
233
+ status: partial ? "partial" : "success",
234
+ data: {
235
+ fileTimestamp: input.fileTimestamp,
236
+ phrases,
237
+ match,
238
+ languages: input.languages ?? [],
239
+ records,
240
+ matchedDocumentCount: matched.length,
241
+ omittedRecordCount,
242
+ statistics,
243
+ files,
244
+ stopReason: omittedRecordCount
245
+ ? "record-limit"
246
+ : invalid
247
+ ? "invalid-source-rows"
248
+ : "file-complete",
249
+ },
250
+ summary: {
251
+ recordCount: records.length,
252
+ pageCount: 2,
253
+ chunkCount: 1,
254
+ truncated: omittedRecordCount > 0,
255
+ completeness: partial ? "partial" : "complete",
256
+ ...(partial
257
+ ? {
258
+ missing: [
259
+ {
260
+ kind: "range",
261
+ identifiers: [
262
+ ...(invalid
263
+ ? [`${input.fileTimestamp}:unvalidated-or-unlinked-source-rows`]
264
+ : []),
265
+ ...(omittedRecordCount
266
+ ? [
267
+ `${input.fileTimestamp}:matching-document-offsets:${records.length}-${matched.length - 1}`,
268
+ ]
269
+ : []),
270
+ ],
271
+ },
272
+ ],
273
+ }
274
+ : {}),
275
+ },
276
+ warnings: [
277
+ ...(invalid
278
+ ? [
279
+ "Invalid or ambiguously linked source rows prevent complete matching coverage; inspect statistics. Match counts refer only to valid linked rows.",
280
+ ]
281
+ : []),
282
+ ...(omittedRecordCount
283
+ ? [
284
+ `The complete file scan found ${matched.length} matching documents; ${omittedRecordCount} are omitted by maxRecords. Rerun with a sufficient allowed record limit or explicitly partition the query.`,
285
+ ]
286
+ : []),
287
+ ],
288
+ errors: partial
289
+ ? [
290
+ {
291
+ code: "partial-result",
292
+ message: "GDELT matching coverage or returned records are incomplete; inspect statistics and omittedRecordCount.",
293
+ retryable: false,
294
+ userActionRequired: false,
295
+ details: { ...statistics, omittedRecordCount },
296
+ },
297
+ ]
298
+ : [],
299
+ observations,
300
+ };
301
+ }
302
+ function* lines(content) {
303
+ for (const match of content.matchAll(/[^\r\n]+/gu))
304
+ if (match[0].trim())
305
+ yield match[0];
306
+ }
307
+ function validUrl(value) {
308
+ if (typeof value !== "string")
309
+ return false;
310
+ try {
311
+ const url = new URL(value);
312
+ return ["http:", "https:"].includes(url.protocol) && !url.username && !url.password;
313
+ }
314
+ catch {
315
+ return false;
316
+ }
317
+ }
318
+ function parseArticle(line, fileTimestamp) {
319
+ try {
320
+ const row = JSON.parse(line);
321
+ if (!row ||
322
+ Array.isArray(row) ||
323
+ typeof row !== "object" ||
324
+ !Number.isSafeInteger(row.ID) ||
325
+ row.ID < 0 ||
326
+ !validUrl(row.url))
327
+ return null;
328
+ for (const field of ["title", "lang", "date", "img"])
329
+ if (row[field] != null && typeof row[field] !== "string")
330
+ return null;
331
+ if (typeof row.date === "string" &&
332
+ (!/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{3})?Z$/u.test(row.date) ||
333
+ !Number.isFinite(Date.parse(row.date)) ||
334
+ new Date(row.date).toISOString() !== row.date.replace(/(?<!\.\d{3})Z$/u, ".000Z")))
335
+ return null;
336
+ return {
337
+ fileTimestamp,
338
+ documentId: row.ID,
339
+ url: row.url,
340
+ title: row.title ?? null,
341
+ language: row.lang ?? null,
342
+ date: row.date ?? null,
343
+ imageReference: row.img ?? null,
344
+ };
345
+ }
346
+ catch {
347
+ return null;
348
+ }
349
+ }
350
+ //# sourceMappingURL=gdelt-web-ngrams.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gdelt-web-ngrams.js","sourceRoot":"","sources":["../../../src/data/connectors/gdelt-web-ngrams.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,188 @@
1
+ export declare const GDELT_WEB_NGRAMS_INPUT_SCHEMA: {
2
+ readonly $schema: "https://json-schema.org/draft/2020-12/schema";
3
+ readonly $id: "https://schemas.tiangong.ai/data/gdelt/web-ngrams-search-input.v1.json";
4
+ readonly type: "object";
5
+ readonly additionalProperties: false;
6
+ readonly required: readonly ["fileTimestamp", "phrases"];
7
+ readonly properties: {
8
+ readonly fileTimestamp: {
9
+ readonly type: "string";
10
+ readonly pattern: "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:00Z$";
11
+ readonly description: "One explicit UTC minute identifying a paired NGrams/TOC file, not an article publication-time filter. Missing minutes are possible; no implicit time-window expansion or latest polling.";
12
+ readonly examples: readonly ["2026-06-30T20:16:00Z"];
13
+ };
14
+ readonly phrases: {
15
+ readonly type: "array";
16
+ readonly minItems: 1;
17
+ readonly maxItems: 10;
18
+ readonly uniqueItems: true;
19
+ readonly description: "Literal phrases, each 1–4 whitespace-separated words. Matches ignore case and repeated whitespace, use Unicode letter/number word boundaries, and otherwise preserve punctuation. No stemming, translation, DOC operators, regex, or full-text reconstruction.";
20
+ readonly examples: readonly [readonly ["climate change", "disease"]];
21
+ readonly items: {
22
+ readonly type: "string";
23
+ readonly minLength: 1;
24
+ readonly maxLength: 200;
25
+ };
26
+ };
27
+ readonly match: {
28
+ readonly enum: readonly ["any", "all"];
29
+ readonly default: "any";
30
+ readonly description: "Whether any or all phrases must occur in the same document; all may match different quadgrams. Returned matches indicate presence, not occurrence counts.";
31
+ readonly examples: readonly ["any"];
32
+ };
33
+ readonly languages: {
34
+ readonly type: "array";
35
+ readonly minItems: 1;
36
+ readonly maxItems: 20;
37
+ readonly uniqueItems: true;
38
+ readonly description: "Optional exact TOC language-code filter. Missing language metadata cannot satisfy a filter. This is not a query-translation instruction.";
39
+ readonly examples: readonly [readonly ["en", "fr"]];
40
+ readonly items: {
41
+ readonly type: "string";
42
+ readonly pattern: "^[a-z]{2,3}$";
43
+ };
44
+ };
45
+ };
46
+ };
47
+ export declare const GDELT_WEB_NGRAMS_OUTPUT_SCHEMA: {
48
+ readonly $schema: "https://json-schema.org/draft/2020-12/schema";
49
+ readonly $id: "https://schemas.tiangong.ai/data/gdelt/web-ngrams-search-output.v1.json";
50
+ readonly type: "object";
51
+ readonly additionalProperties: false;
52
+ readonly required: readonly ["fileTimestamp", "phrases", "match", "languages", "records", "matchedDocumentCount", "omittedRecordCount", "statistics", "files", "stopReason"];
53
+ readonly properties: {
54
+ readonly fileTimestamp: {
55
+ readonly type: "string";
56
+ };
57
+ readonly phrases: {
58
+ readonly type: "array";
59
+ readonly items: {
60
+ readonly type: "string";
61
+ };
62
+ };
63
+ readonly match: {
64
+ readonly enum: readonly ["any", "all"];
65
+ };
66
+ readonly languages: {
67
+ readonly type: "array";
68
+ readonly items: {
69
+ readonly type: "string";
70
+ };
71
+ };
72
+ readonly matchedDocumentCount: {
73
+ readonly type: "integer";
74
+ readonly minimum: 0;
75
+ };
76
+ readonly omittedRecordCount: {
77
+ readonly type: "integer";
78
+ readonly minimum: 0;
79
+ };
80
+ readonly stopReason: {
81
+ readonly enum: readonly ["file-complete", "invalid-source-rows", "record-limit"];
82
+ };
83
+ readonly statistics: {
84
+ readonly type: "object";
85
+ readonly additionalProperties: false;
86
+ readonly required: readonly ["tocRows", "ngramRows", "invalidTocRows", "invalidNgramRows", "orphanNgramRows", "ambiguousDocumentCount", "duplicateTocRows"];
87
+ readonly properties: {
88
+ readonly tocRows: {
89
+ readonly type: "integer";
90
+ readonly minimum: 0;
91
+ };
92
+ readonly ngramRows: {
93
+ readonly type: "integer";
94
+ readonly minimum: 0;
95
+ };
96
+ readonly invalidTocRows: {
97
+ readonly type: "integer";
98
+ readonly minimum: 0;
99
+ };
100
+ readonly invalidNgramRows: {
101
+ readonly type: "integer";
102
+ readonly minimum: 0;
103
+ };
104
+ readonly orphanNgramRows: {
105
+ readonly type: "integer";
106
+ readonly minimum: 0;
107
+ };
108
+ readonly ambiguousDocumentCount: {
109
+ readonly type: "integer";
110
+ readonly minimum: 0;
111
+ };
112
+ readonly duplicateTocRows: {
113
+ readonly type: "integer";
114
+ readonly minimum: 0;
115
+ };
116
+ };
117
+ };
118
+ readonly files: {
119
+ readonly type: "array";
120
+ readonly minItems: 2;
121
+ readonly maxItems: 2;
122
+ readonly items: {
123
+ readonly type: "object";
124
+ readonly additionalProperties: false;
125
+ readonly required: readonly ["kind", "sourceUrl", "compressedBytes", "uncompressedBytes", "responseDigest"];
126
+ readonly properties: {
127
+ readonly kind: {
128
+ readonly enum: readonly ["toc", "ngrams"];
129
+ };
130
+ readonly sourceUrl: {
131
+ readonly type: "string";
132
+ };
133
+ readonly compressedBytes: {
134
+ readonly type: "integer";
135
+ readonly minimum: 0;
136
+ };
137
+ readonly uncompressedBytes: {
138
+ readonly type: "integer";
139
+ readonly minimum: 0;
140
+ };
141
+ readonly responseDigest: {
142
+ readonly type: "string";
143
+ };
144
+ };
145
+ };
146
+ };
147
+ readonly records: {
148
+ readonly type: "array";
149
+ readonly items: {
150
+ readonly type: "object";
151
+ readonly additionalProperties: false;
152
+ readonly required: readonly ["fileTimestamp", "documentId", "url", "title", "language", "date", "imageReference", "matchedPhrases"];
153
+ readonly properties: {
154
+ readonly fileTimestamp: {
155
+ readonly type: "string";
156
+ };
157
+ readonly documentId: {
158
+ readonly type: "integer";
159
+ readonly minimum: 0;
160
+ };
161
+ readonly url: {
162
+ readonly type: "string";
163
+ };
164
+ readonly title: {
165
+ readonly type: readonly ["string", "null"];
166
+ };
167
+ readonly language: {
168
+ readonly type: readonly ["string", "null"];
169
+ };
170
+ readonly date: {
171
+ readonly type: readonly ["string", "null"];
172
+ };
173
+ readonly imageReference: {
174
+ readonly type: readonly ["string", "null"];
175
+ readonly description: "Unvalidated provider image-reference text, preserved verbatim; it may not be a usable URL. Never fetched or rendered by this operation.";
176
+ };
177
+ readonly matchedPhrases: {
178
+ readonly type: "array";
179
+ readonly minItems: 1;
180
+ readonly items: {
181
+ readonly type: "string";
182
+ };
183
+ };
184
+ };
185
+ };
186
+ };
187
+ };
188
+ };