fuli-context 0.8.3 → 0.9.0-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 (115) hide show
  1. package/README.md +105 -6
  2. package/README.zh-CN.md +92 -6
  3. package/dist/web/assets/{AboutPage-HLhChD_Q.js → AboutPage-u2Bv6cO-.js} +1 -1
  4. package/dist/web/assets/{AgentHand-BaLSbn08.js → AgentHand-CsMcNXUm.js} +1 -1
  5. package/dist/web/assets/{AgentName-0PIU7MOX.js → AgentName-BboCA-Fd.js} +1 -1
  6. package/dist/web/assets/{AgentProfilePage-9cSsZHnk.js → AgentProfilePage-Dyux6qE3.js} +1 -1
  7. package/dist/web/assets/AgentsDirectoryPage-BEJdvmX7.js +1 -0
  8. package/dist/web/assets/{ConnectionsPage-D0wPYbwd.js → ConnectionsPage-Dw_hK_EM.js} +1 -1
  9. package/dist/web/assets/{EmployeeRecruitDialog-BrPH3e50.js → EmployeeRecruitDialog-DP_ktv3w.js} +1 -1
  10. package/dist/web/assets/{EmployeeWorkbenchPage-u-jw38PW.js → EmployeeWorkbenchPage-CAt8lVnr.js} +1 -1
  11. package/dist/web/assets/{GrowthLoading-DFOy-mEl.js → GrowthLoading-DIwqGFSc.js} +1 -1
  12. package/dist/web/assets/{KnowledgeEditDialog-DBsjlkDr.js → KnowledgeEditDialog-Degd9AGD.js} +1 -1
  13. package/dist/web/assets/{KnowledgeInspector-C79hbuOo.js → KnowledgeInspector-yms1ysZ4.js} +1 -1
  14. package/dist/web/assets/{KnowledgeOrganizerPage-Cz1BnAtz.js → KnowledgeOrganizerPage-C64wNn8a.js} +1 -1
  15. package/dist/web/assets/KnowledgePage-BTFEXzgi.js +1 -0
  16. package/dist/web/assets/{KnowledgeWorkspace-B2vj12QG.js → KnowledgeWorkspace-BsF1X4Aq.js} +1 -1
  17. package/dist/web/assets/{NotFoundPage-D340EQJP.js → NotFoundPage-DfaNTiD1.js} +1 -1
  18. package/dist/web/assets/{OverviewPage-BKiYudrC.js → OverviewPage-VXMfcWFI.js} +1 -1
  19. package/dist/web/assets/{PersonalProfilePage-BIGTcem2.js → PersonalProfilePage-C1LBhcYu.js} +1 -1
  20. package/dist/web/assets/PersonalProjectsPage-B5lV4ZJW.js +1 -0
  21. package/dist/web/assets/ProjectAgentFirstTask-6afJ8HUe.css +1 -0
  22. package/dist/web/assets/ProjectAgentFirstTask-DF-IvEqp.js +1 -0
  23. package/dist/web/assets/ProjectAgentsPage-CgL92gng.js +13 -0
  24. package/dist/web/assets/ProjectAgentsPage-CoJ4qQlA.css +1 -0
  25. package/dist/web/assets/{ProjectScopePicker-8hrgvmg-.js → ProjectScopePicker-CZUMdyYz.js} +1 -1
  26. package/dist/web/assets/{PublicProjectsPage-b5zx0dFS.js → PublicProjectsPage-e4CpxHk9.js} +1 -1
  27. package/dist/web/assets/{ReviewPage-BLdWYDmj.js → ReviewPage-DugEaFvI.js} +1 -1
  28. package/dist/web/assets/RoundtablesPage-642YtZBC.js +2 -0
  29. package/dist/web/assets/RoundtablesPage-DCbIBnBq.css +1 -0
  30. package/dist/web/assets/{SearchableSelect-vaoSDq1g.js → SearchableSelect-Do6X3fXi.js} +1 -1
  31. package/dist/web/assets/{SettingsPage-Dxjrkq1g.js → SettingsPage-wqYxDPyu.js} +1 -1
  32. package/dist/web/assets/{SharedJefaReportPage-YG2xwQQy.js → SharedJefaReportPage-CNQDezJr.js} +1 -1
  33. package/dist/web/assets/{WritingTastePage-CPPduPb1.js → WritingTastePage-CAUvbDlL.js} +1 -1
  34. package/dist/web/assets/{agent-profile.css_vue_type_style_index_0_src_true_lang-LTJ1ptv9.js → agent-profile.css_vue_type_style_index_0_src_true_lang-DHOcWSe_.js} +1 -1
  35. package/dist/web/assets/{catalog-B9tlJAp9.js → catalog-JmKyJnKL.js} +1 -1
  36. package/dist/web/assets/{client-InXscj8J.js → client-DTQ_tUr2.js} +1 -1
  37. package/dist/web/assets/{console-hUns2aD-.js → console-CrhIK67Y.js} +1 -1
  38. package/dist/web/assets/{conversation-launcher-settings-DEtJ6pZg.js → conversation-launcher-settings-fUWCt3XG.js} +1 -1
  39. package/dist/web/assets/copy-CX6pyzAG.js +1 -0
  40. package/dist/web/assets/i18n-CIIxzhPZ.js +10 -0
  41. package/dist/web/assets/{identity-Wt2Xio_B.js → identity-CdFITIOu.js} +1 -1
  42. package/dist/web/assets/{index-CWMqDq8g.css → index-CYZi7E1e.css} +1 -1
  43. package/dist/web/assets/index-DMoxVzDU.js +2 -0
  44. package/dist/web/assets/{model-C1GwBvd9.js → model-CJsrDUNb.js} +1 -1
  45. package/dist/web/assets/{personal-profile-graph-BdV_3I1u.js → personal-profile-graph-CQLOait6.js} +1 -1
  46. package/dist/web/assets/{shared-report-tRQV1iJl.js → shared-report-Cll2Yj8W.js} +1 -1
  47. package/dist/web/assets/{task-evidence-BUu7yYIn.js → task-evidence-DTiPCs7r.js} +1 -1
  48. package/dist/web/assets/{useApi-CROJJdhE-QfNm4ADP.js → useApi-CROJJdhE-fcdVGInY.js} +1 -1
  49. package/dist/web/assets/{useModalDialog-BopF-KHN.js → useModalDialog-B-45idX9.js} +1 -1
  50. package/dist/web/assets/{vue-router-COCNAJJn.js → vue-router-BUX6njIv.js} +1 -1
  51. package/dist/web/index.html +12 -11
  52. package/docs/employee-agents.md +20 -1
  53. package/docs/roundtable-beta-testing.md +102 -0
  54. package/docs/roundtable-beta-validation.md +125 -0
  55. package/docs/roundtable-research.md +142 -0
  56. package/graph-provider/fuli_graph/app.py +5 -0
  57. package/graph-provider/fuli_graph/models.py +1 -0
  58. package/graph-provider/fuli_graph/project_agent_task_models.py +1 -0
  59. package/graph-provider/fuli_graph/store_project_agent_context.py +4 -0
  60. package/graph-provider/fuli_graph/store_project_agent_task_reads.py +23 -8
  61. package/graph-provider/fuli_graph/store_project_agent_tasks.py +1 -0
  62. package/graph-provider/fuli_graph/store_records.py +1 -0
  63. package/graph-provider/fuli_graph/store_task_contexts.py +2 -1
  64. package/graph-provider/fuli_graph/task_context_adoption.py +9 -4
  65. package/graph-provider/fuli_graph/task_context_temporary_owner.py +25 -0
  66. package/graph-provider/fuli_graph/temporary_project_scope.py +88 -0
  67. package/npm-shrinkwrap.json +131 -79
  68. package/package.json +7 -3
  69. package/skills/capturing-session-knowledge/SKILL.md +20 -5
  70. package/src/agent-tools/graph-definitions.js +1 -1
  71. package/src/agent-tools/interface-catalog.js +5 -0
  72. package/src/agent-tools/project-agent-definitions.js +2 -2
  73. package/src/agent-tools.js +9 -2
  74. package/src/agents/a2a/roundtable-participant.js +374 -0
  75. package/src/agents/claude-code/roundtable-participant.js +24 -0
  76. package/src/agents/codex/roundtable-config.js +29 -0
  77. package/src/agents/codex/roundtable-participant.js +34 -0
  78. package/src/agents/grok/roundtable-participant.js +185 -0
  79. package/src/agents/pi/roundtable-participant.js +193 -0
  80. package/src/agents/pi/roundtable-result-format.js +183 -0
  81. package/src/cli/command-registry.js +2 -0
  82. package/src/cli/roundtable-command.js +59 -0
  83. package/src/cli.js +5 -0
  84. package/src/graphiti/agent-knowledge-workflows.js +14 -5
  85. package/src/graphiti/federated-application.js +3 -1
  86. package/src/graphiti/project-agent-mapping.js +1 -0
  87. package/src/graphiti/project-agent-workflows.js +28 -11
  88. package/src/graphiti/project-path-context.js +1 -0
  89. package/src/graphiti/provider-client.js +3 -0
  90. package/src/graphiti/temporary-project-scope.js +46 -0
  91. package/src/http/api-router.js +2 -0
  92. package/src/http/error-mapping.js +2 -0
  93. package/src/mcp/provider-task-context-registry.js +10 -0
  94. package/src/mcp/session-id.js +1 -0
  95. package/src/mcp/tool-annotations.js +2 -0
  96. package/src/roundtables/application.js +69 -0
  97. package/src/roundtables/domain.js +181 -0
  98. package/src/roundtables/http-router.js +56 -0
  99. package/src/roundtables/mcp-server.js +48 -0
  100. package/src/roundtables/participant-registry.js +12 -0
  101. package/src/roundtables/process.js +70 -0
  102. package/src/roundtables/result-contract.js +47 -0
  103. package/src/roundtables/server.js +52 -0
  104. package/src/roundtables/service.js +396 -0
  105. package/src/roundtables/store.js +59 -0
  106. package/src/roundtables/tool-contract.js +41 -0
  107. package/src/roundtables/turn-prompt.js +21 -0
  108. package/src/roundtables/worker.js +85 -0
  109. package/dist/web/assets/AgentsDirectoryPage-7G02Xm6C.js +0 -1
  110. package/dist/web/assets/KnowledgePage-JyfFFUrg.js +0 -1
  111. package/dist/web/assets/PersonalProjectsPage-CzjDCIi0.js +0 -1
  112. package/dist/web/assets/ProjectAgentsPage-C5F2WgwJ.js +0 -13
  113. package/dist/web/assets/ProjectAgentsPage-C89ZEDgi.css +0 -1
  114. package/dist/web/assets/i18n-75woNt31.js +0 -9
  115. package/dist/web/assets/index-pleRuLpw.js +0 -2
@@ -1,16 +1,17 @@
1
1
  {
2
2
  "name": "fuli-context",
3
- "version": "0.8.3",
3
+ "version": "0.9.0-beta.1",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "fuli-context",
9
- "version": "0.8.3",
9
+ "version": "0.9.0-beta.1",
10
10
  "license": "Apache-2.0",
11
11
  "dependencies": {
12
+ "@a2a-js/sdk": "1.3.0",
12
13
  "@hono/node-server": "2.0.12",
13
- "@modelcontextprotocol/sdk": "^1.29.0",
14
+ "@modelcontextprotocol/sdk": "^1.31.0",
14
15
  "zod": "^4.4.3"
15
16
  },
16
17
  "bin": {
@@ -31,7 +32,7 @@
31
32
  "typescript": "~6.0.0",
32
33
  "vite": "^8.1.5",
33
34
  "vitest": "^4.1.10",
34
- "vue": "^3.5.40",
35
+ "vue": "^3.5.42",
35
36
  "vue-i18n": "^11.4.8",
36
37
  "vue-router": "^5.2.0",
37
38
  "vue-tsc": "^3.3.8"
@@ -40,6 +41,53 @@
40
41
  "node": ">=24.12"
41
42
  }
42
43
  },
44
+ "node_modules/@a2a-js/sdk": {
45
+ "version": "1.3.0",
46
+ "resolved": "https://registry.npmjs.org/@a2a-js/sdk/-/sdk-1.3.0.tgz",
47
+ "integrity": "sha512-OpK4nygUnLKlpTFZlM2IrYu7f3c/B7c4u4Z14+vgMq24lEINTVCxH/BqZx+GL92rNf7CoBL5oTP5UhNsl75yyg==",
48
+ "license": "Apache-2.0",
49
+ "dependencies": {
50
+ "jose": "^6.2.3"
51
+ },
52
+ "bin": {
53
+ "a2a-db": "dist/cli/a2a_db.js"
54
+ },
55
+ "engines": {
56
+ "node": ">=20"
57
+ },
58
+ "peerDependencies": {
59
+ "@bufbuild/protobuf": "^2.10.2",
60
+ "@grpc/grpc-js": "^1.11.0",
61
+ "better-sqlite3": "^12.0.0 || ^13.0.0",
62
+ "express": "^4.21.2 || ^5.1.0",
63
+ "kysely": "^0.28.17 || ^0.29.0",
64
+ "mysql2": "^3.0.0",
65
+ "pg": "^8.0.0"
66
+ },
67
+ "peerDependenciesMeta": {
68
+ "@bufbuild/protobuf": {
69
+ "optional": true
70
+ },
71
+ "@grpc/grpc-js": {
72
+ "optional": true
73
+ },
74
+ "better-sqlite3": {
75
+ "optional": true
76
+ },
77
+ "express": {
78
+ "optional": true
79
+ },
80
+ "kysely": {
81
+ "optional": true
82
+ },
83
+ "mysql2": {
84
+ "optional": true
85
+ },
86
+ "pg": {
87
+ "optional": true
88
+ }
89
+ }
90
+ },
43
91
  "node_modules/@asamuzakjp/css-color": {
44
92
  "version": "5.1.11",
45
93
  "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-5.1.11.tgz",
@@ -180,13 +228,13 @@
180
228
  }
181
229
  },
182
230
  "node_modules/@babel/parser": {
183
- "version": "7.29.7",
184
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz",
185
- "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==",
231
+ "version": "7.29.9",
232
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.9.tgz",
233
+ "integrity": "sha512-CjXrNHTnvqBVqHgdBysY3vk2T8tpJHb5/RMeHJBTyVa9xgugCB0CJTx/3oO8RV2QRQP391RWpB7D6hLjm8V9uA==",
186
234
  "dev": true,
187
235
  "license": "MIT",
188
236
  "dependencies": {
189
- "@babel/types": "^7.29.7"
237
+ "@babel/types": "^7.29.8"
190
238
  },
191
239
  "bin": {
192
240
  "parser": "bin/babel-parser.js"
@@ -196,9 +244,9 @@
196
244
  }
197
245
  },
198
246
  "node_modules/@babel/types": {
199
- "version": "7.29.7",
200
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz",
201
- "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==",
247
+ "version": "7.29.8",
248
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz",
249
+ "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==",
202
250
  "dev": true,
203
251
  "license": "MIT",
204
252
  "dependencies": {
@@ -560,12 +608,12 @@
560
608
  }
561
609
  },
562
610
  "node_modules/@modelcontextprotocol/sdk": {
563
- "version": "1.29.0",
564
- "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.29.0.tgz",
565
- "integrity": "sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ==",
611
+ "version": "1.31.0",
612
+ "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.31.0.tgz",
613
+ "integrity": "sha512-UvTMgnNlnIBO/22ob2RcVGDlcvOslQs8T59+FTGdA0L27a39fdGF/EDETNtDVK4DZGpwomlsYpRdA8UXcVL/pw==",
566
614
  "license": "MIT",
567
615
  "dependencies": {
568
- "@hono/node-server": "^1.19.9",
616
+ "@hono/node-server": "^1.19.9 || ^2.0.5",
569
617
  "ajv": "^8.17.1",
570
618
  "ajv-formats": "^3.0.1",
571
619
  "content-type": "^1.0.5",
@@ -1459,14 +1507,14 @@
1459
1507
  }
1460
1508
  },
1461
1509
  "node_modules/@vue/compiler-core": {
1462
- "version": "3.5.40",
1463
- "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.40.tgz",
1464
- "integrity": "sha512-39E8IgOhTbVDnoJFMKc2DvYnypcZwUqgUhQkccva/0m6FUwtIKSGV7n1hpVmYcFaoRAwf9pBcwnKlCEsN63ZEQ==",
1510
+ "version": "3.5.42",
1511
+ "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.42.tgz",
1512
+ "integrity": "sha512-2Ye1ilMtKXxl8qZUrQ5j0CdgenFp/HFQmta6rfRyfEsTG69L6Wk+tWuNoHYHMx9E8tF2Slvdg1FuwDvAXdy1LQ==",
1465
1513
  "dev": true,
1466
1514
  "license": "MIT",
1467
1515
  "dependencies": {
1468
- "@babel/parser": "^7.29.7",
1469
- "@vue/shared": "3.5.40",
1516
+ "@babel/parser": "^7.29.8",
1517
+ "@vue/shared": "3.5.42",
1470
1518
  "entities": "^7.0.1",
1471
1519
  "estree-walker": "^2.0.2",
1472
1520
  "source-map-js": "^1.2.1"
@@ -1486,28 +1534,28 @@
1486
1534
  }
1487
1535
  },
1488
1536
  "node_modules/@vue/compiler-dom": {
1489
- "version": "3.5.40",
1490
- "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.40.tgz",
1491
- "integrity": "sha512-pwkx4vqlqOspFstrcmzwkKLePVMD3PT65imRzLhanU2V1Fj4K13g6OXjanOyzw3aTAuRk84BOmY8f3rEHqPaVA==",
1537
+ "version": "3.5.42",
1538
+ "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.42.tgz",
1539
+ "integrity": "sha512-qbhQZEFmycr+ni/qyuccS4sucNN7VAbDfbkvNxWOX2VfgFm90MNs3/UhRNKoPMEIVn0F8gdlYjLPvqxHwHeQOA==",
1492
1540
  "dev": true,
1493
1541
  "license": "MIT",
1494
1542
  "dependencies": {
1495
- "@vue/compiler-core": "3.5.40",
1496
- "@vue/shared": "3.5.40"
1543
+ "@vue/compiler-core": "3.5.42",
1544
+ "@vue/shared": "3.5.42"
1497
1545
  }
1498
1546
  },
1499
1547
  "node_modules/@vue/compiler-sfc": {
1500
- "version": "3.5.40",
1501
- "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.40.tgz",
1502
- "integrity": "sha512-gIf497P4kpuALcvs5n3AEg1Vdn0pSY4XbjASIfHNYF1/MP3T2Mf2STERTubysBxCRxzJGJYtF/O7vwJrxFB3Vw==",
1548
+ "version": "3.5.42",
1549
+ "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.42.tgz",
1550
+ "integrity": "sha512-fkCAFB4okcAANGMThboWnScp/gzWjU0ZSkVnjTIiplmMDq2uq0tIB3j+xVu4rhv5rvOgBySCysudmbMd6xRRqw==",
1503
1551
  "dev": true,
1504
1552
  "license": "MIT",
1505
1553
  "dependencies": {
1506
- "@babel/parser": "^7.29.7",
1507
- "@vue/compiler-core": "3.5.40",
1508
- "@vue/compiler-dom": "3.5.40",
1509
- "@vue/compiler-ssr": "3.5.40",
1510
- "@vue/shared": "3.5.40",
1554
+ "@babel/parser": "^7.29.8",
1555
+ "@vue/compiler-core": "3.5.42",
1556
+ "@vue/compiler-dom": "3.5.42",
1557
+ "@vue/compiler-ssr": "3.5.42",
1558
+ "@vue/shared": "3.5.42",
1511
1559
  "estree-walker": "^2.0.2",
1512
1560
  "magic-string": "^0.30.21",
1513
1561
  "postcss": "^8.5.19",
@@ -1515,14 +1563,14 @@
1515
1563
  }
1516
1564
  },
1517
1565
  "node_modules/@vue/compiler-ssr": {
1518
- "version": "3.5.40",
1519
- "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.40.tgz",
1520
- "integrity": "sha512-rrE5xiXG663+vHCHa3J9p2z5OcBRjXmoqenprJxAFQxg5pSshzeBiCE6pu46axapRJ2Adk0YDA2BRZVjiHXnhg==",
1566
+ "version": "3.5.42",
1567
+ "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.42.tgz",
1568
+ "integrity": "sha512-xmLk3wLkbizPAiLyomjgFFosf2ys9b5Ghb+oh/k2tnvipNz8OFrQOiTcWCzyK7MpBp9KkyGtfvgfLUivbmuGYA==",
1521
1569
  "dev": true,
1522
1570
  "license": "MIT",
1523
1571
  "dependencies": {
1524
- "@vue/compiler-dom": "3.5.40",
1525
- "@vue/shared": "3.5.40"
1572
+ "@vue/compiler-dom": "3.5.42",
1573
+ "@vue/shared": "3.5.42"
1526
1574
  }
1527
1575
  },
1528
1576
  "node_modules/@vue/devtools-api": {
@@ -1572,55 +1620,55 @@
1572
1620
  }
1573
1621
  },
1574
1622
  "node_modules/@vue/reactivity": {
1575
- "version": "3.5.40",
1576
- "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.40.tgz",
1577
- "integrity": "sha512-B7ot9UlUZOi1zbq61/LvE88ZLTV8IlajTdiZTAEiDQgrnIMIZoPr9kGw0Zw46ObW62O9+H/Be3kMbfb7kYPQZA==",
1623
+ "version": "3.5.42",
1624
+ "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.42.tgz",
1625
+ "integrity": "sha512-TzNNfKpb7hDxbQltwAut8VDQA5YP+BuRlxntHUuRjyKwlMvmAPbs3unhCvieijifY6vFfVBwsS7wG/C7uq+bEQ==",
1578
1626
  "dev": true,
1579
1627
  "license": "MIT",
1580
1628
  "dependencies": {
1581
- "@vue/shared": "3.5.40"
1629
+ "@vue/shared": "3.5.42"
1582
1630
  }
1583
1631
  },
1584
1632
  "node_modules/@vue/runtime-core": {
1585
- "version": "3.5.40",
1586
- "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.40.tgz",
1587
- "integrity": "sha512-KAZLweuZ6uUJPK1PMSQPgBU5gCjgrrfjUhSglmU9NhH+Zjepa8cnwSydPWDWHDwOgY4g3VcZ+PljbiHlURNCbw==",
1633
+ "version": "3.5.42",
1634
+ "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.42.tgz",
1635
+ "integrity": "sha512-9uACtuHs7vJGkm5Bp3xu4xRDLFTIYy5DgxpToVjqGIAhAEKwQfsaLvKINhM6nFVp6bZPRFGdDqd1g52MqKsotA==",
1588
1636
  "dev": true,
1589
1637
  "license": "MIT",
1590
1638
  "dependencies": {
1591
- "@vue/reactivity": "3.5.40",
1592
- "@vue/shared": "3.5.40"
1639
+ "@vue/reactivity": "3.5.42",
1640
+ "@vue/shared": "3.5.42"
1593
1641
  }
1594
1642
  },
1595
1643
  "node_modules/@vue/runtime-dom": {
1596
- "version": "3.5.40",
1597
- "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.40.tgz",
1598
- "integrity": "sha512-ZfrX8ssZQds900L9pr8AuK05ddnMsR4MPMZr8cPN9GoqoPWcXLhjvvbIA2SMv+7a97sJ1vv9pj/zxK0Cq/eEFQ==",
1644
+ "version": "3.5.42",
1645
+ "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.42.tgz",
1646
+ "integrity": "sha512-rsCmhiWLaRxGltLwhlCWyYkFn7WAbKRh0q17eZ1A6Dq6eqc2ACQ61IIryxz0LrsvCzHSilLA9JHovVwM8CNE2g==",
1599
1647
  "dev": true,
1600
1648
  "license": "MIT",
1601
1649
  "dependencies": {
1602
- "@vue/reactivity": "3.5.40",
1603
- "@vue/runtime-core": "3.5.40",
1604
- "@vue/shared": "3.5.40",
1650
+ "@vue/reactivity": "3.5.42",
1651
+ "@vue/runtime-core": "3.5.42",
1652
+ "@vue/shared": "3.5.42",
1605
1653
  "csstype": "^3.2.3"
1606
1654
  }
1607
1655
  },
1608
1656
  "node_modules/@vue/server-renderer": {
1609
- "version": "3.5.40",
1610
- "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.40.tgz",
1611
- "integrity": "sha512-XNJym9WpevhTVt1HuwOrCRJ5Q+9z4BjTMrDtjTrvx74SmUll8spNTw6whWJa9mEkO4PKn5TihI/bm/8ds2QVJw==",
1657
+ "version": "3.5.42",
1658
+ "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.42.tgz",
1659
+ "integrity": "sha512-2++5dUyYS4gvo7xQXSECUDhB7TS0aOl5SeVfC5qSq1Jgfhjvegw1zqhwTIR3imZ+QYPJQw9gfcFvXGAjGZ7ajQ==",
1612
1660
  "dev": true,
1613
1661
  "license": "MIT",
1614
1662
  "dependencies": {
1615
- "@vue/compiler-ssr": "3.5.40",
1616
- "@vue/runtime-dom": "3.5.40",
1617
- "@vue/shared": "3.5.40"
1663
+ "@vue/compiler-ssr": "3.5.42",
1664
+ "@vue/runtime-dom": "3.5.42",
1665
+ "@vue/shared": "3.5.42"
1618
1666
  }
1619
1667
  },
1620
1668
  "node_modules/@vue/shared": {
1621
- "version": "3.5.40",
1622
- "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.40.tgz",
1623
- "integrity": "sha512-WxnBtruIqOoV3rA4jeKDWzrYI5h7Cp4+pjwDi8kWGHz+IslhiN+wguLVVhtv2l8VoU02rzDCVfDjgCl1lNpZVg==",
1669
+ "version": "3.5.42",
1670
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.42.tgz",
1671
+ "integrity": "sha512-2rPxex1jQf4jvl9MOHl6YaXCPcrNqz/FstMOEh3QWY+/OME9nQTvl9WYeCwhW7AFjaR0SnngZGlp/wkR6rkI6g==",
1624
1672
  "dev": true,
1625
1673
  "license": "MIT"
1626
1674
  },
@@ -4366,9 +4414,9 @@
4366
4414
  "license": "ISC"
4367
4415
  },
4368
4416
  "node_modules/proxy-addr": {
4369
- "version": "2.0.7",
4370
- "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
4371
- "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
4417
+ "version": "2.0.8",
4418
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.8.tgz",
4419
+ "integrity": "sha512-5nnx0yGyVUcY6t9RnWcARWtwT9F1D8O9rt08htPvnd49W1IgZtmLkhu9WfMzQj1cFxjHIO6connUNVW5k7AVyQ==",
4372
4420
  "license": "MIT",
4373
4421
  "dependencies": {
4374
4422
  "forwarded": "0.2.0",
@@ -4376,6 +4424,10 @@
4376
4424
  },
4377
4425
  "engines": {
4378
4426
  "node": ">= 0.10"
4427
+ },
4428
+ "funding": {
4429
+ "type": "opencollective",
4430
+ "url": "https://opencollective.com/express"
4379
4431
  }
4380
4432
  },
4381
4433
  "node_modules/punycode": {
@@ -4662,9 +4714,9 @@
4662
4714
  }
4663
4715
  },
4664
4716
  "node_modules/shell-quote": {
4665
- "version": "1.10.0",
4666
- "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.10.0.tgz",
4667
- "integrity": "sha512-w1aiOKwKuRgtwAReIIj89puqg+I7GvX4IbLrvmhXbzQsj1+Zwi4VO3+fa6ZF91TWSjIxoEkKnMeHcLEODK5ZXA==",
4717
+ "version": "1.11.0",
4718
+ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.11.0.tgz",
4719
+ "integrity": "sha512-JdxDPD0DBTyu08pq0kPC0xSNet/qsU07qT6IsX1AS8oO2ICNRY4ldNa8OAI6PuwAH8tG3lxEhbqmyp4Dw4036g==",
4668
4720
  "dev": true,
4669
4721
  "license": "MIT",
4670
4722
  "engines": {
@@ -4767,9 +4819,9 @@
4767
4819
  }
4768
4820
  },
4769
4821
  "node_modules/source-map-js": {
4770
- "version": "1.2.1",
4771
- "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
4772
- "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
4822
+ "version": "1.2.2",
4823
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.2.tgz",
4824
+ "integrity": "sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==",
4773
4825
  "dev": true,
4774
4826
  "license": "BSD-3-Clause",
4775
4827
  "engines": {
@@ -5359,17 +5411,17 @@
5359
5411
  "license": "MIT"
5360
5412
  },
5361
5413
  "node_modules/vue": {
5362
- "version": "3.5.40",
5363
- "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.40.tgz",
5364
- "integrity": "sha512-+8PJ4SJXdn/cHGImF4CKdxlWHIN5Dkt7DoufRREM6h6uVCx2m7QxgcEQmmzyOK8A9mcafg7sFbJFYsdFVubTig==",
5414
+ "version": "3.5.42",
5415
+ "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.42.tgz",
5416
+ "integrity": "sha512-4RyHQTbQvOPs3MfvUO1Sg0YRrKNnA0mAVtvpd12Tg1fKDN7OHBUl1IqSn8zGJjK9nI3NkNp8cgTpVrSZC5TTcA==",
5365
5417
  "dev": true,
5366
5418
  "license": "MIT",
5367
5419
  "dependencies": {
5368
- "@vue/compiler-dom": "3.5.40",
5369
- "@vue/compiler-sfc": "3.5.40",
5370
- "@vue/runtime-dom": "3.5.40",
5371
- "@vue/server-renderer": "3.5.40",
5372
- "@vue/shared": "3.5.40"
5420
+ "@vue/compiler-dom": "3.5.42",
5421
+ "@vue/compiler-sfc": "3.5.42",
5422
+ "@vue/runtime-dom": "3.5.42",
5423
+ "@vue/server-renderer": "3.5.42",
5424
+ "@vue/shared": "3.5.42"
5373
5425
  },
5374
5426
  "peerDependencies": {
5375
5427
  "typescript": "*"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fuli-context",
3
- "version": "0.8.3",
3
+ "version": "0.9.0-beta.1",
4
4
  "description": "Local-first collaboration relationship graph for AI agents.",
5
5
  "type": "module",
6
6
  "files": [
@@ -14,6 +14,9 @@
14
14
  "docs/agent-conversations-and-collaboration.md",
15
15
  "docs/employee-agents.md",
16
16
  "docs/agent-interface-architecture.md",
17
+ "docs/roundtable-beta-testing.md",
18
+ "docs/roundtable-beta-validation.md",
19
+ "docs/roundtable-research.md",
17
20
  "examples/external-knowledge/markdown-folder.mjs",
18
21
  "graph-provider/Dockerfile",
19
22
  "graph-provider/pyproject.toml",
@@ -74,8 +77,9 @@
74
77
  },
75
78
  "license": "Apache-2.0",
76
79
  "dependencies": {
80
+ "@a2a-js/sdk": "1.3.0",
77
81
  "@hono/node-server": "2.0.12",
78
- "@modelcontextprotocol/sdk": "^1.29.0",
82
+ "@modelcontextprotocol/sdk": "^1.31.0",
79
83
  "zod": "^4.4.3"
80
84
  },
81
85
  "devDependencies": {
@@ -92,7 +96,7 @@
92
96
  "typescript": "~6.0.0",
93
97
  "vite": "^8.1.5",
94
98
  "vitest": "^4.1.10",
95
- "vue": "^3.5.40",
99
+ "vue": "^3.5.42",
96
100
  "vue-i18n": "^11.4.8",
97
101
  "vue-router": "^5.2.0",
98
102
  "vue-tsc": "^3.3.8"
@@ -52,6 +52,10 @@ current working directory. It resolves the exact active project without requirin
52
52
  copy an ID, searches that child project first, and then includes only inheritable knowledge from
53
53
  authorized parents or shared-source projects. Use `search_knowledge_graph` for personal-global
54
54
  context, explicitly named extra projects, subscribed public projects, or advanced scoped queries.
55
+ An already resolved temporary project is an active private scope for this task. Pass its exact
56
+ returned `personalProjectId` alongside the directory; without a directory, use
57
+ `search_knowledge_graph` with that exact project and personal space. Do not re-resolve it from
58
+ a repository name, and never omit its `personalProjectId` or move its facts to personal-global.
55
59
  Use `search_connected_knowledge` for a project-bound third-party source or explicitly selected
56
60
  public project. Keep its source sets separate and obey the project's conflict policy;
57
61
  `agent_decide` affects only the current response and never mutates or confirms a source.
@@ -104,7 +108,7 @@ URL, route, deployment, document, file, or where a durable artifact is located.
104
108
  Personal retrieval always includes the bounded personal-global profile. For a local personal
105
109
  project, pass its exact `personalProjectId`; if the user explicitly names another personal
106
110
  project, resolve it with `list_personal_projects` and add only that exact ID through
107
- `contextPersonalProjectIds`. Without an active local project, search only the personal-global
111
+ `contextPersonalProjectIds`. Without an active local or resolved temporary project, search only the personal-global
108
112
  profile. For public context, pass only the active or explicitly named subscribed public project
109
113
  IDs; never search every personal project, every subscription, or the whole graph by default.
110
114
  Use the current repository, the user's wording, and `list_knowledge_spaces` to resolve scope.
@@ -228,11 +232,15 @@ responsible for decisions, integration, and final verification. Do not split a s
228
232
  coupled task merely to create more workers.
229
233
 
230
234
  For an eligible task, call `coordinate_project_agent_task` once with the exact current
231
- `projectPath`, one stable idempotency key, an explicit complexity hint when known, and focused
235
+ `projectPath` when available, one stable idempotency key, an explicit complexity hint when known, and focused
232
236
  context queries. Enable its parallel plan only when there are at least two conflict-free
233
237
  workstreams with independent verification; state each workstream boundary. The Provider chooses
234
238
  the lead and collaborators from active project assignments, preferring Agents with relevant
235
239
  project history. Explicit user-selected Agents and locked policies remain higher priority.
240
+ When no registered project matches, coordination may return an isolated temporary project;
241
+ keep its exact returned ID for this task. Ambiguous candidates still require a choice. Temporary
242
+ scope creation is not Agent recruitment approval or proof of execution; follow the returned
243
+ recruitment/authorization state and worker plan.
236
244
 
237
245
  Treat the returned durable Agent identity and a host worker as different things. A durable Agent
238
246
  keeps its project assignment, preferences, task history, and Agent-scoped graph memory while idle;
@@ -271,11 +279,13 @@ before the remaining workers have reported their tools, session evidence, and ex
271
279
 
272
280
  When a FULI task or task view returns a non-empty Provider `executionSummary`, append a compact
273
281
  Markdown table with one row per actual worker. Include the worker label and occupation emoji,
274
- actual executor/tool plus `sourceApplication`, work summary, terminal `workerStatus`/status,
275
- session (`sourceSessionId`, or a session link only when the Provider supplies one), and Token usage.
282
+ actual executor/tool and `workerRuntime.application`, work summary, terminal `workerStatus`/status,
283
+ worker session (`workerRuntime.sessionId`, or a worker session link only when supplied), and Token usage.
284
+ Label `sourceApplication` and `sourceSessionId` separately as the reporting host. They do not
285
+ identify an external worker; do not substitute them for missing worker evidence.
276
286
  Use only the source-labelled cumulative `tokenUsage` reported for that worker. If it is absent,
277
287
  show `not reported`; never estimate it or copy a conversation-wide total into a worker row. If no
278
- session link exists, show `sourceSessionId` or `not reported`; never invent a link. This applies only
288
+ worker session link exists, show `workerRuntime.sessionId` or `not reported`; never invent a link. This applies only
279
289
  to Provider-reported actual workers. When empty `executionSummary` is returned, omit rows; an absent
280
290
  `executionSummary` also omits rows. Configured, allowed, or available clients/executors are not evidence
281
291
  of actual use. Keep this Agent-agnostic; client-specific details and work-kind routing remain at
@@ -380,6 +390,11 @@ their child projects.
380
390
 
381
391
  ## Resolve Or Create The Local Project
382
392
 
393
+ Do not run this registration flow for an already resolved temporary project. Keep its isolated
394
+ scope and retained audit history; creating or migrating to a registered project requires a
395
+ separate explicit request. Disposable output uses `retain_nothing` with a truthful work log;
396
+ any reusable project candidates remain in the returned temporary scope, subject to capture policy.
397
+
383
398
  Before the first project-scoped capture in a repository:
384
399
 
385
400
  1. Call `list_knowledge_spaces`, then `list_personal_projects` for the active personal space.
@@ -761,7 +761,7 @@ export const GRAPH_TOOL_DEFINITIONS = [
761
761
  {
762
762
  name: 'coordinate_project_agent_task',
763
763
  title: 'WRITE · Prepare a host-executed Agent team',
764
- description: 'Resolve the exact local project, let the Provider coordinator route one durable task, and assemble an isolated context bundle for every selected lead/collaborator. Pass the current taskContextToken so a newly recruited lead can claim an initially unassigned task, including its blocked work. When recruiting, HR should set recruitmentProfile.character from the role responsibilities and preserve user expectations; configured traits must never be presented as proven growth. The result is a truthful host execution plan: Fuli persists identity, staffing, and memory scope, while the calling host must start real workers, report their concrete worker/executor evidence, and finish their lifecycle. This tool never claims that a selected Agent is online or that a worker was started.',
764
+ description: 'Resolve the exact local project, or create an isolated temporary task scope when no project matches, then let the Provider coordinator route one durable task and assemble an isolated context bundle for every selected lead/collaborator. Ambiguous matches require exact selection. Pass the current taskContextToken so temporary scope and a newly recruited lead bind to the owned lifecycle; otherwise provide a stable sourceSessionId and idempotencyKey for retries. Temporary projects retain audit history, never become implicit directory bindings, and default to audited task-only recruitment under the existing HR policy; explicit durable recruitment requests remain explicit. When recruiting, HR should set recruitmentProfile.character from the role responsibilities and preserve user expectations; configured traits must never be presented as proven growth. Fuli persists identity, staffing, and memory scope; the host must start real workers, report their concrete evidence, and finish their lifecycle. A routing recommendation never proves that a worker started.',
765
765
  inputSchema: projectAgentTaskCoordinateInput
766
766
  },
767
767
  {
@@ -1,4 +1,9 @@
1
1
  const UI_MUTATION_PARITY = Object.freeze([
2
+ local('POST /api/roundtables', 'Creating rooms, granting private identity context and selecting execution permissions requires the local user.'),
3
+ local('POST /api/roundtables/:roomId/invites', 'Seat invitations are local-user issued scoped capabilities.'),
4
+ local('POST /api/roundtables/:roomId/revoke', 'Revoking participation requires the room owner.'),
5
+ local('POST /api/roundtables/:roomId/control', 'Starting, changing limits, stopping or human acceptance requires the room owner.'),
6
+ local('POST /api/roundtables/:roomId/messages', 'Human input must not be impersonated by an Agent.'),
2
7
  agent('POST /api/agent-conversations/query', 'list_agent_conversations', 'read_agent_conversation', 'get_agent_conversation_policy'),
3
8
  agent('PUT /api/agent-conversations/policy', 'update_agent_conversation_policy'),
4
9
  agent('POST /api/agent-attention', 'request_agent_attention'),
@@ -168,7 +168,7 @@ export const projectAgentTaskSubmitInput = objectSchema({
168
168
  ]);
169
169
  export const projectAgentTaskCoordinateInput = objectSchema({
170
170
  taskContextToken: id,
171
- projectPath: boundedString(4096),
171
+ projectPath: { ...boundedString(4096), description: 'Current absolute directory, when available. An unmatched or omitted path gets an isolated task-scoped temporary project during explicit coordination; ambiguous matches still require selection.' },
172
172
  personalProjectId: {
173
173
  ...nullableStringSchema(), minLength: 1, maxLength: 128,
174
174
  description: 'Explicit existing project ID when the directory has no exact match. A conflicting exact path match is rejected.'
@@ -194,7 +194,7 @@ export const projectAgentTaskCoordinateInput = objectSchema({
194
194
  contextLimitPerQuery: integerSchema({ minimum: 1, maximum: 20 }),
195
195
  includePendingContext: booleanSchema()
196
196
  }, [
197
- 'projectPath', 'idempotencyKey', 'title', 'objective', 'workKind',
197
+ 'idempotencyKey', 'title', 'objective', 'workKind',
198
198
  'routingReason', 'contextQueries'
199
199
  ]);
200
200
  export const projectAgentTaskActivityInput = objectSchema({
@@ -1,17 +1,24 @@
1
1
  import { GRAPH_TOOL_DEFINITIONS } from './agent-tools/graph-definitions.js';
2
2
  import { dispatchGraphTool } from './agent-tools/graph-handlers.js';
3
3
  import { runWithAgentRequestContext } from './app/agent-request-context.js';
4
+ import { ROUNDTABLE_TOOL_DEFINITIONS, ROUNDTABLE_TOOL_NAMES, callRoundtableTool } from './roundtables/tool-contract.js';
5
+ import { ApplicationError } from './app/application-error.js';
4
6
 
5
- const TOOL_DEFINITIONS = [...GRAPH_TOOL_DEFINITIONS];
7
+ const TOOL_DEFINITIONS = [...GRAPH_TOOL_DEFINITIONS, ...ROUNDTABLE_TOOL_DEFINITIONS];
6
8
 
7
9
  export function listAgentTools() {
8
10
  return clone(TOOL_DEFINITIONS);
9
11
  }
10
12
 
11
13
  export function callAgentTool(app, name, input = {}, requestContext = null) {
14
+ if (ROUNDTABLE_TOOL_NAMES.includes(name) && app.getAgentAccessPolicy?.().enabled === false) {
15
+ throw new ApplicationError('agent_access_disabled', 'Agent access is disabled in the local console');
16
+ }
12
17
  return runWithAgentRequestContext(
13
18
  requestContext,
14
- () => dispatchGraphTool(app, name, input)
19
+ () => ROUNDTABLE_TOOL_NAMES.includes(name)
20
+ ? callRoundtableTool(app.roundtables, name, input)
21
+ : dispatchGraphTool(app, name, input)
15
22
  );
16
23
  }
17
24