fuli-context 0.7.3 → 0.7.4-beta.1
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 +170 -18
- package/README.zh-CN.md +146 -12
- package/compose.graphiti.yml +2 -0
- package/dist/web/assets/{AboutPage-qeO_vm0T.js → AboutPage-CftRexSY.js} +1 -1
- package/dist/web/assets/{ConnectionsPage-DO0GR9Xg.js → ConnectionsPage-D5J91x6d.js} +1 -1
- package/dist/web/assets/{useMinimumLoadingDisplay-BpCyBeko.css → KnowledgeEditDialog-DWUV_NPp.css} +1 -1
- package/dist/web/assets/KnowledgeEditDialog-wotVahvr.js +1 -0
- package/dist/web/assets/{KnowledgeInspector-Bjhdu2mf.css → KnowledgeInspector--1NujtXW.css} +1 -1
- package/dist/web/assets/KnowledgeInspector-BzkW0mVs.js +1 -0
- package/dist/web/assets/KnowledgeOrganizerPage-BebUDiHt.js +1 -0
- package/dist/web/assets/KnowledgePage-OUT07aKH.js +1 -0
- package/dist/web/assets/KnowledgeWorkspace-1pHJ0MNZ.js +4 -0
- package/dist/web/assets/{OverviewPage-CmCcDCAs.js → OverviewPage-CHE6XhdS.js} +1 -1
- package/dist/web/assets/PersonalProfilePage-B7T09bow.css +1 -0
- package/dist/web/assets/PersonalProfilePage-CXXiabUy.js +1 -0
- package/dist/web/assets/PersonalProjectsPage-d2wYGW8n.js +1 -0
- package/dist/web/assets/PublicProjectsPage-hxLShtnZ.js +1 -0
- package/dist/web/assets/{ReviewPage-B3vnZ6gn.js → ReviewPage-DUeyu7E8.js} +1 -1
- package/dist/web/assets/{SearchableSelect-ih69qbcS.js → SearchableSelect-C5RiB5F8.js} +1 -1
- package/dist/web/assets/SettingsPage-BMuASSzQ.js +1 -0
- package/dist/web/assets/SettingsPage-CAfz4qiV.css +1 -0
- package/dist/web/assets/WritingTastePage-B9BCYIwQ.js +1 -0
- package/dist/web/assets/WritingTastePage-DSgvTH6x.css +1 -0
- package/dist/web/assets/{console-DE40hXGC.js → console-DMvHxKf9.js} +1 -1
- package/dist/web/assets/conversation-launcher-settings-Dnlcw7Rj.js +1 -0
- package/dist/web/assets/{i18n-CDxBs1sz.js → i18n-CWfd8Dtt.js} +1 -1
- package/dist/web/assets/{identity-BCxb1mcy.js → identity-C9mLdR8L.js} +1 -1
- package/dist/web/assets/index-F5e2sQ7p.js +2 -0
- package/dist/web/assets/{index-CCOGfZzE.css → index-X2j29j8i.css} +1 -1
- package/dist/web/assets/{model-CCMdt10Q.js → model-CsYAR8O3.js} +1 -1
- package/dist/web/assets/paths-CDREouhi.js +1 -0
- package/dist/web/assets/useApi-CROJJdhE-BLQiPVw0.js +1 -0
- package/dist/web/assets/vue-router-DN8x6iY1.js +1 -0
- package/dist/web/index.html +7 -6
- package/graph-provider/fuli_graph/app.py +238 -2
- package/graph-provider/fuli_graph/auth.py +18 -0
- package/graph-provider/fuli_graph/collaboration_context.py +253 -17
- package/graph-provider/fuli_graph/common_knowledge.py +6 -2
- package/graph-provider/fuli_graph/config.py +5 -0
- package/graph-provider/fuli_graph/graph_models.py +6 -0
- package/graph-provider/fuli_graph/graph_projection.py +14 -0
- package/graph-provider/fuli_graph/graph_query.py +27 -3
- package/graph-provider/fuli_graph/knowledge_management.py +19 -1
- package/graph-provider/fuli_graph/knowledge_search.py +11 -0
- package/graph-provider/fuli_graph/models.py +15 -2
- package/graph-provider/fuli_graph/personal_global_preference_models.py +234 -0
- package/graph-provider/fuli_graph/personal_global_preferences.py +1247 -0
- package/graph-provider/fuli_graph/project_action_models.py +22 -0
- package/graph-provider/fuli_graph/project_knowledge.py +121 -2
- package/graph-provider/fuli_graph/provider_values.py +24 -0
- package/graph-provider/fuli_graph/runtime.py +78 -0
- package/graph-provider/fuli_graph/search_projection.py +14 -1
- package/graph-provider/fuli_graph/store_knowledge.py +116 -2
- package/graph-provider/fuli_graph/workflow_candidate_models.py +168 -0
- package/graph-provider/fuli_graph/workflow_candidates.py +996 -0
- package/graph-provider/fuli_graph/workflow_observation_models.py +30 -0
- package/graph-provider/fuli_graph/workflow_observations.py +84 -0
- package/graph-provider/pyproject.toml +1 -1
- package/npm-shrinkwrap.json +18 -18
- package/package.json +4 -4
- package/skills/capturing-session-knowledge/SKILL.md +32 -5
- package/skills/flreview/SKILL.md +4 -3
- package/src/agent-tools/graph-definitions.js +136 -20
- package/src/agent-tools/graph-handlers.js +10 -4
- package/src/cli/command-registry.js +1 -1
- package/src/cli/local-runtime-command.js +69 -2
- package/src/graphiti/agent-knowledge-workflows.js +497 -16
- package/src/graphiti/collaboration-preference-projection.js +162 -0
- package/src/graphiti/federated-application.js +155 -161
- package/src/graphiti/federated-search-support.js +102 -0
- package/src/graphiti/knowledge-provider-mapping.js +15 -0
- package/src/graphiti/provider-client.js +162 -10
- package/src/graphiti/related-project-suggestions.js +109 -0
- package/src/graphiti/runtime-config.js +14 -0
- package/src/graphiti/source-marker.js +2 -2
- package/src/graphiti/user-taste-skill.js +241 -0
- package/src/graphiti/workflow-candidate-mapping.js +87 -0
- package/src/graphiti/workflow-observation.js +82 -0
- package/src/graphiti/writing-taste-profile-workflow.js +25 -0
- package/src/graphiti/writing-taste-profile.js +490 -0
- package/src/http/graph-api-router.js +15 -2
- package/src/mcp/context-resources.js +158 -0
- package/src/mcp/create-mcp-server.js +39 -5
- package/src/mcp/instructions.js +5 -7
- package/src/mcp/session-id.js +60 -0
- package/src/mcp/task-context-registry.js +15 -3
- package/src/mcp/tool-annotations.js +8 -1
- package/src/mcp/tool-result.js +28 -4
- package/src/server.js +0 -1
- package/src/setup/claude-code-config.js +17 -6
- package/src/setup/graph-runtime.js +20 -2
- package/src/system/runtime-settings.js +121 -2
- package/src/system/system-service.js +5 -1
- package/dist/web/assets/KnowledgeInspector-DEW5lA1m.js +0 -1
- package/dist/web/assets/KnowledgeOrganizerPage-BkM568Ld.js +0 -1
- package/dist/web/assets/KnowledgePage-BAT4aZIm.js +0 -1
- package/dist/web/assets/KnowledgeWorkspace-DyGtBz--.js +0 -4
- package/dist/web/assets/PersonalProfilePage-C42mwKN8.js +0 -1
- package/dist/web/assets/PersonalProfilePage-CdmEzyvZ.css +0 -1
- package/dist/web/assets/PersonalProjectsPage-BwaXR62K.js +0 -1
- package/dist/web/assets/PublicProjectsPage-egKBulOq.js +0 -1
- package/dist/web/assets/SettingsPage-C6ouU0sR.css +0 -1
- package/dist/web/assets/SettingsPage-oLE8mNs5.js +0 -1
- package/dist/web/assets/index-BzhNfzU_.js +0 -2
- package/dist/web/assets/paths-DwHeiGMT.js +0 -1
- package/dist/web/assets/useMinimumLoadingDisplay-HdI7XAmu.js +0 -1
- package/dist/web/assets/vue-router-Drfl1F8i.js +0 -1
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
from datetime import datetime
|
|
2
|
+
from typing import Literal
|
|
3
|
+
|
|
4
|
+
from pydantic import Field, model_validator
|
|
5
|
+
|
|
6
|
+
from .models import StrictModel
|
|
7
|
+
|
|
8
|
+
WorkflowCandidateStatus = Literal['pending', 'approved', 'rejected']
|
|
9
|
+
WorkflowConfirmationAuthority = Literal[
|
|
10
|
+
'none',
|
|
11
|
+
'agent_proposed',
|
|
12
|
+
'import_proposed',
|
|
13
|
+
'authoritative_source',
|
|
14
|
+
'user',
|
|
15
|
+
]
|
|
16
|
+
WorkflowRecommendationAction = Literal[
|
|
17
|
+
'none',
|
|
18
|
+
'ask_user',
|
|
19
|
+
'authorized_rule_available',
|
|
20
|
+
]
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class WorkflowCandidateSearch(StrictModel):
|
|
24
|
+
personal_space_id: str = Field(min_length=1, max_length=128)
|
|
25
|
+
personal_project_id: str | None = Field(default=None, min_length=1, max_length=128)
|
|
26
|
+
after_step_key: str | None = Field(default=None, min_length=1, max_length=256)
|
|
27
|
+
limit: int = Field(default=20, ge=1, le=100)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class WorkflowDecisionAuthority(StrictModel):
|
|
31
|
+
kind: Literal['user', 'authoritative_source']
|
|
32
|
+
label: str | None = Field(default=None, min_length=1, max_length=160)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class WorkflowCandidateReviewIntent(StrictModel):
|
|
36
|
+
personal_space_id: str = Field(min_length=1, max_length=128)
|
|
37
|
+
candidate_version: int = Field(ge=1)
|
|
38
|
+
evidence_revision: int = Field(ge=1)
|
|
39
|
+
decision_revision: int = Field(ge=0)
|
|
40
|
+
idempotency_key: str = Field(min_length=8, max_length=256)
|
|
41
|
+
decision: Literal['approve', 'reject']
|
|
42
|
+
reason: str = Field(min_length=1, max_length=2000)
|
|
43
|
+
authority: WorkflowDecisionAuthority
|
|
44
|
+
decision_source: Literal[
|
|
45
|
+
'direct_user_confirmation',
|
|
46
|
+
'authoritative_source_record',
|
|
47
|
+
]
|
|
48
|
+
durable_authorization_confirmed: bool = False
|
|
49
|
+
|
|
50
|
+
@model_validator(mode='after')
|
|
51
|
+
def validate_decision_authority(self):
|
|
52
|
+
expected_source = (
|
|
53
|
+
'direct_user_confirmation'
|
|
54
|
+
if self.authority.kind == 'user'
|
|
55
|
+
else 'authoritative_source_record'
|
|
56
|
+
)
|
|
57
|
+
if self.decision_source != expected_source:
|
|
58
|
+
raise ValueError(
|
|
59
|
+
'decision_source must match the human or authoritative authority'
|
|
60
|
+
)
|
|
61
|
+
if self.decision == 'approve' and not self.durable_authorization_confirmed:
|
|
62
|
+
raise ValueError(
|
|
63
|
+
'approve requires explicit durable authorization confirmation'
|
|
64
|
+
)
|
|
65
|
+
if self.decision == 'reject' and self.durable_authorization_confirmed:
|
|
66
|
+
raise ValueError('reject cannot grant durable authorization')
|
|
67
|
+
return self
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
class WorkflowCandidateReview(WorkflowCandidateReviewIntent):
|
|
71
|
+
approval_token: str = Field(min_length=32, max_length=512)
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
class WorkflowCandidateReviewPreview(StrictModel):
|
|
75
|
+
preview_id: str
|
|
76
|
+
candidate_id: str
|
|
77
|
+
candidate_version: int = Field(ge=1)
|
|
78
|
+
evidence_revision: int = Field(ge=1)
|
|
79
|
+
decision_revision: int = Field(ge=0)
|
|
80
|
+
payload_fingerprint: str
|
|
81
|
+
approval_token: str
|
|
82
|
+
expires_at: datetime
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
class WorkflowRecommendationWeights(StrictModel):
|
|
86
|
+
occurrences: float = Field(ge=0, le=1)
|
|
87
|
+
distinct_sessions: float = Field(ge=0, le=1)
|
|
88
|
+
recency: float = Field(ge=0, le=1)
|
|
89
|
+
confirmation_authority: float = Field(ge=0, le=1)
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
class WorkflowRecommendationPolicy(StrictModel):
|
|
93
|
+
minimum_occurrences: int = Field(ge=1)
|
|
94
|
+
minimum_distinct_sessions: int = Field(ge=1)
|
|
95
|
+
recommendation_threshold: float = Field(ge=0, le=1)
|
|
96
|
+
weights: WorkflowRecommendationWeights
|
|
97
|
+
decline_penalty: float = Field(ge=0, le=1)
|
|
98
|
+
negative_evidence_penalty: float = Field(ge=0, le=1)
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
class WorkflowRecency(StrictModel):
|
|
102
|
+
first_observed_at: datetime
|
|
103
|
+
last_observed_at: datetime
|
|
104
|
+
age_days: float = Field(ge=0)
|
|
105
|
+
score: float = Field(ge=0, le=1)
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
class WorkflowRecommendation(StrictModel):
|
|
109
|
+
recommended: bool
|
|
110
|
+
score: float = Field(ge=0, le=1)
|
|
111
|
+
threshold: float = Field(ge=0, le=1)
|
|
112
|
+
action: WorkflowRecommendationAction
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
class WorkflowAuthorization(StrictModel):
|
|
116
|
+
authorization_id: str
|
|
117
|
+
candidate_id: str
|
|
118
|
+
candidate_version: int = Field(ge=1)
|
|
119
|
+
rule_id: str
|
|
120
|
+
rule_fingerprint: str
|
|
121
|
+
scope: Literal['durable']
|
|
122
|
+
active: bool
|
|
123
|
+
authority: Literal['user', 'authoritative_source']
|
|
124
|
+
created_at: datetime
|
|
125
|
+
high_risk_per_call_approval_required: bool
|
|
126
|
+
high_risk_action_categories: list[
|
|
127
|
+
Literal['send', 'delete', 'publish', 'payment', 'external_write']
|
|
128
|
+
]
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
class WorkflowCandidate(StrictModel):
|
|
132
|
+
candidate_id: str
|
|
133
|
+
candidate_version: int = Field(default=1, ge=1)
|
|
134
|
+
evidence_revision: int = Field(default=1, ge=1)
|
|
135
|
+
decision_revision: int = Field(default=0, ge=0)
|
|
136
|
+
rule_fingerprint: str
|
|
137
|
+
workflow_key: str
|
|
138
|
+
condition: dict[str, object] = Field(default_factory=dict)
|
|
139
|
+
personal_space_id: str
|
|
140
|
+
personal_project_id: str | None = None
|
|
141
|
+
source_step_id: str
|
|
142
|
+
source_step_key: str
|
|
143
|
+
source_step_name: str
|
|
144
|
+
target_step_id: str
|
|
145
|
+
target_step_key: str
|
|
146
|
+
target_step_name: str
|
|
147
|
+
status: WorkflowCandidateStatus
|
|
148
|
+
occurrence_count: int = Field(ge=3)
|
|
149
|
+
distinct_session_count: int = Field(ge=0)
|
|
150
|
+
recency: WorkflowRecency
|
|
151
|
+
confirmation_authority: WorkflowConfirmationAuthority
|
|
152
|
+
negative_evidence_count: int = Field(ge=0)
|
|
153
|
+
decline_count: int = Field(ge=0)
|
|
154
|
+
reviewed_at: datetime | None = None
|
|
155
|
+
review_reason: str | None = None
|
|
156
|
+
recommendation: WorkflowRecommendation
|
|
157
|
+
execution_authorized: bool
|
|
158
|
+
authorization: WorkflowAuthorization | None = None
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
class WorkflowRecommendationPage(StrictModel):
|
|
162
|
+
policy: WorkflowRecommendationPolicy
|
|
163
|
+
candidates: list[WorkflowCandidate]
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
class WorkflowCandidatePage(StrictModel):
|
|
167
|
+
policy: WorkflowRecommendationPolicy
|
|
168
|
+
candidates: list[WorkflowCandidate]
|