fuli-context 0.8.1 → 0.8.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.
Files changed (79) hide show
  1. package/README.md +11 -7
  2. package/README.zh-CN.md +8 -7
  3. package/dist/web/assets/{AboutPage-fBq5VFoQ.js → AboutPage-HLhChD_Q.js} +1 -1
  4. package/dist/web/assets/{AgentHand-CMZk5GjY.js → AgentHand-BaLSbn08.js} +1 -1
  5. package/dist/web/assets/{AgentName-DRZHAIB2.js → AgentName-0PIU7MOX.js} +1 -1
  6. package/dist/web/assets/{AgentProfilePage-BPQEfMhB.js → AgentProfilePage-9cSsZHnk.js} +1 -1
  7. package/dist/web/assets/{AgentsDirectoryPage-CKZfrcuD.js → AgentsDirectoryPage-7G02Xm6C.js} +1 -1
  8. package/dist/web/assets/{ConnectionsPage-COb56qnk.js → ConnectionsPage-D0wPYbwd.js} +1 -1
  9. package/dist/web/assets/{EmployeeRecruitDialog-BLTpjCcK.js → EmployeeRecruitDialog-BrPH3e50.js} +1 -1
  10. package/dist/web/assets/{EmployeeWorkbenchPage-HUd-gne2.js → EmployeeWorkbenchPage-u-jw38PW.js} +1 -1
  11. package/dist/web/assets/{GrowthLoading-Bu_kH-I8.js → GrowthLoading-DFOy-mEl.js} +1 -1
  12. package/dist/web/assets/{KnowledgeEditDialog-BTwXXRCD.js → KnowledgeEditDialog-DBsjlkDr.js} +1 -1
  13. package/dist/web/assets/{KnowledgeInspector-Ct5hl2--.js → KnowledgeInspector-C79hbuOo.js} +1 -1
  14. package/dist/web/assets/{KnowledgeOrganizerPage-DMC8Hh43.js → KnowledgeOrganizerPage-Cz1BnAtz.js} +1 -1
  15. package/dist/web/assets/KnowledgePage-JyfFFUrg.js +1 -0
  16. package/dist/web/assets/{KnowledgeWorkspace-DmHIc0jb.js → KnowledgeWorkspace-B2vj12QG.js} +1 -1
  17. package/dist/web/assets/{NotFoundPage-C0yOR9T9.js → NotFoundPage-D340EQJP.js} +1 -1
  18. package/dist/web/assets/{OverviewPage-BreX_kb4.js → OverviewPage-BKiYudrC.js} +1 -1
  19. package/dist/web/assets/{PersonalProfilePage-CX1a6_E3.js → PersonalProfilePage-BIGTcem2.js} +1 -1
  20. package/dist/web/assets/PersonalProjectsPage-CzjDCIi0.js +1 -0
  21. package/dist/web/assets/{ProjectAgentsPage-CA04h1Uf.js → ProjectAgentsPage-C5F2WgwJ.js} +4 -4
  22. package/dist/web/assets/ProjectAgentsPage-C89ZEDgi.css +1 -0
  23. package/dist/web/assets/{ProjectScopePicker-DVHfXX1f.js → ProjectScopePicker-8hrgvmg-.js} +1 -1
  24. package/dist/web/assets/{PublicProjectsPage-CtctKml1.js → PublicProjectsPage-b5zx0dFS.js} +1 -1
  25. package/dist/web/assets/{ReviewPage-DUqaK-do.js → ReviewPage-BLdWYDmj.js} +1 -1
  26. package/dist/web/assets/{SearchableSelect-BZtyYmZN.js → SearchableSelect-vaoSDq1g.js} +1 -1
  27. package/dist/web/assets/{SettingsPage-CB4ymLr8.js → SettingsPage-Dxjrkq1g.js} +1 -1
  28. package/dist/web/assets/{SharedJefaReportPage-CbFtrDCY.js → SharedJefaReportPage-YG2xwQQy.js} +1 -1
  29. package/dist/web/assets/{WritingTastePage-B7lSzs2z.js → WritingTastePage-CPPduPb1.js} +1 -1
  30. package/dist/web/assets/{agent-profile.css_vue_type_style_index_0_src_true_lang-C22UdfU0.js → agent-profile.css_vue_type_style_index_0_src_true_lang-LTJ1ptv9.js} +1 -1
  31. package/dist/web/assets/{catalog-DU4Kfd-N.js → catalog-B9tlJAp9.js} +1 -1
  32. package/dist/web/assets/{client-CEHkJJ-5.js → client-InXscj8J.js} +1 -1
  33. package/dist/web/assets/{console--CZxc3PW.js → console-hUns2aD-.js} +1 -1
  34. package/dist/web/assets/{conversation-launcher-settings-Co1RlTFH.js → conversation-launcher-settings-DEtJ6pZg.js} +1 -1
  35. package/dist/web/assets/{i18n-BtOOoyJd.js → i18n-75woNt31.js} +2 -2
  36. package/dist/web/assets/{identity-CsowvtIm.js → identity-Wt2Xio_B.js} +1 -1
  37. package/dist/web/assets/index-pleRuLpw.js +2 -0
  38. package/dist/web/assets/{model-CGpllrds.js → model-C1GwBvd9.js} +1 -1
  39. package/dist/web/assets/{personal-profile-graph-BNTG4PSY.js → personal-profile-graph-BdV_3I1u.js} +1 -1
  40. package/dist/web/assets/{shared-report-BFUJqqQe.js → shared-report-tRQV1iJl.js} +1 -1
  41. package/dist/web/assets/{useApi-CROJJdhE-raNlHRDl.js → useApi-CROJJdhE-QfNm4ADP.js} +1 -1
  42. package/dist/web/assets/{useModalDialog-CroGk2Cs.js → useModalDialog-BopF-KHN.js} +1 -1
  43. package/dist/web/assets/{vue-router-JFYBLXB1.js → vue-router-COCNAJJn.js} +1 -1
  44. package/dist/web/index.html +10 -10
  45. package/docs/agent-conversations-and-collaboration.md +18 -1
  46. package/docs/agent-interface-architecture.md +17 -0
  47. package/docs/employee-agents.md +14 -1
  48. package/docs/project-agent-memory.md +6 -1
  49. package/graph-provider/fuli_graph/knowledge_search.py +8 -16
  50. package/graph-provider/fuli_graph/project_agent_routes.py +5 -1
  51. package/graph-provider/fuli_graph/store_project_agent_context.py +18 -1
  52. package/graph-provider/fuli_graph/store_project_agent_task_staffing.py +86 -11
  53. package/graph-provider/pyproject.toml +1 -1
  54. package/npm-shrinkwrap.json +15 -15
  55. package/package.json +4 -4
  56. package/skills/capturing-session-knowledge/SKILL.md +20 -2
  57. package/skills/operating-fuli/SKILL.md +8 -0
  58. package/src/agent-tools/employee-definitions.js +6 -5
  59. package/src/agent-tools/graph-definitions.js +2 -2
  60. package/src/agents/identity-receipt.js +29 -0
  61. package/src/conversations/task-context-view.js +3 -1
  62. package/src/employees/service.js +17 -3
  63. package/src/employees/task-entry.js +5 -1
  64. package/src/graphiti/agent-conversations.js +15 -1
  65. package/src/graphiti/agent-knowledge-workflows.js +1 -1
  66. package/src/graphiti/federated-application.js +6 -40
  67. package/src/graphiti/project-agent-mention.js +35 -0
  68. package/src/graphiti/project-agent-task-entry.js +22 -3
  69. package/src/graphiti/project-agent-workflows.js +13 -2
  70. package/src/graphiti/project-path-context.js +17 -10
  71. package/src/graphiti/task-entry-preferences.js +50 -0
  72. package/src/mcp/create-mcp-server.js +6 -1
  73. package/src/mcp/employee-tool-catalog.js +22 -0
  74. package/src/mcp/tool-result.js +3 -1
  75. package/dist/web/assets/KnowledgePage-uXW1Eovz.js +0 -1
  76. package/dist/web/assets/PersonalProjectsPage-Br1S8ETM.js +0 -1
  77. package/dist/web/assets/ProjectAgentsPage-CZWWV4Kw.css +0 -1
  78. package/dist/web/assets/index-MKmHNBtc.js +0 -2
  79. package/src/mcp/task-context-registry.js +0 -165
@@ -1,165 +0,0 @@
1
- import { randomUUID } from 'node:crypto';
2
-
3
- import { ApplicationError, ApplicationErrorCode } from '../app/application-error.js';
4
-
5
- const MAX_ACTIVE_SESSIONS = 256;
6
-
7
- function unknownTokenError() {
8
- return new ApplicationError(
9
- ApplicationErrorCode.NOT_FOUND,
10
- 'Fuli task context token is unknown or superseded. Call begin_task_context for the current session and use the token it returns.'
11
- );
12
- }
13
-
14
- export class TaskContextRegistry {
15
- constructor({ tokenFactory = () => `fuli-task-${randomUUID()}` } = {}) {
16
- this.tokenFactory = tokenFactory;
17
- this.sessions = new Map();
18
- this.tokens = new Map();
19
- }
20
-
21
- begin({ sessionId, turnId = null, personalProjectId, projectAgentId = null,
22
- sourceApplication = 'other', sourceSessionId = null, memoryRevision = null, workLogRequired = false }) {
23
- assertNonEmpty(sessionId, 'sessionId');
24
- const key = sessionKey(sourceApplication, sessionId);
25
- const previous = this.sessions.get(key) ?? null;
26
- if (!previous) this.#reserveSessionSlot();
27
- if (previous) this.tokens.delete(previous.token);
28
-
29
- const task = {
30
- token: this.tokenFactory(),
31
- sessionId,
32
- turnId,
33
- personalProjectId: personalProjectId ?? null,
34
- projectAgentId,
35
- sourceApplication,
36
- sourceSessionId,
37
- memoryRevision,
38
- workLogRequired,
39
- agentMemory: null,
40
- checkpoint: null
41
- };
42
- this.sessions.delete(key);
43
- this.sessions.set(key, task);
44
- this.tokens.set(task.token, task);
45
- return {
46
- ...snapshot(task),
47
- previousCheckpointMissing: Boolean(previous && (!previous.checkpoint || previous.checkpoint.phase === 'prepare'))
48
- };
49
- }
50
-
51
- checkpoint(token, checkpoint, sourceApplication = 'other') {
52
- const task = this.#task(token, sourceApplication);
53
- if (task.checkpoint?.phase === 'prepare') {
54
- if (!sameCheckpointClaim(task.checkpoint, checkpoint)) {
55
- throw checkpointConflict('Task checkpoint has different input');
56
- }
57
- } else if (task.checkpoint) {
58
- if (sameCheckpoint(task.checkpoint, checkpoint)) return snapshot(task);
59
- throw checkpointConflict(
60
- 'Fuli task context has already been checkpointed with a different disposition'
61
- );
62
- }
63
- task.checkpoint = Object.freeze({ ...checkpoint, phase: 'complete' });
64
- return snapshot(task);
65
- }
66
-
67
- prepare(token, checkpoint, sourceApplication = 'other', agentMemory = null) {
68
- const task = this.#task(token, sourceApplication);
69
- if (agentMemory !== null && agentMemory !== undefined) {
70
- throw new ApplicationError(
71
- ApplicationErrorCode.VALIDATION,
72
- 'The in-memory task context registry cannot atomically persist durable Agent memory'
73
- );
74
- }
75
- if (task.checkpoint && !sameCheckpointClaim(task.checkpoint, checkpoint)) {
76
- throw checkpointConflict('Task checkpoint has different input');
77
- }
78
- if (!task.checkpoint) task.checkpoint = { ...checkpoint, phase: 'prepare' };
79
- return snapshot(task);
80
- }
81
-
82
- context(token, sourceApplication = 'other') {
83
- return snapshot(this.#task(token, sourceApplication));
84
- }
85
-
86
- #task(token, sourceApplication) {
87
- assertNonEmpty(token, 'taskContextToken');
88
- const task = this.tokens.get(token);
89
- if (!task || task.sourceApplication !== sourceApplication) throw unknownTokenError();
90
- const key = sessionKey(task.sourceApplication, task.sessionId);
91
- if (this.sessions.get(key) !== task) throw unknownTokenError();
92
- this.sessions.delete(key);
93
- this.sessions.set(key, task);
94
- return task;
95
- }
96
-
97
- verify(sessionId, sourceApplication = 'other') {
98
- assertNonEmpty(sessionId, 'sessionId');
99
- const task = this.sessions.get(sessionKey(sourceApplication, sessionId));
100
- if (!task) {
101
- return {
102
- status: 'not_started',
103
- guidance: 'No Fuli task context was started; do not block the Agent.'
104
- };
105
- }
106
- if (task.checkpoint && task.checkpoint.phase !== 'prepare') {
107
- return {
108
- status: 'checkpointed',
109
- disposition: task.checkpoint.disposition
110
- };
111
- }
112
- return {
113
- status: 'checkpoint_required',
114
- decision: 'block',
115
- task_context_token: task.token,
116
- reason: `FULI_CHECKPOINT_REQUIRED: ${task.token} Before finishing, call checkpoint_task_knowledge once with either a bounded durable candidate batch or retain_nothing. Do not store raw transcripts, guesses, or temporary output.`
117
- };
118
- }
119
-
120
- #reserveSessionSlot() {
121
- if (this.sessions.size < MAX_ACTIVE_SESSIONS) return;
122
- for (const [key, task] of this.sessions) {
123
- if (task.checkpoint?.phase !== 'complete') continue;
124
- this.sessions.delete(key);
125
- this.tokens.delete(task.token);
126
- return;
127
- }
128
- throw new ApplicationError(
129
- ApplicationErrorCode.VALIDATION,
130
- 'Fuli has too many unfinished in-memory task contexts; finish an existing context or restart this fallback MCP process'
131
- );
132
- }
133
- }
134
-
135
- function snapshot(task) {
136
- return structuredClone(task);
137
- }
138
-
139
- function sessionKey(sourceApplication, sessionId) {
140
- return JSON.stringify([sourceApplication, sessionId]);
141
- }
142
-
143
- function assertNonEmpty(value, label) {
144
- if (typeof value !== 'string' || !value.trim()) {
145
- throw new ApplicationError(
146
- ApplicationErrorCode.VALIDATION,
147
- `${label} must be a nonempty string`
148
- );
149
- }
150
- }
151
-
152
- function sameCheckpoint(left, right) {
153
- return sameCheckpointClaim(left, right)
154
- && left.captureStatus === right.captureStatus;
155
- }
156
-
157
- function sameCheckpointClaim(left, right) {
158
- return left.fingerprint === right.fingerprint
159
- && left.disposition === right.disposition
160
- && left.reason === right.reason;
161
- }
162
-
163
- function checkpointConflict(message) {
164
- return new ApplicationError(ApplicationErrorCode.VALIDATION, message);
165
- }