db-mcp 1.0.2 → 1.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/.gitattributes +2 -0
- package/LICENSE +1 -1
- package/README.md +244 -518
- package/dist/chunk-4IA3DB5C.js +135 -0
- package/dist/chunk-AOUL5SHS.js +930 -0
- package/dist/chunk-DWJXQEFA.js +13759 -0
- package/dist/chunk-DZQLDEQS.js +879 -0
- package/dist/chunk-S5IDDSSB.js +74 -0
- package/dist/chunk-Z2GFQU3G.js +363 -0
- package/dist/cli.d.ts +0 -7
- package/dist/cli.js +227 -183
- package/dist/http-VSB7DBJR.js +1541 -0
- package/dist/index.d.ts +842 -10
- package/dist/index.js +5 -17
- package/dist/sqlite-VHBA4ABV.js +600 -0
- package/dist/sqlite-native-D2LH5ZT7.js +2498 -0
- package/dist/worker-script.d.ts +2 -0
- package/dist/worker-script.js +126 -0
- package/package.json +26 -16
- package/playwright.config.ts +101 -0
- package/scripts/generate-server-instructions.ts +111 -0
- package/server.json +5 -6
- package/test-server/README.md +118 -0
- package/test-server/code-map.md +409 -0
- package/test-server/fixtures/sample.csv +6 -0
- package/test-server/reset-database.ps1 +373 -0
- package/test-server/sample.csv +11 -0
- package/test-server/test-agent-experience.md +243 -0
- package/test-server/test-database.sql +388 -0
- package/test-server/test-group-tools.md +861 -0
- package/test-server/test-help-resources.mjs +238 -0
- package/test-server/test-preflight.md +53 -0
- package/test-server/test-prompts.md +354 -0
- package/test-server/test-resources.md +245 -0
- package/test-server/test-tool-annotations.mjs +157 -0
- package/test-server/test-tools-advanced-1.md +517 -0
- package/test-server/test-tools-advanced-2.md +487 -0
- package/test-server/test-tools-codemode.md +629 -0
- package/test-server/test-tools.md +176 -0
- package/test-server/tool-reference.md +236 -0
- package/tsconfig.test.json +9 -0
- package/dist/adapters/DatabaseAdapter.d.ts +0 -141
- package/dist/adapters/DatabaseAdapter.d.ts.map +0 -1
- package/dist/adapters/DatabaseAdapter.js +0 -131
- package/dist/adapters/DatabaseAdapter.js.map +0 -1
- package/dist/adapters/sqlite/SchemaManager.d.ts +0 -58
- package/dist/adapters/sqlite/SchemaManager.d.ts.map +0 -1
- package/dist/adapters/sqlite/SchemaManager.js +0 -187
- package/dist/adapters/sqlite/SchemaManager.js.map +0 -1
- package/dist/adapters/sqlite/SqliteAdapter.d.ts +0 -161
- package/dist/adapters/sqlite/SqliteAdapter.d.ts.map +0 -1
- package/dist/adapters/sqlite/SqliteAdapter.js +0 -741
- package/dist/adapters/sqlite/SqliteAdapter.js.map +0 -1
- package/dist/adapters/sqlite/index.d.ts +0 -9
- package/dist/adapters/sqlite/index.d.ts.map +0 -1
- package/dist/adapters/sqlite/index.js +0 -8
- package/dist/adapters/sqlite/index.js.map +0 -1
- package/dist/adapters/sqlite/json-utils.d.ts +0 -100
- package/dist/adapters/sqlite/json-utils.d.ts.map +0 -1
- package/dist/adapters/sqlite/json-utils.js +0 -274
- package/dist/adapters/sqlite/json-utils.js.map +0 -1
- package/dist/adapters/sqlite/output-schemas.d.ts +0 -1187
- package/dist/adapters/sqlite/output-schemas.d.ts.map +0 -1
- package/dist/adapters/sqlite/output-schemas.js +0 -1337
- package/dist/adapters/sqlite/output-schemas.js.map +0 -1
- package/dist/adapters/sqlite/prompts.d.ts +0 -13
- package/dist/adapters/sqlite/prompts.d.ts.map +0 -1
- package/dist/adapters/sqlite/prompts.js +0 -605
- package/dist/adapters/sqlite/prompts.js.map +0 -1
- package/dist/adapters/sqlite/resources.d.ts +0 -13
- package/dist/adapters/sqlite/resources.d.ts.map +0 -1
- package/dist/adapters/sqlite/resources.js +0 -251
- package/dist/adapters/sqlite/resources.js.map +0 -1
- package/dist/adapters/sqlite/tools/admin.d.ts +0 -14
- package/dist/adapters/sqlite/tools/admin.d.ts.map +0 -1
- package/dist/adapters/sqlite/tools/admin.js +0 -788
- package/dist/adapters/sqlite/tools/admin.js.map +0 -1
- package/dist/adapters/sqlite/tools/core.d.ts +0 -25
- package/dist/adapters/sqlite/tools/core.d.ts.map +0 -1
- package/dist/adapters/sqlite/tools/core.js +0 -359
- package/dist/adapters/sqlite/tools/core.js.map +0 -1
- package/dist/adapters/sqlite/tools/fts.d.ts +0 -13
- package/dist/adapters/sqlite/tools/fts.d.ts.map +0 -1
- package/dist/adapters/sqlite/tools/fts.js +0 -347
- package/dist/adapters/sqlite/tools/fts.js.map +0 -1
- package/dist/adapters/sqlite/tools/geo.d.ts +0 -14
- package/dist/adapters/sqlite/tools/geo.d.ts.map +0 -1
- package/dist/adapters/sqlite/tools/geo.js +0 -252
- package/dist/adapters/sqlite/tools/geo.js.map +0 -1
- package/dist/adapters/sqlite/tools/index.d.ts +0 -30
- package/dist/adapters/sqlite/tools/index.d.ts.map +0 -1
- package/dist/adapters/sqlite/tools/index.js +0 -61
- package/dist/adapters/sqlite/tools/index.js.map +0 -1
- package/dist/adapters/sqlite/tools/json-helpers.d.ts +0 -14
- package/dist/adapters/sqlite/tools/json-helpers.d.ts.map +0 -1
- package/dist/adapters/sqlite/tools/json-helpers.js +0 -477
- package/dist/adapters/sqlite/tools/json-helpers.js.map +0 -1
- package/dist/adapters/sqlite/tools/json-operations.d.ts +0 -14
- package/dist/adapters/sqlite/tools/json-operations.d.ts.map +0 -1
- package/dist/adapters/sqlite/tools/json-operations.js +0 -839
- package/dist/adapters/sqlite/tools/json-operations.js.map +0 -1
- package/dist/adapters/sqlite/tools/stats.d.ts +0 -15
- package/dist/adapters/sqlite/tools/stats.d.ts.map +0 -1
- package/dist/adapters/sqlite/tools/stats.js +0 -1219
- package/dist/adapters/sqlite/tools/stats.js.map +0 -1
- package/dist/adapters/sqlite/tools/text.d.ts +0 -14
- package/dist/adapters/sqlite/tools/text.d.ts.map +0 -1
- package/dist/adapters/sqlite/tools/text.js +0 -1141
- package/dist/adapters/sqlite/tools/text.js.map +0 -1
- package/dist/adapters/sqlite/tools/vector.d.ts +0 -14
- package/dist/adapters/sqlite/tools/vector.d.ts.map +0 -1
- package/dist/adapters/sqlite/tools/vector.js +0 -613
- package/dist/adapters/sqlite/tools/vector.js.map +0 -1
- package/dist/adapters/sqlite/tools/virtual.d.ts +0 -13
- package/dist/adapters/sqlite/tools/virtual.d.ts.map +0 -1
- package/dist/adapters/sqlite/tools/virtual.js +0 -930
- package/dist/adapters/sqlite/tools/virtual.js.map +0 -1
- package/dist/adapters/sqlite/types.d.ts +0 -207
- package/dist/adapters/sqlite/types.d.ts.map +0 -1
- package/dist/adapters/sqlite/types.js +0 -186
- package/dist/adapters/sqlite/types.js.map +0 -1
- package/dist/adapters/sqlite-native/NativeSqliteAdapter.d.ts +0 -163
- package/dist/adapters/sqlite-native/NativeSqliteAdapter.d.ts.map +0 -1
- package/dist/adapters/sqlite-native/NativeSqliteAdapter.js +0 -748
- package/dist/adapters/sqlite-native/NativeSqliteAdapter.js.map +0 -1
- package/dist/adapters/sqlite-native/index.d.ts +0 -11
- package/dist/adapters/sqlite-native/index.d.ts.map +0 -1
- package/dist/adapters/sqlite-native/index.js +0 -11
- package/dist/adapters/sqlite-native/index.js.map +0 -1
- package/dist/adapters/sqlite-native/tools/spatialite.d.ts +0 -19
- package/dist/adapters/sqlite-native/tools/spatialite.d.ts.map +0 -1
- package/dist/adapters/sqlite-native/tools/spatialite.js +0 -628
- package/dist/adapters/sqlite-native/tools/spatialite.js.map +0 -1
- package/dist/adapters/sqlite-native/tools/transactions.d.ts +0 -12
- package/dist/adapters/sqlite-native/tools/transactions.d.ts.map +0 -1
- package/dist/adapters/sqlite-native/tools/transactions.js +0 -255
- package/dist/adapters/sqlite-native/tools/transactions.js.map +0 -1
- package/dist/adapters/sqlite-native/tools/window.d.ts +0 -12
- package/dist/adapters/sqlite-native/tools/window.d.ts.map +0 -1
- package/dist/adapters/sqlite-native/tools/window.js +0 -370
- package/dist/adapters/sqlite-native/tools/window.js.map +0 -1
- package/dist/auth/AuthorizationServerDiscovery.d.ts +0 -90
- package/dist/auth/AuthorizationServerDiscovery.d.ts.map +0 -1
- package/dist/auth/AuthorizationServerDiscovery.js +0 -204
- package/dist/auth/AuthorizationServerDiscovery.js.map +0 -1
- package/dist/auth/OAuthResourceServer.d.ts +0 -65
- package/dist/auth/OAuthResourceServer.d.ts.map +0 -1
- package/dist/auth/OAuthResourceServer.js +0 -121
- package/dist/auth/OAuthResourceServer.js.map +0 -1
- package/dist/auth/TokenValidator.d.ts +0 -60
- package/dist/auth/TokenValidator.d.ts.map +0 -1
- package/dist/auth/TokenValidator.js +0 -235
- package/dist/auth/TokenValidator.js.map +0 -1
- package/dist/auth/errors.d.ts +0 -74
- package/dist/auth/errors.d.ts.map +0 -1
- package/dist/auth/errors.js +0 -133
- package/dist/auth/errors.js.map +0 -1
- package/dist/auth/index.d.ts +0 -13
- package/dist/auth/index.d.ts.map +0 -1
- package/dist/auth/index.js +0 -15
- package/dist/auth/index.js.map +0 -1
- package/dist/auth/middleware.d.ts +0 -81
- package/dist/auth/middleware.d.ts.map +0 -1
- package/dist/auth/middleware.js +0 -291
- package/dist/auth/middleware.js.map +0 -1
- package/dist/auth/scopes.d.ts +0 -136
- package/dist/auth/scopes.d.ts.map +0 -1
- package/dist/auth/scopes.js +0 -349
- package/dist/auth/scopes.js.map +0 -1
- package/dist/auth/types.d.ts +0 -257
- package/dist/auth/types.d.ts.map +0 -1
- package/dist/auth/types.js +0 -8
- package/dist/auth/types.js.map +0 -1
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/constants/ServerInstructions.d.ts +0 -45
- package/dist/constants/ServerInstructions.d.ts.map +0 -1
- package/dist/constants/ServerInstructions.js +0 -356
- package/dist/constants/ServerInstructions.js.map +0 -1
- package/dist/filtering/ToolConstants.d.ts +0 -34
- package/dist/filtering/ToolConstants.d.ts.map +0 -1
- package/dist/filtering/ToolConstants.js +0 -174
- package/dist/filtering/ToolConstants.js.map +0 -1
- package/dist/filtering/ToolFilter.d.ts +0 -82
- package/dist/filtering/ToolFilter.d.ts.map +0 -1
- package/dist/filtering/ToolFilter.js +0 -296
- package/dist/filtering/ToolFilter.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/server/McpServer.d.ts +0 -61
- package/dist/server/McpServer.d.ts.map +0 -1
- package/dist/server/McpServer.js +0 -270
- package/dist/server/McpServer.js.map +0 -1
- package/dist/transports/http.d.ts +0 -134
- package/dist/transports/http.d.ts.map +0 -1
- package/dist/transports/http.js +0 -516
- package/dist/transports/http.js.map +0 -1
- package/dist/transports/index.d.ts +0 -5
- package/dist/transports/index.d.ts.map +0 -1
- package/dist/transports/index.js +0 -5
- package/dist/transports/index.js.map +0 -1
- package/dist/types/index.d.ts +0 -380
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -68
- package/dist/types/index.js.map +0 -1
- package/dist/utils/annotations.d.ts +0 -44
- package/dist/utils/annotations.d.ts.map +0 -1
- package/dist/utils/annotations.js +0 -77
- package/dist/utils/annotations.js.map +0 -1
- package/dist/utils/errors.d.ts +0 -155
- package/dist/utils/errors.d.ts.map +0 -1
- package/dist/utils/errors.js +0 -329
- package/dist/utils/errors.js.map +0 -1
- package/dist/utils/identifiers.d.ts +0 -121
- package/dist/utils/identifiers.d.ts.map +0 -1
- package/dist/utils/identifiers.js +0 -319
- package/dist/utils/identifiers.js.map +0 -1
- package/dist/utils/index.d.ts +0 -7
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/index.js +0 -7
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/insightsManager.d.ts +0 -39
- package/dist/utils/insightsManager.d.ts.map +0 -1
- package/dist/utils/insightsManager.js +0 -63
- package/dist/utils/insightsManager.js.map +0 -1
- package/dist/utils/logger.d.ts +0 -189
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/logger.js +0 -394
- package/dist/utils/logger.js.map +0 -1
- package/dist/utils/progress-utils.d.ts +0 -54
- package/dist/utils/progress-utils.d.ts.map +0 -1
- package/dist/utils/progress-utils.js +0 -74
- package/dist/utils/progress-utils.js.map +0 -1
- package/dist/utils/resourceAnnotations.d.ts +0 -36
- package/dist/utils/resourceAnnotations.d.ts.map +0 -1
- package/dist/utils/resourceAnnotations.js +0 -57
- package/dist/utils/resourceAnnotations.js.map +0 -1
- package/dist/utils/where-clause.d.ts +0 -41
- package/dist/utils/where-clause.d.ts.map +0 -1
- package/dist/utils/where-clause.js +0 -116
- package/dist/utils/where-clause.js.map +0 -1
|
@@ -1,347 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SQLite Full-Text Search (FTS5) Tools
|
|
3
|
-
*
|
|
4
|
-
* Create and query FTS5 virtual tables for full-text search.
|
|
5
|
-
* 4 tools total.
|
|
6
|
-
*/
|
|
7
|
-
import { z } from "zod";
|
|
8
|
-
import { readOnly, idempotent, admin } from "../../../utils/annotations.js";
|
|
9
|
-
import { sanitizeIdentifier } from "../../../utils/index.js";
|
|
10
|
-
import { FtsCreateOutputSchema, FtsSearchOutputSchema, FtsRebuildOutputSchema, } from "../output-schemas.js";
|
|
11
|
-
/**
|
|
12
|
-
* Build error response for FTS5 unavailability in WASM mode
|
|
13
|
-
* Includes required schema fields to pass output validation
|
|
14
|
-
*/
|
|
15
|
-
function buildFts5UnavailableError(tableName) {
|
|
16
|
-
return {
|
|
17
|
-
success: false,
|
|
18
|
-
message: "FTS5 module unavailable",
|
|
19
|
-
tableName: tableName ?? "",
|
|
20
|
-
error: "FTS5 module unavailable",
|
|
21
|
-
hint: "FTS5 requires native SQLite backend (--sqlite-native). WASM mode (sql.js) does not include this module.",
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Check if an error is due to FTS5 module being unavailable
|
|
26
|
-
*/
|
|
27
|
-
function isFts5UnavailableError(error) {
|
|
28
|
-
return (error instanceof Error &&
|
|
29
|
-
error.message.toLowerCase().includes("no such module: fts5"));
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Check if FTS5 is available (native backend only)
|
|
33
|
-
* FTS5 is not bundled with sql.js (WASM)
|
|
34
|
-
*/
|
|
35
|
-
function isFts5Available(adapter) {
|
|
36
|
-
return adapter.isNativeBackend();
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Build error response for FTS5 search unavailability in WASM mode
|
|
40
|
-
* Includes required schema fields for FtsSearchOutputSchema
|
|
41
|
-
*/
|
|
42
|
-
function buildFts5SearchUnavailableError() {
|
|
43
|
-
return {
|
|
44
|
-
success: false,
|
|
45
|
-
rowCount: 0,
|
|
46
|
-
results: [],
|
|
47
|
-
error: "FTS5 module unavailable",
|
|
48
|
-
hint: "FTS5 requires native SQLite backend (--sqlite-native). WASM mode (sql.js) does not include this module.",
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
// FTS schemas
|
|
52
|
-
const FtsCreateSchema = z.object({
|
|
53
|
-
tableName: z.string().describe("Name of the FTS table to create"),
|
|
54
|
-
sourceTable: z.string().describe("Source table to index"),
|
|
55
|
-
columns: z.array(z.string()).describe("Columns to include in the index"),
|
|
56
|
-
contentTable: z
|
|
57
|
-
.string()
|
|
58
|
-
.optional()
|
|
59
|
-
.describe("Content table for external content FTS"),
|
|
60
|
-
tokenizer: z
|
|
61
|
-
.enum(["unicode61", "ascii", "porter"])
|
|
62
|
-
.optional()
|
|
63
|
-
.default("unicode61"),
|
|
64
|
-
createTriggers: z
|
|
65
|
-
.boolean()
|
|
66
|
-
.optional()
|
|
67
|
-
.default(true)
|
|
68
|
-
.describe("Create INSERT/UPDATE/DELETE triggers for auto-sync (only for external content tables)"),
|
|
69
|
-
});
|
|
70
|
-
const FtsSearchSchema = z.object({
|
|
71
|
-
table: z.string().describe("FTS table name"),
|
|
72
|
-
query: z.string().describe("Full-text search query"),
|
|
73
|
-
columns: z
|
|
74
|
-
.array(z.string())
|
|
75
|
-
.optional()
|
|
76
|
-
.describe("Specific columns to search"),
|
|
77
|
-
limit: z.number().optional().default(100),
|
|
78
|
-
highlight: z
|
|
79
|
-
.boolean()
|
|
80
|
-
.optional()
|
|
81
|
-
.default(false)
|
|
82
|
-
.describe("Include highlighted snippets"),
|
|
83
|
-
});
|
|
84
|
-
const FtsRebuildSchema = z.object({
|
|
85
|
-
table: z.string().describe("FTS table name to rebuild"),
|
|
86
|
-
});
|
|
87
|
-
const FtsMatchInfoSchema = z.object({
|
|
88
|
-
table: z.string().describe("FTS table name"),
|
|
89
|
-
query: z.string().describe("Full-text search query"),
|
|
90
|
-
format: z.enum(["bm25", "rank"]).optional().default("bm25"),
|
|
91
|
-
});
|
|
92
|
-
/**
|
|
93
|
-
* Get all FTS tools
|
|
94
|
-
*/
|
|
95
|
-
export function getFtsTools(adapter) {
|
|
96
|
-
return [
|
|
97
|
-
createFtsCreateTool(adapter),
|
|
98
|
-
createFtsSearchTool(adapter),
|
|
99
|
-
createFtsRebuildTool(adapter),
|
|
100
|
-
createFtsMatchInfoTool(adapter),
|
|
101
|
-
];
|
|
102
|
-
}
|
|
103
|
-
/**
|
|
104
|
-
* Create an FTS5 table
|
|
105
|
-
*/
|
|
106
|
-
function createFtsCreateTool(adapter) {
|
|
107
|
-
return {
|
|
108
|
-
name: "sqlite_fts_create",
|
|
109
|
-
description: "Create an FTS5 full-text search virtual table.",
|
|
110
|
-
group: "text",
|
|
111
|
-
inputSchema: FtsCreateSchema,
|
|
112
|
-
outputSchema: FtsCreateOutputSchema,
|
|
113
|
-
requiredScopes: ["write"],
|
|
114
|
-
annotations: idempotent("FTS Create"),
|
|
115
|
-
handler: async (params, _context) => {
|
|
116
|
-
const input = FtsCreateSchema.parse(params);
|
|
117
|
-
// Validate identifiers (FTS5 uses raw column names, not quoted)
|
|
118
|
-
sanitizeIdentifier(input.tableName);
|
|
119
|
-
sanitizeIdentifier(input.sourceTable);
|
|
120
|
-
for (const col of input.columns) {
|
|
121
|
-
sanitizeIdentifier(col);
|
|
122
|
-
}
|
|
123
|
-
const columnList = input.columns.join(", ");
|
|
124
|
-
let options = `tokenize="${input.tokenizer}"`;
|
|
125
|
-
// Use contentTable if specified, otherwise use sourceTable
|
|
126
|
-
const effectiveContentTable = input.contentTable ?? input.sourceTable;
|
|
127
|
-
sanitizeIdentifier(effectiveContentTable);
|
|
128
|
-
options += `, content="${effectiveContentTable}"`;
|
|
129
|
-
const sql = `CREATE VIRTUAL TABLE IF NOT EXISTS "${input.tableName}" USING fts5(${columnList}, ${options})`;
|
|
130
|
-
try {
|
|
131
|
-
await adapter.executeQuery(sql);
|
|
132
|
-
// Create sync triggers for external content FTS tables
|
|
133
|
-
let triggersCreated = [];
|
|
134
|
-
if (input.createTriggers) {
|
|
135
|
-
triggersCreated = await createSyncTriggers(adapter, input.tableName, effectiveContentTable, input.columns);
|
|
136
|
-
}
|
|
137
|
-
// Populate the FTS index with existing data
|
|
138
|
-
await adapter.executeQuery(`INSERT INTO "${input.tableName}"("${input.tableName}") VALUES('rebuild')`);
|
|
139
|
-
const message = triggersCreated.length
|
|
140
|
-
? `FTS5 table '${input.tableName}' created with ${triggersCreated.length} sync triggers`
|
|
141
|
-
: `FTS5 table '${input.tableName}' created`;
|
|
142
|
-
return {
|
|
143
|
-
success: true,
|
|
144
|
-
message,
|
|
145
|
-
tableName: input.tableName,
|
|
146
|
-
triggersCreated: triggersCreated.length ? triggersCreated : undefined,
|
|
147
|
-
};
|
|
148
|
-
}
|
|
149
|
-
catch (error) {
|
|
150
|
-
if (isFts5UnavailableError(error)) {
|
|
151
|
-
return buildFts5UnavailableError(input.tableName);
|
|
152
|
-
}
|
|
153
|
-
throw error;
|
|
154
|
-
}
|
|
155
|
-
},
|
|
156
|
-
};
|
|
157
|
-
}
|
|
158
|
-
/**
|
|
159
|
-
* Create INSERT/UPDATE/DELETE triggers to keep FTS5 index in sync with content table
|
|
160
|
-
*/
|
|
161
|
-
async function createSyncTriggers(adapter, ftsTable, contentTable, columns) {
|
|
162
|
-
const triggersCreated = [];
|
|
163
|
-
const colList = columns.map((c) => `"${c}"`).join(", ");
|
|
164
|
-
const newColList = columns.map((c) => `NEW."${c}"`).join(", ");
|
|
165
|
-
const oldColList = columns.map((c) => `OLD."${c}"`).join(", ");
|
|
166
|
-
// INSERT trigger - add new row to FTS index
|
|
167
|
-
const insertTriggerName = `${ftsTable}_ai`;
|
|
168
|
-
const insertTrigger = `
|
|
169
|
-
CREATE TRIGGER IF NOT EXISTS "${insertTriggerName}" AFTER INSERT ON "${contentTable}" BEGIN
|
|
170
|
-
INSERT INTO "${ftsTable}"(rowid, ${colList}) VALUES (NEW.rowid, ${newColList});
|
|
171
|
-
END;
|
|
172
|
-
`;
|
|
173
|
-
await adapter.executeQuery(insertTrigger);
|
|
174
|
-
triggersCreated.push(insertTriggerName);
|
|
175
|
-
// DELETE trigger - remove row from FTS index
|
|
176
|
-
const deleteTriggerName = `${ftsTable}_ad`;
|
|
177
|
-
const deleteTrigger = `
|
|
178
|
-
CREATE TRIGGER IF NOT EXISTS "${deleteTriggerName}" AFTER DELETE ON "${contentTable}" BEGIN
|
|
179
|
-
INSERT INTO "${ftsTable}"("${ftsTable}", rowid, ${colList}) VALUES('delete', OLD.rowid, ${oldColList});
|
|
180
|
-
END;
|
|
181
|
-
`;
|
|
182
|
-
await adapter.executeQuery(deleteTrigger);
|
|
183
|
-
triggersCreated.push(deleteTriggerName);
|
|
184
|
-
// UPDATE trigger - delete old entry and insert new one
|
|
185
|
-
const updateTriggerName = `${ftsTable}_au`;
|
|
186
|
-
const updateTrigger = `
|
|
187
|
-
CREATE TRIGGER IF NOT EXISTS "${updateTriggerName}" AFTER UPDATE ON "${contentTable}" BEGIN
|
|
188
|
-
INSERT INTO "${ftsTable}"("${ftsTable}", rowid, ${colList}) VALUES('delete', OLD.rowid, ${oldColList});
|
|
189
|
-
INSERT INTO "${ftsTable}"(rowid, ${colList}) VALUES (NEW.rowid, ${newColList});
|
|
190
|
-
END;
|
|
191
|
-
`;
|
|
192
|
-
await adapter.executeQuery(updateTrigger);
|
|
193
|
-
triggersCreated.push(updateTriggerName);
|
|
194
|
-
return triggersCreated;
|
|
195
|
-
}
|
|
196
|
-
/**
|
|
197
|
-
* Search FTS table
|
|
198
|
-
*/
|
|
199
|
-
function createFtsSearchTool(adapter) {
|
|
200
|
-
return {
|
|
201
|
-
name: "sqlite_fts_search",
|
|
202
|
-
description: "Search an FTS5 table using full-text query syntax.",
|
|
203
|
-
group: "text",
|
|
204
|
-
inputSchema: FtsSearchSchema,
|
|
205
|
-
outputSchema: FtsSearchOutputSchema,
|
|
206
|
-
requiredScopes: ["read"],
|
|
207
|
-
annotations: readOnly("FTS Search"),
|
|
208
|
-
handler: async (params, _context) => {
|
|
209
|
-
const input = FtsSearchSchema.parse(params);
|
|
210
|
-
// Upfront FTS5 availability check
|
|
211
|
-
if (!isFts5Available(adapter)) {
|
|
212
|
-
return buildFts5SearchUnavailableError();
|
|
213
|
-
}
|
|
214
|
-
// Validate FTS table name
|
|
215
|
-
sanitizeIdentifier(input.table);
|
|
216
|
-
let selectClause = "*";
|
|
217
|
-
if (input.highlight) {
|
|
218
|
-
selectClause = `*, highlight("${input.table}", 0, '<b>', '</b>') as snippet`;
|
|
219
|
-
}
|
|
220
|
-
try {
|
|
221
|
-
// Handle wildcard/list-all query - skip MATCH and return all rows
|
|
222
|
-
if (input.query === "*" || input.query.trim() === "") {
|
|
223
|
-
const sql = `SELECT ${selectClause}, NULL as rank FROM "${input.table}" ORDER BY rowid LIMIT ${input.limit}`;
|
|
224
|
-
const result = await adapter.executeReadQuery(sql);
|
|
225
|
-
return {
|
|
226
|
-
success: true,
|
|
227
|
-
rowCount: result.rows?.length ?? 0,
|
|
228
|
-
results: result.rows,
|
|
229
|
-
};
|
|
230
|
-
}
|
|
231
|
-
// Build query - use single quotes for FTS5 MATCH strings (not double quotes which are identifiers)
|
|
232
|
-
const queryEscaped = input.query.replace(/'/g, "''");
|
|
233
|
-
let matchExpr = `"${input.table}" MATCH '${queryEscaped}'`;
|
|
234
|
-
// If specific columns, use column filters
|
|
235
|
-
if (input.columns && input.columns.length > 0) {
|
|
236
|
-
for (const col of input.columns) {
|
|
237
|
-
sanitizeIdentifier(col);
|
|
238
|
-
}
|
|
239
|
-
const colFilter = input.columns
|
|
240
|
-
.map((c) => `${c}:${queryEscaped}`)
|
|
241
|
-
.join(" OR ");
|
|
242
|
-
matchExpr = `"${input.table}" MATCH '${colFilter}'`;
|
|
243
|
-
}
|
|
244
|
-
const sql = `SELECT ${selectClause}, rank FROM "${input.table}" WHERE ${matchExpr} ORDER BY rank LIMIT ${input.limit}`;
|
|
245
|
-
const result = await adapter.executeReadQuery(sql);
|
|
246
|
-
return {
|
|
247
|
-
success: true,
|
|
248
|
-
rowCount: result.rows?.length ?? 0,
|
|
249
|
-
results: result.rows,
|
|
250
|
-
};
|
|
251
|
-
}
|
|
252
|
-
catch (error) {
|
|
253
|
-
if (isFts5UnavailableError(error)) {
|
|
254
|
-
return buildFts5SearchUnavailableError();
|
|
255
|
-
}
|
|
256
|
-
throw error;
|
|
257
|
-
}
|
|
258
|
-
},
|
|
259
|
-
};
|
|
260
|
-
}
|
|
261
|
-
/**
|
|
262
|
-
* Rebuild FTS index
|
|
263
|
-
*/
|
|
264
|
-
function createFtsRebuildTool(adapter) {
|
|
265
|
-
return {
|
|
266
|
-
name: "sqlite_fts_rebuild",
|
|
267
|
-
description: "Rebuild an FTS5 index to optimize search performance.",
|
|
268
|
-
group: "text",
|
|
269
|
-
inputSchema: FtsRebuildSchema,
|
|
270
|
-
outputSchema: FtsRebuildOutputSchema,
|
|
271
|
-
requiredScopes: ["admin"],
|
|
272
|
-
annotations: admin("FTS Rebuild"),
|
|
273
|
-
handler: async (params, _context) => {
|
|
274
|
-
const input = FtsRebuildSchema.parse(params);
|
|
275
|
-
// Upfront FTS5 availability check
|
|
276
|
-
if (!isFts5Available(adapter)) {
|
|
277
|
-
return buildFts5UnavailableError(input.table);
|
|
278
|
-
}
|
|
279
|
-
// Validate FTS table name
|
|
280
|
-
sanitizeIdentifier(input.table);
|
|
281
|
-
// Rebuild = drop shadow tables and recreate
|
|
282
|
-
const sql = `INSERT INTO "${input.table}"("${input.table}") VALUES('rebuild')`;
|
|
283
|
-
try {
|
|
284
|
-
await adapter.executeQuery(sql);
|
|
285
|
-
return {
|
|
286
|
-
success: true,
|
|
287
|
-
message: `FTS5 index '${input.table}' rebuilt`,
|
|
288
|
-
tableName: input.table,
|
|
289
|
-
};
|
|
290
|
-
}
|
|
291
|
-
catch (error) {
|
|
292
|
-
if (isFts5UnavailableError(error)) {
|
|
293
|
-
return buildFts5UnavailableError(input.table);
|
|
294
|
-
}
|
|
295
|
-
throw error;
|
|
296
|
-
}
|
|
297
|
-
},
|
|
298
|
-
};
|
|
299
|
-
}
|
|
300
|
-
/**
|
|
301
|
-
* Get FTS match info/ranking
|
|
302
|
-
*/
|
|
303
|
-
function createFtsMatchInfoTool(adapter) {
|
|
304
|
-
return {
|
|
305
|
-
name: "sqlite_fts_match_info",
|
|
306
|
-
description: "Get FTS5 match ranking information using bm25.",
|
|
307
|
-
group: "text",
|
|
308
|
-
inputSchema: FtsMatchInfoSchema,
|
|
309
|
-
outputSchema: FtsSearchOutputSchema,
|
|
310
|
-
requiredScopes: ["read"],
|
|
311
|
-
annotations: readOnly("FTS Match Info"),
|
|
312
|
-
handler: async (params, _context) => {
|
|
313
|
-
const input = FtsMatchInfoSchema.parse(params);
|
|
314
|
-
// Upfront FTS5 availability check
|
|
315
|
-
if (!isFts5Available(adapter)) {
|
|
316
|
-
return buildFts5SearchUnavailableError();
|
|
317
|
-
}
|
|
318
|
-
// Validate FTS table name
|
|
319
|
-
sanitizeIdentifier(input.table);
|
|
320
|
-
// Use single quotes for FTS5 MATCH strings
|
|
321
|
-
const queryEscaped = input.query.replace(/'/g, "''");
|
|
322
|
-
let rankExpr;
|
|
323
|
-
if (input.format === "bm25") {
|
|
324
|
-
rankExpr = `bm25("${input.table}")`;
|
|
325
|
-
}
|
|
326
|
-
else {
|
|
327
|
-
rankExpr = "rank";
|
|
328
|
-
}
|
|
329
|
-
const sql = `SELECT *, ${rankExpr} as score FROM "${input.table}" WHERE "${input.table}" MATCH '${queryEscaped}' ORDER BY score`;
|
|
330
|
-
try {
|
|
331
|
-
const result = await adapter.executeReadQuery(sql);
|
|
332
|
-
return {
|
|
333
|
-
success: true,
|
|
334
|
-
rowCount: result.rows?.length ?? 0,
|
|
335
|
-
results: result.rows,
|
|
336
|
-
};
|
|
337
|
-
}
|
|
338
|
-
catch (error) {
|
|
339
|
-
if (isFts5UnavailableError(error)) {
|
|
340
|
-
return buildFts5SearchUnavailableError();
|
|
341
|
-
}
|
|
342
|
-
throw error;
|
|
343
|
-
}
|
|
344
|
-
},
|
|
345
|
-
};
|
|
346
|
-
}
|
|
347
|
-
//# sourceMappingURL=fts.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fts.js","sourceRoot":"","sources":["../../../../src/adapters/sqlite/tools/fts.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SQLite Geospatial Tools
|
|
3
|
-
*
|
|
4
|
-
* Basic geospatial operations using Haversine formula.
|
|
5
|
-
* Works without SpatiaLite extension.
|
|
6
|
-
* 4 tools total.
|
|
7
|
-
*/
|
|
8
|
-
import type { SqliteAdapter } from "../SqliteAdapter.js";
|
|
9
|
-
import type { ToolDefinition } from "../../../types/index.js";
|
|
10
|
-
/**
|
|
11
|
-
* Get all geo tools
|
|
12
|
-
*/
|
|
13
|
-
export declare function getGeoTools(adapter: SqliteAdapter): ToolDefinition[];
|
|
14
|
-
//# sourceMappingURL=geo.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"geo.d.ts","sourceRoot":"","sources":["../../../../src/adapters/sqlite/tools/geo.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAkB,MAAM,yBAAyB,CAAC;AAuD9E;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,cAAc,EAAE,CAOpE"}
|
|
@@ -1,252 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SQLite Geospatial Tools
|
|
3
|
-
*
|
|
4
|
-
* Basic geospatial operations using Haversine formula.
|
|
5
|
-
* Works without SpatiaLite extension.
|
|
6
|
-
* 4 tools total.
|
|
7
|
-
*/
|
|
8
|
-
import { z } from "zod";
|
|
9
|
-
import { readOnly } from "../../../utils/annotations.js";
|
|
10
|
-
import { validateWhereClause, sanitizeIdentifier, createColumnList, } from "../../../utils/index.js";
|
|
11
|
-
import { GeoDistanceOutputSchema, GeoWithinRadiusOutputSchema, GeoBoundingBoxOutputSchema, GeoClusterOutputSchema, } from "../output-schemas.js";
|
|
12
|
-
// Geo schemas
|
|
13
|
-
const GeoDistanceSchema = z.object({
|
|
14
|
-
lat1: z.number().min(-90).max(90).describe("Latitude of point 1"),
|
|
15
|
-
lon1: z.number().min(-180).max(180).describe("Longitude of point 1"),
|
|
16
|
-
lat2: z.number().min(-90).max(90).describe("Latitude of point 2"),
|
|
17
|
-
lon2: z.number().min(-180).max(180).describe("Longitude of point 2"),
|
|
18
|
-
unit: z.enum(["km", "miles", "meters"]).optional().default("km"),
|
|
19
|
-
});
|
|
20
|
-
const GeoNearbySchema = z.object({
|
|
21
|
-
table: z.string().describe("Table name"),
|
|
22
|
-
latColumn: z.string().describe("Latitude column"),
|
|
23
|
-
lonColumn: z.string().describe("Longitude column"),
|
|
24
|
-
centerLat: z.number().min(-90).max(90).describe("Center latitude"),
|
|
25
|
-
centerLon: z.number().min(-180).max(180).describe("Center longitude"),
|
|
26
|
-
radius: z.number().describe("Radius"),
|
|
27
|
-
unit: z.enum(["km", "miles", "meters"]).optional().default("km"),
|
|
28
|
-
limit: z.number().optional().default(100),
|
|
29
|
-
returnColumns: z.array(z.string()).optional(),
|
|
30
|
-
});
|
|
31
|
-
const GeoBoundingBoxSchema = z.object({
|
|
32
|
-
table: z.string().describe("Table name"),
|
|
33
|
-
latColumn: z.string().describe("Latitude column"),
|
|
34
|
-
lonColumn: z.string().describe("Longitude column"),
|
|
35
|
-
minLat: z.number().min(-90).max(90),
|
|
36
|
-
maxLat: z.number().min(-90).max(90),
|
|
37
|
-
minLon: z.number().min(-180).max(180),
|
|
38
|
-
maxLon: z.number().min(-180).max(180),
|
|
39
|
-
limit: z.number().optional().default(100),
|
|
40
|
-
returnColumns: z.array(z.string()).optional(),
|
|
41
|
-
});
|
|
42
|
-
const GeoClusterSchema = z.object({
|
|
43
|
-
table: z.string().describe("Table name"),
|
|
44
|
-
latColumn: z.string().describe("Latitude column"),
|
|
45
|
-
lonColumn: z.string().describe("Longitude column"),
|
|
46
|
-
gridSize: z.number().optional().default(0.1).describe("Grid size in degrees"),
|
|
47
|
-
whereClause: z.string().optional(),
|
|
48
|
-
});
|
|
49
|
-
/**
|
|
50
|
-
* Get all geo tools
|
|
51
|
-
*/
|
|
52
|
-
export function getGeoTools(adapter) {
|
|
53
|
-
return [
|
|
54
|
-
createGeoDistanceTool(),
|
|
55
|
-
createGeoNearbyTool(adapter),
|
|
56
|
-
createGeoBoundingBoxTool(adapter),
|
|
57
|
-
createGeoClusterTool(adapter),
|
|
58
|
-
];
|
|
59
|
-
}
|
|
60
|
-
// Earth radius in different units
|
|
61
|
-
const EARTH_RADIUS = {
|
|
62
|
-
km: 6371,
|
|
63
|
-
miles: 3959,
|
|
64
|
-
meters: 6371000,
|
|
65
|
-
};
|
|
66
|
-
/**
|
|
67
|
-
* Haversine formula for distance calculation
|
|
68
|
-
*/
|
|
69
|
-
function haversineDistance(lat1, lon1, lat2, lon2, unit) {
|
|
70
|
-
const R = EARTH_RADIUS[unit];
|
|
71
|
-
const dLat = ((lat2 - lat1) * Math.PI) / 180;
|
|
72
|
-
const dLon = ((lon2 - lon1) * Math.PI) / 180;
|
|
73
|
-
const a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
|
|
74
|
-
Math.cos((lat1 * Math.PI) / 180) *
|
|
75
|
-
Math.cos((lat2 * Math.PI) / 180) *
|
|
76
|
-
Math.sin(dLon / 2) *
|
|
77
|
-
Math.sin(dLon / 2);
|
|
78
|
-
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
|
|
79
|
-
return R * c;
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* Calculate distance between two points
|
|
83
|
-
*/
|
|
84
|
-
function createGeoDistanceTool() {
|
|
85
|
-
return {
|
|
86
|
-
name: "sqlite_geo_distance",
|
|
87
|
-
description: "Calculate the distance between two geographic points using Haversine formula.",
|
|
88
|
-
group: "geo",
|
|
89
|
-
inputSchema: GeoDistanceSchema,
|
|
90
|
-
outputSchema: GeoDistanceOutputSchema,
|
|
91
|
-
requiredScopes: ["read"],
|
|
92
|
-
annotations: readOnly("Geo Distance"),
|
|
93
|
-
handler: (params, _context) => {
|
|
94
|
-
const input = GeoDistanceSchema.parse(params);
|
|
95
|
-
const distance = haversineDistance(input.lat1, input.lon1, input.lat2, input.lon2, input.unit);
|
|
96
|
-
return Promise.resolve({
|
|
97
|
-
success: true,
|
|
98
|
-
distance: Math.round(distance * 1000) / 1000,
|
|
99
|
-
unit: input.unit,
|
|
100
|
-
from: { lat: input.lat1, lon: input.lon1 },
|
|
101
|
-
to: { lat: input.lat2, lon: input.lon2 },
|
|
102
|
-
});
|
|
103
|
-
},
|
|
104
|
-
};
|
|
105
|
-
}
|
|
106
|
-
/**
|
|
107
|
-
* Find points within radius
|
|
108
|
-
*/
|
|
109
|
-
function createGeoNearbyTool(adapter) {
|
|
110
|
-
return {
|
|
111
|
-
name: "sqlite_geo_nearby",
|
|
112
|
-
description: "Find points within a radius of a center point.",
|
|
113
|
-
group: "geo",
|
|
114
|
-
inputSchema: GeoNearbySchema,
|
|
115
|
-
outputSchema: GeoWithinRadiusOutputSchema,
|
|
116
|
-
requiredScopes: ["read"],
|
|
117
|
-
annotations: readOnly("Geo Nearby"),
|
|
118
|
-
handler: async (params, _context) => {
|
|
119
|
-
const input = GeoNearbySchema.parse(params);
|
|
120
|
-
// Validate and quote identifiers
|
|
121
|
-
const table = sanitizeIdentifier(input.table);
|
|
122
|
-
const latColumn = sanitizeIdentifier(input.latColumn);
|
|
123
|
-
const lonColumn = sanitizeIdentifier(input.lonColumn);
|
|
124
|
-
// Build select
|
|
125
|
-
let selectCols = "*";
|
|
126
|
-
if (input.returnColumns && input.returnColumns.length > 0) {
|
|
127
|
-
const allCols = [
|
|
128
|
-
...input.returnColumns,
|
|
129
|
-
input.latColumn,
|
|
130
|
-
input.lonColumn,
|
|
131
|
-
];
|
|
132
|
-
selectCols = createColumnList(allCols);
|
|
133
|
-
}
|
|
134
|
-
// Calculate rough bounding box for pre-filtering
|
|
135
|
-
const radiusKm = input.unit === "miles"
|
|
136
|
-
? input.radius * 1.60934
|
|
137
|
-
: input.unit === "meters"
|
|
138
|
-
? input.radius / 1000
|
|
139
|
-
: input.radius;
|
|
140
|
-
const latDelta = radiusKm / 111; // ~111km per degree latitude
|
|
141
|
-
const lonDelta = radiusKm / (111 * Math.cos((input.centerLat * Math.PI) / 180));
|
|
142
|
-
const sql = `SELECT ${selectCols} FROM ${table}
|
|
143
|
-
WHERE ${latColumn} BETWEEN ${input.centerLat - latDelta} AND ${input.centerLat + latDelta}
|
|
144
|
-
AND ${lonColumn} BETWEEN ${input.centerLon - lonDelta} AND ${input.centerLon + lonDelta}`;
|
|
145
|
-
const result = await adapter.executeReadQuery(sql);
|
|
146
|
-
// Filter by exact distance
|
|
147
|
-
const nearby = (result.rows ?? [])
|
|
148
|
-
.map((row) => {
|
|
149
|
-
const lat = Number(row[input.latColumn]);
|
|
150
|
-
const lon = Number(row[input.lonColumn]);
|
|
151
|
-
const distance = haversineDistance(input.centerLat, input.centerLon, lat, lon, input.unit);
|
|
152
|
-
return { ...row, _distance: Math.round(distance * 1000) / 1000 };
|
|
153
|
-
})
|
|
154
|
-
.filter((r) => r._distance <= input.radius)
|
|
155
|
-
.sort((a, b) => a._distance - b._distance)
|
|
156
|
-
.slice(0, input.limit);
|
|
157
|
-
return {
|
|
158
|
-
success: true,
|
|
159
|
-
rowCount: nearby.length,
|
|
160
|
-
results: nearby,
|
|
161
|
-
};
|
|
162
|
-
},
|
|
163
|
-
};
|
|
164
|
-
}
|
|
165
|
-
/**
|
|
166
|
-
* Find points within bounding box
|
|
167
|
-
*/
|
|
168
|
-
function createGeoBoundingBoxTool(adapter) {
|
|
169
|
-
return {
|
|
170
|
-
name: "sqlite_geo_bounding_box",
|
|
171
|
-
description: "Find points within a rectangular bounding box.",
|
|
172
|
-
group: "geo",
|
|
173
|
-
inputSchema: GeoBoundingBoxSchema,
|
|
174
|
-
outputSchema: GeoBoundingBoxOutputSchema,
|
|
175
|
-
requiredScopes: ["read"],
|
|
176
|
-
annotations: readOnly("Geo Bounding Box"),
|
|
177
|
-
handler: async (params, _context) => {
|
|
178
|
-
const input = GeoBoundingBoxSchema.parse(params);
|
|
179
|
-
// Validate and quote identifiers
|
|
180
|
-
const table = sanitizeIdentifier(input.table);
|
|
181
|
-
const latColumn = sanitizeIdentifier(input.latColumn);
|
|
182
|
-
const lonColumn = sanitizeIdentifier(input.lonColumn);
|
|
183
|
-
// Build select
|
|
184
|
-
let selectCols = "*";
|
|
185
|
-
if (input.returnColumns && input.returnColumns.length > 0) {
|
|
186
|
-
selectCols = createColumnList(input.returnColumns);
|
|
187
|
-
}
|
|
188
|
-
const sql = `SELECT ${selectCols} FROM ${table}
|
|
189
|
-
WHERE ${latColumn} BETWEEN ${input.minLat} AND ${input.maxLat}
|
|
190
|
-
AND ${lonColumn} BETWEEN ${input.minLon} AND ${input.maxLon}
|
|
191
|
-
LIMIT ${input.limit}`;
|
|
192
|
-
const result = await adapter.executeReadQuery(sql);
|
|
193
|
-
return {
|
|
194
|
-
success: true,
|
|
195
|
-
rowCount: result.rows?.length ?? 0,
|
|
196
|
-
results: result.rows ?? [],
|
|
197
|
-
};
|
|
198
|
-
},
|
|
199
|
-
};
|
|
200
|
-
}
|
|
201
|
-
/**
|
|
202
|
-
* Cluster points by grid
|
|
203
|
-
*/
|
|
204
|
-
function createGeoClusterTool(adapter) {
|
|
205
|
-
return {
|
|
206
|
-
name: "sqlite_geo_cluster",
|
|
207
|
-
description: "Cluster geographic points into grid cells.",
|
|
208
|
-
group: "geo",
|
|
209
|
-
inputSchema: GeoClusterSchema,
|
|
210
|
-
outputSchema: GeoClusterOutputSchema,
|
|
211
|
-
requiredScopes: ["read"],
|
|
212
|
-
annotations: readOnly("Geo Cluster"),
|
|
213
|
-
handler: async (params, _context) => {
|
|
214
|
-
const input = GeoClusterSchema.parse(params);
|
|
215
|
-
// Validate and quote identifiers
|
|
216
|
-
const table = sanitizeIdentifier(input.table);
|
|
217
|
-
const latColumn = sanitizeIdentifier(input.latColumn);
|
|
218
|
-
const lonColumn = sanitizeIdentifier(input.lonColumn);
|
|
219
|
-
// Security: Validate WHERE clause if provided
|
|
220
|
-
if (input.whereClause) {
|
|
221
|
-
validateWhereClause(input.whereClause);
|
|
222
|
-
}
|
|
223
|
-
// Use ROUND to create grid cells
|
|
224
|
-
const gridSize = input.gridSize;
|
|
225
|
-
const sql = `SELECT
|
|
226
|
-
ROUND(${latColumn} / ${gridSize}) * ${gridSize} as grid_lat,
|
|
227
|
-
ROUND(${lonColumn} / ${gridSize}) * ${gridSize} as grid_lon,
|
|
228
|
-
COUNT(*) as point_count,
|
|
229
|
-
AVG(${latColumn}) as center_lat,
|
|
230
|
-
AVG(${lonColumn}) as center_lon
|
|
231
|
-
FROM ${table}
|
|
232
|
-
${input.whereClause ? `WHERE ${input.whereClause}` : ""}
|
|
233
|
-
GROUP BY grid_lat, grid_lon
|
|
234
|
-
ORDER BY point_count DESC`;
|
|
235
|
-
const result = await adapter.executeReadQuery(sql);
|
|
236
|
-
// Transform raw SQL results to match output schema
|
|
237
|
-
const clusters = (result.rows ?? []).map((row, index) => ({
|
|
238
|
-
clusterId: index + 1,
|
|
239
|
-
center: {
|
|
240
|
-
latitude: Number(row["center_lat"]) || 0,
|
|
241
|
-
longitude: Number(row["center_lon"]) || 0,
|
|
242
|
-
},
|
|
243
|
-
pointCount: Number(row["point_count"]) || 0,
|
|
244
|
-
}));
|
|
245
|
-
return {
|
|
246
|
-
success: true,
|
|
247
|
-
clusters,
|
|
248
|
-
};
|
|
249
|
-
},
|
|
250
|
-
};
|
|
251
|
-
}
|
|
252
|
-
//# sourceMappingURL=geo.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"geo.js","sourceRoot":"","sources":["../../../../src/adapters/sqlite/tools/geo.ts"],"names":[],"mappings":"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"}
|