@silverbackbase/root 0.4.2 → 0.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +17 -10
- package/dist/auth.js.map +1 -1
- package/dist/core/db.d.ts +6 -5
- package/dist/core/db.d.ts.map +1 -1
- package/dist/core/db.js +81 -53
- package/dist/core/db.js.map +1 -1
- package/dist/core/index.d.ts +2 -2
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +1 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/knowledge.d.ts +5 -4
- package/dist/core/knowledge.d.ts.map +1 -1
- package/dist/core/knowledge.js +15 -10
- package/dist/core/knowledge.js.map +1 -1
- package/dist/core/types.d.ts +2 -1
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/mcp/server.js +1 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp.d.ts +1 -1
- package/dist/mcp.d.ts.map +1 -1
- package/dist/mcp.js +49 -36
- package/dist/mcp.js.map +1 -1
- package/package.json +1 -1
package/dist/auth.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AA4C9C,eAAO,MAAM,WAAW,EAAE,iBAUzB,CAAC"}
|
package/dist/auth.js
CHANGED
|
@@ -2,31 +2,37 @@ import { createHash } from "node:crypto";
|
|
|
2
2
|
const VALIDATE_URL = process.env.SILVERBACKBASE_URL
|
|
3
3
|
? `${process.env.SILVERBACKBASE_URL}/api/tokens/validate`
|
|
4
4
|
: null;
|
|
5
|
-
const
|
|
5
|
+
const VALIDATE_SECRET = process.env.ROOT_VALIDATE_SECRET ?? process.env.TRAIL_VALIDATE_SECRET ?? "";
|
|
6
6
|
const cache = new Map();
|
|
7
7
|
async function validateToken(token) {
|
|
8
8
|
// Cloud mode: validate against silverbackbase.com
|
|
9
9
|
if (VALIDATE_URL) {
|
|
10
10
|
const hash = createHash("sha256").update(token).digest("hex");
|
|
11
11
|
const cached = cache.get(hash);
|
|
12
|
-
if (cached && cached.expires > Date.now())
|
|
13
|
-
return cached.valid;
|
|
12
|
+
if (cached && cached.expires > Date.now()) {
|
|
13
|
+
return { valid: cached.valid, workspaceId: cached.workspaceId };
|
|
14
|
+
}
|
|
14
15
|
try {
|
|
15
16
|
const res = await fetch(VALIDATE_URL, {
|
|
16
17
|
method: "POST",
|
|
17
|
-
headers: { "Content-Type": "application/json", "x-
|
|
18
|
+
headers: { "Content-Type": "application/json", "x-trail-secret": VALIDATE_SECRET },
|
|
18
19
|
body: JSON.stringify({ hash }),
|
|
19
20
|
});
|
|
20
21
|
const data = (await res.json());
|
|
21
|
-
|
|
22
|
-
|
|
22
|
+
const entry = {
|
|
23
|
+
valid: data.valid,
|
|
24
|
+
workspaceId: data.workspaceId ?? null,
|
|
25
|
+
expires: Date.now() + 60_000,
|
|
26
|
+
};
|
|
27
|
+
cache.set(hash, entry);
|
|
28
|
+
return { valid: entry.valid, workspaceId: entry.workspaceId };
|
|
23
29
|
}
|
|
24
30
|
catch {
|
|
25
|
-
return false;
|
|
31
|
+
return { valid: false, workspaceId: null };
|
|
26
32
|
}
|
|
27
33
|
}
|
|
28
|
-
// Self-host / dev: no
|
|
29
|
-
return true;
|
|
34
|
+
// Self-host / dev: no workspace isolation
|
|
35
|
+
return { valid: true, workspaceId: null };
|
|
30
36
|
}
|
|
31
37
|
export const requireAuth = async (c, next) => {
|
|
32
38
|
const auth = c.req.header("authorization");
|
|
@@ -34,9 +40,10 @@ export const requireAuth = async (c, next) => {
|
|
|
34
40
|
return c.json({ error: "Unauthorized — provide Authorization: Bearer <token>" }, 401);
|
|
35
41
|
}
|
|
36
42
|
const token = auth.slice(7).trim();
|
|
37
|
-
const valid = await validateToken(token);
|
|
43
|
+
const { valid, workspaceId } = await validateToken(token);
|
|
38
44
|
if (!valid)
|
|
39
45
|
return c.json({ error: "Invalid or revoked token" }, 401);
|
|
46
|
+
c.set("workspaceId", workspaceId);
|
|
40
47
|
await next();
|
|
41
48
|
};
|
|
42
49
|
//# sourceMappingURL=auth.js.map
|
package/dist/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB;IACjD,CAAC,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,sBAAsB;IACzD,CAAC,CAAC,IAAI,CAAC;AAET,MAAM,
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
|
package/dist/core/db.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { KnowledgeCategory,
|
|
1
|
+
import type { KnowledgeCategory, ProjectRow } from "./types.js";
|
|
2
2
|
export interface KnowledgeRow {
|
|
3
3
|
id: string;
|
|
4
4
|
accountId: string;
|
|
@@ -8,10 +8,11 @@ export interface KnowledgeRow {
|
|
|
8
8
|
updatedAt: Date;
|
|
9
9
|
}
|
|
10
10
|
export interface KnowledgeDB {
|
|
11
|
-
createProject(id: string, name: string, url: string): Promise<
|
|
12
|
-
listProjects(): Promise<
|
|
13
|
-
getProject(id: string): Promise<
|
|
14
|
-
deleteProject(id: string): Promise<{
|
|
11
|
+
createProject(id: string, name: string, url: string, workspaceId: string | null): Promise<ProjectRow>;
|
|
12
|
+
listProjects(workspaceId: string | null): Promise<ProjectRow[]>;
|
|
13
|
+
getProject(id: string, workspaceId: string | null): Promise<ProjectRow | undefined>;
|
|
14
|
+
deleteProject(id: string, workspaceId: string | null): Promise<{
|
|
15
|
+
deleted: boolean;
|
|
15
16
|
items_removed: number;
|
|
16
17
|
}>;
|
|
17
18
|
getAll(accountId: string): Promise<KnowledgeRow[]>;
|
package/dist/core/db.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/core/db.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/core/db.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEhE,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAE1B,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACtG,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAChE,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAAC;IACpF,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAE5G,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IACnD,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAC5E,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtG,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAAC;IACxG,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;CACnE;AA4OD,eAAO,MAAM,EAAE,EAAE,WAES,CAAC"}
|
package/dist/core/db.js
CHANGED
|
@@ -2,10 +2,11 @@ import { DatabaseSync } from "node:sqlite";
|
|
|
2
2
|
import postgres from "postgres";
|
|
3
3
|
const CREATE_TABLE_SQL = `
|
|
4
4
|
CREATE TABLE IF NOT EXISTS clients (
|
|
5
|
-
id
|
|
6
|
-
name
|
|
7
|
-
url
|
|
8
|
-
|
|
5
|
+
id TEXT PRIMARY KEY,
|
|
6
|
+
name TEXT NOT NULL,
|
|
7
|
+
url TEXT NOT NULL,
|
|
8
|
+
workspace_id TEXT,
|
|
9
|
+
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%SZ', 'now'))
|
|
9
10
|
);
|
|
10
11
|
CREATE TABLE IF NOT EXISTS knowledge_items (
|
|
11
12
|
id TEXT PRIMARY KEY,
|
|
@@ -20,10 +21,11 @@ const CREATE_TABLE_SQL = `
|
|
|
20
21
|
`;
|
|
21
22
|
const CREATE_TABLE_PG = `
|
|
22
23
|
CREATE TABLE IF NOT EXISTS clients (
|
|
23
|
-
id
|
|
24
|
-
name
|
|
25
|
-
url
|
|
26
|
-
|
|
24
|
+
id TEXT PRIMARY KEY,
|
|
25
|
+
name TEXT NOT NULL,
|
|
26
|
+
url TEXT NOT NULL,
|
|
27
|
+
workspace_id TEXT,
|
|
28
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
27
29
|
);
|
|
28
30
|
CREATE TABLE IF NOT EXISTS knowledge_items (
|
|
29
31
|
id TEXT PRIMARY KEY,
|
|
@@ -46,11 +48,12 @@ function parseSqliteRow(row) {
|
|
|
46
48
|
updatedAt: new Date(row.updated_at),
|
|
47
49
|
};
|
|
48
50
|
}
|
|
49
|
-
function
|
|
51
|
+
function parseSqliteProject(row) {
|
|
50
52
|
return {
|
|
51
53
|
id: row.id,
|
|
52
54
|
name: row.name,
|
|
53
55
|
url: row.url,
|
|
56
|
+
workspaceId: row.workspace_id ?? null,
|
|
54
57
|
createdAt: new Date(row.created_at),
|
|
55
58
|
};
|
|
56
59
|
}
|
|
@@ -59,57 +62,66 @@ function createSQLiteDB(dbPath) {
|
|
|
59
62
|
sqlite.exec("PRAGMA journal_mode = WAL;");
|
|
60
63
|
sqlite.exec("PRAGMA foreign_keys = ON;");
|
|
61
64
|
sqlite.exec(CREATE_TABLE_SQL);
|
|
65
|
+
// migration for existing DBs without workspace_id
|
|
66
|
+
try {
|
|
67
|
+
sqlite.exec("ALTER TABLE clients ADD COLUMN workspace_id TEXT");
|
|
68
|
+
}
|
|
69
|
+
catch { }
|
|
62
70
|
return {
|
|
63
|
-
async createProject(id, name, url) {
|
|
71
|
+
async createProject(id, name, url, workspaceId) {
|
|
64
72
|
const now = new Date().toISOString();
|
|
65
|
-
sqlite.prepare("INSERT INTO clients (id, name, url, created_at) VALUES (?, ?, ?, ?)").run(id, name, url, now);
|
|
66
|
-
return { id, name, url, createdAt: new Date(now) };
|
|
67
|
-
},
|
|
68
|
-
async listProjects() {
|
|
73
|
+
sqlite.prepare("INSERT INTO clients (id, name, url, workspace_id, created_at) VALUES (?, ?, ?, ?, ?)").run(id, name, url, workspaceId ?? null, now);
|
|
74
|
+
return { id, name, url, workspaceId: workspaceId ?? null, createdAt: new Date(now) };
|
|
75
|
+
},
|
|
76
|
+
async listProjects(workspaceId) {
|
|
77
|
+
if (workspaceId) {
|
|
78
|
+
const rows = sqlite.prepare("SELECT * FROM clients WHERE workspace_id = ? ORDER BY created_at DESC").all(workspaceId);
|
|
79
|
+
return rows.map(parseSqliteProject);
|
|
80
|
+
}
|
|
69
81
|
const rows = sqlite.prepare("SELECT * FROM clients ORDER BY created_at DESC").all();
|
|
70
|
-
return rows.map(
|
|
71
|
-
},
|
|
72
|
-
async getProject(id) {
|
|
73
|
-
const row =
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
82
|
+
return rows.map(parseSqliteProject);
|
|
83
|
+
},
|
|
84
|
+
async getProject(id, workspaceId) {
|
|
85
|
+
const row = workspaceId
|
|
86
|
+
? sqlite.prepare("SELECT * FROM clients WHERE id = ? AND workspace_id = ?").get(id, workspaceId)
|
|
87
|
+
: sqlite.prepare("SELECT * FROM clients WHERE id = ?").get(id);
|
|
88
|
+
return row ? parseSqliteProject(row) : undefined;
|
|
89
|
+
},
|
|
90
|
+
async deleteProject(id, workspaceId) {
|
|
91
|
+
const project = workspaceId
|
|
92
|
+
? sqlite.prepare("SELECT id FROM clients WHERE id = ? AND workspace_id = ?").get(id, workspaceId)
|
|
93
|
+
: sqlite.prepare("SELECT id FROM clients WHERE id = ?").get(id);
|
|
94
|
+
if (!project)
|
|
95
|
+
return { deleted: false, items_removed: 0 };
|
|
77
96
|
const count = sqlite.prepare("SELECT COUNT(*) as n FROM knowledge_items WHERE account_id = ?").get(id).n;
|
|
78
97
|
sqlite.prepare("DELETE FROM knowledge_items WHERE account_id = ?").run(id);
|
|
79
98
|
sqlite.prepare("DELETE FROM clients WHERE id = ?").run(id);
|
|
80
|
-
return { items_removed: count };
|
|
99
|
+
return { deleted: true, items_removed: count };
|
|
81
100
|
},
|
|
82
101
|
async getAll(accountId) {
|
|
83
|
-
|
|
84
|
-
return stmt.all(accountId).map(parseSqliteRow);
|
|
102
|
+
return sqlite.prepare("SELECT * FROM knowledge_items WHERE account_id = ?").all(accountId).map(parseSqliteRow);
|
|
85
103
|
},
|
|
86
104
|
async getByCategory(accountId, category) {
|
|
87
|
-
|
|
88
|
-
return stmt.all(accountId, category).map(parseSqliteRow);
|
|
105
|
+
return sqlite.prepare("SELECT * FROM knowledge_items WHERE account_id = ? AND category = ?").all(accountId, category).map(parseSqliteRow);
|
|
89
106
|
},
|
|
90
107
|
async insert(id, accountId, category, data) {
|
|
91
108
|
const now = new Date().toISOString();
|
|
92
|
-
|
|
93
|
-
stmt.run(id, accountId, category, JSON.stringify(data), now, now);
|
|
109
|
+
sqlite.prepare("INSERT INTO knowledge_items (id, account_id, category, data, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?)").run(id, accountId, category, JSON.stringify(data), now, now);
|
|
94
110
|
},
|
|
95
111
|
async update(id, accountId, data) {
|
|
96
|
-
const
|
|
97
|
-
const existing = getStmt.get(id, accountId);
|
|
112
|
+
const existing = sqlite.prepare("SELECT * FROM knowledge_items WHERE id = ? AND account_id = ?").get(id, accountId);
|
|
98
113
|
if (!existing)
|
|
99
114
|
return undefined;
|
|
100
115
|
const merged = { ...JSON.parse(existing.data), ...data };
|
|
101
116
|
const now = new Date().toISOString();
|
|
102
|
-
|
|
103
|
-
stmt.run(JSON.stringify(merged), now, id, accountId);
|
|
117
|
+
sqlite.prepare("UPDATE knowledge_items SET data = ?, updated_at = ? WHERE id = ? AND account_id = ?").run(JSON.stringify(merged), now, id, accountId);
|
|
104
118
|
return parseSqliteRow({ ...existing, data: JSON.stringify(merged), updated_at: now });
|
|
105
119
|
},
|
|
106
120
|
async remove(id, accountId) {
|
|
107
|
-
|
|
108
|
-
stmt.run(id, accountId);
|
|
121
|
+
sqlite.prepare("DELETE FROM knowledge_items WHERE id = ? AND account_id = ?").run(id, accountId);
|
|
109
122
|
},
|
|
110
123
|
async search(accountId, query) {
|
|
111
|
-
|
|
112
|
-
return stmt.all(accountId, `%${query}%`).map(parseSqliteRow);
|
|
124
|
+
return sqlite.prepare("SELECT * FROM knowledge_items WHERE account_id = ? AND data LIKE ?").all(accountId, `%${query}%`).map(parseSqliteRow);
|
|
113
125
|
},
|
|
114
126
|
};
|
|
115
127
|
}
|
|
@@ -120,6 +132,10 @@ function createPostgresDB(url) {
|
|
|
120
132
|
if (initialized)
|
|
121
133
|
return;
|
|
122
134
|
await sql.unsafe(CREATE_TABLE_PG);
|
|
135
|
+
try {
|
|
136
|
+
await sql `ALTER TABLE clients ADD COLUMN IF NOT EXISTS workspace_id TEXT`;
|
|
137
|
+
}
|
|
138
|
+
catch { }
|
|
123
139
|
initialized = true;
|
|
124
140
|
}
|
|
125
141
|
function parseRow(row) {
|
|
@@ -132,30 +148,45 @@ function createPostgresDB(url) {
|
|
|
132
148
|
updatedAt: new Date(row.updated_at),
|
|
133
149
|
};
|
|
134
150
|
}
|
|
151
|
+
function parseProject(row) {
|
|
152
|
+
return {
|
|
153
|
+
id: row.id,
|
|
154
|
+
name: row.name,
|
|
155
|
+
url: row.url,
|
|
156
|
+
workspaceId: row.workspace_id ?? null,
|
|
157
|
+
createdAt: new Date(row.created_at),
|
|
158
|
+
};
|
|
159
|
+
}
|
|
135
160
|
return {
|
|
136
|
-
async createProject(id, name, url) {
|
|
161
|
+
async createProject(id, name, url, workspaceId) {
|
|
162
|
+
await ensureInit();
|
|
137
163
|
const now = new Date();
|
|
138
|
-
await sql `INSERT INTO clients (id, name, url, created_at) VALUES (${id}, ${name}, ${url}, ${now})`;
|
|
139
|
-
return { id, name, url, createdAt: now };
|
|
164
|
+
await sql `INSERT INTO clients (id, name, url, workspace_id, created_at) VALUES (${id}, ${name}, ${url}, ${workspaceId ?? null}, ${now})`;
|
|
165
|
+
return { id, name, url, workspaceId: workspaceId ?? null, createdAt: now };
|
|
140
166
|
},
|
|
141
|
-
async listProjects() {
|
|
167
|
+
async listProjects(workspaceId) {
|
|
142
168
|
await ensureInit();
|
|
143
|
-
const rows =
|
|
144
|
-
|
|
169
|
+
const rows = workspaceId
|
|
170
|
+
? await sql `SELECT * FROM clients WHERE workspace_id = ${workspaceId} ORDER BY created_at DESC`
|
|
171
|
+
: await sql `SELECT * FROM clients ORDER BY created_at DESC`;
|
|
172
|
+
return rows.map((r) => parseProject(r));
|
|
145
173
|
},
|
|
146
|
-
async getProject(id) {
|
|
174
|
+
async getProject(id, workspaceId) {
|
|
147
175
|
await ensureInit();
|
|
148
|
-
const [row] =
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
return
|
|
176
|
+
const [row] = workspaceId
|
|
177
|
+
? await sql `SELECT * FROM clients WHERE id = ${id} AND workspace_id = ${workspaceId}`
|
|
178
|
+
: await sql `SELECT * FROM clients WHERE id = ${id}`;
|
|
179
|
+
return row ? parseProject(row) : undefined;
|
|
152
180
|
},
|
|
153
|
-
async deleteProject(id) {
|
|
181
|
+
async deleteProject(id, workspaceId) {
|
|
154
182
|
await ensureInit();
|
|
183
|
+
const project = await this.getProject(id, workspaceId);
|
|
184
|
+
if (!project)
|
|
185
|
+
return { deleted: false, items_removed: 0 };
|
|
155
186
|
const [{ n }] = await sql `SELECT COUNT(*)::int as n FROM knowledge_items WHERE account_id = ${id}`;
|
|
156
187
|
await sql `DELETE FROM knowledge_items WHERE account_id = ${id}`;
|
|
157
188
|
await sql `DELETE FROM clients WHERE id = ${id}`;
|
|
158
|
-
return { items_removed: n };
|
|
189
|
+
return { deleted: true, items_removed: n };
|
|
159
190
|
},
|
|
160
191
|
async getAll(accountId) {
|
|
161
192
|
await ensureInit();
|
|
@@ -170,10 +201,7 @@ function createPostgresDB(url) {
|
|
|
170
201
|
async insert(id, accountId, category, data) {
|
|
171
202
|
await ensureInit();
|
|
172
203
|
const now = new Date();
|
|
173
|
-
await sql `
|
|
174
|
-
INSERT INTO knowledge_items (id, account_id, category, data, created_at, updated_at)
|
|
175
|
-
VALUES (${id}, ${accountId}, ${category}, ${JSON.stringify(data)}, ${now}, ${now})
|
|
176
|
-
`;
|
|
204
|
+
await sql `INSERT INTO knowledge_items (id, account_id, category, data, created_at, updated_at) VALUES (${id}, ${accountId}, ${category}, ${JSON.stringify(data)}, ${now}, ${now})`;
|
|
177
205
|
},
|
|
178
206
|
async update(id, accountId, data) {
|
|
179
207
|
await ensureInit();
|
package/dist/core/db.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/core/db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,QAAQ,MAAM,UAAU,CAAC;AA2BhC,MAAM,gBAAgB,GAAG
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/core/db.ts"],"names":[],"mappings":"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"}
|
package/dist/core/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export { getContext, getCategory, createItem, updateItem, deleteItem, searchKnowledge, createProject, listProjects, deleteProject } from "./knowledge.js";
|
|
1
|
+
export { getContext, getCategory, createItem, updateItem, deleteItem, searchKnowledge, createProject, listProjects, deleteProject, assertProjectAccess } from "./knowledge.js";
|
|
2
2
|
export { onboardFromUrl } from "./onboard.js";
|
|
3
3
|
export { refreshKnowledge } from "./refresh.js";
|
|
4
|
-
export type { KnowledgeCategory, KnowledgeItem, BusinessContext, OnboardResult, RefreshDiff,
|
|
4
|
+
export type { KnowledgeCategory, KnowledgeItem, BusinessContext, OnboardResult, RefreshDiff, ProjectRow } from "./types.js";
|
|
5
5
|
export { CATEGORIES } from "./types.js";
|
|
6
6
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/core/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC/K,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,eAAe,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC5H,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/core/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { getContext, getCategory, createItem, updateItem, deleteItem, searchKnowledge, createProject, listProjects, deleteProject } from "./knowledge.js";
|
|
1
|
+
export { getContext, getCategory, createItem, updateItem, deleteItem, searchKnowledge, createProject, listProjects, deleteProject, assertProjectAccess } from "./knowledge.js";
|
|
2
2
|
export { onboardFromUrl } from "./onboard.js";
|
|
3
3
|
export { refreshKnowledge } from "./refresh.js";
|
|
4
4
|
export { CATEGORIES } from "./types.js";
|
package/dist/core/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC/K,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/core/knowledge.d.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import type { KnowledgeCategory, BusinessContext,
|
|
2
|
-
export declare function createProject(name: string, url: string): Promise<
|
|
3
|
-
export declare function listProjects(): Promise<
|
|
4
|
-
export declare function deleteProject(
|
|
1
|
+
import type { KnowledgeCategory, BusinessContext, ProjectRow } from "./types.js";
|
|
2
|
+
export declare function createProject(name: string, url: string, workspaceId: string | null): Promise<ProjectRow>;
|
|
3
|
+
export declare function listProjects(workspaceId: string | null): Promise<ProjectRow[]>;
|
|
4
|
+
export declare function deleteProject(projectId: string, workspaceId: string | null): Promise<{
|
|
5
5
|
deleted: boolean;
|
|
6
6
|
items_removed: number;
|
|
7
7
|
}>;
|
|
8
|
+
export declare function assertProjectAccess(projectId: string, workspaceId: string | null): Promise<void>;
|
|
8
9
|
export declare function getContext(accountId: string): Promise<BusinessContext>;
|
|
9
10
|
export declare function getCategory(accountId: string, category: KnowledgeCategory): Promise<{
|
|
10
11
|
id: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"knowledge.d.ts","sourceRoot":"","sources":["../../src/core/knowledge.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,
|
|
1
|
+
{"version":3,"file":"knowledge.d.ts","sourceRoot":"","sources":["../../src/core/knowledge.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEjF,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,CAG9G;AAED,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAEpF;AAED,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CAAC,CAEvI;AAID,wBAAsB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAItG;AAED,wBAAsB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAsC5E;AAED,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB;;KAG/E;AAED,wBAAsB,UAAU,CAC9B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,iBAAiB,EAC3B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;GAK9B;AAED,wBAAsB,UAAU,CAC9B,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;GAK9B;AAED,wBAAsB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM;;;GAG7D;AAED,wBAAsB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;;;KAGrE"}
|
package/dist/core/knowledge.js
CHANGED
|
@@ -1,18 +1,23 @@
|
|
|
1
1
|
import { nanoid } from "nanoid";
|
|
2
2
|
import { db } from "./db.js";
|
|
3
|
-
export async function createProject(name, url) {
|
|
3
|
+
export async function createProject(name, url, workspaceId) {
|
|
4
4
|
const id = nanoid();
|
|
5
|
-
return db.createProject(id, name, url);
|
|
5
|
+
return db.createProject(id, name, url, workspaceId);
|
|
6
6
|
}
|
|
7
|
-
export async function listProjects() {
|
|
8
|
-
return db.listProjects();
|
|
7
|
+
export async function listProjects(workspaceId) {
|
|
8
|
+
return db.listProjects(workspaceId);
|
|
9
9
|
}
|
|
10
|
-
export async function deleteProject(
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
10
|
+
export async function deleteProject(projectId, workspaceId) {
|
|
11
|
+
return db.deleteProject(projectId, workspaceId);
|
|
12
|
+
}
|
|
13
|
+
// Throws if the project doesn't exist or doesn't belong to this workspace.
|
|
14
|
+
// In self-hosted mode (workspaceId = null), access is always granted.
|
|
15
|
+
export async function assertProjectAccess(projectId, workspaceId) {
|
|
16
|
+
if (!workspaceId)
|
|
17
|
+
return;
|
|
18
|
+
const project = await db.getProject(projectId, workspaceId);
|
|
19
|
+
if (!project)
|
|
20
|
+
throw new Error(`Project not found or access denied: ${projectId}`);
|
|
16
21
|
}
|
|
17
22
|
export async function getContext(accountId) {
|
|
18
23
|
const items = await db.getAll(accountId);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"knowledge.js","sourceRoot":"","sources":["../../src/core/knowledge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAG7B,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAY,EAAE,GAAW;
|
|
1
|
+
{"version":3,"file":"knowledge.js","sourceRoot":"","sources":["../../src/core/knowledge.ts"],"names":[],"mappings":"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"}
|
package/dist/core/types.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
export interface
|
|
1
|
+
export interface ProjectRow {
|
|
2
2
|
id: string;
|
|
3
3
|
name: string;
|
|
4
4
|
url: string;
|
|
5
|
+
workspaceId: string | null;
|
|
5
6
|
createdAt: Date;
|
|
6
7
|
}
|
|
7
8
|
export declare const CATEGORIES: readonly ["offer", "persona", "objection", "differentiator", "competitor", "geo", "pricing", "faq", "profile"];
|
package/dist/core/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,eAAO,MAAM,UAAU,gHAUb,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;AAE5D,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACxC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAClC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACpC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACtC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAC3C,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACvC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACnC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAChC,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,eAAe,CAAC;IACzB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAC1C,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAClC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACpC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACtC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAC3C,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACnC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAChC,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB"}
|
package/dist/core/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,OAAO;IACP,SAAS;IACT,WAAW;IACX,gBAAgB;IAChB,YAAY;IACZ,KAAK;IACL,SAAS;IACT,KAAK;IACL,SAAS;CACD,CAAC"}
|
package/dist/mcp/server.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
3
3
|
import { buildServer } from "../mcp.js";
|
|
4
|
-
const server = buildServer();
|
|
4
|
+
const server = buildServer(null);
|
|
5
5
|
const transport = new StdioServerTransport();
|
|
6
6
|
await server.connect(transport);
|
|
7
7
|
//# sourceMappingURL=server.js.map
|
package/dist/mcp/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,MAAM,MAAM,GAAG,WAAW,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;AACjC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC"}
|
package/dist/mcp.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
2
|
import type { Context } from "hono";
|
|
3
|
-
export declare function buildServer(): McpServer;
|
|
3
|
+
export declare function buildServer(workspaceId: string | null): McpServer;
|
|
4
4
|
export declare function createMcpHandler(): (c: Context) => Promise<Response>;
|
|
5
5
|
//# sourceMappingURL=mcp.d.ts.map
|
package/dist/mcp.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAqBpC,wBAAgB,WAAW,IAAI,SAAS,
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAqBpC,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CA0IjE;AAED,wBAAgB,gBAAgB,KAChB,GAAG,OAAO,uBAOzB"}
|
package/dist/mcp.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
2
|
import { WebStandardStreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js";
|
|
3
3
|
import { z } from "zod";
|
|
4
|
-
import { getContext, getCategory, createItem, updateItem, deleteItem, searchKnowledge, createProject, listProjects, deleteProject, } from "./core/knowledge.js";
|
|
4
|
+
import { getContext, getCategory, createItem, updateItem, deleteItem, searchKnowledge, createProject, listProjects, deleteProject, assertProjectAccess, } from "./core/knowledge.js";
|
|
5
5
|
import { onboardFromUrl } from "./core/onboard.js";
|
|
6
6
|
import { refreshKnowledge } from "./core/refresh.js";
|
|
7
7
|
const CATEGORY_ENUM = z.enum([
|
|
@@ -12,44 +12,44 @@ const PROJECT_ID_PARAM = z.string().optional().describe("Project ID. If omitted,
|
|
|
12
12
|
function resolveProjectId(projectId) {
|
|
13
13
|
return projectId ?? process.env.ROOT_ACCOUNT_ID ?? "default";
|
|
14
14
|
}
|
|
15
|
-
export function buildServer() {
|
|
16
|
-
const server = new McpServer({ name: "root", version: "0.4.
|
|
17
|
-
// ──
|
|
15
|
+
export function buildServer(workspaceId) {
|
|
16
|
+
const server = new McpServer({ name: "root", version: "0.4.3" });
|
|
17
|
+
// ── PROJECT MANAGEMENT ─────────────────────────────────────────────────────
|
|
18
18
|
server.registerTool("root_create_project", {
|
|
19
|
-
description: "Create a new
|
|
19
|
+
description: "Create a new project and automatically onboard its website. Scrapes the URL, extracts business knowledge (offers, personas, competitors, geo zones…) and stores it under a new isolated project ID. Returns the project object and the full onboarding summary.",
|
|
20
20
|
inputSchema: {
|
|
21
|
-
name: z.string().describe("
|
|
21
|
+
name: z.string().describe("Project name (e.g. 'Mon business', 'Agence Dupont', 'Projet X')"),
|
|
22
22
|
url: z.string().describe("Website URL to onboard (e.g. 'https://dupont.fr')"),
|
|
23
23
|
},
|
|
24
24
|
}, async ({ name, url }) => {
|
|
25
|
-
const
|
|
26
|
-
const onboarding = await onboardFromUrl(
|
|
27
|
-
return { content: [{ type: "text", text: JSON.stringify({
|
|
25
|
+
const project = await createProject(name, url, workspaceId);
|
|
26
|
+
const onboarding = await onboardFromUrl(project.id, url);
|
|
27
|
+
return { content: [{ type: "text", text: JSON.stringify({ project, onboarding }) }] };
|
|
28
28
|
});
|
|
29
29
|
server.registerTool("root_list_projects", {
|
|
30
|
-
description: "List all
|
|
30
|
+
description: "List all projects accessible in this workspace — name, URL, project ID, and creation date.",
|
|
31
31
|
inputSchema: {},
|
|
32
32
|
}, async () => {
|
|
33
|
-
const
|
|
34
|
-
return { content: [{ type: "text", text: JSON.stringify({ count:
|
|
33
|
+
const projects = await listProjects(workspaceId);
|
|
34
|
+
return { content: [{ type: "text", text: JSON.stringify({ count: projects.length, projects }) }] };
|
|
35
35
|
});
|
|
36
36
|
server.registerTool("root_delete_project", {
|
|
37
|
-
description: "Delete
|
|
37
|
+
description: "Delete a project and all its associated knowledge items.",
|
|
38
38
|
inputSchema: {
|
|
39
|
-
project_id: z.string().describe("The
|
|
39
|
+
project_id: z.string().describe("The project ID to delete"),
|
|
40
40
|
},
|
|
41
41
|
}, async ({ project_id }) => {
|
|
42
|
-
const result = await deleteProject(project_id);
|
|
42
|
+
const result = await deleteProject(project_id, workspaceId);
|
|
43
43
|
return { content: [{ type: "text", text: JSON.stringify(result) }] };
|
|
44
44
|
});
|
|
45
45
|
// ── KNOWLEDGE TOOLS ────────────────────────────────────────────────────────
|
|
46
46
|
server.registerTool("root_get_context", {
|
|
47
|
-
description: "Returns complete business knowledge for a
|
|
48
|
-
inputSchema: {
|
|
49
|
-
project_id: PROJECT_ID_PARAM,
|
|
50
|
-
},
|
|
47
|
+
description: "Returns complete business knowledge for a project — offers, personas, objections, differentiators, competitors, geo zones, pricing, and FAQs. ALWAYS call this tool before generating any content, SEO article, email, or prospection material.",
|
|
48
|
+
inputSchema: { project_id: PROJECT_ID_PARAM },
|
|
51
49
|
}, async ({ project_id }) => {
|
|
52
|
-
const
|
|
50
|
+
const pid = resolveProjectId(project_id);
|
|
51
|
+
await assertProjectAccess(pid, workspaceId);
|
|
52
|
+
const context = await getContext(pid);
|
|
53
53
|
return { content: [{ type: "text", text: JSON.stringify(context) }] };
|
|
54
54
|
});
|
|
55
55
|
server.registerTool("root_get_category", {
|
|
@@ -59,38 +59,46 @@ export function buildServer() {
|
|
|
59
59
|
category: CATEGORY_ENUM.describe("The knowledge category to retrieve"),
|
|
60
60
|
},
|
|
61
61
|
}, async ({ project_id, category }) => {
|
|
62
|
-
const
|
|
62
|
+
const pid = resolveProjectId(project_id);
|
|
63
|
+
await assertProjectAccess(pid, workspaceId);
|
|
64
|
+
const items = await getCategory(pid, category);
|
|
63
65
|
return { content: [{ type: "text", text: JSON.stringify({ category, count: items.length, items }) }] };
|
|
64
66
|
});
|
|
65
67
|
server.registerTool("root_search", {
|
|
66
|
-
description: "Search across all business knowledge with a text query.
|
|
68
|
+
description: "Search across all business knowledge with a text query.",
|
|
67
69
|
inputSchema: {
|
|
68
70
|
project_id: PROJECT_ID_PARAM,
|
|
69
71
|
query: z.string().describe("Search query"),
|
|
70
72
|
},
|
|
71
73
|
}, async ({ project_id, query }) => {
|
|
72
|
-
const
|
|
74
|
+
const pid = resolveProjectId(project_id);
|
|
75
|
+
await assertProjectAccess(pid, workspaceId);
|
|
76
|
+
const results = await searchKnowledge(pid, query);
|
|
73
77
|
return { content: [{ type: "text", text: JSON.stringify({ query, count: results.length, results }) }] };
|
|
74
78
|
});
|
|
75
79
|
server.registerTool("root_onboard_from_url", {
|
|
76
|
-
description: "Onboard a
|
|
80
|
+
description: "Onboard a project by scraping a website URL. Extracts offers, personas, differentiators, geo zones, pricing, FAQs, and analyzes local competitors. Use root_create_project instead if the project doesn't exist yet.",
|
|
77
81
|
inputSchema: {
|
|
78
82
|
project_id: PROJECT_ID_PARAM,
|
|
79
|
-
url: z.string().describe("The
|
|
83
|
+
url: z.string().describe("The website URL to scrape (e.g. https://example.fr)"),
|
|
80
84
|
},
|
|
81
85
|
}, async ({ project_id, url }) => {
|
|
82
|
-
const
|
|
86
|
+
const pid = resolveProjectId(project_id);
|
|
87
|
+
await assertProjectAccess(pid, workspaceId);
|
|
88
|
+
const result = await onboardFromUrl(pid, url);
|
|
83
89
|
return { content: [{ type: "text", text: JSON.stringify(result) }] };
|
|
84
90
|
});
|
|
85
91
|
server.registerTool("root_create_item", {
|
|
86
|
-
description: "Add a new knowledge item to a category.
|
|
92
|
+
description: "Add a new knowledge item to a category.",
|
|
87
93
|
inputSchema: {
|
|
88
94
|
project_id: PROJECT_ID_PARAM,
|
|
89
95
|
category: CATEGORY_ENUM.describe("Knowledge category"),
|
|
90
96
|
data: z.record(z.unknown()).describe("The item data as a JSON object"),
|
|
91
97
|
},
|
|
92
98
|
}, async ({ project_id, category, data }) => {
|
|
93
|
-
const
|
|
99
|
+
const pid = resolveProjectId(project_id);
|
|
100
|
+
await assertProjectAccess(pid, workspaceId);
|
|
101
|
+
const item = await createItem(pid, category, data);
|
|
94
102
|
return { content: [{ type: "text", text: JSON.stringify({ success: true, item }) }] };
|
|
95
103
|
});
|
|
96
104
|
server.registerTool("root_update_item", {
|
|
@@ -101,7 +109,9 @@ export function buildServer() {
|
|
|
101
109
|
data: z.record(z.unknown()).describe("Fields to update (merged with existing data)"),
|
|
102
110
|
},
|
|
103
111
|
}, async ({ project_id, id, data }) => {
|
|
104
|
-
const
|
|
112
|
+
const pid = resolveProjectId(project_id);
|
|
113
|
+
await assertProjectAccess(pid, workspaceId);
|
|
114
|
+
const item = await updateItem(pid, id, data);
|
|
105
115
|
return { content: [{ type: "text", text: JSON.stringify({ success: true, item }) }] };
|
|
106
116
|
});
|
|
107
117
|
server.registerTool("root_delete_item", {
|
|
@@ -111,24 +121,27 @@ export function buildServer() {
|
|
|
111
121
|
id: z.string().describe("The item ID to delete"),
|
|
112
122
|
},
|
|
113
123
|
}, async ({ project_id, id }) => {
|
|
114
|
-
const
|
|
124
|
+
const pid = resolveProjectId(project_id);
|
|
125
|
+
await assertProjectAccess(pid, workspaceId);
|
|
126
|
+
const result = await deleteItem(pid, id);
|
|
115
127
|
return { content: [{ type: "text", text: JSON.stringify(result) }] };
|
|
116
128
|
});
|
|
117
129
|
server.registerTool("root_refresh", {
|
|
118
|
-
description: "Refresh market intelligence for a
|
|
119
|
-
inputSchema: {
|
|
120
|
-
project_id: PROJECT_ID_PARAM,
|
|
121
|
-
},
|
|
130
|
+
description: "Refresh market intelligence for a project. Re-queries DataForSEO SERP for the configured geo zones and sector, detects new and lost competitors. Returns a structured diff.",
|
|
131
|
+
inputSchema: { project_id: PROJECT_ID_PARAM },
|
|
122
132
|
}, async ({ project_id }) => {
|
|
123
|
-
const
|
|
133
|
+
const pid = resolveProjectId(project_id);
|
|
134
|
+
await assertProjectAccess(pid, workspaceId);
|
|
135
|
+
const diff = await refreshKnowledge(pid);
|
|
124
136
|
return { content: [{ type: "text", text: JSON.stringify(diff) }] };
|
|
125
137
|
});
|
|
126
138
|
return server;
|
|
127
139
|
}
|
|
128
140
|
export function createMcpHandler() {
|
|
129
141
|
return async (c) => {
|
|
142
|
+
const workspaceId = c.get("workspaceId") ?? null;
|
|
130
143
|
const transport = new WebStandardStreamableHTTPServerTransport({ sessionIdGenerator: undefined });
|
|
131
|
-
const server = buildServer();
|
|
144
|
+
const server = buildServer(workspaceId);
|
|
132
145
|
await server.connect(transport);
|
|
133
146
|
return transport.handleRequest(c.req.raw);
|
|
134
147
|
};
|
package/dist/mcp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,wCAAwC,EAAE,MAAM,+DAA+D,CAAC;AACzH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EACL,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAC5E,aAAa,EAAE,YAAY,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}
|