@pellux/goodvibes-sdk 0.25.21 → 0.26.1

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.
Files changed (142) hide show
  1. package/dist/_internal/contracts/artifacts/operator-contract.json +5860 -982
  2. package/dist/_internal/contracts/generated/foundation-client-types.d.ts +90 -16
  3. package/dist/_internal/contracts/generated/foundation-client-types.d.ts.map +1 -1
  4. package/dist/_internal/contracts/generated/foundation-metadata.d.ts +2 -2
  5. package/dist/_internal/contracts/generated/foundation-metadata.js +2 -2
  6. package/dist/_internal/contracts/generated/operator-contract.d.ts.map +1 -1
  7. package/dist/_internal/contracts/generated/operator-contract.js +5860 -982
  8. package/dist/_internal/contracts/generated/operator-method-ids.d.ts +1 -1
  9. package/dist/_internal/contracts/generated/operator-method-ids.d.ts.map +1 -1
  10. package/dist/_internal/contracts/generated/operator-method-ids.js +18 -0
  11. package/dist/_internal/daemon/context.d.ts +1 -0
  12. package/dist/_internal/daemon/context.d.ts.map +1 -1
  13. package/dist/_internal/daemon/knowledge-route-types.d.ts +1 -0
  14. package/dist/_internal/daemon/knowledge-route-types.d.ts.map +1 -1
  15. package/dist/_internal/daemon/knowledge-routes.d.ts +1 -1
  16. package/dist/_internal/daemon/knowledge-routes.d.ts.map +1 -1
  17. package/dist/_internal/daemon/knowledge-routes.js +30 -0
  18. package/dist/_internal/daemon/operator.d.ts +1 -1
  19. package/dist/_internal/daemon/operator.d.ts.map +1 -1
  20. package/dist/_internal/daemon/operator.js +2 -0
  21. package/dist/_internal/daemon/runtime-session-routes.d.ts.map +1 -1
  22. package/dist/_internal/daemon/runtime-session-routes.js +3 -2
  23. package/dist/_internal/platform/agents/orchestrator-runner.d.ts.map +1 -1
  24. package/dist/_internal/platform/agents/orchestrator-runner.js +2 -1
  25. package/dist/_internal/platform/agents/orchestrator.d.ts +1 -0
  26. package/dist/_internal/platform/agents/orchestrator.d.ts.map +1 -1
  27. package/dist/_internal/platform/channels/builtin/homeassistant.d.ts.map +1 -1
  28. package/dist/_internal/platform/channels/builtin/homeassistant.js +11 -0
  29. package/dist/_internal/platform/companion/companion-chat-manager.d.ts.map +1 -1
  30. package/dist/_internal/platform/companion/companion-chat-manager.js +2 -1
  31. package/dist/_internal/platform/control-plane/method-catalog-control-automation.js +7 -7
  32. package/dist/_internal/platform/control-plane/method-catalog-control-core.d.ts.map +1 -1
  33. package/dist/_internal/platform/control-plane/method-catalog-control-core.js +8 -12
  34. package/dist/_internal/platform/control-plane/method-catalog-homegraph.d.ts +3 -0
  35. package/dist/_internal/platform/control-plane/method-catalog-homegraph.d.ts.map +1 -0
  36. package/dist/_internal/platform/control-plane/method-catalog-homegraph.js +223 -0
  37. package/dist/_internal/platform/control-plane/method-catalog-knowledge.d.ts.map +1 -1
  38. package/dist/_internal/platform/control-plane/method-catalog-knowledge.js +23 -1
  39. package/dist/_internal/platform/control-plane/operator-contract-schemas-knowledge.d.ts +15 -1
  40. package/dist/_internal/platform/control-plane/operator-contract-schemas-knowledge.d.ts.map +1 -1
  41. package/dist/_internal/platform/control-plane/operator-contract-schemas-knowledge.js +118 -0
  42. package/dist/_internal/platform/control-plane/operator-contract-schemas-runtime.d.ts +4 -0
  43. package/dist/_internal/platform/control-plane/operator-contract-schemas-runtime.d.ts.map +1 -1
  44. package/dist/_internal/platform/control-plane/operator-contract-schemas-runtime.js +11 -0
  45. package/dist/_internal/platform/core/orchestrator-turn-loop.d.ts.map +1 -1
  46. package/dist/_internal/platform/core/orchestrator-turn-loop.js +2 -1
  47. package/dist/_internal/platform/daemon/facade-composition.d.ts.map +1 -1
  48. package/dist/_internal/platform/daemon/facade-composition.js +2 -0
  49. package/dist/_internal/platform/daemon/facade-types.d.ts +2 -1
  50. package/dist/_internal/platform/daemon/facade-types.d.ts.map +1 -1
  51. package/dist/_internal/platform/daemon/http/home-graph-routes.d.ts +18 -0
  52. package/dist/_internal/platform/daemon/http/home-graph-routes.d.ts.map +1 -0
  53. package/dist/_internal/platform/daemon/http/home-graph-routes.js +108 -0
  54. package/dist/_internal/platform/daemon/http/router-route-contexts.d.ts.map +1 -1
  55. package/dist/_internal/platform/daemon/http/router-route-contexts.js +1 -0
  56. package/dist/_internal/platform/daemon/http/router.d.ts +4 -1
  57. package/dist/_internal/platform/daemon/http/router.d.ts.map +1 -1
  58. package/dist/_internal/platform/daemon/http/router.js +16 -0
  59. package/dist/_internal/platform/daemon/types.d.ts +2 -1
  60. package/dist/_internal/platform/daemon/types.d.ts.map +1 -1
  61. package/dist/_internal/platform/knowledge/browser-history/discover.d.ts +3 -0
  62. package/dist/_internal/platform/knowledge/browser-history/discover.d.ts.map +1 -0
  63. package/dist/_internal/platform/knowledge/browser-history/discover.js +88 -0
  64. package/dist/_internal/platform/knowledge/browser-history/index.d.ts +7 -0
  65. package/dist/_internal/platform/knowledge/browser-history/index.d.ts.map +1 -0
  66. package/dist/_internal/platform/knowledge/browser-history/index.js +4 -0
  67. package/dist/_internal/platform/knowledge/browser-history/ingest.d.ts +12 -0
  68. package/dist/_internal/platform/knowledge/browser-history/ingest.d.ts.map +1 -0
  69. package/dist/_internal/platform/knowledge/browser-history/ingest.js +275 -0
  70. package/dist/_internal/platform/knowledge/browser-history/locked-db.d.ts +7 -0
  71. package/dist/_internal/platform/knowledge/browser-history/locked-db.d.ts.map +1 -0
  72. package/dist/_internal/platform/knowledge/browser-history/locked-db.js +38 -0
  73. package/dist/_internal/platform/knowledge/browser-history/paths.d.ts +15 -0
  74. package/dist/_internal/platform/knowledge/browser-history/paths.d.ts.map +1 -0
  75. package/dist/_internal/platform/knowledge/browser-history/paths.js +125 -0
  76. package/dist/_internal/platform/knowledge/browser-history/readers.d.ts +8 -0
  77. package/dist/_internal/platform/knowledge/browser-history/readers.d.ts.map +1 -0
  78. package/dist/_internal/platform/knowledge/browser-history/readers.js +374 -0
  79. package/dist/_internal/platform/knowledge/browser-history/types.d.ts +50 -0
  80. package/dist/_internal/platform/knowledge/browser-history/types.d.ts.map +1 -0
  81. package/dist/_internal/platform/knowledge/browser-history/types.js +1 -0
  82. package/dist/_internal/platform/knowledge/consolidation.js +2 -0
  83. package/dist/_internal/platform/knowledge/extractors.d.ts.map +1 -1
  84. package/dist/_internal/platform/knowledge/extractors.js +31 -0
  85. package/dist/_internal/platform/knowledge/graphql-schema.d.ts +1 -1
  86. package/dist/_internal/platform/knowledge/graphql-schema.d.ts.map +1 -1
  87. package/dist/_internal/platform/knowledge/graphql-schema.js +5 -5
  88. package/dist/_internal/platform/knowledge/graphql.d.ts.map +1 -1
  89. package/dist/_internal/platform/knowledge/graphql.js +16 -5
  90. package/dist/_internal/platform/knowledge/home-graph/helpers.d.ts +46 -0
  91. package/dist/_internal/platform/knowledge/home-graph/helpers.d.ts.map +1 -0
  92. package/dist/_internal/platform/knowledge/home-graph/helpers.js +230 -0
  93. package/dist/_internal/platform/knowledge/home-graph/index.d.ts +4 -0
  94. package/dist/_internal/platform/knowledge/home-graph/index.d.ts.map +1 -0
  95. package/dist/_internal/platform/knowledge/home-graph/index.js +2 -0
  96. package/dist/_internal/platform/knowledge/home-graph/rendering.d.ts +25 -0
  97. package/dist/_internal/platform/knowledge/home-graph/rendering.d.ts.map +1 -0
  98. package/dist/_internal/platform/knowledge/home-graph/rendering.js +139 -0
  99. package/dist/_internal/platform/knowledge/home-graph/service.d.ts +82 -0
  100. package/dist/_internal/platform/knowledge/home-graph/service.d.ts.map +1 -0
  101. package/dist/_internal/platform/knowledge/home-graph/service.js +654 -0
  102. package/dist/_internal/platform/knowledge/home-graph/state.d.ts +24 -0
  103. package/dist/_internal/platform/knowledge/home-graph/state.d.ts.map +1 -0
  104. package/dist/_internal/platform/knowledge/home-graph/state.js +96 -0
  105. package/dist/_internal/platform/knowledge/home-graph/types.d.ts +206 -0
  106. package/dist/_internal/platform/knowledge/home-graph/types.d.ts.map +1 -0
  107. package/dist/_internal/platform/knowledge/home-graph/types.js +33 -0
  108. package/dist/_internal/platform/knowledge/html-readability.d.ts +13 -0
  109. package/dist/_internal/platform/knowledge/html-readability.d.ts.map +1 -0
  110. package/dist/_internal/platform/knowledge/html-readability.js +66 -0
  111. package/dist/_internal/platform/knowledge/index.d.ts +6 -0
  112. package/dist/_internal/platform/knowledge/index.d.ts.map +1 -1
  113. package/dist/_internal/platform/knowledge/index.js +3 -0
  114. package/dist/_internal/platform/knowledge/internal.d.ts.map +1 -1
  115. package/dist/_internal/platform/knowledge/internal.js +1 -0
  116. package/dist/_internal/platform/knowledge/knowledge-api.d.ts +2 -0
  117. package/dist/_internal/platform/knowledge/knowledge-api.d.ts.map +1 -1
  118. package/dist/_internal/platform/knowledge/knowledge-api.js +1 -0
  119. package/dist/_internal/platform/knowledge/lint.js +1 -0
  120. package/dist/_internal/platform/knowledge/scheduling.d.ts.map +1 -1
  121. package/dist/_internal/platform/knowledge/scheduling.js +1 -0
  122. package/dist/_internal/platform/knowledge/service.d.ts +4 -0
  123. package/dist/_internal/platform/knowledge/service.d.ts.map +1 -1
  124. package/dist/_internal/platform/knowledge/service.js +15 -0
  125. package/dist/_internal/platform/knowledge/spaces.d.ts +19 -0
  126. package/dist/_internal/platform/knowledge/spaces.d.ts.map +1 -0
  127. package/dist/_internal/platform/knowledge/spaces.js +54 -0
  128. package/dist/_internal/platform/knowledge/types.d.ts +3 -3
  129. package/dist/_internal/platform/knowledge/types.d.ts.map +1 -1
  130. package/dist/_internal/platform/permissions/manager.d.ts.map +1 -1
  131. package/dist/_internal/platform/permissions/manager.js +4 -0
  132. package/dist/_internal/platform/runtime/services.d.ts +2 -1
  133. package/dist/_internal/platform/runtime/services.d.ts.map +1 -1
  134. package/dist/_internal/platform/runtime/services.js +4 -1
  135. package/dist/_internal/platform/tools/goodvibes-runtime/index.d.ts +23 -0
  136. package/dist/_internal/platform/tools/goodvibes-runtime/index.d.ts.map +1 -0
  137. package/dist/_internal/platform/tools/goodvibes-runtime/index.js +400 -0
  138. package/dist/_internal/platform/tools/index.d.ts +3 -1
  139. package/dist/_internal/platform/tools/index.d.ts.map +1 -1
  140. package/dist/_internal/platform/tools/index.js +15 -0
  141. package/dist/_internal/platform/version.js +1 -1
  142. 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"}
@@ -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;AAEhF,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;AAweD,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
+ {"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,siUA8YjC,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"}
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;AAiBrD,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;CAoOxB;AAED,wBAAgB,6BAA6B,IAAI,MAAM,CAEtD"}
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
- nodes: ({ limit }) => this.service.listNodes(clampInt(limit, 100)),
54
- issues: ({ limit }) => this.service.listIssues(clampInt(limit, 100)),
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 } : {}),