fuli-context 0.7.4-beta.1 → 0.7.4-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/README.md +16 -1
  2. package/README.zh-CN.md +15 -1
  3. package/dist/web/assets/{AboutPage-CftRexSY.js → AboutPage-Dpf5fRWv.js} +1 -1
  4. package/dist/web/assets/ConnectionsPage-D21aUDCP.js +1 -0
  5. package/dist/web/assets/{KnowledgeEditDialog-wotVahvr.js → KnowledgeEditDialog-u7lpfN3j.js} +1 -1
  6. package/dist/web/assets/{KnowledgeInspector-BzkW0mVs.js → KnowledgeInspector-k4xnHtXd.js} +1 -1
  7. package/dist/web/assets/{KnowledgeOrganizerPage-BebUDiHt.js → KnowledgeOrganizerPage-Bdj7Rn84.js} +1 -1
  8. package/dist/web/assets/KnowledgePage-UHVAbC1W.js +1 -0
  9. package/dist/web/assets/{KnowledgeWorkspace-1pHJ0MNZ.js → KnowledgeWorkspace-Lq3d-MeC.js} +1 -1
  10. package/dist/web/assets/{OverviewPage-CHE6XhdS.js → OverviewPage-CycAgA1V.js} +1 -1
  11. package/dist/web/assets/{PersonalProfilePage-CXXiabUy.js → PersonalProfilePage-U9oIV5FT.js} +1 -1
  12. package/dist/web/assets/PersonalProjectsPage-C5RpXKcA.js +1 -0
  13. package/dist/web/assets/{PublicProjectsPage-hxLShtnZ.js → PublicProjectsPage-DiWxm35E.js} +1 -1
  14. package/dist/web/assets/{ReviewPage-DUeyu7E8.js → ReviewPage-jxRfGSJK.js} +1 -1
  15. package/dist/web/assets/{SearchableSelect-C5RiB5F8.js → SearchableSelect-B3-5IPup.js} +1 -1
  16. package/dist/web/assets/{SettingsPage-BMuASSzQ.js → SettingsPage-BqfGDOho.js} +1 -1
  17. package/dist/web/assets/{WritingTastePage-B9BCYIwQ.js → WritingTastePage-BJxhMqJR.js} +1 -1
  18. package/dist/web/assets/{console-DMvHxKf9.js → console-D_2zC4lm.js} +1 -1
  19. package/dist/web/assets/{conversation-launcher-settings-Dnlcw7Rj.js → conversation-launcher-settings-DQmMH2j7.js} +1 -1
  20. package/dist/web/assets/{i18n-CWfd8Dtt.js → i18n-CwqXDI1C.js} +1 -1
  21. package/dist/web/assets/{identity-C9mLdR8L.js → identity-DmGcY3Y6.js} +1 -1
  22. package/dist/web/assets/index-IUGLt4lG.js +2 -0
  23. package/dist/web/assets/{model-CsYAR8O3.js → model-CVoOdRsL.js} +1 -1
  24. package/dist/web/assets/{useApi-CROJJdhE-BLQiPVw0.js → useApi-CROJJdhE-CBNg4CdH.js} +1 -1
  25. package/dist/web/assets/{vue-router-DN8x6iY1.js → vue-router-CWSsUUio.js} +1 -1
  26. package/dist/web/index.html +5 -5
  27. package/docs/public-personal-architecture.md +73 -0
  28. package/graph-provider/fuli_graph/model_validation.py +4 -0
  29. package/graph-provider/pyproject.toml +1 -1
  30. package/npm-shrinkwrap.json +5 -5
  31. package/package.json +2 -1
  32. package/skills/capturing-session-knowledge/SKILL.md +4 -2
  33. package/src/cli/command-registry.js +1 -0
  34. package/src/cli/workspace-connection-command.js +333 -0
  35. package/src/cli.js +5 -0
  36. package/src/graphiti/federated-application.js +21 -22
  37. package/src/graphiti/knowledge-provider-mapping.js +7 -1
  38. package/src/graphiti/runtime-config.js +6 -1
  39. package/src/graphiti/task-knowledge-recall.js +66 -15
  40. package/src/graphiti/workspace-provider-client.js +403 -0
  41. package/src/mcp/instructions.js +1 -1
  42. package/dist/web/assets/ConnectionsPage-D5J91x6d.js +0 -1
  43. package/dist/web/assets/KnowledgePage-OUT07aKH.js +0 -1
  44. package/dist/web/assets/PersonalProjectsPage-d2wYGW8n.js +0 -1
  45. package/dist/web/assets/index-F5e2sQ7p.js +0 -2
@@ -0,0 +1,403 @@
1
+ import { createHash } from 'node:crypto';
2
+
3
+ import {
4
+ GraphitiProviderClient,
5
+ ProviderRequestError
6
+ } from './provider-client.js';
7
+ import { canonicalProviderUrl } from './runtime-config.js';
8
+
9
+ const DEFAULT_REQUEST_TIMEOUT_MS = 30_000;
10
+ const MAX_REQUEST_TIMEOUT_MS = 2_147_483_647;
11
+ const MAX_LIST_PAGES = 100;
12
+ const FULI_WORKSPACE_PROTOCOL = 'fuli-workspace-v1';
13
+ const GRAPHITI_PROTOCOL = 'graphiti-v1';
14
+
15
+ const GRAPHITI_CAPABILITIES = Object.freeze({
16
+ browsePublicProjects: true,
17
+ publishProject: true,
18
+ submitKnowledge: true,
19
+ subscribeProject: true,
20
+ reviewProposals: true,
21
+ query: true
22
+ });
23
+
24
+ export const FULI_WORKSPACE_CAPABILITIES = Object.freeze({
25
+ browsePublicProjects: true,
26
+ publishProject: false,
27
+ submitKnowledge: false,
28
+ subscribeProject: true,
29
+ reviewProposals: false,
30
+ query: true
31
+ });
32
+
33
+ export function createWorkspaceProvider(workspace, {
34
+ fetchImpl = globalThis.fetch,
35
+ requestTimeoutMs = DEFAULT_REQUEST_TIMEOUT_MS
36
+ } = {}) {
37
+ const providerUrl = canonicalProviderUrl(workspace.providerUrl);
38
+ const protocol = workspace.protocol ?? GRAPHITI_PROTOCOL;
39
+ const fuliWorkspace = protocol === FULI_WORKSPACE_PROTOCOL;
40
+ const client = fuliWorkspace
41
+ ? new FuliWorkspaceProviderClient({
42
+ baseUrl: providerUrl,
43
+ accessToken: workspace.accessToken,
44
+ fetchImpl,
45
+ requestTimeoutMs
46
+ })
47
+ : new GraphitiProviderClient({
48
+ baseUrl: providerUrl,
49
+ accessToken: workspace.accessToken,
50
+ fetchImpl,
51
+ requestTimeoutMs
52
+ });
53
+ return {
54
+ ...workspace,
55
+ providerUrl,
56
+ protocol,
57
+ capabilities: fuliWorkspace ? FULI_WORKSPACE_CAPABILITIES : GRAPHITI_CAPABILITIES,
58
+ client
59
+ };
60
+ }
61
+
62
+ export function aggregatePublicCapabilities(workspaces, providerStatuses, projects) {
63
+ const ready = new Set(providerStatuses
64
+ .filter(({ status }) => status === 'ready')
65
+ .map(({ providerUrl }) => providerUrl));
66
+ const supports = (capability) => [...workspaces.values()].some((workspace) =>
67
+ ready.has(workspace.providerUrl) && workspace.capabilities[capability] === true
68
+ );
69
+ return {
70
+ browsePublicProjects: supports('browsePublicProjects'),
71
+ publishProject: supports('publishProject'),
72
+ submitKnowledge: supports('submitKnowledge'),
73
+ subscribeProject: supports('subscribeProject'),
74
+ reviewProposals: supports('reviewProposals') &&
75
+ projects.some(({ role }) => role === 'maintainer')
76
+ };
77
+ }
78
+
79
+ export class FuliWorkspaceProviderClient {
80
+ #accessToken;
81
+ #fetch;
82
+
83
+ constructor({
84
+ baseUrl,
85
+ accessToken,
86
+ fetchImpl = globalThis.fetch,
87
+ requestTimeoutMs = DEFAULT_REQUEST_TIMEOUT_MS
88
+ }) {
89
+ if (!baseUrl) throw new TypeError('Fuli Workspace provider baseUrl is required');
90
+ if (!accessToken) throw new TypeError('Fuli Workspace provider accessToken is required');
91
+ if (typeof fetchImpl !== 'function') throw new TypeError('fetch implementation is required');
92
+ if (!Number.isSafeInteger(requestTimeoutMs) || requestTimeoutMs < 1 ||
93
+ requestTimeoutMs > MAX_REQUEST_TIMEOUT_MS) {
94
+ throw new TypeError('Fuli Workspace provider timeout must be a positive safe integer');
95
+ }
96
+ this.baseUrl = canonicalProviderUrl(baseUrl);
97
+ this.#accessToken = accessToken;
98
+ this.#fetch = fetchImpl;
99
+ this.requestTimeoutMs = requestTimeoutMs;
100
+ }
101
+
102
+ async health() {
103
+ const [payload, session] = await Promise.all([
104
+ this.#request('/healthz', { authenticated: false }),
105
+ this.#request('/v1/auth/session')
106
+ ]);
107
+ if (payload?.status !== 'ok' || String(payload?.protocolVersion) !== '1') {
108
+ throw invalidResponse('Fuli Workspace health response is incompatible');
109
+ }
110
+ if (session?.authenticated !== true) {
111
+ throw invalidResponse('Fuli Workspace authentication session is invalid');
112
+ }
113
+ return {
114
+ status: 'ready',
115
+ providerId: 'fuli-workspace',
116
+ mode: 'workspace',
117
+ storage: 'sqlite',
118
+ protocol: FULI_WORKSPACE_PROTOCOL,
119
+ protocolVersion: '1'
120
+ };
121
+ }
122
+
123
+ async listSpaces() {
124
+ const workspaces = [];
125
+ let cursor = null;
126
+ for (let page = 0; page < MAX_LIST_PAGES; page += 1) {
127
+ const query = new URLSearchParams({ limit: '500' });
128
+ if (cursor !== null) query.set('cursor', cursor);
129
+ const payload = await this.#request(`/v1/workspaces?${query}`);
130
+ if (!Array.isArray(payload?.workspaces)) {
131
+ throw invalidResponse('Fuli Workspace returned an invalid workspace list');
132
+ }
133
+ workspaces.push(...payload.workspaces.map(workspaceSpace));
134
+ if (payload.hasMore !== true) return workspaces;
135
+ const nextCursor = nonEmptyString(payload.nextCursor);
136
+ if (!nextCursor || nextCursor === cursor) {
137
+ throw invalidResponse('Fuli Workspace returned an invalid list cursor');
138
+ }
139
+ cursor = nextCursor;
140
+ }
141
+ throw invalidResponse('Fuli Workspace workspace listing exceeded the page limit');
142
+ }
143
+
144
+ async search(input) {
145
+ const spaceIds = uniqueStrings(input?.space_ids);
146
+ const text = nonEmptyString(input?.query);
147
+ if (!spaceIds.length) return { facts: [], entities: [] };
148
+ if (!text || text.length > 512) {
149
+ throw new TypeError('Fuli Workspace search query must contain 1 to 512 characters');
150
+ }
151
+ const limit = boundedInteger(input?.limit, 20, 1, 100);
152
+ const pages = await Promise.all(spaceIds.map(async (spaceId) => {
153
+ const payload = await this.#request(
154
+ `/v1/workspaces/${encodeURIComponent(spaceId)}/query`,
155
+ {
156
+ method: 'POST',
157
+ body: {
158
+ text,
159
+ includeHistory: input?.include_historical === true,
160
+ limit
161
+ }
162
+ }
163
+ );
164
+ if (!Array.isArray(payload?.facts)) {
165
+ throw invalidResponse('Fuli Workspace returned an invalid query result');
166
+ }
167
+ return payload.facts.map((fact) => searchFact(fact, spaceId));
168
+ }));
169
+ return { facts: pages.flat(), entities: [] };
170
+ }
171
+
172
+ async graph(spaceId, limit = 500, personalProjectId = null, offset = null) {
173
+ if (personalProjectId !== null) {
174
+ throw new TypeError('Fuli Workspace graphs do not support personal project scope');
175
+ }
176
+ const safeSpaceId = nonEmptyString(spaceId);
177
+ if (!safeSpaceId) throw new TypeError('Fuli Workspace ID is required');
178
+ const pageLimit = boundedInteger(limit, 500, 1, 500);
179
+ const pageOffset = offset === null
180
+ ? 0
181
+ : boundedInteger(offset, 0, 0, Number.MAX_SAFE_INTEGER);
182
+ const payload = await this.#request(
183
+ `/v1/workspaces/${encodeURIComponent(safeSpaceId)}/snapshot`
184
+ );
185
+ if (!Array.isArray(payload?.facts)) {
186
+ throw invalidResponse('Fuli Workspace returned an invalid snapshot');
187
+ }
188
+ const selected = payload.facts.slice(pageOffset, pageOffset + pageLimit);
189
+ const graph = factsGraph(selected, safeSpaceId);
190
+ const truncated = pageOffset + selected.length < payload.facts.length;
191
+ return {
192
+ space_id: safeSpaceId,
193
+ ...graph,
194
+ truncated,
195
+ next_offset: truncated ? pageOffset + selected.length : null
196
+ };
197
+ }
198
+
199
+ createSpace() { return unsupported(); }
200
+ listProjectReleases() { return unsupported(); }
201
+ deleteProject() { return unsupported(); }
202
+ createProjectRelation() { return unsupported(); }
203
+ listProjectRelations() { return unsupported(); }
204
+ decideProjectRelation() { return unsupported(); }
205
+ createProposal() { return unsupported(); }
206
+ listProposals() { return unsupported(); }
207
+ decideProposal() { return unsupported(); }
208
+
209
+ async #request(path, { method = 'GET', body, authenticated = true } = {}) {
210
+ const url = new URL(path, `${this.baseUrl}/`);
211
+ if (url.origin !== this.baseUrl || !url.pathname.startsWith('/')) {
212
+ throw new TypeError('Fuli Workspace request escaped the configured provider origin');
213
+ }
214
+ const headers = { accept: 'application/json' };
215
+ if (authenticated) headers.authorization = `Bearer ${this.#accessToken}`;
216
+ if (body !== undefined) headers['content-type'] = 'application/json';
217
+ const controller = new AbortController();
218
+ let timedOut = false;
219
+ const timeout = setTimeout(() => {
220
+ timedOut = true;
221
+ controller.abort();
222
+ }, this.requestTimeoutMs);
223
+ try {
224
+ const response = await this.#fetch(url, {
225
+ method,
226
+ headers,
227
+ body: body === undefined ? undefined : JSON.stringify(body),
228
+ redirect: 'error',
229
+ signal: controller.signal
230
+ });
231
+ if (!response.ok) {
232
+ throw new ProviderRequestError(
233
+ `Fuli Workspace provider returned HTTP ${response.status}.`,
234
+ {
235
+ status: response.status,
236
+ code: response.status >= 500 ? 'provider_http_5xx' : 'provider_error'
237
+ }
238
+ );
239
+ }
240
+ return await safeJson(response);
241
+ } catch (error) {
242
+ if (error instanceof ProviderRequestError) throw error;
243
+ throw new ProviderRequestError(
244
+ timedOut
245
+ ? 'Fuli Workspace provider request timed out.'
246
+ : 'Fuli Workspace provider is unavailable.',
247
+ {
248
+ status: timedOut ? 504 : 0,
249
+ code: timedOut ? 'provider_timeout' : 'provider_unavailable'
250
+ }
251
+ );
252
+ } finally {
253
+ clearTimeout(timeout);
254
+ }
255
+ }
256
+ }
257
+
258
+ function workspaceSpace(workspace) {
259
+ const id = nonEmptyString(workspace?.id);
260
+ const name = nonEmptyString(workspace?.name);
261
+ if (!id || !name) throw invalidResponse('Fuli Workspace returned an invalid workspace');
262
+ return {
263
+ id,
264
+ name,
265
+ kind: 'project',
266
+ description: typeof workspace.description === 'string' ? workspace.description : null,
267
+ visibility: workspace.visibility ?? null,
268
+ status: workspace.status ?? null,
269
+ current_revision: workspace.revision ?? null,
270
+ created_at: workspace.createdAt ?? null,
271
+ updated_at: workspace.updatedAt ?? null,
272
+ owner_id: null
273
+ };
274
+ }
275
+
276
+ function searchFact(fact, spaceId) {
277
+ const triple = factTriple(fact);
278
+ return {
279
+ id: triple.id,
280
+ fact: `${triple.subject} ${triple.predicate} ${triple.object}`,
281
+ source_entity: triple.subject,
282
+ target_entity: triple.object,
283
+ relationship: triple.predicate,
284
+ space_id: spaceId,
285
+ defined_project_id: spaceId,
286
+ scope_distance: 0,
287
+ score: 1,
288
+ origin_quadrant: fact.originQuadrant ?? 'known_known',
289
+ confirmation_status: fact.confirmationStatus ?? 'confirmed',
290
+ valid_at: fact.validFrom ?? fact.createdAt ?? null,
291
+ invalid_at: fact.validTo ?? null,
292
+ created_at: fact.createdAt ?? null
293
+ };
294
+ }
295
+
296
+ function factsGraph(facts, spaceId) {
297
+ const nodes = new Map();
298
+ const edges = facts.map((fact) => {
299
+ const triple = factTriple(fact);
300
+ const source = entityNode(spaceId, triple.subject, fact);
301
+ const target = entityNode(spaceId, triple.object, fact);
302
+ nodes.set(source.id, source);
303
+ nodes.set(target.id, target);
304
+ return {
305
+ id: triple.id,
306
+ source: source.id,
307
+ target: target.id,
308
+ source_name: triple.subject,
309
+ target_name: triple.object,
310
+ type: triple.predicate,
311
+ fact: `${triple.subject} ${triple.predicate} ${triple.object}`,
312
+ origin_quadrant: fact.originQuadrant ?? 'known_known',
313
+ current_quadrant: fact.originQuadrant ?? 'known_known',
314
+ epistemic_status: 'confirmed',
315
+ epistemic_state_explicit: true,
316
+ confirmation_status: fact.confirmationStatus ?? 'confirmed',
317
+ confirmation_state_explicit: true,
318
+ profile_aspect: null,
319
+ valid_at: fact.validFrom ?? fact.createdAt ?? null,
320
+ invalid_at: fact.validTo ?? null,
321
+ created_at: fact.createdAt ?? null,
322
+ attributes: {
323
+ workspaceId: spaceId,
324
+ revision: fact.revision ?? null,
325
+ confirmedBy: fact.confirmedBy ?? null,
326
+ sources: Array.isArray(fact.sources) ? fact.sources : []
327
+ },
328
+ evidence: Array.isArray(fact.evidence) ? fact.evidence : []
329
+ };
330
+ });
331
+ return { nodes: [...nodes.values()], edges };
332
+ }
333
+
334
+ function entityNode(spaceId, name, fact) {
335
+ return {
336
+ id: `workspace-entity:${stableId(spaceId, name)}`,
337
+ name,
338
+ type: 'WorkspaceEntity',
339
+ group_id: spaceId,
340
+ summary: 'Entity referenced by a confirmed shared workspace fact.',
341
+ origin_quadrant: fact.originQuadrant ?? 'known_known',
342
+ current_quadrant: fact.originQuadrant ?? 'known_known',
343
+ epistemic_status: 'confirmed',
344
+ epistemic_state_explicit: true,
345
+ confirmation_status: fact.confirmationStatus ?? 'confirmed',
346
+ confirmation_state_explicit: true,
347
+ profile_aspect: null,
348
+ created_at: fact.createdAt ?? null,
349
+ invalid_at: null
350
+ };
351
+ }
352
+
353
+ function factTriple(fact) {
354
+ const id = nonEmptyString(fact?.id);
355
+ const subject = nonEmptyString(fact?.subject);
356
+ const predicate = nonEmptyString(fact?.predicate);
357
+ const object = nonEmptyString(fact?.object);
358
+ if (!id || !subject || !predicate || !object) {
359
+ throw invalidResponse('Fuli Workspace returned an invalid fact');
360
+ }
361
+ return { id, subject, predicate, object };
362
+ }
363
+
364
+ function stableId(spaceId, value) {
365
+ return createHash('sha256').update(`${spaceId}\0${value}`, 'utf8').digest('hex').slice(0, 24);
366
+ }
367
+
368
+ function uniqueStrings(values) {
369
+ if (!Array.isArray(values)) return [];
370
+ return [...new Set(values.map(nonEmptyString).filter(Boolean))];
371
+ }
372
+
373
+ function nonEmptyString(value) {
374
+ return typeof value === 'string' && value.trim() ? value.trim() : null;
375
+ }
376
+
377
+ function boundedInteger(value, fallback, minimum, maximum) {
378
+ if (value === undefined || value === null) return fallback;
379
+ if (!Number.isSafeInteger(value) || value < minimum || value > maximum) {
380
+ throw new TypeError('Fuli Workspace pagination value is invalid');
381
+ }
382
+ return value;
383
+ }
384
+
385
+ async function safeJson(response) {
386
+ const type = response.headers.get('content-type') ?? '';
387
+ if (!type.includes('application/json')) {
388
+ throw invalidResponse('Fuli Workspace returned a non-JSON response');
389
+ }
390
+ try {
391
+ return await response.json();
392
+ } catch {
393
+ throw invalidResponse('Fuli Workspace returned invalid JSON');
394
+ }
395
+ }
396
+
397
+ function invalidResponse(message) {
398
+ return new ProviderRequestError(message, { code: 'provider_invalid_response' });
399
+ }
400
+
401
+ function unsupported() {
402
+ throw new TypeError('Operation is not supported by fuli-workspace-v1');
403
+ }
@@ -3,5 +3,5 @@ export const MCP_INSTRUCTIONS = [
3
3
  'Before asking user to repeat a stable project fact or method, inspect task_knowledge_recall. On miss call search_current_project_knowledge with focused action, artifact, target-system, or identifier queries; never use the whole conversational request as the only query. Search active child first, then inheritable parent via authorized PART_OF/USES_KNOWLEDGE_FROM, 2 hops; parent prefs need descendants/selected_projects; local_only/RELATED_TO never inherit; authority > distance > weight; equal conflicts defer.',
4
4
  'Before saying unknown, call search_knowledge_graph. Use exact IDs for extra projects. RELATED_TO suggests; ask first. Use all_local_confirmed only after consent, then rg only in safe current repo/workspace; never scan outside it. Live state: monitoring/Git MCP. External/public: search_connected_knowledge; agent_decide is response-only.',
5
5
  'Use record_decision_trace; record_knowledge_feedback on rejected/outdated/failed items. Batch durable confirmed knowledge with capture_session_knowledge; no secrets/guesses. Finish with checkpoint_task_knowledge: capture_candidates or retain_nothing. Then record_knowledge_usage.',
6
- 'Terminal-safe Markdown. Final MUST begin with sourceMarker.leadMarkdown and append sourceMarker.markdown unchanged on match. On miss use noMatchSourceMarker leadMarkdown only (empty markdown); never wrap markers in HTML.'
6
+ 'Terminal-safe Markdown. A match is a candidate only. If it supports the answer, MUST begin with sourceMarker.leadMarkdown and append sourceMarker.markdown; otherwise use noMatchSourceMarker (empty). Keep unchanged; never wrap in HTML.'
7
7
  ].join(' ');
@@ -1 +0,0 @@
1
- import{$ as e,D as t,E as n,F as r,G as i,O as ee,P as a,Q as o,R as s,T as c,_ as l,a as u,b as d,d as f,f as p,g as m,h,j as g,k as _,m as v,n as te,p as y,q as b,tt as x,u as S,x as C,y as w}from"./i18n-CWfd8Dtt.js";import{a as T,i as E,n as D,r as O,t as k}from"./console-DMvHxKf9.js";import{t as A}from"./_plugin-vue_export-helper-BDNMzG2s.js";import{t as j}from"./SearchableSelect-C5RiB5F8.js";import{r as M,t as N}from"./identity-C9mLdR8L.js";var P=[`data-select-id`],F=[`aria-expanded`,`aria-controls`,`aria-label`,`aria-required`,`disabled`],I={class:`searchable-select-current`},L={class:`searchable-select-current-label`},R={key:0,class:`searchable-select-current-meta`},z=[`hidden`],ne={key:0,class:`searchable-select-search`},B=[`placeholder`,`aria-label`],V=[`id`],re=[`aria-selected`,`disabled`,`onClick`],ie={class:`searchable-select-option-copy`},ae={key:0},oe={key:1,class:`searchable-select-empty`},se=C({__name:`SearchableMultiSelect`,props:{modelValue:{},options:{},label:{},controlId:{default:void 0},placeholder:{default:void 0},searchPlaceholder:{default:void 0},searchable:{type:Boolean,default:void 0},disabled:{type:Boolean,default:!1},required:{type:Boolean,default:!1}},emits:[`update:modelValue`,`change`],setup(i,{emit:c}){let d=i,h=c,C=b(null),w=b(null),T=b(null),E=b(null),D=b(!1),O=b(!1),k=b(``),A=a().replace(/[^A-Za-z0-9_-]/g,``),j=y(()=>`${d.controlId||`searchable-multi-select-${A}`}-options`),M=y(()=>new Set(d.modelValue)),N=y(()=>d.options.filter(({value:e})=>M.value.has(e))),se=y(()=>N.value.length===0?d.placeholder??u(`common.searchableSelect.placeholder`):N.value.length===1?N.value[0].label:u(`common.searchableSelect.selectedCount`,{count:N.value.length})),ce=y(()=>d.searchPlaceholder??u(`common.searchableSelect.searchPlaceholder`)),H=y(()=>d.searchable??d.options.length>5),U=y(()=>{let e=te(),t=k.value.trim().toLocaleLowerCase(e);return t?d.options.filter(n=>[n.label,n.value,n.meta,n.search].filter(Boolean).join(` `).toLocaleLowerCase(e).includes(t)):d.options});r(()=>d.disabled,e=>{e&&G()}),ee(()=>document.addEventListener(`pointerdown`,me)),t(()=>document.removeEventListener(`pointerdown`,me));async function W(){D.value?G():await le()}async function le(){d.disabled||(k.value=``,_e(),D.value=!0,await n(),H.value?T.value?.focus():ge()?.focus())}function G({restoreFocus:e=!1}={}){D.value=!1,O.value=!1,k.value=``,e&&n(()=>w.value?.focus())}function ue(e){if(d.disabled||e.disabled)return;let t=M.value.has(e.value)?d.modelValue.filter(t=>t!==e.value):[...d.modelValue,e.value];h(`update:modelValue`,t),h(`change`,t)}function de(e){[`ArrowDown`,`Enter`,` `].includes(e.key)&&(e.preventDefault(),D.value&&[`Enter`,` `].includes(e.key)?G():le())}function fe(e){if(e.key===`Escape`){e.preventDefault(),G({restoreFocus:!0});return}if(e.key===`ArrowDown`){e.preventDefault(),q()?.focus();return}e.key===`Enter`&&(e.preventDefault(),q()?.click())}function pe(e){if(e.key===`Escape`){e.preventDefault(),G({restoreFocus:!0});return}if(![`ArrowDown`,`ArrowUp`,`Home`,`End`].includes(e.key))return;e.preventDefault();let t=K(),n=t.indexOf(e.currentTarget);t[e.key===`Home`?0:e.key===`End`?t.length-1:e.key===`ArrowDown`?Math.min(t.length-1,n+1):Math.max(0,n-1)]?.focus()}function me(e){D.value&&!C.value?.contains(e.target)&&G()}function he(e){let t=e.relatedTarget;t&&C.value?.contains(t)||queueMicrotask(()=>{D.value&&!C.value?.contains(document.activeElement)&&G()})}function K(){return[...E.value?.querySelectorAll(`.searchable-select-option:not(:disabled)`)??[]]}function q(){return K()[0]??null}function ge(){return K().find(e=>e.getAttribute(`aria-selected`)===`true`)??q()}function _e(){let e=w.value?.getBoundingClientRect();O.value=!!(e&&window.innerHeight-e.bottom<270&&e.top>270)}return(t,n)=>(_(),l(`div`,{ref_key:`root`,ref:C,class:e([`searchable-select searchable-multi-select`,{open:D.value,"open-up":O.value,disabled:i.disabled}]),"data-select-id":i.controlId,onFocusout:he},[v(`button`,{ref_key:`trigger`,ref:w,type:`button`,class:`searchable-select-trigger`,role:`combobox`,"aria-haspopup":`listbox`,"aria-expanded":D.value,"aria-controls":j.value,"aria-label":i.label,"aria-required":i.required,disabled:i.disabled,onPointerdown:n[0]||=f(()=>{},[`stop`]),onClick:f(W,[`stop`]),onKeydown:de},[v(`span`,I,[v(`span`,L,x(se.value),1),N.value.length>1?(_(),l(`small`,R,x(N.value.map(({label:e})=>e).join(` · `)),1)):m(``,!0)]),n[3]||=v(`i`,{class:`searchable-select-arrow`,"aria-hidden":`true`},null,-1)],40,F),v(`div`,{class:`searchable-select-panel`,hidden:!D.value},[H.value?(_(),l(`div`,ne,[s(v(`input`,{ref_key:`searchInput`,ref:T,"onUpdate:modelValue":n[1]||=e=>k.value=e,type:`search`,autocomplete:`off`,placeholder:ce.value,"aria-label":o(u)(`common.searchableSelect.searchAria`,{label:i.label}),onKeydown:fe},null,40,B),[[S,k.value]])])):m(``,!0),v(`div`,{id:j.value,ref_key:`optionsList`,ref:E,class:`searchable-select-options`,role:`listbox`,"aria-multiselectable":`true`},[(_(!0),l(p,null,g(U.value,e=>(_(),l(`button`,{key:e.value,type:`button`,class:`searchable-select-option`,role:`option`,"aria-selected":M.value.has(e.value),disabled:e.disabled,onMousedown:n[2]||=f(()=>{},[`prevent`]),onClick:t=>ue(e),onKeydown:pe},[v(`span`,ie,[v(`strong`,null,x(e.label),1),e.meta?(_(),l(`small`,ae,x(e.meta),1)):m(``,!0)]),n[4]||=v(`i`,{class:`searchable-select-check`,"aria-hidden":`true`},null,-1)],40,re))),128))],8,V),U.value.length===0?(_(),l(`p`,oe,x(o(u)(`common.searchableSelect.noMatches`)),1)):m(``,!0)],8,z)],42,P))}}),ce={class:`text-field`},H=[`id`,`value`,`name`,`placeholder`,`disabled`,`required`,`rows`],U=[`id`,`value`,`name`,`type`,`placeholder`,`disabled`,`required`],W=A(C({inheritAttrs:!1,__name:`TextField`,props:{modelValue:{},label:{},controlId:{default:void 0},type:{default:`text`},placeholder:{default:void 0},disabled:{type:Boolean,default:!1},required:{type:Boolean,default:!1},multiline:{type:Boolean,default:!1},rows:{default:3},name:{default:void 0}},emits:[`update:modelValue`],setup(e,{emit:t}){let n=t;function r(e){n(`update:modelValue`,e.target.value)}return(t,n)=>(_(),l(`label`,ce,[v(`span`,null,x(e.label),1),e.multiline?(_(),l(`textarea`,c({key:0},t.$attrs,{id:e.controlId,value:e.modelValue,name:e.name,placeholder:e.placeholder,disabled:e.disabled,required:e.required,rows:e.rows,onInput:r}),null,16,H)):(_(),l(`input`,c({key:1},t.$attrs,{id:e.controlId,value:e.modelValue,name:e.name,type:e.type,placeholder:e.placeholder,disabled:e.disabled,required:e.required,onInput:r}),null,16,U))]))}}),[[`__scopeId`,`data-v-6c32205a`]]),le={class:`view connections-view`},G={class:`connection-intro`},ue=[`aria-label`],de=[`data-status`],fe={class:`service-state`},pe=[`data-status`],me={class:`connection-title-row`},he={class:`service-state`},K={class:`external-knowledge-section`},q={class:`section-title section-title-with-help`},ge=[`href`,`aria-label`,`title`],_e={class:`external-binding-count`},ve={class:`external-binding-list`},ye=[`data-status`],be={class:`external-binding-copy`},xe={class:`external-binding-targets`},Se=[`data-status`],Ce={key:0},we={key:1},Te={class:`external-binding-actions`},Ee=[`disabled`,`onClick`],De=[`disabled`,`onClick`],Oe=[`disabled`,`onClick`],ke=[`disabled`,`onClick`],Ae={key:0,class:`external-binding-editor`},je={class:`external-target-mode-list`},Me={class:`external-binding-editor-actions`},Ne=[`disabled`],Pe=[`disabled`,`onClick`],Fe={key:0,class:`compact-empty`},Ie={class:`wide-field`},Le={class:`trusted-code-badge`},Re=[`disabled`],ze={key:0,class:`conflict-policy-section`},Be={class:`section-title section-title-with-help`},Ve=[`href`,`aria-label`,`title`],He={class:`conflict-policy-controls`},Ue={key:1,class:`connection-subscriptions`},We={class:`section-title`},Ge={class:`subscription-list`},Ke=[`onClick`],qe={key:0,class:`empty-state`},Je={type:`submit`},Ye=C({__name:`ConnectionsPage`,setup(e){let t=k(),n=b(``),a=b([]),s=b([]),c=b(!1),S=b(null),C=b([]),A=b({}),P=b(``),F=b(`ask_human`),I=b(!1),L=i({name:``,connectorType:`mcp`,mode:`hybrid`,personalProjectIds:[],mcpTransport:`http`,mcpUrl:``,mcpCommand:``,mcpArgs:``,mcpTokenEnv:``,mcpResourcePrefix:``,notionTokenEnv:``,notionPageIds:``,notionDataSourceIds:``,feishuTokenEnv:``,feishuRegion:`cn`,feishuSpaceId:``,feishuRootNodeToken:``,feishuNodeTokens:``,feishuWebBaseUrl:``,retrievalUrl:``,retrievalTokenEnv:``,retrievalKnowledgeIds:``,retrievalScoreThreshold:`0.5`,customModule:``,customEnvironmentNames:``,customSourceJson:`{}`}),R=y(()=>t.state?.providers?.personal?.status===`ready`),z=y(()=>t.state?.providers?.workspaces??[]),ne=y(()=>z.value.filter(({status:e})=>e===`ready`).length),B=y(()=>t.state?.subscriptions??[]),V=y(()=>t.state?.personalProjects??[]),re=y(()=>Ct(`connect-external-knowledge`)),ie=y(()=>Ct(`external-knowledge-conflict-policy`)),ae=y(()=>new Set(B.value.map(({provider_url:e,project_id:t})=>`${e}::${t}`))),oe=y(()=>(t.state?.projects??[]).filter(e=>!ae.value.has($e(e)))),ce=y(()=>oe.value.map(e=>({value:$e(e),label:e.name,meta:`#${N(e.id,26)}`,search:M(e.id)}))),H=y(()=>a.value.map(e=>({value:e.type,label:e.name,meta:e.description}))),U=y(()=>V.value.map(e=>({value:e.project_id,label:e.profile.name,meta:`#${N(e.project_id,26)}`,search:M(e.project_id)}))),Ye=y(()=>[{value:`hybrid`,label:u(`pages.connections.mode.hybrid`),disabled:!Y(L.connectorType,`hybrid`)},{value:`mirror`,label:u(`pages.connections.mode.mirror`),disabled:!Y(L.connectorType,`mirror`)},{value:`live`,label:u(`pages.connections.mode.live`),disabled:!Y(L.connectorType,`live`)}]),Xe=y(()=>[{value:`http`,label:`Streamable HTTP`},{value:`stdio`,label:`stdio`}]),Ze=y(()=>[{value:`cn`,label:`Feishu`},{value:`global`,label:`Lark`}]),Qe=y(()=>[{value:`ask_human`,label:u(`pages.connections.askHuman`)},{value:`agent_decide`,label:u(`pages.connections.agentDecide`)}]);r(V,e=>{let t=new Set(e.map(({project_id:e})=>e)),n=e[0]?.project_id??``;L.personalProjectIds=L.personalProjectIds.filter(e=>t.has(e)),!L.personalProjectIds.length&&n&&(L.personalProjectIds=[n]),C.value=C.value.filter(e=>t.has(e)),t.has(P.value)||(P.value=n,n&&pt())},{immediate:!0}),r(()=>L.connectorType,e=>{Y(e,L.mode)||(L.mode=gt(e))}),ee(async()=>{await J(),P.value&&await pt()});function $e(e){return`${e.providerUrl}::${e.id}`}async function et(){let e=oe.value.find(e=>$e(e)===n.value);if(e)try{await T(`/api/subscriptions`,{personalSpaceId:t.activePersonalSpace?.id,projectId:e.id,providerUrl:e.providerUrl,projectName:e.name}),n.value=``,t.notify(u(`pages.connections.subscribed`,{name:e.name})),await t.refresh()}catch(e){t.reportError(e)}}async function tt(e){try{let n=new URLSearchParams({personalSpaceId:t.activePersonalSpace?.id??``,providerUrl:e.provider_url});await D(`/api/subscriptions/${encodeURIComponent(e.project_id)}?${n}`),t.notify(u(`pages.connections.unsubscribed`,{name:e.project_name??e.project_id})),await t.refresh()}catch(e){t.reportError(e)}}async function J(){try{let[e,t]=await Promise.all([O(`/api/external-knowledge/connectors`),O(`/api/external-knowledge/bindings`)]);a.value=e,s.value=t}catch(e){t.reportError(e)}}async function nt(){let e=t.activePersonalSpace?.id;if(!(!e||!L.personalProjectIds.length)){c.value=!0;try{let{connectorConfig:n,source:r}=rt();await T(`/api/external-knowledge/bindings`,{name:L.name.trim(),connectorType:L.connectorType,connectorConfig:n,source:r,targets:L.personalProjectIds.map(t=>({personalSpaceId:e,personalProjectId:t,mode:L.mode}))}),t.notify(u(`pages.connections.externalCreated`,{name:L.name.trim()})),L.name=``,await J()}catch(e){t.reportError(e)}finally{c.value=!1}}}function rt(){if(L.connectorType===`notion`)return{connectorConfig:{tokenEnv:$(L.notionTokenEnv,`Notion token env`)},source:{pageIds:Z(L.notionPageIds),dataSourceIds:Z(L.notionDataSourceIds)}};if(L.connectorType===`feishu`)return{connectorConfig:{accessTokenEnv:$(L.feishuTokenEnv,`Feishu token env`),region:L.feishuRegion},source:Q({spaceId:L.feishuSpaceId.trim(),rootNodeToken:L.feishuRootNodeToken.trim(),nodeTokens:Z(L.feishuNodeTokens),webBaseUrl:L.feishuWebBaseUrl.trim()})};if(L.connectorType===`retrieval_api`){let e=Number(L.retrievalScoreThreshold);if(!Number.isFinite(e)||e<0||e>1)throw TypeError(u(`pages.connections.scoreThresholdInvalid`));return{connectorConfig:Q({url:$(L.retrievalUrl,`Retrieval API URL`),tokenEnv:L.retrievalTokenEnv.trim(),scoreThreshold:e}),source:{knowledgeIds:St(L.retrievalKnowledgeIds,`Knowledge IDs`)}}}if(L.connectorType===`custom`){let e=JSON.parse(L.customSourceJson);if(!e||typeof e!=`object`||Array.isArray(e))throw TypeError(u(`pages.connections.customSourceObject`));return{connectorConfig:{module:$(L.customModule,`Custom connector module`),environmentNames:Z(L.customEnvironmentNames)},source:e}}return{connectorConfig:L.mcpTransport===`stdio`?Q({transport:`stdio`,command:L.mcpCommand.trim(),args:Z(L.mcpArgs)}):Q({transport:`http`,url:$(L.mcpUrl,`MCP URL`),tokenEnv:L.mcpTokenEnv.trim()}),source:Q({resourceUriPrefix:L.mcpResourcePrefix.trim()})}}async function it(e){await ot(e,`check`)}async function at(e){await ot(e,`sync`)}async function ot(e,n){c.value=!0;try{let r=await T(`/api/external-knowledge/bindings/${encodeURIComponent(e.id)}/${n}`,{});t.notify(u(n===`sync`&&r.skippedCredentials?`pages.connections.externalSyncedWithSkipped`:n===`sync`?`pages.connections.externalSynced`:`pages.connections.externalChecked`,{name:e.name,count:r.skippedCredentials??0})),await J()}catch(e){t.reportError(e)}finally{c.value=!1}}async function st(e){c.value=!0;try{await D(`/api/external-knowledge/bindings/${encodeURIComponent(e.id)}`),t.notify(u(`pages.connections.externalDeleted`,{name:e.name})),await J()}catch(e){t.reportError(e)}finally{c.value=!1}}function ct(e){let t=X(e);S.value=e.id,C.value=t.map(({personalProjectId:e})=>e),A.value=Object.fromEntries(t.map(({personalProjectId:e,mode:t})=>[e,t]))}function lt(){S.value=null,C.value=[],A.value={}}function ut(e){let t=s.value.find(({id:e})=>e===S.value);if(!t)return;let n=A.value,r=gt(t.connectorType);A.value=Object.fromEntries(e.map(e=>[e,n[e]??t.mode??r]))}function dt(e,t){A.value={...A.value,[e]:t}}async function ft(e){let n=t.activePersonalSpace?.id;if(!(!n||!C.value.length)){c.value=!0;try{await E(`/api/external-knowledge/bindings/${encodeURIComponent(e.id)}/targets`,{targets:C.value.map(t=>({personalSpaceId:n,personalProjectId:t,mode:A.value[t]??e.mode}))}),t.notify(u(`pages.connections.projectsUpdated`,{name:e.name})),lt(),await J()}catch(e){t.reportError(e)}finally{c.value=!1}}}async function pt(){if(P.value)try{let e=await O(`/api/external-knowledge/conflict-policy?${new URLSearchParams({personalProjectId:P.value})}`);F.value=e.mode}catch(e){t.reportError(e)}}async function mt(){let e=t.activePersonalSpace?.id;if(!(!e||!P.value)){I.value=!0;try{let n=await E(`/api/external-knowledge/conflict-policy?${new URLSearchParams({personalProjectId:P.value})}`,{personalSpaceId:e,personalProjectId:P.value,mode:F.value});F.value=n.mode,t.notify(u(`pages.connections.conflictSaved`))}catch(e){t.reportError(e)}finally{I.value=!1}}}function ht(e){return a.value.find(t=>t.type===e)?.name??e}function Y(e,t){let n=a.value.find(t=>t.type===e)?.capabilities;return!n?.length||(t===`live`||t===`hybrid`?n.includes(`retrieve`):!0)&&(t===`mirror`||t===`hybrid`?n.includes(`sync`):!0)}function gt(e){return[`hybrid`,`mirror`,`live`].find(t=>Y(e,t))??`live`}function _t(e){return[`hybrid`,`mirror`,`live`].map(t=>({value:t,label:u(`pages.connections.mode.${t}`),disabled:!Y(e,t)}))}function X(e){return e.targets?.length?e.targets:[{id:e.id,...e.target,mode:e.mode,status:e.status,sync:e.sync}]}function vt(e){return X(e).some(({mode:e})=>e!==`live`)}function yt(e){return V.value.find(({project_id:t})=>t===e)?.profile.name??e}function bt(e){return X(e).find(({sync:e})=>e?.error)?.sync?.error??e.sync?.error}function xt(e){return X(e).reduce((e,t)=>e+(t.sync?.skippedCredentials??0),0)}function Z(e){return[...new Set(e.split(`,`).map(e=>e.trim()).filter(Boolean))]}function St(e,t){let n=Z(e);if(!n.length)throw TypeError(`${t} is required`);return n}function Q(e){return Object.fromEntries(Object.entries(e).filter(([,e])=>e!==``&&(!Array.isArray(e)||e.length>0)))}function $(e,t){if(!e.trim())throw TypeError(`${t} is required`);return e.trim()}function Ct(e){return`https://github.com/JevonsCode/fuli/blob/main/${te()===`zh-CN`?`README.zh-CN.md`:`README.md`}#${e}`}return(e,r)=>(_(),l(`section`,le,[v(`div`,G,[v(`h3`,null,x(o(u)(`pages.connections.title`)),1)]),v(`div`,{class:`service-connection-grid`,"aria-label":o(u)(`pages.connections.statusAria`)},[v(`article`,{class:`service-connection-card`,"data-status":R.value?`ready`:`error`},[v(`header`,null,[r[30]||=v(`span`,{class:`service-connection-icon local`,"aria-hidden":`true`},[v(`span`,{class:`nav-icon nav-icon-personal-project`})],-1),v(`div`,null,[v(`h3`,null,x(o(u)(`pages.connections.localGraphiti`)),1)]),v(`span`,fe,x(R.value?o(u)(`common.status.connected`):o(u)(`common.status.connectionError`)),1)]),v(`dl`,null,[v(`div`,null,[v(`dt`,null,x(o(u)(`pages.connections.storage`)),1),r[31]||=v(`dd`,null,`Neo4j`,-1)]),v(`div`,null,[v(`dt`,null,x(o(u)(`pages.connections.purpose`)),1),v(`dd`,null,x(o(u)(`pages.connections.localPurpose`)),1)])])],8,de),v(`article`,{class:`service-connection-card`,"data-status":o(t).publicRuntimeStatus},[v(`header`,null,[r[33]||=v(`span`,{class:`service-connection-icon public`,"aria-hidden":`true`},[v(`span`,{class:`nav-icon nav-icon-public-project`})],-1),v(`div`,me,[v(`h3`,null,x(o(u)(`pages.connections.publicService`)),1),r[32]||=v(`span`,{class:`feature-badge beta`},`BETA`,-1)]),v(`span`,he,x(o(t).publicRuntimeStatus===`ready`?o(u)(`common.status.connected`):o(t).publicRuntimeStatus===`error`?o(u)(`common.status.connectionError`):o(u)(`common.status.notConnected`)),1)]),v(`dl`,null,[v(`div`,null,[v(`dt`,null,x(o(u)(`pages.connections.currentStatus`)),1),v(`dd`,null,x(o(t).publicRuntimeStatus===`ready`?o(u)(`pages.connections.sharedServicesReady`,{count:ne.value||z.value.length}):o(u)(`pages.connections.notAvailable`)),1)]),v(`div`,null,[v(`dt`,null,x(o(u)(`pages.connections.purpose`)),1),v(`dd`,null,x(o(u)(`pages.connections.publicPurpose`)),1)])])],8,pe)],8,ue),v(`section`,K,[v(`div`,q,[v(`h3`,null,x(o(u)(`pages.connections.externalTitle`)),1),v(`a`,{class:`section-help-link`,"data-testid":`external-knowledge-help`,href:re.value,"aria-label":o(u)(`pages.connections.externalHelp`),title:o(u)(`pages.connections.externalHelp`),target:`_blank`,rel:`noreferrer`},`?`,8,ge),v(`span`,_e,x(o(u)(`pages.connections.bindingCount`,{count:s.value.length})),1)]),v(`div`,ve,[(_(!0),l(p,null,g(s.value,e=>(_(),l(`article`,{key:e.id,class:`external-binding-row`,"data-status":e.status},[r[34]||=v(`i`,{"aria-hidden":`true`},null,-1),v(`div`,be,[v(`strong`,null,x(e.name),1),v(`span`,null,x(ht(e.connectorType)),1),v(`div`,xe,[v(`b`,null,x(o(u)(`pages.connections.boundTo`)),1),(_(!0),l(p,null,g(X(e),e=>(_(),l(`span`,{key:e.id,class:`external-binding-target-chip`,"data-status":e.status},x(yt(e.personalProjectId))+` · `+x(o(u)(`pages.connections.mode.${e.mode}`)),9,Se))),128))]),bt(e)?(_(),l(`small`,Ce,x(bt(e)),1)):xt(e)?(_(),l(`small`,we,x(o(u)(`pages.connections.credentialsSkipped`,{count:xt(e)})),1)):m(``,!0)]),v(`div`,Te,[v(`button`,{class:`quiet-button`,type:`button`,disabled:c.value,onClick:t=>it(e)},x(o(u)(`pages.connections.check`)),9,Ee),v(`button`,{class:`quiet-button external-sync-action`,type:`button`,disabled:c.value||!vt(e),onClick:t=>at(e)},x(o(u)(`pages.connections.sync`)),9,De),v(`button`,{class:`quiet-button`,type:`button`,disabled:c.value,onClick:t=>ct(e)},x(o(u)(`pages.connections.manageProjects`)),9,Oe),v(`button`,{class:`quiet-button danger`,type:`button`,disabled:c.value,onClick:t=>st(e)},x(o(u)(`pages.connections.disconnect`)),9,ke)]),S.value===e.id?(_(),l(`div`,Ae,[v(`label`,null,[v(`span`,null,x(o(u)(`pages.connections.targetProjects`)),1),d(se,{modelValue:C.value,"onUpdate:modelValue":r[0]||=e=>C.value=e,"control-id":`external-projects-${e.id}`,label:o(u)(`pages.connections.targetProjects`),options:U.value,disabled:c.value,required:``,searchable:``,onChange:ut},null,8,[`modelValue`,`control-id`,`label`,`options`,`disabled`])]),v(`div`,je,[(_(!0),l(p,null,g(C.value,t=>(_(),l(`div`,{key:t,class:`external-target-mode-row`},[v(`span`,null,x(yt(t)),1),d(j,{"model-value":A.value[t]??e.mode,"control-id":`external-target-mode-${e.id}-${t}`,label:o(u)(`pages.connections.bindingMode`),options:_t(e.connectorType),disabled:c.value,"onUpdate:modelValue":e=>dt(t,e)},null,8,[`model-value`,`control-id`,`label`,`options`,`disabled`,`onUpdate:modelValue`])]))),128))]),v(`div`,Me,[v(`button`,{class:`quiet-button`,type:`button`,disabled:c.value,onClick:lt},x(o(u)(`common.actions.cancel`)),9,Ne),v(`button`,{class:`primary-action`,type:`button`,disabled:c.value||!C.value.length,onClick:t=>ft(e)},x(o(u)(`pages.connections.saveProjects`)),9,Pe)])])):m(``,!0)],8,ye))),128)),s.value.length?m(``,!0):(_(),l(`div`,Fe,x(o(u)(`pages.connections.noExternalBindings`)),1))]),v(`form`,{class:`external-binding-form`,onSubmit:f(nt,[`prevent`])},[d(W,{modelValue:L.name,"onUpdate:modelValue":r[1]||=e=>L.name=e,label:o(u)(`pages.connections.bindingName`),"data-testid":`external-name`,required:``},null,8,[`modelValue`,`label`]),v(`label`,null,[v(`span`,null,x(o(u)(`pages.connections.connector`)),1),d(j,{modelValue:L.connectorType,"onUpdate:modelValue":r[2]||=e=>L.connectorType=e,"control-id":`external-connector`,label:o(u)(`pages.connections.connector`),options:H.value,disabled:c.value,required:``},null,8,[`modelValue`,`label`,`options`,`disabled`])]),v(`label`,null,[v(`span`,null,x(o(u)(`pages.connections.targetProjects`)),1),d(se,{modelValue:L.personalProjectIds,"onUpdate:modelValue":r[3]||=e=>L.personalProjectIds=e,"control-id":`external-projects`,label:o(u)(`pages.connections.targetProjects`),options:U.value,disabled:c.value,required:``,searchable:``},null,8,[`modelValue`,`label`,`options`,`disabled`])]),v(`label`,null,[v(`span`,null,x(o(u)(`pages.connections.bindingMode`)),1),d(j,{modelValue:L.mode,"onUpdate:modelValue":r[4]||=e=>L.mode=e,"control-id":`external-binding-mode`,label:o(u)(`pages.connections.bindingMode`),options:Ye.value,disabled:c.value,required:``},null,8,[`modelValue`,`label`,`options`,`disabled`])]),L.connectorType===`mcp`?(_(),l(p,{key:0},[v(`label`,null,[v(`span`,null,x(o(u)(`pages.connections.transport`)),1),d(j,{modelValue:L.mcpTransport,"onUpdate:modelValue":r[5]||=e=>L.mcpTransport=e,"control-id":`external-mcp-transport`,label:o(u)(`pages.connections.transport`),options:Xe.value,disabled:c.value,required:``},null,8,[`modelValue`,`label`,`options`,`disabled`])]),L.mcpTransport===`http`?(_(),h(W,{key:0,modelValue:L.mcpUrl,"onUpdate:modelValue":r[6]||=e=>L.mcpUrl=e,label:`MCP URL`,"data-testid":`mcp-url`,type:`url`,required:``},null,8,[`modelValue`])):(_(),h(W,{key:1,modelValue:L.mcpCommand,"onUpdate:modelValue":r[7]||=e=>L.mcpCommand=e,label:o(u)(`pages.connections.command`),required:``},null,8,[`modelValue`,`label`])),L.mcpTransport===`stdio`?(_(),h(W,{key:2,modelValue:L.mcpArgs,"onUpdate:modelValue":r[8]||=e=>L.mcpArgs=e,label:o(u)(`pages.connections.arguments`)},null,8,[`modelValue`,`label`])):(_(),h(W,{key:3,modelValue:L.mcpTokenEnv,"onUpdate:modelValue":r[9]||=e=>L.mcpTokenEnv=e,label:o(u)(`pages.connections.tokenEnv`),"data-testid":`mcp-token-env`},null,8,[`modelValue`,`label`])),d(W,{modelValue:L.mcpResourcePrefix,"onUpdate:modelValue":r[10]||=e=>L.mcpResourcePrefix=e,label:o(u)(`pages.connections.resourcePrefix`),"data-testid":`mcp-resource-prefix`},null,8,[`modelValue`,`label`])],64)):L.connectorType===`notion`?(_(),l(p,{key:1},[d(W,{modelValue:L.notionTokenEnv,"onUpdate:modelValue":r[11]||=e=>L.notionTokenEnv=e,label:o(u)(`pages.connections.tokenEnv`),required:``},null,8,[`modelValue`,`label`]),d(W,{modelValue:L.notionPageIds,"onUpdate:modelValue":r[12]||=e=>L.notionPageIds=e,label:`Page IDs`},null,8,[`modelValue`]),d(W,{modelValue:L.notionDataSourceIds,"onUpdate:modelValue":r[13]||=e=>L.notionDataSourceIds=e,label:`Data Source IDs`},null,8,[`modelValue`])],64)):L.connectorType===`feishu`?(_(),l(p,{key:2},[d(W,{modelValue:L.feishuTokenEnv,"onUpdate:modelValue":r[14]||=e=>L.feishuTokenEnv=e,label:o(u)(`pages.connections.tokenEnv`),required:``},null,8,[`modelValue`,`label`]),v(`label`,null,[v(`span`,null,x(o(u)(`pages.connections.region`)),1),d(j,{modelValue:L.feishuRegion,"onUpdate:modelValue":r[15]||=e=>L.feishuRegion=e,"control-id":`external-feishu-region`,label:o(u)(`pages.connections.region`),options:Ze.value,disabled:c.value,required:``},null,8,[`modelValue`,`label`,`options`,`disabled`])]),d(W,{modelValue:L.feishuSpaceId,"onUpdate:modelValue":r[16]||=e=>L.feishuSpaceId=e,label:`Space ID`},null,8,[`modelValue`]),d(W,{modelValue:L.feishuRootNodeToken,"onUpdate:modelValue":r[17]||=e=>L.feishuRootNodeToken=e,label:`Root Node Token`},null,8,[`modelValue`]),d(W,{modelValue:L.feishuNodeTokens,"onUpdate:modelValue":r[18]||=e=>L.feishuNodeTokens=e,label:`Node Tokens`},null,8,[`modelValue`]),d(W,{modelValue:L.feishuWebBaseUrl,"onUpdate:modelValue":r[19]||=e=>L.feishuWebBaseUrl=e,label:`Web URL`,type:`url`},null,8,[`modelValue`])],64)):L.connectorType===`retrieval_api`?(_(),l(p,{key:3},[d(W,{modelValue:L.retrievalUrl,"onUpdate:modelValue":r[20]||=e=>L.retrievalUrl=e,label:o(u)(`pages.connections.retrievalUrl`),type:`url`,required:``},null,8,[`modelValue`,`label`]),d(W,{modelValue:L.retrievalTokenEnv,"onUpdate:modelValue":r[21]||=e=>L.retrievalTokenEnv=e,label:o(u)(`pages.connections.tokenEnv`)},null,8,[`modelValue`,`label`]),d(W,{modelValue:L.retrievalKnowledgeIds,"onUpdate:modelValue":r[22]||=e=>L.retrievalKnowledgeIds=e,label:o(u)(`pages.connections.knowledgeIds`),required:``},null,8,[`modelValue`,`label`]),d(W,{modelValue:L.retrievalScoreThreshold,"onUpdate:modelValue":r[23]||=e=>L.retrievalScoreThreshold=e,label:o(u)(`pages.connections.scoreThreshold`),inputmode:`decimal`,required:``},null,8,[`modelValue`,`label`])],64)):(_(),l(p,{key:4},[d(W,{modelValue:L.customModule,"onUpdate:modelValue":r[24]||=e=>L.customModule=e,label:o(u)(`pages.connections.module`),required:``},null,8,[`modelValue`,`label`]),d(W,{modelValue:L.customEnvironmentNames,"onUpdate:modelValue":r[25]||=e=>L.customEnvironmentNames=e,label:o(u)(`pages.connections.environmentNames`)},null,8,[`modelValue`,`label`]),v(`div`,Ie,[d(W,{modelValue:L.customSourceJson,"onUpdate:modelValue":r[26]||=e=>L.customSourceJson=e,label:o(u)(`pages.connections.sourceJson`),multiline:``,required:``},null,8,[`modelValue`,`label`])]),v(`span`,Le,x(o(u)(`pages.connections.trustedCode`)),1)],64)),v(`button`,{class:`primary-action external-create-action`,type:`submit`,disabled:c.value||!V.value.length||!L.personalProjectIds.length},[r[35]||=v(`span`,{class:`external-create-action-icon`,"aria-hidden":`true`},null,-1),v(`span`,null,x(o(u)(`pages.connections.connect`)),1)],8,Re)],32)]),V.value.length?(_(),l(`section`,ze,[v(`div`,Be,[v(`h3`,null,x(o(u)(`pages.connections.conflictTitle`)),1),v(`a`,{class:`section-help-link`,"data-testid":`conflict-policy-help`,href:ie.value,"aria-label":o(u)(`pages.connections.conflictHelp`),title:o(u)(`pages.connections.conflictHelp`),target:`_blank`,rel:`noreferrer`},`?`,8,Ve)]),v(`div`,He,[v(`label`,null,[v(`span`,null,x(o(u)(`pages.connections.targetProject`)),1),d(j,{modelValue:P.value,"onUpdate:modelValue":r[27]||=e=>P.value=e,"control-id":`external-conflict-project`,label:o(u)(`pages.connections.targetProject`),options:U.value,disabled:I.value,required:``,onChange:pt},null,8,[`modelValue`,`label`,`options`,`disabled`])]),v(`label`,null,[v(`span`,null,x(o(u)(`pages.connections.conflictAction`)),1),d(j,{modelValue:F.value,"onUpdate:modelValue":r[28]||=e=>F.value=e,"control-id":`external-conflict-mode`,label:o(u)(`pages.connections.conflictAction`),options:Qe.value,disabled:I.value,required:``,onChange:mt},null,8,[`modelValue`,`label`,`options`,`disabled`])])])])):m(``,!0),o(t).state?.capabilities?.subscribeProject?(_(),l(`section`,Ue,[v(`div`,We,[v(`h3`,null,[w(x(o(u)(`pages.connections.subscriptionsTitle`))+` `,1),r[36]||=v(`span`,{class:`feature-badge beta`},`BETA`,-1)])]),v(`div`,Ge,[(_(!0),l(p,null,g(B.value,e=>(_(),l(`div`,{key:`${e.provider_url}:${e.project_id}`,class:`subscription-row`},[r[37]||=v(`span`,null,`↗`,-1),v(`div`,null,[v(`strong`,null,x(e.project_name??e.project_id),1),v(`span`,null,x(o(u)(`pages.connections.sharedProject`)),1)]),v(`button`,{class:`secondary-action subscription-action`,type:`button`,onClick:t=>tt(e)},x(o(u)(`pages.connections.unsubscribe`)),9,Ke)]))),128)),B.value.length?m(``,!0):(_(),l(`div`,qe,x(o(u)(`pages.connections.noSubscriptions`)),1))]),v(`form`,{class:`subscription-form`,onSubmit:f(et,[`prevent`])},[d(j,{modelValue:n.value,"onUpdate:modelValue":r[29]||=e=>n.value=e,options:ce.value,label:o(u)(`pages.connections.sharedProjectLabel`),placeholder:o(u)(`pages.connections.choosePublicProject`),searchable:``,required:``},null,8,[`modelValue`,`options`,`label`,`placeholder`]),v(`button`,Je,x(o(u)(`pages.connections.subscribe`)),1)],32)])):m(``,!0)]))}});export{Ye as default};
@@ -1 +0,0 @@
1
- import{h as e,k as t,x as n}from"./i18n-CWfd8Dtt.js";import{t as r}from"./KnowledgeWorkspace-1pHJ0MNZ.js";var i=n({__name:`KnowledgePage`,setup(n){return(n,i)=>(t(),e(r))}});export{i as default};
@@ -1 +0,0 @@
1
- import{h as e,k as t,x as n}from"./i18n-CWfd8Dtt.js";import{t as r}from"./KnowledgeWorkspace-1pHJ0MNZ.js";var i=n({__name:`PersonalProjectsPage`,setup(n){return(n,i)=>(t(),e(r,{"personal-projects-only":``}))}});export{i as default};
@@ -1,2 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/OverviewPage-CHE6XhdS.js","assets/i18n-CWfd8Dtt.js","assets/console-DMvHxKf9.js","assets/vue-router-DN8x6iY1.js","assets/useApi-CROJJdhE-BLQiPVw0.js","assets/paths-CDREouhi.js","assets/PersonalProfilePage-CXXiabUy.js","assets/_plugin-vue_export-helper-BDNMzG2s.js","assets/SearchableSelect-C5RiB5F8.js","assets/KnowledgeEditDialog-wotVahvr.js","assets/identity-C9mLdR8L.js","assets/model-CsYAR8O3.js","assets/KnowledgeEditDialog-DWUV_NPp.css","assets/KnowledgeInspector-BzkW0mVs.js","assets/conversation-launcher-settings-Dnlcw7Rj.js","assets/KnowledgeInspector--1NujtXW.css","assets/PersonalProfilePage-B7T09bow.css","assets/WritingTastePage-B9BCYIwQ.js","assets/WritingTastePage-DSgvTH6x.css","assets/PersonalProjectsPage-d2wYGW8n.js","assets/KnowledgeWorkspace-1pHJ0MNZ.js","assets/KnowledgeOrganizerPage-BebUDiHt.js","assets/KnowledgeOrganizerPage-Cx1w1jb2.css","assets/PublicProjectsPage-hxLShtnZ.js","assets/KnowledgePage-OUT07aKH.js","assets/ReviewPage-DUeyu7E8.js","assets/ConnectionsPage-D5J91x6d.js","assets/ConnectionsPage-CBHAdZXT.css","assets/SettingsPage-BMuASSzQ.js","assets/SettingsPage-CAfz4qiV.css","assets/AboutPage-CftRexSY.js","assets/fuli-logo-Bu9WBuQe.js","assets/AboutPage-DXh7Fwxt.css"])))=>i.map(i=>d[i]);
2
- import{$ as e,D as t,I as n,L as r,N as i,O as a,Q as o,_ as s,a as c,b as l,d as u,f as d,g as f,h as p,i as m,j as h,k as g,m as _,n as v,o as y,p as b,q as x,r as S,t as C,tt as w,x as T}from"./i18n-CWfd8Dtt.js";import{s as E,t as D}from"./console-DMvHxKf9.js";import{m as ee}from"./useApi-CROJJdhE-BLQiPVw0.js";import{i as O,n as k,r as A,t as j}from"./vue-router-DN8x6iY1.js";import{t as M}from"./fuli-logo-Bu9WBuQe.js";import{t as te}from"./_plugin-vue_export-helper-BDNMzG2s.js";import{n as ne,t as re}from"./paths-CDREouhi.js";(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin===`use-credentials`?t.credentials=`include`:e.crossOrigin===`anonymous`?t.credentials=`omit`:t.credentials=`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var N={name:`fuli-context`,version:`0.7.4-beta.1`,description:`Local-first collaboration relationship graph for AI agents.`,type:`module`,files:[`README.zh-CN.md`,`npm-shrinkwrap.json`,`src/`,`dist/web/`,`docs/external-knowledge-architecture.md`,`examples/external-knowledge/markdown-folder.mjs`,`graph-provider/Dockerfile`,`graph-provider/pyproject.toml`,`graph-provider/fuli_graph/*.py`,`graph-provider/fuli_graph/**/*.py`,`skills/`,`compose.graphiti.yml`],bin:{fl:`src/cli.js`,fuli:`src/cli.js`},keywords:[`ai-agent`,`mcp`,`context`,`knowledge-graph`,`local-first`,`codex`,`claude-code`],scripts:{mcp:`node src/mcp-server.js`,dev:`run-p dev:server dev:web`,"dev:server":`node src/server.js`,"dev:web":`vite`,build:`run-s typecheck:web build:web`,"build:web":`vite build`,"typecheck:web":`vue-tsc --noEmit -p tsconfig.app.json`,"test:node":`node --test`,"test:web":`vitest run --config vitest.config.ts`,"test:package":`node scripts/package-smoke.js`,"test:knowledge:live":`node acceptance/knowledge-live.js`,"test:external-knowledge:live":`node scripts/validate-external-knowledge-live.js`,start:`node src/server.js`,"graph:setup":`node src/graphiti/setup.js`,"graph:up":`docker compose -f compose.graphiti.yml up -d --build`,"graph:down":`docker compose -f compose.graphiti.yml down`,"test:structure":`node --test test/source-structure.test.js`,pretest:`npm run build:web`,test:`run-s typecheck:web test:node test:web`,prepack:`npm run build`,prepublishOnly:`npm test`},engines:{node:`>=24.12`},repository:{type:`git`,url:`git+https://github.com/JevonsCode/fuli.git`},homepage:`https://github.com/JevonsCode/fuli#readme`,bugs:{url:`https://github.com/JevonsCode/fuli/issues`},publishConfig:{access:`public`},license:`Apache-2.0`,dependencies:{"@hono/node-server":`2.0.12`,"@modelcontextprotocol/sdk":`^1.29.0`,zod:`^4.4.3`},devDependencies:{"@types/d3":`^7.4.3`,"@types/node":`^24.13.3`,"@vitejs/plugin-vue":`^6.0.8`,"@vue/test-utils":`^2.4.11`,"brace-expansion":`5.0.9`,d3:`^7.9.0`,gsap:`^3.15.0`,jsdom:`^29.1.1`,linkedom:`^0.18.12`,"npm-run-all2":`^9.0.2`,pinia:`^4.0.2`,typescript:`~6.0.0`,vite:`^8.1.5`,vitest:`^4.1.10`,vue:`^3.5.40`,"vue-i18n":`^11.4.8`,"vue-router":`^5.2.0`,"vue-tsc":`^3.3.8`},overrides:{"@modelcontextprotocol/sdk":{"@hono/node-server":`2.0.12`},"brace-expansion":`$brace-expansion`,"fast-uri":`3.1.5`}}.version,ie=[`aria-label`],ae={class:`brand-mark-wrap`},P=[`src`],F={class:`brand-copy`},I={class:`brand-title-row`},L={class:`brand-name`},R={class:`brand-version`},z={class:`brand-title-row`},B={class:`brand-name`},V={class:`brand-version`},H=te(T({__name:`BrandEasterEgg`,setup(n){let r=x(0),i=x(!1),l=x(!1),d=!1;function p(){r.value+=1,i.value=!0}function m(){i.value=!1}function h(){d=!1,l.value=!1}function v(e){e.key===`Tab`&&(d=!0)}function y(){l.value=d}function b(){l.value=!1}return a(()=>{window.addEventListener(`pointerdown`,h,!0),window.addEventListener(`keydown`,v,!0)}),t(()=>{window.removeEventListener(`pointerdown`,h,!0),window.removeEventListener(`keydown`,v,!0)}),(t,n)=>(g(),s(`button`,{class:e([`brand-block`,{"is-sparkling":i.value,"is-keyboard-focused":l.value}]),type:`button`,"aria-label":o(c)(`console.brandEffect.aria`),onClick:p,onFocus:y,onBlur:b},[_(`span`,ae,[_(`img`,{class:`brand-mark`,src:o(M),alt:``,"aria-hidden":`true`},null,8,P),i.value?(g(),s(`span`,{key:`orbit-${r.value}`,class:`brand-orbit`,"aria-hidden":`true`})):f(``,!0)]),_(`span`,F,[_(`span`,I,[_(`span`,L,w(o(c)(`common.brand`)),1),_(`span`,R,`v`+w(o(N)),1)]),n[0]||=_(`span`,{class:`brand-subtitle`},`Context Graph`,-1),i.value?(g(),s(`span`,{key:`copy-reflection-${r.value}`,class:`brand-copy-reflection`,"aria-hidden":`true`,onAnimationend:u(m,[`self`])},[_(`span`,z,[_(`span`,B,w(o(c)(`common.brand`)),1),_(`span`,V,`v`+w(o(N)),1)])],32)):f(``,!0)])],42,ie))}}),[[`__scopeId`,`data-v-efd904c7`]]),U=[`aria-label`],W=[`lang`,`aria-label`,`aria-pressed`,`onClick`],G=T({__name:`LocaleSwitcher`,setup(e){let t=b(()=>v()),n={"zh-CN":`中`,"en-US":`EN`};function r(e){e!==t.value&&m(e)}return(e,i)=>(g(),s(`div`,{class:`locale-switcher`,role:`group`,"aria-label":o(c)(`common.language.label`)},[(g(!0),s(d,null,h(o(C),e=>(g(),s(`button`,{key:e,type:`button`,lang:e,"aria-label":o(c)(e===`zh-CN`?`common.language.chinese`:`common.language.english`),"aria-pressed":t.value===e,onClick:t=>r(e)},w(n[e]),9,W))),128))],8,U))}}),K=[`routes.`,`common.`];function q(e,t=``){let n=typeof e==`string`&&e?e:t;return K.some(e=>n.startsWith(e))?c(n):n}function J(e){if(typeof document>`u`)return;let t=q(e,`routes.overview.title`);document.title=`${t} · ${c(`common.brand`)}`}var oe={class:`app-shell`},se={class:`sidebar`},ce=[`aria-label`],le={class:`nav-section-label`},ue={class:`nav-label`},de={class:`nav-section-label nav-space-label`},fe={class:`nav-copy`},pe={class:`nav-copy`},me={class:`nav-copy`},he={class:`nav-section-label nav-public-label`},ge={class:`nav-copy`},_e={class:`nav-section-label nav-tool-label`},ve={class:`nav-label`},ye={class:`nav-label`},be={class:`nav-label`},xe={class:`nav-section-label nav-about-label`},Se={class:`nav-label`},Ce={class:`nav-label`},we={class:`sidebar-foot`},Te=[`aria-label`],Ee={class:`runtime-status`},De={class:`runtime-status`},Oe={class:`workspace`},ke={class:`topbar`},Ae={class:`topbar-heading`},je={key:0,class:`eyebrow`},Y={key:1,class:`topbar-description`},Me={class:`topbar-actions`},Ne={key:0,class:`mode-chip`},Pe={key:1,class:`settings-save-button`,form:`settings-form`,type:`submit`},Fe=T({__name:`ConsoleLayout`,setup(t){let u=D(),m=ee(),h=b(()=>u.activePersonalSpace?.id??`current`),v=b(()=>ne(h.value,`graph`)),y=b(()=>re(`personal`,h.value,`directory`)),x=b(()=>q(m.meta.title,`routes.overview.title`)),S=b(()=>String(m.meta.eyebrow??`LOCAL + FEDERATED`)),C=b(()=>q(m.meta.description)),T=b(()=>u.publicRuntimeStatus===`ready`),E=b(()=>u.publicRuntimeStatus===`ready`?c(`console.services.publicReady`):u.publicRuntimeStatus===`error`?c(`console.services.publicError`):c(`console.services.publicOffline`)),O=b(()=>u.publicRuntimeStatus===`ready`?c(`console.services.publicAvailable`):u.publicRuntimeStatus===`error`?c(`console.services.localUnaffected`):c(`console.services.localOnly`)),A=b(()=>u.state?.capabilities?.browsePublicProjects!==!1),M=b(()=>{let e=u.state?.capabilities;return e?.submitKnowledge!==!1||e?.reviewProposals===!0});return a(()=>{u.runtimeStatus===`idle`&&u.refresh()}),n(()=>{J(m.meta.title)}),(t,n)=>(g(),s(`div`,oe,[_(`aside`,se,[l(H),_(`nav`,{class:`primary-nav`,"aria-label":o(c)(`console.navigation.aria`)},[_(`p`,le,w(o(c)(`console.navigation.workspace`)),1),l(o(j),{to:`/`,"exact-active-class":`is-active`},{default:r(()=>[n[2]||=_(`span`,{class:`nav-icon nav-icon-overview`,"aria-hidden":`true`},null,-1),_(`span`,ue,w(o(c)(`console.navigation.overview`)),1)]),_:1}),_(`p`,de,w(o(c)(`console.navigation.personalSpace`)),1),l(o(j),{class:`space-nav-button personal-profile-button`,to:`/preferences`,"active-class":`is-active`},{default:r(()=>[n[3]||=_(`span`,{class:`nav-icon nav-icon-personal-profile`,"aria-hidden":`true`},null,-1),_(`span`,fe,[_(`strong`,null,w(o(c)(`console.navigation.preferences`)),1),_(`small`,null,w(o(c)(`console.navigation.preferencesMeta`)),1)])]),_:1}),l(o(j),{class:`space-nav-button knowledge-organizer-button`,to:`/organize`,"active-class":`is-active`},{default:r(()=>[n[4]||=_(`span`,{class:`nav-icon nav-icon-knowledge-organizer`,"aria-hidden":`true`},null,-1),_(`span`,pe,[_(`strong`,null,w(o(c)(`console.navigation.organizer`)),1),_(`small`,null,w(o(c)(`console.navigation.organizerMeta`)),1)])]),_:1}),l(o(j),{class:`space-nav-button personal-space-button`,to:v.value,"active-class":`is-active`},{default:r(()=>[n[5]||=_(`span`,{class:`nav-icon nav-icon-personal-project`,"aria-hidden":`true`},null,-1),_(`span`,me,[_(`strong`,null,w(o(c)(`console.navigation.personalProjects`)),1),_(`small`,null,w(o(c)(`console.navigation.personalProjectsMeta`)),1)])]),_:1},8,[`to`]),A.value?(g(),s(d,{key:0},[_(`p`,he,w(o(c)(`console.navigation.publicSpace`)),1),l(o(j),{class:`space-nav-button public-space-button`,to:`/public-projects`,"active-class":`is-active`},{default:r(()=>[n[6]||=_(`span`,{class:`nav-icon nav-icon-public-project`,"aria-hidden":`true`},null,-1),_(`span`,ge,[_(`strong`,null,w(o(c)(`console.navigation.publicProjects`)),1),_(`small`,null,w(o(c)(`console.navigation.publicProjectsMeta`)),1)])]),_:1})],64)):f(``,!0),_(`p`,_e,w(o(c)(`console.navigation.governance`)),1),l(o(j),{to:y.value,"active-class":`is-active`},{default:r(()=>[n[7]||=_(`span`,{class:`nav-icon nav-icon-knowledge-graph`,"aria-hidden":`true`},null,-1),_(`span`,ve,w(o(c)(`console.navigation.knowledge`)),1)]),_:1},8,[`to`]),M.value?(g(),p(o(j),{key:1,to:`/review`,"active-class":`is-active`},{default:r(()=>[n[8]||=_(`span`,{class:`nav-icon nav-icon-review`,"aria-hidden":`true`},null,-1),_(`span`,ye,w(o(c)(`console.navigation.review`)),1)]),_:1})):f(``,!0),l(o(j),{to:`/connections`,"active-class":`is-active`},{default:r(()=>[n[9]||=_(`span`,{class:`nav-icon nav-icon-connections`,"aria-hidden":`true`},null,-1),_(`span`,be,w(o(c)(`console.navigation.connections`)),1)]),_:1}),_(`p`,xe,w(o(c)(`console.navigation.aboutSection`)),1),l(o(j),{to:`/settings`,"active-class":`is-active`},{default:r(()=>[n[10]||=_(`span`,{class:`nav-icon nav-icon-settings`,"aria-hidden":`true`},null,-1),_(`span`,Se,w(o(c)(`console.navigation.settings`)),1)]),_:1}),l(o(j),{to:`/about`,"active-class":`is-active`},{default:r(()=>[n[11]||=_(`span`,{class:`nav-icon nav-icon-about`,"aria-hidden":`true`},null,-1),_(`span`,Ce,w(o(c)(`console.navigation.about`)),1)]),_:1})],8,ce),_(`div`,we,[_(`div`,{class:`service-runtime-list`,"aria-label":o(c)(`console.services.aria`)},[_(`div`,Ee,[_(`span`,{class:e([`status-dot`,o(u).runtimeStatus])},null,2),_(`div`,null,[_(`strong`,null,w(o(u).runtimeStatus===`ready`?o(c)(`console.services.localReady`):o(u).runtimeStatus===`error`?o(c)(`console.services.localError`):o(c)(`console.services.localConnecting`)),1),n[12]||=_(`small`,null,`Graphiti / Neo4j`,-1)])]),_(`div`,De,[_(`span`,{class:e([`status-dot`,o(u).publicRuntimeStatus])},null,2),_(`div`,null,[_(`strong`,null,w(E.value),1),_(`small`,null,w(O.value),1)])])],8,Te)])]),_(`main`,Oe,[_(`header`,ke,[_(`div`,Ae,[S.value?(g(),s(`p`,je,w(S.value),1)):f(``,!0),_(`h2`,null,w(x.value),1),C.value?(g(),s(`p`,Y,w(C.value),1)):f(``,!0)]),_(`div`,Me,[T.value?(g(),s(`span`,Ne,w(o(c)(`console.publicReady`)),1)):f(``,!0),o(m).name===`settings`?(g(),s(`button`,Pe,w(o(c)(`settings.save`)),1)):f(``,!0),l(G),_(`button`,{class:`quiet-button`,type:`button`,onClick:n[0]||=(...e)=>o(u).refresh&&o(u).refresh(...e)},w(o(c)(`common.actions.refresh`)),1)])]),o(u).feedback?(g(),s(`button`,{key:0,class:e([`feedback feedback-button`,{success:o(u).feedback.tone===`success`}]),type:`button`,"aria-live":`polite`,onClick:n[1]||=(...e)=>o(u).clearFeedback&&o(u).clearFeedback(...e)},w(o(u).feedback.message),3)):f(``,!0),l(o(k),null,{default:r(({Component:e})=>[(g(),p(i(e)))]),_:1})])]))}}),Ie=T({__name:`App`,setup(e){return(e,t)=>(g(),p(Fe))}}),Le=`modulepreload`,Re=function(e){return`/`+e},X={},Z=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function s(e){return import.meta.resolve?import.meta.resolve(e):new URL(e,import.meta.url).href}r=o(t.map(t=>{if(t=Re(t,n),t=s(t),t in X)return;X[t]=!0;let r=t.endsWith(`.css`);for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}let i=document.createElement(`link`);if(i.rel=r?`stylesheet`:Le,r||(i.as=`script`),i.crossOrigin=``,i.href=t,a&&i.setAttribute(`nonce`,a),document.head.appendChild(i),r)return new Promise((e,n)=>{i.addEventListener(`load`,e),i.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})};function ze(e){let t=e.match(/^#\/knowledge\/([^/?#]+)\/([^/?#]+)\/(entity|relationship)\/([^/?#]+)(?:\?([^#]*))?$/);if(!t)return null;let[,n,r,i,a,o]=t;return`/knowledge/${n}/${r}/directory/${i}/${a}${o?`?${o}`:``}`}var Q=A({history:O(`/`),routes:[{path:`/`,name:`overview`,component:()=>Z(()=>import(`./OverviewPage-CHE6XhdS.js`),__vite__mapDeps([0,1,2,3,4,5])),meta:{eyebrow:``,title:`routes.overview.title`}},{path:`/preferences`,name:`personal-profile`,component:()=>Z(()=>import(`./PersonalProfilePage-CXXiabUy.js`),__vite__mapDeps([6,1,2,3,4,7,8,9,10,11,12,13,14,15,16])),meta:{eyebrow:`PERSONAL LENS`,title:`routes.preferences.title`,description:`routes.preferences.description`}},{path:`/preferences/writing`,name:`writing-taste`,component:()=>Z(()=>import(`./WritingTastePage-B9BCYIwQ.js`),__vite__mapDeps([17,1,2,3,4,7,9,8,10,11,12,18])),meta:{eyebrow:``,title:`routes.writingTaste.title`}},{path:`/personal/:spaceId/projects/:projectId/:mode/:itemKind/:itemId`,name:`personal-project-item`,component:()=>Z(()=>import(`./PersonalProjectsPage-d2wYGW8n.js`),__vite__mapDeps([19,1,20,2,4,3,5,8,10,9,7,11,12,13,14,15])),meta:{eyebrow:`PERSONAL PROJECT`,title:`routes.personalProjects.title`}},{path:`/personal/:spaceId/projects/:mode/:itemKind/:itemId`,name:`personal-projects-item`,component:()=>Z(()=>import(`./PersonalProjectsPage-d2wYGW8n.js`),__vite__mapDeps([19,1,20,2,4,3,5,8,10,9,7,11,12,13,14,15])),meta:{eyebrow:`PERSONAL PROJECTS`,title:`routes.personalProjects.title`,description:`routes.personalProjects.description`}},{path:`/personal/:spaceId/projects/:mode`,name:`personal-projects`,component:()=>Z(()=>import(`./PersonalProjectsPage-d2wYGW8n.js`),__vite__mapDeps([19,1,20,2,4,3,5,8,10,9,7,11,12,13,14,15])),meta:{eyebrow:`PERSONAL PROJECTS`,title:`routes.personalProjects.title`,description:`routes.personalProjects.description`}},{path:`/personal/:spaceId/projects/:projectId/:mode`,name:`personal-project`,component:()=>Z(()=>import(`./PersonalProjectsPage-d2wYGW8n.js`),__vite__mapDeps([19,1,20,2,4,3,5,8,10,9,7,11,12,13,14,15])),meta:{eyebrow:`PERSONAL PROJECT`,title:`routes.personalProjects.title`}},{path:`/organize`,name:`knowledge-organizer`,component:()=>Z(()=>import(`./KnowledgeOrganizerPage-BebUDiHt.js`),__vite__mapDeps([21,1,2,7,8,10,9,11,12,13,14,15,22])),meta:{eyebrow:`KNOWLEDGE CLASSIFICATION`,title:`routes.organizer.title`}},{path:`/public-projects`,name:`public-projects`,component:()=>Z(()=>import(`./PublicProjectsPage-hxLShtnZ.js`),__vite__mapDeps([23,1,2,4,5,8,10])),meta:{eyebrow:`PUBLIC PROJECTS`,title:`routes.publicProjects.title`,description:`routes.publicProjects.description`}},{path:`/knowledge`,name:`knowledge-default`,component:()=>Z(()=>import(`./KnowledgePage-OUT07aKH.js`),__vite__mapDeps([24,1,20,2,4,3,5,8,10,9,7,11,12,13,14,15])),meta:{eyebrow:`KNOWLEDGE BASE`,title:`routes.knowledge.title`}},{path:`/knowledge/:scope/:spaceId/:projectId/:mode/:itemKind/:itemId`,name:`project-knowledge-item`,component:()=>Z(()=>import(`./KnowledgePage-OUT07aKH.js`),__vite__mapDeps([24,1,20,2,4,3,5,8,10,9,7,11,12,13,14,15])),meta:{eyebrow:`KNOWLEDGE BASE`,title:`routes.knowledge.title`}},{path:`/knowledge/:scope/:spaceId/:mode/:itemKind/:itemId`,name:`knowledge-item`,component:()=>Z(()=>import(`./KnowledgePage-OUT07aKH.js`),__vite__mapDeps([24,1,20,2,4,3,5,8,10,9,7,11,12,13,14,15])),meta:{eyebrow:`KNOWLEDGE BASE`,title:`routes.knowledge.title`}},{path:`/knowledge/:scope/:spaceId/:projectId/:mode`,name:`project-knowledge`,component:()=>Z(()=>import(`./KnowledgePage-OUT07aKH.js`),__vite__mapDeps([24,1,20,2,4,3,5,8,10,9,7,11,12,13,14,15])),meta:{eyebrow:`KNOWLEDGE BASE`,title:`routes.knowledge.title`}},{path:`/knowledge/:scope/:spaceId/:mode`,name:`knowledge`,component:()=>Z(()=>import(`./KnowledgePage-OUT07aKH.js`),__vite__mapDeps([24,1,20,2,4,3,5,8,10,9,7,11,12,13,14,15])),meta:{eyebrow:`KNOWLEDGE BASE`,title:`routes.knowledge.title`}},{path:`/review`,name:`review`,component:()=>Z(()=>import(`./ReviewPage-DUeyu7E8.js`),__vite__mapDeps([25,1,2,8,10,11])),meta:{eyebrow:`REVIEW WORKSPACE`,title:`routes.review.title`,description:`routes.review.description`}},{path:`/connections`,name:`connections`,component:()=>Z(()=>import(`./ConnectionsPage-D5J91x6d.js`),__vite__mapDeps([26,1,2,7,8,10,27])),meta:{eyebrow:`SERVICE CONNECTIONS`,title:`routes.connections.title`,description:`routes.connections.description`}},{path:`/settings`,name:`settings`,component:()=>Z(()=>import(`./SettingsPage-BMuASSzQ.js`),__vite__mapDeps([28,1,2,7,8,14,29])),meta:{eyebrow:``,title:`routes.settings.title`}},{path:`/about`,name:`about`,component:()=>Z(()=>import(`./AboutPage-CftRexSY.js`),__vite__mapDeps([30,1,31,7,32])),meta:{eyebrow:`FULI`,title:`routes.about.title`}},{path:`/:pathMatch(.*)*`,redirect:`/`}],scrollBehavior:()=>({top:0})});Q.beforeEach(e=>e.path!==`/`||typeof window>`u`?!0:ze(window.location.hash)??!0),Q.afterEach(e=>{J(e.meta.title)});var $=y(Ie);$.use(E()),$.use(S),$.use(Q),await Q.isReady(),$.mount(`#app`);