fuli-context 0.5.0 → 0.7.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 +370 -202
- package/README.zh-CN.md +448 -0
- package/compose.graphiti.yml +6 -6
- package/dist/web/assets/AboutPage-DXh7Fwxt.css +1 -0
- package/dist/web/assets/AboutPage-qeO_vm0T.js +1 -0
- package/dist/web/assets/ConnectionsPage-CBHAdZXT.css +1 -0
- package/dist/web/assets/ConnectionsPage-DO0GR9Xg.js +1 -0
- package/dist/web/assets/KnowledgeInspector-Bjhdu2mf.css +1 -0
- package/dist/web/assets/KnowledgeInspector-DEW5lA1m.js +1 -0
- package/dist/web/assets/KnowledgeOrganizerPage-BkM568Ld.js +1 -0
- package/dist/web/assets/KnowledgeOrganizerPage-Cx1w1jb2.css +1 -0
- package/dist/web/assets/KnowledgePage-BAT4aZIm.js +1 -0
- package/dist/web/assets/KnowledgeWorkspace-DyGtBz--.js +4 -0
- package/dist/web/assets/OverviewPage-CmCcDCAs.js +1 -0
- package/dist/web/assets/PersonalProfilePage-C42mwKN8.js +1 -0
- package/dist/web/assets/{PersonalProfilePage-S8ZcG2LU.css → PersonalProfilePage-CdmEzyvZ.css} +1 -1
- package/dist/web/assets/PersonalProjectsPage-BwaXR62K.js +1 -0
- package/dist/web/assets/PublicProjectsPage-egKBulOq.js +1 -0
- package/dist/web/assets/ReviewPage-B3vnZ6gn.js +1 -0
- package/dist/web/assets/SearchableSelect-ih69qbcS.js +1 -0
- package/dist/web/assets/SettingsPage-C6ouU0sR.css +1 -0
- package/dist/web/assets/SettingsPage-oLE8mNs5.js +1 -0
- package/dist/web/assets/_plugin-vue_export-helper-BDNMzG2s.js +1 -0
- package/dist/web/assets/console-DE40hXGC.js +1 -0
- package/dist/web/assets/fuli-logo-Bu9WBuQe.js +1 -0
- package/dist/web/assets/fuli-logo-ER1wQ8Kk.png +0 -0
- package/dist/web/assets/i18n-CDxBs1sz.js +5 -0
- package/dist/web/assets/identity-BCxb1mcy.js +1 -0
- package/dist/web/assets/index-BzhNfzU_.js +2 -0
- package/dist/web/assets/index-CCOGfZzE.css +1 -0
- package/dist/web/assets/model-CCMdt10Q.js +1 -0
- package/dist/web/assets/paths-DwHeiGMT.js +1 -0
- package/dist/web/assets/useMinimumLoadingDisplay-BpCyBeko.css +1 -0
- package/dist/web/assets/useMinimumLoadingDisplay-HdI7XAmu.js +1 -0
- package/dist/web/assets/vue-router-Drfl1F8i.js +1 -0
- package/dist/web/index.html +9 -6
- package/docs/external-knowledge-architecture.md +279 -0
- package/examples/external-knowledge/markdown-folder.mjs +235 -0
- package/graph-provider/fuli_graph/app.py +57 -1
- package/graph-provider/fuli_graph/graph_models.py +3 -0
- package/graph-provider/fuli_graph/graph_query.py +62 -16
- package/graph-provider/fuli_graph/knowledge_review.py +657 -0
- package/graph-provider/fuli_graph/knowledge_review_models.py +133 -0
- package/graph-provider/fuli_graph/knowledge_search.py +51 -4
- package/graph-provider/fuli_graph/models.py +19 -0
- package/graph-provider/fuli_graph/runtime.py +15 -0
- package/graph-provider/fuli_graph/store_knowledge.py +2 -1
- package/graph-provider/pyproject.toml +1 -1
- package/npm-shrinkwrap.json +5 -407
- package/package.json +7 -5
- package/skills/capturing-session-knowledge/SKILL.md +24 -4
- package/skills/flreview/SKILL.md +100 -0
- package/skills/flreview/agents/openai.yaml +6 -0
- package/src/agent-tools/graph-definitions.js +81 -6
- package/src/agent-tools/graph-handlers.js +12 -0
- package/src/cli/command-registry.js +3 -3
- package/src/cli/local-runtime-command.js +51 -28
- package/src/cli/local-runtime-options.js +14 -8
- package/src/cli/setup-agent-selection.js +12 -12
- package/src/cli/setup-command.js +41 -18
- package/src/cli/shell-argument.js +10 -0
- package/src/cli/uninstall-command.js +17 -15
- package/src/cli/update-command.js +38 -30
- package/src/external-knowledge/catalog.js +61 -0
- package/src/external-knowledge/conflict-policy.js +58 -0
- package/src/external-knowledge/connected-search.js +166 -0
- package/src/external-knowledge/connectors/custom.js +133 -0
- package/src/external-knowledge/connectors/feishu.js +461 -0
- package/src/external-knowledge/connectors/mcp.js +438 -0
- package/src/external-knowledge/connectors/notion.js +307 -0
- package/src/external-knowledge/connectors/retrieval-api.js +222 -0
- package/src/external-knowledge/document-mapping.js +151 -0
- package/src/external-knowledge/graph-projection.js +17 -0
- package/src/external-knowledge/index.js +8 -0
- package/src/external-knowledge/registry.js +91 -0
- package/src/external-knowledge/runtime.js +68 -0
- package/src/external-knowledge/safe-diagnostic.js +14 -0
- package/src/external-knowledge/service.js +811 -0
- package/src/graphiti/agent-knowledge-workflows.js +7 -2
- package/src/graphiti/federated-application.js +68 -42
- package/src/graphiti/knowledge-item-role.js +21 -0
- package/src/graphiti/knowledge-review.js +43 -0
- package/src/graphiti/project-profile-mapping.js +32 -0
- package/src/graphiti/provider-client.js +22 -1
- package/src/graphiti/source-marker.js +54 -3
- package/src/graphiti/task-knowledge-recall.js +250 -0
- package/src/http/api-router.js +23 -108
- package/src/http/external-knowledge-api-router.js +104 -0
- package/src/http/graph-api-router.js +12 -1
- package/src/http/request-policy.js +1 -1
- package/src/local-runtime/lifecycle.js +26 -15
- package/src/mcp/create-mcp-server.js +4 -1
- package/src/mcp/instructions.js +7 -7
- package/src/mcp/tool-annotations.js +6 -0
- package/src/mcp/tool-result.js +1 -0
- package/src/server/application-lifecycle.js +2 -11
- package/src/server/blocked-ports.js +11 -0
- package/src/server.js +36 -17
- package/src/setup/agent-installation-status.js +2 -1
- package/src/setup/agents.js +2 -1
- package/src/setup/claude-code-config.js +2 -1
- package/src/setup/codex-bootstrap.js +12 -7
- package/src/setup/container-runtime.js +25 -21
- package/src/setup/graph-runtime.js +148 -56
- package/src/setup/node-runtime.js +3 -3
- package/src/setup/options.js +2 -4
- package/src/setup/paths.js +18 -3
- package/src/setup/review-skill-adapters.js +49 -0
- package/src/setup/setup.js +26 -2
- package/src/setup/uninstall.js +4 -2
- package/src/system/resource-monitor.js +317 -0
- package/src/system/runtime-settings.js +131 -0
- package/src/system/system-service.js +119 -0
- package/README.en.md +0 -336
- package/dist/web/assets/ConnectionsPage-CCKWm-6p.js +0 -1
- package/dist/web/assets/KnowledgeInspector-BZkB2wJn.js +0 -1
- package/dist/web/assets/KnowledgeInspector-CrGYxEob.css +0 -1
- package/dist/web/assets/KnowledgeOrganizerPage-CZAF_OlN.css +0 -1
- package/dist/web/assets/KnowledgeOrganizerPage-DlvcLwlL.js +0 -1
- package/dist/web/assets/KnowledgePage-CNQXd15y.js +0 -1
- package/dist/web/assets/KnowledgeWorkspace-CXPE4GCD.js +0 -4
- package/dist/web/assets/OverviewPage-ul7g7HXh.js +0 -1
- package/dist/web/assets/PersonalProfilePage-CC40Pw2L.js +0 -1
- package/dist/web/assets/PersonalProjectsPage-CPIEcShD.js +0 -1
- package/dist/web/assets/PublicProjectsPage-C700sR7z.js +0 -1
- package/dist/web/assets/ReviewPage-7MDDUDgA.js +0 -1
- package/dist/web/assets/console-B_Ena2DS.js +0 -5
- package/dist/web/assets/fuli-logo-DGuyqchQ.png +0 -0
- package/dist/web/assets/identity-CjBwYSMX.js +0 -1
- package/dist/web/assets/index-CpLDx3of.css +0 -1
- package/dist/web/assets/index-DAzeFJSc.js +0 -2
- package/dist/web/assets/model-C-5RVIJ2.js +0 -1
- package/dist/web/assets/paths-BkULqmGI.js +0 -1
- package/dist/web/assets/vue-router-DnD3hUm7.js +0 -1
- package/src/agent/candidate-read-service.js +0 -53
- package/src/agent/context-pack-service.js +0 -83
- package/src/agent/public-read-policy.js +0 -39
- package/src/agent/public-read-service.js +0 -69
- package/src/agent/read-projection.js +0 -107
- package/src/agent/search-service.js +0 -61
- package/src/agent/space-boundary.js +0 -33
- package/src/app/bootstrap.js +0 -8
- package/src/app/create-application.js +0 -143
- package/src/app/state-service.js +0 -38
- package/src/candidates.js +0 -78
- package/src/classifier.js +0 -63
- package/src/cli/command-arguments.js +0 -14
- package/src/context-pack.js +0 -206
- package/src/extractor.js +0 -77
- package/src/fact-history.js +0 -39
- package/src/facts/fact-service.js +0 -89
- package/src/http/bounded-json-array.js +0 -19
- package/src/http/lens-route.js +0 -50
- package/src/ingestion.js +0 -161
- package/src/lens/lens-correction-service.js +0 -81
- package/src/lens/lens-fact-writer.js +0 -85
- package/src/lens/lens-input.js +0 -62
- package/src/lens/lens-query-projection.js +0 -87
- package/src/lens/lens-query-ranking.js +0 -62
- package/src/lens/lens-query.js +0 -143
- package/src/lens/lens-resource-projection.js +0 -93
- package/src/lens/lens-resource-selection.js +0 -45
- package/src/lens/lens-resource-service.js +0 -103
- package/src/lens/lens-search-query.js +0 -122
- package/src/lens/lens-service.js +0 -183
- package/src/models.js +0 -44
- package/src/observer.js +0 -83
- package/src/project-rules.js +0 -33
- package/src/publication/outbox-service.js +0 -46
- package/src/publication/publication-envelope-schema.js +0 -75
- package/src/publication/publication-envelope.js +0 -37
- package/src/publication/publication-policy.js +0 -82
- package/src/publication/publication-service.js +0 -48
- package/src/router.js +0 -58
- package/src/runtime-options.js +0 -138
- package/src/security/episode-visibility.js +0 -14
- package/src/security/fact-visibility.js +0 -15
- package/src/security/source-metadata-policy.js +0 -8
- package/src/storage/episode-evidence-preview.js +0 -100
- package/src/storage/fact-search-order.js +0 -18
- package/src/storage/file/episode-evidence.js +0 -37
- package/src/storage/file/episode-index.js +0 -59
- package/src/storage/file/fact-search.js +0 -60
- package/src/storage/file-store.js +0 -437
- package/src/storage/migrate.js +0 -128
- package/src/storage/migrations/001-initial.sql +0 -83
- package/src/storage/migrations/002-storage-integrity.sql +0 -113
- package/src/storage/record-validation.js +0 -46
- package/src/storage/snapshot-defaults.js +0 -54
- package/src/storage/sqlite/candidates-repository.js +0 -84
- package/src/storage/sqlite/episode-evidence-repository.js +0 -154
- package/src/storage/sqlite/episode-privacy-sql.js +0 -33
- package/src/storage/sqlite/episodes-repository.js +0 -52
- package/src/storage/sqlite/fact-search-repository.js +0 -162
- package/src/storage/sqlite/facts-repository.js +0 -146
- package/src/storage/sqlite/imports-repository.js +0 -39
- package/src/storage/sqlite/mapper.js +0 -84
- package/src/storage/sqlite/open-database.js +0 -15
- package/src/storage/sqlite/outbox-repository.js +0 -103
- package/src/storage/sqlite/snapshot-repository.js +0 -69
- package/src/storage/sqlite/spaces-repository.js +0 -52
- package/src/storage/sqlite/subscriptions-repository.js +0 -54
- package/src/storage/sqlite-store.js +0 -159
- package/src/storage/stable-json.js +0 -24
- package/src/storage/store-port.js +0 -20
- package/src/store.js +0 -2
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { ExternalKnowledgeRegistry } from './registry.js';
|
|
2
|
+
export { ExternalKnowledgeService } from './service.js';
|
|
3
|
+
export { KnowledgeConflictPolicyStore } from './conflict-policy.js';
|
|
4
|
+
export { ConnectedKnowledgeSearch } from './connected-search.js';
|
|
5
|
+
export {
|
|
6
|
+
attachExternalKnowledgeRuntime,
|
|
7
|
+
openExternalKnowledgeRuntime
|
|
8
|
+
} from './runtime.js';
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { readJsonFile, writeJsonFileAtomic } from '../storage/json-file.js';
|
|
2
|
+
|
|
3
|
+
const CURRENT_VERSION = 2;
|
|
4
|
+
const EMPTY_REGISTRY = Object.freeze({ version: CURRENT_VERSION, bindings: [] });
|
|
5
|
+
|
|
6
|
+
export class ExternalKnowledgeRegistry {
|
|
7
|
+
constructor(filePath) {
|
|
8
|
+
if (typeof filePath !== 'string' || !filePath.trim()) {
|
|
9
|
+
throw new TypeError('External knowledge registry path is required');
|
|
10
|
+
}
|
|
11
|
+
this.filePath = filePath;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
list() {
|
|
15
|
+
return clone(this.#read().bindings);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
get(id) {
|
|
19
|
+
const binding = this.#read().bindings.find((item) => item.id === id);
|
|
20
|
+
return binding ? clone(binding) : null;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
put(binding) {
|
|
24
|
+
const document = this.#read();
|
|
25
|
+
const index = document.bindings.findIndex((item) => item.id === binding.id);
|
|
26
|
+
if (index === -1) document.bindings.push(clone(binding));
|
|
27
|
+
else document.bindings[index] = clone(binding);
|
|
28
|
+
writeJsonFileAtomic(this.filePath, document);
|
|
29
|
+
return clone(binding);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
delete(id) {
|
|
33
|
+
const document = this.#read();
|
|
34
|
+
const next = document.bindings.filter((item) => item.id !== id);
|
|
35
|
+
if (next.length === document.bindings.length) return false;
|
|
36
|
+
writeJsonFileAtomic(this.filePath, { ...document, bindings: next });
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
#read() {
|
|
41
|
+
const document = readJsonFile(this.filePath, EMPTY_REGISTRY);
|
|
42
|
+
if (!Array.isArray(document?.bindings)) {
|
|
43
|
+
throw new TypeError('Unsupported external knowledge registry format');
|
|
44
|
+
}
|
|
45
|
+
if (document.version === CURRENT_VERSION) return clone(document);
|
|
46
|
+
if (document.version === 1) return migrateVersionOne(document);
|
|
47
|
+
throw new TypeError('Unsupported external knowledge registry format');
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function migrateVersionOne(document) {
|
|
52
|
+
return {
|
|
53
|
+
version: CURRENT_VERSION,
|
|
54
|
+
bindings: document.bindings.map((binding) => {
|
|
55
|
+
if (!binding?.target || typeof binding.target !== 'object') {
|
|
56
|
+
throw new TypeError('Legacy external knowledge binding target is invalid');
|
|
57
|
+
}
|
|
58
|
+
const {
|
|
59
|
+
target,
|
|
60
|
+
mode = 'hybrid',
|
|
61
|
+
sync = emptySyncState(),
|
|
62
|
+
...source
|
|
63
|
+
} = binding;
|
|
64
|
+
return {
|
|
65
|
+
...source,
|
|
66
|
+
targets: [{
|
|
67
|
+
id: binding.id,
|
|
68
|
+
personalSpaceId: target.personalSpaceId,
|
|
69
|
+
personalProjectId: target.personalProjectId,
|
|
70
|
+
mode,
|
|
71
|
+
status: binding.status ?? 'ready',
|
|
72
|
+
sync
|
|
73
|
+
}]
|
|
74
|
+
};
|
|
75
|
+
})
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function emptySyncState() {
|
|
80
|
+
return {
|
|
81
|
+
cursor: null,
|
|
82
|
+
lastSyncedAt: null,
|
|
83
|
+
error: null,
|
|
84
|
+
skippedCredentials: 0,
|
|
85
|
+
items: {}
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function clone(value) {
|
|
90
|
+
return structuredClone(value);
|
|
91
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { mkdirSync } from 'node:fs';
|
|
2
|
+
|
|
3
|
+
import { createConnectorCatalog } from './catalog.js';
|
|
4
|
+
import { ConnectedKnowledgeSearch } from './connected-search.js';
|
|
5
|
+
import { KnowledgeConflictPolicyStore } from './conflict-policy.js';
|
|
6
|
+
import { ExternalKnowledgeRegistry } from './registry.js';
|
|
7
|
+
import { ExternalKnowledgeService } from './service.js';
|
|
8
|
+
|
|
9
|
+
export function openExternalKnowledgeRuntime({
|
|
10
|
+
app,
|
|
11
|
+
paths,
|
|
12
|
+
env = process.env,
|
|
13
|
+
fetchImpl = globalThis.fetch,
|
|
14
|
+
mcpOpenSession,
|
|
15
|
+
sleep
|
|
16
|
+
}) {
|
|
17
|
+
assertPaths(paths);
|
|
18
|
+
mkdirSync(paths.externalKnowledgeConnectorDir, { recursive: true });
|
|
19
|
+
const connectors = createConnectorCatalog({
|
|
20
|
+
customConnectorDirectory: paths.externalKnowledgeConnectorDir,
|
|
21
|
+
fetchImpl,
|
|
22
|
+
mcpOpenSession,
|
|
23
|
+
sleep
|
|
24
|
+
});
|
|
25
|
+
const externalKnowledge = new ExternalKnowledgeService({
|
|
26
|
+
app,
|
|
27
|
+
registry: new ExternalKnowledgeRegistry(paths.externalKnowledgeRegistryPath),
|
|
28
|
+
connectors,
|
|
29
|
+
env
|
|
30
|
+
});
|
|
31
|
+
const connectedKnowledge = new ConnectedKnowledgeSearch({
|
|
32
|
+
app,
|
|
33
|
+
externalKnowledge,
|
|
34
|
+
policies: new KnowledgeConflictPolicyStore(
|
|
35
|
+
paths.externalKnowledgeConflictPolicyPath
|
|
36
|
+
)
|
|
37
|
+
});
|
|
38
|
+
return { externalKnowledge, connectedKnowledge };
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export function attachExternalKnowledgeRuntime(app, options) {
|
|
42
|
+
const runtime = openExternalKnowledgeRuntime({ app, ...options });
|
|
43
|
+
Object.defineProperties(app, {
|
|
44
|
+
externalKnowledge: {
|
|
45
|
+
configurable: true,
|
|
46
|
+
enumerable: false,
|
|
47
|
+
value: runtime.externalKnowledge
|
|
48
|
+
},
|
|
49
|
+
connectedKnowledge: {
|
|
50
|
+
configurable: true,
|
|
51
|
+
enumerable: false,
|
|
52
|
+
value: runtime.connectedKnowledge
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
return app;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function assertPaths(paths) {
|
|
59
|
+
for (const name of [
|
|
60
|
+
'externalKnowledgeRegistryPath',
|
|
61
|
+
'externalKnowledgeConflictPolicyPath',
|
|
62
|
+
'externalKnowledgeConnectorDir'
|
|
63
|
+
]) {
|
|
64
|
+
if (typeof paths?.[name] !== 'string' || !paths[name]) {
|
|
65
|
+
throw new TypeError(`External knowledge path is required: ${name}`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { detectSensitiveContent } from '../security/sensitive-content.js';
|
|
2
|
+
|
|
3
|
+
const PROTECTED_DIAGNOSTIC = 'External source failed; protected diagnostic omitted.';
|
|
4
|
+
|
|
5
|
+
export function safeExternalSourceDiagnostic(reason) {
|
|
6
|
+
const message = reason instanceof Error ? reason.message : String(reason ?? '');
|
|
7
|
+
if (detectSensitiveContent(message).restricted) return PROTECTED_DIAGNOSTIC;
|
|
8
|
+
const normalized = message
|
|
9
|
+
.replace(/[\p{Cc}\p{Cf}\p{Cs}]+/gu, ' ')
|
|
10
|
+
.replace(/\s+/gu, ' ')
|
|
11
|
+
.trim()
|
|
12
|
+
.slice(0, 1_000);
|
|
13
|
+
return normalized || 'External source failed without a diagnostic.';
|
|
14
|
+
}
|