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.
Files changed (107) hide show
  1. package/README.md +170 -18
  2. package/README.zh-CN.md +146 -12
  3. package/compose.graphiti.yml +2 -0
  4. package/dist/web/assets/{AboutPage-qeO_vm0T.js → AboutPage-CftRexSY.js} +1 -1
  5. package/dist/web/assets/{ConnectionsPage-DO0GR9Xg.js → ConnectionsPage-D5J91x6d.js} +1 -1
  6. package/dist/web/assets/{useMinimumLoadingDisplay-BpCyBeko.css → KnowledgeEditDialog-DWUV_NPp.css} +1 -1
  7. package/dist/web/assets/KnowledgeEditDialog-wotVahvr.js +1 -0
  8. package/dist/web/assets/{KnowledgeInspector-Bjhdu2mf.css → KnowledgeInspector--1NujtXW.css} +1 -1
  9. package/dist/web/assets/KnowledgeInspector-BzkW0mVs.js +1 -0
  10. package/dist/web/assets/KnowledgeOrganizerPage-BebUDiHt.js +1 -0
  11. package/dist/web/assets/KnowledgePage-OUT07aKH.js +1 -0
  12. package/dist/web/assets/KnowledgeWorkspace-1pHJ0MNZ.js +4 -0
  13. package/dist/web/assets/{OverviewPage-CmCcDCAs.js → OverviewPage-CHE6XhdS.js} +1 -1
  14. package/dist/web/assets/PersonalProfilePage-B7T09bow.css +1 -0
  15. package/dist/web/assets/PersonalProfilePage-CXXiabUy.js +1 -0
  16. package/dist/web/assets/PersonalProjectsPage-d2wYGW8n.js +1 -0
  17. package/dist/web/assets/PublicProjectsPage-hxLShtnZ.js +1 -0
  18. package/dist/web/assets/{ReviewPage-B3vnZ6gn.js → ReviewPage-DUeyu7E8.js} +1 -1
  19. package/dist/web/assets/{SearchableSelect-ih69qbcS.js → SearchableSelect-C5RiB5F8.js} +1 -1
  20. package/dist/web/assets/SettingsPage-BMuASSzQ.js +1 -0
  21. package/dist/web/assets/SettingsPage-CAfz4qiV.css +1 -0
  22. package/dist/web/assets/WritingTastePage-B9BCYIwQ.js +1 -0
  23. package/dist/web/assets/WritingTastePage-DSgvTH6x.css +1 -0
  24. package/dist/web/assets/{console-DE40hXGC.js → console-DMvHxKf9.js} +1 -1
  25. package/dist/web/assets/conversation-launcher-settings-Dnlcw7Rj.js +1 -0
  26. package/dist/web/assets/{i18n-CDxBs1sz.js → i18n-CWfd8Dtt.js} +1 -1
  27. package/dist/web/assets/{identity-BCxb1mcy.js → identity-C9mLdR8L.js} +1 -1
  28. package/dist/web/assets/index-F5e2sQ7p.js +2 -0
  29. package/dist/web/assets/{index-CCOGfZzE.css → index-X2j29j8i.css} +1 -1
  30. package/dist/web/assets/{model-CCMdt10Q.js → model-CsYAR8O3.js} +1 -1
  31. package/dist/web/assets/paths-CDREouhi.js +1 -0
  32. package/dist/web/assets/useApi-CROJJdhE-BLQiPVw0.js +1 -0
  33. package/dist/web/assets/vue-router-DN8x6iY1.js +1 -0
  34. package/dist/web/index.html +7 -6
  35. package/graph-provider/fuli_graph/app.py +238 -2
  36. package/graph-provider/fuli_graph/auth.py +18 -0
  37. package/graph-provider/fuli_graph/collaboration_context.py +253 -17
  38. package/graph-provider/fuli_graph/common_knowledge.py +6 -2
  39. package/graph-provider/fuli_graph/config.py +5 -0
  40. package/graph-provider/fuli_graph/graph_models.py +6 -0
  41. package/graph-provider/fuli_graph/graph_projection.py +14 -0
  42. package/graph-provider/fuli_graph/graph_query.py +27 -3
  43. package/graph-provider/fuli_graph/knowledge_management.py +19 -1
  44. package/graph-provider/fuli_graph/knowledge_search.py +11 -0
  45. package/graph-provider/fuli_graph/models.py +15 -2
  46. package/graph-provider/fuli_graph/personal_global_preference_models.py +234 -0
  47. package/graph-provider/fuli_graph/personal_global_preferences.py +1247 -0
  48. package/graph-provider/fuli_graph/project_action_models.py +22 -0
  49. package/graph-provider/fuli_graph/project_knowledge.py +121 -2
  50. package/graph-provider/fuli_graph/provider_values.py +24 -0
  51. package/graph-provider/fuli_graph/runtime.py +78 -0
  52. package/graph-provider/fuli_graph/search_projection.py +14 -1
  53. package/graph-provider/fuli_graph/store_knowledge.py +116 -2
  54. package/graph-provider/fuli_graph/workflow_candidate_models.py +168 -0
  55. package/graph-provider/fuli_graph/workflow_candidates.py +996 -0
  56. package/graph-provider/fuli_graph/workflow_observation_models.py +30 -0
  57. package/graph-provider/fuli_graph/workflow_observations.py +84 -0
  58. package/graph-provider/pyproject.toml +1 -1
  59. package/npm-shrinkwrap.json +18 -18
  60. package/package.json +4 -4
  61. package/skills/capturing-session-knowledge/SKILL.md +32 -5
  62. package/skills/flreview/SKILL.md +4 -3
  63. package/src/agent-tools/graph-definitions.js +136 -20
  64. package/src/agent-tools/graph-handlers.js +10 -4
  65. package/src/cli/command-registry.js +1 -1
  66. package/src/cli/local-runtime-command.js +69 -2
  67. package/src/graphiti/agent-knowledge-workflows.js +497 -16
  68. package/src/graphiti/collaboration-preference-projection.js +162 -0
  69. package/src/graphiti/federated-application.js +155 -161
  70. package/src/graphiti/federated-search-support.js +102 -0
  71. package/src/graphiti/knowledge-provider-mapping.js +15 -0
  72. package/src/graphiti/provider-client.js +162 -10
  73. package/src/graphiti/related-project-suggestions.js +109 -0
  74. package/src/graphiti/runtime-config.js +14 -0
  75. package/src/graphiti/source-marker.js +2 -2
  76. package/src/graphiti/user-taste-skill.js +241 -0
  77. package/src/graphiti/workflow-candidate-mapping.js +87 -0
  78. package/src/graphiti/workflow-observation.js +82 -0
  79. package/src/graphiti/writing-taste-profile-workflow.js +25 -0
  80. package/src/graphiti/writing-taste-profile.js +490 -0
  81. package/src/http/graph-api-router.js +15 -2
  82. package/src/mcp/context-resources.js +158 -0
  83. package/src/mcp/create-mcp-server.js +39 -5
  84. package/src/mcp/instructions.js +5 -7
  85. package/src/mcp/session-id.js +60 -0
  86. package/src/mcp/task-context-registry.js +15 -3
  87. package/src/mcp/tool-annotations.js +8 -1
  88. package/src/mcp/tool-result.js +28 -4
  89. package/src/server.js +0 -1
  90. package/src/setup/claude-code-config.js +17 -6
  91. package/src/setup/graph-runtime.js +20 -2
  92. package/src/system/runtime-settings.js +121 -2
  93. package/src/system/system-service.js +5 -1
  94. package/dist/web/assets/KnowledgeInspector-DEW5lA1m.js +0 -1
  95. package/dist/web/assets/KnowledgeOrganizerPage-BkM568Ld.js +0 -1
  96. package/dist/web/assets/KnowledgePage-BAT4aZIm.js +0 -1
  97. package/dist/web/assets/KnowledgeWorkspace-DyGtBz--.js +0 -4
  98. package/dist/web/assets/PersonalProfilePage-C42mwKN8.js +0 -1
  99. package/dist/web/assets/PersonalProfilePage-CdmEzyvZ.css +0 -1
  100. package/dist/web/assets/PersonalProjectsPage-BwaXR62K.js +0 -1
  101. package/dist/web/assets/PublicProjectsPage-egKBulOq.js +0 -1
  102. package/dist/web/assets/SettingsPage-C6ouU0sR.css +0 -1
  103. package/dist/web/assets/SettingsPage-oLE8mNs5.js +0 -1
  104. package/dist/web/assets/index-BzhNfzU_.js +0 -2
  105. package/dist/web/assets/paths-DwHeiGMT.js +0 -1
  106. package/dist/web/assets/useMinimumLoadingDisplay-HdI7XAmu.js +0 -1
  107. 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]