@graphit/cli 0.1.22 → 0.1.23

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.
@@ -4,10 +4,14 @@ export interface ApiError {
4
4
  retry_after_seconds?: number;
5
5
  }
6
6
  declare class ApiClient {
7
- request<T>(method: string, path: string, body?: unknown): Promise<T>;
7
+ request<T>(method: string, path: string, body?: unknown, opts?: {
8
+ timeoutMs?: number;
9
+ }): Promise<T>;
8
10
  postUnauthed<T>(path: string, body: unknown): Promise<T>;
9
11
  get<T>(path: string): Promise<T>;
10
- post<T>(path: string, body: unknown): Promise<T>;
12
+ post<T>(path: string, body: unknown, opts?: {
13
+ timeoutMs?: number;
14
+ }): Promise<T>;
11
15
  put<T>(path: string, body: unknown): Promise<T>;
12
16
  patch<T>(path: string, body: unknown): Promise<T>;
13
17
  delete<T>(path: string): Promise<T>;
@@ -2,11 +2,11 @@ import { getValidIdToken } from "../auth/token.js";
2
2
  import { getApiBaseUrl } from "../config.js";
3
3
  const REQUEST_TIMEOUT_MS = 30_000;
4
4
  class ApiClient {
5
- async request(method, path, body) {
5
+ async request(method, path, body, opts) {
6
6
  const { id_token } = await getValidIdToken();
7
7
  return this._fetch(method, path, body, {
8
8
  Authorization: `Bearer ${id_token}`,
9
- });
9
+ }, opts?.timeoutMs);
10
10
  }
11
11
  async postUnauthed(path, body) {
12
12
  return this._fetch("POST", path, body);
@@ -14,8 +14,8 @@ class ApiClient {
14
14
  async get(path) {
15
15
  return this.request("GET", path);
16
16
  }
17
- async post(path, body) {
18
- return this.request("POST", path, body);
17
+ async post(path, body, opts) {
18
+ return this.request("POST", path, body, opts);
19
19
  }
20
20
  async put(path, body) {
21
21
  return this.request("PUT", path, body);
@@ -26,8 +26,9 @@ class ApiClient {
26
26
  async delete(path) {
27
27
  return this.request("DELETE", path);
28
28
  }
29
- async _fetch(method, path, body, extraHeaders) {
29
+ async _fetch(method, path, body, extraHeaders, timeoutMs) {
30
30
  const url = `${getApiBaseUrl()}${path}`;
31
+ const timeout = timeoutMs ?? REQUEST_TIMEOUT_MS;
31
32
  const headers = {
32
33
  "Content-Type": "application/json",
33
34
  "X-Graphit-Source": "cli",
@@ -39,11 +40,11 @@ class ApiClient {
39
40
  method,
40
41
  headers,
41
42
  body: body ? JSON.stringify(body) : undefined,
42
- signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
43
+ signal: AbortSignal.timeout(timeout),
43
44
  });
44
45
  }
45
46
  catch (e) {
46
- throw new Error(classifyNetworkError(e, getApiBaseUrl()));
47
+ throw new Error(classifyNetworkError(e, getApiBaseUrl(), timeout));
47
48
  }
48
49
  if (!resp.ok) {
49
50
  let detail = `HTTP ${resp.status}`;
@@ -72,14 +73,14 @@ class ApiClient {
72
73
  return (await resp.json());
73
74
  }
74
75
  }
75
- function classifyNetworkError(err, baseUrl) {
76
+ function classifyNetworkError(err, baseUrl, timeoutMs = REQUEST_TIMEOUT_MS) {
76
77
  const msg = err instanceof Error ? err.message : String(err);
77
78
  const causeCode = err instanceof Error && err.cause && typeof err.cause === "object"
78
79
  ? err.cause.code ?? ""
79
80
  : "";
80
81
  const lower = (msg + " " + causeCode).toLowerCase();
81
82
  if (lower.includes("abort") || lower.includes("timeout")) {
82
- return `Request timed out after ${REQUEST_TIMEOUT_MS / 1000}s. Check your network or try again.`;
83
+ return `Request timed out after ${timeoutMs / 1000}s. Check your network or try again.`;
83
84
  }
84
85
  if (lower.includes("enotfound") || lower.includes("getaddrinfo")) {
85
86
  return `Could not resolve host. Check GRAPHIT_API_URL or your DNS settings. (${baseUrl})`;
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,98 @@
1
1
  import { apiClient } from "../api/client.js";
2
2
  import { output, errorOutput } from "../output/format.js";
3
+ const POLL_INTERVAL_MS = 3_000;
4
+ const MAX_POLL_DURATION_MS = 5 * 60_000;
5
+ const REFRESH_TRIGGER_TIMEOUT_MS = 60_000;
6
+ async function fetchDSList(limit = 200) {
7
+ const resp = await apiClient.get(`/api/v1/cli/ds?limit=${limit}`);
8
+ return resp.data_sources;
9
+ }
10
+ async function triggerRefresh(id) {
11
+ try {
12
+ const resp = await apiClient.post(`/api/v1/cli/ds/${id}/refresh`, {}, { timeoutMs: REFRESH_TRIGGER_TIMEOUT_MS });
13
+ return resp;
14
+ }
15
+ catch (err) {
16
+ const msg = err instanceof Error ? err.message : String(err.detail ?? err);
17
+ if (msg.toLowerCase().includes("timeout") || msg.toLowerCase().includes("timed out")) {
18
+ return { id, status: "refreshing", error: "trigger timed out (refresh continues server-side)" };
19
+ }
20
+ return { id, status: "error", error: msg };
21
+ }
22
+ }
23
+ function formatRowCount(n) {
24
+ if (n >= 1_000_000)
25
+ return `${(n / 1_000_000).toFixed(1)}M`;
26
+ if (n >= 1_000)
27
+ return `${(n / 1_000).toFixed(1)}K`;
28
+ return String(n);
29
+ }
30
+ function printStatusTable(targets, statuses, errors, clearPrevious) {
31
+ const lines = [];
32
+ const nameWidth = Math.max(4, ...Array.from(targets.values()).map((ds) => ds.name.length));
33
+ lines.push(` ${"NAME".padEnd(nameWidth)} ${"STATUS".padEnd(12)} ${"ROWS".padStart(8)}`);
34
+ lines.push(` ${"─".repeat(nameWidth)} ${"─".repeat(12)} ${"─".repeat(8)}`);
35
+ for (const [id, ds] of targets) {
36
+ const status = statuses.get(id) ?? ds.status;
37
+ const error = errors.get(id);
38
+ const icon = status === "ready" ? "+" : status === "error" ? "x" : "*";
39
+ const rowStr = formatRowCount(ds.row_count).padStart(8);
40
+ let line = ` ${ds.name.padEnd(nameWidth)} ${icon} ${status.padEnd(10)} ${rowStr}`;
41
+ if (error)
42
+ line += ` ${error}`;
43
+ lines.push(line);
44
+ }
45
+ if (clearPrevious) {
46
+ process.stdout.write(`\x1B[${lines.length + 1}A\x1B[J`);
47
+ }
48
+ console.log(lines.join("\n"));
49
+ return lines.length;
50
+ }
51
+ async function pollUntilReady(targetIds, targets, errors) {
52
+ const isTTY = process.stdout.isTTY ?? false;
53
+ const statuses = new Map();
54
+ for (const id of targetIds)
55
+ statuses.set(id, "refreshing");
56
+ let printed = false;
57
+ printStatusTable(targets, statuses, errors, false);
58
+ printed = true;
59
+ const pollStart = Date.now();
60
+ while (true) {
61
+ await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));
62
+ if (Date.now() - pollStart > MAX_POLL_DURATION_MS) {
63
+ console.error(`\n Timed out after ${MAX_POLL_DURATION_MS / 60_000}m waiting for refresh to complete.`);
64
+ break;
65
+ }
66
+ const fresh = await fetchDSList();
67
+ const freshMap = new Map(fresh.map((ds) => [ds.id, ds]));
68
+ let allDone = true;
69
+ for (const id of targetIds) {
70
+ const ds = freshMap.get(id);
71
+ if (ds) {
72
+ statuses.set(id, ds.status);
73
+ targets.set(id, ds);
74
+ if (ds.status !== "ready" && ds.status !== "error")
75
+ allDone = false;
76
+ }
77
+ else {
78
+ allDone = false;
79
+ }
80
+ }
81
+ if (isTTY && printed) {
82
+ printStatusTable(targets, statuses, errors, true);
83
+ }
84
+ if (allDone) {
85
+ if (!isTTY && printed) {
86
+ console.log("");
87
+ printStatusTable(targets, statuses, errors, false);
88
+ }
89
+ const readyCount = Array.from(statuses.values()).filter((s) => s === "ready").length;
90
+ const errorCount = Array.from(statuses.values()).filter((s) => s === "error").length;
91
+ console.log(`\n ${readyCount}/${targetIds.size} refreshed${errorCount > 0 ? `, ${errorCount} failed` : ""}`);
92
+ return;
93
+ }
94
+ }
95
+ }
3
96
  export function registerDSCommands(program) {
4
97
  const ds = program.command("ds").description("Data source management");
5
98
  ds.command("list")
@@ -38,12 +131,76 @@ export function registerDSCommands(program) {
38
131
  errorOutput(err);
39
132
  }
40
133
  });
41
- ds.command("refresh <id>")
42
- .description("Trigger a data source refresh")
43
- .action(async function (id) {
134
+ ds.command("refresh [ids...]")
135
+ .description("Refresh data sources (use --all for all, or pass one or more IDs)")
136
+ .option("--all", "Refresh all data sources")
137
+ .option("--no-wait", "Trigger refreshes without waiting for completion")
138
+ .option("--skip-empty", "Skip data sources with 0 rows")
139
+ .action(async function (ids) {
44
140
  try {
45
- const resp = await apiClient.post(`/api/v1/cli/ds/${id}/refresh`, {});
46
- output(this, resp, { keyValue: true });
141
+ const opts = this.opts();
142
+ const all = opts.all;
143
+ const wait = opts.wait;
144
+ const skipEmpty = opts.skipEmpty;
145
+ const allSources = await fetchDSList();
146
+ const sourceMap = new Map(allSources.map((ds) => [ds.id, ds]));
147
+ let targetIds;
148
+ if (all) {
149
+ let filtered = allSources;
150
+ if (skipEmpty) {
151
+ filtered = allSources.filter((ds) => ds.row_count > 0);
152
+ }
153
+ if (filtered.length === 0) {
154
+ console.log(" No data sources to refresh.");
155
+ return;
156
+ }
157
+ targetIds = filtered.map((ds) => ds.id);
158
+ console.log(` Refreshing ${filtered.length} data source${filtered.length > 1 ? "s" : ""}...\n`);
159
+ }
160
+ else if (ids.length > 0) {
161
+ for (const id of ids) {
162
+ if (!sourceMap.has(id)) {
163
+ console.error(JSON.stringify({ error: `Data source '${id}' not found` }));
164
+ process.exit(1);
165
+ }
166
+ }
167
+ targetIds = ids;
168
+ console.log(` Refreshing ${ids.length} data source${ids.length > 1 ? "s" : ""}...\n`);
169
+ }
170
+ else {
171
+ console.error(JSON.stringify({ error: "Provide data source IDs or use --all" }));
172
+ process.exit(1);
173
+ }
174
+ const targets = new Map();
175
+ for (const id of targetIds) {
176
+ targets.set(id, sourceMap.get(id));
177
+ }
178
+ const results = await Promise.allSettled(targetIds.map((id) => triggerRefresh(id)));
179
+ const errors = new Map();
180
+ const triggered = new Set();
181
+ for (let i = 0; i < results.length; i++) {
182
+ const r = results[i];
183
+ const id = targetIds[i];
184
+ if (r.status === "fulfilled") {
185
+ if (r.value.error)
186
+ errors.set(id, r.value.error);
187
+ if (r.value.status !== "error")
188
+ triggered.add(id);
189
+ }
190
+ else {
191
+ errors.set(id, String(r.reason));
192
+ }
193
+ }
194
+ if (!wait) {
195
+ const statuses = new Map();
196
+ for (const id of targetIds) {
197
+ statuses.set(id, triggered.has(id) ? "refreshing" : "error");
198
+ }
199
+ printStatusTable(targets, statuses, errors, false);
200
+ console.log(`\n ${triggered.size}/${targetIds.length} triggered (not waiting)`);
201
+ return;
202
+ }
203
+ await pollUntilReady(new Set(targetIds), targets, errors);
47
204
  }
48
205
  catch (err) {
49
206
  errorOutput(err);
@@ -1 +1 @@
1
- {"version":3,"file":"ds.js","sourceRoot":"","sources":["../../src/commands/ds.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ds.js","sourceRoot":"","sources":["../../src/commands/ds.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@graphit/cli",
3
- "version": "0.1.22",
3
+ "version": "0.1.23",
4
4
  "description": "Graphit CLI - Build custom dashboards from any AI coding assistant",
5
5
  "type": "module",
6
6
  "bin": {
@@ -226,6 +226,10 @@ For metrics with natural variant axes (D7/D30/D90, gross/net), propose parameter
226
226
  | `graphit kb update <type> <name> --description "..."` | Update description (all types) |
227
227
  | `graphit kb delete <type> <name> --yes` | Delete any entity (all types supported) |
228
228
  | `graphit ds list` | List cached data sources (use these for fast queries) |
229
+ | `graphit ds refresh --all` | Refresh all data sources, wait for completion with live status |
230
+ | `graphit ds refresh --all --skip-empty` | Refresh non-empty data sources only |
231
+ | `graphit ds refresh --all --no-wait` | Trigger all refreshes without waiting |
232
+ | `graphit ds refresh <id> [id2...]` | Refresh one or more data sources by ID |
229
233
  | `graphit query "<sql>" --ds <id>` | Query cached data source (~100ms) |
230
234
  | `graphit query "<sql>" --ds <id> --override-rules RULE1 RULE2` | Query with governance rule overrides |
231
235
  | `graphit query "<sql>" --ds <id> --verbose` | Show expanded SQL and trust tier |
@@ -29,3 +29,23 @@ When you change a dashboard filter (e.g. switch country), Graphit answers from a
29
29
  | Size | A few-thousand-row typical aggregation | Sitting at the 100M-row / 5GB ceiling |
30
30
 
31
31
  Build the source small and pre-aggregated, and dashboards on it stay fast and filterable.
32
+
33
+ ## Refreshing data sources
34
+
35
+ Data sources cache a snapshot of the Snowflake query result. Refresh when you need current data.
36
+
37
+ ```bash
38
+ # Refresh all data sources and wait for completion (live status table)
39
+ graphit ds refresh --all
40
+
41
+ # Refresh only non-empty sources (skip 0-row DSes)
42
+ graphit ds refresh --all --skip-empty
43
+
44
+ # Fire-and-forget (trigger refreshes, don't wait)
45
+ graphit ds refresh --all --no-wait
46
+
47
+ # Refresh specific sources by ID
48
+ graphit ds refresh <id1> <id2>
49
+ ```
50
+
51
+ The CLI fires all refreshes in parallel and polls until every source is ready. Large sources (millions of rows) may take 30-60s; the CLI handles this gracefully without timeout errors. Use `--no-wait` when you only need to trigger the refresh and will check status later via `graphit ds list`.
@@ -92,6 +92,7 @@ You are the rendering layer - format and present every CLI result using markdown
92
92
  **After `graphit kb search`** - result count + table with type column
93
93
  **After `graphit kb explore`** - tree structure: Asset > Tables > Dimensions > Rules
94
94
  **After `graphit ds list`** - table with Name, ID, Rows, Status, Governed + recommend which DS to use
95
+ **After `graphit ds refresh --all`** - live status table showing each DS name, status (refreshing/ready/error), and row count. Suggest `--skip-empty` if many 0-row sources exist.
95
96
  **After `graphit governance status`** - mode + conformance table (Governed/Ad-hoc/Blocked with counts and %)
96
97
  **After errors** - bold error message + actionable fix suggestion
97
98
 
@@ -23,3 +23,23 @@ When you change a dashboard filter (e.g. switch country), Graphit answers from a
23
23
  | Size | A few-thousand-row typical aggregation | Sitting at the 100M-row / 5GB ceiling |
24
24
 
25
25
  Build the source small and pre-aggregated, and dashboards on it stay fast and filterable.
26
+
27
+ ## Refreshing data sources
28
+
29
+ Data sources cache a snapshot of the Snowflake query result. Refresh when you need current data.
30
+
31
+ ```bash
32
+ # Refresh all data sources and wait for completion (live status table)
33
+ graphit ds refresh --all
34
+
35
+ # Refresh only non-empty sources (skip 0-row DSes)
36
+ graphit ds refresh --all --skip-empty
37
+
38
+ # Fire-and-forget (trigger refreshes, don't wait)
39
+ graphit ds refresh --all --no-wait
40
+
41
+ # Refresh specific sources by ID
42
+ graphit ds refresh <id1> <id2>
43
+ ```
44
+
45
+ The CLI fires all refreshes in parallel and polls until every source is ready. Large sources (millions of rows) may take 30-60s; the CLI handles this gracefully without timeout errors. Use `--no-wait` when you only need to trigger the refresh and will check status later via `graphit ds list`.