@pellux/goodvibes-sdk 0.25.21 → 0.26.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/dist/_internal/contracts/artifacts/operator-contract.json +5000 -149
- package/dist/_internal/contracts/generated/foundation-client-types.d.ts +83 -15
- package/dist/_internal/contracts/generated/foundation-client-types.d.ts.map +1 -1
- package/dist/_internal/contracts/generated/foundation-metadata.d.ts +2 -2
- package/dist/_internal/contracts/generated/foundation-metadata.js +2 -2
- package/dist/_internal/contracts/generated/operator-contract.d.ts.map +1 -1
- package/dist/_internal/contracts/generated/operator-contract.js +5000 -149
- package/dist/_internal/contracts/generated/operator-method-ids.d.ts +1 -1
- package/dist/_internal/contracts/generated/operator-method-ids.d.ts.map +1 -1
- package/dist/_internal/contracts/generated/operator-method-ids.js +18 -0
- package/dist/_internal/daemon/context.d.ts +1 -0
- package/dist/_internal/daemon/context.d.ts.map +1 -1
- package/dist/_internal/daemon/knowledge-route-types.d.ts +1 -0
- package/dist/_internal/daemon/knowledge-route-types.d.ts.map +1 -1
- package/dist/_internal/daemon/knowledge-routes.d.ts +1 -1
- package/dist/_internal/daemon/knowledge-routes.d.ts.map +1 -1
- package/dist/_internal/daemon/knowledge-routes.js +30 -0
- package/dist/_internal/daemon/operator.d.ts +1 -1
- package/dist/_internal/daemon/operator.d.ts.map +1 -1
- package/dist/_internal/daemon/operator.js +2 -0
- package/dist/_internal/platform/control-plane/method-catalog-control-automation.js +7 -7
- package/dist/_internal/platform/control-plane/method-catalog-control-core.d.ts.map +1 -1
- package/dist/_internal/platform/control-plane/method-catalog-control-core.js +4 -9
- package/dist/_internal/platform/control-plane/method-catalog-homegraph.d.ts +3 -0
- package/dist/_internal/platform/control-plane/method-catalog-homegraph.d.ts.map +1 -0
- package/dist/_internal/platform/control-plane/method-catalog-homegraph.js +223 -0
- package/dist/_internal/platform/control-plane/method-catalog-knowledge.d.ts.map +1 -1
- package/dist/_internal/platform/control-plane/method-catalog-knowledge.js +23 -1
- package/dist/_internal/platform/control-plane/operator-contract-schemas-knowledge.d.ts +15 -1
- package/dist/_internal/platform/control-plane/operator-contract-schemas-knowledge.d.ts.map +1 -1
- package/dist/_internal/platform/control-plane/operator-contract-schemas-knowledge.js +118 -0
- package/dist/_internal/platform/daemon/facade-composition.d.ts.map +1 -1
- package/dist/_internal/platform/daemon/facade-composition.js +2 -0
- package/dist/_internal/platform/daemon/facade-types.d.ts +2 -1
- package/dist/_internal/platform/daemon/facade-types.d.ts.map +1 -1
- package/dist/_internal/platform/daemon/http/home-graph-routes.d.ts +18 -0
- package/dist/_internal/platform/daemon/http/home-graph-routes.d.ts.map +1 -0
- package/dist/_internal/platform/daemon/http/home-graph-routes.js +108 -0
- package/dist/_internal/platform/daemon/http/router-route-contexts.d.ts.map +1 -1
- package/dist/_internal/platform/daemon/http/router-route-contexts.js +1 -0
- package/dist/_internal/platform/daemon/http/router.d.ts +4 -1
- package/dist/_internal/platform/daemon/http/router.d.ts.map +1 -1
- package/dist/_internal/platform/daemon/http/router.js +16 -0
- package/dist/_internal/platform/daemon/types.d.ts +2 -1
- package/dist/_internal/platform/daemon/types.d.ts.map +1 -1
- package/dist/_internal/platform/knowledge/browser-history/discover.d.ts +3 -0
- package/dist/_internal/platform/knowledge/browser-history/discover.d.ts.map +1 -0
- package/dist/_internal/platform/knowledge/browser-history/discover.js +88 -0
- package/dist/_internal/platform/knowledge/browser-history/index.d.ts +7 -0
- package/dist/_internal/platform/knowledge/browser-history/index.d.ts.map +1 -0
- package/dist/_internal/platform/knowledge/browser-history/index.js +4 -0
- package/dist/_internal/platform/knowledge/browser-history/ingest.d.ts +12 -0
- package/dist/_internal/platform/knowledge/browser-history/ingest.d.ts.map +1 -0
- package/dist/_internal/platform/knowledge/browser-history/ingest.js +275 -0
- package/dist/_internal/platform/knowledge/browser-history/locked-db.d.ts +7 -0
- package/dist/_internal/platform/knowledge/browser-history/locked-db.d.ts.map +1 -0
- package/dist/_internal/platform/knowledge/browser-history/locked-db.js +38 -0
- package/dist/_internal/platform/knowledge/browser-history/paths.d.ts +15 -0
- package/dist/_internal/platform/knowledge/browser-history/paths.d.ts.map +1 -0
- package/dist/_internal/platform/knowledge/browser-history/paths.js +125 -0
- package/dist/_internal/platform/knowledge/browser-history/readers.d.ts +8 -0
- package/dist/_internal/platform/knowledge/browser-history/readers.d.ts.map +1 -0
- package/dist/_internal/platform/knowledge/browser-history/readers.js +374 -0
- package/dist/_internal/platform/knowledge/browser-history/types.d.ts +50 -0
- package/dist/_internal/platform/knowledge/browser-history/types.d.ts.map +1 -0
- package/dist/_internal/platform/knowledge/browser-history/types.js +1 -0
- package/dist/_internal/platform/knowledge/consolidation.js +2 -0
- package/dist/_internal/platform/knowledge/extractors.d.ts.map +1 -1
- package/dist/_internal/platform/knowledge/extractors.js +31 -0
- package/dist/_internal/platform/knowledge/graphql-schema.d.ts +1 -1
- package/dist/_internal/platform/knowledge/graphql-schema.d.ts.map +1 -1
- package/dist/_internal/platform/knowledge/graphql-schema.js +5 -5
- package/dist/_internal/platform/knowledge/graphql.d.ts.map +1 -1
- package/dist/_internal/platform/knowledge/graphql.js +16 -5
- package/dist/_internal/platform/knowledge/home-graph/helpers.d.ts +46 -0
- package/dist/_internal/platform/knowledge/home-graph/helpers.d.ts.map +1 -0
- package/dist/_internal/platform/knowledge/home-graph/helpers.js +230 -0
- package/dist/_internal/platform/knowledge/home-graph/index.d.ts +4 -0
- package/dist/_internal/platform/knowledge/home-graph/index.d.ts.map +1 -0
- package/dist/_internal/platform/knowledge/home-graph/index.js +2 -0
- package/dist/_internal/platform/knowledge/home-graph/rendering.d.ts +25 -0
- package/dist/_internal/platform/knowledge/home-graph/rendering.d.ts.map +1 -0
- package/dist/_internal/platform/knowledge/home-graph/rendering.js +139 -0
- package/dist/_internal/platform/knowledge/home-graph/service.d.ts +82 -0
- package/dist/_internal/platform/knowledge/home-graph/service.d.ts.map +1 -0
- package/dist/_internal/platform/knowledge/home-graph/service.js +654 -0
- package/dist/_internal/platform/knowledge/home-graph/state.d.ts +24 -0
- package/dist/_internal/platform/knowledge/home-graph/state.d.ts.map +1 -0
- package/dist/_internal/platform/knowledge/home-graph/state.js +96 -0
- package/dist/_internal/platform/knowledge/home-graph/types.d.ts +206 -0
- package/dist/_internal/platform/knowledge/home-graph/types.d.ts.map +1 -0
- package/dist/_internal/platform/knowledge/home-graph/types.js +33 -0
- package/dist/_internal/platform/knowledge/html-readability.d.ts +13 -0
- package/dist/_internal/platform/knowledge/html-readability.d.ts.map +1 -0
- package/dist/_internal/platform/knowledge/html-readability.js +66 -0
- package/dist/_internal/platform/knowledge/index.d.ts +6 -0
- package/dist/_internal/platform/knowledge/index.d.ts.map +1 -1
- package/dist/_internal/platform/knowledge/index.js +3 -0
- package/dist/_internal/platform/knowledge/internal.d.ts.map +1 -1
- package/dist/_internal/platform/knowledge/internal.js +1 -0
- package/dist/_internal/platform/knowledge/knowledge-api.d.ts +2 -0
- package/dist/_internal/platform/knowledge/knowledge-api.d.ts.map +1 -1
- package/dist/_internal/platform/knowledge/knowledge-api.js +1 -0
- package/dist/_internal/platform/knowledge/lint.js +1 -0
- package/dist/_internal/platform/knowledge/scheduling.d.ts.map +1 -1
- package/dist/_internal/platform/knowledge/scheduling.js +1 -0
- package/dist/_internal/platform/knowledge/service.d.ts +4 -0
- package/dist/_internal/platform/knowledge/service.d.ts.map +1 -1
- package/dist/_internal/platform/knowledge/service.js +15 -0
- package/dist/_internal/platform/knowledge/spaces.d.ts +19 -0
- package/dist/_internal/platform/knowledge/spaces.d.ts.map +1 -0
- package/dist/_internal/platform/knowledge/spaces.js +54 -0
- package/dist/_internal/platform/knowledge/types.d.ts +3 -3
- package/dist/_internal/platform/knowledge/types.d.ts.map +1 -1
- package/dist/_internal/platform/runtime/services.d.ts +2 -1
- package/dist/_internal/platform/runtime/services.d.ts.map +1 -1
- package/dist/_internal/platform/runtime/services.js +3 -1
- package/dist/_internal/platform/version.js +1 -1
- package/package.json +4 -1
|
@@ -0,0 +1,374 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { Database } from 'bun:sqlite';
|
|
3
|
+
import bplistParserDefault from 'bplist-parser';
|
|
4
|
+
import { copyLockedBrowserSqlite } from './locked-db.js';
|
|
5
|
+
const bplistParser = bplistParserDefault;
|
|
6
|
+
const CHROMIUM_EPOCH_OFFSET_MS = 11_644_473_600_000;
|
|
7
|
+
const MAC_ABSOLUTE_TIME_OFFSET_S = 978_307_200;
|
|
8
|
+
function chromiumMicrosToMs(micros) {
|
|
9
|
+
return Math.floor(micros / 1000) - CHROMIUM_EPOCH_OFFSET_MS;
|
|
10
|
+
}
|
|
11
|
+
function msToChromiumMicros(ms) {
|
|
12
|
+
return Math.floor((ms + CHROMIUM_EPOCH_OFFSET_MS) * 1000);
|
|
13
|
+
}
|
|
14
|
+
function geckoMicrosToMs(micros) {
|
|
15
|
+
return Math.floor(micros / 1000);
|
|
16
|
+
}
|
|
17
|
+
function macAbsoluteTimeToMs(seconds) {
|
|
18
|
+
return Math.floor((seconds + MAC_ABSOLUTE_TIME_OFFSET_S) * 1000);
|
|
19
|
+
}
|
|
20
|
+
function msToMacAbsoluteSeconds(ms) {
|
|
21
|
+
return Math.floor(ms / 1000) - MAC_ABSOLUTE_TIME_OFFSET_S;
|
|
22
|
+
}
|
|
23
|
+
function cleanOptionalText(value) {
|
|
24
|
+
if (typeof value !== 'string')
|
|
25
|
+
return undefined;
|
|
26
|
+
const trimmed = value.trim();
|
|
27
|
+
return trimmed ? trimmed : undefined;
|
|
28
|
+
}
|
|
29
|
+
function decodeChromiumTransition(raw) {
|
|
30
|
+
return {
|
|
31
|
+
0: 'LINK',
|
|
32
|
+
1: 'TYPED',
|
|
33
|
+
2: 'AUTO_BOOKMARK',
|
|
34
|
+
3: 'AUTO_SUBFRAME',
|
|
35
|
+
4: 'MANUAL_SUBFRAME',
|
|
36
|
+
5: 'GENERATED',
|
|
37
|
+
6: 'START_PAGE',
|
|
38
|
+
7: 'FORM_SUBMIT',
|
|
39
|
+
8: 'RELOAD',
|
|
40
|
+
9: 'KEYWORD',
|
|
41
|
+
10: 'KEYWORD_GENERATED',
|
|
42
|
+
}[raw & 0xff] ?? 'UNKNOWN';
|
|
43
|
+
}
|
|
44
|
+
function decodeGeckoVisitType(visitType) {
|
|
45
|
+
return {
|
|
46
|
+
1: 'LINK',
|
|
47
|
+
2: 'TYPED',
|
|
48
|
+
3: 'BOOKMARK',
|
|
49
|
+
4: 'EMBED',
|
|
50
|
+
5: 'PERMANENT_REDIRECT',
|
|
51
|
+
6: 'TEMPORARY_REDIRECT',
|
|
52
|
+
7: 'DOWNLOAD',
|
|
53
|
+
8: 'FRAMED_LINK',
|
|
54
|
+
9: 'RELOAD',
|
|
55
|
+
}[visitType] ?? 'UNKNOWN';
|
|
56
|
+
}
|
|
57
|
+
function normalizeLimit(limit, fallback = 1000) {
|
|
58
|
+
const candidate = typeof limit === 'number' && Number.isFinite(limit) ? limit : fallback;
|
|
59
|
+
return Math.max(1, Math.min(50_000, Math.floor(candidate)));
|
|
60
|
+
}
|
|
61
|
+
async function readChromiumHistory(profile, options) {
|
|
62
|
+
if (!profile.historyPath)
|
|
63
|
+
return [];
|
|
64
|
+
const limit = normalizeLimit(options.limit);
|
|
65
|
+
const since = typeof options.sinceMs === 'number' ? msToChromiumMicros(options.sinceMs) : 0;
|
|
66
|
+
const copy = await copyLockedBrowserSqlite(profile.historyPath);
|
|
67
|
+
try {
|
|
68
|
+
const db = new Database(copy.copiedDbPath, { readonly: true });
|
|
69
|
+
try {
|
|
70
|
+
const urlRows = db.query('SELECT id, url, title, visit_count FROM urls').all();
|
|
71
|
+
const urlMap = new Map(urlRows.map((row) => [row.id, row]));
|
|
72
|
+
const visitRows = db.query(`SELECT url, visit_time, transition
|
|
73
|
+
FROM visits
|
|
74
|
+
WHERE visit_time >= ?
|
|
75
|
+
ORDER BY visit_time DESC
|
|
76
|
+
LIMIT ?`).all(since, limit);
|
|
77
|
+
return visitRows.flatMap((visit) => {
|
|
78
|
+
const url = urlMap.get(visit.url);
|
|
79
|
+
if (!url?.url)
|
|
80
|
+
return [];
|
|
81
|
+
return [{
|
|
82
|
+
sourceKind: 'history',
|
|
83
|
+
url: url.url,
|
|
84
|
+
...(cleanOptionalText(url.title) ? { title: cleanOptionalText(url.title) } : {}),
|
|
85
|
+
browser: profile.browser,
|
|
86
|
+
family: profile.family,
|
|
87
|
+
profileName: profile.profileName,
|
|
88
|
+
profilePath: profile.profilePath,
|
|
89
|
+
visitedAtMs: chromiumMicrosToMs(visit.visit_time),
|
|
90
|
+
visitCount: url.visit_count,
|
|
91
|
+
transition: decodeChromiumTransition(visit.transition),
|
|
92
|
+
rawId: url.id,
|
|
93
|
+
}];
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
finally {
|
|
97
|
+
db.close();
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
finally {
|
|
101
|
+
await copy.cleanup();
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
function walkChromiumBookmarkNode(profile, node, folders, out, limit) {
|
|
105
|
+
if (out.length >= limit)
|
|
106
|
+
return;
|
|
107
|
+
if (node.type === 'url') {
|
|
108
|
+
const url = cleanOptionalText(node.url);
|
|
109
|
+
if (!url)
|
|
110
|
+
return;
|
|
111
|
+
const micros = Number(node.date_added ?? 0);
|
|
112
|
+
out.push({
|
|
113
|
+
sourceKind: 'bookmark',
|
|
114
|
+
url,
|
|
115
|
+
...(cleanOptionalText(node.name) ? { title: cleanOptionalText(node.name) } : {}),
|
|
116
|
+
browser: profile.browser,
|
|
117
|
+
family: profile.family,
|
|
118
|
+
profileName: profile.profileName,
|
|
119
|
+
profilePath: profile.profilePath,
|
|
120
|
+
...(folders.length ? { folderPath: `/${folders.join('/')}` } : {}),
|
|
121
|
+
...(Number.isFinite(micros) && micros > 0 ? { addedAtMs: chromiumMicrosToMs(micros) } : {}),
|
|
122
|
+
...(node.id ? { rawId: node.id } : {}),
|
|
123
|
+
});
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
if (node.type === 'folder') {
|
|
127
|
+
const nextFolders = cleanOptionalText(node.name) ? [...folders, node.name.trim()] : [...folders];
|
|
128
|
+
for (const child of node.children ?? []) {
|
|
129
|
+
walkChromiumBookmarkNode(profile, child, nextFolders, out, limit);
|
|
130
|
+
if (out.length >= limit)
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
async function readChromiumBookmarks(profile, options) {
|
|
136
|
+
if (!profile.bookmarksPath)
|
|
137
|
+
return [];
|
|
138
|
+
const limit = normalizeLimit(options.limit);
|
|
139
|
+
const parsed = JSON.parse(await readFile(profile.bookmarksPath, 'utf8'));
|
|
140
|
+
const out = [];
|
|
141
|
+
for (const key of ['bookmark_bar', 'other', 'synced']) {
|
|
142
|
+
const root = parsed.roots?.[key];
|
|
143
|
+
if (!root)
|
|
144
|
+
continue;
|
|
145
|
+
walkChromiumBookmarkNode(profile, root, [], out, limit);
|
|
146
|
+
if (out.length >= limit)
|
|
147
|
+
break;
|
|
148
|
+
}
|
|
149
|
+
return out;
|
|
150
|
+
}
|
|
151
|
+
async function readGeckoHistory(profile, options) {
|
|
152
|
+
if (!profile.historyPath)
|
|
153
|
+
return [];
|
|
154
|
+
const copy = await copyLockedBrowserSqlite(profile.historyPath);
|
|
155
|
+
try {
|
|
156
|
+
const db = new Database(copy.copiedDbPath, { readonly: true });
|
|
157
|
+
try {
|
|
158
|
+
const since = typeof options.sinceMs === 'number' ? Math.floor(options.sinceMs * 1000) : 0;
|
|
159
|
+
const rows = db.query(`SELECT p.id AS place_id, p.url, p.title, p.visit_count, h.visit_date, h.visit_type
|
|
160
|
+
FROM moz_historyvisits h
|
|
161
|
+
JOIN moz_places p ON p.id = h.place_id
|
|
162
|
+
WHERE p.hidden = 0 AND h.visit_date >= ?
|
|
163
|
+
ORDER BY h.visit_date DESC
|
|
164
|
+
LIMIT ?`).all(since, normalizeLimit(options.limit));
|
|
165
|
+
return rows.map((row) => ({
|
|
166
|
+
sourceKind: 'history',
|
|
167
|
+
url: row.url,
|
|
168
|
+
...(cleanOptionalText(row.title) ? { title: cleanOptionalText(row.title) } : {}),
|
|
169
|
+
browser: profile.browser,
|
|
170
|
+
family: profile.family,
|
|
171
|
+
profileName: profile.profileName,
|
|
172
|
+
profilePath: profile.profilePath,
|
|
173
|
+
visitedAtMs: geckoMicrosToMs(row.visit_date),
|
|
174
|
+
visitCount: row.visit_count,
|
|
175
|
+
transition: decodeGeckoVisitType(row.visit_type),
|
|
176
|
+
rawId: row.place_id,
|
|
177
|
+
}));
|
|
178
|
+
}
|
|
179
|
+
finally {
|
|
180
|
+
db.close();
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
finally {
|
|
184
|
+
await copy.cleanup();
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
const GECKO_ROOT_LABELS = {
|
|
188
|
+
1: 'root',
|
|
189
|
+
2: 'Bookmarks Menu',
|
|
190
|
+
3: 'Bookmarks Toolbar',
|
|
191
|
+
4: 'Tags',
|
|
192
|
+
5: 'Other Bookmarks',
|
|
193
|
+
6: 'Mobile Bookmarks',
|
|
194
|
+
};
|
|
195
|
+
function geckoFolderPath(parent, rows) {
|
|
196
|
+
const segments = [];
|
|
197
|
+
const visited = new Set();
|
|
198
|
+
let current = parent;
|
|
199
|
+
while (current > 0 && !visited.has(current)) {
|
|
200
|
+
visited.add(current);
|
|
201
|
+
const row = rows.get(current);
|
|
202
|
+
if (!row)
|
|
203
|
+
break;
|
|
204
|
+
const root = GECKO_ROOT_LABELS[current];
|
|
205
|
+
if (root) {
|
|
206
|
+
segments.unshift(root);
|
|
207
|
+
break;
|
|
208
|
+
}
|
|
209
|
+
if (row.title)
|
|
210
|
+
segments.unshift(row.title);
|
|
211
|
+
current = row.parent;
|
|
212
|
+
}
|
|
213
|
+
return segments.length ? `/${segments.join('/')}` : undefined;
|
|
214
|
+
}
|
|
215
|
+
async function readGeckoBookmarks(profile, options) {
|
|
216
|
+
const path = profile.bookmarksPath ?? profile.historyPath;
|
|
217
|
+
if (!path)
|
|
218
|
+
return [];
|
|
219
|
+
const copy = await copyLockedBrowserSqlite(path);
|
|
220
|
+
try {
|
|
221
|
+
const db = new Database(copy.copiedDbPath, { readonly: true });
|
|
222
|
+
try {
|
|
223
|
+
const rows = db.query('SELECT id, type, parent, title, fk, dateAdded FROM moz_bookmarks ORDER BY id').all();
|
|
224
|
+
const places = db.query('SELECT id, url, title FROM moz_places').all();
|
|
225
|
+
const rowById = new Map(rows.map((row) => [row.id, row]));
|
|
226
|
+
const placeById = new Map(places.map((place) => [place.id, place]));
|
|
227
|
+
const out = [];
|
|
228
|
+
for (const row of rows) {
|
|
229
|
+
if (out.length >= normalizeLimit(options.limit))
|
|
230
|
+
break;
|
|
231
|
+
if (row.type !== 1 || row.fk === null)
|
|
232
|
+
continue;
|
|
233
|
+
const place = placeById.get(row.fk);
|
|
234
|
+
if (!place?.url)
|
|
235
|
+
continue;
|
|
236
|
+
const addedAtMs = Math.max(0, Math.floor(row.dateAdded / 1000));
|
|
237
|
+
out.push({
|
|
238
|
+
sourceKind: 'bookmark',
|
|
239
|
+
url: place.url,
|
|
240
|
+
...(cleanOptionalText(row.title ?? place.title) ? { title: cleanOptionalText(row.title ?? place.title) } : {}),
|
|
241
|
+
browser: profile.browser,
|
|
242
|
+
family: profile.family,
|
|
243
|
+
profileName: profile.profileName,
|
|
244
|
+
profilePath: profile.profilePath,
|
|
245
|
+
...(geckoFolderPath(row.parent, rowById) ? { folderPath: geckoFolderPath(row.parent, rowById) } : {}),
|
|
246
|
+
...(addedAtMs > 0 ? { addedAtMs } : {}),
|
|
247
|
+
rawId: row.id,
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
return out;
|
|
251
|
+
}
|
|
252
|
+
finally {
|
|
253
|
+
db.close();
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
finally {
|
|
257
|
+
await copy.cleanup();
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
async function readWebKitHistory(profile, options) {
|
|
261
|
+
if (!profile.historyPath)
|
|
262
|
+
return [];
|
|
263
|
+
const copy = await copyLockedBrowserSqlite(profile.historyPath);
|
|
264
|
+
try {
|
|
265
|
+
const db = new Database(copy.copiedDbPath, { readonly: true });
|
|
266
|
+
try {
|
|
267
|
+
if (profile.browser === 'epiphany') {
|
|
268
|
+
const since = typeof options.sinceMs === 'number' ? Math.floor(options.sinceMs / 1000) : 0;
|
|
269
|
+
const rows = db.query('SELECT id, url, title, visit_count, last_visit_time FROM urls WHERE last_visit_time >= ? ORDER BY last_visit_time DESC LIMIT ?').all(since, normalizeLimit(options.limit));
|
|
270
|
+
return rows.map((row) => ({
|
|
271
|
+
sourceKind: 'history',
|
|
272
|
+
url: row.url,
|
|
273
|
+
...(cleanOptionalText(row.title) ? { title: cleanOptionalText(row.title) } : {}),
|
|
274
|
+
browser: profile.browser,
|
|
275
|
+
family: profile.family,
|
|
276
|
+
profileName: profile.profileName,
|
|
277
|
+
profilePath: profile.profilePath,
|
|
278
|
+
visitedAtMs: row.last_visit_time * 1000,
|
|
279
|
+
visitCount: row.visit_count,
|
|
280
|
+
rawId: row.id,
|
|
281
|
+
}));
|
|
282
|
+
}
|
|
283
|
+
const items = db.query('SELECT id, url, visit_count, title FROM history_items').all();
|
|
284
|
+
const itemById = new Map(items.map((item) => [item.id, item]));
|
|
285
|
+
const since = typeof options.sinceMs === 'number' ? msToMacAbsoluteSeconds(options.sinceMs) : 0;
|
|
286
|
+
const rows = db.query('SELECT history_item, visit_time, title FROM history_visits WHERE visit_time >= ? ORDER BY visit_time DESC LIMIT ?').all(since, normalizeLimit(options.limit));
|
|
287
|
+
return rows.flatMap((visit) => {
|
|
288
|
+
const item = itemById.get(visit.history_item);
|
|
289
|
+
if (!item?.url)
|
|
290
|
+
return [];
|
|
291
|
+
return [{
|
|
292
|
+
sourceKind: 'history',
|
|
293
|
+
url: item.url,
|
|
294
|
+
...(cleanOptionalText(visit.title ?? item.title) ? { title: cleanOptionalText(visit.title ?? item.title) } : {}),
|
|
295
|
+
browser: profile.browser,
|
|
296
|
+
family: profile.family,
|
|
297
|
+
profileName: profile.profileName,
|
|
298
|
+
profilePath: profile.profilePath,
|
|
299
|
+
visitedAtMs: macAbsoluteTimeToMs(visit.visit_time),
|
|
300
|
+
visitCount: item.visit_count,
|
|
301
|
+
rawId: item.id,
|
|
302
|
+
}];
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
finally {
|
|
306
|
+
db.close();
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
finally {
|
|
310
|
+
await copy.cleanup();
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
function walkWebKitBookmarkNode(profile, node, folderPath, out, limit) {
|
|
314
|
+
if (out.length >= limit)
|
|
315
|
+
return;
|
|
316
|
+
if (node.WebBookmarkType === 'WebBookmarkTypeLeaf') {
|
|
317
|
+
const url = cleanOptionalText(node.URLString);
|
|
318
|
+
if (!url)
|
|
319
|
+
return;
|
|
320
|
+
out.push({
|
|
321
|
+
sourceKind: 'bookmark',
|
|
322
|
+
url,
|
|
323
|
+
...(cleanOptionalText(node.URIDictionary?.title) ? { title: cleanOptionalText(node.URIDictionary?.title) } : {}),
|
|
324
|
+
browser: profile.browser,
|
|
325
|
+
family: profile.family,
|
|
326
|
+
profileName: profile.profileName,
|
|
327
|
+
profilePath: profile.profilePath,
|
|
328
|
+
...(folderPath ? { folderPath } : {}),
|
|
329
|
+
...(typeof node.WebBookmarkDateAdded === 'number' ? { addedAtMs: macAbsoluteTimeToMs(node.WebBookmarkDateAdded) } : {}),
|
|
330
|
+
});
|
|
331
|
+
return;
|
|
332
|
+
}
|
|
333
|
+
if (node.WebBookmarkType === 'WebBookmarkTypeList') {
|
|
334
|
+
const next = cleanOptionalText(node.Title) ? `${folderPath}/${node.Title.trim()}` : folderPath;
|
|
335
|
+
for (const child of node.Children ?? []) {
|
|
336
|
+
walkWebKitBookmarkNode(profile, child, next, out, limit);
|
|
337
|
+
if (out.length >= limit)
|
|
338
|
+
return;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
async function readWebKitBookmarks(profile, options) {
|
|
343
|
+
if (!profile.bookmarksPath || profile.browser === 'epiphany')
|
|
344
|
+
return [];
|
|
345
|
+
const [root] = bplistParser.parseFileSync(profile.bookmarksPath);
|
|
346
|
+
const out = [];
|
|
347
|
+
for (const child of root.Children ?? []) {
|
|
348
|
+
walkWebKitBookmarkNode(profile, child, '', out, normalizeLimit(options.limit));
|
|
349
|
+
if (out.length >= normalizeLimit(options.limit))
|
|
350
|
+
break;
|
|
351
|
+
}
|
|
352
|
+
return out;
|
|
353
|
+
}
|
|
354
|
+
export async function readBrowserKnowledgeProfile(profile, options = {}) {
|
|
355
|
+
const kinds = new Set(options.sourceKinds ?? ['history', 'bookmark']);
|
|
356
|
+
const entries = [];
|
|
357
|
+
if (kinds.has('history')) {
|
|
358
|
+
if (profile.family === 'chromium')
|
|
359
|
+
entries.push(...await readChromiumHistory(profile, options));
|
|
360
|
+
if (profile.family === 'gecko')
|
|
361
|
+
entries.push(...await readGeckoHistory(profile, options));
|
|
362
|
+
if (profile.family === 'webkit')
|
|
363
|
+
entries.push(...await readWebKitHistory(profile, options));
|
|
364
|
+
}
|
|
365
|
+
if (kinds.has('bookmark')) {
|
|
366
|
+
if (profile.family === 'chromium')
|
|
367
|
+
entries.push(...await readChromiumBookmarks(profile, options));
|
|
368
|
+
if (profile.family === 'gecko')
|
|
369
|
+
entries.push(...await readGeckoBookmarks(profile, options));
|
|
370
|
+
if (profile.family === 'webkit')
|
|
371
|
+
entries.push(...await readWebKitBookmarks(profile, options));
|
|
372
|
+
}
|
|
373
|
+
return entries.slice(0, normalizeLimit(options.limit, 2000));
|
|
374
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export type BrowserKnowledgeFamily = 'chromium' | 'gecko' | 'webkit';
|
|
2
|
+
export type BrowserKnowledgeKind = 'chrome' | 'chromium' | 'brave' | 'edge' | 'vivaldi' | 'arc' | 'opera' | 'firefox' | 'zen' | 'librewolf' | 'waterfox' | 'floorp' | 'safari' | 'orion' | 'epiphany';
|
|
3
|
+
export type BrowserKnowledgeSourceKind = 'history' | 'bookmark';
|
|
4
|
+
export interface BrowserKnowledgeProfile {
|
|
5
|
+
readonly family: BrowserKnowledgeFamily;
|
|
6
|
+
readonly browser: BrowserKnowledgeKind;
|
|
7
|
+
readonly profileName: string;
|
|
8
|
+
readonly profilePath: string;
|
|
9
|
+
readonly historyPath?: string;
|
|
10
|
+
readonly bookmarksPath?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface BrowserHistoryEntry {
|
|
13
|
+
readonly sourceKind: 'history';
|
|
14
|
+
readonly url: string;
|
|
15
|
+
readonly title?: string;
|
|
16
|
+
readonly browser: BrowserKnowledgeKind;
|
|
17
|
+
readonly family: BrowserKnowledgeFamily;
|
|
18
|
+
readonly profileName: string;
|
|
19
|
+
readonly profilePath: string;
|
|
20
|
+
readonly visitedAtMs?: number;
|
|
21
|
+
readonly visitCount?: number;
|
|
22
|
+
readonly transition?: string;
|
|
23
|
+
readonly rawId?: string | number;
|
|
24
|
+
}
|
|
25
|
+
export interface BrowserBookmarkEntry {
|
|
26
|
+
readonly sourceKind: 'bookmark';
|
|
27
|
+
readonly url: string;
|
|
28
|
+
readonly title?: string;
|
|
29
|
+
readonly browser: BrowserKnowledgeKind;
|
|
30
|
+
readonly family: BrowserKnowledgeFamily;
|
|
31
|
+
readonly profileName: string;
|
|
32
|
+
readonly profilePath: string;
|
|
33
|
+
readonly folderPath?: string;
|
|
34
|
+
readonly addedAtMs?: number;
|
|
35
|
+
readonly rawId?: string | number;
|
|
36
|
+
}
|
|
37
|
+
export type BrowserKnowledgeEntry = BrowserHistoryEntry | BrowserBookmarkEntry;
|
|
38
|
+
export interface BrowserKnowledgeFilter {
|
|
39
|
+
readonly browsers?: readonly BrowserKnowledgeKind[];
|
|
40
|
+
readonly sourceKinds?: readonly BrowserKnowledgeSourceKind[];
|
|
41
|
+
readonly homeOverride?: string;
|
|
42
|
+
readonly limit?: number;
|
|
43
|
+
readonly sinceMs?: number;
|
|
44
|
+
}
|
|
45
|
+
export interface BrowserKnowledgeCollectResult {
|
|
46
|
+
readonly profiles: readonly BrowserKnowledgeProfile[];
|
|
47
|
+
readonly entries: readonly BrowserKnowledgeEntry[];
|
|
48
|
+
readonly errors: readonly string[];
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/_internal/platform/knowledge/browser-history/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,sBAAsB,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC;AAErE,MAAM,MAAM,oBAAoB,GAC5B,QAAQ,GACR,UAAU,GACV,OAAO,GACP,MAAM,GACN,SAAS,GACT,KAAK,GACL,OAAO,GACP,SAAS,GACT,KAAK,GACL,WAAW,GACX,UAAU,GACV,QAAQ,GACR,QAAQ,GACR,OAAO,GACP,UAAU,CAAC;AAEf,MAAM,MAAM,0BAA0B,GAAG,SAAS,GAAG,UAAU,CAAC;AAEhE,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,MAAM,EAAE,sBAAsB,CAAC;IACxC,QAAQ,CAAC,OAAO,EAAE,oBAAoB,CAAC;IACvC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC;IAC/B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,oBAAoB,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,sBAAsB,CAAC;IACxC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,oBAAoB,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,sBAAsB,CAAC;IACxC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAClC;AAED,MAAM,MAAM,qBAAqB,GAAG,mBAAmB,GAAG,oBAAoB,CAAC;AAE/E,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,oBAAoB,EAAE,CAAC;IACpD,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,0BAA0B,EAAE,CAAC;IAC7D,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,QAAQ,EAAE,SAAS,uBAAuB,EAAE,CAAC;IACtD,QAAQ,CAAC,OAAO,EAAE,SAAS,qBAAqB,EAAE,CAAC;IACnD,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -245,6 +245,7 @@ function inferMemoryClassForCandidate(context, subjectKind, subjectId) {
|
|
|
245
245
|
case 'bookmark':
|
|
246
246
|
case 'url':
|
|
247
247
|
case 'bookmark-list':
|
|
248
|
+
case 'history':
|
|
248
249
|
return 'fact';
|
|
249
250
|
case 'document':
|
|
250
251
|
return 'runbook';
|
|
@@ -262,6 +263,7 @@ function getSourceRefreshWindowMs(source) {
|
|
|
262
263
|
return {
|
|
263
264
|
bookmark: 7 * 24 * 60 * 60 * 1000,
|
|
264
265
|
'bookmark-list': 7 * 24 * 60 * 60 * 1000,
|
|
266
|
+
history: 14 * 24 * 60 * 60 * 1000,
|
|
265
267
|
'url-list': 7 * 24 * 60 * 60 * 1000,
|
|
266
268
|
url: 14 * 24 * 60 * 60 * 1000,
|
|
267
269
|
repo: 14 * 24 * 60 * 60 * 1000,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extractors.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/knowledge/extractors.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAsB,cAAc,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"extractors.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/knowledge/extractors.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAsB,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAGhF,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAE5D,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,yBAAyB,CAAC;IAC3C,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC5C;AAqgBD,wBAAsB,wBAAwB,CAC5C,QAAQ,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,GAAG,UAAU,GAAG,UAAU,CAAC,EAC9D,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,yBAAyB,CAAC,CA4CpC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import JSZip from 'jszip';
|
|
2
2
|
import { extname } from 'node:path';
|
|
3
3
|
import { guessMimeType } from '../artifacts/types.js';
|
|
4
|
+
import { extractReadableHtml } from './html-readability.js';
|
|
4
5
|
function decodeHtmlEntities(value) {
|
|
5
6
|
return value
|
|
6
7
|
.replace(/ /g, ' ')
|
|
@@ -85,6 +86,36 @@ function extractLinksFromHtml(html) {
|
|
|
85
86
|
}
|
|
86
87
|
function extractHtml(buffer) {
|
|
87
88
|
const html = buffer.toString('utf-8');
|
|
89
|
+
try {
|
|
90
|
+
const readable = extractReadableHtml(html);
|
|
91
|
+
if (readable) {
|
|
92
|
+
const summary = summarizeText([readable.excerpt, readable.paragraphSamples[0], readable.textContent].filter(Boolean).join(' '));
|
|
93
|
+
return {
|
|
94
|
+
extractorId: 'html-readability',
|
|
95
|
+
format: 'html',
|
|
96
|
+
...(readable.title ? { title: readable.title } : {}),
|
|
97
|
+
...(summary ? { summary } : {}),
|
|
98
|
+
...(excerptText(readable.textContent) ? { excerpt: excerptText(readable.textContent) } : {}),
|
|
99
|
+
sections: readable.headings.length > 0 ? readable.headings.slice(0, 16) : uniqueStrings(readable.textContent.split(/\n+/), 8),
|
|
100
|
+
links: readable.links,
|
|
101
|
+
estimatedTokens: estimateTokens(readable.title, summary, readable.textContent),
|
|
102
|
+
structure: {
|
|
103
|
+
headings: readable.headings,
|
|
104
|
+
readableLength: readable.length,
|
|
105
|
+
paragraphSampleCount: readable.paragraphSamples.length,
|
|
106
|
+
},
|
|
107
|
+
metadata: {
|
|
108
|
+
paragraphSamples: readable.paragraphSamples.slice(0, 4),
|
|
109
|
+
...(readable.byline ? { byline: readable.byline } : {}),
|
|
110
|
+
...(readable.siteName ? { siteName: readable.siteName } : {}),
|
|
111
|
+
extractionPath: 'readability',
|
|
112
|
+
},
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
// Fall back to the lightweight extractor below for malformed or hostile HTML.
|
|
118
|
+
}
|
|
88
119
|
const title = cleanText(html.match(/<title[^>]*>([\s\S]*?)<\/title>/i)?.[1] ?? '')
|
|
89
120
|
|| cleanText(html.match(/<h1[^>]*>([\s\S]*?)<\/h1>/i)?.[1] ?? '');
|
|
90
121
|
const headings = uniqueStrings(Array.from(html.matchAll(/<h([1-3])[^>]*>([\s\S]*?)<\/h\1>/gi), (match) => stripHtml(match[2] ?? '')), 16);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { buildSchema, type DocumentNode, type ValueNode } from 'graphql';
|
|
2
2
|
import type { KnowledgePacketDetail, KnowledgeProjectionTargetKind } from './types.js';
|
|
3
|
-
export declare const KNOWLEDGE_GRAPHQL_SDL = "\n scalar JSON\n\n enum KnowledgeProjectionKind {\n OVERVIEW\n BUNDLE\n SOURCE\n NODE\n ISSUE\n DASHBOARD\n ROLLUP\n }\n\n enum KnowledgePacketDetail {\n COMPACT\n STANDARD\n DETAILED\n }\n\n enum KnowledgeJobMode {\n INLINE\n BACKGROUND\n }\n\n type KnowledgeStatus {\n ready: Boolean!\n storagePath: String!\n sourceCount: Int!\n nodeCount: Int!\n edgeCount: Int!\n issueCount: Int!\n extractionCount: Int!\n jobRunCount: Int!\n usageCount: Int!\n candidateCount: Int!\n reportCount: Int!\n scheduleCount: Int!\n note: String!\n }\n\n type KnowledgeConnectorSetupField {\n key: String!\n label: String!\n kind: String!\n optional: Boolean\n source: String\n description: String\n }\n\n type KnowledgeConnectorSetup {\n version: String!\n summary: String!\n transportHints: [String!]!\n steps: [String!]!\n fields: [KnowledgeConnectorSetupField!]!\n metadata: JSON\n }\n\n type KnowledgeConnectorDoctorCheck {\n id: String!\n label: String!\n status: String!\n detail: String!\n metadata: JSON\n }\n\n type KnowledgeConnectorDoctorReport {\n connectorId: String!\n ready: Boolean!\n summary: String!\n checks: [KnowledgeConnectorDoctorCheck!]!\n hints: [String!]!\n metadata: JSON\n }\n\n type KnowledgeConnector {\n id: String!\n displayName: String\n version: String\n description: String!\n sourceType: String!\n inputSchema: JSON\n examples: [JSON!]!\n capabilities: [String!]!\n setup: KnowledgeConnectorSetup\n metadata: JSON\n }\n\n type KnowledgeSource {\n id: String!\n connectorId: String!\n sourceType: String!\n title: String\n sourceUri: String\n canonicalUri: String\n summary: String\n description: String\n tags: [String!]!\n folderPath: String\n status: String!\n artifactId: String\n contentHash: String\n lastCrawledAt: Float\n crawlError: String\n sessionId: String\n metadata: JSON\n createdAt: Float!\n updatedAt: Float!\n }\n\n type KnowledgeNode {\n id: String!\n kind: String!\n slug: String!\n title: String!\n summary: String\n aliases: [String!]!\n status: String!\n confidence: Int!\n sourceId: String\n metadata: JSON\n createdAt: Float!\n updatedAt: Float!\n }\n\n type KnowledgeEdge {\n id: String!\n fromKind: String!\n fromId: String!\n toKind: String!\n toId: String!\n relation: String!\n weight: Float!\n metadata: JSON\n createdAt: Float!\n updatedAt: Float!\n }\n\n type KnowledgeIssue {\n id: String!\n severity: String!\n code: String!\n message: String!\n status: String!\n sourceId: String\n nodeId: String\n metadata: JSON\n createdAt: Float!\n updatedAt: Float!\n }\n\n type KnowledgeExtraction {\n id: String!\n sourceId: String!\n artifactId: String\n extractorId: String!\n format: String!\n title: String\n summary: String\n excerpt: String\n sections: [String!]!\n links: [String!]!\n estimatedTokens: Int!\n structure: JSON\n metadata: JSON\n createdAt: Float!\n updatedAt: Float!\n }\n\n type KnowledgeItemView {\n source: KnowledgeSource\n node: KnowledgeNode\n issue: KnowledgeIssue\n relatedEdges: [KnowledgeEdge!]!\n linkedSources: [KnowledgeSource!]!\n linkedNodes: [KnowledgeNode!]!\n }\n\n type KnowledgeSearchResult {\n kind: String!\n id: String!\n score: Float!\n reason: String!\n source: KnowledgeSource\n node: KnowledgeNode\n }\n\n type KnowledgePacketItem {\n kind: String!\n id: String!\n title: String!\n summary: String\n uri: String\n reason: String!\n score: Float!\n estimatedTokens: Int!\n related: [String!]!\n evidence: [String!]!\n metadata: JSON\n }\n\n type KnowledgePacket {\n task: String!\n writeScope: [String!]!\n generatedAt: Float!\n detail: KnowledgePacketDetail!\n strategy: String!\n budgetLimit: Int!\n estimatedTokens: Int!\n items: [KnowledgePacketItem!]!\n }\n\n type KnowledgeProjectionTarget {\n targetId: String!\n kind: KnowledgeProjectionKind!\n title: String!\n description: String!\n itemId: String\n defaultPath: String!\n defaultFilename: String!\n metadata: JSON\n }\n\n type KnowledgeProjectionPage {\n path: String!\n title: String!\n format: String!\n content: String!\n itemIds: [String!]!\n metadata: JSON\n }\n\n type KnowledgeProjectionBundle {\n id: String!\n target: KnowledgeProjectionTarget!\n generatedAt: Float!\n pageCount: Int!\n pages: [KnowledgeProjectionPage!]!\n metadata: JSON\n }\n\n type ArtifactDescriptor {\n id: String!\n kind: String!\n mimeType: String!\n filename: String\n sizeBytes: Int!\n sourceUri: String\n createdAt: Float!\n metadata: JSON\n }\n\n type KnowledgeJob {\n id: String!\n label: String!\n description: String!\n defaultMode: KnowledgeJobMode!\n triggerKinds: [String!]!\n lastRunAt: Float\n metadata: JSON\n }\n\n type KnowledgeJobRun {\n id: String!\n jobId: String!\n status: String!\n mode: KnowledgeJobMode!\n requestedAt: Float!\n startedAt: Float\n completedAt: Float\n error: String\n result: JSON\n metadata: JSON\n }\n\n type KnowledgeBatchIngestResult {\n imported: Int!\n failed: Int!\n sources: [KnowledgeSource!]!\n errors: [String!]!\n }\n\n type KnowledgeUsageRecord {\n id: String!\n targetKind: String!\n targetId: String!\n usageKind: String!\n task: String\n sessionId: String\n score: Float\n metadata: JSON\n createdAt: Float!\n }\n\n type KnowledgeConsolidationCandidate {\n id: String!\n candidateType: String!\n status: String!\n subjectKind: String!\n subjectId: String!\n title: String!\n summary: String\n score: Float!\n evidence: [String!]!\n suggestedMemoryClass: String\n suggestedScope: String\n decidedAt: Float\n decidedBy: String\n metadata: JSON\n createdAt: Float!\n updatedAt: Float!\n }\n\n type KnowledgeConsolidationReport {\n id: String!\n kind: String!\n title: String!\n summary: String!\n highlights: [String!]!\n metrics: JSON\n metadata: JSON\n createdAt: Float!\n updatedAt: Float!\n }\n\n type KnowledgeSchedule {\n id: String!\n jobId: String!\n label: String!\n enabled: Boolean!\n schedule: JSON!\n lastRunAt: Float\n nextRunAt: Float\n metadata: JSON\n createdAt: Float!\n updatedAt: Float!\n }\n\n input KnowledgeJobRunInput {\n mode: KnowledgeJobMode\n }\n\n input KnowledgePacketInput {\n task: String!\n writeScope: [String!]\n limit: Int\n detail: KnowledgePacketDetail\n budgetLimit: Int\n }\n\n type Query {\n status: KnowledgeStatus!\n connectors: [KnowledgeConnector!]!\n connectorDoctor(id: String!): KnowledgeConnectorDoctorReport\n sources(limit: Int, offset: Int): [KnowledgeSource!]!\n nodes(limit: Int, offset: Int): [KnowledgeNode!]!\n issues(limit: Int, offset: Int): [KnowledgeIssue!]!\n itemView(kind: String!, id: String!): KnowledgeItemView\n extractions(limit: Int, sourceId: String): [KnowledgeExtraction!]!\n neighbors(kind: String!, id: String!, relation: String, limit: Int): [KnowledgeEdge!]!\n search(query: String!, limit: Int): [KnowledgeSearchResult!]!\n packet(task: String!, writeScope: [String!], limit: Int, detail: KnowledgePacketDetail, budgetLimit: Int): KnowledgePacket!\n projectionTargets(limit: Int): [KnowledgeProjectionTarget!]!\n projection(kind: KnowledgeProjectionKind!, id: String, limit: Int): KnowledgeProjectionBundle!\n jobs: [KnowledgeJob!]!\n job(id: String!): KnowledgeJob\n jobRuns(limit: Int, jobId: String): [KnowledgeJobRun!]!\n usage(limit: Int, targetKind: String, targetId: String, usageKind: String): [KnowledgeUsageRecord!]!\n usageRecords(limit: Int, targetKind: String, targetId: String, usageKind: String): [KnowledgeUsageRecord!]!\n consolidationCandidates(limit: Int, status: String): [KnowledgeConsolidationCandidate!]!\n consolidationReports(limit: Int): [KnowledgeConsolidationReport!]!\n schedules(limit: Int): [KnowledgeSchedule!]!\n sourceExtraction(sourceId: String!): KnowledgeExtraction\n }\n\n type Mutation {\n ingestUrl(url: String!, sourceType: String, connectorId: String, folderPath: String, tags: [String!], sessionId: String, allowPrivateHosts: Boolean): KnowledgeSource!\n ingestArtifact(path: String!, connectorId: String, tags: [String!], sessionId: String, allowPrivateHosts: Boolean): KnowledgeSource!\n importBookmarksFromFile(path: String!, sessionId: String, allowPrivateHosts: Boolean): KnowledgeBatchIngestResult!\n importUrlsFromFile(path: String!, sessionId: String, allowPrivateHosts: Boolean): KnowledgeBatchIngestResult!\n ingestBookmarkSeeds(seeds: [String!]!, connectorId: String, sessionId: String): KnowledgeBatchIngestResult!\n ingestWithConnector(connectorId: String!, input: String!, sessionId: String, allowPrivateHosts: Boolean): KnowledgeBatchIngestResult!\n ingestConnectorInput(input: String!, connectorId: String, sessionId: String, allowPrivateHosts: Boolean): KnowledgeBatchIngestResult!\n renderProjection(kind: KnowledgeProjectionKind!, id: String, limit: Int): KnowledgeProjectionBundle!\n materializeProjection(kind: KnowledgeProjectionKind!, id: String, limit: Int): KnowledgeMaterializedProjection!\n reindex: KnowledgeStatus!\n runJob(id: String!, mode: KnowledgeJobMode): KnowledgeJobRun!\n saveSchedule(id: String, jobId: String!, label: String!, enabled: Boolean!, schedule: JSON!, metadata: JSON): KnowledgeSchedule!\n deleteSchedule(id: String!): Boolean!\n setScheduleEnabled(id: String!, enabled: Boolean!): KnowledgeSchedule\n decideConsolidationCandidate(id: String!, status: String!, decidedBy: String): KnowledgeConsolidationCandidate!\n lint: [KnowledgeIssue!]!\n }\n\n type KnowledgeMaterializedProjection {\n artifact: ArtifactDescriptor!\n bundle: KnowledgeProjectionBundle!\n }\n";
|
|
3
|
+
export declare const KNOWLEDGE_GRAPHQL_SDL = "\n scalar JSON\n\n enum KnowledgeProjectionKind {\n OVERVIEW\n BUNDLE\n SOURCE\n NODE\n ISSUE\n DASHBOARD\n ROLLUP\n }\n\n enum KnowledgePacketDetail {\n COMPACT\n STANDARD\n DETAILED\n }\n\n enum KnowledgeJobMode {\n INLINE\n BACKGROUND\n }\n\n type KnowledgeStatus {\n ready: Boolean!\n storagePath: String!\n sourceCount: Int!\n nodeCount: Int!\n edgeCount: Int!\n issueCount: Int!\n extractionCount: Int!\n jobRunCount: Int!\n usageCount: Int!\n candidateCount: Int!\n reportCount: Int!\n scheduleCount: Int!\n note: String!\n }\n\n type KnowledgeConnectorSetupField {\n key: String!\n label: String!\n kind: String!\n optional: Boolean\n source: String\n description: String\n }\n\n type KnowledgeConnectorSetup {\n version: String!\n summary: String!\n transportHints: [String!]!\n steps: [String!]!\n fields: [KnowledgeConnectorSetupField!]!\n metadata: JSON\n }\n\n type KnowledgeConnectorDoctorCheck {\n id: String!\n label: String!\n status: String!\n detail: String!\n metadata: JSON\n }\n\n type KnowledgeConnectorDoctorReport {\n connectorId: String!\n ready: Boolean!\n summary: String!\n checks: [KnowledgeConnectorDoctorCheck!]!\n hints: [String!]!\n metadata: JSON\n }\n\n type KnowledgeConnector {\n id: String!\n displayName: String\n version: String\n description: String!\n sourceType: String!\n inputSchema: JSON\n examples: [JSON!]!\n capabilities: [String!]!\n setup: KnowledgeConnectorSetup\n metadata: JSON\n }\n\n type KnowledgeSource {\n id: String!\n connectorId: String!\n sourceType: String!\n title: String\n sourceUri: String\n canonicalUri: String\n summary: String\n description: String\n tags: [String!]!\n folderPath: String\n status: String!\n artifactId: String\n contentHash: String\n lastCrawledAt: Float\n crawlError: String\n sessionId: String\n metadata: JSON\n createdAt: Float!\n updatedAt: Float!\n }\n\n type KnowledgeNode {\n id: String!\n kind: String!\n slug: String!\n title: String!\n summary: String\n aliases: [String!]!\n status: String!\n confidence: Int!\n sourceId: String\n metadata: JSON\n createdAt: Float!\n updatedAt: Float!\n }\n\n type KnowledgeEdge {\n id: String!\n fromKind: String!\n fromId: String!\n toKind: String!\n toId: String!\n relation: String!\n weight: Float!\n metadata: JSON\n createdAt: Float!\n updatedAt: Float!\n }\n\n type KnowledgeIssue {\n id: String!\n severity: String!\n code: String!\n message: String!\n status: String!\n sourceId: String\n nodeId: String\n metadata: JSON\n createdAt: Float!\n updatedAt: Float!\n }\n\n type KnowledgeExtraction {\n id: String!\n sourceId: String!\n artifactId: String\n extractorId: String!\n format: String!\n title: String\n summary: String\n excerpt: String\n sections: [String!]!\n links: [String!]!\n estimatedTokens: Int!\n structure: JSON\n metadata: JSON\n createdAt: Float!\n updatedAt: Float!\n }\n\n type KnowledgeItemView {\n source: KnowledgeSource\n node: KnowledgeNode\n issue: KnowledgeIssue\n relatedEdges: [KnowledgeEdge!]!\n linkedSources: [KnowledgeSource!]!\n linkedNodes: [KnowledgeNode!]!\n }\n\n type KnowledgeSearchResult {\n kind: String!\n id: String!\n score: Float!\n reason: String!\n source: KnowledgeSource\n node: KnowledgeNode\n }\n\n type KnowledgePacketItem {\n kind: String!\n id: String!\n title: String!\n summary: String\n uri: String\n reason: String!\n score: Float!\n estimatedTokens: Int!\n related: [String!]!\n evidence: [String!]!\n metadata: JSON\n }\n\n type KnowledgePacket {\n task: String!\n writeScope: [String!]!\n generatedAt: Float!\n detail: KnowledgePacketDetail!\n strategy: String!\n budgetLimit: Int!\n estimatedTokens: Int!\n items: [KnowledgePacketItem!]!\n }\n\n type KnowledgeProjectionTarget {\n targetId: String!\n kind: KnowledgeProjectionKind!\n title: String!\n description: String!\n itemId: String\n defaultPath: String!\n defaultFilename: String!\n metadata: JSON\n }\n\n type KnowledgeProjectionPage {\n path: String!\n title: String!\n format: String!\n content: String!\n itemIds: [String!]!\n metadata: JSON\n }\n\n type KnowledgeProjectionBundle {\n id: String!\n target: KnowledgeProjectionTarget!\n generatedAt: Float!\n pageCount: Int!\n pages: [KnowledgeProjectionPage!]!\n metadata: JSON\n }\n\n type ArtifactDescriptor {\n id: String!\n kind: String!\n mimeType: String!\n filename: String\n sizeBytes: Int!\n sourceUri: String\n createdAt: Float!\n metadata: JSON\n }\n\n type KnowledgeJob {\n id: String!\n label: String!\n description: String!\n defaultMode: KnowledgeJobMode!\n triggerKinds: [String!]!\n lastRunAt: Float\n metadata: JSON\n }\n\n type KnowledgeJobRun {\n id: String!\n jobId: String!\n status: String!\n mode: KnowledgeJobMode!\n requestedAt: Float!\n startedAt: Float\n completedAt: Float\n error: String\n result: JSON\n metadata: JSON\n }\n\n type KnowledgeBatchIngestResult {\n imported: Int!\n failed: Int!\n sources: [KnowledgeSource!]!\n errors: [String!]!\n }\n\n type KnowledgeUsageRecord {\n id: String!\n targetKind: String!\n targetId: String!\n usageKind: String!\n task: String\n sessionId: String\n score: Float\n metadata: JSON\n createdAt: Float!\n }\n\n type KnowledgeConsolidationCandidate {\n id: String!\n candidateType: String!\n status: String!\n subjectKind: String!\n subjectId: String!\n title: String!\n summary: String\n score: Float!\n evidence: [String!]!\n suggestedMemoryClass: String\n suggestedScope: String\n decidedAt: Float\n decidedBy: String\n metadata: JSON\n createdAt: Float!\n updatedAt: Float!\n }\n\n type KnowledgeConsolidationReport {\n id: String!\n kind: String!\n title: String!\n summary: String!\n highlights: [String!]!\n metrics: JSON\n metadata: JSON\n createdAt: Float!\n updatedAt: Float!\n }\n\n type KnowledgeSchedule {\n id: String!\n jobId: String!\n label: String!\n enabled: Boolean!\n schedule: JSON!\n lastRunAt: Float\n nextRunAt: Float\n metadata: JSON\n createdAt: Float!\n updatedAt: Float!\n }\n\n input KnowledgeJobRunInput {\n mode: KnowledgeJobMode\n }\n\n input KnowledgePacketInput {\n task: String!\n writeScope: [String!]\n limit: Int\n detail: KnowledgePacketDetail\n budgetLimit: Int\n }\n\n type Query {\n status: KnowledgeStatus!\n connectors: [KnowledgeConnector!]!\n connectorDoctor(id: String!): KnowledgeConnectorDoctorReport\n sources(limit: Int, offset: Int, knowledgeSpaceId: String): [KnowledgeSource!]!\n nodes(limit: Int, offset: Int, knowledgeSpaceId: String): [KnowledgeNode!]!\n issues(limit: Int, offset: Int, knowledgeSpaceId: String): [KnowledgeIssue!]!\n itemView(kind: String!, id: String!): KnowledgeItemView\n extractions(limit: Int, sourceId: String, knowledgeSpaceId: String): [KnowledgeExtraction!]!\n neighbors(kind: String!, id: String!, relation: String, limit: Int): [KnowledgeEdge!]!\n search(query: String!, limit: Int, knowledgeSpaceId: String): [KnowledgeSearchResult!]!\n packet(task: String!, writeScope: [String!], limit: Int, detail: KnowledgePacketDetail, budgetLimit: Int): KnowledgePacket!\n projectionTargets(limit: Int): [KnowledgeProjectionTarget!]!\n projection(kind: KnowledgeProjectionKind!, id: String, limit: Int): KnowledgeProjectionBundle!\n jobs: [KnowledgeJob!]!\n job(id: String!): KnowledgeJob\n jobRuns(limit: Int, jobId: String): [KnowledgeJobRun!]!\n usage(limit: Int, targetKind: String, targetId: String, usageKind: String): [KnowledgeUsageRecord!]!\n usageRecords(limit: Int, targetKind: String, targetId: String, usageKind: String): [KnowledgeUsageRecord!]!\n consolidationCandidates(limit: Int, status: String): [KnowledgeConsolidationCandidate!]!\n consolidationReports(limit: Int): [KnowledgeConsolidationReport!]!\n schedules(limit: Int): [KnowledgeSchedule!]!\n sourceExtraction(sourceId: String!): KnowledgeExtraction\n }\n\n type Mutation {\n ingestUrl(url: String!, sourceType: String, connectorId: String, folderPath: String, tags: [String!], sessionId: String, allowPrivateHosts: Boolean): KnowledgeSource!\n ingestArtifact(path: String!, connectorId: String, tags: [String!], sessionId: String, allowPrivateHosts: Boolean): KnowledgeSource!\n importBookmarksFromFile(path: String!, sessionId: String, allowPrivateHosts: Boolean): KnowledgeBatchIngestResult!\n importUrlsFromFile(path: String!, sessionId: String, allowPrivateHosts: Boolean): KnowledgeBatchIngestResult!\n ingestBookmarkSeeds(seeds: [String!]!, connectorId: String, sessionId: String): KnowledgeBatchIngestResult!\n ingestWithConnector(connectorId: String!, input: String!, sessionId: String, allowPrivateHosts: Boolean): KnowledgeBatchIngestResult!\n ingestConnectorInput(input: String!, connectorId: String, sessionId: String, allowPrivateHosts: Boolean): KnowledgeBatchIngestResult!\n renderProjection(kind: KnowledgeProjectionKind!, id: String, limit: Int): KnowledgeProjectionBundle!\n materializeProjection(kind: KnowledgeProjectionKind!, id: String, limit: Int): KnowledgeMaterializedProjection!\n reindex: KnowledgeStatus!\n runJob(id: String!, mode: KnowledgeJobMode): KnowledgeJobRun!\n saveSchedule(id: String, jobId: String!, label: String!, enabled: Boolean!, schedule: JSON!, metadata: JSON): KnowledgeSchedule!\n deleteSchedule(id: String!): Boolean!\n setScheduleEnabled(id: String!, enabled: Boolean!): KnowledgeSchedule\n decideConsolidationCandidate(id: String!, status: String!, decidedBy: String): KnowledgeConsolidationCandidate!\n lint: [KnowledgeIssue!]!\n }\n\n type KnowledgeMaterializedProjection {\n artifact: ArtifactDescriptor!\n bundle: KnowledgeProjectionBundle!\n }\n";
|
|
4
4
|
export declare function parseJsonAst(node: ValueNode): unknown;
|
|
5
5
|
export declare function installJsonScalar(schema: ReturnType<typeof buildSchema>): void;
|
|
6
6
|
export declare function toProjectionKind(value: string): KnowledgeProjectionTargetKind;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graphql-schema.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/knowledge/graphql-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,WAAW,EACX,KAAK,YAAY,EACjB,KAAK,SAAS,EACf,MAAM,SAAS,CAAC;AACjB,OAAO,KAAK,EAAE,qBAAqB,EAAE,6BAA6B,EAAE,MAAM,YAAY,CAAC;AAEvF,eAAO,MAAM,qBAAqB,
|
|
1
|
+
{"version":3,"file":"graphql-schema.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/knowledge/graphql-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,WAAW,EACX,KAAK,YAAY,EACjB,KAAK,SAAS,EACf,MAAM,SAAS,CAAC;AACjB,OAAO,KAAK,EAAE,qBAAqB,EAAE,6BAA6B,EAAE,MAAM,YAAY,CAAC;AAEvF,eAAO,MAAM,qBAAqB,wqUA8YjC,CAAC;AAEF,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAoBrD;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,GAAG,IAAI,CAQ9E;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,6BAA6B,CAuB7E;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAiBlE;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,qBAAqB,CAM/E;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAEpE;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,YAAY,CAE5E;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAE/D;AAED,wBAAgB,mBAAmB,CAAC,CAAC,SAAS;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAKhG;AAED,wBAAgB,mBAAmB,CAAC,CAAC,SAAS;IAAE,MAAM,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,KAAK,EAAE,SAAS,OAAO,EAAE,CAAA;CAAE,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG;IAAE,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAKnJ;AAED,wBAAgB,SAAS,CAAC,CAAC,SAAS;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAK1F;AAED,wBAAgB,MAAM,CAAC,CAAC,SAAS;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,CAK9F;AAED,wBAAgB,SAAS,CAAC,CAAC,SAAS;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAKnF;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEnF;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAEpE;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,YAAY,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,UAAU,CASlG"}
|
|
@@ -353,13 +353,13 @@ export const KNOWLEDGE_GRAPHQL_SDL = `
|
|
|
353
353
|
status: KnowledgeStatus!
|
|
354
354
|
connectors: [KnowledgeConnector!]!
|
|
355
355
|
connectorDoctor(id: String!): KnowledgeConnectorDoctorReport
|
|
356
|
-
sources(limit: Int, offset: Int): [KnowledgeSource!]!
|
|
357
|
-
nodes(limit: Int, offset: Int): [KnowledgeNode!]!
|
|
358
|
-
issues(limit: Int, offset: Int): [KnowledgeIssue!]!
|
|
356
|
+
sources(limit: Int, offset: Int, knowledgeSpaceId: String): [KnowledgeSource!]!
|
|
357
|
+
nodes(limit: Int, offset: Int, knowledgeSpaceId: String): [KnowledgeNode!]!
|
|
358
|
+
issues(limit: Int, offset: Int, knowledgeSpaceId: String): [KnowledgeIssue!]!
|
|
359
359
|
itemView(kind: String!, id: String!): KnowledgeItemView
|
|
360
|
-
extractions(limit: Int, sourceId: String): [KnowledgeExtraction!]!
|
|
360
|
+
extractions(limit: Int, sourceId: String, knowledgeSpaceId: String): [KnowledgeExtraction!]!
|
|
361
361
|
neighbors(kind: String!, id: String!, relation: String, limit: Int): [KnowledgeEdge!]!
|
|
362
|
-
search(query: String!, limit: Int): [KnowledgeSearchResult!]!
|
|
362
|
+
search(query: String!, limit: Int, knowledgeSpaceId: String): [KnowledgeSearchResult!]!
|
|
363
363
|
packet(task: String!, writeScope: [String!], limit: Int, detail: KnowledgePacketDetail, budgetLimit: Int): KnowledgePacket!
|
|
364
364
|
projectionTargets(limit: Int): [KnowledgeProjectionTarget!]!
|
|
365
365
|
projection(kind: KnowledgeProjectionKind!, id: String, limit: Int): KnowledgeProjectionBundle!
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graphql.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/knowledge/graphql.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"graphql.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/knowledge/graphql.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAkBrD,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,SAAS,EAAE,OAAO,GAAG,UAAU,CAAC;IACzC,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;CACjC;AAED,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,MAAM,EACd,aAAa,CAAC,EAAE,MAAM,GACrB,6BAA6B,CAM/B;AAiBD,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7C,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC;AAED,qBAAa,uBAAuB;IAStB,OAAO,CAAC,QAAQ,CAAC,OAAO;IARpC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAIzB;IAEL,MAAM,CAAC,QAAQ,CAAC,SAAS,SAA+C;gBAE3C,OAAO,EAAE,gBAAgB;IAEtD,IAAI,UAAU,IAAI,MAAM,CAEvB;IAEK,OAAO,CAAC,KAAK,EAAE,4BAA4B;IAkBjD,OAAO,CAAC,eAAe;CAwPxB;AAED,wBAAgB,6BAA6B,IAAI,MAAM,CAEtD"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { GraphQLError, buildSchema, graphql, parse, printSchema } from 'graphql';
|
|
2
2
|
import { KNOWLEDGE_GRAPHQL_SDL, clampInt, clampOffset, installJsonScalar, mapJob, mapJobRun, mapPacket, mapProjectionBundle, mapProjectionTarget, pickOperation, toJobMode, toPacketDetail, toProjectionKind, } from './graphql-schema.js';
|
|
3
|
+
import { isInKnowledgeSpace } from './spaces.js';
|
|
3
4
|
export function inspectKnowledgeGraphqlAccess(source, operationName) {
|
|
4
5
|
const document = parse(source);
|
|
5
6
|
const operation = pickOperation(document, operationName);
|
|
@@ -49,9 +50,15 @@ export class KnowledgeGraphqlService {
|
|
|
49
50
|
createRootValue() {
|
|
50
51
|
return {
|
|
51
52
|
status: async () => this.service.getStatus(),
|
|
52
|
-
sources: ({ limit }) => this.service.listSources(clampInt(limit, 100))
|
|
53
|
-
|
|
54
|
-
|
|
53
|
+
sources: ({ limit, knowledgeSpaceId }) => (this.service.listSources(knowledgeSpaceId ? 10_000 : clampInt(limit, 100))
|
|
54
|
+
.filter((source) => !knowledgeSpaceId || isInKnowledgeSpace(source, knowledgeSpaceId))
|
|
55
|
+
.slice(0, clampInt(limit, 100))),
|
|
56
|
+
nodes: ({ limit, knowledgeSpaceId }) => (this.service.listNodes(knowledgeSpaceId ? 10_000 : clampInt(limit, 100))
|
|
57
|
+
.filter((node) => !knowledgeSpaceId || isInKnowledgeSpace(node, knowledgeSpaceId))
|
|
58
|
+
.slice(0, clampInt(limit, 100))),
|
|
59
|
+
issues: ({ limit, knowledgeSpaceId }) => (this.service.listIssues(knowledgeSpaceId ? 10_000 : clampInt(limit, 100))
|
|
60
|
+
.filter((issue) => !knowledgeSpaceId || isInKnowledgeSpace(issue, knowledgeSpaceId))
|
|
61
|
+
.slice(0, clampInt(limit, 100))),
|
|
55
62
|
source: ({ id }) => this.service.listSources(10_000).find((source) => source.id === id) ?? null,
|
|
56
63
|
node: ({ id }) => this.service.listNodes(10_000).find((node) => node.id === id) ?? null,
|
|
57
64
|
issue: ({ id }) => this.service.listIssues(10_000).find((issue) => issue.id === id) ?? null,
|
|
@@ -81,7 +88,9 @@ export class KnowledgeGraphqlService {
|
|
|
81
88
|
code: args.code,
|
|
82
89
|
query: args.query,
|
|
83
90
|
}),
|
|
84
|
-
extractions: ({ limit, sourceId }) => this.service.listExtractions(clampInt(limit, 100), sourceId)
|
|
91
|
+
extractions: ({ limit, sourceId, knowledgeSpaceId }) => (this.service.listExtractions(clampInt(limit, 100), sourceId)
|
|
92
|
+
.filter((extraction) => !knowledgeSpaceId || isInKnowledgeSpace(extraction, knowledgeSpaceId))
|
|
93
|
+
.slice(0, clampInt(limit, 100))),
|
|
85
94
|
sourceExtraction: ({ sourceId }) => this.service.getSourceExtraction(sourceId),
|
|
86
95
|
neighbors: ({ kind, id, relation, limit }) => {
|
|
87
96
|
if (kind !== 'source' && kind !== 'node') {
|
|
@@ -89,7 +98,9 @@ export class KnowledgeGraphqlService {
|
|
|
89
98
|
}
|
|
90
99
|
return this.service.getNeighbors(kind, id, { relation, limit: clampInt(limit, 20) });
|
|
91
100
|
},
|
|
92
|
-
search: ({ query, limit }) => this.service.search(query, clampInt(limit, 10))
|
|
101
|
+
search: ({ query, limit, knowledgeSpaceId }) => (this.service.search(query, knowledgeSpaceId ? 10_000 : clampInt(limit, 10))
|
|
102
|
+
.filter((result) => !knowledgeSpaceId || isInKnowledgeSpace(result.source ?? result.node, knowledgeSpaceId))
|
|
103
|
+
.slice(0, clampInt(limit, 10))),
|
|
93
104
|
packet: async ({ task, writeScope, limit, detail, budgetLimit }) => mapPacket(await this.service.buildPacket(task, writeScope ?? [], clampInt(limit, 6), {
|
|
94
105
|
detail: toPacketDetail(detail),
|
|
95
106
|
...(typeof budgetLimit === 'number' ? { budgetLimit } : {}),
|