nuxt-ai-ready 0.6.0 → 0.6.2
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/dist/module.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export async function exportDump(db) {
|
|
2
2
|
return db.all(`
|
|
3
3
|
SELECT route, route_key, title, description, markdown, headings, keywords, updated_at, indexed_at, is_error
|
|
4
|
-
FROM
|
|
4
|
+
FROM ai_ready_pages
|
|
5
5
|
`);
|
|
6
6
|
}
|
|
7
7
|
export async function compressDump(data) {
|
|
@@ -22,7 +22,7 @@ export async function decompressDump(base64) {
|
|
|
22
22
|
export async function importDump(db, rows) {
|
|
23
23
|
for (const row of rows) {
|
|
24
24
|
await db.exec(`
|
|
25
|
-
INSERT OR REPLACE INTO
|
|
25
|
+
INSERT OR REPLACE INTO ai_ready_pages (route, route_key, title, description, markdown, headings, keywords, updated_at, indexed_at, is_error)
|
|
26
26
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
27
27
|
`, [row.route, row.route_key, row.title, row.description, row.markdown, row.headings, row.keywords, row.updated_at, row.indexed_at, row.is_error]);
|
|
28
28
|
}
|
|
@@ -12,15 +12,15 @@ function rowToEntry(row) {
|
|
|
12
12
|
};
|
|
13
13
|
}
|
|
14
14
|
export async function getAllPages(db) {
|
|
15
|
-
const rows = await db.all("SELECT * FROM
|
|
15
|
+
const rows = await db.all("SELECT * FROM ai_ready_pages WHERE is_error = 0");
|
|
16
16
|
return rows.map(rowToEntry);
|
|
17
17
|
}
|
|
18
18
|
export async function getPage(db, route) {
|
|
19
|
-
const row = await db.first("SELECT * FROM
|
|
19
|
+
const row = await db.first("SELECT * FROM ai_ready_pages WHERE route = ?", [route]);
|
|
20
20
|
return row ? rowToEntry(row) : void 0;
|
|
21
21
|
}
|
|
22
22
|
export async function getPageWithMarkdown(db, route) {
|
|
23
|
-
const row = await db.first("SELECT * FROM
|
|
23
|
+
const row = await db.first("SELECT * FROM ai_ready_pages WHERE route = ?", [route]);
|
|
24
24
|
return row ? { ...rowToEntry(row), markdown: row.markdown } : void 0;
|
|
25
25
|
}
|
|
26
26
|
export async function searchPages(db, query, opts = {}) {
|
|
@@ -29,10 +29,10 @@ export async function searchPages(db, query, opts = {}) {
|
|
|
29
29
|
if (!sanitized) return [];
|
|
30
30
|
const terms = sanitized.split(/\s+/).map((t) => `${t}*`).join(" ");
|
|
31
31
|
return db.all(`
|
|
32
|
-
SELECT p.route, p.title, p.description, bm25(
|
|
33
|
-
FROM
|
|
34
|
-
JOIN
|
|
35
|
-
WHERE
|
|
32
|
+
SELECT p.route, p.title, p.description, bm25(ai_ready_pages_fts, 5.0, 3.0, 1.0, 0.5, 2.0, 2.0) as score
|
|
33
|
+
FROM ai_ready_pages_fts
|
|
34
|
+
JOIN ai_ready_pages p ON ai_ready_pages_fts.rowid = p.id
|
|
35
|
+
WHERE ai_ready_pages_fts MATCH ?
|
|
36
36
|
ORDER BY score
|
|
37
37
|
LIMIT ?
|
|
38
38
|
`, [terms, limit]);
|
|
@@ -42,7 +42,7 @@ export async function upsertPage(db, page) {
|
|
|
42
42
|
const keywordsJson = JSON.stringify(page.keywords);
|
|
43
43
|
const indexedAt = Date.now();
|
|
44
44
|
await db.exec(`
|
|
45
|
-
INSERT INTO
|
|
45
|
+
INSERT INTO ai_ready_pages (route, route_key, title, description, markdown, headings, keywords, updated_at, indexed_at, is_error)
|
|
46
46
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
47
47
|
ON CONFLICT(route) DO UPDATE SET
|
|
48
48
|
title = excluded.title,
|
|
@@ -56,21 +56,21 @@ export async function upsertPage(db, page) {
|
|
|
56
56
|
`, [page.route, routeKey, page.title, page.description, page.markdown, page.headings, keywordsJson, page.updatedAt, indexedAt, page.isError ? 1 : 0]);
|
|
57
57
|
}
|
|
58
58
|
export async function getErrorRoutes(db) {
|
|
59
|
-
const rows = await db.all("SELECT route FROM
|
|
59
|
+
const rows = await db.all("SELECT route FROM ai_ready_pages WHERE is_error = 1");
|
|
60
60
|
return rows.map((r) => r.route);
|
|
61
61
|
}
|
|
62
62
|
export async function isPageFresh(db, route, ttlSeconds) {
|
|
63
63
|
if (ttlSeconds <= 0) return false;
|
|
64
|
-
const row = await db.first("SELECT indexed_at FROM
|
|
64
|
+
const row = await db.first("SELECT indexed_at FROM ai_ready_pages WHERE route = ?", [route]);
|
|
65
65
|
if (!row) return false;
|
|
66
66
|
const age = (Date.now() - row.indexed_at) / 1e3;
|
|
67
67
|
return age < ttlSeconds;
|
|
68
68
|
}
|
|
69
69
|
export async function deletePage(db, route) {
|
|
70
|
-
await db.exec("DELETE FROM
|
|
70
|
+
await db.exec("DELETE FROM ai_ready_pages WHERE route = ?", [route]);
|
|
71
71
|
}
|
|
72
72
|
export async function getPageCount(db) {
|
|
73
|
-
const row = await db.first("SELECT COUNT(*) as count FROM
|
|
73
|
+
const row = await db.first("SELECT COUNT(*) as count FROM ai_ready_pages WHERE is_error = 0");
|
|
74
74
|
return row?.count || 0;
|
|
75
75
|
}
|
|
76
76
|
export async function hasPages(db) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export declare const SCHEMA_VERSION = "v1.
|
|
2
|
-
export declare const createTablesSQL = "\nCREATE TABLE IF NOT EXISTS
|
|
1
|
+
export declare const SCHEMA_VERSION = "v1.1.0";
|
|
2
|
+
export declare const createTablesSQL = "\nCREATE TABLE IF NOT EXISTS ai_ready_pages (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n route TEXT UNIQUE NOT NULL,\n route_key TEXT UNIQUE NOT NULL,\n title TEXT NOT NULL DEFAULT '',\n description TEXT NOT NULL DEFAULT '',\n markdown TEXT NOT NULL DEFAULT '',\n headings TEXT NOT NULL DEFAULT '[]',\n keywords TEXT NOT NULL DEFAULT '[]',\n updated_at TEXT NOT NULL,\n indexed_at INTEGER NOT NULL,\n is_error INTEGER NOT NULL DEFAULT 0\n);\n\nCREATE INDEX IF NOT EXISTS idx_ai_ready_pages_route ON ai_ready_pages(route);\nCREATE INDEX IF NOT EXISTS idx_ai_ready_pages_is_error ON ai_ready_pages(is_error);\n\nCREATE VIRTUAL TABLE IF NOT EXISTS ai_ready_pages_fts USING fts5(\n route, title, description, markdown, headings, keywords,\n content=ai_ready_pages, content_rowid=id\n);\n\nCREATE TRIGGER IF NOT EXISTS ai_ready_pages_ai AFTER INSERT ON ai_ready_pages BEGIN\n INSERT INTO ai_ready_pages_fts(rowid, route, title, description, markdown, headings, keywords)\n VALUES (new.id, new.route, new.title, new.description, new.markdown, new.headings, new.keywords);\nEND;\n\nCREATE TRIGGER IF NOT EXISTS ai_ready_pages_ad AFTER DELETE ON ai_ready_pages BEGIN\n INSERT INTO ai_ready_pages_fts(ai_ready_pages_fts, rowid, route, title, description, markdown, headings, keywords)\n VALUES('delete', old.id, old.route, old.title, old.description, old.markdown, old.headings, old.keywords);\nEND;\n\nCREATE TRIGGER IF NOT EXISTS ai_ready_pages_au AFTER UPDATE ON ai_ready_pages BEGIN\n INSERT INTO ai_ready_pages_fts(ai_ready_pages_fts, rowid, route, title, description, markdown, headings, keywords)\n VALUES('delete', old.id, old.route, old.title, old.description, old.markdown, old.headings, old.keywords);\n INSERT INTO ai_ready_pages_fts(rowid, route, title, description, markdown, headings, keywords)\n VALUES (new.id, new.route, new.title, new.description, new.markdown, new.headings, new.keywords);\nEND;\n\nCREATE TABLE IF NOT EXISTS _ai_ready_info (\n id TEXT PRIMARY KEY,\n version TEXT,\n checksum TEXT,\n ready INTEGER DEFAULT 0\n);\n";
|
|
3
3
|
export interface DatabaseAdapter {
|
|
4
4
|
all: <T>(sql: string, params?: unknown[]) => Promise<T[]>;
|
|
5
5
|
first: <T>(sql: string, params?: unknown[]) => Promise<T | undefined>;
|
|
@@ -1,11 +1,14 @@
|
|
|
1
|
-
export const SCHEMA_VERSION = "v1.
|
|
1
|
+
export const SCHEMA_VERSION = "v1.1.0";
|
|
2
2
|
const DROP_TABLES_SQL = [
|
|
3
|
+
"DROP TABLE IF EXISTS ai_ready_pages_fts",
|
|
4
|
+
"DROP TABLE IF EXISTS ai_ready_pages",
|
|
5
|
+
"DROP TABLE IF EXISTS _ai_ready_info",
|
|
6
|
+
// Legacy unprefixed tables (migration from v1.0.0)
|
|
3
7
|
"DROP TABLE IF EXISTS pages_fts",
|
|
4
|
-
"DROP TABLE IF EXISTS pages"
|
|
5
|
-
"DROP TABLE IF EXISTS _ai_ready_info"
|
|
8
|
+
"DROP TABLE IF EXISTS pages"
|
|
6
9
|
];
|
|
7
10
|
export const createTablesSQL = `
|
|
8
|
-
CREATE TABLE IF NOT EXISTS
|
|
11
|
+
CREATE TABLE IF NOT EXISTS ai_ready_pages (
|
|
9
12
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
10
13
|
route TEXT UNIQUE NOT NULL,
|
|
11
14
|
route_key TEXT UNIQUE NOT NULL,
|
|
@@ -19,28 +22,28 @@ CREATE TABLE IF NOT EXISTS pages (
|
|
|
19
22
|
is_error INTEGER NOT NULL DEFAULT 0
|
|
20
23
|
);
|
|
21
24
|
|
|
22
|
-
CREATE INDEX IF NOT EXISTS
|
|
23
|
-
CREATE INDEX IF NOT EXISTS
|
|
25
|
+
CREATE INDEX IF NOT EXISTS idx_ai_ready_pages_route ON ai_ready_pages(route);
|
|
26
|
+
CREATE INDEX IF NOT EXISTS idx_ai_ready_pages_is_error ON ai_ready_pages(is_error);
|
|
24
27
|
|
|
25
|
-
CREATE VIRTUAL TABLE IF NOT EXISTS
|
|
28
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS ai_ready_pages_fts USING fts5(
|
|
26
29
|
route, title, description, markdown, headings, keywords,
|
|
27
|
-
content=
|
|
30
|
+
content=ai_ready_pages, content_rowid=id
|
|
28
31
|
);
|
|
29
32
|
|
|
30
|
-
CREATE TRIGGER IF NOT EXISTS
|
|
31
|
-
INSERT INTO
|
|
33
|
+
CREATE TRIGGER IF NOT EXISTS ai_ready_pages_ai AFTER INSERT ON ai_ready_pages BEGIN
|
|
34
|
+
INSERT INTO ai_ready_pages_fts(rowid, route, title, description, markdown, headings, keywords)
|
|
32
35
|
VALUES (new.id, new.route, new.title, new.description, new.markdown, new.headings, new.keywords);
|
|
33
36
|
END;
|
|
34
37
|
|
|
35
|
-
CREATE TRIGGER IF NOT EXISTS
|
|
36
|
-
INSERT INTO
|
|
38
|
+
CREATE TRIGGER IF NOT EXISTS ai_ready_pages_ad AFTER DELETE ON ai_ready_pages BEGIN
|
|
39
|
+
INSERT INTO ai_ready_pages_fts(ai_ready_pages_fts, rowid, route, title, description, markdown, headings, keywords)
|
|
37
40
|
VALUES('delete', old.id, old.route, old.title, old.description, old.markdown, old.headings, old.keywords);
|
|
38
41
|
END;
|
|
39
42
|
|
|
40
|
-
CREATE TRIGGER IF NOT EXISTS
|
|
41
|
-
INSERT INTO
|
|
43
|
+
CREATE TRIGGER IF NOT EXISTS ai_ready_pages_au AFTER UPDATE ON ai_ready_pages BEGIN
|
|
44
|
+
INSERT INTO ai_ready_pages_fts(ai_ready_pages_fts, rowid, route, title, description, markdown, headings, keywords)
|
|
42
45
|
VALUES('delete', old.id, old.route, old.title, old.description, old.markdown, old.headings, old.keywords);
|
|
43
|
-
INSERT INTO
|
|
46
|
+
INSERT INTO ai_ready_pages_fts(rowid, route, title, description, markdown, headings, keywords)
|
|
44
47
|
VALUES (new.id, new.route, new.title, new.description, new.markdown, new.headings, new.keywords);
|
|
45
48
|
END;
|
|
46
49
|
|
|
@@ -60,7 +63,7 @@ export async function initSchema(db) {
|
|
|
60
63
|
}
|
|
61
64
|
const statements = [
|
|
62
65
|
// Main table
|
|
63
|
-
`CREATE TABLE IF NOT EXISTS
|
|
66
|
+
`CREATE TABLE IF NOT EXISTS ai_ready_pages (
|
|
64
67
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
65
68
|
route TEXT UNIQUE NOT NULL,
|
|
66
69
|
route_key TEXT UNIQUE NOT NULL,
|
|
@@ -74,26 +77,26 @@ export async function initSchema(db) {
|
|
|
74
77
|
is_error INTEGER NOT NULL DEFAULT 0
|
|
75
78
|
)`,
|
|
76
79
|
// Indexes
|
|
77
|
-
`CREATE INDEX IF NOT EXISTS
|
|
78
|
-
`CREATE INDEX IF NOT EXISTS
|
|
80
|
+
`CREATE INDEX IF NOT EXISTS idx_ai_ready_pages_route ON ai_ready_pages(route)`,
|
|
81
|
+
`CREATE INDEX IF NOT EXISTS idx_ai_ready_pages_is_error ON ai_ready_pages(is_error)`,
|
|
79
82
|
// FTS5 virtual table
|
|
80
|
-
`CREATE VIRTUAL TABLE IF NOT EXISTS
|
|
83
|
+
`CREATE VIRTUAL TABLE IF NOT EXISTS ai_ready_pages_fts USING fts5(
|
|
81
84
|
route, title, description, markdown, headings, keywords,
|
|
82
|
-
content=
|
|
85
|
+
content=ai_ready_pages, content_rowid=id
|
|
83
86
|
)`,
|
|
84
87
|
// Triggers for FTS sync
|
|
85
|
-
`CREATE TRIGGER IF NOT EXISTS
|
|
86
|
-
INSERT INTO
|
|
88
|
+
`CREATE TRIGGER IF NOT EXISTS ai_ready_pages_ai AFTER INSERT ON ai_ready_pages BEGIN
|
|
89
|
+
INSERT INTO ai_ready_pages_fts(rowid, route, title, description, markdown, headings, keywords)
|
|
87
90
|
VALUES (new.id, new.route, new.title, new.description, new.markdown, new.headings, new.keywords);
|
|
88
91
|
END`,
|
|
89
|
-
`CREATE TRIGGER IF NOT EXISTS
|
|
90
|
-
INSERT INTO
|
|
92
|
+
`CREATE TRIGGER IF NOT EXISTS ai_ready_pages_ad AFTER DELETE ON ai_ready_pages BEGIN
|
|
93
|
+
INSERT INTO ai_ready_pages_fts(ai_ready_pages_fts, rowid, route, title, description, markdown, headings, keywords)
|
|
91
94
|
VALUES('delete', old.id, old.route, old.title, old.description, old.markdown, old.headings, old.keywords);
|
|
92
95
|
END`,
|
|
93
|
-
`CREATE TRIGGER IF NOT EXISTS
|
|
94
|
-
INSERT INTO
|
|
96
|
+
`CREATE TRIGGER IF NOT EXISTS ai_ready_pages_au AFTER UPDATE ON ai_ready_pages BEGIN
|
|
97
|
+
INSERT INTO ai_ready_pages_fts(ai_ready_pages_fts, rowid, route, title, description, markdown, headings, keywords)
|
|
95
98
|
VALUES('delete', old.id, old.route, old.title, old.description, old.markdown, old.headings, old.keywords);
|
|
96
|
-
INSERT INTO
|
|
99
|
+
INSERT INTO ai_ready_pages_fts(rowid, route, title, description, markdown, headings, keywords)
|
|
97
100
|
VALUES (new.id, new.route, new.title, new.description, new.markdown, new.headings, new.keywords);
|
|
98
101
|
END`,
|
|
99
102
|
// Info table
|