fuli-context 0.7.4-beta.2 → 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.
- package/README.md +16 -1
- package/README.zh-CN.md +15 -1
- package/dist/web/assets/{AboutPage-CftRexSY.js → AboutPage-Dpf5fRWv.js} +1 -1
- package/dist/web/assets/ConnectionsPage-D21aUDCP.js +1 -0
- package/dist/web/assets/{KnowledgeEditDialog-wotVahvr.js → KnowledgeEditDialog-u7lpfN3j.js} +1 -1
- package/dist/web/assets/{KnowledgeInspector-BzkW0mVs.js → KnowledgeInspector-k4xnHtXd.js} +1 -1
- package/dist/web/assets/{KnowledgeOrganizerPage-BebUDiHt.js → KnowledgeOrganizerPage-Bdj7Rn84.js} +1 -1
- package/dist/web/assets/KnowledgePage-UHVAbC1W.js +1 -0
- package/dist/web/assets/{KnowledgeWorkspace-1pHJ0MNZ.js → KnowledgeWorkspace-Lq3d-MeC.js} +1 -1
- package/dist/web/assets/{OverviewPage-CHE6XhdS.js → OverviewPage-CycAgA1V.js} +1 -1
- package/dist/web/assets/{PersonalProfilePage-CXXiabUy.js → PersonalProfilePage-U9oIV5FT.js} +1 -1
- package/dist/web/assets/PersonalProjectsPage-C5RpXKcA.js +1 -0
- package/dist/web/assets/{PublicProjectsPage-hxLShtnZ.js → PublicProjectsPage-DiWxm35E.js} +1 -1
- package/dist/web/assets/{ReviewPage-DUeyu7E8.js → ReviewPage-jxRfGSJK.js} +1 -1
- package/dist/web/assets/{SearchableSelect-C5RiB5F8.js → SearchableSelect-B3-5IPup.js} +1 -1
- package/dist/web/assets/{SettingsPage-BMuASSzQ.js → SettingsPage-BqfGDOho.js} +1 -1
- package/dist/web/assets/{WritingTastePage-B9BCYIwQ.js → WritingTastePage-BJxhMqJR.js} +1 -1
- package/dist/web/assets/{console-DMvHxKf9.js → console-D_2zC4lm.js} +1 -1
- package/dist/web/assets/{conversation-launcher-settings-Dnlcw7Rj.js → conversation-launcher-settings-DQmMH2j7.js} +1 -1
- package/dist/web/assets/{i18n-CWfd8Dtt.js → i18n-CwqXDI1C.js} +1 -1
- package/dist/web/assets/{identity-C9mLdR8L.js → identity-DmGcY3Y6.js} +1 -1
- package/dist/web/assets/index-IUGLt4lG.js +2 -0
- package/dist/web/assets/{model-CsYAR8O3.js → model-CVoOdRsL.js} +1 -1
- package/dist/web/assets/{useApi-CROJJdhE-BLQiPVw0.js → useApi-CROJJdhE-CBNg4CdH.js} +1 -1
- package/dist/web/assets/{vue-router-DN8x6iY1.js → vue-router-CWSsUUio.js} +1 -1
- package/dist/web/index.html +5 -5
- package/docs/public-personal-architecture.md +73 -0
- package/graph-provider/fuli_graph/model_validation.py +4 -0
- package/graph-provider/pyproject.toml +1 -1
- package/npm-shrinkwrap.json +2 -2
- package/package.json +2 -1
- package/skills/capturing-session-knowledge/SKILL.md +4 -2
- package/src/cli/command-registry.js +1 -0
- package/src/cli/workspace-connection-command.js +333 -0
- package/src/cli.js +5 -0
- package/src/graphiti/federated-application.js +21 -22
- package/src/graphiti/knowledge-provider-mapping.js +7 -1
- package/src/graphiti/runtime-config.js +6 -1
- package/src/graphiti/workspace-provider-client.js +403 -0
- package/dist/web/assets/ConnectionsPage-D5J91x6d.js +0 -1
- package/dist/web/assets/KnowledgePage-OUT07aKH.js +0 -1
- package/dist/web/assets/PersonalProjectsPage-d2wYGW8n.js +0 -1
- package/dist/web/assets/index-nP5p5OaY.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
|
+
}
|
|
@@ -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.2`,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`);
|