fuli-context 0.4.0 → 0.7.2

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 (207) hide show
  1. package/README.en.md +5 -0
  2. package/README.md +411 -173
  3. package/README.zh-CN.md +448 -0
  4. package/compose.graphiti.yml +6 -6
  5. package/dist/web/assets/AboutPage-DXh7Fwxt.css +1 -0
  6. package/dist/web/assets/AboutPage-DfnZo7Lo.js +1 -0
  7. package/dist/web/assets/ConnectionsPage-BloaSKmt.js +1 -0
  8. package/dist/web/assets/ConnectionsPage-CBHAdZXT.css +1 -0
  9. package/dist/web/assets/KnowledgeInspector-Bjhdu2mf.css +1 -0
  10. package/dist/web/assets/KnowledgeInspector-QvNpv0_k.js +1 -0
  11. package/dist/web/assets/KnowledgeOrganizerPage-Cx1w1jb2.css +1 -0
  12. package/dist/web/assets/KnowledgeOrganizerPage-DKq1jVD5.js +1 -0
  13. package/dist/web/assets/KnowledgePage-BWL0jT01.js +1 -0
  14. package/dist/web/assets/KnowledgeWorkspace-Czq6aZ7b.js +4 -0
  15. package/dist/web/assets/OverviewPage-5sJoO1Gh.js +1 -0
  16. package/dist/web/assets/{PersonalProfilePage-S8ZcG2LU.css → PersonalProfilePage-CdmEzyvZ.css} +1 -1
  17. package/dist/web/assets/PersonalProfilePage-tVChM9ik.js +1 -0
  18. package/dist/web/assets/PersonalProjectsPage-BPFrup4V.js +1 -0
  19. package/dist/web/assets/PublicProjectsPage-BPJSeREN.js +1 -0
  20. package/dist/web/assets/ReviewPage-B7EN817i.js +1 -0
  21. package/dist/web/assets/SearchableSelect-ClLN0rIb.js +1 -0
  22. package/dist/web/assets/SettingsPage-C6ouU0sR.css +1 -0
  23. package/dist/web/assets/SettingsPage-Chd_B3eH.js +1 -0
  24. package/dist/web/assets/_plugin-vue_export-helper-BDNMzG2s.js +1 -0
  25. package/dist/web/assets/console-CbDsKrsO.js +1 -0
  26. package/dist/web/assets/fuli-logo-Bu9WBuQe.js +1 -0
  27. package/dist/web/assets/fuli-logo-ER1wQ8Kk.png +0 -0
  28. package/dist/web/assets/i18n-BQcns1PH.js +5 -0
  29. package/dist/web/assets/identity-B8K4VYg6.js +1 -0
  30. package/dist/web/assets/index-CB8Xmsc2.js +2 -0
  31. package/dist/web/assets/index-CZeuPh-U.css +1 -0
  32. package/dist/web/assets/model-eF52GgPF.js +1 -0
  33. package/dist/web/assets/paths-hwz-Ac1g.js +1 -0
  34. package/dist/web/assets/useMinimumLoadingDisplay-BpCyBeko.css +1 -0
  35. package/dist/web/assets/useMinimumLoadingDisplay-wCgGDmHg.js +1 -0
  36. package/dist/web/assets/vue-router-BsEp_XwI.js +1 -0
  37. package/dist/web/index.html +9 -6
  38. package/docs/external-knowledge-architecture.md +279 -0
  39. package/examples/external-knowledge/markdown-folder.mjs +235 -0
  40. package/graph-provider/fuli_graph/app.py +57 -1
  41. package/graph-provider/fuli_graph/graph_models.py +3 -0
  42. package/graph-provider/fuli_graph/graph_query.py +62 -16
  43. package/graph-provider/fuli_graph/knowledge_review.py +612 -0
  44. package/graph-provider/fuli_graph/knowledge_review_models.py +127 -0
  45. package/graph-provider/fuli_graph/knowledge_search.py +51 -4
  46. package/graph-provider/fuli_graph/models.py +19 -0
  47. package/graph-provider/fuli_graph/runtime.py +15 -0
  48. package/graph-provider/fuli_graph/store_knowledge.py +2 -1
  49. package/graph-provider/pyproject.toml +1 -1
  50. package/npm-shrinkwrap.json +5 -407
  51. package/package.json +7 -4
  52. package/skills/capturing-session-knowledge/SKILL.md +24 -4
  53. package/skills/flreview/SKILL.md +73 -0
  54. package/skills/flreview/agents/openai.yaml +6 -0
  55. package/src/agent-tools/graph-definitions.js +79 -4
  56. package/src/agent-tools/graph-handlers.js +12 -0
  57. package/src/cli/command-registry.js +3 -3
  58. package/src/cli/local-runtime-command.js +60 -23
  59. package/src/cli/local-runtime-options.js +16 -6
  60. package/src/cli/setup-agent-selection.js +12 -12
  61. package/src/cli/setup-command.js +41 -18
  62. package/src/cli/shell-argument.js +10 -0
  63. package/src/cli/uninstall-command.js +17 -15
  64. package/src/cli/update-command.js +38 -30
  65. package/src/external-knowledge/catalog.js +61 -0
  66. package/src/external-knowledge/conflict-policy.js +58 -0
  67. package/src/external-knowledge/connected-search.js +166 -0
  68. package/src/external-knowledge/connectors/custom.js +133 -0
  69. package/src/external-knowledge/connectors/feishu.js +461 -0
  70. package/src/external-knowledge/connectors/mcp.js +438 -0
  71. package/src/external-knowledge/connectors/notion.js +307 -0
  72. package/src/external-knowledge/connectors/retrieval-api.js +222 -0
  73. package/src/external-knowledge/document-mapping.js +151 -0
  74. package/src/external-knowledge/graph-projection.js +17 -0
  75. package/src/external-knowledge/index.js +8 -0
  76. package/src/external-knowledge/registry.js +91 -0
  77. package/src/external-knowledge/runtime.js +68 -0
  78. package/src/external-knowledge/safe-diagnostic.js +14 -0
  79. package/src/external-knowledge/service.js +811 -0
  80. package/src/graphiti/agent-knowledge-workflows.js +7 -2
  81. package/src/graphiti/federated-application.js +66 -41
  82. package/src/graphiti/knowledge-item-role.js +21 -0
  83. package/src/graphiti/knowledge-review.js +43 -0
  84. package/src/graphiti/project-profile-mapping.js +32 -0
  85. package/src/graphiti/provider-client.js +22 -1
  86. package/src/graphiti/source-marker.js +54 -3
  87. package/src/graphiti/task-knowledge-recall.js +250 -0
  88. package/src/http/api-router.js +23 -108
  89. package/src/http/external-knowledge-api-router.js +104 -0
  90. package/src/http/graph-api-router.js +12 -1
  91. package/src/http/request-policy.js +38 -3
  92. package/src/local-runtime/lifecycle.js +37 -16
  93. package/src/mcp/create-mcp-server.js +1 -0
  94. package/src/mcp/instructions.js +7 -7
  95. package/src/mcp/tool-annotations.js +6 -0
  96. package/src/mcp/tool-result.js +1 -0
  97. package/src/server/application-lifecycle.js +2 -11
  98. package/src/server/blocked-ports.js +11 -0
  99. package/src/server/lan-access.js +52 -0
  100. package/src/server.js +103 -25
  101. package/src/setup/agent-installation-status.js +2 -1
  102. package/src/setup/agents.js +2 -1
  103. package/src/setup/claude-code-config.js +2 -1
  104. package/src/setup/codex-bootstrap.js +12 -7
  105. package/src/setup/container-runtime.js +25 -21
  106. package/src/setup/graph-runtime.js +219 -58
  107. package/src/setup/node-runtime.js +3 -3
  108. package/src/setup/options.js +2 -4
  109. package/src/setup/paths.js +18 -3
  110. package/src/setup/review-skill-adapters.js +49 -0
  111. package/src/setup/setup.js +26 -2
  112. package/src/setup/uninstall.js +4 -2
  113. package/src/system/resource-monitor.js +317 -0
  114. package/src/system/runtime-settings.js +131 -0
  115. package/src/system/system-service.js +119 -0
  116. package/dist/web/assets/ConnectionsPage-CCKWm-6p.js +0 -1
  117. package/dist/web/assets/KnowledgeInspector-BZkB2wJn.js +0 -1
  118. package/dist/web/assets/KnowledgeInspector-CrGYxEob.css +0 -1
  119. package/dist/web/assets/KnowledgeOrganizerPage-CJCNI2Wd.css +0 -1
  120. package/dist/web/assets/KnowledgeOrganizerPage-PXH-TlGt.js +0 -1
  121. package/dist/web/assets/KnowledgePage-CNQXd15y.js +0 -1
  122. package/dist/web/assets/KnowledgeWorkspace-CXPE4GCD.js +0 -4
  123. package/dist/web/assets/OverviewPage-ul7g7HXh.js +0 -1
  124. package/dist/web/assets/PersonalProfilePage-CC40Pw2L.js +0 -1
  125. package/dist/web/assets/PersonalProjectsPage-CPIEcShD.js +0 -1
  126. package/dist/web/assets/PublicProjectsPage-C700sR7z.js +0 -1
  127. package/dist/web/assets/ReviewPage-7MDDUDgA.js +0 -1
  128. package/dist/web/assets/console-B_Ena2DS.js +0 -5
  129. package/dist/web/assets/fuli-logo-DGuyqchQ.png +0 -0
  130. package/dist/web/assets/identity-CjBwYSMX.js +0 -1
  131. package/dist/web/assets/index-BQRkOwPx.js +0 -2
  132. package/dist/web/assets/index-CpLDx3of.css +0 -1
  133. package/dist/web/assets/model-C-5RVIJ2.js +0 -1
  134. package/dist/web/assets/paths-BkULqmGI.js +0 -1
  135. package/dist/web/assets/vue-router-DnD3hUm7.js +0 -1
  136. package/src/agent/candidate-read-service.js +0 -53
  137. package/src/agent/context-pack-service.js +0 -83
  138. package/src/agent/public-read-policy.js +0 -39
  139. package/src/agent/public-read-service.js +0 -69
  140. package/src/agent/read-projection.js +0 -107
  141. package/src/agent/search-service.js +0 -61
  142. package/src/agent/space-boundary.js +0 -33
  143. package/src/app/bootstrap.js +0 -8
  144. package/src/app/create-application.js +0 -143
  145. package/src/app/state-service.js +0 -38
  146. package/src/candidates.js +0 -78
  147. package/src/classifier.js +0 -63
  148. package/src/cli/command-arguments.js +0 -14
  149. package/src/context-pack.js +0 -206
  150. package/src/extractor.js +0 -77
  151. package/src/fact-history.js +0 -39
  152. package/src/facts/fact-service.js +0 -89
  153. package/src/http/bounded-json-array.js +0 -19
  154. package/src/http/lens-route.js +0 -50
  155. package/src/ingestion.js +0 -161
  156. package/src/lens/lens-correction-service.js +0 -81
  157. package/src/lens/lens-fact-writer.js +0 -85
  158. package/src/lens/lens-input.js +0 -62
  159. package/src/lens/lens-query-projection.js +0 -87
  160. package/src/lens/lens-query-ranking.js +0 -62
  161. package/src/lens/lens-query.js +0 -143
  162. package/src/lens/lens-resource-projection.js +0 -93
  163. package/src/lens/lens-resource-selection.js +0 -45
  164. package/src/lens/lens-resource-service.js +0 -103
  165. package/src/lens/lens-search-query.js +0 -122
  166. package/src/lens/lens-service.js +0 -183
  167. package/src/models.js +0 -44
  168. package/src/observer.js +0 -83
  169. package/src/project-rules.js +0 -33
  170. package/src/publication/outbox-service.js +0 -46
  171. package/src/publication/publication-envelope-schema.js +0 -75
  172. package/src/publication/publication-envelope.js +0 -37
  173. package/src/publication/publication-policy.js +0 -82
  174. package/src/publication/publication-service.js +0 -48
  175. package/src/router.js +0 -58
  176. package/src/runtime-options.js +0 -138
  177. package/src/security/episode-visibility.js +0 -14
  178. package/src/security/fact-visibility.js +0 -15
  179. package/src/security/source-metadata-policy.js +0 -8
  180. package/src/storage/episode-evidence-preview.js +0 -100
  181. package/src/storage/fact-search-order.js +0 -18
  182. package/src/storage/file/episode-evidence.js +0 -37
  183. package/src/storage/file/episode-index.js +0 -59
  184. package/src/storage/file/fact-search.js +0 -60
  185. package/src/storage/file-store.js +0 -437
  186. package/src/storage/migrate.js +0 -128
  187. package/src/storage/migrations/001-initial.sql +0 -83
  188. package/src/storage/migrations/002-storage-integrity.sql +0 -113
  189. package/src/storage/record-validation.js +0 -46
  190. package/src/storage/snapshot-defaults.js +0 -54
  191. package/src/storage/sqlite/candidates-repository.js +0 -84
  192. package/src/storage/sqlite/episode-evidence-repository.js +0 -154
  193. package/src/storage/sqlite/episode-privacy-sql.js +0 -33
  194. package/src/storage/sqlite/episodes-repository.js +0 -52
  195. package/src/storage/sqlite/fact-search-repository.js +0 -162
  196. package/src/storage/sqlite/facts-repository.js +0 -146
  197. package/src/storage/sqlite/imports-repository.js +0 -39
  198. package/src/storage/sqlite/mapper.js +0 -84
  199. package/src/storage/sqlite/open-database.js +0 -15
  200. package/src/storage/sqlite/outbox-repository.js +0 -103
  201. package/src/storage/sqlite/snapshot-repository.js +0 -69
  202. package/src/storage/sqlite/spaces-repository.js +0 -52
  203. package/src/storage/sqlite/subscriptions-repository.js +0 -54
  204. package/src/storage/sqlite-store.js +0 -159
  205. package/src/storage/stable-json.js +0 -24
  206. package/src/storage/store-port.js +0 -20
  207. 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
+ }