aiex-cli 0.0.1-beta.26 → 0.0.1-beta.28
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 +13 -3
- package/dist/cli.mjs +691 -334
- package/dist/core/schema-sqlite/migrate-helper.mjs +1 -1
- package/dist/{doctor-lG3xWNvv.mjs → doctor-collector-D2q6iD_e.mjs} +233 -231
- package/dist/index.d.mts +14 -15
- package/dist/index.mjs +1 -1
- package/dist/web/assets/{AISettings-pnBUZsQ6.js → AISettings-DFi-nXIi.js} +9 -9
- package/dist/web/assets/DataBrowser-BWSX8O2h.js +5 -0
- package/dist/web/assets/ExtractionViewer-WMUdXeyU.js +1 -0
- package/dist/web/assets/JsonSchemaEditor-B57coz1O.js +929 -0
- package/dist/web/assets/api-client-By2rWtpv.js +1 -0
- package/dist/web/assets/button-Cdgr9Igy.js +927 -0
- package/dist/web/assets/{cssMode-BHaAN4pp.js → cssMode-BM5FOYIl.js} +1 -1
- package/dist/web/assets/dialog-dMXSeJQQ.js +108 -0
- package/dist/web/assets/{editor.main-BzaWETn1.js → editor.main-C2Q97Dkk.js} +2 -2
- package/dist/web/assets/{freemarker2-Dvg4gFZa.js → freemarker2-BqyJTCTn.js} +1 -1
- package/dist/web/assets/{handlebars-4itI_hGB.js → handlebars-DxRJTefg.js} +1 -1
- package/dist/web/assets/{html-CWSOAdTS.js → html-gyvgrapw.js} +1 -1
- package/dist/web/assets/{htmlMode-0upoBPJE.js → htmlMode-CNjCRwdY.js} +1 -1
- package/dist/web/assets/index-C9N8oWt4.css +2 -0
- package/dist/web/assets/{index-B0ePNkfC.js → index-CuOQk7nB.js} +38 -38
- package/dist/web/assets/{javascript-Ce8CZ78h.js → javascript-BK6ufvq6.js} +1 -1
- package/dist/web/assets/{jsonMode-BLSJZHAW.js → jsonMode-m2trGjkO.js} +1 -1
- package/dist/web/assets/{liquid-D5rz2UL9.js → liquid-BtyuYqQQ.js} +1 -1
- package/dist/web/assets/{mdx-z1JVBQDz.js → mdx-C8K4EvCQ.js} +1 -1
- package/dist/web/assets/{monaco.contribution-CFfFGfn5.js → monaco.contribution-BTr-G8hO.js} +2 -2
- package/dist/web/assets/{overlayeventbus-DTdph1rb.js → overlayeventbus-CRKW6UCj.js} +3 -3
- package/dist/web/assets/{python-BPJc-4Rv.js → python-8dyH1nS_.js} +1 -1
- package/dist/web/assets/{razor-BHU9dOiw.js → razor-DtWMI74k.js} +1 -1
- package/dist/web/assets/runtime-dom.esm-bundler-DmdkgxQM.js +1 -0
- package/dist/web/assets/{table-schema-Dqg6xhKC.js → table-schema-C90NJyfq.js} +1 -1
- package/dist/web/assets/{tsMode-Uy_NSojR.js → tsMode-Dv8YG-YK.js} +1 -1
- package/dist/web/assets/{typescript-BaLsBfTJ.js → typescript-DbClKYS3.js} +1 -1
- package/dist/web/assets/{xml-Dn0SxzSa.js → xml-Bb59gjP6.js} +1 -1
- package/dist/web/assets/{yaml-Bzmyj5Wb.js → yaml-DVMb_IfV.js} +1 -1
- package/dist/web/index.html +8 -7
- package/package.json +3 -1
- package/dist/web/assets/DataBrowser-X9E-XE0s.js +0 -5
- package/dist/web/assets/JsonSchemaEditor-LVbTMi5f.js +0 -929
- package/dist/web/assets/api-client-CjfczSUd.js +0 -1
- package/dist/web/assets/button-kTMweGMc.js +0 -927
- package/dist/web/assets/dialog-CWuu7WjI.js +0 -108
- package/dist/web/assets/index-CRcl3j1y.css +0 -2
- /package/dist/web/assets/{abap-B48h0VdJ.js → abap-DiwvWnMr.js} +0 -0
- /package/dist/web/assets/{apex-1DPyVnhQ.js → apex-CmtZjKlf.js} +0 -0
- /package/dist/web/assets/{azcli-BpwkVh9R.js → azcli-DL2My_i-.js} +0 -0
- /package/dist/web/assets/{bat-BwJAl50I.js → bat-B-nC98wG.js} +0 -0
- /package/dist/web/assets/{bicep-B6QlbnRF.js → bicep-Ju5MwOgh.js} +0 -0
- /package/dist/web/assets/{cameligo-CUPQxz1J.js → cameligo-8Eu1TyBr.js} +0 -0
- /package/dist/web/assets/{clojure-BlwtfO9v.js → clojure-u-RpMkH3.js} +0 -0
- /package/dist/web/assets/{coffee-BzDjX1gN.js → coffee-CdA7bbTe.js} +0 -0
- /package/dist/web/assets/{cpp-CM5j04eT.js → cpp-CzNFP8ks.js} +0 -0
- /package/dist/web/assets/{csharp-BqWJjCNe.js → csharp-j1LThmcE.js} +0 -0
- /package/dist/web/assets/{csp-C-n5jZKF.js → csp-CLRC61y6.js} +0 -0
- /package/dist/web/assets/{css-BRXHjK80.js → css-r6rC_7P2.js} +0 -0
- /package/dist/web/assets/{cypher-Ib4R9oAB.js → cypher-CW08XVUh.js} +0 -0
- /package/dist/web/assets/{dart-Bmn0CjCu.js → dart-Cs9aL5T_.js} +0 -0
- /package/dist/web/assets/{dockerfile-BJvHmfcK.js → dockerfile-BWM0M184.js} +0 -0
- /package/dist/web/assets/{ecl-C8Lr2n0s.js → ecl-MJJuer5P.js} +0 -0
- /package/dist/web/assets/{editor.api-DgeBt89R.js → editor.api-nsOUOZde.js} +0 -0
- /package/dist/web/assets/{elixir-GMkKEJvJ.js → elixir-D2AIuXqn.js} +0 -0
- /package/dist/web/assets/{flow9-BQbuvXMU.js → flow9-B2H24giC.js} +0 -0
- /package/dist/web/assets/{fsharp-CDI_AxQw.js → fsharp-CFNadkg7.js} +0 -0
- /package/dist/web/assets/{go-DmsC2k-Y.js → go-dSur1iB2.js} +0 -0
- /package/dist/web/assets/{graphql-C8hjT6Ki.js → graphql-qyhAo11d.js} +0 -0
- /package/dist/web/assets/{hcl-C15cAQOZ.js → hcl-DFzjMyzm.js} +0 -0
- /package/dist/web/assets/{ini-CKrAe0ag.js → ini-TdzA8TIl.js} +0 -0
- /package/dist/web/assets/{java-BVhjILyl.js → java-CSGA9pkE.js} +0 -0
- /package/dist/web/assets/{julia-BzPDHDOG.js → julia-9izz5OsY.js} +0 -0
- /package/dist/web/assets/{kotlin-DQMAn-b6.js → kotlin-DuPK7AtF.js} +0 -0
- /package/dist/web/assets/{less-428mfr1h.js → less-B8d93iCg.js} +0 -0
- /package/dist/web/assets/{lexon-B09dCO6A.js → lexon-DWtEIyu7.js} +0 -0
- /package/dist/web/assets/{lua-CVQ0BJif.js → lua-Ciq0OGgt.js} +0 -0
- /package/dist/web/assets/{m3-CiPQ1ljw.js → m3-Cki6JWj_.js} +0 -0
- /package/dist/web/assets/{markdown--G0dqL-7.js → markdown-Cu47xwU0.js} +0 -0
- /package/dist/web/assets/{mips-BaboCM3T.js → mips-BM8ui995.js} +0 -0
- /package/dist/web/assets/{msdax-DUaqkqre.js → msdax-DqLio0_c.js} +0 -0
- /package/dist/web/assets/{mysql-CUE6XF4r.js → mysql-v1wbjJOq.js} +0 -0
- /package/dist/web/assets/{objective-c-C4MUnzeT.js → objective-c-CQl3PGSB.js} +0 -0
- /package/dist/web/assets/{pascal-CWMUMx__.js → pascal-D4iW0ZtD.js} +0 -0
- /package/dist/web/assets/{pascaligo-DLCVutek.js → pascaligo-BdC9CZdj.js} +0 -0
- /package/dist/web/assets/{perl-JYoirQpx.js → perl-BL10m4XD.js} +0 -0
- /package/dist/web/assets/{pgsql-BqOy7sqx.js → pgsql-Be_oqVo3.js} +0 -0
- /package/dist/web/assets/{php-PZqsysO1.js → php-BtvXSFRI.js} +0 -0
- /package/dist/web/assets/{pla-BiwqVlg6.js → pla-B2vUy15C.js} +0 -0
- /package/dist/web/assets/{postiats-COxQtXCD.js → postiats-CbmTTfXr.js} +0 -0
- /package/dist/web/assets/{powerquery-DdXUmaWa.js → powerquery-DszLhJGx.js} +0 -0
- /package/dist/web/assets/{powershell-D05yu9sz.js → powershell-B0dYktF6.js} +0 -0
- /package/dist/web/assets/{preload-helper-DzyYoeor.js → preload-helper-DWTEM3RW.js} +0 -0
- /package/dist/web/assets/{protobuf-BDsm0ZB_.js → protobuf-CZvaj1VX.js} +0 -0
- /package/dist/web/assets/{pug-3CmTiGoi.js → pug-CPDx1B3S.js} +0 -0
- /package/dist/web/assets/{qsharp-CDUCQwQO.js → qsharp-CAxMZVjw.js} +0 -0
- /package/dist/web/assets/{r-Decg_RIU.js → r-8DbbFX2l.js} +0 -0
- /package/dist/web/assets/{redis-Cl3EBA4R.js → redis-DRWj9MtJ.js} +0 -0
- /package/dist/web/assets/{redshift-5ZsNLhOp.js → redshift-C6cElE_5.js} +0 -0
- /package/dist/web/assets/{restructuredtext-BulNNF_e.js → restructuredtext-W9pS9n3m.js} +0 -0
- /package/dist/web/assets/{ruby-D3Axi_9w.js → ruby-BKnzWnk-.js} +0 -0
- /package/dist/web/assets/{rust-Csys1Tos.js → rust-YPCclWwe.js} +0 -0
- /package/dist/web/assets/{sb-C_iBPphi.js → sb-BgM4DTFb.js} +0 -0
- /package/dist/web/assets/{scala-Cg4p-EZ2.js → scala-fz1OPLMl.js} +0 -0
- /package/dist/web/assets/{scheme-BlVnEL_j.js → scheme-8Uz1RIbu.js} +0 -0
- /package/dist/web/assets/{scss-CmLW8ojr.js → scss-Djo3IYXr.js} +0 -0
- /package/dist/web/assets/{shell-B1DV_gpl.js → shell-CINF5Tx_.js} +0 -0
- /package/dist/web/assets/{solidity-glFpNhe3.js → solidity-GgiNEuUm.js} +0 -0
- /package/dist/web/assets/{sophia-D9j4cFkA.js → sophia-Culj97P9.js} +0 -0
- /package/dist/web/assets/{sparql-DV5Ux9cO.js → sparql-C2ZlpxOY.js} +0 -0
- /package/dist/web/assets/{sql-K8tNKFcf.js → sql-BEf5Pg7Y.js} +0 -0
- /package/dist/web/assets/{st-BhIdE2hj.js → st-CT6UUoeH.js} +0 -0
- /package/dist/web/assets/{swift-B0pzSmmx.js → swift-B5g0xTG3.js} +0 -0
- /package/dist/web/assets/{systemverilog-CeBgixbN.js → systemverilog-CEgQz9DR.js} +0 -0
- /package/dist/web/assets/{tcl-B0Ji3IbZ.js → tcl-D0qL2L0I.js} +0 -0
- /package/dist/web/assets/{twig-KUgPCP41.js → twig-BFUAVf1E.js} +0 -0
- /package/dist/web/assets/{typespec-ryrhjid6.js → typespec-CjVVcNKm.js} +0 -0
- /package/dist/web/assets/{vb-Z68-YtMY.js → vb-CZJr-DQz.js} +0 -0
- /package/dist/web/assets/{wgsl-bH-W-d_T.js → wgsl-ivoXUo2e.js} +0 -0
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { createRequire } from "node:module";
|
|
2
|
+
import fs from "node:fs/promises";
|
|
2
3
|
import path from "node:path";
|
|
3
4
|
import process from "node:process";
|
|
4
5
|
import { fileURLToPath } from "node:url";
|
|
5
|
-
import fs from "node:fs/promises";
|
|
6
6
|
import Database from "better-sqlite3";
|
|
7
7
|
import * as esbuild from "esbuild";
|
|
8
8
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import path from "node:path";
|
|
2
|
-
import process from "node:process";
|
|
3
|
-
import { z } from "zod";
|
|
4
1
|
import fs from "node:fs/promises";
|
|
5
2
|
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import process from "node:process";
|
|
6
5
|
import Conf from "conf";
|
|
6
|
+
import { z } from "zod";
|
|
7
7
|
|
|
8
8
|
//#region src/core/doctor.ts
|
|
9
9
|
function buildDoctorDiagnostics(input) {
|
|
@@ -61,6 +61,234 @@ function doctorDiagnosticsTableRows(d) {
|
|
|
61
61
|
return rows;
|
|
62
62
|
}
|
|
63
63
|
|
|
64
|
+
//#endregion
|
|
65
|
+
//#region package.json
|
|
66
|
+
var name = "aiex-cli";
|
|
67
|
+
var version = "0.0.1-beta.28";
|
|
68
|
+
var description = "JSON Schema → SQLite with AI-powered data extraction";
|
|
69
|
+
var package_default = {
|
|
70
|
+
name,
|
|
71
|
+
type: "module",
|
|
72
|
+
version,
|
|
73
|
+
description,
|
|
74
|
+
author: "OSpoon <zxin088@gmail.com>",
|
|
75
|
+
license: "MIT",
|
|
76
|
+
homepage: "https://github.com/OSpoon/aiex-cli#readme",
|
|
77
|
+
repository: {
|
|
78
|
+
"type": "git",
|
|
79
|
+
"url": "git+https://github.com/OSpoon/aiex-cli.git"
|
|
80
|
+
},
|
|
81
|
+
bugs: "https://github.com/OSpoon/aiex-cli/issues",
|
|
82
|
+
keywords: [
|
|
83
|
+
"json-schema",
|
|
84
|
+
"sqlite",
|
|
85
|
+
"drizzle",
|
|
86
|
+
"orm",
|
|
87
|
+
"ai-extraction",
|
|
88
|
+
"cli",
|
|
89
|
+
"database-migration",
|
|
90
|
+
"schema-editor",
|
|
91
|
+
"code-generation",
|
|
92
|
+
"structured-output"
|
|
93
|
+
],
|
|
94
|
+
sideEffects: false,
|
|
95
|
+
exports: {
|
|
96
|
+
".": "./dist/index.mjs",
|
|
97
|
+
"./cli": "./dist/cli.mjs",
|
|
98
|
+
"./core/schema-sqlite/migrate-helper": "./dist/core/schema-sqlite/migrate-helper.mjs",
|
|
99
|
+
"./package.json": "./package.json"
|
|
100
|
+
},
|
|
101
|
+
main: "./dist/index.mjs",
|
|
102
|
+
module: "./dist/index.mjs",
|
|
103
|
+
types: "./dist/index.d.mts",
|
|
104
|
+
bin: { "aiex": "./bin/cli.mjs" },
|
|
105
|
+
files: [
|
|
106
|
+
"bin",
|
|
107
|
+
"dist",
|
|
108
|
+
"src/core/schema-sqlite/migrate-helper.ts",
|
|
109
|
+
"src/core/schema-sqlite/migration-name.ts"
|
|
110
|
+
],
|
|
111
|
+
scripts: {
|
|
112
|
+
"build": "tsdown && pnpm --filter aiex-web build",
|
|
113
|
+
"dev": "tsdown --watch",
|
|
114
|
+
"start": "tsx src/index.ts",
|
|
115
|
+
"test": "vitest",
|
|
116
|
+
"coverage": "vitest --coverage",
|
|
117
|
+
"typecheck": "tsc",
|
|
118
|
+
"lint": "eslint .",
|
|
119
|
+
"prepack": "cp ../../README.md .",
|
|
120
|
+
"postpack": "rm -f README.md",
|
|
121
|
+
"prepublishOnly": "pnpm run build"
|
|
122
|
+
},
|
|
123
|
+
dependencies: {
|
|
124
|
+
"@ai-sdk/openai-compatible": "catalog:",
|
|
125
|
+
"@clack/prompts": "catalog:",
|
|
126
|
+
"@hono/node-server": "catalog:",
|
|
127
|
+
"@langfuse/otel": "catalog:",
|
|
128
|
+
"@opentelemetry/sdk-trace-node": "catalog:",
|
|
129
|
+
"ai": "catalog:",
|
|
130
|
+
"better-sqlite3": "catalog:",
|
|
131
|
+
"citty": "catalog:",
|
|
132
|
+
"cli-table3": "catalog:",
|
|
133
|
+
"conf": "catalog:",
|
|
134
|
+
"consola": "catalog:",
|
|
135
|
+
"date-fns": "catalog:",
|
|
136
|
+
"drizzle-kit": "catalog:cli",
|
|
137
|
+
"drizzle-orm": "catalog:",
|
|
138
|
+
"es-toolkit": "catalog:",
|
|
139
|
+
"esbuild": "catalog:",
|
|
140
|
+
"hono": "catalog:",
|
|
141
|
+
"picocolors": "catalog:",
|
|
142
|
+
"picomatch": "catalog:",
|
|
143
|
+
"tsx": "catalog:cli",
|
|
144
|
+
"unpdf": "catalog:",
|
|
145
|
+
"update-notifier": "catalog:",
|
|
146
|
+
"zod": "catalog:"
|
|
147
|
+
},
|
|
148
|
+
devDependencies: {
|
|
149
|
+
"@antfu/eslint-config": "catalog:cli",
|
|
150
|
+
"@antfu/ni": "catalog:cli",
|
|
151
|
+
"@types/better-sqlite3": "catalog:types",
|
|
152
|
+
"@types/node": "catalog:types",
|
|
153
|
+
"@types/picomatch": "catalog:",
|
|
154
|
+
"@types/update-notifier": "catalog:",
|
|
155
|
+
"@vitest/coverage-v8": "catalog:testing",
|
|
156
|
+
"eslint": "catalog:cli",
|
|
157
|
+
"publint": "catalog:cli",
|
|
158
|
+
"tsdown": "catalog:cli",
|
|
159
|
+
"tsnapi": "catalog:testing",
|
|
160
|
+
"typescript": "catalog:cli",
|
|
161
|
+
"vitest": "catalog:testing"
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
|
|
165
|
+
//#endregion
|
|
166
|
+
//#region src/config.ts
|
|
167
|
+
function createConfig() {
|
|
168
|
+
return new Conf({
|
|
169
|
+
cwd: process.env.CLI_CONFIG_DIR,
|
|
170
|
+
projectName: process.env.CLI_CONFIG_PROJECT_NAME || name
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
function seedConfig(config = createConfig()) {
|
|
174
|
+
if (!config.has("name")) config.set("name", name);
|
|
175
|
+
if (!config.has("version")) config.set("version", version);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
//#endregion
|
|
179
|
+
//#region src/core/ai-extraction/schemas.ts
|
|
180
|
+
const ModelCapabilitiesSchema = z.object({
|
|
181
|
+
vision: z.boolean(),
|
|
182
|
+
structuredOutput: z.boolean(),
|
|
183
|
+
maxTokens: z.number().int().positive().optional(),
|
|
184
|
+
maxOutputTokens: z.number().int().positive().optional()
|
|
185
|
+
});
|
|
186
|
+
const AIModelConfigSchema = z.object({
|
|
187
|
+
name: z.string().min(1),
|
|
188
|
+
capabilities: ModelCapabilitiesSchema
|
|
189
|
+
});
|
|
190
|
+
const AIProviderConfigSchema = z.object({
|
|
191
|
+
baseURL: z.string().min(1),
|
|
192
|
+
apiKey: z.string(),
|
|
193
|
+
models: z.array(AIModelConfigSchema).min(1),
|
|
194
|
+
timeout: z.number().int().positive().default(300).optional()
|
|
195
|
+
});
|
|
196
|
+
const PromptConfigSchema = z.object({
|
|
197
|
+
systemTemplate: z.string().min(1),
|
|
198
|
+
userTemplate: z.string().min(1)
|
|
199
|
+
});
|
|
200
|
+
const ExtractionConfigSchema = z.object({ outputDir: z.string().min(1) });
|
|
201
|
+
const LangfuseConfigSchema = z.object({
|
|
202
|
+
publicKey: z.string(),
|
|
203
|
+
secretKey: z.string(),
|
|
204
|
+
host: z.string().optional()
|
|
205
|
+
});
|
|
206
|
+
const AIConfigSchema = z.object({
|
|
207
|
+
provider: AIProviderConfigSchema,
|
|
208
|
+
prompt: PromptConfigSchema,
|
|
209
|
+
extraction: ExtractionConfigSchema,
|
|
210
|
+
langfuse: LangfuseConfigSchema.optional()
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
//#endregion
|
|
214
|
+
//#region src/core/ai-extraction/types.ts
|
|
215
|
+
const PLACEHOLDER_SCHEMA = "{schema}";
|
|
216
|
+
const PLACEHOLDER_TEXT = "{text}";
|
|
217
|
+
const DEFAULT_MODELS = [{
|
|
218
|
+
name: "qwen-plus",
|
|
219
|
+
capabilities: {
|
|
220
|
+
vision: false,
|
|
221
|
+
structuredOutput: true
|
|
222
|
+
}
|
|
223
|
+
}, {
|
|
224
|
+
name: "qwen-vl-plus",
|
|
225
|
+
capabilities: {
|
|
226
|
+
vision: true,
|
|
227
|
+
structuredOutput: true
|
|
228
|
+
}
|
|
229
|
+
}];
|
|
230
|
+
const DEFAULT_PROVIDER_CONFIG = {
|
|
231
|
+
baseURL: "https://dashscope.aliyuncs.com/compatible-mode/v1",
|
|
232
|
+
apiKey: "",
|
|
233
|
+
models: [...DEFAULT_MODELS],
|
|
234
|
+
timeout: 300
|
|
235
|
+
};
|
|
236
|
+
const DEFAULT_PROMPT_CONFIG = {
|
|
237
|
+
systemTemplate: `You are a professional data extraction assistant. Your task is to extract structured data from text and return a JSON object based on the data structure definition provided below.
|
|
238
|
+
|
|
239
|
+
{schema}
|
|
240
|
+
|
|
241
|
+
Extraction requirements:
|
|
242
|
+
1. Extract strictly according to the field names and types defined in the structure
|
|
243
|
+
2. If the text lacks information for a field, set that field to null
|
|
244
|
+
3. Do not add fields that do not exist in the structure definition
|
|
245
|
+
4. Maintain data accuracy and completeness`,
|
|
246
|
+
userTemplate: `Please extract data from the following text:
|
|
247
|
+
{text}`
|
|
248
|
+
};
|
|
249
|
+
const DEFAULT_EXTRACTION_CONFIG = { outputDir: ".aiex/extracted" };
|
|
250
|
+
const DEFAULT_AI_CONFIG = {
|
|
251
|
+
provider: DEFAULT_PROVIDER_CONFIG,
|
|
252
|
+
prompt: DEFAULT_PROMPT_CONFIG,
|
|
253
|
+
extraction: DEFAULT_EXTRACTION_CONFIG
|
|
254
|
+
};
|
|
255
|
+
|
|
256
|
+
//#endregion
|
|
257
|
+
//#region src/core/ai-extraction/config.ts
|
|
258
|
+
const CONFIG_FILE_NAME = "ai-config.json";
|
|
259
|
+
const GITIGNORE_FILE = ".gitignore";
|
|
260
|
+
async function readAIConfig(aiexDir) {
|
|
261
|
+
const configPath = path.join(aiexDir, CONFIG_FILE_NAME);
|
|
262
|
+
try {
|
|
263
|
+
const content = await fs.readFile(configPath, "utf-8");
|
|
264
|
+
const parsed = JSON.parse(content);
|
|
265
|
+
return AIConfigSchema.parse(parsed);
|
|
266
|
+
} catch {
|
|
267
|
+
return null;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
async function writeAIConfig(aiexDir, config) {
|
|
271
|
+
const configPath = path.join(aiexDir, CONFIG_FILE_NAME);
|
|
272
|
+
await fs.mkdir(aiexDir, { recursive: true });
|
|
273
|
+
await fs.writeFile(configPath, `${JSON.stringify(config, null, 2)}\n`);
|
|
274
|
+
await addToGitignore(aiexDir, CONFIG_FILE_NAME);
|
|
275
|
+
}
|
|
276
|
+
function getDefaultAIConfig() {
|
|
277
|
+
return { ...DEFAULT_AI_CONFIG };
|
|
278
|
+
}
|
|
279
|
+
async function addToGitignore(aiexDir, fileName) {
|
|
280
|
+
const projectRoot = path.dirname(aiexDir);
|
|
281
|
+
const gitignorePath = path.join(projectRoot, GITIGNORE_FILE);
|
|
282
|
+
try {
|
|
283
|
+
const content = await fs.readFile(gitignorePath, "utf-8");
|
|
284
|
+
if (content.split("\n").some((line) => line.trim() === fileName || line.includes(".aiex/"))) return;
|
|
285
|
+
const newContent = content.endsWith("\n") ? `${content}${fileName}\n` : `${content}\n${fileName}\n`;
|
|
286
|
+
await fs.writeFile(gitignorePath, newContent);
|
|
287
|
+
} catch {
|
|
288
|
+
await fs.writeFile(gitignorePath, `${fileName}\n`);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
|
|
64
292
|
//#endregion
|
|
65
293
|
//#region src/core/schema-sqlite/generator.ts
|
|
66
294
|
function generateColumnDefinition(column) {
|
|
@@ -410,233 +638,7 @@ function generateDrizzleConfig() {
|
|
|
410
638
|
}
|
|
411
639
|
|
|
412
640
|
//#endregion
|
|
413
|
-
//#region
|
|
414
|
-
var name = "aiex-cli";
|
|
415
|
-
var version = "0.0.1-beta.26";
|
|
416
|
-
var description = "JSON Schema → SQLite with AI-powered data extraction";
|
|
417
|
-
var package_default = {
|
|
418
|
-
name,
|
|
419
|
-
type: "module",
|
|
420
|
-
version,
|
|
421
|
-
description,
|
|
422
|
-
author: "OSpoon <zxin088@gmail.com>",
|
|
423
|
-
license: "MIT",
|
|
424
|
-
homepage: "https://github.com/OSpoon/aiex-cli#readme",
|
|
425
|
-
repository: {
|
|
426
|
-
"type": "git",
|
|
427
|
-
"url": "git+https://github.com/OSpoon/aiex-cli.git"
|
|
428
|
-
},
|
|
429
|
-
bugs: "https://github.com/OSpoon/aiex-cli/issues",
|
|
430
|
-
keywords: [
|
|
431
|
-
"json-schema",
|
|
432
|
-
"sqlite",
|
|
433
|
-
"drizzle",
|
|
434
|
-
"orm",
|
|
435
|
-
"ai-extraction",
|
|
436
|
-
"cli",
|
|
437
|
-
"database-migration",
|
|
438
|
-
"schema-editor",
|
|
439
|
-
"code-generation",
|
|
440
|
-
"structured-output"
|
|
441
|
-
],
|
|
442
|
-
sideEffects: false,
|
|
443
|
-
exports: {
|
|
444
|
-
".": "./dist/index.mjs",
|
|
445
|
-
"./cli": "./dist/cli.mjs",
|
|
446
|
-
"./core/schema-sqlite/migrate-helper": "./dist/core/schema-sqlite/migrate-helper.mjs",
|
|
447
|
-
"./package.json": "./package.json"
|
|
448
|
-
},
|
|
449
|
-
main: "./dist/index.mjs",
|
|
450
|
-
module: "./dist/index.mjs",
|
|
451
|
-
types: "./dist/index.d.mts",
|
|
452
|
-
bin: { "aiex": "./bin/cli.mjs" },
|
|
453
|
-
files: [
|
|
454
|
-
"bin",
|
|
455
|
-
"dist",
|
|
456
|
-
"src/core/schema-sqlite/migrate-helper.ts",
|
|
457
|
-
"src/core/schema-sqlite/migration-name.ts"
|
|
458
|
-
],
|
|
459
|
-
scripts: {
|
|
460
|
-
"build": "tsdown && pnpm --filter aiex-web build",
|
|
461
|
-
"dev": "tsdown --watch",
|
|
462
|
-
"start": "tsx src/index.ts",
|
|
463
|
-
"test": "vitest",
|
|
464
|
-
"coverage": "vitest --coverage",
|
|
465
|
-
"typecheck": "tsc",
|
|
466
|
-
"lint": "eslint .",
|
|
467
|
-
"prepack": "cp ../../README.md .",
|
|
468
|
-
"postpack": "rm -f README.md",
|
|
469
|
-
"prepublishOnly": "pnpm run build"
|
|
470
|
-
},
|
|
471
|
-
dependencies: {
|
|
472
|
-
"@ai-sdk/openai-compatible": "catalog:",
|
|
473
|
-
"@clack/prompts": "catalog:",
|
|
474
|
-
"@hono/node-server": "catalog:",
|
|
475
|
-
"@langfuse/otel": "catalog:",
|
|
476
|
-
"@opentelemetry/sdk-trace-node": "catalog:",
|
|
477
|
-
"ai": "catalog:",
|
|
478
|
-
"better-sqlite3": "catalog:",
|
|
479
|
-
"citty": "catalog:",
|
|
480
|
-
"cli-table3": "catalog:",
|
|
481
|
-
"conf": "catalog:",
|
|
482
|
-
"consola": "catalog:",
|
|
483
|
-
"date-fns": "catalog:",
|
|
484
|
-
"drizzle-kit": "catalog:cli",
|
|
485
|
-
"drizzle-orm": "catalog:",
|
|
486
|
-
"es-toolkit": "catalog:",
|
|
487
|
-
"esbuild": "catalog:",
|
|
488
|
-
"hono": "catalog:",
|
|
489
|
-
"picocolors": "catalog:",
|
|
490
|
-
"tsx": "catalog:cli",
|
|
491
|
-
"unpdf": "catalog:",
|
|
492
|
-
"update-notifier": "catalog:",
|
|
493
|
-
"zod": "catalog:"
|
|
494
|
-
},
|
|
495
|
-
devDependencies: {
|
|
496
|
-
"@antfu/eslint-config": "catalog:cli",
|
|
497
|
-
"@antfu/ni": "catalog:cli",
|
|
498
|
-
"@types/better-sqlite3": "catalog:types",
|
|
499
|
-
"@types/node": "catalog:types",
|
|
500
|
-
"@types/update-notifier": "catalog:",
|
|
501
|
-
"@vitest/coverage-v8": "catalog:testing",
|
|
502
|
-
"eslint": "catalog:cli",
|
|
503
|
-
"publint": "catalog:cli",
|
|
504
|
-
"tsdown": "catalog:cli",
|
|
505
|
-
"tsnapi": "catalog:testing",
|
|
506
|
-
"typescript": "catalog:cli",
|
|
507
|
-
"vitest": "catalog:testing"
|
|
508
|
-
}
|
|
509
|
-
};
|
|
510
|
-
|
|
511
|
-
//#endregion
|
|
512
|
-
//#region src/config.ts
|
|
513
|
-
function createConfig() {
|
|
514
|
-
return new Conf({
|
|
515
|
-
cwd: process.env.CLI_CONFIG_DIR,
|
|
516
|
-
projectName: process.env.CLI_CONFIG_PROJECT_NAME || name
|
|
517
|
-
});
|
|
518
|
-
}
|
|
519
|
-
function seedConfig(config = createConfig()) {
|
|
520
|
-
if (!config.has("name")) config.set("name", name);
|
|
521
|
-
if (!config.has("version")) config.set("version", version);
|
|
522
|
-
}
|
|
523
|
-
|
|
524
|
-
//#endregion
|
|
525
|
-
//#region src/core/ai-extraction/schemas.ts
|
|
526
|
-
const ModelCapabilitiesSchema = z.object({
|
|
527
|
-
vision: z.boolean(),
|
|
528
|
-
structuredOutput: z.boolean(),
|
|
529
|
-
maxTokens: z.number().int().positive().optional(),
|
|
530
|
-
maxOutputTokens: z.number().int().positive().optional()
|
|
531
|
-
});
|
|
532
|
-
const AIModelConfigSchema = z.object({
|
|
533
|
-
name: z.string().min(1),
|
|
534
|
-
capabilities: ModelCapabilitiesSchema
|
|
535
|
-
});
|
|
536
|
-
const AIProviderConfigSchema = z.object({
|
|
537
|
-
baseURL: z.string().min(1),
|
|
538
|
-
apiKey: z.string(),
|
|
539
|
-
models: z.array(AIModelConfigSchema).min(1),
|
|
540
|
-
timeout: z.number().int().positive().default(300).optional()
|
|
541
|
-
});
|
|
542
|
-
const PromptConfigSchema = z.object({
|
|
543
|
-
systemTemplate: z.string().min(1),
|
|
544
|
-
userTemplate: z.string().min(1)
|
|
545
|
-
});
|
|
546
|
-
const ExtractionConfigSchema = z.object({ outputDir: z.string().min(1) });
|
|
547
|
-
const LangfuseConfigSchema = z.object({
|
|
548
|
-
publicKey: z.string(),
|
|
549
|
-
secretKey: z.string(),
|
|
550
|
-
host: z.string().optional()
|
|
551
|
-
});
|
|
552
|
-
const AIConfigSchema = z.object({
|
|
553
|
-
provider: AIProviderConfigSchema,
|
|
554
|
-
prompt: PromptConfigSchema,
|
|
555
|
-
extraction: ExtractionConfigSchema,
|
|
556
|
-
langfuse: LangfuseConfigSchema.optional()
|
|
557
|
-
});
|
|
558
|
-
|
|
559
|
-
//#endregion
|
|
560
|
-
//#region src/core/ai-extraction/types.ts
|
|
561
|
-
const PLACEHOLDER_SCHEMA = "{schema}";
|
|
562
|
-
const PLACEHOLDER_TEXT = "{text}";
|
|
563
|
-
const DEFAULT_MODELS = [{
|
|
564
|
-
name: "qwen-plus",
|
|
565
|
-
capabilities: {
|
|
566
|
-
vision: false,
|
|
567
|
-
structuredOutput: true
|
|
568
|
-
}
|
|
569
|
-
}, {
|
|
570
|
-
name: "qwen-vl-plus",
|
|
571
|
-
capabilities: {
|
|
572
|
-
vision: true,
|
|
573
|
-
structuredOutput: true
|
|
574
|
-
}
|
|
575
|
-
}];
|
|
576
|
-
const DEFAULT_PROVIDER_CONFIG = {
|
|
577
|
-
baseURL: "https://dashscope.aliyuncs.com/compatible-mode/v1",
|
|
578
|
-
apiKey: "",
|
|
579
|
-
models: [...DEFAULT_MODELS],
|
|
580
|
-
timeout: 300
|
|
581
|
-
};
|
|
582
|
-
const DEFAULT_PROMPT_CONFIG = {
|
|
583
|
-
systemTemplate: `You are a professional data extraction assistant. Your task is to extract structured data from text and return a JSON object based on the data structure definition provided below.
|
|
584
|
-
|
|
585
|
-
{schema}
|
|
586
|
-
|
|
587
|
-
Extraction requirements:
|
|
588
|
-
1. Extract strictly according to the field names and types defined in the structure
|
|
589
|
-
2. If the text lacks information for a field, set that field to null
|
|
590
|
-
3. Do not add fields that do not exist in the structure definition
|
|
591
|
-
4. Maintain data accuracy and completeness`,
|
|
592
|
-
userTemplate: `Please extract data from the following text:
|
|
593
|
-
{text}`
|
|
594
|
-
};
|
|
595
|
-
const DEFAULT_EXTRACTION_CONFIG = { outputDir: ".aiex/extracted" };
|
|
596
|
-
const DEFAULT_AI_CONFIG = {
|
|
597
|
-
provider: DEFAULT_PROVIDER_CONFIG,
|
|
598
|
-
prompt: DEFAULT_PROMPT_CONFIG,
|
|
599
|
-
extraction: DEFAULT_EXTRACTION_CONFIG
|
|
600
|
-
};
|
|
601
|
-
|
|
602
|
-
//#endregion
|
|
603
|
-
//#region src/core/ai-extraction/config.ts
|
|
604
|
-
const CONFIG_FILE_NAME = "ai-config.json";
|
|
605
|
-
const GITIGNORE_FILE = ".gitignore";
|
|
606
|
-
async function readAIConfig(aiexDir) {
|
|
607
|
-
const configPath = path.join(aiexDir, CONFIG_FILE_NAME);
|
|
608
|
-
try {
|
|
609
|
-
const content = await fs.readFile(configPath, "utf-8");
|
|
610
|
-
const parsed = JSON.parse(content);
|
|
611
|
-
return AIConfigSchema.parse(parsed);
|
|
612
|
-
} catch {
|
|
613
|
-
return null;
|
|
614
|
-
}
|
|
615
|
-
}
|
|
616
|
-
async function writeAIConfig(aiexDir, config) {
|
|
617
|
-
const configPath = path.join(aiexDir, CONFIG_FILE_NAME);
|
|
618
|
-
await fs.mkdir(aiexDir, { recursive: true });
|
|
619
|
-
await fs.writeFile(configPath, `${JSON.stringify(config, null, 2)}\n`);
|
|
620
|
-
await addToGitignore(aiexDir, CONFIG_FILE_NAME);
|
|
621
|
-
}
|
|
622
|
-
function getDefaultAIConfig() {
|
|
623
|
-
return { ...DEFAULT_AI_CONFIG };
|
|
624
|
-
}
|
|
625
|
-
async function addToGitignore(aiexDir, fileName) {
|
|
626
|
-
const projectRoot = path.dirname(aiexDir);
|
|
627
|
-
const gitignorePath = path.join(projectRoot, GITIGNORE_FILE);
|
|
628
|
-
try {
|
|
629
|
-
const content = await fs.readFile(gitignorePath, "utf-8");
|
|
630
|
-
if (content.split("\n").some((line) => line.trim() === fileName || line.includes(".aiex/"))) return;
|
|
631
|
-
const newContent = content.endsWith("\n") ? `${content}${fileName}\n` : `${content}\n${fileName}\n`;
|
|
632
|
-
await fs.writeFile(gitignorePath, newContent);
|
|
633
|
-
} catch {
|
|
634
|
-
await fs.writeFile(gitignorePath, `${fileName}\n`);
|
|
635
|
-
}
|
|
636
|
-
}
|
|
637
|
-
|
|
638
|
-
//#endregion
|
|
639
|
-
//#region src/doctor.ts
|
|
641
|
+
//#region src/core/doctor-collector.ts
|
|
640
642
|
const V1_SUFFIX_RE = /\/v1\/?$/;
|
|
641
643
|
async function checkConnection(baseURL) {
|
|
642
644
|
try {
|
|
@@ -722,4 +724,4 @@ async function collectDoctorDiagnostics(options = {}) {
|
|
|
722
724
|
}
|
|
723
725
|
|
|
724
726
|
//#endregion
|
|
725
|
-
export { formatDoctorDiagnosticsJson as C, doctorDiagnosticsTableRows as S,
|
|
727
|
+
export { formatDoctorDiagnosticsJson as C, doctorDiagnosticsTableRows as S, description as _, parseJsonSchema as a, version as b, getDefaultAIConfig as c, DEFAULT_PROMPT_CONFIG as d, PLACEHOLDER_SCHEMA as f, seedConfig as g, createConfig as h, JsonSchemaDefinitionSchema as i, readAIConfig as l, AIConfigSchema as m, createMigrationConfig as n, toSnakeCase as o, PLACEHOLDER_TEXT as p, generateDrizzleConfig as r, generateDrizzleSchema as s, collectDoctorDiagnostics as t, writeAIConfig as u, name as v, buildDoctorDiagnostics as x, package_default as y };
|
package/dist/index.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { ZodError, z } from "zod";
|
|
2
1
|
import Conf from "conf";
|
|
2
|
+
import { ZodError, z } from "zod";
|
|
3
3
|
|
|
4
4
|
//#region src/core/doctor.d.ts
|
|
5
5
|
interface DoctorDiagnostics {
|
|
@@ -60,6 +60,19 @@ declare function buildDoctorDiagnostics(input: {
|
|
|
60
60
|
declare function formatDoctorDiagnosticsJson(d: DoctorDiagnostics): string;
|
|
61
61
|
declare function doctorDiagnosticsTableRows(d: DoctorDiagnostics): [string, string][];
|
|
62
62
|
//#endregion
|
|
63
|
+
//#region src/config.d.ts
|
|
64
|
+
interface AppConfig {
|
|
65
|
+
name?: string;
|
|
66
|
+
version?: string;
|
|
67
|
+
}
|
|
68
|
+
declare function createConfig(): Conf<AppConfig>;
|
|
69
|
+
//#endregion
|
|
70
|
+
//#region src/core/doctor-collector.d.ts
|
|
71
|
+
interface CollectDoctorDiagnosticsOptions {
|
|
72
|
+
config?: ReturnType<typeof createConfig>;
|
|
73
|
+
}
|
|
74
|
+
declare function collectDoctorDiagnostics(options?: CollectDoctorDiagnosticsOptions): Promise<DoctorDiagnostics>;
|
|
75
|
+
//#endregion
|
|
63
76
|
//#region src/core/schema-sqlite/types.d.ts
|
|
64
77
|
interface ParsedColumn {
|
|
65
78
|
name: string;
|
|
@@ -114,7 +127,6 @@ declare function createMigrationConfig(cwd: string): MigrationConfig;
|
|
|
114
127
|
declare function generateDrizzleConfig(): string;
|
|
115
128
|
//#endregion
|
|
116
129
|
//#region src/core/schema-sqlite/schemas.d.ts
|
|
117
|
-
|
|
118
130
|
declare const JsonSchemaDefinitionSchema: z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodObject<{
|
|
119
131
|
$schema: z.ZodOptional<z.ZodString>;
|
|
120
132
|
title: z.ZodString;
|
|
@@ -266,17 +278,4 @@ type JsonSchemaDefinition = z.infer<typeof JsonSchemaDefinitionSchema>;
|
|
|
266
278
|
//#region src/core/schema-sqlite/parser.d.ts
|
|
267
279
|
declare function parseJsonSchema(schema: JsonSchemaDefinition): ParseResult;
|
|
268
280
|
//#endregion
|
|
269
|
-
//#region src/config.d.ts
|
|
270
|
-
interface AppConfig {
|
|
271
|
-
name?: string;
|
|
272
|
-
version?: string;
|
|
273
|
-
}
|
|
274
|
-
declare function createConfig(): Conf<AppConfig>;
|
|
275
|
-
//#endregion
|
|
276
|
-
//#region src/doctor.d.ts
|
|
277
|
-
interface CollectDoctorDiagnosticsOptions {
|
|
278
|
-
config?: ReturnType<typeof createConfig>;
|
|
279
|
-
}
|
|
280
|
-
declare function collectDoctorDiagnostics(options?: CollectDoctorDiagnosticsOptions): Promise<DoctorDiagnostics>;
|
|
281
|
-
//#endregion
|
|
282
281
|
export { type DoctorDiagnostics, type JsonSchemaDefinition, JsonSchemaDefinitionSchema, type JsonSchemaProperty, type MigrationConfig, type ParseResult, type ParsedColumn, type ParsedRelation, type ParsedTable, buildDoctorDiagnostics, collectDoctorDiagnostics, createMigrationConfig, doctorDiagnosticsTableRows, formatDoctorDiagnosticsJson, generateDrizzleConfig, generateDrizzleSchema, parseJsonSchema };
|
package/dist/index.mjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { C as formatDoctorDiagnosticsJson, S as doctorDiagnosticsTableRows,
|
|
1
|
+
import { C as formatDoctorDiagnosticsJson, S as doctorDiagnosticsTableRows, a as parseJsonSchema, i as JsonSchemaDefinitionSchema, n as createMigrationConfig, r as generateDrizzleConfig, s as generateDrizzleSchema, t as collectDoctorDiagnostics, x as buildDoctorDiagnostics } from "./doctor-collector-D2q6iD_e.mjs";
|
|
2
2
|
|
|
3
3
|
export { JsonSchemaDefinitionSchema, buildDoctorDiagnostics, collectDoctorDiagnostics, createMigrationConfig, doctorDiagnosticsTableRows, formatDoctorDiagnosticsJson, generateDrizzleConfig, generateDrizzleSchema, parseJsonSchema };
|