yamchart 0.9.5 → 0.10.0

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 (74) hide show
  1. package/dist/{advisor-SC64RTZO.js → advisor-O2BRAI4T.js} +24 -14
  2. package/dist/advisor-O2BRAI4T.js.map +1 -0
  3. package/dist/{chunk-NXQ6ZO3V.js → chunk-5FHV22X2.js} +6 -6
  4. package/dist/chunk-5FHV22X2.js.map +1 -0
  5. package/dist/chunk-FN6R2LAC.js +15442 -0
  6. package/dist/chunk-FN6R2LAC.js.map +1 -0
  7. package/dist/chunk-QJ5CPQJK.js +2053 -0
  8. package/dist/chunk-QJ5CPQJK.js.map +1 -0
  9. package/dist/{chunk-S7YQXEKM.js → chunk-QUIDZO5G.js} +103 -275
  10. package/dist/chunk-QUIDZO5G.js.map +1 -0
  11. package/dist/{chunk-RMIDEBHD.js → chunk-S2CH4HUZ.js} +6 -6
  12. package/dist/{chunk-UND73EOB.js → chunk-UFDQ3C7Q.js} +473 -4
  13. package/dist/chunk-UFDQ3C7Q.js.map +1 -0
  14. package/dist/{chunk-H4L3FNLS.js → chunk-ZBCQNWVN.js} +2 -2
  15. package/dist/{chunk-RM6MNDVF.js → chunk-ZIY22VO7.js} +192 -11
  16. package/dist/chunk-ZIY22VO7.js.map +1 -0
  17. package/dist/{connection-utils-C4FQGBW6.js → connection-utils-FEUWER5I.js} +5 -5
  18. package/dist/{describe-X75C2VDU.js → describe-MEP72B56.js} +6 -6
  19. package/dist/{dev-GWXHBBWB.js → dev-LZ4YHNDJ.js} +1315 -73
  20. package/dist/dev-LZ4YHNDJ.js.map +1 -0
  21. package/dist/dist-5IFWLWND.js +48 -0
  22. package/dist/{dist-MX5K2ABB.js → dist-PPAD6KOM.js} +44 -2
  23. package/dist/{dist-JMLAZUL7.js → dist-XNCED7JW.js} +29 -12
  24. package/dist/fileFromPath-7TNUU6RI.js +130 -0
  25. package/dist/fileFromPath-7TNUU6RI.js.map +1 -0
  26. package/dist/index.js +24 -24
  27. package/dist/public/assets/DataView-DUCz_96y.js +9 -0
  28. package/dist/public/assets/{EventManagement-CTuAJ0eF.js → EventManagement-BnmeJDQl.js} +1 -1
  29. package/dist/public/assets/{ExplorePage-ZJ3zNjNQ.js → ExplorePage-kk4z9ldZ.js} +1 -1
  30. package/dist/public/assets/{LoginPage-wygea4BI.js → LoginPage-CzaFkkjg.js} +1 -1
  31. package/dist/public/assets/{PublicViewer-8YqGrVVB.js → PublicViewer-irjxqH6a.js} +1 -1
  32. package/dist/public/assets/{SetupWizard-DqDBwHrF.js → SetupWizard-ConWIcmy.js} +1 -1
  33. package/dist/public/assets/{ShareManagement-TAAdI_gY.js → ShareManagement-CP4wdwLR.js} +1 -1
  34. package/dist/public/assets/SourceDetailView-DZS5518E.js +1 -0
  35. package/dist/public/assets/{UserManagement-B4kZHyri.js → UserManagement-AubGd9hl.js} +1 -1
  36. package/dist/public/assets/data-3vtzSuAZ.js +1 -0
  37. package/dist/public/assets/{index-CfyF2Wf-.css → index-C1X8RW4Z.css} +1 -1
  38. package/dist/public/assets/{index-BgzSjgIu.js → index-jlfTO7f5.js} +44 -44
  39. package/dist/public/assets/{index.es-AB-GdGyc.js → index.es-CgnvEWi5.js} +1 -1
  40. package/dist/public/assets/{jspdf.es.min-ChRx2mOQ.js → jspdf.es.min-Cw5WefMt.js} +3 -3
  41. package/dist/public/index.html +2 -2
  42. package/dist/{query-QNRDS74I.js → query-2H3YOPI2.js} +5 -5
  43. package/dist/{sample-SKLHBZBU.js → sample-ODUGGSFA.js} +5 -5
  44. package/dist/{search-4KMETZVX.js → search-IPE4ISFB.js} +6 -6
  45. package/dist/{semantic-6WKELH5V.js → semantic-K3MYXXJI.js} +3 -2
  46. package/dist/{semantic-6WKELH5V.js.map → semantic-K3MYXXJI.js.map} +1 -1
  47. package/dist/{source-resolver-R7WBIL7M.js → source-resolver-HZQLOODU.js} +6 -6
  48. package/dist/source-resolver-HZQLOODU.js.map +1 -0
  49. package/dist/{sync-warehouse-UWRNUXE7.js → sync-warehouse-26L6JDSV.js} +10 -10
  50. package/dist/{tables-V65QUGHK.js → tables-K5NAN2WK.js} +6 -6
  51. package/dist/templates/default/docs/yamchart-reference.md +42 -0
  52. package/dist/{test-UE5OWG3E.js → test-SRHVOXZB.js} +8 -7
  53. package/dist/{test-UE5OWG3E.js.map → test-SRHVOXZB.js.map} +1 -1
  54. package/package.json +3 -3
  55. package/dist/advisor-SC64RTZO.js.map +0 -1
  56. package/dist/chunk-NXQ6ZO3V.js.map +0 -1
  57. package/dist/chunk-RM6MNDVF.js.map +0 -1
  58. package/dist/chunk-S7YQXEKM.js.map +0 -1
  59. package/dist/chunk-UND73EOB.js.map +0 -1
  60. package/dist/dev-GWXHBBWB.js.map +0 -1
  61. package/dist/dist-MNXSMGV6.js +0 -790
  62. package/dist/dist-MNXSMGV6.js.map +0 -1
  63. /package/dist/{chunk-RMIDEBHD.js.map → chunk-S2CH4HUZ.js.map} +0 -0
  64. /package/dist/{chunk-H4L3FNLS.js.map → chunk-ZBCQNWVN.js.map} +0 -0
  65. /package/dist/{connection-utils-C4FQGBW6.js.map → connection-utils-FEUWER5I.js.map} +0 -0
  66. /package/dist/{describe-X75C2VDU.js.map → describe-MEP72B56.js.map} +0 -0
  67. /package/dist/{dist-JMLAZUL7.js.map → dist-5IFWLWND.js.map} +0 -0
  68. /package/dist/{dist-MX5K2ABB.js.map → dist-PPAD6KOM.js.map} +0 -0
  69. /package/dist/{source-resolver-R7WBIL7M.js.map → dist-XNCED7JW.js.map} +0 -0
  70. /package/dist/{query-QNRDS74I.js.map → query-2H3YOPI2.js.map} +0 -0
  71. /package/dist/{sample-SKLHBZBU.js.map → sample-ODUGGSFA.js.map} +0 -0
  72. /package/dist/{search-4KMETZVX.js.map → search-IPE4ISFB.js.map} +0 -0
  73. /package/dist/{sync-warehouse-UWRNUXE7.js.map → sync-warehouse-26L6JDSV.js.map} +0 -0
  74. /package/dist/{tables-V65QUGHK.js.map → tables-K5NAN2WK.js.map} +0 -0
@@ -0,0 +1,48 @@
1
+ import {
2
+ AdvisorAgent,
3
+ AnthropicProvider,
4
+ KNOWLEDGE_TOPICS,
5
+ OpenAICompatibleProvider,
6
+ SYSTEM_PROMPT,
7
+ TOOL_DEFINITIONS,
8
+ buildModelPath,
9
+ buildProvider,
10
+ buildSchemaYmlEntry,
11
+ createEmbedder,
12
+ createProviderForTask,
13
+ detectConventions,
14
+ formatModelSql,
15
+ getKnowledgeOverview,
16
+ listDbtModels,
17
+ loadKnowledge,
18
+ readDbtModel,
19
+ updateSchemaYml,
20
+ writeDbtModel
21
+ } from "./chunk-FN6R2LAC.js";
22
+ import "./chunk-QUIDZO5G.js";
23
+ import "./chunk-UFDQ3C7Q.js";
24
+ import "./chunk-ZIY22VO7.js";
25
+ import "./chunk-QJ5CPQJK.js";
26
+ import "./chunk-7D4SUZUM.js";
27
+ export {
28
+ AdvisorAgent,
29
+ AnthropicProvider,
30
+ KNOWLEDGE_TOPICS,
31
+ OpenAICompatibleProvider,
32
+ SYSTEM_PROMPT,
33
+ TOOL_DEFINITIONS,
34
+ buildModelPath,
35
+ buildProvider,
36
+ buildSchemaYmlEntry,
37
+ createEmbedder,
38
+ createProviderForTask,
39
+ detectConventions,
40
+ formatModelSql,
41
+ getKnowledgeOverview,
42
+ listDbtModels,
43
+ loadKnowledge,
44
+ readDbtModel,
45
+ updateSchemaYml,
46
+ writeDbtModel
47
+ };
48
+ //# sourceMappingURL=dist-5IFWLWND.js.map
@@ -1,56 +1,98 @@
1
1
  import {
2
2
  AgentDefinitionSchema,
3
+ AiConfigSchema,
4
+ BlindspotKindSchema,
5
+ BlindspotSchema,
6
+ BlindspotStatusSchema,
3
7
  ChartSchema,
8
+ ColumnProfileSchema,
4
9
  ConnectionSchema,
10
+ CuratedDimensionSchema,
11
+ CuratedMetricSchema,
12
+ CuratedSourceSchema,
5
13
  DashboardSchema,
6
14
  DimensionSchema,
7
15
  DimensionTypeSchema,
8
16
  EventSchema,
9
17
  EventsFileSchema,
18
+ HunchSampleSchema,
19
+ HunchSchema,
20
+ HunchStatusSchema,
21
+ KnowledgeDocSchema,
10
22
  MeasureSchema,
11
23
  MeasureTypeSchema,
12
24
  ModelMetadataSchema,
13
25
  ModelSchema,
26
+ NamedFilterSchema,
27
+ NewBlindspotSchema,
28
+ NewHunchSchema,
29
+ NewKnowledgeDocSchema,
14
30
  ParameterSchema,
15
31
  ProjectSchema,
32
+ ProviderConfigSchema,
16
33
  RelationshipSchema,
17
34
  ScheduleSchema,
18
35
  SemanticConfigSchema,
36
+ SemanticDefinitionSchema,
19
37
  SemanticEntitySchema,
20
38
  SemanticFilterOperatorSchema,
21
39
  SemanticFilterSchema,
22
40
  SemanticModelSchema,
23
41
  SemanticQuerySchema,
42
+ SourceProfileSchema,
43
+ SuggestedModelSchema,
44
+ TableProfileSchema,
24
45
  VERSION,
25
46
  deepMerge,
26
47
  resolveProjectConfig
27
- } from "./chunk-RM6MNDVF.js";
48
+ } from "./chunk-ZIY22VO7.js";
28
49
  import "./chunk-7D4SUZUM.js";
29
50
  export {
30
51
  AgentDefinitionSchema,
52
+ AiConfigSchema,
53
+ BlindspotKindSchema,
54
+ BlindspotSchema,
55
+ BlindspotStatusSchema,
31
56
  ChartSchema,
57
+ ColumnProfileSchema,
32
58
  ConnectionSchema,
59
+ CuratedDimensionSchema,
60
+ CuratedMetricSchema,
61
+ CuratedSourceSchema,
33
62
  DashboardSchema,
34
63
  DimensionSchema,
35
64
  DimensionTypeSchema,
36
65
  EventSchema,
37
66
  EventsFileSchema,
67
+ HunchSampleSchema,
68
+ HunchSchema,
69
+ HunchStatusSchema,
70
+ KnowledgeDocSchema,
38
71
  MeasureSchema,
39
72
  MeasureTypeSchema,
40
73
  ModelMetadataSchema,
41
74
  ModelSchema,
75
+ NamedFilterSchema,
76
+ NewBlindspotSchema,
77
+ NewHunchSchema,
78
+ NewKnowledgeDocSchema,
42
79
  ParameterSchema,
43
80
  ProjectSchema,
81
+ ProviderConfigSchema,
44
82
  RelationshipSchema,
45
83
  ScheduleSchema,
46
84
  SemanticConfigSchema,
85
+ SemanticDefinitionSchema,
47
86
  SemanticEntitySchema,
48
87
  SemanticFilterOperatorSchema,
49
88
  SemanticFilterSchema,
50
89
  SemanticModelSchema,
51
90
  SemanticQuerySchema,
91
+ SourceProfileSchema,
92
+ SuggestedModelSchema,
93
+ TableProfileSchema,
52
94
  VERSION,
53
95
  deepMerge,
54
96
  resolveProjectConfig
55
97
  };
56
- //# sourceMappingURL=dist-MX5K2ABB.js.map
98
+ //# sourceMappingURL=dist-PPAD6KOM.js.map
@@ -1,6 +1,5 @@
1
1
  import {
2
2
  BigQueryConnector,
3
- DATE_PRESETS,
4
3
  DuckDBConnector,
5
4
  MySQLConnector,
6
5
  PostgresConnector,
@@ -11,18 +10,14 @@ import {
11
10
  SqlList,
12
11
  VERSION,
13
12
  bigQueryTypeToString,
13
+ buildSourceProfile,
14
+ buildTableStatsSql,
15
+ buildTopValuesSql,
14
16
  checkSchema,
15
- computePreviousPeriod,
16
17
  createTemplateContext,
17
- expandCustomDateRange,
18
- expandDatePreset,
19
- expandRelativeDateRange,
20
18
  expandThis,
21
19
  extractTemplateVariables,
22
- formatPeriodLabel,
23
- isCustomDateRange,
24
- isDatePreset,
25
- isRelativeDateRange,
20
+ isReadOnlySql,
26
21
  parseModelMetadata,
27
22
  renderTemplate,
28
23
  resolveBigQueryAuth,
@@ -35,16 +30,30 @@ import {
35
30
  runModel,
36
31
  serializeDateValue,
37
32
  templateHasVariable
38
- } from "./chunk-S7YQXEKM.js";
33
+ } from "./chunk-QUIDZO5G.js";
39
34
  import {
35
+ DATE_PRESETS,
40
36
  SemanticModelBuilder,
41
37
  SemanticQueryCompiler,
42
38
  SemanticValidationError,
39
+ buildSemanticLayer,
43
40
  classifyCatalogColumns,
44
41
  classifyField,
42
+ compileMetricQuery,
43
+ computePreviousPeriod,
44
+ expandCustomDateRange,
45
+ expandDatePreset,
46
+ expandRelativeDateRange,
47
+ formatPeriodLabel,
48
+ getDialect,
45
49
  inferAggregationType,
50
+ isCustomDateRange,
51
+ isDatePreset,
52
+ isRelativeDateRange,
53
+ loadSemanticDefinitions,
46
54
  validateSemanticQuery
47
- } from "./chunk-UND73EOB.js";
55
+ } from "./chunk-UFDQ3C7Q.js";
56
+ import "./chunk-ZIY22VO7.js";
48
57
  import "./chunk-7D4SUZUM.js";
49
58
  export {
50
59
  BigQueryConnector,
@@ -62,9 +71,14 @@ export {
62
71
  SqlList,
63
72
  VERSION,
64
73
  bigQueryTypeToString,
74
+ buildSemanticLayer,
75
+ buildSourceProfile,
76
+ buildTableStatsSql,
77
+ buildTopValuesSql,
65
78
  checkSchema,
66
79
  classifyCatalogColumns,
67
80
  classifyField,
81
+ compileMetricQuery,
68
82
  computePreviousPeriod,
69
83
  createTemplateContext,
70
84
  expandCustomDateRange,
@@ -73,10 +87,13 @@ export {
73
87
  expandThis,
74
88
  extractTemplateVariables,
75
89
  formatPeriodLabel,
90
+ getDialect,
76
91
  inferAggregationType,
77
92
  isCustomDateRange,
78
93
  isDatePreset,
94
+ isReadOnlySql,
79
95
  isRelativeDateRange,
96
+ loadSemanticDefinitions,
80
97
  parseModelMetadata,
81
98
  renderTemplate,
82
99
  resolveBigQueryAuth,
@@ -91,4 +108,4 @@ export {
91
108
  templateHasVariable,
92
109
  validateSemanticQuery
93
110
  };
94
- //# sourceMappingURL=dist-JMLAZUL7.js.map
111
+ //# sourceMappingURL=dist-XNCED7JW.js.map
@@ -0,0 +1,130 @@
1
+ import {
2
+ File,
3
+ isFile
4
+ } from "./chunk-QJ5CPQJK.js";
5
+ import {
6
+ __commonJS,
7
+ __require,
8
+ __toESM
9
+ } from "./chunk-7D4SUZUM.js";
10
+
11
+ // ../../node_modules/.pnpm/node-domexception@1.0.0/node_modules/node-domexception/index.js
12
+ var require_node_domexception = __commonJS({
13
+ "../../node_modules/.pnpm/node-domexception@1.0.0/node_modules/node-domexception/index.js"(exports, module) {
14
+ "use strict";
15
+ if (!globalThis.DOMException) {
16
+ try {
17
+ const { MessageChannel } = __require("worker_threads"), port = new MessageChannel().port1, ab = new ArrayBuffer();
18
+ port.postMessage(ab, [ab, ab]);
19
+ } catch (err) {
20
+ err.constructor.name === "DOMException" && (globalThis.DOMException = err.constructor);
21
+ }
22
+ }
23
+ module.exports = globalThis.DOMException;
24
+ }
25
+ });
26
+
27
+ // ../../node_modules/.pnpm/formdata-node@4.4.1/node_modules/formdata-node/lib/esm/fileFromPath.js
28
+ var import_node_domexception = __toESM(require_node_domexception(), 1);
29
+ import { statSync, createReadStream, promises as fs } from "fs";
30
+ import { basename } from "path";
31
+
32
+ // ../../node_modules/.pnpm/formdata-node@4.4.1/node_modules/formdata-node/lib/esm/isPlainObject.js
33
+ var getType = (value) => Object.prototype.toString.call(value).slice(8, -1).toLowerCase();
34
+ function isPlainObject(value) {
35
+ if (getType(value) !== "object") {
36
+ return false;
37
+ }
38
+ const pp = Object.getPrototypeOf(value);
39
+ if (pp === null || pp === void 0) {
40
+ return true;
41
+ }
42
+ const Ctor = pp.constructor && pp.constructor.toString();
43
+ return Ctor === Object.toString();
44
+ }
45
+ var isPlainObject_default = isPlainObject;
46
+
47
+ // ../../node_modules/.pnpm/formdata-node@4.4.1/node_modules/formdata-node/lib/esm/fileFromPath.js
48
+ var __classPrivateFieldSet = function(receiver, state, value, kind, f) {
49
+ if (kind === "m") throw new TypeError("Private method is not writable");
50
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
51
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
52
+ return kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value), value;
53
+ };
54
+ var __classPrivateFieldGet = function(receiver, state, kind, f) {
55
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
56
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
57
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
58
+ };
59
+ var _FileFromPath_path;
60
+ var _FileFromPath_start;
61
+ var MESSAGE = "The requested file could not be read, typically due to permission problems that have occurred after a reference to a file was acquired.";
62
+ var FileFromPath = class _FileFromPath {
63
+ constructor(input) {
64
+ _FileFromPath_path.set(this, void 0);
65
+ _FileFromPath_start.set(this, void 0);
66
+ __classPrivateFieldSet(this, _FileFromPath_path, input.path, "f");
67
+ __classPrivateFieldSet(this, _FileFromPath_start, input.start || 0, "f");
68
+ this.name = basename(__classPrivateFieldGet(this, _FileFromPath_path, "f"));
69
+ this.size = input.size;
70
+ this.lastModified = input.lastModified;
71
+ }
72
+ slice(start, end) {
73
+ return new _FileFromPath({
74
+ path: __classPrivateFieldGet(this, _FileFromPath_path, "f"),
75
+ lastModified: this.lastModified,
76
+ size: end - start,
77
+ start
78
+ });
79
+ }
80
+ async *stream() {
81
+ const { mtimeMs } = await fs.stat(__classPrivateFieldGet(this, _FileFromPath_path, "f"));
82
+ if (mtimeMs > this.lastModified) {
83
+ throw new import_node_domexception.default(MESSAGE, "NotReadableError");
84
+ }
85
+ if (this.size) {
86
+ yield* createReadStream(__classPrivateFieldGet(this, _FileFromPath_path, "f"), {
87
+ start: __classPrivateFieldGet(this, _FileFromPath_start, "f"),
88
+ end: __classPrivateFieldGet(this, _FileFromPath_start, "f") + this.size - 1
89
+ });
90
+ }
91
+ }
92
+ get [(_FileFromPath_path = /* @__PURE__ */ new WeakMap(), _FileFromPath_start = /* @__PURE__ */ new WeakMap(), Symbol.toStringTag)]() {
93
+ return "File";
94
+ }
95
+ };
96
+ function createFileFromPath(path, { mtimeMs, size }, filenameOrOptions, options = {}) {
97
+ let filename;
98
+ if (isPlainObject_default(filenameOrOptions)) {
99
+ [options, filename] = [filenameOrOptions, void 0];
100
+ } else {
101
+ filename = filenameOrOptions;
102
+ }
103
+ const file = new FileFromPath({ path, size, lastModified: mtimeMs });
104
+ if (!filename) {
105
+ filename = file.name;
106
+ }
107
+ return new File([file], filename, {
108
+ ...options,
109
+ lastModified: file.lastModified
110
+ });
111
+ }
112
+ function fileFromPathSync(path, filenameOrOptions, options = {}) {
113
+ const stats = statSync(path);
114
+ return createFileFromPath(path, stats, filenameOrOptions, options);
115
+ }
116
+ async function fileFromPath(path, filenameOrOptions, options) {
117
+ const stats = await fs.stat(path);
118
+ return createFileFromPath(path, stats, filenameOrOptions, options);
119
+ }
120
+ export {
121
+ fileFromPath,
122
+ fileFromPathSync,
123
+ isFile
124
+ };
125
+ /*! Bundled license information:
126
+
127
+ node-domexception/index.js:
128
+ (*! node-domexception. MIT License. Jimmy Wärting <https://jimmy.warting.se/opensource> *)
129
+ */
130
+ //# sourceMappingURL=fileFromPath-7TNUU6RI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../node_modules/.pnpm/node-domexception@1.0.0/node_modules/node-domexception/index.js","../../../node_modules/.pnpm/formdata-node@4.4.1/node_modules/formdata-node/lib/esm/fileFromPath.js","../../../node_modules/.pnpm/formdata-node@4.4.1/node_modules/formdata-node/lib/esm/isPlainObject.js"],"sourcesContent":["/*! node-domexception. MIT License. Jimmy Wärting <https://jimmy.warting.se/opensource> */\n\nif (!globalThis.DOMException) {\n try {\n const { MessageChannel } = require('worker_threads'),\n port = new MessageChannel().port1,\n ab = new ArrayBuffer()\n port.postMessage(ab, [ab, ab])\n } catch (err) {\n err.constructor.name === 'DOMException' && (\n globalThis.DOMException = err.constructor\n )\n }\n}\n\nmodule.exports = globalThis.DOMException\n","var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n};\nvar __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n};\nvar _FileFromPath_path, _FileFromPath_start;\nimport { statSync, createReadStream, promises as fs } from \"fs\";\nimport { basename } from \"path\";\nimport DOMException from \"node-domexception\";\nimport { File } from \"./File.js\";\nimport isPlainObject from \"./isPlainObject.js\";\nexport * from \"./isFile.js\";\nconst MESSAGE = \"The requested file could not be read, \"\n + \"typically due to permission problems that have occurred after a reference \"\n + \"to a file was acquired.\";\nclass FileFromPath {\n constructor(input) {\n _FileFromPath_path.set(this, void 0);\n _FileFromPath_start.set(this, void 0);\n __classPrivateFieldSet(this, _FileFromPath_path, input.path, \"f\");\n __classPrivateFieldSet(this, _FileFromPath_start, input.start || 0, \"f\");\n this.name = basename(__classPrivateFieldGet(this, _FileFromPath_path, \"f\"));\n this.size = input.size;\n this.lastModified = input.lastModified;\n }\n slice(start, end) {\n return new FileFromPath({\n path: __classPrivateFieldGet(this, _FileFromPath_path, \"f\"),\n lastModified: this.lastModified,\n size: end - start,\n start\n });\n }\n async *stream() {\n const { mtimeMs } = await fs.stat(__classPrivateFieldGet(this, _FileFromPath_path, \"f\"));\n if (mtimeMs > this.lastModified) {\n throw new DOMException(MESSAGE, \"NotReadableError\");\n }\n if (this.size) {\n yield* createReadStream(__classPrivateFieldGet(this, _FileFromPath_path, \"f\"), {\n start: __classPrivateFieldGet(this, _FileFromPath_start, \"f\"),\n end: __classPrivateFieldGet(this, _FileFromPath_start, \"f\") + this.size - 1\n });\n }\n }\n get [(_FileFromPath_path = new WeakMap(), _FileFromPath_start = new WeakMap(), Symbol.toStringTag)]() {\n return \"File\";\n }\n}\nfunction createFileFromPath(path, { mtimeMs, size }, filenameOrOptions, options = {}) {\n let filename;\n if (isPlainObject(filenameOrOptions)) {\n [options, filename] = [filenameOrOptions, undefined];\n }\n else {\n filename = filenameOrOptions;\n }\n const file = new FileFromPath({ path, size, lastModified: mtimeMs });\n if (!filename) {\n filename = file.name;\n }\n return new File([file], filename, {\n ...options, lastModified: file.lastModified\n });\n}\nexport function fileFromPathSync(path, filenameOrOptions, options = {}) {\n const stats = statSync(path);\n return createFileFromPath(path, stats, filenameOrOptions, options);\n}\nexport async function fileFromPath(path, filenameOrOptions, options) {\n const stats = await fs.stat(path);\n return createFileFromPath(path, stats, filenameOrOptions, options);\n}\n","const getType = (value) => (Object.prototype.toString.call(value).slice(8, -1).toLowerCase());\nfunction isPlainObject(value) {\n if (getType(value) !== \"object\") {\n return false;\n }\n const pp = Object.getPrototypeOf(value);\n if (pp === null || pp === undefined) {\n return true;\n }\n const Ctor = pp.constructor && pp.constructor.toString();\n return Ctor === Object.toString();\n}\nexport default isPlainObject;\n"],"mappings":"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","names":["DOMException"]}
package/dist/index.js CHANGED
@@ -6,7 +6,7 @@ import {
6
6
  findProjectRoot,
7
7
  loadEnvFile,
8
8
  validateProject
9
- } from "./chunk-RMIDEBHD.js";
9
+ } from "./chunk-S2CH4HUZ.js";
10
10
  import {
11
11
  detail,
12
12
  error,
@@ -17,9 +17,9 @@ import {
17
17
  success,
18
18
  warning
19
19
  } from "./chunk-HJVVHYVN.js";
20
- import "./chunk-RM6MNDVF.js";
21
- import "./chunk-S7YQXEKM.js";
22
- import "./chunk-UND73EOB.js";
20
+ import "./chunk-QUIDZO5G.js";
21
+ import "./chunk-UFDQ3C7Q.js";
22
+ import "./chunk-ZIY22VO7.js";
23
23
  import "./chunk-7D4SUZUM.js";
24
24
 
25
25
  // src/index.ts
@@ -105,7 +105,7 @@ program.command("dev").description("Start development server with hot reload").a
105
105
  process.exit(2);
106
106
  }
107
107
  const globalOpts = program.opts();
108
- const { runDevServer } = await import("./dev-GWXHBBWB.js");
108
+ const { runDevServer } = await import("./dev-LZ4YHNDJ.js");
109
109
  await runDevServer(projectDir, {
110
110
  port: parseInt(options.port, 10),
111
111
  apiOnly: options.apiOnly ?? false,
@@ -179,7 +179,7 @@ program.command("sync-dbt").description("Sync dbt project metadata into AI-reada
179
179
  if (!options.targetDatabase) {
180
180
  try {
181
181
  const { readFile } = await import("fs/promises");
182
- const { resolveConnection } = await import("./connection-utils-C4FQGBW6.js");
182
+ const { resolveConnection } = await import("./connection-utils-FEUWER5I.js");
183
183
  const { detectDatabaseMismatch } = await import("./rewrite-database-BOA4QPUR.js");
184
184
  const catalogJsonStr = await readFile(join(projectDir, ".yamchart", "catalog.json"), "utf-8");
185
185
  const catalogData = JSON.parse(catalogJsonStr);
@@ -233,7 +233,7 @@ program.command("test").description("Run model tests (@returns schema checks and
233
233
  }
234
234
  loadEnvFile(projectDir);
235
235
  try {
236
- const { testProject, formatTestOutput } = await import("./test-UE5OWG3E.js");
236
+ const { testProject, formatTestOutput } = await import("./test-SRHVOXZB.js");
237
237
  const result = await testProject(projectDir, model, {
238
238
  connection: options.connection,
239
239
  json: options.json
@@ -282,7 +282,7 @@ program.command("tables").description("List tables and views in the connected da
282
282
  loadEnvFile(projectDir);
283
283
  try {
284
284
  if (options.compare) {
285
- const { resolveTablesSource } = await import("./source-resolver-R7WBIL7M.js");
285
+ const { resolveTablesSource } = await import("./source-resolver-HZQLOODU.js");
286
286
  const { compareTables, formatCompareTables } = await import("./compare-RQFCEZIK.js");
287
287
  let localResult;
288
288
  try {
@@ -313,7 +313,7 @@ program.command("tables").description("List tables and views in the connected da
313
313
  }
314
314
  return;
315
315
  }
316
- const { listTables } = await import("./tables-V65QUGHK.js");
316
+ const { listTables } = await import("./tables-K5NAN2WK.js");
317
317
  const result = await listTables(projectDir, {
318
318
  ...options,
319
319
  source: options.source || "auto"
@@ -351,7 +351,7 @@ program.command("describe").description("Show columns and types for a table").ar
351
351
  loadEnvFile(projectDir);
352
352
  try {
353
353
  if (options.compare) {
354
- const { resolveDescribeSource } = await import("./source-resolver-R7WBIL7M.js");
354
+ const { resolveDescribeSource } = await import("./source-resolver-HZQLOODU.js");
355
355
  const { compareColumns, formatCompareColumns } = await import("./compare-RQFCEZIK.js");
356
356
  let localResult;
357
357
  try {
@@ -373,7 +373,7 @@ program.command("describe").description("Show columns and types for a table").ar
373
373
  }
374
374
  return;
375
375
  }
376
- const { describeTable } = await import("./describe-X75C2VDU.js");
376
+ const { describeTable } = await import("./describe-MEP72B56.js");
377
377
  const result = await describeTable(projectDir, table, {
378
378
  ...options,
379
379
  source: options.source || "auto"
@@ -412,8 +412,8 @@ program.command("query").description("Execute SQL against a connection").argumen
412
412
  }
413
413
  loadEnvFile(projectDir);
414
414
  try {
415
- const { executeQuery } = await import("./query-QNRDS74I.js");
416
- const { formatTable, formatJSON } = await import("./connection-utils-C4FQGBW6.js");
415
+ const { executeQuery } = await import("./query-2H3YOPI2.js");
416
+ const { formatTable, formatJSON } = await import("./connection-utils-FEUWER5I.js");
417
417
  const limit = options.limit ? parseInt(options.limit, 10) : void 0;
418
418
  const result = await executeQuery(projectDir, sql, {
419
419
  connection: options.connection,
@@ -440,8 +440,8 @@ program.command("sample").description("Show sample rows from a table or dbt mode
440
440
  }
441
441
  loadEnvFile(projectDir);
442
442
  try {
443
- const { sampleTable } = await import("./sample-SKLHBZBU.js");
444
- const { formatTable, formatJSON } = await import("./connection-utils-C4FQGBW6.js");
443
+ const { sampleTable } = await import("./sample-ODUGGSFA.js");
444
+ const { formatTable, formatJSON } = await import("./connection-utils-FEUWER5I.js");
445
445
  const limit = options.limit ? parseInt(options.limit, 10) : void 0;
446
446
  const result = await sampleTable(projectDir, table, {
447
447
  connection: options.connection,
@@ -471,7 +471,7 @@ program.command("search").description("Search for tables and columns by keyword"
471
471
  }
472
472
  loadEnvFile(projectDir);
473
473
  try {
474
- const { searchDatabase } = await import("./search-4KMETZVX.js");
474
+ const { searchDatabase } = await import("./search-IPE4ISFB.js");
475
475
  const result = await searchDatabase(projectDir, keyword, {
476
476
  ...options,
477
477
  source: options.source || "auto"
@@ -525,7 +525,7 @@ catalogCmd.command("tables").description("List tables from cached catalog").opti
525
525
  process.exit(2);
526
526
  }
527
527
  try {
528
- const { listTables } = await import("./tables-V65QUGHK.js");
528
+ const { listTables } = await import("./tables-K5NAN2WK.js");
529
529
  const result = await listTables(projectDir, {
530
530
  source: "catalog",
531
531
  schema: options.schema
@@ -567,7 +567,7 @@ catalogCmd.command("describe").description("Show cached columns and types for a
567
567
  process.exit(2);
568
568
  }
569
569
  try {
570
- const { describeTable } = await import("./describe-X75C2VDU.js");
570
+ const { describeTable } = await import("./describe-MEP72B56.js");
571
571
  const result = await describeTable(projectDir, table, { source: "catalog" });
572
572
  if (options.json) {
573
573
  console.log(JSON.stringify(result.columns, null, 2));
@@ -609,7 +609,7 @@ catalogCmd.command("search").description("Search cached metadata for tables and
609
609
  process.exit(2);
610
610
  }
611
611
  try {
612
- const { searchDatabase } = await import("./search-4KMETZVX.js");
612
+ const { searchDatabase } = await import("./search-IPE4ISFB.js");
613
613
  const result = await searchDatabase(projectDir, keyword, { source: "catalog" });
614
614
  if (options.json) {
615
615
  console.log(JSON.stringify(result.results, null, 2));
@@ -734,7 +734,7 @@ program.command("sync-warehouse").description("Sync warehouse table metadata int
734
734
  }
735
735
  loadEnvFile(projectDir);
736
736
  try {
737
- const { runSyncWarehouse } = await import("./sync-warehouse-UWRNUXE7.js");
737
+ const { runSyncWarehouse } = await import("./sync-warehouse-26L6JDSV.js");
738
738
  await runSyncWarehouse(projectDir, options);
739
739
  } catch (err) {
740
740
  error(err instanceof Error ? err.message : String(err));
@@ -785,7 +785,7 @@ program.command("advisor").description("AI-powered dbt model advisor \u2014 sugg
785
785
  process.exit(2);
786
786
  }
787
787
  loadEnvFile(projectDir);
788
- const { runAdvisor } = await import("./advisor-SC64RTZO.js");
788
+ const { runAdvisor } = await import("./advisor-O2BRAI4T.js");
789
789
  await runAdvisor(projectDir, question, {
790
790
  top: options.top ? parseInt(options.top, 10) : 5,
791
791
  json: options.json,
@@ -806,7 +806,7 @@ var semanticCmd = program.command("semantic").description("Explore the semantic
806
806
  const { readFile } = await import("fs/promises");
807
807
  const catalogPath = join(projectDir, ".yamchart", "catalog.json");
808
808
  const catalogJson = JSON.parse(await readFile(catalogPath, "utf-8"));
809
- const { listSemanticEntities } = await import("./semantic-6WKELH5V.js");
809
+ const { listSemanticEntities } = await import("./semantic-K3MYXXJI.js");
810
810
  const result = listSemanticEntities(catalogJson);
811
811
  if (options.json) {
812
812
  console.log(JSON.stringify(result.entities, null, 2));
@@ -853,7 +853,7 @@ semanticCmd.command("query").description("Run a structured query against the sem
853
853
  const { readFile } = await import("fs/promises");
854
854
  const catalogPath = join(projectDir, ".yamchart", "catalog.json");
855
855
  const catalogJson = JSON.parse(await readFile(catalogPath, "utf-8"));
856
- const { querySemanticEntity } = await import("./semantic-6WKELH5V.js");
856
+ const { querySemanticEntity } = await import("./semantic-K3MYXXJI.js");
857
857
  const filters = (options.filter || []).map((f) => {
858
858
  const eqIdx = f.indexOf("=");
859
859
  if (eqIdx === -1) throw new Error(`Invalid filter format: "${f}". Use dimension=value`);
@@ -875,7 +875,7 @@ semanticCmd.command("query").description("Run a structured query against the sem
875
875
  console.log(result.sql);
876
876
  return;
877
877
  }
878
- const { resolveConnection, createConnector, formatTable, formatJSON } = await import("./connection-utils-C4FQGBW6.js");
878
+ const { resolveConnection, createConnector, formatTable, formatJSON } = await import("./connection-utils-FEUWER5I.js");
879
879
  const connection = await resolveConnection(projectDir, options.connection, program.opts().env);
880
880
  const connector = createConnector(connection, projectDir);
881
881
  const start = performance.now();
@@ -0,0 +1,9 @@
1
+ import{v as S,j as e,Q as $,e as W}from"./index-jlfTO7f5.js";import{a as h}from"./echarts-DtOYsfLX.js";import{l as I}from"./data-3vtzSuAZ.js";function O({label:o,value:s}){return e.jsxs("div",{style:{display:"flex",flexDirection:"column"},children:[e.jsx("span",{style:{fontSize:"18px",fontWeight:600,color:"var(--yc-color-text)"},children:s}),e.jsx("span",{style:{fontSize:"12px",color:"var(--yc-color-text-secondary)"},children:o})]})}function M({source:o,onOpen:s}){return e.jsxs("div",{onClick:()=>s(o.name),style:{border:"1px solid var(--yc-color-border)",borderRadius:"8px",padding:"16px",background:"var(--yc-color-surface)",cursor:"pointer",display:"flex",flexDirection:"column",gap:"12px"},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between"},children:[e.jsx("span",{style:{fontSize:"15px",fontWeight:600,color:"var(--yc-color-text)"},children:o.name}),e.jsx("span",{style:{fontSize:"11px",fontWeight:500,padding:"2px 8px",borderRadius:"9999px",background:"var(--yc-color-bg)",color:"var(--yc-color-text-secondary)",border:"1px solid var(--yc-color-border)",letterSpacing:"0.04em"},children:o.type.toUpperCase()})]}),e.jsxs("div",{style:{display:"flex",gap:"24px"},children:[e.jsx(O,{label:"Tables",value:o.counts.tables}),e.jsx(O,{label:"Hunches",value:o.counts.pendingHunches}),e.jsx(O,{label:"Blindspots",value:o.counts.openBlindspots})]}),e.jsx("button",{onClick:t=>{t.stopPropagation(),s(o.name)},style:{alignSelf:"flex-start",fontSize:"13px",fontWeight:500,color:"var(--yc-color-primary)",background:"none",border:"none",padding:0,cursor:"pointer"},children:"Open →"})]})}function K(){const{data:o,isLoading:s,error:t}=S({queryKey:["sources"],queryFn:I}),n=c=>{window.location.hash=`/data/sources/${encodeURIComponent(c)}`};return e.jsxs("div",{className:"p-6 w-full",children:[e.jsx("h2",{className:"text-lg font-semibold mb-1",style:{color:"var(--yc-color-text)"},children:"Data Sources"}),e.jsx("p",{className:"text-sm mb-4",style:{color:"var(--yc-color-text-secondary)"},children:"Your connected data sources. Open one to browse its tables and add business context."}),t&&e.jsx("p",{className:"text-sm",style:{color:"var(--yc-color-danger)"},children:"Failed to load sources."}),s?e.jsx("p",{className:"text-sm",style:{color:"var(--yc-color-text-secondary)"},children:"Loading…"}):!o||o.length===0?e.jsxs("p",{className:"text-sm",style:{color:"var(--yc-color-text-secondary)"},children:["No connections configured. Add one in your project's ",e.jsx("code",{children:"connections/"})," directory."]}):e.jsx("div",{style:{display:"grid",gridTemplateColumns:"repeat(auto-fill, minmax(260px, 1fr))",gap:"16px"},children:o.map(c=>e.jsx(M,{source:c,onOpen:n},c.name))})]})}function J(o){const s=o.match(/event:\s*(\w+)\s*\ndata:\s*(\{[\s\S]*\})/);if(!s)return null;try{return{event:s[1],data:JSON.parse(s[2])}}catch{return null}}async function L(o,s="pending"){const t=new URLSearchParams({status:s,...o?{connection:o}:{}}),n=await fetch(`/api/hunches?${t}`);if(!n.ok)throw new Error("Failed to load hunches");return n.json()}async function U(o,s){return(await fetch(`/api/hunches/${o}/confirm`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s?{sql:s}:{})})).json()}async function V(o){return(await fetch(`/api/hunches/${o}/reject`,{method:"POST"})).json()}async function Q(o){return(await fetch(`/api/hunches/${o}/run`,{method:"POST"})).json()}async function G(o,s){const n=(await fetch("/api/learn",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({connection:o})})).body.getReader(),c=new TextDecoder;let d="";for(;;){const{done:p,value:a}=await n.read();if(p)break;d+=c.decode(a,{stream:!0});const l=d.split(`
2
+
3
+ `);d=l.pop()??"";for(const y of l){const u=J(y+`
4
+
5
+ `);u&&s(u)}}}async function R(o="open",s){const t=new URLSearchParams({status:o});return s&&t.set("connection",s),(await fetch(`/api/blindspots?${t}`)).json()}async function Y(o,s){return(await fetch(`/api/blindspots/${o}/answer`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({answer:s})})).json()}async function D(o){return(await fetch(`/api/blindspots/${o}/dismiss`,{method:"POST"})).json()}async function X(o,s){const n=(await fetch("/api/blindspots/scan",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({connection:o})})).body.getReader(),c=new TextDecoder;let d="";for(;;){const{done:p,value:a}=await n.read();if(p)break;d+=c.decode(a,{stream:!0});const l=d.split(`
6
+
7
+ `);d=l.pop()??"";for(const y of l){const u=J(y+`
8
+
9
+ `);u&&s(u)}}}const x=$(o=>({learning:!1,hunches:[],setLearning:s=>o({learning:s}),setPhase:s=>o({phase:s}),setHunches:s=>o({hunches:s}),removeHunch:s=>o(t=>({hunches:t.hunches.filter(n=>n.id!==s)}))}));function z({hunch:o,onConfirm:s,onReject:t,onRun:n,running:c}){const[d,p]=h.useState(o.sql);return e.jsxs("div",{className:"rounded-lg p-4 mb-3",style:{border:"1px solid var(--yc-color-border)",backgroundColor:"var(--yc-color-surface)"},children:[e.jsxs("div",{className:"flex items-start justify-between gap-2",children:[e.jsx("h3",{className:"font-medium",style:{color:"var(--yc-color-text)"},children:o.question}),o.confidence!=null&&e.jsxs("span",{className:"text-xs whitespace-nowrap",style:{color:"var(--yc-color-text-muted)"},children:[Math.round(o.confidence*100),"%"]})]}),o.rationale&&e.jsx("p",{className:"text-sm mt-1",style:{color:"var(--yc-color-text-secondary)"},children:o.rationale}),e.jsx("textarea",{className:"w-full font-mono text-sm mt-2 p-2 rounded",style:{backgroundColor:"var(--yc-color-input-bg)",border:"1px solid var(--yc-color-border)",color:"var(--yc-color-text)"},rows:3,value:d,onChange:a=>p(a.target.value),spellCheck:!1}),o.lastRunSample&&e.jsx("div",{className:"text-xs mt-2 overflow-auto max-h-40 rounded p-2",style:{backgroundColor:"var(--yc-color-input-bg)",color:"var(--yc-color-text-secondary)"},children:e.jsx("pre",{className:"font-mono",children:JSON.stringify(o.lastRunSample.rows.slice(0,5),null,2)})}),e.jsxs("div",{className:"flex gap-2 mt-3",children:[e.jsx("button",{onClick:()=>s(o.id,d),className:"px-3 py-1 rounded text-white text-sm hover:opacity-90",style:{backgroundColor:"var(--yc-color-primary)"},children:"Confirm"}),e.jsx("button",{onClick:()=>n(o.id,d),disabled:c,className:"px-3 py-1 rounded text-sm hover:opacity-80 disabled:opacity-50",style:{border:"1px solid var(--yc-color-border)",color:"var(--yc-color-text)"},children:c?"Running…":"Run"}),e.jsx("button",{onClick:()=>t(o.id),className:"px-3 py-1 rounded text-sm hover:opacity-80",style:{border:"1px solid var(--yc-color-border)",color:"var(--yc-color-text-secondary)"},children:"Reject"})]})]})}function Z({connection:o,onComplete:s}){const t=x(l=>l.learning),n=x(l=>l.phase),c=x(l=>l.setLearning),d=x(l=>l.setPhase),p=l=>l==="profiling"?"Profiling the source…":l==="generating"?"Generating hunches…":l==="error"?"Something went wrong.":"Learning…",a=async()=>{c(!0),d("profiling");try{await G(o,l=>{if(l.event==="status")d(l.data.phase);else if(l.event==="done"){const y=l.data.hunches??[];s==null||s(y)}else l.event==="error"&&d("error")})}catch{d("error")}finally{c(!1)}};return e.jsxs("div",{className:"rounded-lg p-5 mb-4 flex items-center justify-between gap-4",style:{border:"1px solid var(--yc-color-border)",backgroundColor:"var(--yc-color-surface)"},children:[e.jsxs("div",{children:[e.jsx("h3",{className:"font-medium",style:{color:"var(--yc-color-text)"},children:"Learn this source"}),e.jsxs("p",{className:"text-sm mt-1",style:{color:"var(--yc-color-text-secondary)"},children:["Profile ",e.jsx("span",{className:"font-mono",children:o})," and propose business questions you can confirm or edit."]}),t&&e.jsx("p",{className:"text-sm mt-2",style:{color:"var(--yc-color-primary)"},children:p(n)})]}),e.jsx("button",{onClick:a,disabled:t,className:"px-4 py-2 rounded text-white text-sm whitespace-nowrap hover:opacity-90 disabled:opacity-50",style:{backgroundColor:"var(--yc-color-primary)"},children:t?"Learning…":"Learn this source"})]})}function _({connection:o}={}){var r,g,A;const{data:s}=W(),t=((r=s==null?void 0:s.defaults)==null?void 0:r.connection)??((A=(g=s==null?void 0:s.connections)==null?void 0:g[0])==null?void 0:A.name)??"",n=o??t,[c,d]=h.useState("pending"),p=x(i=>i.hunches),a=x(i=>i.setHunches),l=x(i=>i.removeHunch),[y,u]=h.useState(null),{data:f,isLoading:P,error:H}=S({queryKey:["hunches",n,"pending"],queryFn:()=>L(n||void 0,"pending"),enabled:!!n&&c==="pending"}),{data:b,isLoading:T,error:q}=S({queryKey:["hunches",n,"confirmed"],queryFn:()=>L(n||void 0,"confirmed"),enabled:!!n&&c==="approved"});h.useEffect(()=>{f&&a(f)},[f,a]);const C=async(i,m)=>{l(i);try{await U(i,m)}catch{a(await L(n||void 0,"pending"))}},k=async i=>{l(i);try{await V(i)}catch{a(await L(n||void 0,"pending"))}},j=async i=>{u(i);try{const m=await Q(i);m.sample&&a(x.getState().hunches.map(N=>N.id===i?{...N,lastRunSample:m.sample}:N))}finally{u(null)}},B=i=>{const m=new Set(x.getState().hunches.map(F=>F.id)),N=i.filter(F=>!m.has(F.id));a([...N,...x.getState().hunches])},w=(i,m)=>e.jsx("button",{onClick:()=>d(i),style:{color:c===i?"var(--yc-color-primary)":"var(--yc-color-text-secondary)",borderBottom:c===i?"2px solid var(--yc-color-primary)":"2px solid transparent",paddingBottom:"6px",marginRight:"16px",background:"none",border:"none",cursor:"pointer",fontSize:"14px",fontWeight:c===i?600:400},children:m});return e.jsxs("div",{className:"p-6 max-w-3xl mx-auto w-full",children:[e.jsx("h2",{className:"text-lg font-semibold mb-1",style:{color:"var(--yc-color-text)"},children:"Hunches"}),e.jsx("p",{className:"text-sm mb-4",style:{color:"var(--yc-color-text-secondary)"},children:"Confirm, edit, run, or reject the questions learned from your source."}),e.jsxs("div",{style:{display:"flex",borderBottom:"1px solid var(--yc-color-border)",marginBottom:"16px"},children:[w("pending","Pending"),w("approved","Approved")]}),c==="pending"&&e.jsxs(e.Fragment,{children:[n?e.jsx(Z,{connection:n,onComplete:B}):e.jsx("p",{className:"text-sm",style:{color:"var(--yc-color-text-secondary)"},children:"No connection configured."}),H&&e.jsx("p",{className:"text-sm",style:{color:"var(--yc-color-danger)"},children:"Failed to load hunches."}),P?e.jsx("p",{className:"text-sm",style:{color:"var(--yc-color-text-secondary)"},children:"Loading…"}):p.length===0?e.jsx("p",{className:"text-sm",style:{color:"var(--yc-color-text-secondary)"},children:"No pending hunches. Learn this source to generate some."}):p.map(i=>e.jsx(z,{hunch:i,onConfirm:C,onReject:k,onRun:j,running:y===i.id},i.id))]}),c==="approved"&&e.jsxs(e.Fragment,{children:[q&&e.jsx("p",{className:"text-sm",style:{color:"var(--yc-color-danger)"},children:"Failed to load approved hunches."}),T?e.jsx("p",{className:"text-sm",style:{color:"var(--yc-color-text-secondary)"},children:"Loading…"}):!b||b.length===0?e.jsx("p",{className:"text-sm",style:{color:"var(--yc-color-text-secondary)"},children:"No approved hunches yet. Confirm some from the Pending tab."}):b.map(i=>e.jsx(z,{hunch:i,onConfirm:C,onReject:k,onRun:j,running:y===i.id},i.id))]})]})}const v=$(o=>({scanning:!1,blindspots:[],setScanning:s=>o({scanning:s}),setPhase:s=>o({phase:s}),setBlindspots:s=>o({blindspots:s}),removeBlindspot:s=>o(t=>({blindspots:t.blindspots.filter(n=>n.id!==s)}))}));function ee({blindspot:o,onAnswer:s,onDismiss:t,onAccept:n}){const[c,d]=h.useState(""),p=o.kind==="opportunity";return e.jsxs("div",{className:"rounded-lg p-4 mb-3",style:{border:"1px solid var(--yc-color-border)",backgroundColor:"var(--yc-color-surface)"},children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-xs px-2 py-0.5 rounded-full",style:{border:"1px solid var(--yc-color-border)",color:"var(--yc-color-text-secondary)"},children:p?"opportunity":"context"}),e.jsx("h3",{className:"font-medium",style:{color:"var(--yc-color-text)"},children:o.title})]}),e.jsx("p",{className:"text-sm mt-1",style:{color:"var(--yc-color-text-secondary)"},children:o.detail}),p&&o.suggestedModel&&e.jsxs("div",{className:"text-xs mt-2 p-2 rounded",style:{backgroundColor:"var(--yc-color-input-bg)"},children:[e.jsx("div",{className:"font-mono",style:{color:"var(--yc-color-text)"},children:o.suggestedModel.name}),e.jsx("div",{style:{color:"var(--yc-color-text-secondary)"},children:o.suggestedModel.description}),o.suggestedModel.columns.length>0&&e.jsxs("div",{className:"mt-1",style:{color:"var(--yc-color-text-secondary)"},children:["cols: ",o.suggestedModel.columns.map(a=>a.name).join(", ")]})]}),!p&&e.jsx("textarea",{className:"w-full text-sm mt-2 p-2 rounded",style:{backgroundColor:"var(--yc-color-input-bg)",border:"1px solid var(--yc-color-border)",color:"var(--yc-color-text)"},rows:2,placeholder:"Explain this in business terms…",value:c,onChange:a=>d(a.target.value)}),e.jsxs("div",{className:"flex gap-2 mt-3",children:[p?e.jsx("button",{onClick:()=>n(o.id),className:"px-3 py-1 rounded text-white text-sm hover:opacity-90",style:{backgroundColor:"var(--yc-color-primary)"},children:"Accept"}):e.jsx("button",{onClick:()=>s(o.id,c),className:"px-3 py-1 rounded text-white text-sm hover:opacity-90",style:{backgroundColor:"var(--yc-color-primary)"},children:"Save"}),e.jsx("button",{onClick:()=>t(o.id),className:"px-3 py-1 rounded text-sm hover:opacity-80",style:{border:"1px solid var(--yc-color-border)",color:"var(--yc-color-text-secondary)"},children:"Dismiss"})]})]})}function oe({connection:o}={}){var j,B,w;const{data:s}=W(),t=((j=s==null?void 0:s.defaults)==null?void 0:j.connection)??((w=(B=s==null?void 0:s.connections)==null?void 0:B[0])==null?void 0:w.name)??"",n=o??t,c=v(r=>r.blindspots),d=v(r=>r.setBlindspots),p=v(r=>r.removeBlindspot),a=v(r=>r.scanning),l=v(r=>r.phase),y=v(r=>r.setScanning),u=v(r=>r.setPhase),{data:f,isLoading:P,error:H}=S({queryKey:["blindspots",n,"open"],queryFn:()=>R("open",n||void 0),enabled:!!n});h.useEffect(()=>{f&&d(f)},[f,d]);const b=async(r,g)=>{if(g.trim()){p(r);try{await Y(r,g)}catch{d(await R("open",n||void 0))}}},T=async r=>{p(r);try{await D(r)}catch{d(await R("open",n||void 0))}},q=async r=>{p(r);try{await D(r),alert("Sent to the dbt advisor — coming soon")}catch{d(await R("open",n||void 0))}},C=async()=>{if(n){y(!0),u("scanning");try{await X(n,r=>{if(r.event==="status")u(r.data.phase);else if(r.event==="done"){const g=r.data.blindspots??[];d(g)}else r.event==="error"&&u("error")})}catch{u("error")}finally{y(!1)}}},k=r=>r==="scanning"?"Scanning the source…":r==="error"?"Something went wrong.":"Scanning…";return e.jsxs("div",{className:"p-6 max-w-3xl mx-auto w-full",children:[e.jsx("h2",{className:"text-lg font-semibold mb-1",style:{color:"var(--yc-color-text)"},children:"Blindspots"}),e.jsx("p",{className:"text-sm mb-4",style:{color:"var(--yc-color-text-secondary)"},children:"Where the system lacks business context, plus useful marts it thinks are missing."}),e.jsxs("div",{className:"rounded-lg p-5 mb-4 flex items-center justify-between gap-4",style:{border:"1px solid var(--yc-color-border)",backgroundColor:"var(--yc-color-surface)"},children:[e.jsxs("div",{children:[e.jsx("h3",{className:"font-medium",style:{color:"var(--yc-color-text)"},children:"Scan for blindspots"}),e.jsx("p",{className:"text-sm mt-1",style:{color:"var(--yc-color-text-secondary)"},children:n?e.jsxs(e.Fragment,{children:["Audit ",e.jsx("span",{className:"font-mono",children:n})," for ambiguities and missing marts."]}):"No connection configured."}),a&&e.jsx("p",{className:"text-sm mt-2",style:{color:"var(--yc-color-primary)"},children:k(l)})]}),e.jsx("button",{onClick:C,disabled:a||!n,className:"px-4 py-2 rounded text-white text-sm whitespace-nowrap hover:opacity-90 disabled:opacity-50",style:{backgroundColor:"var(--yc-color-primary)"},children:a?"Scanning…":"Scan for blindspots"})]}),H&&e.jsx("p",{className:"text-sm",style:{color:"var(--yc-color-danger)"},children:"Failed to load blindspots."}),P?e.jsx("p",{className:"text-sm",style:{color:"var(--yc-color-text-secondary)"},children:"Loading…"}):c.length===0?e.jsx("p",{className:"text-sm",style:{color:"var(--yc-color-text-secondary)"},children:"No open blindspots. Scan this source to find some."}):c.map(r=>e.jsx(ee,{blindspot:r,onAnswer:b,onDismiss:T,onAccept:q},r.id))]})}const se=[{id:"sources",label:"Data Sources"},{id:"hunches",label:"Hunches"},{id:"blindspots",label:"Blindspots"}];function E({value:o,onChange:s}){const{data:t}=S({queryKey:["sources"],queryFn:I});return e.jsxs("div",{style:{padding:"12px 24px 0",display:"flex",alignItems:"center",gap:"8px"},children:[e.jsx("label",{htmlFor:"source-selector",style:{fontSize:"13px",color:"var(--yc-color-text-secondary)",whiteSpace:"nowrap"},children:"Source:"}),e.jsxs("select",{id:"source-selector",value:o,onChange:n=>s(n.target.value),style:{fontSize:"13px",padding:"4px 8px",borderRadius:"6px",border:"1px solid var(--yc-color-border)",backgroundColor:"var(--yc-color-surface)",color:"var(--yc-color-text)",cursor:"pointer"},children:[e.jsx("option",{value:"",children:"All sources"}),t==null?void 0:t.map(n=>e.jsx("option",{value:n.name,children:n.name},n.name))]})]})}function ce({tab:o,onTabChange:s}){const[t,n]=h.useState(""),[c,d]=h.useState(""),p=(a,l)=>e.jsx("button",{onClick:()=>s(a),style:{color:o===a?"var(--yc-color-primary)":"var(--yc-color-text-secondary)",borderBottom:o===a?"2px solid var(--yc-color-primary)":"2px solid transparent",paddingBottom:"6px",marginRight:"16px",background:"none",border:"none",cursor:"pointer",fontSize:"14px",fontWeight:o===a?600:400},children:l},a);return e.jsxs("div",{className:"flex flex-col h-full w-full",children:[e.jsx("div",{style:{display:"flex",borderBottom:"1px solid var(--yc-color-border)",padding:"16px 24px 0"},children:se.map(a=>p(a.id,a.label))}),e.jsxs("div",{className:"flex-1 overflow-y-auto",children:[o==="sources"&&e.jsx(K,{}),o==="hunches"&&e.jsxs(e.Fragment,{children:[e.jsx(E,{value:t,onChange:n}),e.jsx(_,{connection:t||void 0})]}),o==="blindspots"&&e.jsxs(e.Fragment,{children:[e.jsx(E,{value:c,onChange:d}),e.jsx(oe,{connection:c||void 0})]})]})]})}export{ce as DataView};
@@ -1,4 +1,4 @@
1
- import{t as xe,u as he,v as me,e as be,w as $,j as t,x as E,E as ce,M as fe,y as ve,z as je,I as Ce,a as S}from"./index-BgzSjgIu.js";import{a as s}from"./echarts-DtOYsfLX.js";const ge=`
1
+ import{t as xe,u as he,v as me,e as be,w as $,j as t,x as E,E as ce,M as fe,y as ve,z as je,I as Ce,a as S}from"./index-jlfTO7f5.js";import{a as s}from"./echarts-DtOYsfLX.js";const ge=`
2
2
  .rdp-root {
3
3
  --rdp-accent-color: var(--yc-color-primary, #2563eb);
4
4
  --rdp-accent-background-color: color-mix(in srgb, var(--yc-color-primary, #2563eb) 15%, transparent);