fuli-context 0.5.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.
- package/README.en.md +2 -333
- 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-DfnZo7Lo.js +1 -0
- package/dist/web/assets/ConnectionsPage-BloaSKmt.js +1 -0
- package/dist/web/assets/ConnectionsPage-CBHAdZXT.css +1 -0
- package/dist/web/assets/KnowledgeInspector-Bjhdu2mf.css +1 -0
- package/dist/web/assets/KnowledgeInspector-QvNpv0_k.js +1 -0
- package/dist/web/assets/KnowledgeOrganizerPage-Cx1w1jb2.css +1 -0
- package/dist/web/assets/KnowledgeOrganizerPage-DKq1jVD5.js +1 -0
- package/dist/web/assets/KnowledgePage-BWL0jT01.js +1 -0
- package/dist/web/assets/KnowledgeWorkspace-Czq6aZ7b.js +4 -0
- package/dist/web/assets/OverviewPage-5sJoO1Gh.js +1 -0
- package/dist/web/assets/{PersonalProfilePage-S8ZcG2LU.css → PersonalProfilePage-CdmEzyvZ.css} +1 -1
- package/dist/web/assets/PersonalProfilePage-tVChM9ik.js +1 -0
- package/dist/web/assets/PersonalProjectsPage-BPFrup4V.js +1 -0
- package/dist/web/assets/PublicProjectsPage-BPJSeREN.js +1 -0
- package/dist/web/assets/ReviewPage-B7EN817i.js +1 -0
- package/dist/web/assets/SearchableSelect-ClLN0rIb.js +1 -0
- package/dist/web/assets/SettingsPage-C6ouU0sR.css +1 -0
- package/dist/web/assets/SettingsPage-Chd_B3eH.js +1 -0
- package/dist/web/assets/_plugin-vue_export-helper-BDNMzG2s.js +1 -0
- package/dist/web/assets/console-CbDsKrsO.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-BQcns1PH.js +5 -0
- package/dist/web/assets/identity-B8K4VYg6.js +1 -0
- package/dist/web/assets/index-CB8Xmsc2.js +2 -0
- package/dist/web/assets/index-CZeuPh-U.css +1 -0
- package/dist/web/assets/model-eF52GgPF.js +1 -0
- package/dist/web/assets/paths-hwz-Ac1g.js +1 -0
- package/dist/web/assets/useMinimumLoadingDisplay-BpCyBeko.css +1 -0
- package/dist/web/assets/useMinimumLoadingDisplay-wCgGDmHg.js +1 -0
- package/dist/web/assets/vue-router-BsEp_XwI.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 +612 -0
- package/graph-provider/fuli_graph/knowledge_review_models.py +127 -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 +73 -0
- package/skills/flreview/agents/openai.yaml +6 -0
- package/src/agent-tools/graph-definitions.js +79 -4
- 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 +66 -41
- 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 +1 -0
- 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/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
package/README.md
CHANGED
|
@@ -1,198 +1,335 @@
|
|
|
1
|
-
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="https://raw.githubusercontent.com/JevonsCode/fuli/main/web/assets/brand/fuli-logo.png" alt="Fuli logo" width="72" />
|
|
3
|
+
</p>
|
|
2
4
|
|
|
3
|
-
|
|
5
|
+
<h1 align="center">Fuli</h1>
|
|
4
6
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
7
|
+
<p align="center">
|
|
8
|
+
English · <a href="README.zh-CN.md">简体中文</a>
|
|
9
|
+
</p>
|
|
8
10
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
+
<p align="center">
|
|
12
|
+
<a href="https://www.npmjs.com/package/fuli-context"><img src="https://img.shields.io/npm/v/fuli-context?style=flat&logo=npm&label=fuli-context" alt="npm version" /></a>
|
|
13
|
+
<a href="https://www.npmjs.com/package/fuli-context"><img src="https://img.shields.io/npm/dm/fuli-context?style=flat" alt="npm downloads" /></a>
|
|
14
|
+
<a href="LICENSE"><img src="https://img.shields.io/npm/l/fuli-context?style=flat" alt="license" /></a>
|
|
15
|
+
</p>
|
|
11
16
|
|
|
12
|
-
|
|
13
|
-
|
|
17
|
+
Fuli is a local-first collaboration context graph for AI agents. It turns reusable knowledge,
|
|
18
|
+
experience, decision rationale, and preferences from human–AI project work into assets with
|
|
19
|
+
provenance, scope, authority, and temporal history. Codex, Claude Code, and Cursor can then reuse
|
|
20
|
+
those assets in later tasks instead of relearning the same context.
|
|
14
21
|
|
|
15
|
-
|
|
22
|
+
Fuli is not a transcript archive, and it is not an attempt to build a personality model that
|
|
23
|
+
replaces human judgment. AI retrieves, summarizes, warns, and executes; humans retain final
|
|
24
|
+
authority.
|
|
16
25
|
|
|
17
|
-
|
|
26
|
+
## npm packages
|
|
18
27
|
|
|
19
|
-
|
|
28
|
+
| Package | Status | Intended use |
|
|
29
|
+
| --- | --- | --- |
|
|
30
|
+
| [`fuli-context`](https://www.npmjs.com/package/fuli-context) | Available | Personal edition; personal knowledge, the graph database, and the management UI all run locally |
|
|
31
|
+
| Fuli Server npm package | In development | A separate server for team-shared deployments; not yet published |
|
|
20
32
|
|
|
21
|
-
|
|
33
|
+
`fuli-context` is currently the only available npm package. The shared layer never contains
|
|
34
|
+
personal taste, personality, or judgment preferences.
|
|
22
35
|
|
|
23
|
-
|
|
24
|
-
和权威边界内被再次使用,并减少重复解释、修正和返工。
|
|
36
|
+
## Philosophy
|
|
25
37
|
|
|
26
|
-
###
|
|
38
|
+
### 1. Measure reuse value, not knowledge volume
|
|
27
39
|
|
|
28
|
-
|
|
40
|
+
Fuli is built around one question:
|
|
29
41
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
- 决策轨迹:候选方案、人的选择、理由和后续验证;
|
|
33
|
-
- 判断辅助:偏好、原则、品味或个性倾向。
|
|
42
|
+
> Without Fuli, would the agent have to relearn information that is confirmed, still valid, and
|
|
43
|
+
> relevant to the current task?
|
|
34
44
|
|
|
35
|
-
|
|
36
|
-
|
|
45
|
+
Node count, transcript count, and graph size are not success metrics. The product succeeds when a
|
|
46
|
+
past collaboration asset is reused within the correct project, time, provenance, and authority
|
|
47
|
+
boundaries—and reduces repeated explanation, correction, or rework.
|
|
37
48
|
|
|
38
|
-
###
|
|
49
|
+
### 2. Review every task; do not retain every task
|
|
39
50
|
|
|
40
|
-
|
|
41
|
-
相似、重复出现或自己的判断伪造人工确认。公共知识提升和有风险的项目写入必须先预览,再由
|
|
42
|
-
明确的人类选择触发一次性、原子执行。
|
|
51
|
+
A task may produce:
|
|
43
52
|
|
|
44
|
-
|
|
53
|
+
- reusable knowledge such as API conventions, runbooks, release procedures, or constraints;
|
|
54
|
+
- experience explaining why an approach worked or failed;
|
|
55
|
+
- a decision trace with options, a human choice, rationale, and later validation;
|
|
56
|
+
- judgment aids such as preferences, principles, taste, or personality tendencies.
|
|
45
57
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
58
|
+
It may also produce only disposable output, a guess, or a one-off choice. In that case,
|
|
59
|
+
`retain_nothing` is the correct result. Every task should perform a knowledge-value checkpoint, but
|
|
60
|
+
not every task must become stored knowledge.
|
|
49
61
|
|
|
50
|
-
###
|
|
62
|
+
### 3. Human authority outranks agent repetition
|
|
51
63
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
64
|
+
An agent may discover candidates, surface conflicts, recommend promotion, or resolve a deferred
|
|
65
|
+
conflict when explicitly authorized. It may not turn semantic similarity, repetition, or its own
|
|
66
|
+
judgment into human confirmation. Shared-knowledge promotion and sensitive project mutations use a
|
|
67
|
+
preview followed by an explicit, one-time, atomic action.
|
|
55
68
|
|
|
56
|
-
###
|
|
69
|
+
### 4. Assemble context, then retrieve evidence on demand
|
|
57
70
|
|
|
58
|
-
|
|
59
|
-
|
|
71
|
+
Fuli does not inject the complete history at session start. The entry step always loads effective
|
|
72
|
+
personal-global preferences and preferences from one exactly matched project. When the current task
|
|
73
|
+
signals that a stable prior fact, method, URL, decision, release, deployment, or authentication
|
|
74
|
+
runbook may matter, the same step also performs a small bounded recall from that project and its
|
|
75
|
+
authorized knowledge sources. The agent uses focused on-demand search when more evidence is needed.
|
|
76
|
+
Retrieval alone is not usage; a usage event is recorded only when an item materially affects an
|
|
77
|
+
answer, implementation, or decision.
|
|
78
|
+
|
|
79
|
+
### 5. Preserve evolution instead of overwriting history
|
|
80
|
+
|
|
81
|
+
An old approach may have been correct under earlier conditions and later replaced. Fuli preserves
|
|
82
|
+
provenance, confirmation authority, time, rationale, revisions, supersession, and negative evidence
|
|
83
|
+
so an agent can explain both what applies now and why the past was different. Negative feedback may
|
|
84
|
+
lower rank or trigger review, but it never silently erases history.
|
|
85
|
+
|
|
86
|
+
### 6. Put shared knowledge in the parent; keep differences in each child
|
|
87
|
+
|
|
88
|
+
For example, hotel and flight projects can keep their own PRDs, configuration, and domain rules,
|
|
89
|
+
while a parent activity-platform project owns shared local-run, mock, test, and deployment runbooks:
|
|
60
90
|
|
|
61
91
|
```text
|
|
62
|
-
|
|
63
|
-
├──
|
|
64
|
-
└──
|
|
92
|
+
Activity platform (parent: shared runbooks)
|
|
93
|
+
├── Hotel project (child: hotel PRD / configuration / overrides)
|
|
94
|
+
└── Flight project (child: flight PRD / configuration / overrides)
|
|
65
95
|
```
|
|
66
96
|
|
|
67
|
-
|
|
68
|
-
`USES_KNOWLEDGE_FROM`
|
|
69
|
-
|
|
97
|
+
When an agent works in the hotel project, it searches hotel-local knowledge first, then follows
|
|
98
|
+
explicit outgoing `PART_OF` or `USES_KNOWLEDGE_FROM` relationships to authorized sources, up to two
|
|
99
|
+
hops. A child item with the same stable key overrides an inherited item. Generic `RELATED_TO`
|
|
100
|
+
relationships do not expand scope, and project-scoped personal preferences are not inherited.
|
|
70
101
|
|
|
71
|
-
|
|
72
|
-
|
|
102
|
+
Similar items from multiple children create only a common-knowledge candidate. Current clustering
|
|
103
|
+
is a lexical heuristic, not proof of semantic equivalence. A human must select the canonical item,
|
|
104
|
+
duplicates, parent project, and rationale before an atomic promotion can occur.
|
|
73
105
|
|
|
74
|
-
### 7.
|
|
106
|
+
### 7. Local first; no personal model in the shared layer
|
|
75
107
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
108
|
+
The personal graph stays local by default. Fuli stores structured reusable knowledge, not raw
|
|
109
|
+
transcripts, credentials, temporary logs, or command output. The team-shared layer contains only
|
|
110
|
+
confirmed project or domain knowledge with context and provenance—not personal taste, personality,
|
|
111
|
+
or judgment preferences.
|
|
79
112
|
|
|
80
|
-
## Agent
|
|
113
|
+
## Agent interaction sequence
|
|
81
114
|
|
|
82
|
-
|
|
83
|
-
[
|
|
115
|
+
This is the simplified lifecycle for a normal task. The Chinese
|
|
116
|
+
[detailed sequence diagram](acceptance/智能体调用时序图.md) also covers inheritance, usage counting,
|
|
117
|
+
write previews, and source markers.
|
|
84
118
|
|
|
85
119
|
```mermaid
|
|
86
120
|
sequenceDiagram
|
|
87
121
|
autonumber
|
|
88
|
-
actor U as
|
|
122
|
+
actor U as User
|
|
89
123
|
participant A as Agent
|
|
90
|
-
participant L as
|
|
124
|
+
participant L as Lifecycle integration
|
|
91
125
|
participant F as Fuli MCP
|
|
92
|
-
participant G as
|
|
93
|
-
|
|
94
|
-
U->>A:
|
|
95
|
-
alt Claude Code
|
|
96
|
-
L->>F:
|
|
97
|
-
F-->>A:
|
|
98
|
-
else Codex / Cursor
|
|
99
|
-
A->>F: get_collaboration_preferences(projectPath)
|
|
100
|
-
F-->>A:
|
|
126
|
+
participant G as Local graph
|
|
127
|
+
|
|
128
|
+
U->>A: Submit a task in the current project
|
|
129
|
+
alt Claude Code (hook-enforced)
|
|
130
|
+
L->>F: begin_task_context(projectPath, taskPrompt)
|
|
131
|
+
F-->>A: Preferences, exact project, bounded recall, and task token
|
|
132
|
+
else Codex / Cursor (prompt fallback)
|
|
133
|
+
A->>F: get_collaboration_preferences(projectPath, taskPrompt)
|
|
134
|
+
F-->>A: Preferences, exact project, and bounded recall
|
|
101
135
|
end
|
|
102
136
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
F
|
|
106
|
-
G
|
|
107
|
-
|
|
137
|
+
A->>A: Inspect task_knowledge_recall
|
|
138
|
+
opt Historical context is needed and recall did not answer it
|
|
139
|
+
A->>F: search_current_project_knowledge with focused queries
|
|
140
|
+
F->>G: Search child first, then authorized parents
|
|
141
|
+
G-->>A: Bounded content, status, provenance, and history
|
|
142
|
+
opt Knowledge materially affects the result
|
|
108
143
|
A->>F: record_knowledge_usage
|
|
109
144
|
end
|
|
110
145
|
end
|
|
111
146
|
|
|
112
|
-
A->>A:
|
|
113
|
-
opt
|
|
114
|
-
A->>F:
|
|
147
|
+
A->>A: Complete the implementation, validation, or answer
|
|
148
|
+
opt The task creates a decision, contradiction, or stale signal
|
|
149
|
+
A->>F: Record rationale or knowledge feedback
|
|
115
150
|
end
|
|
116
151
|
A->>F: checkpoint_task_knowledge
|
|
117
|
-
alt
|
|
152
|
+
alt A small durable candidate batch exists
|
|
118
153
|
F->>G: capture_candidates
|
|
119
|
-
else
|
|
154
|
+
else Nothing should be retained
|
|
120
155
|
F-->>A: retain_nothing
|
|
121
156
|
end
|
|
122
157
|
|
|
123
|
-
alt Claude Code Stop
|
|
158
|
+
alt Claude Code Stop hook
|
|
124
159
|
L->>F: verify_task_checkpoint
|
|
125
|
-
F-->>L:
|
|
126
|
-
else Prompt
|
|
127
|
-
Note over A,F:
|
|
160
|
+
F-->>L: Allow stop only after review
|
|
161
|
+
else Prompt-fallback agent
|
|
162
|
+
Note over A,F: Same contract, but the host cannot deterministically block a missed review
|
|
128
163
|
end
|
|
129
|
-
A-->>U:
|
|
164
|
+
A-->>U: Return the result and any Fuli sources actually used
|
|
130
165
|
```
|
|
131
166
|
|
|
132
|
-
##
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
-
|
|
137
|
-
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
167
|
+
## Read-only external knowledge
|
|
168
|
+
|
|
169
|
+
One knowledge-base connection can be bound to one or more existing personal projects without
|
|
170
|
+
granting Fuli write access to the source. Each target keeps independent retrieval mode, sync
|
|
171
|
+
cursor, and error state. The Connections page supports multi-project assignment, connection
|
|
172
|
+
checks, manual synchronization, disconnection, and a per-project conflict switch.
|
|
173
|
+
|
|
174
|
+
| Connector | Read path | Current boundary |
|
|
175
|
+
| --- | --- | --- |
|
|
176
|
+
| MCP | Resources `list/read`; configured `search` / `fetch` tools | Default; HTTPS or loopback HTTP, plus stdio |
|
|
177
|
+
| Notion | Page Markdown and Data Source queries | Current `2026-03-11` API; explicit page or data-source IDs |
|
|
178
|
+
| Feishu / Lark | Wiki nodes, search, and Docx raw content | Docx text only; search may require a user access token |
|
|
179
|
+
| RAG Retrieval API | Dify-compatible external-knowledge retrieval contract | Live only; for compatible endpoints or adapters in front of systems such as RAGFlow |
|
|
180
|
+
| Trusted custom code | Local ESM `sync` / `retrieve` contract | Explicitly installed trusted code, not a sandbox |
|
|
181
|
+
|
|
182
|
+
<a id="connect-external-knowledge"></a>
|
|
183
|
+
|
|
184
|
+
### Connect one or more knowledge bases to a project
|
|
185
|
+
|
|
186
|
+
One personal project can have multiple knowledge connections, and one connection can target
|
|
187
|
+
multiple personal projects. Each submission adds a connection instead of replacing an existing
|
|
188
|
+
one. Source configuration is stored once, while retrieval mode, synchronization state, and errors
|
|
189
|
+
are isolated per target. Use Bind projects on an existing connection to add or remove targets.
|
|
190
|
+
|
|
191
|
+
1. Create or confirm the target under Personal projects.
|
|
192
|
+
2. If the source needs a token, set it in the environment that starts Fuli, then start or restart
|
|
193
|
+
the service. The binding stores only the environment-variable name. For example, run
|
|
194
|
+
`export PROJECT_KB_TOKEN='...'` and then `fl restart`.
|
|
195
|
+
3. Open `http://127.0.0.1:2727/connections`. Under External knowledge, enter a connection name,
|
|
196
|
+
connector, one or more bound projects, and retrieval mode.
|
|
197
|
+
4. For MCP HTTP, enter the server URL and optional token environment-variable name. For MCP stdio,
|
|
198
|
+
enter its command and arguments. For Notion, enter the token environment-variable name and Page
|
|
199
|
+
IDs or Data Source IDs. For Feishu/Lark, enter the token environment-variable name, region, and
|
|
200
|
+
an explicit Space ID, root-node token, or node tokens. For RAG Retrieval API, enter a
|
|
201
|
+
Dify-compatible endpoint, knowledge-base IDs, and an optional token environment-variable name.
|
|
202
|
+
A custom connector takes a trusted local ESM module and source JSON.
|
|
203
|
+
5. Select Add connection and then Check. A successful `mirror` or `hybrid` binding can be synced;
|
|
204
|
+
a `live` binding reads its source when an Agent query runs.
|
|
205
|
+
6. After creation, use Bind projects to add or remove projects and select a mode per project.
|
|
206
|
+
|
|
207
|
+
The project graph shows an External knowledge source node and a Uses external knowledge edge for
|
|
208
|
+
each assignment. This is a read-only projection of connection configuration. Live bodies are still
|
|
209
|
+
retrieved only when an Agent invokes `search_connected_knowledge`; showing the node does not mirror
|
|
210
|
+
content locally.
|
|
211
|
+
|
|
212
|
+
Retrieval modes differ as follows:
|
|
213
|
+
|
|
214
|
+
- `live`: read the third party at query time without storing a body mirror in Fuli; the source must
|
|
215
|
+
be available.
|
|
216
|
+
- `mirror`: manually mirror read-only content into the bound personal project and query the graph.
|
|
217
|
+
- `hybrid`: use both the local mirror and live source results; recommended when the connector
|
|
218
|
+
supports both capabilities.
|
|
219
|
+
|
|
220
|
+
Bindings support `live`, `mirror`, and `hybrid` modes. Mirror content is written only to the bound
|
|
221
|
+
personal project as `observed`, `pending`, `restricted`, local-only knowledge. Credentials are read
|
|
222
|
+
from named environment variables and are not stored in binding JSON. Source writes are never part
|
|
223
|
+
of the connector contract. Documents that look like credential material are skipped individually,
|
|
224
|
+
reported by count, and never enter the graph or Agent context.
|
|
225
|
+
|
|
226
|
+
<a id="external-knowledge-conflict-policy"></a>
|
|
227
|
+
|
|
228
|
+
### Conflict policy
|
|
229
|
+
|
|
230
|
+
The conflict policy is stored per personal project and applies across that project's personal
|
|
231
|
+
graph, all external bindings, and explicitly selected public projects:
|
|
232
|
+
|
|
233
|
+
- Ask in the Agent conversation is the default. The Agent presents conflicting content, source,
|
|
234
|
+
and scope separately so the user can choose.
|
|
235
|
+
- Allow an Agent decision lets the Agent select the stronger or fresher source for the current
|
|
236
|
+
response and requires it to explain the basis. It never confirms, invalidates, overwrites, or
|
|
237
|
+
writes back any knowledge.
|
|
238
|
+
|
|
239
|
+
From the project directory, an Agent can be asked: `Search the current project and connected knowledge bases for the payment callback contract; list conflicting sources and ask me to decide.`
|
|
240
|
+
|
|
241
|
+
`search_connected_knowledge` keeps personal-graph evidence, each external binding, and explicitly
|
|
242
|
+
selected public projects as separate source sets. Public-project aggregation is **Beta**. When an
|
|
243
|
+
Agent finds a material conflict, the default policy is to show it in the conversation and ask the
|
|
244
|
+
user; the optional Agent-decision policy applies to the current response only and cannot confirm,
|
|
245
|
+
invalidate, or rewrite any source. Direct external-to-public binding, reviewed public promotion,
|
|
246
|
+
scheduled sync, webhooks, and full deletion reconciliation remain **TODO**.
|
|
247
|
+
|
|
248
|
+
See the [external-knowledge architecture and connector contract](docs/external-knowledge-architecture.md).
|
|
249
|
+
|
|
250
|
+
## Current capabilities and evidence boundaries
|
|
251
|
+
|
|
252
|
+
Core mechanisms covered by implementation and automated tests include:
|
|
253
|
+
|
|
254
|
+
- a local personal space, exact project scope, and selective parent inheritance;
|
|
255
|
+
- preference confirmation, deferred conflict resolution, revision history, and source markers;
|
|
256
|
+
- bounded task-prompt recall, focused on-demand retrieval, and material-usage auditing;
|
|
257
|
+
- task entry and completion checkpoints, plus Claude Code entry and Stop hooks;
|
|
258
|
+
- decision options, rationale, and validation results supplied during initial capture;
|
|
259
|
+
- knowledge-usage events, negative feedback, and content-generation isolation;
|
|
260
|
+
- persistent scoped knowledge reviews with pause/resume watermarks;
|
|
261
|
+
- common-knowledge discovery and preview-token-protected atomic promotion;
|
|
262
|
+
- read-only multi-project MCP, Notion, Feishu/Lark, Dify-compatible RAG Retrieval API, and trusted-code bindings with connected retrieval.
|
|
263
|
+
|
|
264
|
+
The following must not be presented as already proven:
|
|
265
|
+
|
|
266
|
+
- the A/B thresholds in `FULI_ALIGNMENT_BENCHMARK.md` are acceptance conventions; claims that Fuli
|
|
267
|
+
reduces explanation or rework require a sufficiently large set of controlled, real paired tasks;
|
|
268
|
+
- benchmark projects and conversations are explicitly labeled **MOCK / synthetic data**, not user or
|
|
269
|
+
production data;
|
|
270
|
+
- the decision tool can include validation during initial capture, but it does not yet expose a
|
|
271
|
+
dedicated operation for appending immutable validation results to an existing `Decision`;
|
|
272
|
+
- Claude Code has deterministic lifecycle hooks; Codex and Cursor currently use prompt fallback and
|
|
273
|
+
must not be described as equally enforced;
|
|
274
|
+
- selected public projects in connected retrieval are Beta; external-to-public promotion and
|
|
275
|
+
background delta synchronization are not implemented.
|
|
276
|
+
|
|
277
|
+
## Installation
|
|
278
|
+
|
|
279
|
+
Requirements:
|
|
280
|
+
|
|
281
|
+
- Node.js 24.12 or later;
|
|
282
|
+
- Docker Compose v2 through Docker Desktop, Rancher Desktop, or another compatible runtime;
|
|
283
|
+
- approximately 4 GB of memory available to the containers.
|
|
284
|
+
|
|
285
|
+
Install globally and initialize:
|
|
162
286
|
|
|
163
287
|
```bash
|
|
164
288
|
npm install --global fuli-context
|
|
165
289
|
fuli setup
|
|
166
290
|
```
|
|
167
291
|
|
|
168
|
-
`fuli setup`
|
|
169
|
-
Graphiti / Neo4j
|
|
170
|
-
MCP
|
|
292
|
+
`fuli setup` first shows its plan and asks for confirmation. It then checks the container runtime,
|
|
293
|
+
initializes local Graphiti / Neo4j, creates a personal space, installs the companion Agent Skills,
|
|
294
|
+
and registers the `fuli` MCP with detected agents. The default setup connects only the personal
|
|
295
|
+
Provider; it does not simulate a team-shared service.
|
|
171
296
|
|
|
172
|
-
|
|
297
|
+
Open the management UI after setup:
|
|
173
298
|
|
|
174
299
|
```bash
|
|
175
300
|
fuli open
|
|
176
301
|
```
|
|
177
302
|
|
|
178
|
-
|
|
303
|
+
The default URL is `http://127.0.0.1:2727`.
|
|
304
|
+
|
|
305
|
+
The Settings page manages all seven local Fuli ports, LAN access, automatic capture, Agent access,
|
|
306
|
+
UI language, and the resource refresh interval. Run `fuli restart` after saving port or LAN changes;
|
|
307
|
+
the refresh interval applies immediately. The same page polls real memory and disk usage for the
|
|
308
|
+
management service, Providers, Neo4j, application files, and local data. Memory is sampled on every
|
|
309
|
+
poll; disk usage is sampled at most once per minute, with separate timestamps. Missing container metrics
|
|
310
|
+
are shown as partial instead of being replaced with mock values. Browser-tab memory and shared
|
|
311
|
+
container-VM overhead are excluded from the Fuli total.
|
|
179
312
|
|
|
180
313
|
## CLI
|
|
181
314
|
|
|
182
|
-
|
|
315
|
+
The global package provides two equivalent commands: `fuli` and the short alias `fl`.
|
|
316
|
+
CLI help, prompts, status output, and errors are always in English and do not follow the web or
|
|
317
|
+
system locale. User data such as paths and space names is displayed unchanged.
|
|
183
318
|
|
|
184
|
-
|
|
|
319
|
+
| Command | Purpose |
|
|
185
320
|
| --- | --- |
|
|
186
|
-
| `fuli
|
|
187
|
-
| `fuli
|
|
188
|
-
| `fuli
|
|
189
|
-
| `fuli
|
|
190
|
-
| `fuli
|
|
191
|
-
| `fuli
|
|
192
|
-
| `fuli
|
|
193
|
-
| `fuli
|
|
194
|
-
|
|
195
|
-
|
|
321
|
+
| `fuli --help` / `fuli -h` | List every public command and its available options |
|
|
322
|
+
| `fuli --version` / `fuli -v` | Print the installed Fuli CLI version |
|
|
323
|
+
| `fuli setup [options]` | Initialize the Provider, UI, agent integrations, and Skills; safe to rerun |
|
|
324
|
+
| `fuli start [options]` | Start the Provider and UI, optionally opening a browser, rebuilding containers, or enabling LAN access |
|
|
325
|
+
| `fuli stop [--data-dir DIR]` | Stop services without deleting data |
|
|
326
|
+
| `fuli restart [options]` | Restart local services using the same runtime options as `start` |
|
|
327
|
+
| `fuli status [--json] [--data-dir DIR] [--port PORT]` | Show UI, personal graph, and shared-service status; `--json` emits machine-readable output |
|
|
328
|
+
| `fuli open [--data-dir DIR]` | Open the current management UI in the default browser |
|
|
329
|
+
| `fuli update [setup options]` | Update the npm package and refresh local integrations |
|
|
330
|
+
| `fuli uninstall [--yes] [--data-dir DIR]` | Remove agent integrations and services while preserving knowledge data and Neo4j volumes |
|
|
331
|
+
|
|
332
|
+
Common commands:
|
|
196
333
|
|
|
197
334
|
```bash
|
|
198
335
|
fuli --version
|
|
@@ -202,115 +339,146 @@ fuli start --lan
|
|
|
202
339
|
fuli stop
|
|
203
340
|
```
|
|
204
341
|
|
|
205
|
-
`start
|
|
206
|
-
`--port
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
`--lan
|
|
210
|
-
|
|
342
|
+
`start` and `restart` accept `--data-dir DIR`, `--personal-space NAME`, `--port PORT`, `--open`,
|
|
343
|
+
`--rebuild`, `--lan`, and `--no-lan`. When port or LAN flags are omitted, the saved Settings values
|
|
344
|
+
are used. LAN mode listens on private IPv4 addresses and prints the reachable URLs, the
|
|
345
|
+
`fuli` username, and a temporary access code generated for that start. The default remains
|
|
346
|
+
loopback-only; internal Providers and Neo4j ports are never exposed by `--lan`. LAN mode uses
|
|
347
|
+
HTTP Basic Auth and is intended only for trusted home or office Wi-Fi, not public deployment.
|
|
211
348
|
|
|
212
|
-
`setup`
|
|
349
|
+
`setup` and `update` accept:
|
|
213
350
|
|
|
214
|
-
|
|
|
351
|
+
| Option | Purpose |
|
|
215
352
|
| --- | --- |
|
|
216
|
-
| `--yes` |
|
|
217
|
-
| `--codex-only` |
|
|
218
|
-
| `--
|
|
219
|
-
| `--
|
|
220
|
-
| `--
|
|
221
|
-
| `--
|
|
222
|
-
|
|
223
|
-
|
|
353
|
+
| `--yes` | Skip confirmation for unattended setup |
|
|
354
|
+
| `--codex-only` | Configure Codex only |
|
|
355
|
+
| `--data-dir DIR` | Use a specific data and configuration directory |
|
|
356
|
+
| `--personal-space NAME` | Set the personal-space name; defaults to `Personal` |
|
|
357
|
+
| `--port PORT` | Set the management UI port; defaults to `2727` |
|
|
358
|
+
| `--skip-agents` | Do not change agent configuration or Skills |
|
|
359
|
+
| `--no-start` | Initialize the Provider without starting the UI |
|
|
360
|
+
| `--personal-only` | Use only the personal Provider; this is the default |
|
|
361
|
+
| `--with-dev-public` | Start a development shared Provider for local integration work only |
|
|
362
|
+
|
|
363
|
+
Update:
|
|
224
364
|
|
|
225
365
|
```bash
|
|
226
366
|
fuli update
|
|
227
367
|
```
|
|
228
368
|
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
369
|
+
The update flow verifies that it will not downgrade the installation, stops the old services,
|
|
370
|
+
installs `fuli-context@latest`, and refreshes agent integrations. Existing knowledge, configuration
|
|
371
|
+
backups, and Neo4j volumes remain intact. Reuse any custom setup options during updates.
|
|
232
372
|
|
|
233
|
-
|
|
373
|
+
Uninstall:
|
|
234
374
|
|
|
235
375
|
```bash
|
|
236
376
|
fuli uninstall
|
|
237
377
|
npm uninstall --global fuli-context
|
|
238
378
|
```
|
|
239
379
|
|
|
240
|
-
|
|
380
|
+
Automated uninstall does not permanently delete the personal graph, which allows a later install to
|
|
381
|
+
reuse the same data.
|
|
241
382
|
|
|
242
|
-
## Agent
|
|
383
|
+
## Agent integrations and primary tools
|
|
243
384
|
|
|
244
|
-
Fuli
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
385
|
+
Fuli installs the `capturing-session-knowledge`, `grilling-project`, and `flreview` Skills for
|
|
386
|
+
supported agents. `/flreview` offers all knowledge, personal preferences, or personal-project
|
|
387
|
+
scope. If the user has no patience, it skips mood, time, and token questions and reviews only a
|
|
388
|
+
small number of highest-priority items.
|
|
389
|
+
Claude Code uses `UserPromptSubmit` and `Stop` hooks for the task lifecycle. Codex's user-level
|
|
390
|
+
`AGENTS.md` and Cursor instructions use prompt fallback. Preference content remains in local Fuli as
|
|
391
|
+
the single source of truth and is not copied into agent configuration.
|
|
248
392
|
|
|
249
|
-
|
|
|
393
|
+
| Tool | Purpose |
|
|
250
394
|
| --- | --- |
|
|
251
|
-
| `begin_task_context` | Hook
|
|
252
|
-
| `get_collaboration_preferences` | Fallback
|
|
253
|
-
| `search_current_project_knowledge` |
|
|
254
|
-
| `search_knowledge_graph` |
|
|
255
|
-
| `
|
|
256
|
-
| `
|
|
257
|
-
| `
|
|
258
|
-
| `
|
|
259
|
-
| `
|
|
260
|
-
| `
|
|
261
|
-
| `
|
|
262
|
-
| `
|
|
263
|
-
| `
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
-
|
|
273
|
-
|
|
274
|
-
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
395
|
+
| `begin_task_context` | Hook entry: resolve the task, run bounded recall when signaled, and create a task token |
|
|
396
|
+
| `get_collaboration_preferences` | Fallback entry: read effective preferences and bounded task recall |
|
|
397
|
+
| `search_current_project_knowledge` | Search the child first, then authorized knowledge sources |
|
|
398
|
+
| `search_knowledge_graph` | Run a general query within an explicit bounded scope |
|
|
399
|
+
| `search_connected_knowledge` | Search the graph, project-bound read-only sources, and selected public projects without merging provenance |
|
|
400
|
+
| `record_knowledge_usage` | Record a citation or application that materially affected the result |
|
|
401
|
+
| `record_knowledge_feedback` | Preserve rejection, failed validation, contradiction, or stale evidence |
|
|
402
|
+
| `record_decision_trace` | Store options, rejected alternatives, rationale, and optional initial validation |
|
|
403
|
+
| `capture_session_knowledge` | Store a small structured batch of durable candidates |
|
|
404
|
+
| `checkpoint_task_knowledge` | Complete review with `capture_candidates` or `retain_nothing` |
|
|
405
|
+
| `discover_common_knowledge_candidates` | Read-only discovery of possible parent-project knowledge |
|
|
406
|
+
| `preview_common_knowledge_promotion` | Preview a human-confirmed promotion |
|
|
407
|
+
| `apply_common_knowledge_promotion` | Apply the preview atomically with a one-time token |
|
|
408
|
+
| `resolve_deferred_preference_conflict` | Resolve an AI-deferred conflict only when a task needs it |
|
|
409
|
+
| `start_knowledge_review` | Start or resume an exact personal review scope |
|
|
410
|
+
| `list_knowledge_review_candidates` | Rank candidates by time, conflicts, weight, and cross-session repetition |
|
|
411
|
+
| `record_knowledge_review_progress` | Save keep, update, invalidate, skip, or defer outcomes |
|
|
412
|
+
| `finish_knowledge_review` | Pause, or complete and advance the next-review watermark |
|
|
413
|
+
|
|
414
|
+
## Privacy and safety boundaries
|
|
415
|
+
|
|
416
|
+
- Personal knowledge is written to the local Provider.
|
|
417
|
+
- Agents distill structured knowledge instead of storing raw transcripts.
|
|
418
|
+
- Tokens, cookies, private keys, credentials, private contact details, temporary logs, and raw command
|
|
419
|
+
output must not enter the graph.
|
|
420
|
+
- Graphiti's remote-LLM path is disabled; embeddings are currently computed locally.
|
|
421
|
+
- Searches are bounded by personal space and project scope instead of mixing every project.
|
|
422
|
+
- External connectors never write to third-party sources; raw credentials are rejected from stored
|
|
423
|
+
binding configuration.
|
|
424
|
+
- Shared promotion requires auditable human confirmation. Agent usage evidence can promote an item
|
|
425
|
+
only as far as `agent_confirmed`.
|
|
426
|
+
- Fuli is not a real-time monitoring or Git service; current state must be read from the relevant
|
|
427
|
+
source system.
|
|
428
|
+
|
|
429
|
+
## Local services
|
|
430
|
+
|
|
431
|
+
| Service | Default loopback address | Availability |
|
|
432
|
+
| --- | --- | --- |
|
|
433
|
+
| Fuli management UI | `127.0.0.1:2727` | Always |
|
|
434
|
+
| Personal Provider | `127.0.0.1:8787` | Always |
|
|
435
|
+
| Personal Neo4j Browser / Bolt | `127.0.0.1:8060` / `127.0.0.1:7687` | Always |
|
|
436
|
+
| Development shared Provider | `127.0.0.1:8788` | `--with-dev-public` only |
|
|
437
|
+
| Development shared Neo4j Browser / Bolt | `127.0.0.1:7475` / `127.0.0.1:7688` | `--with-dev-public` only |
|
|
438
|
+
|
|
439
|
+
These seven ports can be changed in Settings. Provider and Neo4j bindings remain loopback-only even
|
|
440
|
+
when the management UI is started in LAN mode.
|
|
441
|
+
|
|
442
|
+
To access the UI from another device on the same Wi-Fi, run `fuli start --lan`. Starting LAN mode
|
|
443
|
+
from a loopback-only runtime safely restarts only the management UI and preserves Provider and
|
|
444
|
+
graph data. Disable LAN in Settings and run `fuli restart`, or run `fuli restart --no-lan`, to return
|
|
445
|
+
to loopback-only mode. Starting LAN mode again rotates the temporary access code.
|
|
446
|
+
|
|
447
|
+
If a port is occupied, Docker Compose is unavailable, or the container runtime is not running,
|
|
448
|
+
setup stops before modifying agent configuration and reports the cause.
|
|
449
|
+
|
|
450
|
+
## Acceptance and development
|
|
292
451
|
|
|
293
452
|
- [Alignment Benchmark](FULI_ALIGNMENT_BENCHMARK.md)
|
|
294
|
-
- [
|
|
295
|
-
- [
|
|
453
|
+
- [Chinese acceptance index](acceptance/README.md)
|
|
454
|
+
- [Knowledge retrieval and confirmation diagrams](acceptance/知识检索与确认流程图.md)
|
|
455
|
+
- [Read-only external-knowledge architecture](docs/external-knowledge-architecture.md)
|
|
296
456
|
|
|
297
457
|
```bash
|
|
298
458
|
npm install
|
|
299
459
|
npm test
|
|
300
460
|
npm run test:package
|
|
461
|
+
npm run test:external-knowledge:live
|
|
301
462
|
```
|
|
302
463
|
|
|
303
|
-
|
|
464
|
+
The external-knowledge live test temporarily downloads two public official documentation
|
|
465
|
+
repositories, validates read-only synchronization and retrieval, then removes the complete
|
|
466
|
+
temporary directory. It is network-dependent and is not part of the default test suite.
|
|
467
|
+
|
|
468
|
+
Provider validation:
|
|
304
469
|
|
|
305
470
|
```bash
|
|
306
|
-
python3 -m
|
|
307
|
-
|
|
471
|
+
python3.12 -m venv .venv
|
|
472
|
+
. .venv/bin/activate
|
|
473
|
+
python -m pip install "./graph-provider[dev]"
|
|
474
|
+
python -m compileall -q graph-provider/fuli_graph
|
|
475
|
+
python -m pytest -q graph-provider/tests
|
|
308
476
|
docker compose -f compose.graphiti.yml config --quiet
|
|
309
477
|
```
|
|
310
478
|
|
|
311
|
-
`npm run test:package`
|
|
312
|
-
`fuli` / `fl
|
|
313
|
-
|
|
479
|
+
`npm run test:package` builds the web UI, creates a real npm tarball, installs it into an isolated
|
|
480
|
+
global prefix, and verifies `fuli` / `fl`, version output, help output, and the packaged UI. Tests,
|
|
481
|
+
QA screenshots, and internal design documents are excluded from the npm package.
|
|
314
482
|
|
|
315
483
|
## License
|
|
316
484
|
|