fuli-context 0.7.4-beta.2 → 0.7.5

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 (133) hide show
  1. package/README.md +93 -7
  2. package/README.zh-CN.md +84 -7
  3. package/compose.graphiti.yml +6 -6
  4. package/dist/web/assets/AboutPage-ByCUor-j.js +1 -0
  5. package/dist/web/assets/ConnectionsPage-DkdkZ40Q.js +1 -0
  6. package/dist/web/assets/KnowledgeEditDialog-DSe3Gwep.js +1 -0
  7. package/dist/web/assets/KnowledgeInspector-CYAjAb9J.js +1 -0
  8. package/dist/web/assets/KnowledgeOrganizerPage-CV4F54R_.js +1 -0
  9. package/dist/web/assets/KnowledgePage-vYYXipOi.js +1 -0
  10. package/dist/web/assets/KnowledgeWorkspace-z4u5mXOG.js +4 -0
  11. package/dist/web/assets/OverviewPage-BWOfeS6k.js +1 -0
  12. package/dist/web/assets/PersonalProfilePage-c3w4-h7a.js +1 -0
  13. package/dist/web/assets/PersonalProjectsPage-B7AlLEwf.js +1 -0
  14. package/dist/web/assets/ProjectAgentsPage-CgftpIPB.css +1 -0
  15. package/dist/web/assets/ProjectAgentsPage-DTHcL_ox.js +11 -0
  16. package/dist/web/assets/PublicProjectsPage-DdH0oGB3.js +1 -0
  17. package/dist/web/assets/ReviewPage-BYIpcIHG.js +1 -0
  18. package/dist/web/assets/SearchableSelect-Dz13ClQb.js +1 -0
  19. package/dist/web/assets/SettingsPage-2VkbXgZi.js +1 -0
  20. package/dist/web/assets/SettingsPage-CwZp2ka4.css +1 -0
  21. package/dist/web/assets/WritingTastePage-BOPQZuva.js +1 -0
  22. package/dist/web/assets/{console-DMvHxKf9.js → console-BlAhujsH.js} +1 -1
  23. package/dist/web/assets/{conversation-launcher-settings-Dnlcw7Rj.js → conversation-launcher-settings-DTYxiLJt.js} +1 -1
  24. package/dist/web/assets/i18n-Ci3heuiL.js +9 -0
  25. package/dist/web/assets/{identity-C9mLdR8L.js → identity-4_-v6cB7.js} +1 -1
  26. package/dist/web/assets/index-BnH5mcZx.css +1 -0
  27. package/dist/web/assets/index-C67Q0JY2.js +2 -0
  28. package/dist/web/assets/{model-CsYAR8O3.js → model-yG0YqUyZ.js} +1 -1
  29. package/dist/web/assets/{useApi-CROJJdhE-BLQiPVw0.js → useApi-CROJJdhE-twhdZArA.js} +1 -1
  30. package/dist/web/assets/vue-router-C-wot_Di.js +1 -0
  31. package/dist/web/index.html +6 -6
  32. package/docs/public-personal-architecture.md +73 -0
  33. package/graph-provider/fuli_graph/app.py +8 -0
  34. package/graph-provider/fuli_graph/collaboration_context.py +69 -6
  35. package/graph-provider/fuli_graph/knowledge_search.py +84 -5
  36. package/graph-provider/fuli_graph/model_validation.py +134 -0
  37. package/graph-provider/fuli_graph/models.py +24 -5
  38. package/graph-provider/fuli_graph/project_agent_access.py +54 -0
  39. package/graph-provider/fuli_graph/project_agent_executor_models.py +635 -0
  40. package/graph-provider/fuli_graph/project_agent_models.py +278 -0
  41. package/graph-provider/fuli_graph/project_agent_routes.py +597 -0
  42. package/graph-provider/fuli_graph/project_agent_task_models.py +542 -0
  43. package/graph-provider/fuli_graph/runtime.py +259 -0
  44. package/graph-provider/fuli_graph/search_projection.py +3 -0
  45. package/graph-provider/fuli_graph/store.py +6 -0
  46. package/graph-provider/fuli_graph/store_knowledge.py +62 -9
  47. package/graph-provider/fuli_graph/store_project_agent_executor_learning.py +756 -0
  48. package/graph-provider/fuli_graph/store_project_agent_executor_routing.py +601 -0
  49. package/graph-provider/fuli_graph/store_project_agent_executors.py +1087 -0
  50. package/graph-provider/fuli_graph/store_project_agent_task_reads.py +458 -0
  51. package/graph-provider/fuli_graph/store_project_agent_task_recruitment.py +699 -0
  52. package/graph-provider/fuli_graph/store_project_agent_task_staffing.py +409 -0
  53. package/graph-provider/fuli_graph/store_project_agent_tasks.py +1144 -0
  54. package/graph-provider/fuli_graph/store_project_agents.py +965 -0
  55. package/graph-provider/pyproject.toml +2 -1
  56. package/npm-shrinkwrap.json +2 -2
  57. package/package.json +2 -1
  58. package/skills/capturing-session-knowledge/SKILL.md +43 -2
  59. package/src/adaptive-runtime/executor-pool.js +127 -0
  60. package/src/adaptive-runtime/graph-services.js +166 -0
  61. package/src/adaptive-runtime/lease-client.js +335 -0
  62. package/src/adaptive-runtime/runtime-broker.js +318 -0
  63. package/src/adaptive-runtime/settings.js +111 -0
  64. package/src/adaptive-runtime/state.js +74 -0
  65. package/src/agent-tools/graph-definitions.js +396 -0
  66. package/src/agent-tools/graph-handlers.js +61 -0
  67. package/src/agent-tools/project-agent-definitions.js +307 -0
  68. package/src/backup/graph-backup.js +289 -0
  69. package/src/backup/identity-reconciliation.js +208 -0
  70. package/src/backup/runtime-adapters.js +269 -0
  71. package/src/cli/command-registry.js +7 -2
  72. package/src/cli/graph-data-command.js +112 -0
  73. package/src/cli/local-runtime-command.js +16 -2
  74. package/src/cli/setup-command.js +19 -3
  75. package/src/cli/update-command.js +4 -0
  76. package/src/cli/workspace-connection-command.js +333 -0
  77. package/src/cli.js +11 -0
  78. package/src/graphiti/collaboration-preference-projection.js +29 -1
  79. package/src/graphiti/collaboration-preference-workflow.js +121 -0
  80. package/src/graphiti/federated-application.js +74 -112
  81. package/src/graphiti/knowledge-provider-mapping.js +7 -1
  82. package/src/graphiti/project-agent-control-plane.js +263 -0
  83. package/src/graphiti/project-agent-mapping.js +1003 -0
  84. package/src/graphiti/project-agent-workflows.js +557 -0
  85. package/src/graphiti/provider-client.js +270 -1
  86. package/src/graphiti/runtime-config.js +6 -1
  87. package/src/graphiti/workspace-provider-client.js +403 -0
  88. package/src/http/api-router.js +63 -9
  89. package/src/http/graph-api-router.js +278 -0
  90. package/src/local-runtime/lifecycle.js +46 -10
  91. package/src/mcp/context-resources.js +15 -6
  92. package/src/mcp/create-mcp-server.js +51 -16
  93. package/src/mcp/instructions.js +7 -5
  94. package/src/mcp/runtime.js +17 -5
  95. package/src/mcp/session-id.js +38 -1
  96. package/src/mcp/tool-annotations.js +69 -0
  97. package/src/mcp-server.js +23 -6
  98. package/src/native-runtime/runtime.js +717 -0
  99. package/src/server.js +6 -2
  100. package/src/setup/agent-installation-status.js +7 -1
  101. package/src/setup/agents.js +3 -1
  102. package/src/setup/claude-code-config.js +3 -1
  103. package/src/setup/codex-bootstrap.js +11 -10
  104. package/src/setup/codex-config.js +7 -1
  105. package/src/setup/cursor-config.js +3 -1
  106. package/src/setup/graph-runtime.js +158 -13
  107. package/src/setup/neo4j-memory-profile.js +43 -0
  108. package/src/setup/options.js +38 -2
  109. package/src/setup/paths.js +14 -0
  110. package/src/setup/setup.js +37 -1
  111. package/src/system/resource-monitor.js +181 -16
  112. package/src/system/runtime-settings.js +10 -1
  113. package/src/system/system-service.js +27 -2
  114. package/dist/web/assets/AboutPage-CftRexSY.js +0 -1
  115. package/dist/web/assets/ConnectionsPage-D5J91x6d.js +0 -1
  116. package/dist/web/assets/KnowledgeEditDialog-wotVahvr.js +0 -1
  117. package/dist/web/assets/KnowledgeInspector-BzkW0mVs.js +0 -1
  118. package/dist/web/assets/KnowledgeOrganizerPage-BebUDiHt.js +0 -1
  119. package/dist/web/assets/KnowledgePage-OUT07aKH.js +0 -1
  120. package/dist/web/assets/KnowledgeWorkspace-1pHJ0MNZ.js +0 -4
  121. package/dist/web/assets/OverviewPage-CHE6XhdS.js +0 -1
  122. package/dist/web/assets/PersonalProfilePage-CXXiabUy.js +0 -1
  123. package/dist/web/assets/PersonalProjectsPage-d2wYGW8n.js +0 -1
  124. package/dist/web/assets/PublicProjectsPage-hxLShtnZ.js +0 -1
  125. package/dist/web/assets/ReviewPage-DUeyu7E8.js +0 -1
  126. package/dist/web/assets/SearchableSelect-C5RiB5F8.js +0 -1
  127. package/dist/web/assets/SettingsPage-BMuASSzQ.js +0 -1
  128. package/dist/web/assets/SettingsPage-CAfz4qiV.css +0 -1
  129. package/dist/web/assets/WritingTastePage-B9BCYIwQ.js +0 -1
  130. package/dist/web/assets/i18n-CWfd8Dtt.js +0 -5
  131. package/dist/web/assets/index-X2j29j8i.css +0 -1
  132. package/dist/web/assets/index-nP5p5OaY.js +0 -2
  133. package/dist/web/assets/vue-router-DN8x6iY1.js +0 -1
@@ -1,16 +1,28 @@
1
1
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
2
2
 
3
+ import {
4
+ bindRuntimeLeaseAgentTools,
5
+ createRuntimeLeaseClient
6
+ } from '../adaptive-runtime/lease-client.js';
3
7
  import { openFederatedGraphApplication } from '../graphiti/federated-application.js';
4
8
  import { createMcpServer } from './create-mcp-server.js';
5
9
 
6
- export async function runStdio({ runtimeConfigPath }) {
10
+ export async function runStdio({ runtimeConfigPath, sourceApplication }) {
7
11
  const app = openFederatedGraphApplication({ runtimeConfigPath });
8
- const server = createServerOrClose(app);
12
+ const leaseClient = createRuntimeLeaseClient({ runtimeConfigPath });
13
+ bindRuntimeLeaseAgentTools(app, leaseClient);
14
+ const server = createServerOrClose(app, createMcpServer, {
15
+ sourceApplication,
16
+ withRuntimeLease: leaseClient.withGraphLease
17
+ });
9
18
  const transport = new StdioServerTransport();
10
19
  const signalHandlers = new Map();
11
20
  const close = createCloseOnce({
12
21
  closeServer: () => server.close(),
13
- closeApplication: () => app.close(),
22
+ closeApplication: async () => {
23
+ await leaseClient.close();
24
+ return app.close();
25
+ },
14
26
  afterClose: () => removeHandlers(signalHandlers)
15
27
  });
16
28
  const quietClose = createQuietCloser(close, () => { process.exitCode = 1; });
@@ -31,9 +43,9 @@ export async function runStdio({ runtimeConfigPath }) {
31
43
  }
32
44
  }
33
45
 
34
- export function createServerOrClose(app, factory = createMcpServer) {
46
+ export function createServerOrClose(app, factory = createMcpServer, options) {
35
47
  try {
36
- return factory(app);
48
+ return factory(app, options);
37
49
  } catch (error) {
38
50
  void app.close();
39
51
  throw error;
@@ -2,6 +2,17 @@ import { randomUUID } from 'node:crypto';
2
2
 
3
3
  const UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
4
4
  const WORKFLOW_OBSERVATION_TOOL = 'record_workflow_transition_observation';
5
+ const PROJECT_AGENT_SOURCE_TOOLS = new Set([
6
+ 'create_project_agent_assignment',
7
+ 'replace_project_agent_assignment',
8
+ 'coordinate_project_agent_task',
9
+ 'submit_project_agent_task',
10
+ 'get_project_agent_context',
11
+ 'record_project_agent_task_activity',
12
+ 'preflight_executor',
13
+ 'report_executor_health',
14
+ 'record_project_agent_executor_actual'
15
+ ]);
5
16
 
6
17
  const SESSION_ID_TOOLS = new Set([
7
18
  'begin_task_context',
@@ -31,7 +42,8 @@ export function normalizeAgentSessionInput(
31
42
  input,
32
43
  nativeThreadId,
33
44
  hostSessionId = nativeThreadId,
34
- clock = () => new Date()
45
+ clock = () => new Date(),
46
+ sourceApplication = nativeThreadId ? 'codex' : 'other'
35
47
  ) {
36
48
  if (name === WORKFLOW_OBSERVATION_TOOL) {
37
49
  if (!hostSessionId) {
@@ -51,6 +63,24 @@ export function normalizeAgentSessionInput(
51
63
  hostObservedAt: clock().toISOString()
52
64
  };
53
65
  }
66
+ if (PROJECT_AGENT_SOURCE_TOOLS.has(name)) {
67
+ if (!hostSessionId) {
68
+ throw new TypeError('Project Agent calls require an MCP host session');
69
+ }
70
+ const safeSourceApplication = normalizeMcpSourceApplication(sourceApplication);
71
+ const {
72
+ sourceApplication: _sourceApplication,
73
+ source_application: _source_application,
74
+ sourceSessionId: _sourceSessionId,
75
+ source_session_id: _source_session_id,
76
+ ...safeInput
77
+ } = input ?? {};
78
+ return {
79
+ ...safeInput,
80
+ sourceApplication: safeSourceApplication,
81
+ sourceSessionId: hostSessionId
82
+ };
83
+ }
54
84
  if (!nativeThreadId || !SESSION_ID_TOOLS.has(name)) return input;
55
85
  if (!input || typeof input !== 'object' || Array.isArray(input)) return input;
56
86
  if (typeof input.sessionId !== 'string' || input.sessionId.trim() === nativeThreadId) {
@@ -58,3 +88,10 @@ export function normalizeAgentSessionInput(
58
88
  }
59
89
  return { ...input, sessionId: nativeThreadId };
60
90
  }
91
+
92
+ export function normalizeMcpSourceApplication(value) {
93
+ if (!['codex', 'claude_code', 'cursor', 'kiro', 'other'].includes(value)) {
94
+ throw new TypeError('Unsupported MCP source application');
95
+ }
96
+ return value;
97
+ }
@@ -7,6 +7,19 @@ const READ_TOOLS = new Set([
7
7
  'preview_common_knowledge_promotion',
8
8
  'list_knowledge_spaces',
9
9
  'list_personal_projects',
10
+ 'list_project_agents',
11
+ 'get_project_agent',
12
+ 'list_project_agent_assignments',
13
+ 'get_project_agent_context',
14
+ 'view_project_agent_task',
15
+ 'view_project_agent_activity',
16
+ 'get_project_agent_recruitment_policy',
17
+ 'list_project_agent_recruitments',
18
+ 'list_executors',
19
+ 'get_executor',
20
+ 'list_executor_routing_rules',
21
+ 'get_executor_routing_rule',
22
+ 'list_project_agent_routing_learning',
10
23
  'list_knowledge_review_candidates',
11
24
  'list_workflow_candidates',
12
25
  'recommend_next_workflow_steps',
@@ -36,6 +49,32 @@ const WRITE_TOOLS = new Set([
36
49
  'search_human_knowledge_changes',
37
50
  'review_human_knowledge_change',
38
51
  'upsert_personal_project',
52
+ 'upsert_project_agent',
53
+ 'delete_project_agent',
54
+ 'cleanup_test_project_agents',
55
+ 'create_project_agent_assignment',
56
+ 'end_project_agent_assignment',
57
+ 'replace_project_agent_assignment',
58
+ 'coordinate_project_agent_task',
59
+ 'acquire_runtime_lease',
60
+ 'refresh_runtime_lease',
61
+ 'release_runtime_lease',
62
+ 'submit_project_agent_task',
63
+ 'record_project_agent_task_activity',
64
+ 'update_project_agent_recruitment_policy',
65
+ 'decide_project_agent_recruitment',
66
+ 'upsert_executor',
67
+ 'delete_executor',
68
+ 'preflight_executor',
69
+ 'authorize_executor',
70
+ 'report_executor_health',
71
+ 'upsert_executor_routing_rule',
72
+ 'update_executor_routing_rule',
73
+ 'delete_executor_routing_rule',
74
+ 'record_project_agent_task_outcome',
75
+ 'record_project_agent_executor_actual',
76
+ 'ignore_project_agent_routing_learning',
77
+ 'reset_project_agent_routing_learning',
39
78
  'start_knowledge_review',
40
79
  'record_knowledge_review_progress',
41
80
  'finish_knowledge_review',
@@ -69,12 +108,42 @@ export function annotationsFor(name) {
69
108
  readOnlyHint: readOnly,
70
109
  destructiveHint: DESTRUCTIVE_TOOLS.has(name),
71
110
  idempotentHint: readOnly || name === 'upsert_personal_project' ||
111
+ name === 'upsert_project_agent' ||
112
+ name === 'delete_project_agent' ||
113
+ name === 'cleanup_test_project_agents' ||
114
+ name === 'create_project_agent_assignment' ||
115
+ name === 'coordinate_project_agent_task' ||
116
+ name === 'refresh_runtime_lease' ||
117
+ name === 'release_runtime_lease' ||
118
+ name === 'submit_project_agent_task' ||
119
+ name === 'record_project_agent_task_activity' ||
120
+ name === 'record_project_agent_task_outcome' ||
121
+ name === 'record_project_agent_executor_actual' ||
122
+ name === 'upsert_executor' ||
123
+ name === 'preflight_executor' ||
124
+ name === 'authorize_executor' ||
125
+ name === 'report_executor_health' ||
126
+ name === 'upsert_executor_routing_rule' ||
127
+ name === 'update_executor_routing_rule' ||
72
128
  name === 'publish_personal_project' || name === 'unsubscribe_public_project' ||
73
129
  name === 'record_knowledge_usage' || name === 'record_decision_trace' ||
74
130
  name === 'record_knowledge_feedback' ||
75
131
  name === 'record_workflow_transition_observation' ||
76
132
  name === 'checkpoint_task_knowledge',
77
133
  openWorldHint: name === 'capture_session_knowledge' ||
134
+ name === 'coordinate_project_agent_task' ||
135
+ name === 'submit_project_agent_task' ||
136
+ name === 'record_project_agent_task_activity' ||
137
+ name === 'preflight_executor' ||
138
+ name === 'record_project_agent_task_outcome' ||
139
+ name === 'record_project_agent_executor_actual' ||
140
+ name === 'upsert_executor' ||
141
+ name === 'delete_executor' ||
142
+ name === 'authorize_executor' ||
143
+ name === 'report_executor_health' ||
144
+ name === 'upsert_executor_routing_rule' ||
145
+ name === 'update_executor_routing_rule' ||
146
+ name === 'delete_executor_routing_rule' ||
78
147
  name === 'record_workflow_transition_observation' ||
79
148
  name === 'search_connected_knowledge' ||
80
149
  name === 'record_decision_trace' ||
package/src/mcp-server.js CHANGED
@@ -1,5 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  import { callAgentTool, listAgentTools } from './agent-tools.js';
3
+ import {
4
+ bindRuntimeLeaseAgentTools,
5
+ createRuntimeLeaseClient
6
+ } from './adaptive-runtime/lease-client.js';
3
7
  import { ApplicationError } from './app/application-error.js';
4
8
  import { openFederatedGraphApplication } from './graphiti/federated-application.js';
5
9
  import {
@@ -7,6 +11,7 @@ import {
7
11
  resolveGraphRuntimeOptions
8
12
  } from './graphiti/runtime-config.js';
9
13
  import { runStdio } from './mcp/runtime.js';
14
+ import { normalizeMcpSourceApplication } from './mcp/session-id.js';
10
15
  import { applicationErrorMessage } from './mcp/tool-result.js';
11
16
 
12
17
  await main(process.argv.slice(2)).catch((error) => {
@@ -29,19 +34,30 @@ async function main(args) {
29
34
  await runCall({ args, runtimeConfigPath });
30
35
  return;
31
36
  }
32
- await runStdio({ runtimeConfigPath });
37
+ const configuredSourceApplication = args.includes('--source-application')
38
+ ? requiredOption(args, '--source-application')
39
+ : null;
40
+ await runStdio({
41
+ runtimeConfigPath,
42
+ sourceApplication: configuredSourceApplication
43
+ ? normalizeMcpSourceApplication(configuredSourceApplication)
44
+ : undefined
45
+ });
33
46
  }
34
47
 
35
48
  async function runCall({ args, runtimeConfigPath }) {
36
49
  const app = openFederatedGraphApplication({ runtimeConfigPath });
50
+ const leaseClient = createRuntimeLeaseClient({ runtimeConfigPath });
51
+ bindRuntimeLeaseAgentTools(app, leaseClient);
37
52
  try {
38
- const result = await callAgentTool(
39
- app,
40
- requiredOption(args, '--call'),
41
- parseInput(args)
53
+ const toolName = requiredOption(args, '--call');
54
+ const result = await leaseClient.withGraphLease(
55
+ `cli-call:${toolName}`,
56
+ () => callAgentTool(app, toolName, parseInput(args))
42
57
  );
43
58
  process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
44
59
  } finally {
60
+ await leaseClient.close();
45
61
  await app.close();
46
62
  }
47
63
  }
@@ -69,7 +85,8 @@ function startupMessage(error) {
69
85
  }
70
86
 
71
87
  function helpText() {
72
- return 'Usage: node src/mcp-server.js [--runtime-config <graph-runtime.json>]\n' +
88
+ return 'Usage: node src/mcp-server.js [--runtime-config <graph-runtime.json>] ' +
89
+ '[--source-application <codex|claude_code|cursor|kiro|other>]\n' +
73
90
  ' node src/mcp-server.js --tools\n' +
74
91
  ' node src/mcp-server.js --runtime-config <graph-runtime.json> ' +
75
92
  '--call <tool> [--input <json>]\n';