@tichopad/notes-query-tool 0.1.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.
- package/README.md +93 -0
- package/dist/drizzle/0000_supreme_baron_strucker.sql +2 -0
- package/dist/drizzle/0001_keen_komodo.sql +24 -0
- package/dist/drizzle/0002_pg_trgm.sql +3 -0
- package/dist/drizzle/0003_wooden_spacker_dave.sql +12 -0
- package/dist/drizzle/meta/0000_snapshot.json +18 -0
- package/dist/drizzle/meta/0001_snapshot.json +193 -0
- package/dist/drizzle/meta/0002_snapshot.json +193 -0
- package/dist/drizzle/meta/0003_snapshot.json +265 -0
- package/dist/drizzle/meta/_journal.json +34 -0
- package/dist/main.js +26 -0
- package/dist/main.js.map +6 -0
- package/package.json +61 -0
package/README.md
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# notes-query-tool
|
|
2
|
+
|
|
3
|
+
**Prerequisites:** Node.js >= 24, pnpm >= 10
|
|
4
|
+
|
|
5
|
+
Load and index notes:
|
|
6
|
+
`pnpm run dev load --glob "testdata/**/*.md"`
|
|
7
|
+
|
|
8
|
+
Query notes:
|
|
9
|
+
`pnpm run dev query --vector/-v <semantic query> --fulltext/-f <keyword query>`
|
|
10
|
+
|
|
11
|
+
Both `--vector` and `--fulltext` flags are required.
|
|
12
|
+
|
|
13
|
+
An optional `--trigram` / `-g` flag passes a separate plain-text query to the trigram leg. When omitted, the trigram leg falls back to the `--fulltext` value (preserving existing behaviour). Use this when `--fulltext` contains PostgreSQL websearch syntax (`OR`, `-word`, `"phrases"`) that would corrupt trigram scoring.
|
|
14
|
+
|
|
15
|
+
An optional `--trigram-mode` / `-t` flag selects the trigram operator: `strict` (default, uses `strict_word_similarity`) or `word` (uses `word_similarity`).
|
|
16
|
+
|
|
17
|
+
## Bases
|
|
18
|
+
|
|
19
|
+
A **base** is a named, isolated collection of notes. All files loaded into the index belong to exactly one base, and queries are scoped to a single base — results from one base never appear in another.
|
|
20
|
+
|
|
21
|
+
The default base is named `default`. Pass `--base <name>` to either command to use a different one. A base is created automatically on first load.
|
|
22
|
+
|
|
23
|
+
```sh
|
|
24
|
+
# Load notes into a named base
|
|
25
|
+
pnpm run dev load --base work --glob "work-notes/**/*.md"
|
|
26
|
+
pnpm run dev load --base personal --glob "personal/**/*.md"
|
|
27
|
+
|
|
28
|
+
# Query within a specific base
|
|
29
|
+
pnpm run dev query --base work -v "project deadlines" -f "deadline project"
|
|
30
|
+
|
|
31
|
+
# Querying a base that doesn't exist exits with an error
|
|
32
|
+
pnpm run dev query --base nonexistent -v "anything" -f "anything"
|
|
33
|
+
|
|
34
|
+
# Drop a base and all its indexed data (prompts for confirmation)
|
|
35
|
+
pnpm run dev drop --base work
|
|
36
|
+
|
|
37
|
+
# Drop without confirmation (useful for scripting)
|
|
38
|
+
pnpm run dev drop --base work --force
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Search channels
|
|
42
|
+
|
|
43
|
+
Three parallel channels run on every query and are fused by weighted score (vector 0.3 / FTS 0.4 / trigram 0.3):
|
|
44
|
+
|
|
45
|
+
- **Vector** — dense cosine similarity on chunk embeddings. Best for semantic / paraphrase queries.
|
|
46
|
+
- **FTS** — PostgreSQL full-text search via `tsvector`/`websearch_to_tsquery`. Supports websearch syntax: `OR`, `-word`, `"exact phrase"`. Best for keyword matching.
|
|
47
|
+
- **Trigram** *(experimental)* — `pg_trgm` word-distance matching on raw chunk content via `strict_word_similarity` (default) or `word_similarity`. Uses `--trigram` text (or `--fulltext` if not specified). Best for proper-noun and lexical queries that FTS tokenisation misses.
|
|
48
|
+
|
|
49
|
+
The trigram threshold is fixed at 0.3. Use `--trigram-mode strict` for precision (fewer but higher-confidence matches) or `--trigram-mode word` for recall (more matches, looser).
|
|
50
|
+
|
|
51
|
+
### Re-loading notes after a fresh database
|
|
52
|
+
|
|
53
|
+
If you need to reset the database (e.g. after schema migrations), run:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
rm -rf dbdata/
|
|
57
|
+
pnpm run dev load --glob 'notes/**/*.md'
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Development
|
|
61
|
+
|
|
62
|
+
### Ad-hoc SQL queries
|
|
63
|
+
|
|
64
|
+
Run arbitrary SQL against the local PGLite DB (in `./dbdata/`):
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
pnpm run db:query "SELECT id, path FROM notes LIMIT 5"
|
|
68
|
+
# or via stdin
|
|
69
|
+
pnpm run db:query <<'SQL'
|
|
70
|
+
SELECT count(*) FROM chunks;
|
|
71
|
+
SQL
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Output is terse TSV designed for agents/scripts. Vector columns are abbreviated. Row output capped at 200 rows (override with `DB_QUERY_LIMIT`). Multi-statement input supported.
|
|
75
|
+
|
|
76
|
+
## Examples
|
|
77
|
+
|
|
78
|
+
```sh
|
|
79
|
+
# Full flags
|
|
80
|
+
pnpm run dev query --vector "Who is my girlfriend and what does she like?" --fulltext "girlfriend interests hobbies"
|
|
81
|
+
|
|
82
|
+
# Short aliases
|
|
83
|
+
pnpm run dev query -v "What are my long-term career goals?" -f "career goals plans"
|
|
84
|
+
|
|
85
|
+
# Mixed
|
|
86
|
+
pnpm run dev query --vector "Summarize my thoughts on stoicism" -f "stoicism notes"
|
|
87
|
+
|
|
88
|
+
# Split --fulltext (websearch syntax) from --trigram (plain text)
|
|
89
|
+
pnpm run dev query -v "async programming patterns" -f "javascript OR python" -g "javascript"
|
|
90
|
+
|
|
91
|
+
# FTS with phrase exclusion; trigram stays clean
|
|
92
|
+
pnpm run dev query -v "nutrition advice" -f '"meal prep" -fast food' -g "meal prep"
|
|
93
|
+
```
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
CREATE TABLE "chunks" (
|
|
2
|
+
"id" integer PRIMARY KEY GENERATED ALWAYS AS IDENTITY (sequence name "chunks_id_seq" INCREMENT BY 1 MINVALUE 1 MAXVALUE 2147483647 START WITH 1 CACHE 1),
|
|
3
|
+
"file_id" integer NOT NULL,
|
|
4
|
+
"chunk_index" integer NOT NULL,
|
|
5
|
+
"content" text NOT NULL,
|
|
6
|
+
"breadcrumbs" text[] NOT NULL,
|
|
7
|
+
"embedding" vector(768),
|
|
8
|
+
"fts" "tsvector",
|
|
9
|
+
"created_at" timestamp DEFAULT now() NOT NULL,
|
|
10
|
+
"updated_at" timestamp DEFAULT now() NOT NULL
|
|
11
|
+
);
|
|
12
|
+
--> statement-breakpoint
|
|
13
|
+
CREATE TABLE "files" (
|
|
14
|
+
"id" integer PRIMARY KEY GENERATED ALWAYS AS IDENTITY (sequence name "files_id_seq" INCREMENT BY 1 MINVALUE 1 MAXVALUE 2147483647 START WITH 1 CACHE 1),
|
|
15
|
+
"file_path" text NOT NULL,
|
|
16
|
+
"content_hash" text NOT NULL,
|
|
17
|
+
"attributes" jsonb,
|
|
18
|
+
"created_at" timestamp DEFAULT now() NOT NULL,
|
|
19
|
+
"updated_at" timestamp DEFAULT now() NOT NULL,
|
|
20
|
+
CONSTRAINT "files_file_path_unique" UNIQUE("file_path")
|
|
21
|
+
);
|
|
22
|
+
--> statement-breakpoint
|
|
23
|
+
ALTER TABLE "chunks" ADD CONSTRAINT "chunks_file_id_files_id_fk" FOREIGN KEY ("file_id") REFERENCES "public"."files"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
24
|
+
CREATE INDEX "chunks_fts_idx" ON "chunks" USING gin ("fts");
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
CREATE TABLE "bases" (
|
|
2
|
+
"id" integer PRIMARY KEY GENERATED ALWAYS AS IDENTITY (sequence name "bases_id_seq" INCREMENT BY 1 MINVALUE 1 MAXVALUE 2147483647 START WITH 1 CACHE 1),
|
|
3
|
+
"name" text NOT NULL,
|
|
4
|
+
"created_at" timestamp DEFAULT now() NOT NULL,
|
|
5
|
+
"updated_at" timestamp DEFAULT now() NOT NULL,
|
|
6
|
+
CONSTRAINT "bases_name_unique" UNIQUE("name")
|
|
7
|
+
);
|
|
8
|
+
--> statement-breakpoint
|
|
9
|
+
ALTER TABLE "files" DROP CONSTRAINT "files_file_path_unique";--> statement-breakpoint
|
|
10
|
+
ALTER TABLE "files" ADD COLUMN "base_id" integer NOT NULL;--> statement-breakpoint
|
|
11
|
+
ALTER TABLE "files" ADD CONSTRAINT "files_base_id_bases_id_fk" FOREIGN KEY ("base_id") REFERENCES "public"."bases"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
12
|
+
ALTER TABLE "files" ADD CONSTRAINT "files_base_id_file_path_unique" UNIQUE("base_id","file_path");
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "c4d512fe-fe9b-4dfb-a9b9-55261abae4c8",
|
|
3
|
+
"prevId": "00000000-0000-0000-0000-000000000000",
|
|
4
|
+
"version": "7",
|
|
5
|
+
"dialect": "postgresql",
|
|
6
|
+
"tables": {},
|
|
7
|
+
"enums": {},
|
|
8
|
+
"schemas": {},
|
|
9
|
+
"views": {},
|
|
10
|
+
"sequences": {},
|
|
11
|
+
"roles": {},
|
|
12
|
+
"policies": {},
|
|
13
|
+
"_meta": {
|
|
14
|
+
"columns": {},
|
|
15
|
+
"schemas": {},
|
|
16
|
+
"tables": {}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "6f259cb7-6aa7-425f-ba24-530ce8325605",
|
|
3
|
+
"prevId": "c4d512fe-fe9b-4dfb-a9b9-55261abae4c8",
|
|
4
|
+
"version": "7",
|
|
5
|
+
"dialect": "postgresql",
|
|
6
|
+
"tables": {
|
|
7
|
+
"public.chunks": {
|
|
8
|
+
"name": "chunks",
|
|
9
|
+
"schema": "",
|
|
10
|
+
"columns": {
|
|
11
|
+
"id": {
|
|
12
|
+
"name": "id",
|
|
13
|
+
"type": "integer",
|
|
14
|
+
"primaryKey": true,
|
|
15
|
+
"notNull": true,
|
|
16
|
+
"identity": {
|
|
17
|
+
"type": "always",
|
|
18
|
+
"name": "chunks_id_seq",
|
|
19
|
+
"schema": "public",
|
|
20
|
+
"increment": "1",
|
|
21
|
+
"startWith": "1",
|
|
22
|
+
"minValue": "1",
|
|
23
|
+
"maxValue": "2147483647",
|
|
24
|
+
"cache": "1",
|
|
25
|
+
"cycle": false
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
"file_id": {
|
|
29
|
+
"name": "file_id",
|
|
30
|
+
"type": "integer",
|
|
31
|
+
"primaryKey": false,
|
|
32
|
+
"notNull": true
|
|
33
|
+
},
|
|
34
|
+
"chunk_index": {
|
|
35
|
+
"name": "chunk_index",
|
|
36
|
+
"type": "integer",
|
|
37
|
+
"primaryKey": false,
|
|
38
|
+
"notNull": true
|
|
39
|
+
},
|
|
40
|
+
"content": {
|
|
41
|
+
"name": "content",
|
|
42
|
+
"type": "text",
|
|
43
|
+
"primaryKey": false,
|
|
44
|
+
"notNull": true
|
|
45
|
+
},
|
|
46
|
+
"breadcrumbs": {
|
|
47
|
+
"name": "breadcrumbs",
|
|
48
|
+
"type": "text[]",
|
|
49
|
+
"primaryKey": false,
|
|
50
|
+
"notNull": true
|
|
51
|
+
},
|
|
52
|
+
"embedding": {
|
|
53
|
+
"name": "embedding",
|
|
54
|
+
"type": "vector(768)",
|
|
55
|
+
"primaryKey": false,
|
|
56
|
+
"notNull": false
|
|
57
|
+
},
|
|
58
|
+
"fts": {
|
|
59
|
+
"name": "fts",
|
|
60
|
+
"type": "tsvector",
|
|
61
|
+
"primaryKey": false,
|
|
62
|
+
"notNull": false
|
|
63
|
+
},
|
|
64
|
+
"created_at": {
|
|
65
|
+
"name": "created_at",
|
|
66
|
+
"type": "timestamp",
|
|
67
|
+
"primaryKey": false,
|
|
68
|
+
"notNull": true,
|
|
69
|
+
"default": "now()"
|
|
70
|
+
},
|
|
71
|
+
"updated_at": {
|
|
72
|
+
"name": "updated_at",
|
|
73
|
+
"type": "timestamp",
|
|
74
|
+
"primaryKey": false,
|
|
75
|
+
"notNull": true,
|
|
76
|
+
"default": "now()"
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
"indexes": {
|
|
80
|
+
"chunks_fts_idx": {
|
|
81
|
+
"name": "chunks_fts_idx",
|
|
82
|
+
"columns": [
|
|
83
|
+
{
|
|
84
|
+
"expression": "fts",
|
|
85
|
+
"isExpression": false,
|
|
86
|
+
"asc": true,
|
|
87
|
+
"nulls": "last"
|
|
88
|
+
}
|
|
89
|
+
],
|
|
90
|
+
"isUnique": false,
|
|
91
|
+
"concurrently": false,
|
|
92
|
+
"method": "gin",
|
|
93
|
+
"with": {}
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
"foreignKeys": {
|
|
97
|
+
"chunks_file_id_files_id_fk": {
|
|
98
|
+
"name": "chunks_file_id_files_id_fk",
|
|
99
|
+
"tableFrom": "chunks",
|
|
100
|
+
"tableTo": "files",
|
|
101
|
+
"columnsFrom": ["file_id"],
|
|
102
|
+
"columnsTo": ["id"],
|
|
103
|
+
"onDelete": "cascade",
|
|
104
|
+
"onUpdate": "no action"
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
"compositePrimaryKeys": {},
|
|
108
|
+
"uniqueConstraints": {},
|
|
109
|
+
"policies": {},
|
|
110
|
+
"checkConstraints": {},
|
|
111
|
+
"isRLSEnabled": false
|
|
112
|
+
},
|
|
113
|
+
"public.files": {
|
|
114
|
+
"name": "files",
|
|
115
|
+
"schema": "",
|
|
116
|
+
"columns": {
|
|
117
|
+
"id": {
|
|
118
|
+
"name": "id",
|
|
119
|
+
"type": "integer",
|
|
120
|
+
"primaryKey": true,
|
|
121
|
+
"notNull": true,
|
|
122
|
+
"identity": {
|
|
123
|
+
"type": "always",
|
|
124
|
+
"name": "files_id_seq",
|
|
125
|
+
"schema": "public",
|
|
126
|
+
"increment": "1",
|
|
127
|
+
"startWith": "1",
|
|
128
|
+
"minValue": "1",
|
|
129
|
+
"maxValue": "2147483647",
|
|
130
|
+
"cache": "1",
|
|
131
|
+
"cycle": false
|
|
132
|
+
}
|
|
133
|
+
},
|
|
134
|
+
"file_path": {
|
|
135
|
+
"name": "file_path",
|
|
136
|
+
"type": "text",
|
|
137
|
+
"primaryKey": false,
|
|
138
|
+
"notNull": true
|
|
139
|
+
},
|
|
140
|
+
"content_hash": {
|
|
141
|
+
"name": "content_hash",
|
|
142
|
+
"type": "text",
|
|
143
|
+
"primaryKey": false,
|
|
144
|
+
"notNull": true
|
|
145
|
+
},
|
|
146
|
+
"attributes": {
|
|
147
|
+
"name": "attributes",
|
|
148
|
+
"type": "jsonb",
|
|
149
|
+
"primaryKey": false,
|
|
150
|
+
"notNull": false
|
|
151
|
+
},
|
|
152
|
+
"created_at": {
|
|
153
|
+
"name": "created_at",
|
|
154
|
+
"type": "timestamp",
|
|
155
|
+
"primaryKey": false,
|
|
156
|
+
"notNull": true,
|
|
157
|
+
"default": "now()"
|
|
158
|
+
},
|
|
159
|
+
"updated_at": {
|
|
160
|
+
"name": "updated_at",
|
|
161
|
+
"type": "timestamp",
|
|
162
|
+
"primaryKey": false,
|
|
163
|
+
"notNull": true,
|
|
164
|
+
"default": "now()"
|
|
165
|
+
}
|
|
166
|
+
},
|
|
167
|
+
"indexes": {},
|
|
168
|
+
"foreignKeys": {},
|
|
169
|
+
"compositePrimaryKeys": {},
|
|
170
|
+
"uniqueConstraints": {
|
|
171
|
+
"files_file_path_unique": {
|
|
172
|
+
"name": "files_file_path_unique",
|
|
173
|
+
"nullsNotDistinct": false,
|
|
174
|
+
"columns": ["file_path"]
|
|
175
|
+
}
|
|
176
|
+
},
|
|
177
|
+
"policies": {},
|
|
178
|
+
"checkConstraints": {},
|
|
179
|
+
"isRLSEnabled": false
|
|
180
|
+
}
|
|
181
|
+
},
|
|
182
|
+
"enums": {},
|
|
183
|
+
"schemas": {},
|
|
184
|
+
"sequences": {},
|
|
185
|
+
"roles": {},
|
|
186
|
+
"policies": {},
|
|
187
|
+
"views": {},
|
|
188
|
+
"_meta": {
|
|
189
|
+
"columns": {},
|
|
190
|
+
"schemas": {},
|
|
191
|
+
"tables": {}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
|
3
|
+
"prevId": "6f259cb7-6aa7-425f-ba24-530ce8325605",
|
|
4
|
+
"version": "7",
|
|
5
|
+
"dialect": "postgresql",
|
|
6
|
+
"tables": {
|
|
7
|
+
"public.chunks": {
|
|
8
|
+
"name": "chunks",
|
|
9
|
+
"schema": "",
|
|
10
|
+
"columns": {
|
|
11
|
+
"id": {
|
|
12
|
+
"name": "id",
|
|
13
|
+
"type": "integer",
|
|
14
|
+
"primaryKey": true,
|
|
15
|
+
"notNull": true,
|
|
16
|
+
"identity": {
|
|
17
|
+
"type": "always",
|
|
18
|
+
"name": "chunks_id_seq",
|
|
19
|
+
"schema": "public",
|
|
20
|
+
"increment": "1",
|
|
21
|
+
"startWith": "1",
|
|
22
|
+
"minValue": "1",
|
|
23
|
+
"maxValue": "2147483647",
|
|
24
|
+
"cache": "1",
|
|
25
|
+
"cycle": false
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
"file_id": {
|
|
29
|
+
"name": "file_id",
|
|
30
|
+
"type": "integer",
|
|
31
|
+
"primaryKey": false,
|
|
32
|
+
"notNull": true
|
|
33
|
+
},
|
|
34
|
+
"chunk_index": {
|
|
35
|
+
"name": "chunk_index",
|
|
36
|
+
"type": "integer",
|
|
37
|
+
"primaryKey": false,
|
|
38
|
+
"notNull": true
|
|
39
|
+
},
|
|
40
|
+
"content": {
|
|
41
|
+
"name": "content",
|
|
42
|
+
"type": "text",
|
|
43
|
+
"primaryKey": false,
|
|
44
|
+
"notNull": true
|
|
45
|
+
},
|
|
46
|
+
"breadcrumbs": {
|
|
47
|
+
"name": "breadcrumbs",
|
|
48
|
+
"type": "text[]",
|
|
49
|
+
"primaryKey": false,
|
|
50
|
+
"notNull": true
|
|
51
|
+
},
|
|
52
|
+
"embedding": {
|
|
53
|
+
"name": "embedding",
|
|
54
|
+
"type": "vector(768)",
|
|
55
|
+
"primaryKey": false,
|
|
56
|
+
"notNull": false
|
|
57
|
+
},
|
|
58
|
+
"fts": {
|
|
59
|
+
"name": "fts",
|
|
60
|
+
"type": "tsvector",
|
|
61
|
+
"primaryKey": false,
|
|
62
|
+
"notNull": false
|
|
63
|
+
},
|
|
64
|
+
"created_at": {
|
|
65
|
+
"name": "created_at",
|
|
66
|
+
"type": "timestamp",
|
|
67
|
+
"primaryKey": false,
|
|
68
|
+
"notNull": true,
|
|
69
|
+
"default": "now()"
|
|
70
|
+
},
|
|
71
|
+
"updated_at": {
|
|
72
|
+
"name": "updated_at",
|
|
73
|
+
"type": "timestamp",
|
|
74
|
+
"primaryKey": false,
|
|
75
|
+
"notNull": true,
|
|
76
|
+
"default": "now()"
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
"indexes": {
|
|
80
|
+
"chunks_fts_idx": {
|
|
81
|
+
"name": "chunks_fts_idx",
|
|
82
|
+
"columns": [
|
|
83
|
+
{
|
|
84
|
+
"expression": "fts",
|
|
85
|
+
"isExpression": false,
|
|
86
|
+
"asc": true,
|
|
87
|
+
"nulls": "last"
|
|
88
|
+
}
|
|
89
|
+
],
|
|
90
|
+
"isUnique": false,
|
|
91
|
+
"concurrently": false,
|
|
92
|
+
"method": "gin",
|
|
93
|
+
"with": {}
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
"foreignKeys": {
|
|
97
|
+
"chunks_file_id_files_id_fk": {
|
|
98
|
+
"name": "chunks_file_id_files_id_fk",
|
|
99
|
+
"tableFrom": "chunks",
|
|
100
|
+
"tableTo": "files",
|
|
101
|
+
"columnsFrom": ["file_id"],
|
|
102
|
+
"columnsTo": ["id"],
|
|
103
|
+
"onDelete": "cascade",
|
|
104
|
+
"onUpdate": "no action"
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
"compositePrimaryKeys": {},
|
|
108
|
+
"uniqueConstraints": {},
|
|
109
|
+
"policies": {},
|
|
110
|
+
"checkConstraints": {},
|
|
111
|
+
"isRLSEnabled": false
|
|
112
|
+
},
|
|
113
|
+
"public.files": {
|
|
114
|
+
"name": "files",
|
|
115
|
+
"schema": "",
|
|
116
|
+
"columns": {
|
|
117
|
+
"id": {
|
|
118
|
+
"name": "id",
|
|
119
|
+
"type": "integer",
|
|
120
|
+
"primaryKey": true,
|
|
121
|
+
"notNull": true,
|
|
122
|
+
"identity": {
|
|
123
|
+
"type": "always",
|
|
124
|
+
"name": "files_id_seq",
|
|
125
|
+
"schema": "public",
|
|
126
|
+
"increment": "1",
|
|
127
|
+
"startWith": "1",
|
|
128
|
+
"minValue": "1",
|
|
129
|
+
"maxValue": "2147483647",
|
|
130
|
+
"cache": "1",
|
|
131
|
+
"cycle": false
|
|
132
|
+
}
|
|
133
|
+
},
|
|
134
|
+
"file_path": {
|
|
135
|
+
"name": "file_path",
|
|
136
|
+
"type": "text",
|
|
137
|
+
"primaryKey": false,
|
|
138
|
+
"notNull": true
|
|
139
|
+
},
|
|
140
|
+
"content_hash": {
|
|
141
|
+
"name": "content_hash",
|
|
142
|
+
"type": "text",
|
|
143
|
+
"primaryKey": false,
|
|
144
|
+
"notNull": true
|
|
145
|
+
},
|
|
146
|
+
"attributes": {
|
|
147
|
+
"name": "attributes",
|
|
148
|
+
"type": "jsonb",
|
|
149
|
+
"primaryKey": false,
|
|
150
|
+
"notNull": false
|
|
151
|
+
},
|
|
152
|
+
"created_at": {
|
|
153
|
+
"name": "created_at",
|
|
154
|
+
"type": "timestamp",
|
|
155
|
+
"primaryKey": false,
|
|
156
|
+
"notNull": true,
|
|
157
|
+
"default": "now()"
|
|
158
|
+
},
|
|
159
|
+
"updated_at": {
|
|
160
|
+
"name": "updated_at",
|
|
161
|
+
"type": "timestamp",
|
|
162
|
+
"primaryKey": false,
|
|
163
|
+
"notNull": true,
|
|
164
|
+
"default": "now()"
|
|
165
|
+
}
|
|
166
|
+
},
|
|
167
|
+
"indexes": {},
|
|
168
|
+
"foreignKeys": {},
|
|
169
|
+
"compositePrimaryKeys": {},
|
|
170
|
+
"uniqueConstraints": {
|
|
171
|
+
"files_file_path_unique": {
|
|
172
|
+
"name": "files_file_path_unique",
|
|
173
|
+
"nullsNotDistinct": false,
|
|
174
|
+
"columns": ["file_path"]
|
|
175
|
+
}
|
|
176
|
+
},
|
|
177
|
+
"policies": {},
|
|
178
|
+
"checkConstraints": {},
|
|
179
|
+
"isRLSEnabled": false
|
|
180
|
+
}
|
|
181
|
+
},
|
|
182
|
+
"enums": {},
|
|
183
|
+
"schemas": {},
|
|
184
|
+
"sequences": {},
|
|
185
|
+
"roles": {},
|
|
186
|
+
"policies": {},
|
|
187
|
+
"views": {},
|
|
188
|
+
"_meta": {
|
|
189
|
+
"columns": {},
|
|
190
|
+
"schemas": {},
|
|
191
|
+
"tables": {}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "eadc2e23-8643-4c91-9438-18a9d71f8b84",
|
|
3
|
+
"prevId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
|
4
|
+
"version": "7",
|
|
5
|
+
"dialect": "postgresql",
|
|
6
|
+
"tables": {
|
|
7
|
+
"public.bases": {
|
|
8
|
+
"name": "bases",
|
|
9
|
+
"schema": "",
|
|
10
|
+
"columns": {
|
|
11
|
+
"id": {
|
|
12
|
+
"name": "id",
|
|
13
|
+
"type": "integer",
|
|
14
|
+
"primaryKey": true,
|
|
15
|
+
"notNull": true,
|
|
16
|
+
"identity": {
|
|
17
|
+
"type": "always",
|
|
18
|
+
"name": "bases_id_seq",
|
|
19
|
+
"schema": "public",
|
|
20
|
+
"increment": "1",
|
|
21
|
+
"startWith": "1",
|
|
22
|
+
"minValue": "1",
|
|
23
|
+
"maxValue": "2147483647",
|
|
24
|
+
"cache": "1",
|
|
25
|
+
"cycle": false
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
"name": {
|
|
29
|
+
"name": "name",
|
|
30
|
+
"type": "text",
|
|
31
|
+
"primaryKey": false,
|
|
32
|
+
"notNull": true
|
|
33
|
+
},
|
|
34
|
+
"created_at": {
|
|
35
|
+
"name": "created_at",
|
|
36
|
+
"type": "timestamp",
|
|
37
|
+
"primaryKey": false,
|
|
38
|
+
"notNull": true,
|
|
39
|
+
"default": "now()"
|
|
40
|
+
},
|
|
41
|
+
"updated_at": {
|
|
42
|
+
"name": "updated_at",
|
|
43
|
+
"type": "timestamp",
|
|
44
|
+
"primaryKey": false,
|
|
45
|
+
"notNull": true,
|
|
46
|
+
"default": "now()"
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
"indexes": {},
|
|
50
|
+
"foreignKeys": {},
|
|
51
|
+
"compositePrimaryKeys": {},
|
|
52
|
+
"uniqueConstraints": {
|
|
53
|
+
"bases_name_unique": {
|
|
54
|
+
"name": "bases_name_unique",
|
|
55
|
+
"nullsNotDistinct": false,
|
|
56
|
+
"columns": ["name"]
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
"policies": {},
|
|
60
|
+
"checkConstraints": {},
|
|
61
|
+
"isRLSEnabled": false
|
|
62
|
+
},
|
|
63
|
+
"public.chunks": {
|
|
64
|
+
"name": "chunks",
|
|
65
|
+
"schema": "",
|
|
66
|
+
"columns": {
|
|
67
|
+
"id": {
|
|
68
|
+
"name": "id",
|
|
69
|
+
"type": "integer",
|
|
70
|
+
"primaryKey": true,
|
|
71
|
+
"notNull": true,
|
|
72
|
+
"identity": {
|
|
73
|
+
"type": "always",
|
|
74
|
+
"name": "chunks_id_seq",
|
|
75
|
+
"schema": "public",
|
|
76
|
+
"increment": "1",
|
|
77
|
+
"startWith": "1",
|
|
78
|
+
"minValue": "1",
|
|
79
|
+
"maxValue": "2147483647",
|
|
80
|
+
"cache": "1",
|
|
81
|
+
"cycle": false
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
"file_id": {
|
|
85
|
+
"name": "file_id",
|
|
86
|
+
"type": "integer",
|
|
87
|
+
"primaryKey": false,
|
|
88
|
+
"notNull": true
|
|
89
|
+
},
|
|
90
|
+
"chunk_index": {
|
|
91
|
+
"name": "chunk_index",
|
|
92
|
+
"type": "integer",
|
|
93
|
+
"primaryKey": false,
|
|
94
|
+
"notNull": true
|
|
95
|
+
},
|
|
96
|
+
"content": {
|
|
97
|
+
"name": "content",
|
|
98
|
+
"type": "text",
|
|
99
|
+
"primaryKey": false,
|
|
100
|
+
"notNull": true
|
|
101
|
+
},
|
|
102
|
+
"breadcrumbs": {
|
|
103
|
+
"name": "breadcrumbs",
|
|
104
|
+
"type": "text[]",
|
|
105
|
+
"primaryKey": false,
|
|
106
|
+
"notNull": true
|
|
107
|
+
},
|
|
108
|
+
"embedding": {
|
|
109
|
+
"name": "embedding",
|
|
110
|
+
"type": "vector(768)",
|
|
111
|
+
"primaryKey": false,
|
|
112
|
+
"notNull": false
|
|
113
|
+
},
|
|
114
|
+
"fts": {
|
|
115
|
+
"name": "fts",
|
|
116
|
+
"type": "tsvector",
|
|
117
|
+
"primaryKey": false,
|
|
118
|
+
"notNull": false
|
|
119
|
+
},
|
|
120
|
+
"created_at": {
|
|
121
|
+
"name": "created_at",
|
|
122
|
+
"type": "timestamp",
|
|
123
|
+
"primaryKey": false,
|
|
124
|
+
"notNull": true,
|
|
125
|
+
"default": "now()"
|
|
126
|
+
},
|
|
127
|
+
"updated_at": {
|
|
128
|
+
"name": "updated_at",
|
|
129
|
+
"type": "timestamp",
|
|
130
|
+
"primaryKey": false,
|
|
131
|
+
"notNull": true,
|
|
132
|
+
"default": "now()"
|
|
133
|
+
}
|
|
134
|
+
},
|
|
135
|
+
"indexes": {
|
|
136
|
+
"chunks_fts_idx": {
|
|
137
|
+
"name": "chunks_fts_idx",
|
|
138
|
+
"columns": [
|
|
139
|
+
{
|
|
140
|
+
"expression": "fts",
|
|
141
|
+
"isExpression": false,
|
|
142
|
+
"asc": true,
|
|
143
|
+
"nulls": "last"
|
|
144
|
+
}
|
|
145
|
+
],
|
|
146
|
+
"isUnique": false,
|
|
147
|
+
"concurrently": false,
|
|
148
|
+
"method": "gin",
|
|
149
|
+
"with": {}
|
|
150
|
+
}
|
|
151
|
+
},
|
|
152
|
+
"foreignKeys": {
|
|
153
|
+
"chunks_file_id_files_id_fk": {
|
|
154
|
+
"name": "chunks_file_id_files_id_fk",
|
|
155
|
+
"tableFrom": "chunks",
|
|
156
|
+
"tableTo": "files",
|
|
157
|
+
"columnsFrom": ["file_id"],
|
|
158
|
+
"columnsTo": ["id"],
|
|
159
|
+
"onDelete": "cascade",
|
|
160
|
+
"onUpdate": "no action"
|
|
161
|
+
}
|
|
162
|
+
},
|
|
163
|
+
"compositePrimaryKeys": {},
|
|
164
|
+
"uniqueConstraints": {},
|
|
165
|
+
"policies": {},
|
|
166
|
+
"checkConstraints": {},
|
|
167
|
+
"isRLSEnabled": false
|
|
168
|
+
},
|
|
169
|
+
"public.files": {
|
|
170
|
+
"name": "files",
|
|
171
|
+
"schema": "",
|
|
172
|
+
"columns": {
|
|
173
|
+
"id": {
|
|
174
|
+
"name": "id",
|
|
175
|
+
"type": "integer",
|
|
176
|
+
"primaryKey": true,
|
|
177
|
+
"notNull": true,
|
|
178
|
+
"identity": {
|
|
179
|
+
"type": "always",
|
|
180
|
+
"name": "files_id_seq",
|
|
181
|
+
"schema": "public",
|
|
182
|
+
"increment": "1",
|
|
183
|
+
"startWith": "1",
|
|
184
|
+
"minValue": "1",
|
|
185
|
+
"maxValue": "2147483647",
|
|
186
|
+
"cache": "1",
|
|
187
|
+
"cycle": false
|
|
188
|
+
}
|
|
189
|
+
},
|
|
190
|
+
"base_id": {
|
|
191
|
+
"name": "base_id",
|
|
192
|
+
"type": "integer",
|
|
193
|
+
"primaryKey": false,
|
|
194
|
+
"notNull": true
|
|
195
|
+
},
|
|
196
|
+
"file_path": {
|
|
197
|
+
"name": "file_path",
|
|
198
|
+
"type": "text",
|
|
199
|
+
"primaryKey": false,
|
|
200
|
+
"notNull": true
|
|
201
|
+
},
|
|
202
|
+
"content_hash": {
|
|
203
|
+
"name": "content_hash",
|
|
204
|
+
"type": "text",
|
|
205
|
+
"primaryKey": false,
|
|
206
|
+
"notNull": true
|
|
207
|
+
},
|
|
208
|
+
"attributes": {
|
|
209
|
+
"name": "attributes",
|
|
210
|
+
"type": "jsonb",
|
|
211
|
+
"primaryKey": false,
|
|
212
|
+
"notNull": false
|
|
213
|
+
},
|
|
214
|
+
"created_at": {
|
|
215
|
+
"name": "created_at",
|
|
216
|
+
"type": "timestamp",
|
|
217
|
+
"primaryKey": false,
|
|
218
|
+
"notNull": true,
|
|
219
|
+
"default": "now()"
|
|
220
|
+
},
|
|
221
|
+
"updated_at": {
|
|
222
|
+
"name": "updated_at",
|
|
223
|
+
"type": "timestamp",
|
|
224
|
+
"primaryKey": false,
|
|
225
|
+
"notNull": true,
|
|
226
|
+
"default": "now()"
|
|
227
|
+
}
|
|
228
|
+
},
|
|
229
|
+
"indexes": {},
|
|
230
|
+
"foreignKeys": {
|
|
231
|
+
"files_base_id_bases_id_fk": {
|
|
232
|
+
"name": "files_base_id_bases_id_fk",
|
|
233
|
+
"tableFrom": "files",
|
|
234
|
+
"tableTo": "bases",
|
|
235
|
+
"columnsFrom": ["base_id"],
|
|
236
|
+
"columnsTo": ["id"],
|
|
237
|
+
"onDelete": "cascade",
|
|
238
|
+
"onUpdate": "no action"
|
|
239
|
+
}
|
|
240
|
+
},
|
|
241
|
+
"compositePrimaryKeys": {},
|
|
242
|
+
"uniqueConstraints": {
|
|
243
|
+
"files_base_id_file_path_unique": {
|
|
244
|
+
"name": "files_base_id_file_path_unique",
|
|
245
|
+
"nullsNotDistinct": false,
|
|
246
|
+
"columns": ["base_id", "file_path"]
|
|
247
|
+
}
|
|
248
|
+
},
|
|
249
|
+
"policies": {},
|
|
250
|
+
"checkConstraints": {},
|
|
251
|
+
"isRLSEnabled": false
|
|
252
|
+
}
|
|
253
|
+
},
|
|
254
|
+
"enums": {},
|
|
255
|
+
"schemas": {},
|
|
256
|
+
"sequences": {},
|
|
257
|
+
"roles": {},
|
|
258
|
+
"policies": {},
|
|
259
|
+
"views": {},
|
|
260
|
+
"_meta": {
|
|
261
|
+
"columns": {},
|
|
262
|
+
"schemas": {},
|
|
263
|
+
"tables": {}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "7",
|
|
3
|
+
"dialect": "postgresql",
|
|
4
|
+
"entries": [
|
|
5
|
+
{
|
|
6
|
+
"idx": 0,
|
|
7
|
+
"version": "7",
|
|
8
|
+
"when": 1776198771489,
|
|
9
|
+
"tag": "0000_supreme_baron_strucker",
|
|
10
|
+
"breakpoints": true
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"idx": 1,
|
|
14
|
+
"version": "7",
|
|
15
|
+
"when": 1777114924498,
|
|
16
|
+
"tag": "0001_keen_komodo",
|
|
17
|
+
"breakpoints": true
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"idx": 2,
|
|
21
|
+
"version": "7",
|
|
22
|
+
"when": 1745612400000,
|
|
23
|
+
"tag": "0002_pg_trgm",
|
|
24
|
+
"breakpoints": true
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"idx": 3,
|
|
28
|
+
"version": "7",
|
|
29
|
+
"when": 1779308820924,
|
|
30
|
+
"tag": "0003_wooden_spacker_dave",
|
|
31
|
+
"breakpoints": true
|
|
32
|
+
}
|
|
33
|
+
]
|
|
34
|
+
}
|
package/dist/main.js
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import{defineCommand as rn,runMain as on}from"citty";var q={name:"@tichopad/notes-query-tool",type:"module",version:"0.1.0",description:"CLI tool for indexing and querying Markdown notes",engines:{node:">=24"},packageManager:"pnpm@10.32.1",main:"dist/main.js",bin:{nqt:"dist/main.js"},files:["dist"],scripts:{"db:delete-stale-lock":"rm ./dbdata/postmaster.pid","db:generate":"drizzle-kit generate","db:query":"node scripts/query.ts","db:push":"drizzle-kit push","db:studio":"drizzle-kit studio","benchdata:load":"pnpm run dev load --glob 'benchdata/**/*.md'","benchdata:reindex":"rm -rf dbdata && pnpm run benchdata:load","testdata:load":"pnpm run dev load --glob 'testdata/**/*.md'","testdata:reindex":"rm -rf dbdata && pnpm run testdata:load",dev:"node src/main.ts",build:"node scripts/build.ts",test:"node --test --test-reporter=spec 'src/**/*.test.ts'",bench:"node --test --test-reporter=spec 'bench/**/*.test.ts'",check:"biome check . && tsc --noEmit && pnpm run test",fix:"biome check --write ."},dependencies:{"@electric-sql/pglite":"0.4.4","@huggingface/transformers":"4.1.0",citty:"0.2.2",consola:"3.4.2","drizzle-orm":"0.45.2",marked:"18.0.1",yaml:"2.8.3"},devDependencies:{"@biomejs/biome":"2.4.12","@types/node":"24.12.2","drizzle-kit":"0.31.10",esbuild:"0.28.0",typescript:"6.0.2"},pnpm:{onlyBuiltDependencies:["esbuild","onnxruntime-node","protobufjs","sharp"],patchedDependencies:{"drizzle-kit@0.31.10":"patches/drizzle-kit@0.31.10.patch"}}};import{createInterface as it}from"node:readline";import{defineCommand as at}from"citty";import{eq as pe}from"drizzle-orm";import{PGlite as Xe}from"@electric-sql/pglite";import{pg_trgm as Je}from"@electric-sql/pglite/contrib/pg_trgm";import{unaccent as Ye}from"@electric-sql/pglite/contrib/unaccent";import{vector as Ze}from"@electric-sql/pglite/vector";import{drizzle as et}from"drizzle-orm/pglite";import{homedir as Ke}from"node:os";import{join as J}from"node:path";var Y="onnx-community/embeddinggemma-300m-ONNX",Z="fp32",ee=768;function Ve(){let e=process.env.XDG_DATA_HOME,t=e&&e.length>0?e:J(Ke(),".local","share");return`${J(t,"nqt")}/`}var te=Ve(),ne=2e3,re=30,oe=20,se=20,ie=.3,ae=.4,ue=.3,ce=.3,le=.2,de=.4,me=10;var tt={unaccent:Ye,vector:Ze,pg_trgm:Je};function nt(e=te){let t=new Xe({dataDir:e,extensions:tt});return et({client:t})}var z;function x(){return z||(z=nt()),z}import{sql as fe}from"drizzle-orm";import{integer as rt,pgTable as ot,text as st,timestamp as ge}from"drizzle-orm/pg-core";var k=ot("bases",{id:rt("id").primaryKey().generatedAlwaysAsIdentity(),name:st("name").notNull().unique(),createdAt:ge("created_at").notNull().default(fe`now()`),updatedAt:ge("updated_at").notNull().default(fe`now()`)});var T=class{db;constructor(t){this.db=t??x()}async getBaseByName(t){let[r]=await this.db.select().from(k).where(pe(k.name,t)).limit(1);return r}async getOrCreateBase(t){let r=await this.getBaseByName(t);if(r)return r;let[n]=await this.db.insert(k).values({name:t}).returning();if(!n)throw new Error(`Failed to create base: ${t}`);return n}async deleteBase(t){await this.db.delete(k).where(pe(k.name,t))}};var be=at({meta:{name:"drop",description:"Drop a knowledge base and all its indexed data"},args:{base:{type:"string",description:"Knowledge base name to drop",default:"default"},force:{type:"boolean",description:"Skip confirmation prompt",default:!1}},async run({args:e}){let t=new T;if(await t.getBaseByName(e.base)||(console.error(`Error: Base '${e.base}' not found.`),process.exit(1)),!e.force&&!await ut(`Are you sure you want to drop base '${e.base}'? [y/N] `)){console.log("Aborted.");return}await t.deleteBase(e.base),console.log(`Base '${e.base}' dropped.`)}});function ut(e){return new Promise(t=>{let r=it({input:process.stdin,output:process.stdout});r.question(e,n=>{r.close(),t(n.toLowerCase()==="y"||n.toLowerCase()==="yes")})})}import{createHash as Qt}from"node:crypto";import{readFile as Wt}from"node:fs/promises";import{defineCommand as jt}from"citty";import{pipeline as dt}from"@huggingface/transformers";import{createConsola as ct}from"consola";function lt(){let e=process.env.NQT_LOG_LEVEL;if(e!==void 0){let t=Number(e);if(Number.isInteger(t)&&t>=0&&t<=5)return t}return 3}var R=ct({level:lt()});function he(e){R.level=e}var m={info(e,...t){R.info(e,...t)},warn(e,...t){R.warn(e,...t)},error(e,...t){R.error(e,...t)},debug(e,...t){R.debug(e,...t)},trace(e,...t){R.trace(e,...t)}};async function G(e){return await dt("feature-extraction",Y,{device:e,dtype:Z})}function mt(e){let t=Array.from(e);return t.some(r=>!Number.isFinite(r))?[]:t}var ft="task: search result | query: ",gt="title: ",pt=" | text: ",bt="none";async function L(){let e,t="webgpu";try{e=await G("webgpu"),m.debug("Embedder loaded on WebGPU")}catch{m.warn("WebGPU unavailable, using CPU."),t="cpu",e=await G("cpu"),m.debug("Embedder loaded on CPU")}async function r(n){let o=await e(n,{pooling:"mean",normalize:!0}),s=mt(o.data);if(s.length>0)return s;if(t==="webgpu")return m.warn("WebGPU produced invalid embeddings, falling back to CPU..."),t="cpu",e=await G("cpu"),m.debug("Embedder loaded on CPU"),r(n);throw new Error("Embedding model produced non-finite values")}return{embedQuery(n){return r(ft+n)},embedDocument(n,o){let s=o?.trim()||bt;return r(gt+s+pt+n)}}}import{marked as ht}from"marked";var ye=6;function Ie(e,t){if(t<=0)throw new Error("limit must be > 0");if(e.length===0)return[];if(e.trim().length===0)return[];let r=yt(e);if(r.length===0)return[];let n=xt(r),o=Ee(n,[],t);return Rt(o,t)}function yt(e){let t=ht.lexer(e),r=[],n=0;for(let o of t){let s=o.raw??"",a=n,u=n+s.length;r.push({token:o,start:a,end:u,raw:s}),n=u}return r}function xt(e){return{heading:null,level:0,body:e,start:e[0]?.start??0,end:e[e.length-1]?.end??0}}function wt(e){let t=ye+1;for(let o of e)if(we(o.token)){let s=o.token.depth;s<t&&(t=s)}if(t>ye)return null;let r=[],n=null;for(let o of e)we(o.token)&&o.token.depth===t?(n&&r.push(xe(n)),n={heading:o,level:t,body:[],start:o.start,end:o.end}):(n||(n={heading:null,level:0,body:[],start:o.start,end:o.end}),n.body.push(o),n.end=o.end);return n&&r.push(xe(n)),r}function xe(e){let t=e.body[e.body.length-1];return t?e.end=t.end:e.heading&&(e.end=e.heading.end),e}function we(e){return e.type==="heading"}function Ee(e,t,r){let n=e.heading?$t(e.heading):null,o=n?[...t,n]:t,s=e.body[0]?.start??e.heading?.end??e.start,a=e.body[e.body.length-1]?.end??e.heading?.end??e.end,u=Et(e.body),i=e.heading?`${n}
|
|
3
|
+
|
|
4
|
+
`:"",d=N(i+u),c=W(t,d,r);if(c!==null&&c.text.length<=r&&d.length>0)return[{text:c.text,breadcrumb:c.breadcrumb,startOffset:e.heading?e.heading.start:s,endOffset:a}];let l=wt(e.body);if(l&&l.length>0&&l.some(b=>b.heading!==null)){let b=[];for(let p of l)p.heading===null?p.body.some(h=>h.raw.trim().length>0)&&b.push(...ke(p.body,o,r)):b.push(...Ee(p,o,r));return b}return ke(e.body,o,r)}function ke(e,t,r){if(e.length===0)return[];let n=[];for(let o of e){let s=N(o.raw);if(s.trim().length===0)continue;let a=W(t,s,r);a!==null&&a.text.length<=r?n.push({text:a.text,breadcrumb:a.breadcrumb,startOffset:o.start,endOffset:o.end}):n.push(...kt(o,t,r))}return n}function kt(e,t,r){let n=N(e.raw),o=Tt(n);return o.length>1?Pt(o,e.start,t,r,s=>Te(s,r,Q(t,r))):It(Te(n,r,Q(t,r)),e.start,t,r)}function Tt(e){let t=[],r=/[^.!?]+[.!?]+(?:\s+|$)/g,n=0,o;for(;(o=r.exec(e))!==null;)t.push({text:o[0],offset:o.index}),n=o.index+o[0].length;return n<e.length&&t.push({text:e.slice(n),offset:n}),t.length===0?[{text:e,offset:0}]:t}function Te(e,t,r){let n=Math.max(1,t-r),o=[],s=/\S+\s*/g,a=[],u;for(;(u=s.exec(e))!==null;)a.push({text:u[0],offset:u.index});let i=a[0];if(!i)return Pe(e,n,0);let d="",c=i.offset;for(let l of a){if(l.text.length>n){d.length>0&&(o.push({text:d,offset:c}),d=""),o.push(...Pe(l.text,n,l.offset)),c=l.offset+l.text.length;continue}d.length+l.text.length>n?(o.push({text:d,offset:c}),d=l.text,c=l.offset):(d.length===0&&(c=l.offset),d+=l.text)}return d.length>0&&o.push({text:d,offset:c}),o}function Pe(e,t,r){let n=[];for(let o=0;o<e.length;o+=t)n.push({text:e.slice(o,o+t),offset:r+o});return n}function Pt(e,t,r,n,o){let s=Q(r,n),a=Math.max(1,n-s),u=[],i="",d=e[0]?.offset??0;for(let c of e){if(c.text.length>a){i.length>0&&(u.push(F(i,t+d,r,n)),i="");let l=o(c.text);for(let b of l)u.push(F(b.text,t+c.offset+b.offset,r,n));continue}i.length+c.text.length>a?(u.push(F(i,t+d,r,n)),i=c.text,d=c.offset):(i.length===0&&(d=c.offset),i+=c.text)}return i.length>0&&u.push(F(i,t+d,r,n)),u}function It(e,t,r,n){let o=[];for(let s of e)o.push(F(s.text,t+s.offset,r,n));return o}function F(e,t,r,n){let o=N(e),s=W(r,o,n);if(!s)throw new Error(`emit: assemble returned null for body length ${o.length}, limit ${n}`);let{text:a,breadcrumb:u}=s;if(a.length>n)throw new Error(`emit: assembled text length ${a.length} exceeds limit ${n} \u2014 body was not pre-split correctly`);return{text:a,breadcrumb:u,startOffset:t,endOffset:t+e.length}}function W(e,t,r){let n=[...e];for(;;){if(t.length<=r)return{text:t,breadcrumb:n};if(n.length===0)return null;n=n.slice(1)}}function Q(e,t){if(e.length===0)return 0;let r=`${e.join(`
|
|
5
|
+
`)}
|
|
6
|
+
|
|
7
|
+
`;return r.length>=t?0:r.length}function Et(e){let t="";for(let r of e)t+=r.raw;return t}function $t(e){return e.raw.replace(/\n+$/,"")}function N(e){return e.replace(/\n+$/,"")}function Rt(e,t){if(e.length<=1)return e;let r=[],n=e[0];if(!n)return e;let o=n;for(let s=1;s<e.length;s++){let a=e[s];if(!a)continue;if(!St(o.breadcrumb,a.breadcrumb)){r.push(o),o=a;continue}let u=`${o.text}
|
|
8
|
+
|
|
9
|
+
${a.text}`;(o.breadcrumb.length>0?`${o.breadcrumb.join(`
|
|
10
|
+
`)}
|
|
11
|
+
|
|
12
|
+
`:"").length+u.length<=t?o={text:u,breadcrumb:o.breadcrumb,startOffset:o.startOffset,endOffset:a.endOffset}:(r.push(o),o=a)}return r.push(o),r}function St(e,t){if(e.length!==t.length)return!1;for(let r=0;r<e.length;r++)if(e[r]!==t[r])return!1;return!0}import{glob as Dt}from"node:fs/promises";import{basename as _t}from"node:path";async function*$e(e){for await(let t of Dt(e,{withFileTypes:!0,exclude:r=>{let n=_t(r.name);return n!=="."&&n.startsWith(".")}}))t.isFile()&&(yield`${t.parentPath}/${t.name}`)}import{and as Ot,count as Ae,eq as B,sql as U}from"drizzle-orm";import{sql as Ce}from"drizzle-orm";import{customType as At,index as Mt,integer as j,pgTable as Lt,text as ve,timestamp as Fe,vector as Nt}from"drizzle-orm/pg-core";import{sql as Re}from"drizzle-orm";import{integer as Se,jsonb as Ct,pgTable as vt,text as De,timestamp as _e,unique as Ft}from"drizzle-orm/pg-core";var g=vt("files",{id:Se("id").primaryKey().generatedAlwaysAsIdentity(),baseId:Se("base_id").notNull().references(()=>k.id,{onDelete:"cascade"}),filePath:De("file_path").notNull(),contentHash:De("content_hash").notNull(),attributes:Ct("attributes").$type(),createdAt:_e("created_at").notNull().default(Re`now()`),updatedAt:_e("updated_at").notNull().default(Re`now()`)},e=>[Ft().on(e.baseId,e.filePath)]);var Bt=At({dataType(){return"tsvector"}}),f=Lt("chunks",{id:j("id").primaryKey().generatedAlwaysAsIdentity(),fileId:j("file_id").notNull().references(()=>g.id,{onDelete:"cascade"}),chunkIndex:j("chunk_index").notNull(),content:ve("content").notNull(),breadcrumbs:ve("breadcrumbs").array().notNull(),embedding:Nt("embedding",{dimensions:ee}),fts:Bt("fts"),createdAt:Fe("created_at").notNull().default(Ce`now()`),updatedAt:Fe("updated_at").notNull().default(Ce`now()`)},e=>[Mt("chunks_fts_idx").using("gin",e.fts)]);var O=class{db;constructor(t){this.db=t??x()}async getFileProcessingState(t,r){let[n]=await this.db.select({id:g.id,contentHash:g.contentHash}).from(g).where(Ot(B(g.filePath,t),B(g.baseId,r))).limit(1);if(!n)return null;let[o]=await this.db.select({total:Ae(),withEmbedding:Ae(U`CASE WHEN ${f.embedding} IS NOT NULL THEN 1 END`)}).from(f).where(B(f.fileId,n.id)),s=o?.total??0,a=o?.withEmbedding??0,u=s>0&&a===s;return{fileId:n.id,contentHash:n.contentHash,hasStoredChunksWithEmbeddings:u}}async upsertFile(t,r,n,o,s){let a={};n!==null&&(a.title=n);let[u]=await this.db.insert(g).values({filePath:t,contentHash:r,attributes:a,baseId:s}).onConflictDoUpdate({target:[g.baseId,g.filePath],set:{contentHash:r,attributes:a,updatedAt:U`now()`}}).returning({id:g.id});if(!u)throw new Error(`Failed to upsert file: ${t}`);return{id:u.id}}async replaceFileChunks(t,r){await this.db.transaction(async n=>{if(await n.delete(f).where(B(f.fileId,t)),r.length>0){let o=r.map(s=>({fileId:t,chunkIndex:s.chunkIndex,content:s.content,breadcrumbs:s.breadcrumbs,embedding:s.embedding,fts:U`to_tsvector('simple', unaccent(${s.content}))`}));await n.insert(f).values(o)}})}};import K from"node:path";import{parse as Ht}from"yaml";var qt=/^---\r?\n([\s\S]*?)\r?\n---\r?\n?/;function Me(e){let t=e.match(qt);if(!t)return{attributes:null,body:e};try{let r=Ht(t[1]);return{attributes:r&&typeof r=="object"&&!Array.isArray(r)?r:null,body:e.slice(t[0].length)}}catch{return{attributes:null,body:e}}}function zt(e){if(typeof e!="string")return null;let t=e.trim();return t||null}function Le(e){return Array.isArray(e)?e.flatMap(t=>{if(typeof t!="string")return[];let r=t.trim();return r?[r]:[]}):[]}function Gt(e){return e?{title:zt(e.title),aliases:Le(e.aliases),tags:Le(e.tags)}:null}function Ne(e,t,r){let n=[`File: ${e}`,`Path: ${t}`],o=Gt(r);o&&(o.title&&n.push(`Title: ${o.title}`),o.aliases.length>0&&n.push(`Aliases: ${o.aliases.join(", ")}`),o.tags.length>0&&n.push(`Tags: ${o.tags.join(", ")}`));let s=n.join(`
|
|
13
|
+
`),a=[e];o&&(o.title&&o.title!==e&&a.push(o.title),o.aliases.length>0&&a.push(`aliases: ${o.aliases.join(", ")}`),o.tags.length>0&&a.push(`tags: ${o.tags.join(", ")}`));let u=a.join("; ");return{headerPrefix:s,titleString:u}}function Be(e,t){return t===null?{action:"process"}:t.contentHash!==e?{action:"process"}:t.hasStoredChunksWithEmbeddings?{action:"skip"}:{action:"process"}}async function Oe(e,t){let{repo:r,baseId:n,readText:o,hashContent:s,chunkMarkdown:a,embedDocument:u}=t,i=await o(e),d=s(i),c=await r.getFileProcessingState(e,n),l=Be(d,c);if(m.debug(`[${e}] decision: ${l.action}`),l.action==="skip")return m.info(`${e} -> skipped (unchanged)`),{status:"skipped",chunkCount:0};let{attributes:b,body:p}=Me(i),h=K.basename(e,".md"),y=K.basename(K.dirname(e)),{headerPrefix:$,titleString:S}=Ne(h,y,b),P=a(p||i,ne);m.debug(`[${e}] produced ${P.length} chunks`);let{id:A}=await r.upsertFile(e,d,null,new Date,n),M=await Promise.all(P.map(async(D,_)=>{let C=`${$}
|
|
14
|
+
|
|
15
|
+
${D.text}`,v=D.text.trim(),I=v?await u(v,S):await u(C,S);return m.trace(`[${e}] chunk ${_} embedded (${I.length}d)`),{content:C,embedding:I,chunkIndex:_,breadcrumbs:D.breadcrumb}}));return await r.replaceFileChunks(A,M),m.debug(`[${e}] chunks written to DB`),m.info(`${e} \u2192 ${P.length} chunks`),{status:"processed",chunkCount:P.length}}var He=jt({meta:{name:"load",description:"Load notes files"},args:{glob:{type:"string",description:"Files glob (e.g. 'notes/**/*.md')",required:!0},base:{type:"string",description:"Knowledge base name to use",default:"default"}},async run({args:e}){let t=performance.now();m.debug("Starting load...");let r=0,n=0,o=0,s=0,a=new O,i=await new T().getOrCreateBase(e.base);m.debug(`Using base: ${i.name} (id=${i.id})`);let d=null,c=async(p,h)=>(d||(d=await L(),m.debug("Embedder initialised")),d.embedDocument(p,h)),l=[],b=[];for await(let p of $e(e.glob)){m.debug(`Processing file: ${p}`);let h=await Oe(p,{repo:a,baseId:i.id,readText:y=>Wt(y,"utf8"),hashContent:y=>Qt("sha256").update(y).digest("hex"),chunkMarkdown:Ie,embedDocument:c});l.push(p),b.push(h)}r=l.length;for(let p of b)p.status==="skipped"?n++:(o++,s+=p.chunkCount);console.log(`Done. ${r} files seen, ${o} processed, ${n} skipped, ${s} chunks total.`),console.log(`Time taken: ${((performance.now()-t)/1e3).toFixed(2)}s`)}});import{defineCommand as Jt}from"citty";import{and as V,cosineDistance as Vt,desc as X,eq as E,gt as Xt,sql as w}from"drizzle-orm";import Ut from"node:path";function qe(e,t,r,n){m.trace(`Fusing scores \u2014 vector: ${e.length}, fts: ${t.length}, trigram: ${r.length}`);let o=Math.max(...e.map(i=>i.similarity),1e-9),s=Math.max(...t.map(i=>i.rank),1e-9),a=Math.max(...r.map(i=>i.score),1e-9),u=new Map;for(let i of e)u.set(i.id,{id:i.id,filePath:i.filePath,chunkIndex:i.chunkIndex,breadcrumbs:i.breadcrumbs,content:i.content,score:i.similarity/o*n.vector});for(let i of t){let d=i.rank/s*n.fts,c=u.get(i.id);c?c.score+=d:u.set(i.id,{id:i.id,filePath:i.filePath,chunkIndex:i.chunkIndex,breadcrumbs:i.breadcrumbs,content:i.content,score:d})}for(let i of r){let d=i.score/a*n.trigram,c=u.get(i.id);c?c.score+=d:u.set(i.id,{id:i.id,filePath:i.filePath,chunkIndex:i.chunkIndex,breadcrumbs:i.breadcrumbs,content:i.content,score:d})}return u}function Kt(e){let t=/\[\[([^\]|#]+)(?:[|#][^\]]*)?\]\]/g,r=new Set,n=t.exec(e);for(;n!==null;)n[1]!==void 0&&r.add(n[1].trim()),n=t.exec(e);return[...r]}function ze(e,t,r=me,n=le,o=de){let s=new Map;for(let c of t){let l=Ut.basename(c,".md");s.has(l)||s.set(l,new Set),s.get(l)?.add(c)}let a=new Set([...e.values()].map(c=>c.filePath)),u=[...e.values()].sort((c,l)=>l.score-c.score).slice(0,r),i=new Map;for(let c of u){let l=Kt(c.content);for(let b of l){let p=s.get(b);if(p)for(let h of p){if(h===c.filePath||!a.has(h))continue;let y=i.get(h)??0,$=Math.min(y+n*c.score,o);i.set(h,$),m.trace(`Boosting ${h} by ${($-y).toFixed(4)}`)}}}let d=new Map;for(let[c,l]of e){let b=i.get(l.filePath)??0;d.set(c,b>0?{...l,score:l.score+b}:l)}return d}function Ge(e,t){let r=new Map;for(let n of e.values()){let o=r.get(n.filePath);!o||n.score>o.result.score?r.set(n.filePath,{result:n,extraChunks:o?o.extraChunks+1:0}):o.extraChunks++}return[...r.values()].map(({result:n})=>n).sort((n,o)=>o.score-n.score).slice(0,t)}async function Qe(e){let{vectorText:t,queryText:r,trigramText:n,embedQuery:o,db:s=x(),baseId:a,weights:u={vector:ie,fts:ae,trigram:ue},limits:i={vector:re,fts:oe,trigram:se},trigramThreshold:d=ce,trigramMode:c="strict",topK:l=10}=e,b=await o(t),p=n??r;m.debug(`Executing query \u2014 vector: "${t}", fulltext: "${r}"`);let h=w`1 - (${Vt(f.embedding,b)})`,y=c==="strict"?"strict_word_similarity":"word_similarity",$=c==="strict"?w.raw("<<%"):w.raw("<%"),S=w`${w.raw(y)}(${p}, ${f.content})`,[P,A,M]=await Promise.all([s.select({id:f.id,filePath:g.filePath,chunkIndex:f.chunkIndex,breadcrumbs:f.breadcrumbs,content:f.content,similarity:h}).from(f).innerJoin(g,E(f.fileId,g.id)).where(V(Xt(h,0),E(g.baseId,a))).orderBy(X(h)).limit(i.vector),s.select({id:f.id,filePath:g.filePath,chunkIndex:f.chunkIndex,breadcrumbs:f.breadcrumbs,content:f.content,rank:w`ts_rank(${f.fts}, websearch_to_tsquery('simple', unaccent(${r})))`}).from(f).innerJoin(g,E(f.fileId,g.id)).where(V(w`${f.fts} @@ websearch_to_tsquery('simple', unaccent(${r}))`,E(g.baseId,a))).orderBy(X(w`ts_rank(${f.fts}, websearch_to_tsquery('simple', unaccent(${r})))`)).limit(i.fts),s.transaction(async I=>(await I.execute(w`SELECT set_limit(${d})`),I.select({id:f.id,filePath:g.filePath,chunkIndex:f.chunkIndex,breadcrumbs:f.breadcrumbs,content:f.content,score:S}).from(f).innerJoin(g,E(f.fileId,g.id)).where(V(w`${p} ${$} ${f.content}`,E(g.baseId,a))).orderBy(X(S)).limit(i.trigram)))]);m.debug(`Vector: ${P.length} hits, FTS: ${A.length} hits, Trigram: ${M.length} hits`);let D=await s.select({filePath:g.filePath}).from(g).where(E(g.baseId,a)),_=qe(P,A,M,u);m.debug(`After fusion: ${_.size} unique chunks`);let C=ze(_,D.map(I=>I.filePath));m.debug(`After wikilink rerank: ${C.size} chunks`);let v=Ge(C,l);return m.debug(`Returning ${v.length} results`),v}var We=Jt({meta:{name:"query",description:"Search notes by semantic query"},args:{vector:{type:"string",alias:"v",description:"Semantic query for vector search",required:!0},fulltext:{type:"string",alias:"f",description:'Keyword query for full-text search (supports PostgreSQL websearch syntax: OR, -word, "phrases")',required:!0},trigram:{type:"string",alias:"g",description:"Plain-text keyword for trigram search (defaults to --fulltext)",required:!1},trigramMode:{type:"string",alias:"t",description:"Trigram operator: 'strict' (strict_word_similarity, <<%) or 'word' (word_similarity, <%)",default:"strict"},base:{type:"string",description:"Knowledge base name to use",default:"default"}},async run({args:e}){let t=e.trigramMode;if(t!=="strict"&&t!=="word")throw new Error(`Invalid --trigram-mode "${t}". Must be "strict" or "word".`);let n=await new T().getBaseByName(e.base);n||(m.error(`Base '${e.base}' does not exist.`),process.exit(1));let o=await L(),s=await Qe({vectorText:e.vector,queryText:e.fulltext,trigramText:e.trigram,embedQuery:o.embedQuery.bind(o),trigramMode:t,baseId:n.id});if(s.length===0){m.info("No matching chunks found.");return}for(let a of s){let u="";u+=`<file path="${a.filePath}">
|
|
16
|
+
`,u+=`<meta>
|
|
17
|
+
`,u+=`Chunk index: ${a.chunkIndex}
|
|
18
|
+
`,u+=`Score: ${Number(a.score).toFixed(3)}
|
|
19
|
+
`,a.breadcrumbs.length>0&&(u+=`Breadcrumbs: ${a.breadcrumbs.join(" > ")}
|
|
20
|
+
`),u+=`</meta>
|
|
21
|
+
`,u+=`<content>
|
|
22
|
+
`,u+=`${a.content}
|
|
23
|
+
`,u+=`</content>
|
|
24
|
+
`,u+=`</file>
|
|
25
|
+
`,console.log(u)}}});import{join as Yt}from"node:path";import{fileURLToPath as Zt}from"node:url";import{migrate as en}from"drizzle-orm/pglite/migrator";var tn="./drizzle",nn=Yt(Zt(new URL(".",import.meta.url)),tn);async function je(e){try{m.debug("Running DB migrations..."),await en(e,{migrationsFolder:nn}),m.debug("Migrations complete")}catch(t){throw new Error(`Migration failed: ${t instanceof Error?t.message:String(t)}`,{cause:t})}}var sn=rn({meta:{name:"notes-query-tool",version:q.version,description:q.description,alias:"nqt"},args:{verbose:{type:"boolean",description:"Enable verbose logging (sets log level to max)",default:!1},base:{type:"string",description:"Knowledge base name to use",default:"default"}},subCommands:{load:He,query:We,drop:be},async setup({args:e}){e.verbose&&he(999);let t=x();await t.$client.waitReady,await je(t)},async cleanup(){await x().$client.close()}});await on(sn).catch(e=>{H(`Error: ${e}`,1)});process.on("unhandledRejection",e=>{H(`Unhandled Rejection: ${e}`,1)});process.on("uncaughtException",e=>{H(`Uncaught Exception: ${e}`,1)});process.on("SIGINT",()=>{H("Received SIGINT, shutting down...",0)});function H(e,t){m.error(e),x().$client.close().finally(()=>process.exit(t))}
|
|
26
|
+
//# sourceMappingURL=main.js.map
|
package/dist/main.js.map
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/main.ts", "../package.json", "../src/commands/drop.ts", "../src/database/base-repository.ts", "../src/database/client.ts", "../src/config.ts", "../src/database/schema/bases.ts", "../src/commands/load.ts", "../src/embedder.ts", "../src/logger.ts", "../src/files/chunker.ts", "../src/files/load-files.ts", "../src/commands/load/load-repository.ts", "../src/database/schema/chunks.ts", "../src/database/schema/files.ts", "../src/commands/load/process-file.ts", "../src/files/frontmatter.ts", "../src/commands/load/build-document-header.ts", "../src/commands/load/decide-file-processing.ts", "../src/commands/query.ts", "../src/query/execute.ts", "../src/query/scoring.ts", "../src/database/migrate.ts"],
|
|
4
|
+
"mappings": "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",
|
|
5
|
+
"names": ["defineCommand", "runMain", "package_default", "createInterface", "defineCommand", "eq", "PGlite", "pg_trgm", "unaccent", "vector", "drizzle", "homedir", "join", "MODEL_ID", "MODEL_DTYPE", "EMBEDDING_DIMS", "getDataDir", "xdg", "base", "DB_DATA_DIR", "CHUNK_LIMIT_CHARS", "VECTOR_LIMIT", "FTS_LIMIT", "TRIGRAM_LIMIT", "VECTOR_WEIGHT", "FTS_WEIGHT", "TRIGRAM_WEIGHT", "TRIGRAM_THRESHOLD", "LINK_BOOST", "LINK_BOOST_CAP", "LINK_SOURCE_TOP_N", "DB_EXTENSIONS", "unaccent", "vector", "pg_trgm", "createDbClient", "dataDir", "DB_DATA_DIR", "pglite", "PGlite", "drizzle", "_db", "getDb", "sql", "integer", "pgTable", "text", "timestamp", "basesTable", "DbBaseRepository", "db", "getDb", "name", "base", "basesTable", "eq", "existing", "created", "dropCommand", "defineCommand", "args", "baseRepo", "DbBaseRepository", "confirm", "prompt", "resolve", "rl", "createInterface", "answer", "createHash", "readFile", "defineCommand", "pipeline", "createConsola", "resolveLevel", "raw", "n", "_consola", "setLogLevel", "level", "logger", "message", "args", "createEmbedder", "device", "pipeline", "MODEL_ID", "MODEL_DTYPE", "extractVector", "data", "vector", "v", "QUERY_PREFIX", "DOC_PREFIX_PREFIX", "DOC_PREFIX_INFIX", "DEFAULT_TITLE", "initEmbedder", "embed", "logger", "getEmbedding", "text", "result", "body", "title", "t", "marked", "MAX_HEADER_LEVEL", "chunkMarkdown", "md", "limit", "pos", "lexWithOffsets", "root", "buildRootSection", "chunks", "renderSection", "greedyMerge", "tokens", "out", "cursor", "t", "raw", "start", "end", "groupByShallowestHeading", "body", "shallowest", "pt", "isHeading", "lvl", "sections", "current", "finalizeSection", "s", "last", "section", "ancestors", "headingLine", "headingLineOf", "childAncestors", "bodyStart", "bodyEnd", "bodyText", "concatRaw", "ownHeadingPrefix", "fullBody", "trimTrailingNewlines", "assembled", "assemble", "subs", "sub", "splitBody", "trimmedRaw", "splitOversizeBlock", "sentences", "splitSentences", "assembleSlices", "remaining", "splitWordsThenChars", "breadcrumbBudgetSize", "assembleSlicesRaw", "slices", "regex", "lastEnd", "m", "budget", "avail", "wordRegex", "words", "first", "hardSlice", "cur", "curOffset", "w", "text", "size", "baseOffset", "i", "furtherSplit", "buf", "bufOffset", "emit", "finer", "f", "startOffset", "trimmed", "a", "breadcrumb", "prefix", "next", "sameBreadcrumb", "mergedBody", "b", "glob", "basename", "loadFilesByGlob", "globPattern", "entry", "f", "b", "and", "count", "eq", "sql", "sql", "customType", "index", "integer", "pgTable", "text", "timestamp", "vector", "sql", "integer", "jsonb", "pgTable", "text", "timestamp", "unique", "filesTable", "pgTable", "integer", "basesTable", "text", "jsonb", "timestamp", "sql", "table", "unique", "tsvector", "customType", "chunksTable", "pgTable", "integer", "filesTable", "text", "vector", "EMBEDDING_DIMS", "timestamp", "sql", "table", "index", "DbLoadRepository", "db", "getDb", "filePath", "baseId", "file", "filesTable", "and", "eq", "chunkResult", "count", "sql", "chunksTable", "total", "withEmbedding", "hasStoredChunksWithEmbeddings", "contentHash", "title", "_updatedAt", "attributes", "fileId", "chunks", "tx", "newChunks", "chunk", "path", "parseYaml", "FRONTMATTER_RE", "extractFrontmatter", "content", "match", "parsed", "normalizeTitle", "value", "title", "normalizeStringList", "item", "normalized", "normalizeDocumentMetadata", "attributes", "buildDocumentHeader", "basename", "parentDir", "headerLines", "metadata", "headerPrefix", "titleParts", "titleString", "decideFileProcessing", "nextContentHash", "existing", "processLoadedFile", "filePath", "deps", "repo", "baseId", "readText", "hashContent", "chunkMarkdown", "embedDocument", "content", "contentHash", "existingState", "decision", "decideFileProcessing", "logger", "attributes", "body", "extractFrontmatter", "basename", "path", "parentDir", "headerPrefix", "titleString", "buildDocumentHeader", "chunks", "CHUNK_LIMIT_CHARS", "fileId", "chunkDocs", "chunk", "i", "augmented", "bodyText", "embedding", "loadCommand", "defineCommand", "args", "start", "logger", "filesSeen", "filesSkipped", "filesProcessed", "chunksProduced", "repo", "DbLoadRepository", "base", "DbBaseRepository", "embedder", "getEmbedDocument", "body", "title", "initEmbedder", "filePaths", "results", "filePath", "loadFilesByGlob", "result", "processLoadedFile", "p", "readFile", "content", "createHash", "chunkMarkdown", "defineCommand", "and", "cosineDistance", "desc", "eq", "gt", "sql", "path", "fuseScores", "vectorResults", "ftsResults", "trigramResults", "weights", "logger", "maxSimilarity", "r", "maxRank", "maxTrigram", "merged", "ftsScore", "existing", "tgScore", "extractWikilinks", "content", "re", "seen", "m", "rerankByWikilinks", "allFilePaths", "topN", "LINK_SOURCE_TOP_N", "linkBoost", "LINK_BOOST", "linkBoostCap", "LINK_BOOST_CAP", "basenameToFilePaths", "fp", "base", "path", "filePathsInResults", "topSources", "a", "b", "boosts", "src", "links", "link", "targets", "prev", "boost", "result", "id", "chunk", "poolByFile", "topK", "byFile", "executeQuery", "opts", "vectorText", "queryText", "trigramText", "embedQuery", "db", "getDb", "baseId", "weights", "VECTOR_WEIGHT", "FTS_WEIGHT", "TRIGRAM_WEIGHT", "limits", "VECTOR_LIMIT", "FTS_LIMIT", "TRIGRAM_LIMIT", "trigramThreshold", "TRIGRAM_THRESHOLD", "trigramMode", "topK", "queryVector", "effectiveTrigramText", "logger", "similarity", "sql", "cosineDistance", "chunksTable", "trigramFn", "trigramOp", "trigramScore", "vectorResults", "ftsResults", "trigramResults", "filesTable", "eq", "and", "gt", "desc", "tx", "allFiles", "fused", "fuseScores", "reranked", "rerankByWikilinks", "f", "results", "poolByFile", "queryCommand", "defineCommand", "args", "mode", "base", "DbBaseRepository", "logger", "embedder", "initEmbedder", "results", "executeQuery", "row", "output", "join", "fileURLToPath", "migrate", "migrationsRelativePath", "migrationsFolder", "join", "fileURLToPath", "runMigrations", "db", "logger", "migrate", "err", "main", "defineCommand", "package_default", "loadCommand", "queryCommand", "dropCommand", "args", "setLogLevel", "db", "getDb", "runMigrations", "runMain", "error", "closeDbAndExit", "reason", "message", "code", "logger"]
|
|
6
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@tichopad/notes-query-tool",
|
|
3
|
+
"type": "module",
|
|
4
|
+
"version": "0.1.0",
|
|
5
|
+
"description": "CLI tool for indexing and querying Markdown notes",
|
|
6
|
+
"engines": {
|
|
7
|
+
"node": ">=24"
|
|
8
|
+
},
|
|
9
|
+
"packageManager": "pnpm@10.32.1",
|
|
10
|
+
"main": "dist/main.js",
|
|
11
|
+
"bin": {
|
|
12
|
+
"nqt": "dist/main.js"
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist"
|
|
16
|
+
],
|
|
17
|
+
"scripts": {
|
|
18
|
+
"db:delete-stale-lock": "rm ./dbdata/postmaster.pid",
|
|
19
|
+
"db:generate": "drizzle-kit generate",
|
|
20
|
+
"db:query": "node scripts/query.ts",
|
|
21
|
+
"db:push": "drizzle-kit push",
|
|
22
|
+
"db:studio": "drizzle-kit studio",
|
|
23
|
+
"benchdata:load": "pnpm run dev load --glob 'benchdata/**/*.md'",
|
|
24
|
+
"benchdata:reindex": "rm -rf dbdata && pnpm run benchdata:load",
|
|
25
|
+
"testdata:load": "pnpm run dev load --glob 'testdata/**/*.md'",
|
|
26
|
+
"testdata:reindex": "rm -rf dbdata && pnpm run testdata:load",
|
|
27
|
+
"dev": "node src/main.ts",
|
|
28
|
+
"build": "node scripts/build.ts",
|
|
29
|
+
"test": "node --test --test-reporter=spec 'src/**/*.test.ts'",
|
|
30
|
+
"bench": "node --test --test-reporter=spec 'bench/**/*.test.ts'",
|
|
31
|
+
"check": "biome check . && tsc --noEmit && pnpm run test",
|
|
32
|
+
"fix": "biome check --write ."
|
|
33
|
+
},
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"@electric-sql/pglite": "0.4.4",
|
|
36
|
+
"@huggingface/transformers": "4.1.0",
|
|
37
|
+
"citty": "0.2.2",
|
|
38
|
+
"consola": "3.4.2",
|
|
39
|
+
"drizzle-orm": "0.45.2",
|
|
40
|
+
"marked": "18.0.1",
|
|
41
|
+
"yaml": "2.8.3"
|
|
42
|
+
},
|
|
43
|
+
"devDependencies": {
|
|
44
|
+
"@biomejs/biome": "2.4.12",
|
|
45
|
+
"@types/node": "24.12.2",
|
|
46
|
+
"drizzle-kit": "0.31.10",
|
|
47
|
+
"esbuild": "0.28.0",
|
|
48
|
+
"typescript": "6.0.2"
|
|
49
|
+
},
|
|
50
|
+
"pnpm": {
|
|
51
|
+
"onlyBuiltDependencies": [
|
|
52
|
+
"esbuild",
|
|
53
|
+
"onnxruntime-node",
|
|
54
|
+
"protobufjs",
|
|
55
|
+
"sharp"
|
|
56
|
+
],
|
|
57
|
+
"patchedDependencies": {
|
|
58
|
+
"drizzle-kit@0.31.10": "patches/drizzle-kit@0.31.10.patch"
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|