@askdb/studio 0.2.0-beta.3 → 0.2.0-beta.30
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.
- package/README.md +26 -2
- package/bin/askdb-studio.js +3 -1
- package/dist/bin.d.ts +1 -1
- package/dist/bin.d.ts.map +1 -1
- package/dist/bin.js +14 -2
- package/dist/bin.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +39 -8
- package/dist/cli.js.map +1 -1
- package/dist/client/assets/index-1XBLPRR4.js +107 -0
- package/dist/client/assets/index-D0tGkwqK.css +2 -0
- package/dist/client/index.html +2 -2
- package/dist/execute-registry.d.ts +34 -0
- package/dist/execute-registry.d.ts.map +1 -0
- package/dist/execute-registry.js +244 -0
- package/dist/execute-registry.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/introspection.d.ts +35 -0
- package/dist/introspection.d.ts.map +1 -0
- package/dist/introspection.js +138 -0
- package/dist/introspection.js.map +1 -0
- package/dist/server.d.ts +10 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +849 -117
- package/dist/server.js.map +1 -1
- package/dist/setup.d.ts +58 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +373 -0
- package/dist/setup.js.map +1 -0
- package/dist/shared/api.d.ts +143 -1
- package/dist/shared/api.d.ts.map +1 -1
- package/package.json +63 -24
- package/dist/client/assets/index-Bn3ZXmWq.js +0 -8
- package/dist/client/assets/index-Bsn2S5X2.css +0 -2
package/README.md
CHANGED
|
@@ -17,8 +17,29 @@ It can:
|
|
|
17
17
|
- edit table descriptions, aliases, primary entities, tags, common query language, example questions, and column metadata
|
|
18
18
|
- write the describable layer back to `tables/*.md`
|
|
19
19
|
- request AI enrichment suggestions when `OPENAI_API_KEY` is configured
|
|
20
|
-
- build and query the
|
|
20
|
+
- build and query the configured RAG index (`memory`, file-backed, or `pgvector`)
|
|
21
21
|
- generate sample Postgres SQL for natural-language questions against the currently saved enrichment
|
|
22
|
+
- define and manage multi-tenancy policy (tenant roots, hierarchy, scoped/polymorphic/global tables) via the Tenancy view
|
|
23
|
+
- draft tenant policy with AI assistance
|
|
24
|
+
- test NL→SQL with tenant scope controls and SQL output modes (`sql-only` vs `sql-params`)
|
|
25
|
+
|
|
26
|
+
Schema browsing, enrichment, and SQL generation do not require a database
|
|
27
|
+
driver. The optional Playground execute path runs generated SQL against a live
|
|
28
|
+
database. Studio supports Postgres, MySQL, SQLite, and SQL Server. Each dialect
|
|
29
|
+
requires its own optional peer driver package — install only the one you need:
|
|
30
|
+
|
|
31
|
+
| Dialect | Package |
|
|
32
|
+
|---|---|
|
|
33
|
+
| Postgres | `pnpm add pg` |
|
|
34
|
+
| MySQL | `pnpm add mysql2` |
|
|
35
|
+
| SQLite | `pnpm add better-sqlite3` |
|
|
36
|
+
| SQL Server | `pnpm add mssql` |
|
|
37
|
+
|
|
38
|
+
The execute provider is resolved from `studio.execute.provider` in
|
|
39
|
+
`askdb.config.ts`, falling back to the active introspection provider, then
|
|
40
|
+
defaulting to Postgres for backward compatibility. The Playground displays the
|
|
41
|
+
configured provider, connection status, and driver readiness near the Execute
|
|
42
|
+
button. When running locally, Studio can install the missing driver for you.
|
|
22
43
|
|
|
23
44
|
Studio uses `@askdb/enrich` for the shared non-UI Schema v2 authoring logic:
|
|
24
45
|
workspace loading, editable drafts, markdown/frontmatter preservation, save
|
|
@@ -49,10 +70,13 @@ Environment variables:
|
|
|
49
70
|
| --- | --- |
|
|
50
71
|
| `OPENAI_API_KEY` | Enables AI suggestions and sample NL-to-SQL generation. |
|
|
51
72
|
| `OPENAI_BASE_URL` | Optional OpenAI-compatible base URL. |
|
|
52
|
-
| `ASKDB_STUDIO_MODEL` | Studio-specific model override. Falls back to `ASKDB_MODEL`, `OPENAI_MODEL`, then `gpt-4o-mini`. |
|
|
53
73
|
| `ASKDB_STUDIO_HOST` | Bind host. Defaults to `127.0.0.1`. |
|
|
54
74
|
| `ASKDB_STUDIO_PORT` | Bind port. Defaults to `5556`. |
|
|
55
75
|
| `ASKDB_MOCK_SQL` | Deterministic generated SQL for tests or offline demos. |
|
|
56
76
|
| `ASKDB_RAG_EMBEDDER` | Set to `mock`, `openai`, or `ai-sdk` for Studio RAG indexing. Defaults to the mock lexical embedder unless an AI key is configured. |
|
|
57
77
|
| `ASKDB_RAG_EMBEDDER_MODEL` | Embedding model override for Studio RAG. |
|
|
58
78
|
| `ASKDB_RAG_EMBEDDER_DIMENSIONS` | Optional embedding dimension override. |
|
|
79
|
+
|
|
80
|
+
Studio uses the active `rag.store` branch from `askdb.config.*`. For `pgvector`,
|
|
81
|
+
make sure the configured table/extension already exist and `ASKDB_PGVECTOR_URL`
|
|
82
|
+
resolves correctly.
|
package/bin/askdb-studio.js
CHANGED
package/dist/bin.d.ts
CHANGED
package/dist/bin.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AAKA,wBAAsB,YAAY,CAAC,IAAI,GAAE,SAAS,MAAM,EAA0B,GAAG,OAAO,CAAC,MAAM,CAAC,CAQnG"}
|
package/dist/bin.js
CHANGED
|
@@ -1,6 +1,18 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { bootstrapAskDbEnv } from "@askdb/config";
|
|
3
|
+
import { pathToFileURL } from "node:url";
|
|
3
4
|
import { runStudioCli } from "./cli.js";
|
|
4
|
-
|
|
5
|
-
|
|
5
|
+
export async function runStudioBin(argv = process.argv.slice(2)) {
|
|
6
|
+
try {
|
|
7
|
+
bootstrapAskDbEnv({ cwd: process.cwd() });
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
// No askdb.config.* yet — Studio starts in setup mode and the browser
|
|
11
|
+
// wizard walks the user through creating one. runStudioCli re-probes.
|
|
12
|
+
}
|
|
13
|
+
return runStudioCli(argv);
|
|
14
|
+
}
|
|
15
|
+
if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {
|
|
16
|
+
process.exit(await runStudioBin());
|
|
17
|
+
}
|
|
6
18
|
//# sourceMappingURL=bin.js.map
|
package/dist/bin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,iBAAiB,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAA0B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAChF,IAAI,CAAC;QACH,iBAAiB,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,sEAAsE;QACtE,sEAAsE;IACxE,CAAC;IACD,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/E,OAAO,CAAC,IAAI,CAAC,MAAM,YAAY,EAAE,CAAC,CAAC;AACrC,CAAC"}
|
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAoBA,wBAAsB,YAAY,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA+D3E"}
|
package/dist/cli.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { DEFAULT_INTROSPECT_OUTPUT_DIR, getAskDbRuntimeConfig } from "@askdb/config";
|
|
2
|
-
import { readFileSync } from "node:fs";
|
|
1
|
+
import { DEFAULT_INTROSPECT_OUTPUT_DIR, discoverAskDbConfigPath, getAskDbRuntimeConfig, } from "@askdb/config";
|
|
2
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
3
3
|
import { networkInterfaces } from "node:os";
|
|
4
|
+
import { resolve } from "node:path";
|
|
4
5
|
import { createStudioServer } from "./server.js";
|
|
5
6
|
export async function runStudioCli(argv) {
|
|
6
7
|
let opts;
|
|
@@ -20,18 +21,25 @@ export async function runStudioCli(argv) {
|
|
|
20
21
|
printHelp(process.stdout);
|
|
21
22
|
return 0;
|
|
22
23
|
}
|
|
24
|
+
const setupReason = resolveSetupReason(opts);
|
|
23
25
|
let server;
|
|
24
26
|
try {
|
|
25
27
|
server = createStudioServer({
|
|
26
28
|
schema: opts.schema,
|
|
27
29
|
host: opts.host,
|
|
28
30
|
port: opts.port,
|
|
31
|
+
setupReason,
|
|
29
32
|
});
|
|
30
33
|
}
|
|
31
34
|
catch (error) {
|
|
32
35
|
process.stderr.write(`askdb-studio: ${formatError(error)}\n`);
|
|
33
36
|
return 1;
|
|
34
37
|
}
|
|
38
|
+
if (setupReason) {
|
|
39
|
+
process.stdout.write(setupReason === "no-config"
|
|
40
|
+
? "No askdb.config.* found — Studio will open with the guided setup wizard.\n"
|
|
41
|
+
: "No schema artifact found — Studio will open with the guided setup wizard.\n");
|
|
42
|
+
}
|
|
35
43
|
await new Promise((resolve, reject) => {
|
|
36
44
|
server.once("error", reject);
|
|
37
45
|
server.listen(opts.port, opts.host, resolve);
|
|
@@ -54,15 +62,25 @@ export async function runStudioCli(argv) {
|
|
|
54
62
|
});
|
|
55
63
|
}
|
|
56
64
|
function parseOptions(argv) {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
const
|
|
65
|
+
// Without a config the runtime snapshot is uninitialized — fall back to
|
|
66
|
+
// package defaults so Studio can still start (in setup mode).
|
|
67
|
+
const rt = (() => {
|
|
68
|
+
try {
|
|
69
|
+
return getAskDbRuntimeConfig();
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
74
|
+
})();
|
|
75
|
+
const listen = rt?.structured.studio?.listen;
|
|
76
|
+
const portFromEnv = rt?.ai.aiEnv.ASKDB_STUDIO_PORT;
|
|
60
77
|
const parsedPort = listen?.port ??
|
|
61
78
|
(portFromEnv !== undefined && portFromEnv.trim() !== "" ? Number(portFromEnv) : NaN);
|
|
62
|
-
const introspectOut = rt
|
|
79
|
+
const introspectOut = rt?.flat["ASKDB_INTROSPECT_OUT"] ?? DEFAULT_INTROSPECT_OUTPUT_DIR;
|
|
63
80
|
const opts = {
|
|
64
81
|
schema: introspectOut,
|
|
65
|
-
|
|
82
|
+
schemaFromFlag: false,
|
|
83
|
+
host: listen?.host ?? rt?.ai.aiEnv.ASKDB_STUDIO_HOST ?? "127.0.0.1",
|
|
66
84
|
port: Number.isFinite(parsedPort) && parsedPort > 0 && parsedPort <= 65535 ? parsedPort : 5556,
|
|
67
85
|
};
|
|
68
86
|
for (let i = 0; i < argv.length; i += 1) {
|
|
@@ -71,6 +89,7 @@ function parseOptions(argv) {
|
|
|
71
89
|
case "--schema":
|
|
72
90
|
case "-s":
|
|
73
91
|
opts.schema = readValue(argv, ++i, arg);
|
|
92
|
+
opts.schemaFromFlag = true;
|
|
74
93
|
break;
|
|
75
94
|
case "--host":
|
|
76
95
|
opts.host = readValue(argv, ++i, arg);
|
|
@@ -98,6 +117,18 @@ function parseOptions(argv) {
|
|
|
98
117
|
}
|
|
99
118
|
return opts;
|
|
100
119
|
}
|
|
120
|
+
/**
|
|
121
|
+
* Decide whether to start in setup mode. An explicitly passed `--schema` that
|
|
122
|
+
* doesn't exist stays a hard error (the user pointed at a specific artifact);
|
|
123
|
+
* a missing config or a missing *default* artifact opens the wizard instead.
|
|
124
|
+
*/
|
|
125
|
+
function resolveSetupReason(opts) {
|
|
126
|
+
if (!discoverAskDbConfigPath(process.cwd()))
|
|
127
|
+
return "no-config";
|
|
128
|
+
if (!opts.schemaFromFlag && !existsSync(resolve(opts.schema)))
|
|
129
|
+
return "no-artifact";
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
101
132
|
function readValue(argv, index, flag) {
|
|
102
133
|
const value = argv[index];
|
|
103
134
|
if (!value || value.startsWith("--")) {
|
|
@@ -121,7 +152,7 @@ function printHelp(stream) {
|
|
|
121
152
|
" -h, --help Print this help",
|
|
122
153
|
"",
|
|
123
154
|
"AI enrichment and sample NL-to-SQL use OPENAI_API_KEY. Override the model",
|
|
124
|
-
"with
|
|
155
|
+
"with ASKDB_AI_MODEL, ASKDB_MODEL, or OPENAI_MODEL.",
|
|
125
156
|
"",
|
|
126
157
|
].join("\n"));
|
|
127
158
|
}
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|