fuli-context 0.10.0 → 0.11.0

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 (201) hide show
  1. package/README.md +27 -30
  2. package/README.zh-CN.md +22 -26
  3. package/dist/web/assets/AboutPage-CKq4IRHd.js +1 -0
  4. package/dist/web/assets/AgentConversations-DfXiFvBN.js +2 -0
  5. package/dist/web/assets/AgentConversations-XqNEBY_2.css +1 -0
  6. package/dist/web/assets/AgentHand-BBM-sKh2.js +1 -0
  7. package/dist/web/assets/AgentName-C_6R80nP.js +1 -0
  8. package/dist/web/assets/AgentProfilePage-Cz-i1fRD.js +1 -0
  9. package/dist/web/assets/AgentsDirectoryPage-BI0EFz6y.js +1 -0
  10. package/dist/web/assets/AgentsDirectoryPage-yRWktiin.css +1 -0
  11. package/dist/web/assets/ConnectionsPage-BoC6kXgs.js +1 -0
  12. package/dist/web/assets/ConnectionsPage-CM9C-zEI.css +1 -0
  13. package/dist/web/assets/EmployeeRecruitDialog-BVyclQAJ.js +1 -0
  14. package/dist/web/assets/EmployeeRecruitDialog-CVbqCzHb.css +1 -0
  15. package/dist/web/assets/EmployeeWorkbenchPage-D-c_Jm2z.css +1 -0
  16. package/dist/web/assets/EmployeeWorkbenchPage-D2GvYraI.js +3 -0
  17. package/dist/web/assets/KnowledgeEditDialog-a0AKWics.js +1 -0
  18. package/dist/web/assets/KnowledgeEditDialog-hT9znkoe.css +1 -0
  19. package/dist/web/assets/KnowledgeInspector-DMg9yJZ2.js +1 -0
  20. package/dist/web/assets/KnowledgeOrganizerPage-BgsHM3Qw.js +1 -0
  21. package/dist/web/assets/KnowledgeOrganizerPage-DeL7Jp34.css +1 -0
  22. package/dist/web/assets/KnowledgePage-kn8MqUCO.js +1 -0
  23. package/dist/web/assets/KnowledgeWorkspace-BtRq9fvC.js +4 -0
  24. package/dist/web/assets/KnowledgeWorkspace-D4a7FcAb.css +1 -0
  25. package/dist/web/assets/NotFoundPage-D-7jLz3o.js +1 -0
  26. package/dist/web/assets/OverviewPage-BHPc-XxY.js +1 -0
  27. package/dist/web/assets/OverviewPage-By-fUzSG.css +1 -0
  28. package/dist/web/assets/PersonalProfilePage-C00iV0Kx.js +1 -0
  29. package/dist/web/assets/PersonalProfilePage-DrMDAAdy.css +1 -0
  30. package/dist/web/assets/PersonalProjectsPage-CFNkdHSo.js +1 -0
  31. package/dist/web/assets/ProjectAgentFirstTask-Bi1ZsTC1.css +1 -0
  32. package/dist/web/assets/ProjectAgentFirstTask-CrCWEYgn.js +1 -0
  33. package/dist/web/assets/ProjectAgentsPage-BzztLMH-.js +12 -0
  34. package/dist/web/assets/ProjectAgentsPage-DNLNjYp-.css +1 -0
  35. package/dist/web/assets/ProjectScopePicker-CMxn3txv.js +1 -0
  36. package/dist/web/assets/PublicProjectsPage-DKamXDV9.css +1 -0
  37. package/dist/web/assets/PublicProjectsPage-DQVtvhOS.js +1 -0
  38. package/dist/web/assets/ReviewPage-BZhvyDWc.js +1 -0
  39. package/dist/web/assets/RoundtablesPage-CVebTXQa.js +1 -0
  40. package/dist/web/assets/RoundtablesPage-Cb0R4GaM.css +1 -0
  41. package/dist/web/assets/SettingsPage-1knvfOW6.js +1 -0
  42. package/dist/web/assets/SettingsPage-BmYkLul4.css +1 -0
  43. package/dist/web/assets/SharedJefaReportPage-BCVq8u0P.js +1 -0
  44. package/dist/web/assets/UiDialog-Da1P10f4.js +1 -0
  45. package/dist/web/assets/UiDisclosure-8wE8YuE4.js +1 -0
  46. package/dist/web/assets/UiSegmented-BKZXc8QF.js +1 -0
  47. package/dist/web/assets/UiSelect-Bv6R0yr1.css +1 -0
  48. package/dist/web/assets/UiSelect-D5Xj5Ec4.js +1 -0
  49. package/dist/web/assets/WritingTastePage-B8-etOBn.js +1 -0
  50. package/dist/web/assets/WritingTastePage-B_zYD1df.css +1 -0
  51. package/dist/web/assets/agent-profile-BZj3ezWe.css +1 -0
  52. package/dist/web/assets/{attention-store-Dk-_P4Oi.js → attention-store-BfxtL9EV.js} +1 -1
  53. package/dist/web/assets/{catalog-DN72452f.js → catalog-6SN9i3WR.js} +1 -1
  54. package/dist/web/assets/client-CUTkF3t4.js +1 -0
  55. package/dist/web/assets/{console-BtPqo79j.js → console-CG8tdtSs.js} +1 -1
  56. package/dist/web/assets/{conversation-launcher-settings-jkHRmWai.js → conversation-launcher-settings-CyZkLJg7.js} +1 -1
  57. package/dist/web/assets/{i18n-D2CJkEYK.js → i18n-CCMR4gDS.js} +3 -3
  58. package/dist/web/assets/{identity-B3zEw-1u.js → identity-C1eN-FSB.js} +1 -1
  59. package/dist/web/assets/index-kPB0Cf8Q.css +1 -0
  60. package/dist/web/assets/index-sLDKI6R-.js +5 -0
  61. package/dist/web/assets/{model-S7ehAjky.js → model-l-sAqtW_.js} +1 -1
  62. package/dist/web/assets/{personal-profile-graph--GG3Mizo.js → personal-profile-graph-BD1Y6TDS.js} +1 -1
  63. package/dist/web/assets/shared-report-B46dxlCR.js +1 -0
  64. package/dist/web/assets/{useAgentRoster-BAPKWZ9y.js → useAgentRoster-DdxoKDEE.js} +1 -1
  65. package/dist/web/assets/{useApi-CROJJdhE-BtFMXFjw.js → useApi-CROJJdhE-DlOiu8lP.js} +1 -1
  66. package/dist/web/assets/{vue-router-DkaTtPn0.js → vue-router-DjqEU4W2.js} +1 -1
  67. package/dist/web/index.html +14 -16
  68. package/docs/agent-conversations-and-collaboration.md +9 -9
  69. package/docs/agent-roundtable.md +61 -0
  70. package/docs/employee-agents.md +2 -2
  71. package/docs/project-agent-memory.md +1 -1
  72. package/graph-provider/fuli_graph/agent_conversation_models.py +11 -2
  73. package/graph-provider/fuli_graph/conversation_context.py +40 -9
  74. package/graph-provider/fuli_graph/default_project_lead.py +88 -0
  75. package/graph-provider/fuli_graph/project_agent_memory_routes.py +7 -0
  76. package/graph-provider/fuli_graph/project_agent_task_models.py +3 -0
  77. package/graph-provider/fuli_graph/runtime.py +3 -76
  78. package/graph-provider/fuli_graph/store.py +2 -0
  79. package/graph-provider/fuli_graph/store_agent_conversations.py +60 -8
  80. package/graph-provider/fuli_graph/store_project_agent_task_recruitment.py +3 -1
  81. package/graph-provider/fuli_graph/store_project_agent_tasks.py +12 -8
  82. package/graph-provider/fuli_graph/store_project_agents.py +25 -124
  83. package/graph-provider/fuli_graph/store_task_contexts.py +26 -0
  84. package/graph-provider/fuli_graph/system_agents.py +128 -0
  85. package/graph-provider/fuli_graph/system_hr_identity.py +1 -1
  86. package/graph-provider/fuli_graph/task_context_routes.py +10 -0
  87. package/graph-provider/pyproject.toml +1 -1
  88. package/npm-shrinkwrap.json +2 -2
  89. package/package.json +2 -2
  90. package/src/agent-roundtable/http.js +14 -0
  91. package/src/agent-roundtable/service.js +218 -0
  92. package/src/agent-roundtable/store.js +86 -0
  93. package/src/agent-roundtable/tools.js +61 -0
  94. package/src/agent-roundtable/wake.js +99 -0
  95. package/src/agent-tools/agent-conversation-definitions.js +3 -3
  96. package/src/agent-tools/graph-definitions.js +3 -2
  97. package/src/agent-tools/interface-catalog.js +0 -5
  98. package/src/agent-tools.js +2 -2
  99. package/src/agents/claude-code/wake.js +37 -0
  100. package/src/agents/codex/wake.js +47 -0
  101. package/src/agents/identity-receipt.js +16 -6
  102. package/src/agents/session-log.js +34 -0
  103. package/src/agents/wake-registry.js +14 -0
  104. package/src/cli/command-registry.js +0 -2
  105. package/src/cli/setup-command.js +2 -5
  106. package/src/cli/update-command.js +13 -2
  107. package/src/cli.js +0 -5
  108. package/src/employees/management-policy.js +4 -2
  109. package/src/employees/manifest.js +3 -0
  110. package/src/employees/recruitment.js +3 -2
  111. package/src/graphiti/agent-conversations.js +11 -9
  112. package/src/graphiti/agent-knowledge-workflows.js +34 -7
  113. package/src/graphiti/federated-application.js +13 -5
  114. package/src/graphiti/project-agent-task-entry.js +19 -7
  115. package/src/graphiti/project-path-context.js +7 -2
  116. package/src/graphiti/provider-client.js +8 -0
  117. package/src/graphiti/repository-project-registration.js +17 -0
  118. package/src/graphiti/task-entry-preferences.js +5 -0
  119. package/src/http/api-router.js +5 -3
  120. package/src/http/error-mapping.js +0 -2
  121. package/src/mcp/instructions.js +5 -5
  122. package/src/mcp/session-id.js +1 -1
  123. package/src/mcp/tool-annotations.js +3 -4
  124. package/src/setup/agents.js +1 -41
  125. package/src/setup/graph-runtime.js +15 -2
  126. package/src/setup/session-skill.js +22 -2
  127. package/dist/web/assets/AboutPage-D-GyJNv1.js +0 -1
  128. package/dist/web/assets/AgentConversations-DOuZgUeA.js +0 -2
  129. package/dist/web/assets/AgentConversations-DS8h3yKn.css +0 -1
  130. package/dist/web/assets/AgentHand-eGsXoGSq.js +0 -1
  131. package/dist/web/assets/AgentName-Dtmu9Ff5.js +0 -1
  132. package/dist/web/assets/AgentProfilePage-D8Tvayn7.js +0 -1
  133. package/dist/web/assets/AgentsDirectoryPage-BTEfKZjF.js +0 -1
  134. package/dist/web/assets/ConnectionsPage-C1w99yN3.css +0 -1
  135. package/dist/web/assets/ConnectionsPage-DwOIcvl9.js +0 -1
  136. package/dist/web/assets/EmployeeRecruitDialog-BrIMRblq.css +0 -1
  137. package/dist/web/assets/EmployeeRecruitDialog-D11blfwU.js +0 -1
  138. package/dist/web/assets/EmployeeWorkbenchPage-BcEzYt65.css +0 -1
  139. package/dist/web/assets/EmployeeWorkbenchPage-CK2BAoGt.js +0 -3
  140. package/dist/web/assets/GrowthLoading-KTjE2e50.js +0 -1
  141. package/dist/web/assets/KnowledgeEditDialog-B3x8vs3c.css +0 -1
  142. package/dist/web/assets/KnowledgeEditDialog-n9trHQ5d.js +0 -1
  143. package/dist/web/assets/KnowledgeInspector-BcNjgw9H.js +0 -1
  144. package/dist/web/assets/KnowledgeOrganizerPage-BzgxP-nG.css +0 -1
  145. package/dist/web/assets/KnowledgeOrganizerPage-DMBpGxLr.js +0 -1
  146. package/dist/web/assets/KnowledgePage-POkCMW8f.js +0 -1
  147. package/dist/web/assets/KnowledgeWorkspace-2FvQadhB.js +0 -4
  148. package/dist/web/assets/KnowledgeWorkspace-sb8OJ97I.css +0 -1
  149. package/dist/web/assets/NotFoundPage-BCMZbeB8.js +0 -1
  150. package/dist/web/assets/OverviewPage-0CFWCG9-.css +0 -1
  151. package/dist/web/assets/OverviewPage-0mYifpjp.js +0 -1
  152. package/dist/web/assets/PersonalProfilePage-Chv2a2pi.css +0 -1
  153. package/dist/web/assets/PersonalProfilePage-JW6Muix6.js +0 -1
  154. package/dist/web/assets/PersonalProjectsPage-CRbi64JP.js +0 -1
  155. package/dist/web/assets/ProjectAgentFirstTask-6afJ8HUe.css +0 -1
  156. package/dist/web/assets/ProjectAgentFirstTask-DJ0wTbh8.js +0 -1
  157. package/dist/web/assets/ProjectAgentsPage-CPgKVLgg.js +0 -12
  158. package/dist/web/assets/ProjectAgentsPage-DeuRkMp1.css +0 -1
  159. package/dist/web/assets/ProjectScopePicker-BwB7gK-7.js +0 -1
  160. package/dist/web/assets/PublicProjectsPage-CB272Sq-.js +0 -1
  161. package/dist/web/assets/ReviewPage-CelTZU4C.js +0 -1
  162. package/dist/web/assets/RoundtablesPage-C9dXfWCl.js +0 -2
  163. package/dist/web/assets/RoundtablesPage-DCbIBnBq.css +0 -1
  164. package/dist/web/assets/SearchableSelect-f7EHbyDL.js +0 -1
  165. package/dist/web/assets/SettingsPage-5g7mRN2F.css +0 -1
  166. package/dist/web/assets/SettingsPage-nAijmm5f.js +0 -1
  167. package/dist/web/assets/SharedJefaReportPage-CjpJ9bkk.js +0 -1
  168. package/dist/web/assets/UiDisclosure-CWlC91Zt.js +0 -1
  169. package/dist/web/assets/WritingTastePage-DaHWY61P.js +0 -1
  170. package/dist/web/assets/WritingTastePage-SMGF39mf.css +0 -1
  171. package/dist/web/assets/agent-profile-CBvJHGjt.css +0 -1
  172. package/dist/web/assets/client-B2cRl-7c.js +0 -1
  173. package/dist/web/assets/copy-D2LqwtPZ.js +0 -1
  174. package/dist/web/assets/index-CNp0tRNp.css +0 -1
  175. package/dist/web/assets/index-ulISYH02.js +0 -5
  176. package/dist/web/assets/shared-report-DEK9wvhl.js +0 -1
  177. package/dist/web/assets/useModalDialog-D8tiJfbc.js +0 -1
  178. package/docs/roundtable.md +0 -46
  179. package/src/agents/a2a/roundtable-participant.js +0 -374
  180. package/src/agents/claude-code/roundtable-participant.js +0 -24
  181. package/src/agents/codex/roundtable-config.js +0 -32
  182. package/src/agents/codex/roundtable-participant.js +0 -34
  183. package/src/agents/grok/roundtable-participant.js +0 -185
  184. package/src/agents/pi/roundtable-participant.js +0 -193
  185. package/src/agents/pi/roundtable-result-format.js +0 -183
  186. package/src/cli/roundtable-command.js +0 -79
  187. package/src/roundtables/application.js +0 -69
  188. package/src/roundtables/domain.js +0 -181
  189. package/src/roundtables/http-router.js +0 -58
  190. package/src/roundtables/mcp-server.js +0 -55
  191. package/src/roundtables/participant-registry.js +0 -12
  192. package/src/roundtables/process.js +0 -70
  193. package/src/roundtables/profiles.js +0 -84
  194. package/src/roundtables/result-contract.js +0 -47
  195. package/src/roundtables/server.js +0 -52
  196. package/src/roundtables/service.js +0 -480
  197. package/src/roundtables/store.js +0 -63
  198. package/src/roundtables/tool-contract.js +0 -58
  199. package/src/roundtables/turn-prompt.js +0 -24
  200. package/src/roundtables/worker.js +0 -85
  201. /package/dist/web/assets/{GrowthLoading-CIuQ1icy.css → client-CIuQ1icy.css} +0 -0
@@ -1,5 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/RoundtablesPage-C9dXfWCl.js","assets/i18n-D2CJkEYK.js","assets/GrowthLoading-KTjE2e50.js","assets/_plugin-vue_export-helper-BDNMzG2s.js","assets/GrowthLoading-CIuQ1icy.css","assets/useApi-CROJJdhE-BtFMXFjw.js","assets/vue-router-DkaTtPn0.js","assets/copy-D2LqwtPZ.js","assets/RoundtablesPage-DCbIBnBq.css","assets/SharedJefaReportPage-CjpJ9bkk.js","assets/shared-report-DEK9wvhl.js","assets/client-B2cRl-7c.js","assets/ProjectScopePicker-BwB7gK-7.js","assets/ProjectScopePicker-DYA7L1Ex.css","assets/shared-report-CGlCpmNd.css","assets/SharedJefaReportPage-D92FSPru.css","assets/OverviewPage-0mYifpjp.js","assets/console-BtPqo79j.js","assets/profile-model-BQO4zNs9.js","assets/attention-store-Dk-_P4Oi.js","assets/paths-CDREouhi.js","assets/agent-work-summary-LeW-Al_S.js","assets/useAgentRoster-BAPKWZ9y.js","assets/OverviewPage-0CFWCG9-.css","assets/PersonalProfilePage-JW6Muix6.js","assets/useModalDialog-D8tiJfbc.js","assets/SearchableSelect-f7EHbyDL.js","assets/KnowledgeInspector-BcNjgw9H.js","assets/model-S7ehAjky.js","assets/conversation-launcher-settings-jkHRmWai.js","assets/KnowledgeInspector-pgDELOEf.css","assets/KnowledgeEditDialog-n9trHQ5d.js","assets/identity-B3zEw-1u.js","assets/KnowledgeEditDialog-B3x8vs3c.css","assets/personal-profile-graph--GG3Mizo.js","assets/PersonalProfilePage-Chv2a2pi.css","assets/WritingTastePage-DaHWY61P.js","assets/UiDisclosure-CWlC91Zt.js","assets/WritingTastePage-SMGF39mf.css","assets/PersonalProjectsPage-CRbi64JP.js","assets/KnowledgeWorkspace-2FvQadhB.js","assets/KnowledgeWorkspace-sb8OJ97I.css","assets/KnowledgeOrganizerPage-DMBpGxLr.js","assets/KnowledgeOrganizerPage-BzgxP-nG.css","assets/AgentsDirectoryPage-BTEfKZjF.js","assets/AgentHand-eGsXoGSq.js","assets/AgentHand-Y83Oo36U.css","assets/ProjectAgentFirstTask-DJ0wTbh8.js","assets/ProjectAgentFirstTask-6afJ8HUe.css","assets/EmployeeRecruitDialog-D11blfwU.js","assets/catalog-DN72452f.js","assets/EmployeeRecruitDialog-BrIMRblq.css","assets/agent-profile-CBvJHGjt.css","assets/AgentProfilePage-D8Tvayn7.js","assets/AgentName-Dtmu9Ff5.js","assets/AgentName-BQTFCWn0.css","assets/AgentConversations-DOuZgUeA.js","assets/AgentConversations-DS8h3yKn.css","assets/ProjectAgentsPage-CPgKVLgg.js","assets/ProjectAgentsPage-DeuRkMp1.css","assets/EmployeeWorkbenchPage-CK2BAoGt.js","assets/EmployeeWorkbenchPage-BcEzYt65.css","assets/PublicProjectsPage-CB272Sq-.js","assets/KnowledgePage-POkCMW8f.js","assets/ReviewPage-CelTZU4C.js","assets/ConnectionsPage-DwOIcvl9.js","assets/ConnectionsPage-C1w99yN3.css","assets/SettingsPage-nAijmm5f.js","assets/SettingsPage-5g7mRN2F.css","assets/AboutPage-D-GyJNv1.js","assets/fuli-logo-Bu9WBuQe.js","assets/AboutPage-c4dQpUiP.css","assets/NotFoundPage-BCMZbeB8.js"])))=>i.map(i=>d[i]);
2
- import{A as e,B as t,C as n,F as r,I as i,M as a,P as o,Q as s,R as c,S as l,V as u,X as d,_ as f,a as p,b as m,g as h,h as g,it as _,j as v,k as y,m as b,nt as x,p as S,r as C,s as w,tt as T,u as E,v as D,w as O,x as k,y as A,z as j}from"./i18n-D2CJkEYK.js";import{n as M,t as N}from"./console-BtPqo79j.js";import{t as P}from"./GrowthLoading-KTjE2e50.js";import{t as F}from"./_plugin-vue_export-helper-BDNMzG2s.js";import{m as I}from"./useApi-CROJJdhE-BtFMXFjw.js";import{i as L,n as R,r as z,t as B}from"./vue-router-DkaTtPn0.js";import{t as V}from"./fuli-logo-Bu9WBuQe.js";import{n as H}from"./client-B2cRl-7c.js";import{a as ee,n as U}from"./copy-D2LqwtPZ.js";import{a as W,s as G}from"./catalog-DN72452f.js";import{n as K,t as q}from"./AgentHand-eGsXoGSq.js";import{n as te}from"./profile-model-BQO4zNs9.js";import{n as ne,t as re}from"./attention-store-Dk-_P4Oi.js";import{t as ie}from"./useModalDialog-D8tiJfbc.js";import{t as ae}from"./UiDisclosure-CWlC91Zt.js";import{n as oe,t as se}from"./paths-CDREouhi.js";(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin===`use-credentials`?t.credentials=`include`:e.crossOrigin===`anonymous`?t.credentials=`omit`:t.credentials=`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var ce=[`type`,`disabled`,`aria-busy`],J=O({__name:`UiButton`,props:{variant:{default:`default`},type:{default:`button`},busy:{type:Boolean,default:!1},busyLabel:{default:``},disabled:{type:Boolean,default:!1},icon:{type:Boolean,default:!1}},setup(e){return(t,n)=>(a(),k(`button`,{type:e.type,class:x([`ui-button`,[`ui-button--${e.variant}`,{"ui-button--icon":e.icon}]]),disabled:e.disabled||e.busy,"aria-busy":e.busy||void 0},[e.busy?(a(),A(P,{key:0,variant:`inline`,label:e.busyLabel},null,8,[`label`])):r(t.$slots,`default`,{},void 0,void 0,1)],10,ce))}}),Y={name:`fuli-context`,version:`0.10.0`,description:`Local-first collaboration relationship graph for AI agents.`,type:`module`,files:[`README.zh-CN.md`,`npm-shrinkwrap.json`,`src/`,`dist/web/`,`docs/external-knowledge-architecture.md`,`docs/public-personal-architecture.md`,`docs/project-agent-memory.md`,`docs/agent-conversations-and-collaboration.md`,`docs/employee-agents.md`,`docs/agent-interface-architecture.md`,`docs/roundtable.md`,`examples/external-knowledge/markdown-folder.mjs`,`graph-provider/Dockerfile`,`graph-provider/pyproject.toml`,`graph-provider/fuli_graph/*.py`,`graph-provider/fuli_graph/**/*.py`,`skills/`,`compose.graphiti.yml`],bin:{fl:`src/cli.js`,fuli:`src/cli.js`},keywords:[`ai-agent`,`mcp`,`context`,`knowledge-graph`,`local-first`,`codex`,`claude-code`],scripts:{mcp:`node src/mcp-server.js`,dev:`run-p dev:server dev:web`,"dev:server":`node src/server.js`,"dev:web":`vite`,build:`run-s typecheck:web build:web`,"build:web":`vite build`,"typecheck:web":`vue-tsc --noEmit -p tsconfig.app.json`,"test:node":`node --test`,"test:web":`vitest run --config vitest.config.ts`,"test:package":`node scripts/package-smoke.js`,"test:knowledge:live":`node acceptance/knowledge-live.js`,"test:external-knowledge:live":`node scripts/validate-external-knowledge-live.js`,start:`node src/server.js`,"graph:setup":`node src/graphiti/setup.js`,"graph:up":`docker compose -f compose.graphiti.yml up -d --build`,"graph:down":`docker compose -f compose.graphiti.yml down`,"test:structure":`node --test test/source-structure.test.js`,pretest:`npm run build:web`,test:`run-s typecheck:web test:node test:web`,prepack:`npm run build`,prepublishOnly:`npm test`},engines:{node:`>=24.12`},repository:{type:`git`,url:`git+https://github.com/JevonsCode/fuli.git`},homepage:`https://jevonscode.github.io/fuli/`,bugs:{url:`https://github.com/JevonsCode/fuli/issues`},publishConfig:{access:`public`},license:`Apache-2.0`,dependencies:{"@a2a-js/sdk":`1.3.0`,"@hono/node-server":`2.0.12`,"@modelcontextprotocol/sdk":`^1.31.0`,zod:`^4.4.3`},devDependencies:{"@types/d3":`^7.4.3`,"@types/node":`^24.13.3`,"@vitejs/plugin-vue":`^6.0.8`,"@vue/test-utils":`^2.4.11`,"brace-expansion":`5.0.12`,d3:`^7.9.0`,jsdom:`^29.1.1`,linkedom:`^0.18.12`,"npm-run-all2":`^9.0.2`,pinia:`^4.0.2`,typescript:`~6.0.0`,vite:`^8.1.5`,vitest:`^4.1.10`,vue:`^3.5.42`,"vue-i18n":`^11.4.8`,"vue-router":`^5.2.0`,"vue-tsc":`^3.3.8`},overrides:{"@modelcontextprotocol/sdk":{"@hono/node-server":`2.0.12`},"brace-expansion":`$brace-expansion`,"fast-uri":`3.1.8`,qs:`6.16.0`}}.version,le=[`aria-label`],ue={class:`brand-mark-wrap`},de=[`src`],fe={class:`brand-copy`},pe={class:`brand-title-row`},me={class:`brand-name`},he=[`aria-label`,`aria-expanded`],ge={class:`brand-version`},_e={key:1,class:`brand-version`},ve={class:`brand-title-row`},ye={class:`brand-name`},be={class:`brand-version`},xe=[`aria-label`],Se=[`href`],Ce=F(O({__name:`BrandEasterEgg`,setup(t){let n=d(null),r=d(null),i=d(0),o=d(!1),s=d(!1),c=d(!1),l=d(null),u=f(()=>l.value?.status===`ready`&&l.value.updateAvailable&&!!l.value.latestVersion),h=f(()=>l.value?.latestVersion??``),g=f(()=>l.value?.packageUrl??`https://www.npmjs.com/package/fuli-context`),S=new AbortController,C=!1;function w(){i.value+=1,o.value=!0}function E(){o.value=!1}function O(){u.value&&(c.value=!c.value)}function A(e){C=!1,s.value=!1,c.value&&!n.value?.contains(e.target)&&(c.value=!1)}function j(e){e.key===`Tab`&&(C=!0),e.key===`Escape`&&c.value&&(e.preventDefault(),c.value=!1,y(()=>r.value?.focus()))}function M(){s.value=C}function N(){s.value=!1}return v(()=>{window.addEventListener(`pointerdown`,A,!0),window.addEventListener(`keydown`,j,!0),H(`/api/system/version`,{signal:S.signal}).then(e=>{l.value=e}).catch(()=>{})}),e(()=>{S.abort(),window.removeEventListener(`pointerdown`,A,!0),window.removeEventListener(`keydown`,j,!0)}),(e,t)=>(a(),k(`div`,{ref_key:`root`,ref:n,class:x([`brand-block`,{"is-sparkling":o.value,"is-keyboard-focused":s.value}])},[D(`button`,{class:`brand-effect-button`,type:`button`,"aria-label":T(p)(`console.brandEffect.aria`),onClick:w,onFocus:M,onBlur:N},[D(`span`,ue,[D(`img`,{class:`brand-mark`,src:T(V),alt:``,"aria-hidden":`true`},null,8,de),o.value?(a(),k(`span`,{key:`orbit-${i.value}`,class:`brand-orbit`,"aria-hidden":`true`})):m(``,!0)])],40,le),D(`span`,fe,[D(`span`,pe,[D(`span`,me,_(T(p)(`common.brand`)),1),u.value?(a(),k(`button`,{key:0,ref_key:`versionButton`,ref:r,class:`brand-version-button`,type:`button`,"aria-label":T(p)(`console.update.aria`,{version:h.value}),"aria-expanded":c.value,"aria-controls":`brand-update-details`,onClick:O},[D(`span`,ge,`v`+_(T(Y)),1),t[0]||=D(`span`,{class:`brand-update-dot`,"aria-hidden":`true`},null,-1)],8,he)):(a(),k(`span`,_e,`v`+_(T(Y)),1))]),t[1]||=D(`span`,{class:`brand-subtitle`},`Context Graph`,-1),o.value?(a(),k(`span`,{key:`copy-reflection-${i.value}`,class:`brand-copy-reflection`,"aria-hidden":`true`,onAnimationend:b(E,[`self`])},[D(`span`,ve,[D(`span`,ye,_(T(p)(`common.brand`)),1),D(`span`,be,`v`+_(T(Y)),1)])],32)):m(``,!0)]),c.value?(a(),k(`div`,{key:0,id:`brand-update-details`,class:`brand-update-popover`,role:`dialog`,"aria-label":T(p)(`console.update.title`,{version:h.value})},[D(`strong`,null,_(T(p)(`console.update.title`,{version:h.value})),1),D(`p`,null,_(T(p)(`console.update.copy`)),1),t[2]||=D(`code`,null,`fuli update --yes`,-1),D(`a`,{href:g.value,target:`_blank`,rel:`noopener noreferrer`},_(T(p)(`console.update.npmLink`)),9,Se)],8,xe)):m(``,!0)],2))}}),[[`__scopeId`,`data-v-68727ec7`]]),X=s(null);function we(e){let t=e.onError((t,n)=>{let r=e.resolve(n).href;!r.startsWith(`/`)||r.startsWith(`//`)||(X.value={href:r,resourceFailure:/dynamically imported module|module script|loading chunk|preload css|importing a module/i.test(String(t))})}),n=e.afterEach((e,t,n)=>{n||(X.value=null)});return()=>{t(),n()}}var Te={key:0,class:`navigation-recovery`,role:`alert`},Ee=[`href`],De=F(O({__name:`NavigationRecovery`,setup(e){return(e,t)=>T(X)?(a(),k(`div`,Te,[D(`div`,null,[D(`strong`,null,_(T(p)(`routes.loadFailure.title`)),1),D(`p`,null,_(T(p)(T(X).resourceFailure?`routes.loadFailure.resources`:`routes.loadFailure.message`)),1)]),D(`a`,{href:T(X).href,class:`quiet-button`},_(T(p)(`routes.loadFailure.reload`)),9,Ee),D(`button`,{type:`button`,class:`navigation-recovery-dismiss`,onClick:t[0]||=e=>X.value=null},_(T(p)(`routes.loadFailure.dismiss`)),1)])):m(``,!0)}}),[[`__scopeId`,`data-v-d154c242`]]),Oe={class:`nav-section-label`},ke={class:`employee-nav-mark`,"aria-hidden":`true`},Ae=[`src`],je={class:`nav-copy`},Me=F(O({__name:`EmployeeNavigation`,props:{personalSpaceId:{}},setup(e){let r=e;c(()=>r.personalSpaceId,e=>{G(e===`current`?``:e)},{immediate:!0});let i=f(()=>W.value.filter(e=>e.agentId&&e.agentStatus===`active`&&(e.runtime||e.workbench?.kind===`native`)));return(r,s)=>i.value.length?(a(),k(g,{key:0},[D(`p`,Oe,_(T(p)(`employees.directory`)),1),(a(!0),k(g,null,o(i.value,r=>(a(),k(`div`,{key:r.id,class:`employee-nav-row`},[n(T(B),{to:T(te)(e.personalSpaceId,r.agentId),class:`space-nav-button employee-nav`,"active-class":`is-active`},{default:t(()=>[D(`span`,ke,[T(K)(r.id)?(a(),k(`img`,{key:0,src:T(K)(r.id),alt:``},null,8,Ae)):(a(),k(g,{key:1},[l(_(r.name.slice(0,1)),1)],64))]),D(`span`,je,[D(`strong`,null,_(r.name),1)])]),_:2},1032,[`to`]),n(T(B),{class:`employee-workbench-link`,to:`/employees/${encodeURIComponent(r.id)}`,"aria-label":`${r.name} · ${T(p)(`agentProfiles.workbench`)}`,title:T(p)(`agentProfiles.workbench`)},{default:t(()=>[...s[0]||=[D(`svg`,{viewBox:`0 0 20 20`,width:`16`,height:`16`,"aria-hidden":`true`},[D(`path`,{d:`M3 4h14v12H3zM3 8h14M8 8v8`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.4`})],-1)]]),_:1},8,[`to`,`aria-label`,`title`]),n(q,{"agent-id":r.agentId},null,8,[`agent-id`])]))),128))],64)):m(``,!0)}}),[[`__scopeId`,`data-v-2f019061`]]);function Ne(e){let t=e.requestedAction.split(`
3
- `).map(e=>e.trim()).filter(e=>/^[A-F][.、))::]\s*\S/.test(e));return/(?:选择|选项|choose|select|options?|pick)/iu.test(e.requestedAction)&&t.length>=2&&t.every((e,t)=>e[0]===String.fromCharCode(65+t))?t.map((e,t)=>({id:`option-${t}`,label:e,value:e})):({approval:[`agree`,`decline`],review:[`accept`,`revise`],permission:[`agree`,`decline`],blocked:[`resolved`,`clarify`],question:[`clarify`]}[e.kind]??[`clarify`]).map(e=>({id:e,label:p(`attention.replies.${e}`),value:p(`attention.replies.${e}`)}))}function Pe(e,t,n){if(e===`other`)return t.trim();let r=n.find(t=>t.id===e);return r?[r.value,t.trim()].filter(Boolean).join(`
4
-
5
- `):``}var Fe={class:`attention-question`},Ie={class:`attention-context`},Le=[`disabled`],Re=[`name`,`value`,`checked`,`onChange`],ze=[`name`,`checked`],Be={class:`attention-input`},Ve=[`for`],He=[`id`,`value`,`required`,`disabled`,`placeholder`],Ue={key:0,role:`alert`,class:`inline-error attention-response-error`},We={key:1,role:`alert`,class:`inline-error`},Ge={class:`attention-submit`},Ke=[`disabled`],qe={key:1},Je=F(O({__name:`AttentionReply`,props:{item:{},modelValue:{},busy:{type:Boolean},refreshing:{type:Boolean},error:{}},emits:[`update:modelValue`,`submit`],setup(e,{emit:n}){let r=e,i=n,s=f(()=>Ne(r.item)),c=f(()=>Pe(r.modelValue.choice,r.modelValue.text,s.value));function l(e){i(`update:modelValue`,{...r.modelValue,...e})}function u(){!r.busy&&!r.refreshing&&c.value&&c.value.length<=4096&&i(`submit`,c.value)}return(n,r)=>(a(),k(`form`,{class:`attention-reply`,onSubmit:b(u,[`prevent`])},[D(`div`,Fe,[D(`h3`,null,_(e.item.title),1),D(`p`,null,_(e.item.requestedAction),1)]),(a(),A(ae,{key:e.item.requestId,title:T(p)(`attention.context`)},{default:t(()=>[D(`p`,Ie,_(e.item.detail),1)]),_:1},8,[`title`])),D(`fieldset`,{disabled:e.busy||e.refreshing,class:`attention-choices`},[D(`legend`,null,_(T(p)(`attention.chooseReply`)),1),(a(!0),k(g,null,o(s.value,t=>(a(),k(`label`,{key:t.id,class:x([`attention-choice`,{"is-selected":e.modelValue.choice===t.id}])},[D(`input`,{type:`radio`,name:`reply-${e.item.requestId}`,value:t.id,checked:e.modelValue.choice===t.id,onChange:e=>l({choice:t.id})},null,40,Re),D(`span`,null,_(t.label),1)],2))),128)),D(`label`,{class:x([`attention-choice`,{"is-selected":e.modelValue.choice===`other`}])},[D(`input`,{type:`radio`,name:`reply-${e.item.requestId}`,value:`other`,checked:e.modelValue.choice===`other`,onChange:r[0]||=e=>l({choice:`other`})},null,40,ze),D(`span`,null,_(T(p)(`attention.other`)),1)],2)],8,Le),D(`div`,Be,[D(`label`,{for:`attention-${e.item.requestId}`},_(e.modelValue.choice===`other`?T(p)(`attention.response`):T(p)(`attention.note`)),9,Ve),D(`textarea`,{id:`attention-${e.item.requestId}`,value:e.modelValue.text,rows:`3`,maxlength:`4096`,required:e.modelValue.choice===`other`,disabled:e.busy||e.refreshing,placeholder:T(p)(`attention.placeholder`),onInput:r[1]||=t=>l({text:t.target.value,choice:e.modelValue.choice||`other`})},null,40,He)]),e.error?(a(),k(`p`,Ue,_(e.error),1)):m(``,!0),c.value.length>4096?(a(),k(`p`,We,_(T(p)(`attention.tooLong`)),1)):m(``,!0),D(`div`,Ge,[D(`p`,null,_(T(p)(`attention.replyHint`)),1),D(`button`,{type:`submit`,class:`primary-action`,disabled:e.busy||e.refreshing||!c.value||c.value.length>4096},[e.busy?(a(),A(P,{key:0,variant:`inline`,label:T(p)(`attention.sending`)},null,8,[`label`])):(a(),k(`span`,qe,_(T(p)(`attention.send`)),1))],8,Ke)])],32))}}),[[`__scopeId`,`data-v-6b64bc2c`]]),Ye=[`aria-label`],Xe={class:`attention-nav-status`},Ze=[`title`],Qe={class:`attention-header`},$e={id:`attention-title`},et={class:`ui-badge`},tt=[`disabled`,`aria-label`],nt={key:0,role:`alert`,class:`attention-error`},rt=[`disabled`],it={key:2,class:`attention-empty`},at=[`aria-busy`],ot=[`aria-label`],st={class:`attention-queue-toolbar`},ct=[`disabled`],lt={class:`attention-mobile-picker`},ut=[`disabled`],dt=[`value`],ft={class:`attention-request-list`},pt=[`aria-current`,`disabled`,`onClick`],mt={class:`attention-request-meta`},ht={class:`attention-request-project`},gt=[`disabled`],_t={class:`attention-detail-meta`},vt={class:`ui-badge`},yt=[`href`],bt=O({__name:`AgentAttentionCenter`,props:{personalSpaceId:{},projects:{}},setup(t){let r=t,i=ne(),s=d({}),y=d({}),b=d(``),S=d(``),C=0,w=d({}),O=f(()=>w.value[b.value]??``),j=f(()=>i.items.find(e=>e.requestId===b.value)),M=f({get:()=>y.value[b.value]??{choice:``,text:``},set:e=>{j.value&&(y.value[b.value]={...e,revision:j.value.revision})}}),N=f(()=>new Map(r.projects.map(e=>[e.project_id,e.profile.name]))),{dialogRef:F,initialFocusRef:I,onCancel:L,onKeydown:R}=ie(()=>i.open,()=>{S.value||(i.open=!1)});c(()=>r.personalSpaceId,e=>{C++,S.value=``,s.value={},y.value={},b.value=``,w.value={},i.setSpace(e===`current`?``:e)},{immediate:!0}),c(()=>i.open,async e=>{if(!e)return;let t=i.spaceId;try{let e=await H(`/api/project-agents?${new URLSearchParams({personalSpaceId:t})}`);t===i.spaceId&&(s.value=Object.fromEntries(e.map(e=>[e.agentId,e.profile.displayName||e.profile.name])))}catch{}}),c(()=>i.items,e=>{e.some(e=>e.requestId===b.value)||(b.value=e[0]?.requestId??``);for(let t of e){let e=y.value[t.requestId];e&&e.revision!==t.revision&&(y.value[t.requestId]={choice:``,text:e.text,revision:t.revision},w.value[t.requestId]=p(`attention.updated`))}});let z;function B(){document.visibilityState===`visible`&&!i.loading&&!i.open&&i.refresh()}v(()=>{z=setInterval(B,3e4),document.addEventListener(`visibilitychange`,B)}),e(()=>{clearInterval(z),document.removeEventListener(`visibilitychange`,B),i.setSpace(``)});async function V(e,t){if(S.value||!t.trim()||t.length>4096)return;let n=i.spaceId,r=++C;S.value=e.requestId,delete w.value[e.requestId];try{await i.respond(e,t),r===C&&n===i.spaceId&&delete y.value[e.requestId]}catch(t){r===C&&n===i.spaceId&&(w.value[e.requestId]=t instanceof Error?t.message:String(t),await i.refresh())}finally{r===C&&(S.value=``)}}return(e,t)=>(a(),k(g,null,[D(`button`,{class:`space-nav-button attention-nav`,"aria-label":T(i).total?`${T(p)(`attention.title`)} · ${T(p)(`attention.count`,{count:T(i).total})}`:T(p)(`attention.title`),type:`button`,onClick:t[0]||=e=>T(i).show()},[t[11]||=D(`span`,{class:`nav-icon nav-icon-review`,"aria-hidden":`true`},null,-1),D(`span`,null,_(T(p)(`attention.title`)),1),D(`span`,Xe,[n(q,{passive:``,"count-only":``}),T(i).error?(a(),k(`span`,{key:0,title:T(p)(`attention.loadError`)},`!`,8,Ze)):m(``,!0)])],8,Ye),(a(),A(h,{to:`body`},[T(i).open?(a(),k(`dialog`,{key:0,ref_key:`dialogRef`,ref:F,class:`attention-dialog`,"aria-labelledby":`attention-title`,onCancel:t[9]||=(...e)=>T(L)&&T(L)(...e),onKeydown:t[10]||=(...e)=>T(R)&&T(R)(...e)},[D(`header`,Qe,[D(`div`,null,[D(`h2`,$e,_(T(p)(`attention.title`)),1),D(`span`,et,_(T(i).agentId?T(i).counts[T(i).agentId]??T(i).filteredTotal:T(i).total),1)]),D(`button`,{ref_key:`initialFocusRef`,ref:I,class:`ui-button ui-button--ghost ui-button--icon`,type:`button`,disabled:!!S.value,"aria-label":T(p)(`attention.close`),onClick:t[1]||=e=>T(i).open=!1},`×`,8,tt)]),T(i).error?(a(),k(`div`,nt,[D(`span`,null,_(T(p)(`attention.loadError`)),1),D(`button`,{class:`ui-button`,disabled:T(i).loading,onClick:t[2]||=e=>T(i).refresh()},_(T(p)(`attention.refresh`)),9,rt)])):m(``,!0),T(i).loading&&!T(i).items.length?(a(),A(P,{key:1,variant:`page`,label:T(p)(`attention.loading`)},null,8,[`label`])):!T(i).items.length&&!T(i).error?(a(),k(`div`,it,[t[12]||=D(`span`,{"aria-hidden":`true`},`✓`,-1),D(`p`,null,_(T(p)(`attention.empty`)),1)])):T(i).items.length?(a(),k(`div`,{key:3,class:`attention-workspace`,"aria-busy":T(i).loading},[D(`aside`,{class:`attention-queue`,"aria-label":T(p)(`attention.queue`)},[D(`div`,st,[D(`span`,null,_(T(i).agentId?s.value[T(i).agentId]||T(p)(`attention.agentFallback`):T(p)(`attention.all`)),1),T(i).agentId||!T(i).error?(a(),k(`button`,{key:0,class:`ui-button ui-button--ghost`,disabled:T(i).loading||!!S.value,onClick:t[3]||=e=>T(i).agentId?T(i).show():T(i).refresh()},_(T(i).agentId?T(p)(`attention.all`):T(p)(`attention.refresh`)),9,ct)):m(``,!0)]),D(`label`,lt,[l(_(T(p)(`attention.selectRequest`)),1),u(D(`select`,{"onUpdate:modelValue":t[4]||=e=>b.value=e,disabled:!!S.value},[(a(!0),k(g,null,o(T(i).items,e=>(a(),k(`option`,{key:e.requestId,value:e.requestId},_(s.value[e.agentId]||T(p)(`attention.agentFallback`))+` · `+_(N.value.get(e.personalProjectId)||T(p)(`attention.projectFallback`))+` — `+_(e.title),9,dt))),128))],8,ut),[[E,b.value]])]),D(`div`,ft,[(a(!0),k(g,null,o(T(i).items,e=>(a(),k(`button`,{key:e.requestId,type:`button`,class:x([`attention-request`,{"is-selected":b.value===e.requestId}]),"aria-current":b.value===e.requestId?`true`:void 0,disabled:!!S.value,onClick:t=>b.value=e.requestId},[D(`span`,mt,[l(_(s.value[e.agentId]||T(p)(`attention.agentFallback`)),1),D(`span`,null,_(T(p)(`attention.kinds.${e.kind}`)),1)]),D(`strong`,null,_(e.title),1),D(`span`,ht,_(N.value.get(e.personalProjectId)||T(p)(`attention.projectFallback`)),1)],10,pt))),128))]),T(i).items.length<T(i).filteredTotal?(a(),k(`button`,{key:0,class:`ui-button attention-more`,type:`button`,disabled:T(i).loading||!!S.value,onClick:t[5]||=e=>T(i).more()},_(T(p)(`attention.more`)),9,gt)):m(``,!0)],8,ot),j.value?(a(),k(`section`,{key:j.value.requestId,class:`attention-detail`},[D(`div`,_t,[D(`span`,null,_(s.value[j.value.agentId]||T(p)(`attention.agentFallback`))+` · `+_(N.value.get(j.value.personalProjectId)||T(p)(`attention.projectFallback`)),1),D(`span`,vt,_(T(p)(`attention.kinds.${j.value.kind}`)),1)]),n(Je,{modelValue:M.value,"onUpdate:modelValue":t[6]||=e=>M.value=e,item:j.value,busy:S.value===j.value.requestId,refreshing:T(i).loading,error:O.value,onSubmit:t[7]||=e=>V(j.value,e)},null,8,[`modelValue`,`item`,`busy`,`refreshing`,`error`]),j.value.taskId&&!S.value?(a(),k(`a`,{key:0,class:`attention-task-link`,href:T(re)(j.value),onClick:t[8]||=e=>T(i).open=!1},_(T(p)(`attention.task`))+` ↗`,9,yt)):m(``,!0)])):m(``,!0)],8,at)):m(``,!0)],544)):m(``,!0)]))],64))}}),xt=[`routes.`,`common.`,`employees.`,`agentProfiles.`];function St(e,t=``){let n=typeof e==`string`&&e?e:t;return xt.some(e=>n.startsWith(e))?p(n):n}function Ct(e){if(typeof document>`u`)return;let t=St(e,`routes.overview.title`);document.title=`${t} · ${p(`common.brand`)}`}var wt={class:`app-shell`},Tt=[`onKeydown`],Et=[`aria-label`],Dt={class:`nav-section-label`},Ot={class:`nav-label`},kt={class:`nav-section-label nav-space-label`},At={class:`nav-copy`},jt={class:`nav-copy`},Mt={class:`nav-copy`},Nt={class:`nav-copy`},Pt={class:`nav-copy`},Ft={class:`nav-section-label nav-public-label`},It={class:`nav-copy`},Lt={class:`nav-section-label nav-tool-label`},Rt={class:`nav-label`},zt={class:`nav-label`},Bt={class:`nav-label`},Vt={class:`nav-section-label nav-about-label`},Ht={class:`nav-label`},Ut={class:`nav-label`},Wt={class:`sidebar-foot`},Gt=[`aria-label`],Kt={class:`runtime-status`},qt={class:`service-details`},Jt={class:`runtime-status`},Yt=[`aria-label`],Xt=[`inert`],Zt=[`aria-expanded`,`aria-label`],Qt={key:0,class:`workbench-host-label`},$t={key:1,class:`topbar-heading`},en={key:2,class:`topbar-actions`},tn=[`aria-label`],nn=F(O({__name:`ConsoleLayout`,setup(r){let o=N(),s=I(),u=d(!1),h=d(null),C=d(null),w=f(()=>o.activePersonalSpace?.id??`current`),E=f(()=>oe(w.value,`graph`)),O=f(()=>se(`personal`,w.value,`directory`)),M=f(()=>St(s.meta.title,`routes.overview.title`)),P=f(()=>s.meta.dedicatedWorkspace===!0),F=f(()=>o.publicRuntimeStatus===`ready`?p(`console.services.publicReady`):o.publicRuntimeStatus===`error`?p(`console.services.publicError`):p(`console.services.publicOffline`)),L=f(()=>{if(o.publicRuntimeStatus===`ready`){let e=o.state?.capabilities;return e?.browsePublicProjects&&e?.subscribeProject&&!e?.publishProject&&!e?.submitKnowledge&&!e?.reviewProposals?p(`console.services.publicBrowseSubscribe`):p(`console.services.publicAvailable`)}return o.publicRuntimeStatus===`error`?p(`console.services.localUnaffected`):p(`console.services.localOnly`)}),z=f(()=>o.state?.capabilities?.browsePublicProjects!==!1),V=f(()=>{let e=o.state?.capabilities;return e?.submitKnowledge!==!1||e?.reviewProposals===!0});v(()=>{o.runtimeStatus===`idle`&&o.refresh(),window.addEventListener(`resize`,H)}),e(()=>window.removeEventListener(`resize`,H));function H(){window.innerWidth>920&&(u.value=!1)}function W(e){if(!u.value||e.key!==`Tab`)return;let t=[...e.currentTarget.querySelectorAll(`button:not(:disabled), a[href], input:not(:disabled), [tabindex="0"]`)].filter(e=>e.getClientRects().length>0),n=t[0],r=t.at(-1);e.shiftKey&&document.activeElement===n?(e.preventDefault(),r?.focus()):!e.shiftKey&&document.activeElement===r&&(e.preventDefault(),n?.focus())}j(()=>{Ct(s.meta.title)}),c(()=>s.fullPath,()=>{u.value=!1});async function G(){u.value=!0,await y(),C.value?.focus({preventScroll:!0})}async function K(){u.value=!1,await y(),h.value?.focus({preventScroll:!0})}return(e,r)=>(a(),k(`div`,wt,[D(`aside`,{id:`console-primary-sidebar`,class:x([`sidebar`,{"is-mobile-open":u.value}]),onKeydown:[S(b(K,[`stop`]),[`esc`]),W]},[D(`button`,{ref_key:`mobileNavCloseRef`,ref:C,class:`mobile-nav-close quiet-button`,type:`button`,onClick:K},_(T(p)(`console.navigation.closeMenu`)),513),n(Ce),D(`nav`,{class:`primary-nav`,"aria-label":T(p)(`console.navigation.aria`)},[D(`p`,Dt,_(T(p)(`console.navigation.workspace`)),1),n(T(B),{to:`/`,"exact-active-class":`is-active`},{default:t(()=>[r[1]||=D(`span`,{class:`nav-icon nav-icon-overview`,"aria-hidden":`true`},null,-1),D(`span`,Ot,_(T(p)(`console.navigation.overview`)),1)]),_:1}),D(`p`,kt,_(T(p)(`console.navigation.personalSpace`)),1),n(T(B),{class:`space-nav-button personal-profile-button`,to:`/preferences`,"active-class":`is-active`},{default:t(()=>[r[2]||=D(`span`,{class:`nav-icon nav-icon-personal-profile`,"aria-hidden":`true`},null,-1),D(`span`,At,[D(`strong`,null,_(T(p)(`console.navigation.preferences`)),1)])]),_:1}),n(T(B),{class:`space-nav-button knowledge-organizer-button`,to:`/organize`,"active-class":`is-active`},{default:t(()=>[r[3]||=D(`span`,{class:`nav-icon nav-icon-knowledge-organizer`,"aria-hidden":`true`},null,-1),D(`span`,jt,[D(`strong`,null,_(T(p)(`console.navigation.organizer`)),1)])]),_:1}),n(T(B),{class:`space-nav-button personal-space-button`,to:E.value,"active-class":`is-active`},{default:t(()=>[r[4]||=D(`span`,{class:`nav-icon nav-icon-personal-project`,"aria-hidden":`true`},null,-1),D(`span`,Mt,[D(`strong`,null,_(T(p)(`console.navigation.personalProjects`)),1)])]),_:1},8,[`to`]),n(T(B),{class:`space-nav-button project-agents-button`,to:`/project-agents`,"active-class":`is-active`},{default:t(()=>[r[5]||=D(`span`,{class:`nav-icon nav-icon-project-agent`,"aria-hidden":`true`},null,-1),D(`span`,Nt,[D(`strong`,null,_(T(p)(`console.navigation.projectAgents`)),1)])]),_:1}),n(T(B),{class:`space-nav-button roundtables-button`,to:`/roundtables`,"active-class":`is-active`},{default:t(()=>[r[6]||=D(`span`,{class:`nav-icon nav-icon-project-agent`,"aria-hidden":`true`},null,-1),D(`span`,Pt,[D(`strong`,null,_(T(U)(`Agent 圆桌`,`Agent Roundtable`)),1),D(`small`,null,_(T(U)(`讨论 · 分工 · 结果`,`Discuss · assign · deliver`)),1)])]),_:1}),z.value?(a(),k(g,{key:0},[D(`p`,Ft,_(T(p)(`console.navigation.publicSpace`)),1),n(T(B),{class:`space-nav-button public-space-button`,to:`/public-projects`,"active-class":`is-active`},{default:t(()=>[r[7]||=D(`span`,{class:`nav-icon nav-icon-public-project`,"aria-hidden":`true`},null,-1),D(`span`,It,[D(`strong`,null,_(T(p)(`console.navigation.publicProjects`)),1)])]),_:1})],64)):m(``,!0),n(Me,{"personal-space-id":w.value},null,8,[`personal-space-id`]),n(bt,{"personal-space-id":w.value,projects:T(o).state?.personalProjects??[]},null,8,[`personal-space-id`,`projects`]),D(`p`,Lt,_(T(p)(`console.navigation.governance`)),1),n(T(B),{to:O.value,"active-class":`is-active`},{default:t(()=>[r[8]||=D(`span`,{class:`nav-icon nav-icon-knowledge-graph`,"aria-hidden":`true`},null,-1),D(`span`,Rt,_(T(p)(`console.navigation.knowledge`)),1)]),_:1},8,[`to`]),V.value?(a(),A(T(B),{key:1,to:`/review`,"active-class":`is-active`},{default:t(()=>[r[9]||=D(`span`,{class:`nav-icon nav-icon-review`,"aria-hidden":`true`},null,-1),D(`span`,zt,_(T(p)(`console.navigation.review`)),1)]),_:1})):m(``,!0),n(T(B),{to:`/connections`,"active-class":`is-active`},{default:t(()=>[r[10]||=D(`span`,{class:`nav-icon nav-icon-connections`,"aria-hidden":`true`},null,-1),D(`span`,Bt,_(T(p)(`console.navigation.connections`)),1)]),_:1}),D(`p`,Vt,_(T(p)(`console.navigation.aboutSection`)),1),n(T(B),{to:`/settings`,"active-class":`is-active`},{default:t(()=>[r[11]||=D(`span`,{class:`nav-icon nav-icon-settings`,"aria-hidden":`true`},null,-1),D(`span`,Ht,_(T(p)(`console.navigation.settings`)),1)]),_:1}),n(T(B),{to:`/about`,"active-class":`is-active`},{default:t(()=>[r[12]||=D(`span`,{class:`nav-icon nav-icon-about`,"aria-hidden":`true`},null,-1),D(`span`,Ut,_(T(p)(`console.navigation.about`)),1)]),_:1})],8,Et),D(`div`,Wt,[D(`div`,{class:`service-runtime-list`,"aria-label":T(p)(`console.services.aria`)},[D(`div`,Kt,[D(`span`,{class:x([`status-dot`,T(o).runtimeStatus])},null,2),D(`div`,null,[D(`strong`,null,_(T(o).runtimeStatus===`ready`?T(p)(`console.services.localReady`):T(o).runtimeStatus===`error`?T(p)(`console.services.localError`):T(p)(`console.services.localConnecting`)),1)])]),D(`details`,qt,[D(`summary`,null,[D(`span`,{class:x([`status-dot`,T(o).publicRuntimeStatus])},null,2),l(_(F.value),1)]),D(`div`,Jt,[D(`div`,null,[D(`small`,null,_(L.value),1),n(T(B),{to:`/connections`},{default:t(()=>[l(_(T(p)(`console.navigation.connections`)),1)]),_:1})])])])],8,Gt)])],42,Tt),u.value?(a(),k(`button`,{key:0,class:`mobile-nav-backdrop`,type:`button`,tabindex:`-1`,"aria-label":T(p)(`console.navigation.closeMenu`),onClick:K},null,8,Yt)):m(``,!0),D(`main`,{class:`workspace`,inert:u.value||void 0},[D(`header`,{class:x([`topbar`,{"topbar--workbench":P.value}])},[D(`button`,{ref_key:`mobileNavToggleRef`,ref:h,class:`mobile-nav-toggle quiet-button`,type:`button`,"aria-controls":`console-primary-sidebar`,"aria-expanded":u.value,"aria-label":T(p)(`console.navigation.openMenu`),onClick:G},[...r[13]||=[D(`span`,{class:`mobile-nav-icon`,"aria-hidden":`true`},null,-1)]],8,Zt),P.value?(a(),k(`span`,Qt,`FULI`)):(a(),k(`div`,$t,[D(`h1`,null,_(M.value),1)])),P.value?m(``,!0):(a(),k(`div`,en,[T(s).name===`settings`?(a(),A(J,{key:0,variant:`primary`,disabled:T(o).settingsSaving,form:`settings-form`,type:`submit`},{default:t(()=>[l(_(T(p)(`settings.save`)),1)]),_:1},8,[`disabled`])):m(``,!0),n(ee),n(J,{variant:`ghost`,icon:``,disabled:T(o).runtimeStatus===`loading`,"aria-label":T(p)(`common.actions.refresh`),title:T(p)(`common.actions.refresh`),onClick:T(o).refresh},{default:t(()=>[...r[14]||=[D(`svg`,{viewBox:`0 0 20 20`,width:`18`,height:`18`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.5`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"aria-hidden":`true`},[D(`path`,{d:`M16 7a6.5 6.5 0 1 0 .5 5M16 3v4h-4`})],-1)]]),_:1},8,[`disabled`,`aria-label`,`title`,`onClick`])]))],2),n(De),T(o).feedback?(a(),k(`div`,{key:0,class:x([`feedback feedback-message`,{success:T(o).feedback.tone===`success`}]),role:`status`,"aria-live":`polite`},[D(`span`,null,_(T(o).feedback.message),1),D(`button`,{class:`feedback-dismiss`,type:`button`,"aria-label":T(p)(`common.actions.close`),onClick:r[0]||=(...e)=>T(o).clearFeedback&&T(o).clearFeedback(...e)},`×`,8,tn)],2)):m(``,!0),n(T(R),null,{default:t(({Component:e})=>[(a(),A(i(e)))]),_:1})],8,Xt)]))}}),[[`__scopeId`,`data-v-ae0a6b85`]]),rn=O({__name:`App`,setup(e){let t=I();return(e,n)=>T(t).meta.publicReport?(a(),A(T(R),{key:0})):(a(),A(nn,{key:1}))}}),an=`modulepreload`,on=function(e){return`/`+e},sn={},Z=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function s(e){return import.meta.resolve?import.meta.resolve(e):new URL(e,import.meta.url).href}r=o(t.map(t=>{if(t=on(t,n),t=s(t),t in sn)return;sn[t]=!0;let r=t.endsWith(`.css`);for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}let i=document.createElement(`link`);if(i.rel=r?`stylesheet`:an,r||(i.as=`script`),i.crossOrigin=``,i.href=t,a&&i.setAttribute(`nonce`,a),document.head.appendChild(i),r)return new Promise((e,n)=>{i.addEventListener(`load`,e),i.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})};function cn(e){let t=e.match(/^#\/knowledge\/([^/?#]+)\/([^/?#]+)\/(entity|relationship)\/([^/?#]+)(?:\?([^#]*))?$/);if(!t)return null;let[,n,r,i,a,o]=t;return`/knowledge/${n}/${r}/directory/${i}/${a}${o?`?${o}`:``}`}var Q=z({history:L(`/`),routes:[{path:`/roundtables`,name:`roundtables`,component:()=>Z(()=>import(`./RoundtablesPage-C9dXfWCl.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8])),meta:{publicReport:!0,title:`Agent Roundtable`}},{path:`/roundtables/:roomId`,name:`roundtable-room`,component:()=>Z(()=>import(`./RoundtablesPage-C9dXfWCl.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8])),meta:{publicReport:!0,title:`Agent Roundtable`}},{path:`/roundtables/:spaceId/:roomId`,name:`roundtable-project-room`,component:()=>Z(()=>import(`./RoundtablesPage-C9dXfWCl.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8])),meta:{publicReport:!0,title:`Agent Roundtable`}},{path:`/reports/jefa`,name:`shared-jefa-report`,component:()=>Z(()=>import(`./SharedJefaReportPage-CjpJ9bkk.js`),__vite__mapDeps([9,1,2,3,4,5,10,11,12,13,14,15])),meta:{publicReport:!0,title:`employees.share.title`}},{path:`/`,name:`overview`,component:()=>Z(()=>import(`./OverviewPage-0mYifpjp.js`),__vite__mapDeps([16,1,17,11,2,3,4,6,5,18,19,20,21,22,23])),meta:{eyebrow:``,title:`routes.overview.title`}},{path:`/preferences`,name:`personal-profile`,component:()=>Z(()=>import(`./PersonalProfilePage-JW6Muix6.js`),__vite__mapDeps([24,1,17,11,2,3,4,6,5,25,26,27,28,29,30,31,32,33,34,35])),meta:{eyebrow:`PERSONAL LENS`,title:`routes.preferences.title`,description:`routes.preferences.description`}},{path:`/preferences/writing`,name:`writing-taste`,component:()=>Z(()=>import(`./WritingTastePage-DaHWY61P.js`),__vite__mapDeps([36,1,17,11,2,3,4,6,5,37,31,25,26,32,28,33,34,38])),meta:{eyebrow:``,title:`routes.writingTaste.title`}},{path:`/personal/:spaceId/projects/:projectId/:mode/:itemKind/:itemId`,name:`personal-project-item`,component:()=>Z(()=>import(`./PersonalProjectsPage-CRbi64JP.js`),__vite__mapDeps([39,1,40,17,11,2,3,4,5,6,25,37,20,26,32,27,28,29,30,31,33,41])),meta:{eyebrow:`PERSONAL PROJECT`,title:`routes.personalProjects.title`}},{path:`/personal/:spaceId/projects/:mode/:itemKind/:itemId`,name:`personal-projects-item`,component:()=>Z(()=>import(`./PersonalProjectsPage-CRbi64JP.js`),__vite__mapDeps([39,1,40,17,11,2,3,4,5,6,25,37,20,26,32,27,28,29,30,31,33,41])),meta:{eyebrow:`PERSONAL PROJECTS`,title:`routes.personalProjects.title`,description:`routes.personalProjects.description`}},{path:`/personal/:spaceId/projects/:mode`,name:`personal-projects`,component:()=>Z(()=>import(`./PersonalProjectsPage-CRbi64JP.js`),__vite__mapDeps([39,1,40,17,11,2,3,4,5,6,25,37,20,26,32,27,28,29,30,31,33,41])),meta:{eyebrow:`PERSONAL PROJECTS`,title:`routes.personalProjects.title`,description:`routes.personalProjects.description`}},{path:`/personal/:spaceId/projects/:projectId/:mode`,name:`personal-project`,component:()=>Z(()=>import(`./PersonalProjectsPage-CRbi64JP.js`),__vite__mapDeps([39,1,40,17,11,2,3,4,5,6,25,37,20,26,32,27,28,29,30,31,33,41])),meta:{eyebrow:`PERSONAL PROJECT`,title:`routes.personalProjects.title`}},{path:`/organize`,name:`knowledge-organizer`,component:()=>Z(()=>import(`./KnowledgeOrganizerPage-DMBpGxLr.js`),__vite__mapDeps([42,1,17,11,2,3,4,25,26,32,27,28,29,30,31,33,43])),meta:{eyebrow:`KNOWLEDGE CLASSIFICATION`,title:`routes.organizer.title`}},{path:`/project-agents`,name:`project-agents`,component:()=>Z(()=>import(`./AgentsDirectoryPage-BTEfKZjF.js`),__vite__mapDeps([44,1,17,11,2,3,4,5,6,45,19,46,18,21,22,47,20,48,12,13,49,50,25,26,51,52])),meta:{eyebrow:``,title:`routes.projectAgents.title`}},{path:`/agents/:spaceId/:agentId`,name:`agent-profile`,component:()=>Z(()=>import(`./AgentProfilePage-D8Tvayn7.js`),__vite__mapDeps([53,1,17,11,2,3,4,5,6,50,18,37,20,54,55,56,57,21,22,52])),meta:{eyebrow:``,title:`agentProfiles.profile`}},{path:`/project-agents/manage`,name:`agent-management`,component:()=>Z(()=>import(`./ProjectAgentsPage-CPgKVLgg.js`),__vite__mapDeps([58,1,17,11,2,3,4,5,6,50,45,19,46,25,56,57,21,47,20,48,12,13,26,49,51,59])),meta:{eyebrow:``,title:`agentProfiles.advanced`}},{path:`/employees/:templateId`,name:`employee-workbench`,component:()=>Z(()=>import(`./EmployeeWorkbenchPage-CK2BAoGt.js`),__vite__mapDeps([60,1,17,11,2,3,4,5,6,50,45,19,46,18,25,54,55,12,13,49,20,26,51,10,14,61])),meta:{eyebrow:``,title:`routes.employeeWorkbench.title`,dedicatedWorkspace:!0}},{path:`/public-projects`,name:`public-projects`,component:()=>Z(()=>import(`./PublicProjectsPage-CB272Sq-.js`),__vite__mapDeps([62,1,17,11,2,3,4,5,25,20,26,32])),meta:{eyebrow:`PUBLIC PROJECTS`,title:`routes.publicProjects.title`,description:`routes.publicProjects.description`}},{path:`/knowledge`,name:`knowledge-default`,component:()=>Z(()=>import(`./KnowledgePage-POkCMW8f.js`),__vite__mapDeps([63,1,40,17,11,2,3,4,5,6,25,37,20,26,32,27,28,29,30,31,33,41])),meta:{eyebrow:`KNOWLEDGE BASE`,title:`routes.knowledge.title`}},{path:`/knowledge/:scope/:spaceId/:projectId/:mode/:itemKind/:itemId`,name:`project-knowledge-item`,component:()=>Z(()=>import(`./KnowledgePage-POkCMW8f.js`),__vite__mapDeps([63,1,40,17,11,2,3,4,5,6,25,37,20,26,32,27,28,29,30,31,33,41])),meta:{eyebrow:`KNOWLEDGE BASE`,title:`routes.knowledge.title`}},{path:`/knowledge/:scope/:spaceId/:mode/:itemKind/:itemId`,name:`knowledge-item`,component:()=>Z(()=>import(`./KnowledgePage-POkCMW8f.js`),__vite__mapDeps([63,1,40,17,11,2,3,4,5,6,25,37,20,26,32,27,28,29,30,31,33,41])),meta:{eyebrow:`KNOWLEDGE BASE`,title:`routes.knowledge.title`}},{path:`/knowledge/:scope/:spaceId/:projectId/:mode`,name:`project-knowledge`,component:()=>Z(()=>import(`./KnowledgePage-POkCMW8f.js`),__vite__mapDeps([63,1,40,17,11,2,3,4,5,6,25,37,20,26,32,27,28,29,30,31,33,41])),meta:{eyebrow:`KNOWLEDGE BASE`,title:`routes.knowledge.title`}},{path:`/knowledge/:scope/:spaceId/:mode`,name:`knowledge`,component:()=>Z(()=>import(`./KnowledgePage-POkCMW8f.js`),__vite__mapDeps([63,1,40,17,11,2,3,4,5,6,25,37,20,26,32,27,28,29,30,31,33,41])),meta:{eyebrow:`KNOWLEDGE BASE`,title:`routes.knowledge.title`}},{path:`/review`,name:`review`,component:()=>Z(()=>import(`./ReviewPage-CelTZU4C.js`),__vite__mapDeps([64,1,17,11,2,3,4,26,32,28])),meta:{eyebrow:`REVIEW WORKSPACE`,title:`routes.review.title`,description:`routes.review.description`}},{path:`/connections`,name:`connections`,component:()=>Z(()=>import(`./ConnectionsPage-DwOIcvl9.js`),__vite__mapDeps([65,1,17,11,2,3,4,37,26,32,66])),meta:{eyebrow:`SERVICE CONNECTIONS`,title:`routes.connections.title`,description:`routes.connections.description`}},{path:`/settings`,name:`settings`,component:()=>Z(()=>import(`./SettingsPage-nAijmm5f.js`),__vite__mapDeps([67,1,17,11,2,3,4,37,26,29,68])),meta:{eyebrow:``,title:`routes.settings.title`}},{path:`/about`,name:`about`,component:()=>Z(()=>import(`./AboutPage-D-GyJNv1.js`),__vite__mapDeps([69,1,3,70,71])),meta:{eyebrow:`FULI`,title:`routes.about.title`}},{path:`/:pathMatch(.*)*`,name:`not-found`,component:()=>Z(()=>import(`./NotFoundPage-BCMZbeB8.js`),__vite__mapDeps([72,1,6,5])),meta:{title:`common.errors.pageNotFound`}}],scrollBehavior:(e,t,n)=>n??(e.path!==t.path&&{top:0})});we(Q),Q.beforeEach(e=>e.path!==`/`||typeof window>`u`?!0:cn(window.location.hash)??!0),Q.afterEach(e=>{Ct(e.meta.title)});var $=w(rn);$.use(M()),$.use(C),$.use(Q),await Q.isReady().catch(()=>void 0),$.mount(`#app`);
@@ -1 +0,0 @@
1
- import{A as e,B as t,C as n,M as r,P as i,V as a,X as o,_ as s,a as c,b as l,d as ee,g as te,h as u,it as d,k as ne,m as re,nt as f,o as ie,rt as ae,tt as p,v as m,w as h,x as g,y as _}from"./i18n-D2CJkEYK.js";import{t as oe}from"./GrowthLoading-KTjE2e50.js";import{t as v}from"./_plugin-vue_export-helper-BDNMzG2s.js";import{n as y}from"./client-B2cRl-7c.js";import{t as se}from"./ProjectScopePicker-BwB7gK-7.js";var ce={class:`employee-all-projects`,"aria-labelledby":`employee-all-projects-title`},le={class:`employee-all-projects-header`},ue={class:`employee-all-projects-heading`},de={id:`employee-all-projects-title`},fe={class:`employee-all-projects-controls`},pe={class:`employee-all-projects-search`},me=[`placeholder`],he={key:0,class:`employee-all-projects-notice`,role:`status`},ge={key:1,class:`employee-all-projects-notice`,role:`status`},_e={key:2,class:`employee-all-projects-notice`,role:`status`},ve={key:3,class:`employee-all-projects-notice is-error`,role:`alert`},ye={key:4,class:`employee-all-projects-empty`},be={key:5,class:`employee-all-projects-empty`},xe={key:6,class:`employee-all-projects-empty`},Se={key:7,class:`employee-all-projects-board-shell`},Ce={key:0,id:`employee-drag-instructions`,class:`visually-hidden`},we={class:`visually-hidden`,"aria-live":`assertive`,"aria-atomic":`true`},Te=[`aria-label`],Ee=[`aria-label`],De=[`data-drag-placeholder`,`aria-hidden`],Oe=[`disabled`,`aria-label`,`onClick`],ke={class:`employee-all-projects-project`},Ae={key:0,class:`employee-all-projects-summary`},b={key:1,class:`employee-all-projects-tags`,"aria-hidden":`true`},x=[`disabled`,`aria-label`,`title`,`onPointerdown`,`onKeydown`],S={class:`employee-all-projects-project`},C={key:0,class:`employee-all-projects-summary`},w=v(h({__name:`EmployeeTaskBoard`,props:{boards:{},projects:{},visibleProjectIds:{},failedProjects:{},movingItemKeys:{},actionError:{},canMoveTasks:{type:Boolean},readOnly:{type:Boolean},resettableFilter:{type:Boolean},filterStorageUnavailable:{type:Boolean}},emits:[`select-task`,`create-task`,`update:visible-project-ids`,`move-task`,`retry`,`reset-project-filter`],setup(h,{emit:v}){let y=h,w=v,T=o(``),E=o(null),D=0,O={x:0,y:0},k=o(``),A=o(null),j=null,M=0,N=[{value:`planned`,labelKey:`employees.allProjects.status.planned`},{value:`active`,labelKey:`employees.allProjects.status.active`},{value:`blocked`,labelKey:`employees.allProjects.status.blocked`},{value:`review`,labelKey:`employees.allProjects.status.review`},{value:`done`,labelKey:`employees.allProjects.status.done`}],P=s(()=>new Map(y.boards.map(({project:e})=>[e.id,e.name]))),F=s(()=>y.boards.flatMap(({items:e})=>e)),I=s(()=>{let e=T.value.trim().toLocaleLowerCase();return e?F.value.filter(t=>[t.title,t.summary,P.value.get(t.projectId),...t.tags??[]].filter(Boolean).join(` `).toLocaleLowerCase().includes(e)):F.value}),L=s(()=>N.map(e=>({...e,items:I.value.filter(({status:t})=>t===e.value)}))),R=s(()=>y.boards.filter(({truncated:e})=>e).length),je=s(()=>y.visibleProjectIds.length>0),Me=s(()=>F.value.length>0),Ne=s(()=>I.value.length>0);function z(e){return P.value.get(e)??e}function Pe(){w(`update:visible-project-ids`,y.projects.map(e=>e.id))}function B(e){return`${e.projectId}:${e.id}`}function V(e){return y.movingItemKeys?.includes(B(e))??!1}function H(e){let t=L.value.find(t=>t.value===e)?.items??[],n=A.value;if(!n||n.keyboard)return t;let r=t.filter(e=>B(e)!==B(n.item));if(n.targetStatus!==e)return r;let i=[...r];return i.splice(Math.min(n.targetIndex,i.length),0,n.item),i}function U(e){return A.value!==null&&B(A.value.item)===B(e)}function W(e){let t=N.find(t=>t.value===e);return t?c(t.labelKey):e}function G(e,t,n){if(e.button!==0||V(t))return;let r=e.currentTarget.closest(`.employee-all-projects-task`);if(!r)return;let i=r.getBoundingClientRect();j={item:t,sourceIndex:n,pointerId:e.pointerId,startX:e.clientX,startY:e.clientY,offsetX:e.clientX-i.left,offsetY:e.clientY-i.top,rect:i},document.addEventListener(`pointermove`,K),document.addEventListener(`pointerup`,Y),document.addEventListener(`pointercancel`,X)}function Fe(e,t){A.value={item:t.item,sourceStatus:t.item.status,sourceIndex:t.sourceIndex,targetStatus:t.item.status,targetIndex:t.sourceIndex,left:e.clientX-t.offsetX,top:e.clientY-t.offsetY,width:t.rect.width,height:t.rect.height,offsetX:t.offsetX,offsetY:t.offsetY,phase:`dragging`,duration:0,keyboard:!1},k.value=c(`employees.allProjects.dragLifted`,{task:t.item.title,status:W(t.item.status)}),document.body.classList.add(`employee-task-is-dragging`)}function K(e){let t=j;if(!(!t||e.pointerId!==t.pointerId)){if(!A.value){if(Math.hypot(e.clientX-t.startX,e.clientY-t.startY)<5)return;Fe(e,t)}!A.value||A.value.phase!==`dragging`||(e.preventDefault(),A.value.left=e.clientX-A.value.offsetX,A.value.top=e.clientY-A.value.offsetY,O={x:e.clientX,y:e.clientY},D||=requestAnimationFrame(q),J(e.clientX,e.clientY))}}function q(){if(D=0,!A.value||A.value.phase!==`dragging`||A.value.keyboard)return;let e=E.value;if(!e)return;let t=e.getBoundingClientRect(),n=(e,t,n)=>e<t+48?-Math.min(16,(t+48-e)/3):e>n-48?Math.min(16,(e-n+48)/3):0;O.y>=t.top&&O.y<=t.bottom&&(e.scrollLeft+=n(O.x,t.left,t.right));let r=document.elementsFromPoint(O.x,O.y).map(e=>e.closest(`.employee-all-projects-list`)).find(t=>t&&e.contains(t));if(r){let e=r.getBoundingClientRect();r.scrollTop+=n(O.y,e.top,e.bottom)}J(O.x,O.y),D=requestAnimationFrame(q)}function J(e,t){let n=A.value;if(!n)return;let r=document.elementsFromPoint(e,t).map(e=>e.closest(`.employee-all-projects-list`)).find(Boolean);if(!r)return;let i=r.dataset.status;if(!i||!N.some(e=>e.value===i))return;let a=[...r.querySelectorAll(`.employee-all-projects-task:not(.is-placeholder)`)],o=a.findIndex(e=>t<e.getBoundingClientRect().top+e.getBoundingClientRect().height/2);n.targetStatus=i,n.targetIndex=o<0?a.length:o}function Y(e){!j||e.pointerId!==j.pointerId||(j=null,Z(),A.value&&Q(!0))}function X(){j=null,Z(),$()}function Z(){D&&cancelAnimationFrame(D),D=0,document.removeEventListener(`pointermove`,K),document.removeEventListener(`pointerup`,Y),document.removeEventListener(`pointercancel`,X)}function Ie(e,t,n){if(V(e))return;let r=n.closest(`.employee-all-projects-task`);if(!r)return;let i=r.getBoundingClientRect();A.value={item:e,sourceStatus:e.status,sourceIndex:t,targetStatus:e.status,targetIndex:t,left:i.left,top:i.top,width:i.width,height:i.height,offsetX:0,offsetY:0,phase:`dragging`,duration:0,keyboard:!0},k.value=c(`employees.allProjects.dragLifted`,{task:e.title,status:W(e.status)})}function Le(e,t,n){let r=A.value;if(!r){if(e.key!==` `&&e.key!==`Enter`)return;e.preventDefault(),Ie(t,n,e.currentTarget);return}if(!r.keyboard||B(r.item)!==B(t))return;if(e.key===`Escape`){e.preventDefault(),$(),k.value=c(`employees.allProjects.dragCancelled`);return}if(e.key===` `||e.key===`Enter`){e.preventDefault(),Q(!1);return}let i=N.findIndex(e=>e.value===r.targetStatus);if(e.key===`ArrowLeft`||e.key===`ArrowRight`){e.preventDefault();let t=e.key===`ArrowLeft`?-1:1,n=N[Math.max(0,Math.min(N.length-1,i+t))];n&&(r.targetStatus=n.value,r.targetIndex=H(n.value).length)}else if(e.key===`ArrowUp`||e.key===`ArrowDown`)e.preventDefault(),r.targetIndex=Math.max(0,r.targetIndex+(e.key===`ArrowUp`?-1:1));else return;k.value=c(`employees.allProjects.dragMoved`,{status:W(r.targetStatus)})}async function Q(e){let t=A.value;if(!t)return;if(t.targetStatus===t.sourceStatus){$(),k.value=c(`employees.allProjects.dragCancelled`);return}if(e){await ne();let e=[...document.querySelectorAll(`[data-drag-placeholder="true"]`)][0]?.getBoundingClientRect();if(e){let n=Math.hypot(e.left-t.left,e.top-t.top);t.duration=Math.round(Math.min(360,Math.max(180,180+n*.16))),t.phase=`dropping`,t.left=e.left,t.top=e.top,await new Promise(e=>{M=window.setTimeout(e,t.duration)})}}let n=t.item,r=t.targetStatus;k.value=c(`employees.allProjects.dragDropped`,{task:n.title,status:W(r)}),w(`move-task`,n,r),A.value=null,document.body.classList.remove(`employee-task-is-dragging`)}function $(){M&&window.clearTimeout(M),M=0,A.value=null,document.body.classList.remove(`employee-task-is-dragging`)}return e(()=>{Z(),$()}),(e,o)=>(r(),g(`section`,ce,[m(`header`,le,[m(`div`,ue,[m(`h2`,de,d(p(c)(`employees.allProjects.title`)),1)]),m(`div`,fe,[h.canMoveTasks?(r(),g(`button`,{key:0,class:`employee-board-create`,type:`button`,onClick:o[0]||=e=>w(`create-task`)},`+ `+d(p(c)(`employees.task.create`)),1)):l(``,!0),n(se,{class:`employee-all-projects-filter`,"model-value":h.visibleProjectIds,projects:h.projects,compact:``,"show-count":``,resettable:h.resettableFilter,label:p(c)(`employees.allProjects.projectFilter`),hint:p(c)(`employees.allProjects.projectFilterHint`),"empty-label":p(c)(`employees.allProjects.noProjectsVisible`),"onUpdate:modelValue":o[1]||=e=>w(`update:visible-project-ids`,e),onReset:o[2]||=e=>w(`reset-project-filter`)},null,8,[`model-value`,`projects`,`resettable`,`label`,`hint`,`empty-label`]),m(`label`,pe,[m(`span`,null,d(p(c)(`employees.allProjects.search`)),1),a(m(`input`,{"onUpdate:modelValue":o[3]||=e=>T.value=e,type:`search`,placeholder:p(c)(`employees.allProjects.searchPlaceholder`)},null,8,me),[[ee,T.value]])])])]),h.filterStorageUnavailable?(r(),g(`div`,he,d(p(c)(`employees.scope.storageUnavailable`)),1)):l(``,!0),h.failedProjects?(r(),g(`div`,ge,[m(`span`,null,d(p(c)(`employees.allProjects.partial`,{loaded:h.boards.length,total:h.visibleProjectIds.length,failed:h.failedProjects})),1),m(`button`,{type:`button`,onClick:o[4]||=e=>w(`retry`)},d(p(c)(`employees.retry`)),1)])):l(``,!0),R.value?(r(),g(`div`,_e,d(p(c)(`employees.allProjects.truncated`,{count:R.value})),1)):l(``,!0),h.actionError?(r(),g(`div`,ve,d(h.actionError),1)):l(``,!0),je.value?Me.value?Ne.value?(r(),g(`div`,Se,[h.canMoveTasks?(r(),g(`p`,Ce,d(p(c)(`employees.allProjects.dragHint`)),1)):l(``,!0),m(`p`,we,d(k.value),1),m(`div`,{ref_key:`boardElement`,ref:E,class:f([`employee-all-projects-board`,{"is-dragging":A.value}]),"aria-label":p(c)(`employees.allProjects.boardLabel`)},[(r(!0),g(u,null,i(L.value,e=>(r(),g(`section`,{key:e.value,class:f([`employee-all-projects-column`,{"is-drop-target":A.value?.targetStatus===e.value}])},[m(`header`,null,[m(`h3`,null,d(p(c)(e.labelKey)),1),m(`span`,{"aria-label":p(c)(`employees.allProjects.taskCount`,{count:H(e.value).length})},d(H(e.value).length),9,Ee)]),n(ie,{name:`employee-task-shift`,tag:`div`,class:`employee-all-projects-list`,"data-status":e.value},{default:t(()=>[(r(!0),g(u,null,i(H(e.value),(e,t)=>(r(),g(`article`,{key:B(e),class:f([`employee-all-projects-task`,{"is-placeholder":U(e),"is-saving":V(e)}]),"data-drag-placeholder":U(e)?`true`:void 0,"aria-hidden":U(e)?`true`:void 0},[m(`button`,{type:`button`,class:`employee-all-projects-task-open`,disabled:V(e)||h.readOnly,"aria-label":p(c)(`employees.allProjects.openTask`,{project:z(e.projectId),task:e.title}),onClick:t=>w(`select-task`,e)},[m(`span`,ke,d(z(e.projectId)),1),m(`strong`,null,d(e.title),1),e.summary&&e.summary!==e.title?(r(),g(`span`,Ae,d(e.summary),1)):l(``,!0),e.tags?.length?(r(),g(`span`,b,[(r(!0),g(u,null,i(e.tags.slice(0,3),e=>(r(),g(`span`,{key:e},d(e),1))),128))])):l(``,!0)],8,Oe),h.canMoveTasks?(r(),g(`button`,{key:0,type:`button`,class:`employee-all-projects-drag-handle`,disabled:V(e),"aria-label":p(c)(`employees.allProjects.dragTask`,{task:e.title}),title:p(c)(`employees.allProjects.dragTask`,{task:e.title}),"aria-describedby":`employee-drag-instructions`,onPointerdown:re(n=>G(n,e,t),[`stop`,`prevent`]),onKeydown:n=>Le(n,e,t)},[...o[5]||=[m(`svg`,{width:`16`,height:`16`,viewBox:`0 0 16 16`,fill:`currentColor`,"aria-hidden":`true`},[m(`circle`,{cx:`5`,cy:`4`,r:`1`}),m(`circle`,{cx:`11`,cy:`4`,r:`1`}),m(`circle`,{cx:`5`,cy:`8`,r:`1`}),m(`circle`,{cx:`11`,cy:`8`,r:`1`}),m(`circle`,{cx:`5`,cy:`12`,r:`1`}),m(`circle`,{cx:`11`,cy:`12`,r:`1`})],-1)]],40,x)):l(``,!0),V(e)?(r(),_(oe,{key:1,class:`employee-all-projects-saving`,variant:`inline`,label:p(c)(`employees.allProjects.saving`)},null,8,[`label`])):l(``,!0)],10,De))),128)),H(e.value).length?l(``,!0):(r(),g(`p`,{key:`${e.value}-empty`,class:`employee-all-projects-column-empty`},d(p(c)(`employees.allProjects.columnEmpty`)),1))]),_:2},1032,[`data-status`])],2))),128))],10,Te)])):(r(),g(`div`,xe,[m(`h3`,null,d(p(c)(`employees.allProjects.noMatch`)),1),m(`p`,null,d(p(c)(`employees.allProjects.noMatchHint`)),1)])):(r(),g(`div`,be,[m(`h3`,null,d(p(c)(`employees.allProjects.empty`)),1),m(`p`,null,d(p(c)(`employees.allProjects.emptyHint`)),1)])):(r(),g(`div`,ye,[m(`h3`,null,d(p(c)(`employees.allProjects.noProjectsVisible`)),1),m(`p`,null,d(p(c)(`employees.allProjects.noProjectsVisibleHint`)),1),m(`button`,{type:`button`,onClick:Pe},d(p(c)(`employees.allProjects.showAllProjects`)),1)])),(r(),_(te,{to:`body`},[A.value&&!A.value.keyboard?(r(),g(`article`,{key:0,class:f([`employee-all-projects-task employee-all-projects-drag-preview`,{"is-dropping":A.value.phase===`dropping`}]),style:ae({width:`${A.value.width}px`,height:`${A.value.height}px`,"--employee-drag-x":`${A.value.left}px`,"--employee-drag-y":`${A.value.top}px`,"--employee-drop-duration":`${A.value.duration}ms`}),"aria-hidden":`true`},[m(`span`,S,d(z(A.value.item.projectId)),1),m(`strong`,null,d(A.value.item.title),1),A.value.item.summary&&A.value.item.summary!==A.value.item.title?(r(),g(`span`,C,d(A.value.item.summary),1)):l(``,!0)],6)):l(``,!0)]))]))}}),[[`__scopeId`,`data-v-39c02ffb`]]);async function T(e){let t=await y(`/employee-workspaces/jefa/${encodeURIComponent(e.id)}/api/public/${encodeURIComponent(e.slug)}`);if(t?.project?.id!==e.id||typeof t.project.name!=`string`||!Array.isArray(t.items))throw Error(`Invalid public projection`);let n=t.items.filter(e=>e&&typeof e.id==`string`&&typeof e.title==`string`&&[`planned`,`active`,`blocked`,`review`,`done`].includes(e.status)).map(t=>({id:t.id,projectId:e.id,title:t.title,status:t.status,priority:t.priority}));return{project:{id:t.project.id,name:t.project.name},items:n,total:n.length,truncated:!1}}function E(e,t){let n=new URL(`/reports/jefa`,t);return n.hash=new URLSearchParams(e.map(e=>[`p`,JSON.stringify([e.id,e.slug])])).toString(),n.href}function D(e){let t=new URLSearchParams(e.replace(/^#/,``)).getAll(`p`);if(!t.length||t.length>100)throw Error(`Invalid report scope`);let n=new Set;return t.map(e=>{let t=JSON.parse(e);if(!Array.isArray(t)||t.length!==2||typeof t[0]!=`string`||!t[0]||t[0].length>160||typeof t[1]!=`string`||!/^share-[a-zA-Z0-9-]{16,100}$/.test(t[1])||n.has(t[0]))throw Error(`Invalid report scope`);return n.add(t[0]),{id:t[0],slug:t[1]}})}export{w as i,D as n,E as r,T as t};
@@ -1 +0,0 @@
1
- import{A as e,R as t,X as n,k as r}from"./i18n-D2CJkEYK.js";var i=[`button:not([disabled])`,`input:not([disabled]):not([type="hidden"])`,`select:not([disabled])`,`textarea:not([disabled])`,`a[href]`,`[contenteditable="true"]`,`[tabindex]:not([tabindex="-1"])`].join(`,`);function a(i,a){let s=n(null),c=n(null),l=null,u=0;t(i,e=>{let t=++u;if(e){l=document.activeElement instanceof HTMLElement?document.activeElement:null,r().then(()=>{if(t!==u||!i())return;let e=s.value;e&&(e.open||e.showModal(),(c.value??o(e)[0])?.focus({preventScroll:!0}))});return}let n=s.value;n?.open&&n.close(),d(t)},{immediate:!0}),e(()=>{u+=1;let e=s.value;e?.open&&e.close();let t=l;l=null,t?.isConnected&&t.focus({preventScroll:!0})});function d(e){let t=l;l=null,r().then(()=>{e!==u||!t?.isConnected||t.focus({preventScroll:!0})})}function f(e){e.preventDefault(),a()}function p(e){if(e.key!==`Tab`)return;let t=s.value;if(!t)return;let n=o(t);if(!n.length){e.preventDefault(),t.focus({preventScroll:!0});return}let r=n[0],i=n.at(-1)??r,a=document.activeElement;e.shiftKey&&(a===r||!t.contains(a))?(e.preventDefault(),i.focus({preventScroll:!0})):!e.shiftKey&&(a===i||!t.contains(a))&&(e.preventDefault(),r.focus({preventScroll:!0}))}return{dialogRef:s,initialFocusRef:c,onCancel:f,onKeydown:p}}function o(e){return[...e.querySelectorAll(i)].filter(e=>!e.hidden&&e.getAttribute(`aria-hidden`)!==`true`)}export{a as t};
@@ -1,46 +0,0 @@
1
- # Agent Roundtable
2
-
3
- Roundtable gives invited AI participants a shared goal, public responsibilities, addressed messages, and an ordered workflow from discussion to implementation and review.
4
-
5
- ## Start
6
-
7
- Requires Node.js 24.12 or newer.
8
-
9
- ```sh
10
- npm install -g fuli-context@latest
11
- fl roundtable serve --data-dir ./roundtable-data --port 3738
12
- ```
13
-
14
- Open the local Roundtable page, create a goal, select 2–6 seats and issue an invitation for each participant. Each room has one moderator; collaboration rooms also have an implementer and an independent reviewer. Room history persists in the selected data directory.
15
-
16
- ## AI onboarding
17
-
18
- Connect the invited client to the room MCP URL shown by the invitation dialog, with its seat credential in the client's Bearer authentication setting. The MCP server supplies onboarding instructions and tools:
19
-
20
- 1. `discover_roundtable` identifies the participant's seat, workflow, roster and next action.
21
- 2. `join_roundtable` accepts the participant's own introduction, responsibilities and capabilities.
22
- 3. `discover_roundtable` finds matching peers; `message_roundtable` sends a room-visible question or handoff to a selected seat.
23
- 4. `read_roundtable` retrieves shared messages and tasks.
24
- 5. `claim_roundtable_turn` claims the participant's assigned turn. `submit_roundtable_turn` records the result, artifacts and review verdict.
25
-
26
- The room-specific MCP connection supplies its room ID automatically. When using these tools through the general FULI MCP server, supply the room ID and seat credential explicitly.
27
-
28
- Self-descriptions help peers choose collaborators. They do not change the seat's execution grants. Peer messages are shared task material; room ownership and permissions remain with the user.
29
-
30
- ## Local workers
31
-
32
- Store the invitation in `FULI_ROUNDTABLE_TOKEN`, then run a worker with an already configured client:
33
-
34
- ```sh
35
- fl roundtable worker --url https://COORDINATOR --room ROOM_ID --runtime codex --workspace ./project
36
- ```
37
-
38
- Use `claude-code`, `pi`, `grok` or `a2a` for the corresponding adapter. Workers default to read only. Implementation requires both an owner-granted workspace and `--allow-write`. Reviews remain read only.
39
-
40
- Grok uses `XAI_API_KEY` and `XAI_MODEL`. A2A uses `--a2a-url` and, when needed, `FULI_A2A_TOKEN`. Pi uses an installed Ollama model selected with `--model`; it is an experimental adapter and requires a tool-capable model with sufficient context.
41
-
42
- ## Sharing a coordinator
43
-
44
- Use a reachable HTTPS endpoint and `--public-url https://COORDINATOR`. Expose `/roundtable-peer/` through the proxy; retain the owner console on local loopback. Each invitation is limited to one room and seat and can be revoked.
45
-
46
- Roundtable shares task messages and artifact references. Give reviewers authorized access to the actual artifacts through the shared workspace or referenced revision. Pause, resume, stop and completion remain available to the room owner.
@@ -1,374 +0,0 @@
1
- import { lookup } from 'node:dns/promises';
2
- import { isIP } from 'node:net';
3
- import { randomUUID } from 'node:crypto';
4
- import { setTimeout as delay } from 'node:timers/promises';
5
- import { request as httpsRequest } from 'node:https';
6
- import { Readable } from 'node:stream';
7
-
8
- const OUTPUT_LIMIT = 16 * 1024;
9
- const RESPONSE_LIMIT = 1024 * 1024;
10
-
11
- class A2AParticipantError extends Error {
12
- constructor(code, status = null) {
13
- const messages = {
14
- invalid_endpoint: 'A2A requires an explicitly configured public HTTPS endpoint on one origin.',
15
- waiting_auth: 'Remote A2A authentication or permission is required.',
16
- waiting_input: 'The remote A2A participant requires additional input.',
17
- unsupported_protocol: 'The remote agent does not advertise a supported A2A protocol interface.',
18
- response_invalid: 'The remote A2A participant returned an invalid or mismatched result.',
19
- response_too_large: 'The remote A2A response exceeds the transport limit.',
20
- output_too_large: 'The remote A2A output exceeds the roundtable message limit.',
21
- remote_failed: 'The remote A2A task or request failed.',
22
- cancelled: 'The remote A2A turn was interrupted.',
23
- timeout: 'The remote A2A turn timed out.',
24
- participant_busy: 'The A2A participant already has a running turn.',
25
- participant_closed: 'The A2A participant is closed.'
26
- };
27
- super(messages[code] ?? messages.remote_failed);
28
- this.code = code;
29
- if (status !== null) this.status = status;
30
- }
31
- }
32
-
33
- function publicAddress(address) {
34
- if (isIP(address) === 4) {
35
- const [a, b] = address.split('.').map(Number);
36
- return a !== 0 && a !== 10 && a !== 127 && a < 224 &&
37
- !(a === 169 && b === 254) && !(a === 172 && b >= 16 && b <= 31) &&
38
- !(a === 192 && [0, 168].includes(b)) && !(a === 100 && b >= 64 && b <= 127) &&
39
- !(a === 198 && [18, 19].includes(b));
40
- }
41
- if (isIP(address) === 6) {
42
- const normalized = address.toLowerCase();
43
- if (normalized.startsWith('::ffff:')) {
44
- const embedded = normalized.slice(7);
45
- return isIP(embedded) === 4 && publicAddress(embedded);
46
- }
47
- // Global unicast only; reject loopback, ULA, link-local and multicast.
48
- return /^[23][0-9a-f]{0,3}:/.test(normalized) && !normalized.startsWith('2001:db8:');
49
- }
50
- return false;
51
- }
52
-
53
- function endpointUrl(value) {
54
- let target;
55
- try { target = new URL(value); } catch { throw new A2AParticipantError('invalid_endpoint'); }
56
- const hostname = target.hostname.replace(/^\[|\]$/g, '').toLowerCase();
57
- if (target.protocol !== 'https:' || target.username || target.password || target.hash ||
58
- /(^|\.)(localhost|local|internal|lan|home|test|invalid)$/.test(hostname) ||
59
- (!isIP(hostname) && !hostname.includes('.')) || (isIP(hostname) && !publicAddress(hostname))) {
60
- throw new A2AParticipantError('invalid_endpoint');
61
- }
62
- return target;
63
- }
64
-
65
- function redact(value, secret) {
66
- return secret && typeof value === 'string' ? value.replaceAll(secret, '[REDACTED_SECRET]') : value;
67
- }
68
-
69
- function boundedText(value, secret, trim = true) {
70
- const text = redact(typeof value === 'string' ? value : '', secret);
71
- const result = trim ? text.trim() : text;
72
- if (Buffer.byteLength(result, 'utf8') > OUTPUT_LIMIT) throw new A2AParticipantError('output_too_large');
73
- return result;
74
- }
75
-
76
- function identifier(value, secret) {
77
- const text = boundedText(value, secret);
78
- if (!text || text.length > 256 || (secret && value.includes(secret))) throw new A2AParticipantError('response_invalid');
79
- return text;
80
- }
81
-
82
- async function abortableLookup(lookupImpl, hostname, signal) {
83
- signal?.throwIfAborted();
84
- let onAbort;
85
- const aborted = new Promise((_, reject) => {
86
- onAbort = () => reject(signal.reason);
87
- signal?.addEventListener('abort', onAbort, { once: true });
88
- });
89
- try {
90
- return await Promise.race([lookupImpl(hostname, { all: true, verbatim: true }), aborted]);
91
- } finally {
92
- signal?.removeEventListener('abort', onAbort);
93
- }
94
- }
95
-
96
- function partsText(parts) {
97
- return (parts ?? []).filter((part) => part.content?.$case === 'text')
98
- .map((part) => part.content.value).join('\n');
99
- }
100
-
101
- function usageFromMetadata(metadata) {
102
- const value = metadata?.usage;
103
- const count = (number) => Number.isSafeInteger(number) && number >= 0 ? number : null;
104
- const totalTokens = count(value?.totalTokens ?? value?.total_tokens);
105
- if (totalTokens === null) return null;
106
- return { source: 'executor', totalTokens, inputTokens: count(value.inputTokens ?? value.input_tokens),
107
- outputTokens: count(value.outputTokens ?? value.output_tokens), cachedInputTokens: null,
108
- cacheWriteInputTokens: null, reasoningOutputTokens: null };
109
- }
110
-
111
- function limitedResponse(response) {
112
- if (!response.body) throw new A2AParticipantError('response_invalid');
113
- let bytes = 0;
114
- const body = response.body.pipeThrough(new TransformStream({
115
- transform(chunk, controller) {
116
- bytes += chunk.byteLength;
117
- if (bytes > RESPONSE_LIMIT) throw new A2AParticipantError('response_too_large');
118
- controller.enqueue(chunk);
119
- }
120
- }));
121
- return new Response(body, { status: response.status, statusText: response.statusText, headers: response.headers });
122
- }
123
-
124
- function pinnedHttpsFetch(target, init, addresses, requestImpl) {
125
- return new Promise((resolve, reject) => {
126
- const request = requestImpl(target, {
127
- method: init.method ?? 'GET', signal: init.signal,
128
- headers: Object.fromEntries(init.headers),
129
- lookup(_hostname, options, callback) {
130
- const matching = addresses.filter((entry) => !options.family || entry.family === options.family);
131
- if (!matching.length) return callback(new A2AParticipantError('invalid_endpoint'));
132
- if (options.all) callback(null, matching);
133
- else callback(null, matching[0].address, matching[0].family);
134
- }
135
- }, (incoming) => {
136
- const headers = new Headers();
137
- for (const [name, value] of Object.entries(incoming.headers)) {
138
- for (const item of Array.isArray(value) ? value : [value]) {
139
- if (item !== undefined) headers.append(name, item);
140
- }
141
- }
142
- const bodyless = [204, 205, 304].includes(incoming.statusCode);
143
- if (bodyless) incoming.resume();
144
- resolve(new Response(bodyless ? null : Readable.toWeb(incoming), {
145
- status: incoming.statusCode, statusText: incoming.statusMessage, headers
146
- }));
147
- });
148
- request.on('error', reject);
149
- request.end(init.body);
150
- });
151
- }
152
-
153
- /** A2A SDK client adapter. Remote completion is a turn result, not Fuli task verification. */
154
- export function createA2AParticipant({
155
- url,
156
- env = process.env,
157
- fetchImpl,
158
- lookupImpl = lookup,
159
- httpsRequestImpl = httpsRequest,
160
- cardPath = '/.well-known/agent-card.json',
161
- legacyCompat = false,
162
- timeoutMs = 5 * 60 * 1000,
163
- pollIntervalMs = 500
164
- } = {}) {
165
- const secret = typeof env.FULI_A2A_TOKEN === 'string' ? env.FULI_A2A_TOKEN.trim() : '';
166
- let client = null;
167
- let sdk = null;
168
- let card = null;
169
- let contextId = '';
170
- let pendingTaskId = '';
171
- let active = null;
172
- let closed = false;
173
-
174
- async function safeFetch(input, init = {}) {
175
- const configured = endpointUrl(url);
176
- const target = endpointUrl(input instanceof Request ? input.url : String(input));
177
- if (target.origin !== configured.origin) throw new A2AParticipantError('invalid_endpoint');
178
- const hostname = target.hostname.replace(/^\[|\]$/g, '');
179
- let addresses = [{ address: hostname, family: isIP(hostname) }];
180
- if (!isIP(hostname)) {
181
- addresses = await abortableLookup(lookupImpl, hostname, init.signal);
182
- if (!addresses.length || addresses.some((item) => !publicAddress(item.address))) {
183
- throw new A2AParticipantError('invalid_endpoint');
184
- }
185
- }
186
- init.signal?.throwIfAborted();
187
- const headers = new Headers(init.headers);
188
- if (secret) headers.set('Authorization', `Bearer ${secret}`);
189
- const requestInit = { ...init, headers, redirect: 'error' };
190
- // The default transport uses the validated DNS answer rather than resolving again at connection time.
191
- const response = fetchImpl && fetchImpl !== globalThis.fetch
192
- ? await fetchImpl(target, requestInit)
193
- : await pinnedHttpsFetch(target, requestInit, addresses, httpsRequestImpl);
194
- if (response.redirected || (response.url && new URL(response.url).origin !== configured.origin)) {
195
- await response.body?.cancel();
196
- throw new A2AParticipantError('invalid_endpoint');
197
- }
198
- if (!response.ok) {
199
- await response.body?.cancel();
200
- throw new A2AParticipantError([401, 403].includes(response.status) ? 'waiting_auth' : 'remote_failed', response.status);
201
- }
202
- return limitedResponse(response);
203
- }
204
-
205
- function safeFailure(error, signal) {
206
- if (signal?.aborted) return new A2AParticipantError(signal.reason?.name === 'TimeoutError' ? 'timeout' : 'cancelled');
207
- return error instanceof A2AParticipantError ? error : new A2AParticipantError('remote_failed');
208
- }
209
-
210
- async function connect(signal) {
211
- if (closed) throw new A2AParticipantError('participant_closed');
212
- endpointUrl(url);
213
- if (secret && /[\r\n]/.test(secret)) throw new A2AParticipantError('waiting_auth');
214
- const response = await safeFetch(new URL(cardPath, url), { signal, headers: { 'A2A-Version': '1.0' } });
215
- const rawCard = await response.json();
216
- const [protocol, clients] = await Promise.all([import('@a2a-js/sdk'), import('@a2a-js/sdk/client')]);
217
- sdk = protocol;
218
- const resolver = new clients.DefaultAgentCardResolver({ legacyCompat: { enabled: legacyCompat } });
219
- card = resolver.normalizeAgentCard(rawCard);
220
- if (!card.supportedInterfaces?.length) throw new A2AParticipantError('unsupported_protocol');
221
- for (const entry of card.supportedInterfaces) {
222
- if (endpointUrl(entry.url).origin !== endpointUrl(url).origin) throw new A2AParticipantError('invalid_endpoint');
223
- }
224
- const compatible = card.supportedInterfaces.filter((entry) =>
225
- ['JSONRPC', 'HTTP+JSON'].includes(entry.protocolBinding.toUpperCase()) &&
226
- (/^1\.0(?:\.0)?$/.test(entry.protocolVersion) || (legacyCompat && /^0\.3(?:\.\d+)?$/.test(entry.protocolVersion))));
227
- if (!compatible.length) throw new A2AParticipantError('unsupported_protocol');
228
- if (card.securityRequirements?.length && !secret) throw new A2AParticipantError('waiting_auth');
229
- const factory = new clients.ClientFactory({
230
- transports: [new clients.JsonRpcTransportFactory({ fetchImpl: safeFetch, legacyCompat: { enabled: legacyCompat } }),
231
- new clients.RestTransportFactory({ fetchImpl: safeFetch, legacyCompat: { enabled: legacyCompat } })],
232
- clientConfig: { polling: true, acceptedOutputModes: ['text/plain'] }, cardResolver: resolver
233
- });
234
- client = await factory.createFromAgentCard({ ...card, supportedInterfaces: compatible });
235
- }
236
-
237
- return {
238
- describe() {
239
- return { applicationLabel: 'A2A', automatic: true, workspaceWrite: false, cancel: 'remote_request', reportsUsage: false };
240
- },
241
- async preflight({ signal } = {}) {
242
- const boundedSignal = signal ? AbortSignal.any([signal, AbortSignal.timeout(timeoutMs)]) : AbortSignal.timeout(timeoutMs);
243
- try {
244
- if (active) throw new A2AParticipantError('participant_busy');
245
- await connect(boundedSignal);
246
- return { ready: true, applicationLabel: 'A2A', name: boundedText(card.name, secret),
247
- protocolVersion: client.protocolVersion, streaming: Boolean(card.capabilities?.streaming), evidence: 'agent_card_discovery' };
248
- } catch (error) {
249
- if (!active) client = null;
250
- const failure = safeFailure(error, boundedSignal);
251
- return { ready: false, code: failure.code, reason: failure.message };
252
- }
253
- },
254
- async dispatch({ prompt, signal, turn } = {}) {
255
- if (closed) throw new A2AParticipantError('participant_closed');
256
- if (active) throw new A2AParticipantError('participant_busy');
257
- if (typeof prompt !== 'string' || !prompt.trim()) throw new A2AParticipantError('response_invalid');
258
- const controller = new AbortController();
259
- const boundedSignal = AbortSignal.any([controller.signal, AbortSignal.timeout(timeoutMs), ...(signal ? [signal] : [])]);
260
- active = controller;
261
- let remoteTaskId = '';
262
- let cancellation = null;
263
- let task = null;
264
- let message = null;
265
- let eventCount = 0;
266
- const artifacts = new Map();
267
- const actualRecord = () => {
268
- if (!remoteTaskId && !message?.messageId) return null;
269
- const metadata = message?.metadata ?? task?.metadata;
270
- const model = typeof metadata?.model === 'string' && metadata.model.length <= 256
271
- ? redact(metadata.model, secret) : null;
272
- return { sourceApplication: 'other', applicationLabel: 'A2A', provider: 'a2a', model,
273
- sessionId: identifier(contextId || remoteTaskId || message?.messageId, secret),
274
- remoteTaskId: remoteTaskId ? identifier(remoteTaskId, secret) : null,
275
- usage: usageFromMetadata(metadata), evidence: 'remote_protocol_response' };
276
- };
277
- const requestCancellation = () => {
278
- if (!remoteTaskId || !client) return Promise.resolve(false);
279
- cancellation ??= client.cancelTask({ id: remoteTaskId, tenant: '' }, { signal: AbortSignal.timeout(5000) })
280
- .then((result) => result.id === remoteTaskId && result.status?.state === sdk.TaskState.TASK_STATE_CANCELED)
281
- .catch(() => false);
282
- return cancellation;
283
- };
284
- const onAbort = () => { void requestCancellation(); };
285
- boundedSignal.addEventListener('abort', onAbort, { once: true });
286
- const capture = (value) => {
287
- if (value.messageId) {
288
- if (value.role !== sdk.Role.ROLE_AGENT) throw new A2AParticipantError('response_invalid');
289
- identifier(value.messageId, secret);
290
- if ((value.taskId && remoteTaskId && value.taskId !== remoteTaskId) ||
291
- (value.contextId && contextId && value.contextId !== contextId)) {
292
- throw new A2AParticipantError('response_invalid');
293
- }
294
- if (value.contextId) contextId = identifier(value.contextId, secret);
295
- if (value.taskId) remoteTaskId = identifier(value.taskId, secret);
296
- message = value;
297
- boundedSignal.throwIfAborted();
298
- return;
299
- }
300
- const id = value.id ?? value.taskId;
301
- if (!id || (remoteTaskId && remoteTaskId !== id)) throw new A2AParticipantError('response_invalid');
302
- remoteTaskId = identifier(id, secret);
303
- if (value.contextId && contextId && value.contextId !== contextId) throw new A2AParticipantError('response_invalid');
304
- if (value.contextId) contextId = identifier(value.contextId, secret);
305
- task = { ...task, ...value, id, status: value.status ?? task?.status };
306
- for (const artifact of value.artifacts ?? (value.artifact ? [value.artifact] : [])) {
307
- if (!artifact.artifactId || artifacts.size >= 32 && !artifacts.has(artifact.artifactId)) {
308
- throw new A2AParticipantError('response_invalid');
309
- }
310
- const previous = artifacts.get(artifact.artifactId);
311
- const text = `${value.append ? previous?.text ?? '' : ''}${partsText(artifact.parts)}`;
312
- const name = boundedText(artifact.name, secret);
313
- artifacts.set(artifact.artifactId, { artifactId: identifier(artifact.artifactId, secret),
314
- ...(name.trim() ? { name } : {}), text: boundedText(text, secret, false) });
315
- }
316
- boundedSignal.throwIfAborted();
317
- };
318
- try {
319
- if (!client) await connect(boundedSignal);
320
- boundedSignal.throwIfAborted();
321
- const params = sdk.SendMessageRequest.fromJSON({
322
- message: { messageId: randomUUID(), role: 'ROLE_USER', contextId, taskId: pendingTaskId,
323
- parts: [{ text: prompt }], metadata: { fuli: { turnId: turn?.id ?? turn?.turnId ?? null, attemptId: turn?.attemptId ?? null } } },
324
- configuration: { acceptedOutputModes: ['text/plain'], historyLength: 8, returnImmediately: true }
325
- });
326
- if (card.capabilities?.streaming) {
327
- for await (const event of client.sendMessageStream(params, { signal: boundedSignal })) {
328
- if (++eventCount > 512 || !event.payload) throw new A2AParticipantError('response_invalid');
329
- capture(event.payload.value);
330
- if (task?.status && ![sdk.TaskState.TASK_STATE_SUBMITTED, sdk.TaskState.TASK_STATE_WORKING,
331
- sdk.TaskState.TASK_STATE_UNSPECIFIED].includes(task.status.state)) break;
332
- if (message && !remoteTaskId) break;
333
- }
334
- } else capture(await client.sendMessage(params, { signal: boundedSignal }));
335
- while ([sdk.TaskState.TASK_STATE_SUBMITTED, sdk.TaskState.TASK_STATE_WORKING].includes(task?.status?.state)) {
336
- await delay(pollIntervalMs, undefined, { signal: boundedSignal });
337
- capture(await client.getTask({ id: remoteTaskId, tenant: '', historyLength: 8 }, { signal: boundedSignal }));
338
- }
339
- const state = task?.status?.state;
340
- if (state === sdk.TaskState.TASK_STATE_INPUT_REQUIRED || state === sdk.TaskState.TASK_STATE_AUTH_REQUIRED) {
341
- pendingTaskId = remoteTaskId;
342
- const failure = new A2AParticipantError(state === sdk.TaskState.TASK_STATE_INPUT_REQUIRED ? 'waiting_input' : 'waiting_auth');
343
- failure.body = boundedText(partsText(task.status.message?.parts), secret);
344
- failure.remoteTaskId = identifier(remoteTaskId, secret);
345
- throw failure;
346
- }
347
- if ((!message || task) && state !== sdk.TaskState.TASK_STATE_COMPLETED) throw new A2AParticipantError('remote_failed');
348
- const statusMessage = task?.status?.message?.role === sdk.Role.ROLE_AGENT ? task.status.message : null;
349
- const latestMessage = message ?? statusMessage ?? [...(task?.history ?? [])].reverse().find((item) => item.role === sdk.Role.ROLE_AGENT);
350
- const artifactText = [...artifacts.values()].map((item) => item.text).filter(Boolean).join('\n');
351
- const body = boundedText(artifactText || partsText(latestMessage?.parts), secret);
352
- if (!body) throw new A2AParticipantError('response_invalid');
353
- pendingTaskId = '';
354
- return { body, actual: actualRecord(), artifacts: [...artifacts.values()] };
355
- } catch (error) {
356
- const failure = safeFailure(error, boundedSignal);
357
- const actual = actualRecord();
358
- if (actual) failure.actual = actual;
359
- if (boundedSignal.aborted) {
360
- failure.cancellationConfirmed = await requestCancellation();
361
- failure.remoteTaskId = remoteTaskId ? identifier(remoteTaskId, secret) : null;
362
- }
363
- throw failure;
364
- } finally {
365
- boundedSignal.removeEventListener('abort', onAbort);
366
- active = null;
367
- }
368
- },
369
- async close() {
370
- closed = true;
371
- active?.abort();
372
- }
373
- };
374
- }
@@ -1,24 +0,0 @@
1
- import { runParticipantProcess, parseParticipantEvents } from '../../roundtables/process.js';
2
-
3
- export function createClaudeCodeParticipant({ command = process.env.FULI_CLAUDE_BIN ?? 'claude',
4
- workspace = process.cwd(), env = process.env, model, runProcess = runParticipantProcess } = {}) {
5
- const settings = JSON.stringify({ disableAllHooks: true });
6
- const clientEnv = Object.fromEntries(Object.entries(env).filter(([key]) => !key.startsWith('FULI_')));
7
- return {
8
- async preflight({ signal } = {}) {
9
- try {
10
- const result = await runProcess(command, ['--version'], { cwd: workspace, env: clientEnv, signal, timeoutMs: 10_000 });
11
- return { ready: result.code === 0, authentication: 'checked_on_dispatch', reason: result.code === 0 ? null : 'runtime_unavailable' };
12
- } catch (error) { return { ready: false, reason: error.code ?? 'runtime_unavailable' }; }
13
- },
14
- async dispatch({ prompt, signal, allowWrite = false, resultSchema }) {
15
- const args = ['-p', '--output-format', 'stream-json', '--verbose', '--no-session-persistence',
16
- '--permission-mode', allowWrite ? 'acceptEdits' : 'dontAsk', '--no-chrome', '--disable-slash-commands',
17
- '--setting-sources', '', '--settings', settings, '--mcp-config', '{"mcpServers":{}}', '--strict-mcp-config',
18
- '--tools', allowWrite ? 'Read,Glob,Grep,Edit,Write' : 'Read,Glob,Grep',
19
- '--max-budget-usd', env.FULI_CLAUDE_MAX_BUDGET_USD ?? '1.00', ...(model ? ['--model', model] : []),
20
- ...(resultSchema ? ['--json-schema', JSON.stringify(resultSchema)] : [])];
21
- return parseParticipantEvents('claude_code', await runProcess(command, args, { cwd: workspace, env: clientEnv, input: prompt, signal }));
22
- }
23
- };
24
- }
@@ -1,32 +0,0 @@
1
- import { ROUNDTABLE_WORKER_BOUNDARY } from '../../roundtables/turn-prompt.js';
2
-
3
- // Discover the effective MCP configuration, then disable and verify every entry.
4
- // Empty TOML tables merge recursively and cannot clear inherited servers.
5
- export async function prepareCodexRoundtableConfig({ command, workspace, env, signal, runProcess,
6
- platform = process.platform }) {
7
- const options = ['--disable', 'plugins', '--disable', 'apps', '--disable', 'multi_agent',
8
- '-c', 'hooks.enabled=false', '-c', 'notify=[]', '-c', 'project_doc_max_bytes=0',
9
- '-c', `developer_instructions=${JSON.stringify(ROUNDTABLE_WORKER_BOUNDARY)}`,
10
- '-c', 'sandbox_workspace_write.writable_roots=[]', '-c', 'sandbox_workspace_write.network_access=false',
11
- '-c', 'approval_policy="never"', '-c', 'approvals_reviewer="user"',
12
- '-c', 'features.browser_use=false', '-c', 'features.computer_use=false',
13
- ...(platform === 'win32' ? ['-c', 'windows.sandbox="unelevated"'] : [])];
14
- const list = async (overrides) => {
15
- const result = await runProcess(command, ['mcp', 'list', '--json', ...overrides],
16
- { cwd: workspace, env, signal, timeoutMs: 10000 });
17
- if (result.code !== 0) throw isolationFailure();
18
- let servers;
19
- try { servers = JSON.parse(result.stdout); } catch { throw isolationFailure(); }
20
- if (!Array.isArray(servers) || servers.length > 100 || servers.some(server =>
21
- !server || !/^[A-Za-z0-9_-]{1,128}$/.test(server.name) || typeof server.enabled !== 'boolean')) throw isolationFailure();
22
- return servers;
23
- };
24
- const servers = await list(options);
25
- for (const server of servers) options.push('-c', `mcp_servers.${server.name}.enabled=false`);
26
- if ((await list(options)).some(server => server.enabled)) throw isolationFailure();
27
- return options;
28
- }
29
-
30
- function isolationFailure() {
31
- return Object.assign(new Error('Codex effective MCP isolation could not be verified'), { code: 'runtime_isolation_failed' });
32
- }