@forgecharts/sdk 1.3.11 → 1.3.13

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.
@@ -1 +1 @@
1
- {"version":3,"file":"BottomToolbar.d.ts","sourceRoot":"","sources":["../../../../src/react/workspace/toolbars/BottomToolbar.tsx"],"names":[],"mappings":"AAOA,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,cAAc,EAqH5C,CAAC;AAoCF,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,UAAU,CAAC;AAwBpD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAG7D;AAED,KAAK,KAAK,GAAG;IACX,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,OAAO,EAAE,cAAc,CAAC;IACxB,eAAe,EAAE,CAAC,CAAC,EAAE,cAAc,KAAK,IAAI,CAAC;IAC7C,oBAAoB,EAAE,MAAM,IAAI,CAAC;IACjC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,yEAAyE;IACzE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,sFAAsF;IACtF,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,oBAAoB,CAAC,EAAE,MAAM,IAAI,CAAC;IAClC,0FAA0F;IAC1F,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,CAAC;AA8CF,wBAAgB,aAAa,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,EAAE,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,EAAE,KAAK,+BAuK7O"}
1
+ {"version":3,"file":"BottomToolbar.d.ts","sourceRoot":"","sources":["../../../../src/react/workspace/toolbars/BottomToolbar.tsx"],"names":[],"mappings":"AAQA,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,cAAc,EAqH5C,CAAC;AAoCF,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,UAAU,CAAC;AAwBpD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAO7D;AAED,KAAK,KAAK,GAAG;IACX,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,OAAO,EAAE,cAAc,CAAC;IACxB,eAAe,EAAE,CAAC,CAAC,EAAE,cAAc,KAAK,IAAI,CAAC;IAC7C,oBAAoB,EAAE,MAAM,IAAI,CAAC;IACjC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,yEAAyE;IACzE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,sFAAsF;IACtF,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,oBAAoB,CAAC,EAAE,MAAM,IAAI,CAAC;IAClC,0FAA0F;IAC1F,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,CAAC;AA8CF,wBAAgB,aAAa,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,EAAE,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,EAAE,KAAK,+BAuK7O"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Dataset ingestion helpers — parsing for the host persistence contract's
3
+ * dataset routes (INTEGRATION.md §18). Ships in the SDK so host backends
4
+ * ingest CSV/JSON dataset uploads with the exact semantics the chart's
5
+ * ForgeScript engine expects, instead of reimplementing the parser.
6
+ *
7
+ * Mirrors the managed worker's ingestion: every row needs a `time` value
8
+ * (Unix seconds/millis or ISO date); remaining cells are coerced per the
9
+ * dataset's column definitions.
10
+ */
11
+ export type DatasetColumnDef = {
12
+ name: string;
13
+ type: 'number' | 'integer' | 'text' | 'boolean' | 'date' | 'timestamp' | 'percentage' | 'price';
14
+ nullable: boolean;
15
+ };
16
+ /** One parsed dataset row: ISO bar time + coerced data cells. */
17
+ export type ParsedDatasetRow = {
18
+ bar_time: string;
19
+ data: Record<string, unknown>;
20
+ };
21
+ /**
22
+ * Parse an uploaded dataset file into rows ready for insertion into
23
+ * fc_dataset_rows. Throws with a user-readable message on malformed input.
24
+ */
25
+ export declare function parseDatasetFile(content: string, fileType: 'csv' | 'json', columns: DatasetColumnDef[]): ParsedDatasetRow[];
26
+ //# sourceMappingURL=datasetIngest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"datasetIngest.d.ts","sourceRoot":"","sources":["../../src/server/datasetIngest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAM,MAAM,CAAC;IACjB,IAAI,EAAM,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,WAAW,GAAG,YAAY,GAAG,OAAO,CAAC;IACpG,QAAQ,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,iEAAiE;AACjE,MAAM,MAAM,gBAAgB,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC;AAEnF;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,KAAK,GAAG,MAAM,EACxB,OAAO,EAAE,gBAAgB,EAAE,GAC1B,gBAAgB,EAAE,CAIpB"}
@@ -9,6 +9,7 @@
9
9
  *
10
10
  * fc_watchlist_groups / fc_watchlist_items → /api/watchlist/*
11
11
  * fc_scripts / fc_script_versions → /api/scripts/*
12
+ * fc_datasets / fc_dataset_rows → /api/scripts/:id/datasets/*
12
13
  * fc_chart_layouts → layout handler props
13
14
  * fc_chart_preferences → preferences (optional)
14
15
  * fc_agent_messages → /api/agent/history
@@ -1 +1 @@
1
- {"version":3,"file":"hostSchema.d.ts","sourceRoot":"","sources":["../../src/server/hostSchema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,UAAU,CAAC;AAErD,2EAA2E;AAC3E,wBAAgB,uBAAuB,CAAC,OAAO,GAAE,iBAA2B,GAAG,MAAM,EAAE,CAyEtF;AAED;;;;;;;;GAQG;AACH,wBAAsB,uBAAuB,CAAC,IAAI,EAAE;IAClD,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACzC,OAAO,CAAC,EAAE,iBAAiB,CAAC;CAC7B,GAAG,OAAO,CAAC,IAAI,CAAC,CAIhB"}
1
+ {"version":3,"file":"hostSchema.d.ts","sourceRoot":"","sources":["../../src/server/hostSchema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,UAAU,CAAC;AAErD,2EAA2E;AAC3E,wBAAgB,uBAAuB,CAAC,OAAO,GAAE,iBAA2B,GAAG,MAAM,EAAE,CA6FtF;AAED;;;;;;;;GAQG;AACH,wBAAsB,uBAAuB,CAAC,IAAI,EAAE;IAClD,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACzC,OAAO,CAAC,EAAE,iBAAiB,CAAC;CAC7B,GAAG,OAAO,CAAC,IAAI,CAAC,CAIhB"}
@@ -21,4 +21,6 @@ export { buildSystemPrompt } from './systemPrompt';
21
21
  export { FORGESCRIPT_REFERENCE } from './knowledge';
22
22
  export { ensureForgeChartsTables, getHostSchemaStatements } from './hostSchema';
23
23
  export type { HostSchemaDialect } from './hostSchema';
24
+ export { parseDatasetFile } from './datasetIngest';
25
+ export type { DatasetColumnDef, ParsedDatasetRow } from './datasetIngest';
24
26
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAChF,YAAY,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAChF,YAAY,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -1085,6 +1085,25 @@ function getHostSchemaStatements(dialect = "mysql") {
1085
1085
  source MEDIUMTEXT NOT NULL,
1086
1086
  created_at TIMESTAMP NOT NULL DEFAULT ${now}
1087
1087
  )`.replace("MEDIUMTEXT", dialect === "mysql" ? "MEDIUMTEXT" : "TEXT"),
1088
+ // ── ForgeScript datasets (schema + time-indexed rows) ─────────────────
1089
+ `CREATE TABLE IF NOT EXISTS fc_datasets (
1090
+ ${pk},
1091
+ user_id VARCHAR(64) NOT NULL,
1092
+ script_id INT NOT NULL,
1093
+ name VARCHAR(64) NOT NULL,
1094
+ columns_json ${json} NOT NULL,
1095
+ row_count INT NOT NULL DEFAULT 0,
1096
+ ingest_status VARCHAR(16) NOT NULL DEFAULT 'ready',
1097
+ ingest_error TEXT NULL,
1098
+ created_at TIMESTAMP NOT NULL DEFAULT ${now},
1099
+ ${updatedAt}
1100
+ )`,
1101
+ `CREATE TABLE IF NOT EXISTS fc_dataset_rows (
1102
+ ${pk},
1103
+ dataset_id INT NOT NULL,
1104
+ bar_time DATETIME NOT NULL,
1105
+ data ${json} NOT NULL
1106
+ )`.replace("DATETIME", dialect === "mysql" ? "DATETIME" : "TIMESTAMP"),
1088
1107
  // ── Chart layouts + preferences ───────────────────────────────────────
1089
1108
  `CREATE TABLE IF NOT EXISTS fc_chart_layouts (
1090
1109
  ${pk},
@@ -1119,6 +1138,94 @@ async function ensureForgeChartsTables(opts) {
1119
1138
  }
1120
1139
  }
1121
1140
 
1122
- export { FORGESCRIPT_REFERENCE, buildSystemPrompt, ensureForgeChartsTables, getAgentTools, getHostSchemaStatements };
1141
+ // src/server/datasetIngest.ts
1142
+ function parseDatasetFile(content, fileType, columns) {
1143
+ const rows = fileType === "csv" ? parseCsv(content, columns) : parseJson(content, columns);
1144
+ if (rows.length === 0) throw new Error("No valid rows found in the uploaded file.");
1145
+ return rows;
1146
+ }
1147
+ function parseCsv(content, columns) {
1148
+ const lines = content.split(/\r?\n/).filter((l) => l.trim().length > 0);
1149
+ if (lines.length < 2) throw new Error("CSV must have a header row and at least one data row.");
1150
+ const headers = lines[0].split(",").map((h) => h.trim().toLowerCase());
1151
+ const timeIdx = headers.indexOf("time");
1152
+ if (timeIdx === -1) throw new Error("CSV must have a 'time' column.");
1153
+ const colNames = new Set(columns.map((c) => c.name));
1154
+ const colMap = new Map(columns.map((c) => [c.name, c]));
1155
+ const rows = [];
1156
+ for (let i = 1; i < lines.length; i++) {
1157
+ const cells = lines[i].split(",").map((c) => c.trim());
1158
+ const rawTime = cells[timeIdx];
1159
+ if (!rawTime) continue;
1160
+ const bar_time = normaliseTime(rawTime);
1161
+ if (!bar_time) continue;
1162
+ const data = {};
1163
+ for (let j = 0; j < headers.length; j++) {
1164
+ const header = headers[j];
1165
+ if (j === timeIdx) continue;
1166
+ if (!colNames.has(header)) continue;
1167
+ const col = colMap.get(header);
1168
+ data[header] = coerce(cells[j] ?? "", col);
1169
+ }
1170
+ rows.push({ bar_time, data });
1171
+ }
1172
+ return rows;
1173
+ }
1174
+ function parseJson(content, columns) {
1175
+ let parsed;
1176
+ try {
1177
+ parsed = JSON.parse(content);
1178
+ } catch {
1179
+ throw new Error("Invalid JSON content.");
1180
+ }
1181
+ if (!Array.isArray(parsed)) throw new Error("JSON must be an array of objects.");
1182
+ const colMap = new Map(columns.map((c) => [c.name, c]));
1183
+ const rows = [];
1184
+ for (const item of parsed) {
1185
+ const rawTime = item["time"];
1186
+ if (!rawTime) continue;
1187
+ const bar_time = normaliseTime(String(rawTime));
1188
+ if (!bar_time) continue;
1189
+ const data = {};
1190
+ for (const col of columns) {
1191
+ const raw = item[col.name];
1192
+ data[col.name] = raw !== void 0 ? coerce(String(raw), colMap.get(col.name)) : null;
1193
+ }
1194
+ rows.push({ bar_time, data });
1195
+ }
1196
+ return rows;
1197
+ }
1198
+ function normaliseTime(raw) {
1199
+ if (/^\d{9,13}$/.test(raw)) {
1200
+ const ms = raw.length === 13 ? Number(raw) : Number(raw) * 1e3;
1201
+ return new Date(ms).toISOString();
1202
+ }
1203
+ const d = new Date(raw);
1204
+ if (!isNaN(d.getTime())) return d.toISOString();
1205
+ return null;
1206
+ }
1207
+ function coerce(raw, col) {
1208
+ if (raw === "" || raw === "null" || raw === "NULL") return col.nullable ? null : void 0;
1209
+ switch (col.type) {
1210
+ case "number":
1211
+ case "percentage":
1212
+ case "price":
1213
+ return parseFloat(raw);
1214
+ case "integer":
1215
+ return parseInt(raw, 10);
1216
+ case "boolean":
1217
+ return raw.toLowerCase() === "true" || raw === "1";
1218
+ case "date":
1219
+ case "timestamp": {
1220
+ const d = new Date(raw);
1221
+ return isNaN(d.getTime()) ? null : d.toISOString();
1222
+ }
1223
+ case "text":
1224
+ default:
1225
+ return raw;
1226
+ }
1227
+ }
1228
+
1229
+ export { FORGESCRIPT_REFERENCE, buildSystemPrompt, ensureForgeChartsTables, getAgentTools, getHostSchemaStatements, parseDatasetFile };
1123
1230
  //# sourceMappingURL=index.js.map
1124
1231
  //# sourceMappingURL=index.js.map