fuli-context 0.11.1 → 0.12.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -5
- package/README.zh-CN.md +5 -4
- package/dist/web/assets/AboutPage-Dized8Uz.js +1 -0
- package/dist/web/assets/AgentConversations-Ccy41mEA.js +2 -0
- package/dist/web/assets/AgentHand-UzVhbKUC.js +1 -0
- package/dist/web/assets/AgentName-DJpvkub2.js +1 -0
- package/dist/web/assets/AgentProfilePage-CFViQ8kj.js +1 -0
- package/dist/web/assets/AgentsDirectoryPage-CBFTg_IE.js +1 -0
- package/dist/web/assets/AgentsDirectoryPage-Cv-vxw2C.css +1 -0
- package/dist/web/assets/ConnectionsPage-uXcabab_.js +1 -0
- package/dist/web/assets/EmployeeRecruitDialog-D8Hvhc-M.js +1 -0
- package/dist/web/assets/EmployeeWorkbenchPage-BQes4L1f.css +1 -0
- package/dist/web/assets/EmployeeWorkbenchPage-TBl_HNj6.js +3 -0
- package/dist/web/assets/KnowledgeEditDialog-HmiqLC-Y.js +1 -0
- package/dist/web/assets/KnowledgeInspector-Cj2yK4Qh.js +1 -0
- package/dist/web/assets/KnowledgeOrganizerPage-DT3BROZm.js +1 -0
- package/dist/web/assets/KnowledgeOrganizerPage-ccgscrPd.css +1 -0
- package/dist/web/assets/KnowledgePage-C4J4VueL.js +1 -0
- package/dist/web/assets/KnowledgeWorkspace-DA_dqVRG.js +4 -0
- package/dist/web/assets/NotFoundPage-x_Yd59mm.js +1 -0
- package/dist/web/assets/OverviewPage-3eZjQ26v.js +1 -0
- package/dist/web/assets/OverviewPage-8LBN8Shi.css +1 -0
- package/dist/web/assets/PersonalProfilePage-CDQk096L.js +1 -0
- package/dist/web/assets/PersonalProjectsPage-CJxp4Wyz.js +1 -0
- package/dist/web/assets/ProjectAgentFirstTask-BkRJ0zwO.js +1 -0
- package/dist/web/assets/ProjectAgentsPage-BuNNqSEy.js +12 -0
- package/dist/web/assets/ProjectScopePicker-CiDxM2Yx.js +1 -0
- package/dist/web/assets/PublicProjectsPage-ByOT559r.js +1 -0
- package/dist/web/assets/ReviewPage-C0Vdr9uq.js +1 -0
- package/dist/web/assets/RoundtablesPage-Drou-B81.css +1 -0
- package/dist/web/assets/RoundtablesPage-L3ShEWS3.js +1 -0
- package/dist/web/assets/SettingsPage-BE8pWbI6.css +1 -0
- package/dist/web/assets/SettingsPage-McYuinGz.js +1 -0
- package/dist/web/assets/SharedJefaReportPage-Bg6lIk3E.js +1 -0
- package/dist/web/assets/UiButton-x8hiHNRM.js +1 -0
- package/dist/web/assets/UiDialog-mjletK0y.js +1 -0
- package/dist/web/assets/UiDisclosure-_IxeiexW.js +1 -0
- package/dist/web/assets/UiSegmented-WFfz9Evl.js +1 -0
- package/dist/web/assets/UiSelect-K29jnV-1.js +1 -0
- package/dist/web/assets/WritingTastePage-DCULB-d2.js +1 -0
- package/dist/web/assets/agent-pins-DS4mNsNt.js +1 -0
- package/dist/web/assets/agent-profile-Bh3MJGvb.css +1 -0
- package/dist/web/assets/agent-work-summary-C-yW7x7A.js +1 -0
- package/dist/web/assets/{attention-store-D-qIFRIb.js → attention-store-CA5y8j1R.js} +1 -1
- package/dist/web/assets/catalog-D0VEfOAV.js +1 -0
- package/dist/web/assets/client-DnwnUBQV.js +1 -0
- package/dist/web/assets/console-Cw7TzOSC.js +1 -0
- package/dist/web/assets/conversation-launcher-settings-Yc13viwr.js +1 -0
- package/dist/web/assets/{i18n-b14l2pQA.js → i18n-oJFlt8hW.js} +3 -3
- package/dist/web/assets/{identity-BWbPmZZf.js → identity-DSGS4CZc.js} +1 -1
- package/dist/web/assets/index-BfHCcUL2.css +1 -0
- package/dist/web/assets/index-DO10_fLc.js +5 -0
- package/dist/web/assets/judgment-types-DR931cZ7.js +1 -0
- package/dist/web/assets/model-BJ-UF4cs.js +1 -0
- package/dist/web/assets/{personal-profile-graph-BPTtMJTZ.js → personal-profile-graph-SOK0BR0w.js} +1 -1
- package/dist/web/assets/project-team-api-C_0qJk_B.js +1 -0
- package/dist/web/assets/shared-report-CiX64ZiD.js +1 -0
- package/dist/web/assets/{agent-work-summary-LeW-Al_S.js → task-evidence-DTiPCs7r.js} +1 -1
- package/dist/web/assets/useAgentRoster-B84mzZIg.js +1 -0
- package/dist/web/assets/{useApi-CROJJdhE-CEQAEuug.js → useApi-CROJJdhE-7gt0QyQ5.js} +1 -1
- package/dist/web/assets/vue-router-CCvPGaLD.js +1 -0
- package/dist/web/index.html +17 -12
- package/dist/web/licenses/ant-design-icons.txt +22 -0
- package/docs/agent-conversations-and-collaboration.md +3 -3
- package/docs/agent-roundtable.md +33 -0
- package/docs/client-connections.md +86 -0
- package/docs/employee-agents.md +3 -3
- package/docs/judgment-and-autonomy.md +33 -0
- package/docs/project-agent-memory.md +6 -6
- package/graph-provider/fuli_graph/ai_review.py +154 -0
- package/graph-provider/fuli_graph/common_knowledge.py +12 -0
- package/graph-provider/fuli_graph/default_project_lead.py +1 -1
- package/graph-provider/fuli_graph/graph_models.py +14 -0
- package/graph-provider/fuli_graph/graph_query.py +217 -0
- package/graph-provider/fuli_graph/knowledge_audit.py +6 -0
- package/graph-provider/fuli_graph/knowledge_batch_confirmation.py +6 -0
- package/graph-provider/fuli_graph/knowledge_management.py +23 -0
- package/graph-provider/fuli_graph/knowledge_review.py +383 -4
- package/graph-provider/fuli_graph/knowledge_review_models.py +61 -2
- package/graph-provider/fuli_graph/personal_global_preferences.py +5 -1
- package/graph-provider/fuli_graph/preference_conflicts.py +91 -1
- package/graph-provider/fuli_graph/project_agent_delegations.py +70 -2
- package/graph-provider/fuli_graph/project_agent_memory_routes.py +18 -1
- package/graph-provider/fuli_graph/project_agent_remote_origins.py +154 -0
- package/graph-provider/fuli_graph/project_agent_task_models.py +3 -1
- package/graph-provider/fuli_graph/project_knowledge.py +41 -0
- package/graph-provider/fuli_graph/runtime.py +15 -0
- package/graph-provider/fuli_graph/store_agent_verification.py +12 -5
- package/graph-provider/fuli_graph/store_knowledge.py +98 -58
- package/graph-provider/fuli_graph/store_project_agent_attention.py +1 -1
- package/graph-provider/fuli_graph/store_project_agent_context.py +3 -2
- package/graph-provider/fuli_graph/store_project_agent_coordination_policy.py +1 -1
- package/graph-provider/fuli_graph/store_project_agent_task_activity.py +26 -0
- package/graph-provider/fuli_graph/store_project_agent_task_reads.py +1 -1
- package/graph-provider/fuli_graph/store_project_agent_task_recruitment.py +5 -5
- package/graph-provider/fuli_graph/store_project_agent_task_staffing.py +4 -3
- package/graph-provider/fuli_graph/store_project_agent_tasks.py +2 -2
- package/graph-provider/fuli_graph/store_project_agents.py +6 -6
- package/graph-provider/fuli_graph/system_agents.py +31 -2
- package/graph-provider/fuli_graph/system_hr_identity.py +21 -7
- package/graph-provider/pyproject.toml +2 -1
- package/npm-shrinkwrap.json +280 -5
- package/package.json +7 -2
- package/skills/operating-fuli/SKILL.md +3 -3
- package/src/agent-peer/coordinator-http.js +117 -0
- package/src/agent-peer/coordinator-service.js +258 -0
- package/src/agent-peer/coordinator-store.js +95 -0
- package/src/agent-peer/device-identity.js +70 -0
- package/src/agent-peer/http.js +47 -0
- package/src/agent-peer/node-store.js +127 -0
- package/src/agent-peer/origin-proof.js +56 -0
- package/src/agent-peer/peer-port.js +140 -0
- package/src/agent-peer/peer-runtime.js +298 -0
- package/src/agent-peer/peer-transport.js +78 -0
- package/src/agent-peer/protocol.js +161 -0
- package/src/agent-peer/runner.js +251 -0
- package/src/agent-roundtable/http.js +17 -3
- package/src/agent-roundtable/service.js +272 -43
- package/src/agent-roundtable/tools.js +15 -1
- package/src/agent-roundtable/wake.js +12 -3
- package/src/agent-tools/graph-definitions.js +16 -5
- package/src/agent-tools/graph-handlers.js +8 -0
- package/src/agent-tools/interface-catalog.js +16 -1
- package/src/agent-tools/judgment-definitions.js +12 -0
- package/src/agent-tools/project-agent-definitions.js +1 -1
- package/src/agents/claude-code/wake.js +7 -0
- package/src/agents/codex/wake.js +7 -0
- package/src/agents/identity-receipt.js +1 -1
- package/src/cli/command-registry.js +3 -0
- package/src/cli/connect-command.js +28 -0
- package/src/cli/mcp-command.js +99 -0
- package/src/cli/peer-command.js +100 -0
- package/src/cli/setup-agent-selection.js +2 -2
- package/src/cli/setup-command.js +7 -2
- package/src/cli.js +16 -0
- package/src/employees/catalog/bole.json +2 -2
- package/src/employees/catalog/tonborg.json +20 -0
- package/src/employees/manifest.js +2 -2
- package/src/employees/recruitment.js +20 -1
- package/src/graphiti/agent-collaboration.js +8 -2
- package/src/graphiti/federated-application.js +9 -1
- package/src/graphiti/knowledge-review.js +7 -3
- package/src/graphiti/project-agent-control-plane.js +7 -0
- package/src/graphiti/project-agent-mapping.js +2 -0
- package/src/graphiti/project-agent-task-entry.js +4 -4
- package/src/graphiti/project-agent-team-context.js +16 -18
- package/src/graphiti/project-team-view.js +82 -0
- package/src/graphiti/provider-client.js +9 -0
- package/src/graphiti/task-entry-preferences.js +6 -1
- package/src/http/api-router.js +12 -1
- package/src/http/graph-api-router.js +7 -0
- package/src/judgment/acceptance.js +91 -0
- package/src/judgment/engine.js +168 -0
- package/src/judgment/http.js +24 -0
- package/src/judgment/model.js +24 -0
- package/src/judgment/routing.js +96 -0
- package/src/judgment/scheduler.js +25 -0
- package/src/judgment/service.js +66 -0
- package/src/judgment/store.js +123 -0
- package/src/mcp/session-id.js +1 -0
- package/src/mcp/tool-annotations.js +8 -5
- package/src/mcp-server.js +2 -100
- package/src/server.js +22 -3
- package/src/setup/client-connection.js +16 -0
- package/src/system/system-service.js +5 -0
- package/dist/web/assets/AboutPage-cW9hDghN.js +0 -1
- package/dist/web/assets/AgentConversations-CGznTWuV.js +0 -2
- package/dist/web/assets/AgentHand-DkyF4vgk.js +0 -1
- package/dist/web/assets/AgentName-C1mAVr-v.js +0 -1
- package/dist/web/assets/AgentProfilePage-pKUR0rfj.js +0 -1
- package/dist/web/assets/AgentsDirectoryPage-CUlbT2hD.js +0 -1
- package/dist/web/assets/AgentsDirectoryPage-yRWktiin.css +0 -1
- package/dist/web/assets/ConnectionsPage-CuDHIJXu.js +0 -1
- package/dist/web/assets/EmployeeRecruitDialog-D9QfGipd.js +0 -1
- package/dist/web/assets/EmployeeWorkbenchPage-D-c_Jm2z.css +0 -1
- package/dist/web/assets/EmployeeWorkbenchPage-DAtvGney.js +0 -3
- package/dist/web/assets/KnowledgeEditDialog-a-5rasG0.js +0 -1
- package/dist/web/assets/KnowledgeInspector-BGsqjNY2.js +0 -1
- package/dist/web/assets/KnowledgeOrganizerPage-BndgUsHS.js +0 -1
- package/dist/web/assets/KnowledgeOrganizerPage-DeL7Jp34.css +0 -1
- package/dist/web/assets/KnowledgePage-CQweO0YJ.js +0 -1
- package/dist/web/assets/KnowledgeWorkspace-BtUjKTLb.js +0 -4
- package/dist/web/assets/NotFoundPage-BmQTTqQn.js +0 -1
- package/dist/web/assets/OverviewPage-By-fUzSG.css +0 -1
- package/dist/web/assets/OverviewPage-C73HyTsM.js +0 -1
- package/dist/web/assets/PersonalProfilePage-BMuOrppx.js +0 -1
- package/dist/web/assets/PersonalProjectsPage-Cq9_kFvs.js +0 -1
- package/dist/web/assets/ProjectAgentFirstTask-CaHvOjkp.js +0 -1
- package/dist/web/assets/ProjectAgentsPage-WVcNdzVi.js +0 -12
- package/dist/web/assets/ProjectScopePicker-zAgiaZKL.js +0 -1
- package/dist/web/assets/PublicProjectsPage-DL093f65.js +0 -1
- package/dist/web/assets/ReviewPage-D_NIhPx8.js +0 -1
- package/dist/web/assets/RoundtablesPage-Cb0R4GaM.css +0 -1
- package/dist/web/assets/RoundtablesPage-CdVVyZE-.js +0 -1
- package/dist/web/assets/SettingsPage-BmYkLul4.css +0 -1
- package/dist/web/assets/SettingsPage-CbLaau8Q.js +0 -1
- package/dist/web/assets/SharedJefaReportPage-aygd6wvb.js +0 -1
- package/dist/web/assets/UiDialog-Q7fsJUoO.js +0 -1
- package/dist/web/assets/UiDisclosure-BS-muK5j.js +0 -1
- package/dist/web/assets/UiSegmented-CT28bxqw.js +0 -1
- package/dist/web/assets/UiSelect-DcGpPQQo.js +0 -1
- package/dist/web/assets/WritingTastePage-CYlwAFqV.js +0 -1
- package/dist/web/assets/agent-profile-BZj3ezWe.css +0 -1
- package/dist/web/assets/catalog-UDv854JN.js +0 -1
- package/dist/web/assets/client-DLS5FZBI.js +0 -1
- package/dist/web/assets/console-CqzwSo7a.js +0 -1
- package/dist/web/assets/conversation-launcher-settings-DRoIz42V.js +0 -1
- package/dist/web/assets/index-D1OHIz4c.js +0 -5
- package/dist/web/assets/index-kPB0Cf8Q.css +0 -1
- package/dist/web/assets/model-DupZy8Qb.js +0 -1
- package/dist/web/assets/shared-report-BYnLhmCZ.js +0 -1
- package/dist/web/assets/useAgentRoster-ep7SpKv1.js +0 -1
- package/dist/web/assets/vue-router-B6ZjK-Br.js +0 -1
package/dist/web/index.html
CHANGED
|
@@ -9,24 +9,29 @@
|
|
|
9
9
|
/>
|
|
10
10
|
<link rel="icon" type="image/png" href="/assets/fuli-logo-ER1wQ8Kk.png" />
|
|
11
11
|
<title>复利 · Context Graph</title>
|
|
12
|
-
<script type="module" crossorigin src="/assets/index-
|
|
13
|
-
<link rel="modulepreload" crossorigin href="/assets/i18n-
|
|
12
|
+
<script type="module" crossorigin src="/assets/index-DO10_fLc.js"></script>
|
|
13
|
+
<link rel="modulepreload" crossorigin href="/assets/i18n-oJFlt8hW.js">
|
|
14
14
|
<link rel="modulepreload" crossorigin href="/assets/_plugin-vue_export-helper-BDNMzG2s.js">
|
|
15
|
-
<link rel="modulepreload" crossorigin href="/assets/client-
|
|
16
|
-
<link rel="modulepreload" crossorigin href="/assets/console-
|
|
17
|
-
<link rel="modulepreload" crossorigin href="/assets/
|
|
18
|
-
<link rel="modulepreload" crossorigin href="/assets/useApi-CROJJdhE-
|
|
19
|
-
<link rel="modulepreload" crossorigin href="/assets/vue-router-
|
|
15
|
+
<link rel="modulepreload" crossorigin href="/assets/client-DnwnUBQV.js">
|
|
16
|
+
<link rel="modulepreload" crossorigin href="/assets/console-Cw7TzOSC.js">
|
|
17
|
+
<link rel="modulepreload" crossorigin href="/assets/UiButton-x8hiHNRM.js">
|
|
18
|
+
<link rel="modulepreload" crossorigin href="/assets/useApi-CROJJdhE-7gt0QyQ5.js">
|
|
19
|
+
<link rel="modulepreload" crossorigin href="/assets/vue-router-CCvPGaLD.js">
|
|
20
20
|
<link rel="modulepreload" crossorigin href="/assets/fuli-logo-Bu9WBuQe.js">
|
|
21
|
-
<link rel="modulepreload" crossorigin href="/assets/
|
|
22
|
-
<link rel="modulepreload" crossorigin href="/assets/
|
|
23
|
-
<link rel="modulepreload" crossorigin href="/assets/
|
|
24
|
-
<link rel="modulepreload" crossorigin href="/assets/
|
|
21
|
+
<link rel="modulepreload" crossorigin href="/assets/UiDialog-mjletK0y.js">
|
|
22
|
+
<link rel="modulepreload" crossorigin href="/assets/UiSelect-K29jnV-1.js">
|
|
23
|
+
<link rel="modulepreload" crossorigin href="/assets/attention-store-CA5y8j1R.js">
|
|
24
|
+
<link rel="modulepreload" crossorigin href="/assets/AgentHand-UzVhbKUC.js">
|
|
25
|
+
<link rel="modulepreload" crossorigin href="/assets/UiDisclosure-_IxeiexW.js">
|
|
26
|
+
<link rel="modulepreload" crossorigin href="/assets/profile-model-BQO4zNs9.js">
|
|
27
|
+
<link rel="modulepreload" crossorigin href="/assets/task-evidence-DTiPCs7r.js">
|
|
28
|
+
<link rel="modulepreload" crossorigin href="/assets/useAgentRoster-B84mzZIg.js">
|
|
29
|
+
<link rel="modulepreload" crossorigin href="/assets/agent-pins-DS4mNsNt.js">
|
|
25
30
|
<link rel="modulepreload" crossorigin href="/assets/paths-CDREouhi.js">
|
|
26
31
|
<link rel="stylesheet" crossorigin href="/assets/client-CIuQ1icy.css">
|
|
27
32
|
<link rel="stylesheet" crossorigin href="/assets/UiSelect-Bv6R0yr1.css">
|
|
28
33
|
<link rel="stylesheet" crossorigin href="/assets/AgentHand-Y83Oo36U.css">
|
|
29
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
34
|
+
<link rel="stylesheet" crossorigin href="/assets/index-BfHCcUL2.css">
|
|
30
35
|
</head>
|
|
31
36
|
<body>
|
|
32
37
|
<div id="app"></div>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
MIT LICENSE
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2018-present Ant UED, https://xtech.antfin.com/
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
6
|
+
a copy of this software and associated documentation files (the
|
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
|
11
|
+
the following conditions:
|
|
12
|
+
|
|
13
|
+
The above copyright notice and this permission notice shall be
|
|
14
|
+
included in all copies or substantial portions of the Software.
|
|
15
|
+
|
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
@@ -34,8 +34,8 @@ Neo4j Provider 的独立日志中;工作记忆继续保存经过整理的决
|
|
|
34
34
|
包含稳定 `@{agentId}`、项目 ID 和会话 ID;复制失败时可手动选中。生成的 ID 会编码特殊字符,
|
|
35
35
|
改名不影响接续。这是 FULI 的提示词匹配,不表示 Cursor、Codex 的原生 @ 下拉列表已注册此人。
|
|
36
36
|
|
|
37
|
-
开发者是持久负责人,Jefa/
|
|
38
|
-
隐式记到管理员名下;需要先通过
|
|
37
|
+
开发者是持久负责人,Jefa/AR 是同级协作角色。只有管理员成员的项目不会把开发任务
|
|
38
|
+
隐式记到管理员名下;需要先通过 AR 分配或招聘开发者。显式选中管理员及其本职任务仍可使用。
|
|
39
39
|
收尾将实际员工工具返回的协作回执合并展示,例如“Alex 负责实现;Jefa 整理看板”。
|
|
40
40
|
没有执行工具或 worker 的配置不能当成协作执行证据;不另起模型来生成这行回执。
|
|
41
41
|
派工前分别核对每位成员的客户端与执行器锁,并与任务策略取交集;负责人的推荐平台
|
|
@@ -47,7 +47,7 @@ Neo4j Provider 的独立日志中;工作记忆继续保存经过整理的决
|
|
|
47
47
|
|
|
48
48
|
用户的品味、协作性格和判断偏好继续按确认状态和全局/项目/Agent 作用域读取;入口精简
|
|
49
49
|
保留完整指令、画像分类和写作品味域。协作职责同时带上 Agent 自己的判断、品味、个性和期望。
|
|
50
|
-
工作摘要、
|
|
50
|
+
工作摘要、AR 配置的性格以及自动推断都不能伪装成人工确认的用户偏好。
|
|
51
51
|
|
|
52
52
|
## 采集与失败恢复
|
|
53
53
|
|
package/docs/agent-roundtable.md
CHANGED
|
@@ -75,3 +75,36 @@ Waking needs the client's CLI on this machine: `claude` for Claude Code, and `co
|
|
|
75
75
|
(or the CLI bundled with the Codex app) for Codex. Override the paths with
|
|
76
76
|
`FULI_CLAUDE_BIN` / `FULI_CODEX_BIN`. A recipient is only woken in clients its Agent
|
|
77
77
|
profile allows.
|
|
78
|
+
|
|
79
|
+
## LAN roundtable (Beta)
|
|
80
|
+
|
|
81
|
+
Devices on the same trusted local network can share project leads. Each computer
|
|
82
|
+
needs FULI 0.12.1 or later. Open **Settings → LAN roundtable (Beta)** on the computer
|
|
83
|
+
itself. Choose one computer to host, copy its one-use invitation to the other
|
|
84
|
+
computer, compare the displayed fingerprints, and join. Select the project leads
|
|
85
|
+
and local clients you want to share. Sharing is off until you choose it.
|
|
86
|
+
|
|
87
|
+
`find_agents` includes shared leads with their device and project names. Use the
|
|
88
|
+
returned `peer:` address with `message_agent`. Remote asks support `auto` or `new`
|
|
89
|
+
conversation selection, not a remote session ID or a caller-supplied folder.
|
|
90
|
+
`get_agent_message_status` checks an ask; `cancel_agent_message` cancels one you sent.
|
|
91
|
+
The console refreshes remote answers in the roundtable timeline.
|
|
92
|
+
|
|
93
|
+
The coordinator routes messages; the receiving computer makes outbound connections
|
|
94
|
+
and runs its own allowed, read-only client. The optional folder is verified against
|
|
95
|
+
that local project and never sent to the other device. A shared project needs an
|
|
96
|
+
active lead, an allowed installed client, and either a matching recent session
|
|
97
|
+
folder or a confirmed project folder. Generic MCP clients can send questions;
|
|
98
|
+
automatic answering currently uses the Codex or Claude Code adapters.
|
|
99
|
+
|
|
100
|
+
Turning sharing off cancels its active deliveries. Removing a device ends its trust.
|
|
101
|
+
If the coordinator is offline when a member leaves, that member stops immediately
|
|
102
|
+
and retries removal when the coordinator returns. A lost execution lease stops the
|
|
103
|
+
managed process; an uncertain attempt is shown as unknown and is not replayed.
|
|
104
|
+
Messages expire after at most 30 minutes. Devices verify transport certificates,
|
|
105
|
+
signed messages and the source Provider's project-lead proof before any execution.
|
|
106
|
+
The console's separate LAN-access switch does not turn this feature on.
|
|
107
|
+
|
|
108
|
+
The equivalent local controls are available with `fuli peer --help`. Full database
|
|
109
|
+
backups contain private device and origin-authority material; keep those backups
|
|
110
|
+
private. Public knowledge exports do not include those keys.
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# Connect a client
|
|
2
|
+
|
|
3
|
+
FULI works through standard MCP tool calls. A client's brand or model provider is
|
|
4
|
+
not an admission requirement. Installation and configuration generation do not
|
|
5
|
+
call a model. A model can help a user configure a client or diagnose an error,
|
|
6
|
+
but is never required to run the installer.
|
|
7
|
+
|
|
8
|
+
## Local connection
|
|
9
|
+
|
|
10
|
+
1. Install and initialize FULI with `npm install --global fuli-context` and
|
|
11
|
+
`fuli setup`. Setup can finish even when no known client is installed. Use
|
|
12
|
+
`fuli setup --skip-agents` to configure only FULI without changing any client.
|
|
13
|
+
2. Run `fuli connect`, or open **Settings → Client connection** in the console.
|
|
14
|
+
3. Merge the generated `fuli` entry into the client's MCP settings, keeping its
|
|
15
|
+
other servers. Reload and trust the connection as required by that client.
|
|
16
|
+
|
|
17
|
+
The generated configuration launches a local stdio server using the current
|
|
18
|
+
Node executable and installed package. It contains paths, not credentials. It
|
|
19
|
+
is for this machine; regenerate it after moving the installation or changing
|
|
20
|
+
the Node location. Use `fuli connect --data-dir PATH` for a separate FULI data
|
|
21
|
+
directory, or `--runtime-config FILE` for an explicit runtime configuration.
|
|
22
|
+
|
|
23
|
+
`fuli connect --format vscode` uses VS Code's `servers` envelope.
|
|
24
|
+
`fuli connect --format server` prints only the server's `type`, `command` and
|
|
25
|
+
`args` for clients with their own configuration editor. Paths with spaces remain
|
|
26
|
+
individual JSON arguments; do not paste them as an unquoted shell command.
|
|
27
|
+
|
|
28
|
+
Clients that only ask for a command can use `fuli mcp` if `fuli` is on their PATH.
|
|
29
|
+
`fuli mcp --tools` lists the available tool contract without starting a task.
|
|
30
|
+
Configuration export is read-only: it neither modifies client settings nor
|
|
31
|
+
claims the client has connected successfully.
|
|
32
|
+
|
|
33
|
+
## What a compatible client needs
|
|
34
|
+
|
|
35
|
+
- MCP **tool discovery and invocation**, using stdio or the remote transport
|
|
36
|
+
described below. A resource-only MCP viewer cannot run FULI workflows.
|
|
37
|
+
- Permission to connect to FULI and to use the relevant project and Agent.
|
|
38
|
+
- An Agent that receives and follows the server's task-entry and completion
|
|
39
|
+
instructions. If the client omits MCP server instructions, add the installed
|
|
40
|
+
FULI Skill or equivalent task instructions to that client's instruction field.
|
|
41
|
+
|
|
42
|
+
The generic connection uses the existing `other` client attribution and preserves
|
|
43
|
+
project, Agent and executor permissions. It does not impersonate a supported host.
|
|
44
|
+
To continue work, select the same FLA and authorized project against the same
|
|
45
|
+
accessible FULI data. FULI does not copy source files or native client tool state.
|
|
46
|
+
|
|
47
|
+
Verify a connection by checking that FULI tools appear, asking the Agent to load
|
|
48
|
+
the current project's context, completing a small task, and checking that the
|
|
49
|
+
same FLA can recover the saved result in a new conversation. Merely saving JSON
|
|
50
|
+
is not proof that task entry or completion ran.
|
|
51
|
+
|
|
52
|
+
## Optional client integration
|
|
53
|
+
|
|
54
|
+
| Capability | Generic MCP | Current dedicated adapters |
|
|
55
|
+
| --- | --- | --- |
|
|
56
|
+
| Tools, authorized preferences and working memory | Available through tool calls | Shared behavior |
|
|
57
|
+
| Automatic configuration and bundled instructions | Merge generated configuration | Codex, Claude Code, Cursor |
|
|
58
|
+
| Task entry and completion hooks | Agent follows instructions; no guaranteed hook | Host-specific adapters; Cursor has a limited completion reminder |
|
|
59
|
+
| Automatic visible conversation capture | No | Supported Codex and Claude Code transcript formats |
|
|
60
|
+
| Roundtable wake/resume | Messages can wait for the recipient's next task | Codex and Claude Code CLIs |
|
|
61
|
+
|
|
62
|
+
VS Code/Copilot, Gemini CLI and Cline document compatible local MCP transports.
|
|
63
|
+
They are candidates for generic connection, not a claim of completed FULI
|
|
64
|
+
end-to-end acceptance. Other MCP clients and custom Agents can use the same
|
|
65
|
+
contract. Closed chat interfaces without tools or an extension interface cannot
|
|
66
|
+
connect directly.
|
|
67
|
+
|
|
68
|
+
New dedicated adapters belong behind the shared client ports. They should add
|
|
69
|
+
only host-specific configuration, hooks, transcript parsing or execution, never
|
|
70
|
+
a second version of FULI's knowledge and role rules. Missing enhancements must
|
|
71
|
+
remain explicit; a generic connection must not claim automatic capture or wake.
|
|
72
|
+
|
|
73
|
+
## Remote clients
|
|
74
|
+
|
|
75
|
+
FULI includes a project-bound Streamable HTTP MCP upstream via `fuli remote-mcp`.
|
|
76
|
+
It is separate from the console at port 2727. Cloud clients cannot reach a user's
|
|
77
|
+
loopback address. They need a reachable HTTPS endpoint with authentication and
|
|
78
|
+
the allowed project scope. The current upstream binds to loopback and requires
|
|
79
|
+
an authenticated proxy for cloud use; it is not a turnkey public service.
|
|
80
|
+
See the [remote connector setup](../README.md#remote-claude--cowork-connector-upstream).
|
|
81
|
+
|
|
82
|
+
## References
|
|
83
|
+
|
|
84
|
+
- [VS Code MCP configuration](https://code.visualstudio.com/docs/agent-customization/mcp-servers)
|
|
85
|
+
- [Gemini CLI MCP servers](https://geminicli.com/docs/tools/mcp-server/)
|
|
86
|
+
- [Cline MCP connections](https://docs.cline.bot/mcp/mcp-overview)
|
package/docs/employee-agents.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Specialist Agents
|
|
2
2
|
|
|
3
|
-
An employee template is a reusable role with an optional FULI-hosted or native workbench. Recruitment reuses the existing durable Project Agent identity and assignment model.
|
|
3
|
+
An employee template is a reusable role with an optional FULI-hosted or native workbench. Recruitment reuses the existing durable Project Agent identity and assignment model. Three roles are fixed: **Jefa**, the project manager, **Bole**, the AR (Agent Resources) Agent, and **Tonborg**, the judgment Agent. They exist in every personal space from the start, manage all projects by default, and are never offered for hire. They require no separate runtime package. See [judgment and autonomy](judgment-and-autonomy.md) for Tonborg's review, feedback, and execution-choice workflow.
|
|
4
4
|
|
|
5
5
|
## User flow
|
|
6
6
|
|
|
@@ -94,7 +94,7 @@ The optional built-in-only native workbench declaration is `workbench: { "kind":
|
|
|
94
94
|
|
|
95
95
|
The reserved identity is `employee.<template-id>`, recognized by the generic `fuli.employee:<template-id>` capability. Preserve this marker when customizing employee profiles. The actual role, history, memory and project assignments remain in FULI's existing Agent model.
|
|
96
96
|
|
|
97
|
-
`employee.bole` is additionally reserved as the only system
|
|
97
|
+
`employee.bole` is additionally reserved as the only system AR identity. Its Provider type is `hr`; other identities cannot claim that type. Recruitment history records the coordinating and AR Agent IDs, time, reason, proposed identity and final recruited identity, which powers Bole's people panel without inventing activity.
|
|
98
98
|
|
|
99
99
|
## HTTP and MCP
|
|
100
100
|
|
|
@@ -172,7 +172,7 @@ Signing, remote catalog distribution, a runtime sandbox, database migration/unin
|
|
|
172
172
|
|
|
173
173
|
### Bole identity upgrades
|
|
174
174
|
|
|
175
|
-
Local startup calls the idempotent system-
|
|
175
|
+
Local startup calls the idempotent system-AR endpoint for both fresh and existing installs.
|
|
176
176
|
It consolidates the reserved legacy `fuli-project-hr` identity into `employee.bole` in one
|
|
177
177
|
transaction. Names never identify merge targets. The legacy node remains an audit alias;
|
|
178
178
|
assignments, recruitment references, attention and task history follow the canonical Bole.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Tonborg and autonomy
|
|
2
|
+
|
|
3
|
+
Tonborg is the built-in judgment Agent, alongside Jefa and Bole. It has a persistent FLA identity, scoped Agent memory, and a native decision workbench. All Agents can be pinned from their card; pins appear in navigation. The three built-in roles are the initial defaults. Removing a pin, including every pin, survives reloads.
|
|
4
|
+
|
|
5
|
+
## Choose the amount of autonomy
|
|
6
|
+
|
|
7
|
+
Settings offers three choices, saved immediately with Undo:
|
|
8
|
+
|
|
9
|
+
- **I decide**: Tonborg analyzes and records suggestions.
|
|
10
|
+
- **Shared decisions**: Tonborg applies routine knowledge reviews backed by existing confirmation and accepts verified FULI tasks.
|
|
11
|
+
- **Autonomous**: Tonborg may also review ordinary pending knowledge. Conflicts, sensitive preferences, uncertain evidence, and actions outside existing authority remain for the user.
|
|
12
|
+
|
|
13
|
+
Projects inherit the global policy unless the user sets an exception. Updating FULI does not silently expand existing authority. The selected local client runs the judgment, and quality preference controls its reasoning effort. Logs show the actual model only when the client reports it.
|
|
14
|
+
|
|
15
|
+
## What a decision does
|
|
16
|
+
|
|
17
|
+
Knowledge review uses bounded batches and an independent review ledger. A successful assessment appears as **Tonborg reviewed**. It does not change human confirmation, authoritative-source confirmation, publication eligibility, or the original evidence. The Provider compares an evidence snapshot within the write transaction; edited or conflicted knowledge loses its effective AI-reviewed disposition. A failing item cannot block the rest of the queue.
|
|
18
|
+
|
|
19
|
+
`assess_agent_action` recommends continuing the current conversation, reusing an authorized conversation, opening a session, or delegating work. It selects only registered, authorized, preflighted executors and available models that satisfy the Agent, assignment, task, and user routing constraints. The host performs and reports the actual launch or resumption. Conversation history is supplied only to a judgment client permitted for that Agent.
|
|
20
|
+
|
|
21
|
+
`assess_task_completion` is called by the accountable lead with its current task context, exact task revision, and artifact revision. Automatic acceptance requires a passed real verification by another Agent. The Provider rechecks the current lead context, task revision, artifact, and verified attempt before completing the FULI task. Jefa's separate human acceptance, publication, permissions, and payments retain their existing boundaries.
|
|
22
|
+
|
|
23
|
+
The console processes bounded automatic review batches while running. Manual review is available in Tonborg's workbench. Other MCP processes share the same local policy and decision database without starting duplicate schedulers. A lease prevents simultaneous decisions for the same project.
|
|
24
|
+
|
|
25
|
+
## Correct a judgment
|
|
26
|
+
|
|
27
|
+
Use thumbs up or thumbs down with an optional reason. A vote takes one click; reasons can be changed or cleared. The original decision, execution receipts, and feedback history remain auditable. Relevant feedback includes the selected client/model and work kind, so a reasonless vote still identifies the choice being evaluated. Feedback is scoped evidence for later decisions, not a new universal instruction or automatic reversal of an action.
|
|
28
|
+
|
|
29
|
+
Tonborg uses only its own scoped memory and authorized evidence. Client failure, malformed output, stale evidence, or missing authority produces a visible failure or escalation rather than a successful execution claim. Its judgment subprocess has no task tools or MCP access.
|
|
30
|
+
|
|
31
|
+
## Interfaces
|
|
32
|
+
|
|
33
|
+
The MCP tools are `get_judgment_policy`, `list_judgments`, `review_with_tonborg`, `assess_agent_action`, `assess_task_completion`, `get_agent_pins`, and `pin_agent`. Autonomy changes and feedback remain local user operations. Agent entry context supplies the current policy and workflow guidance; existing sessions should reconnect to discover newly installed tools.
|
|
@@ -6,12 +6,12 @@ Provider 读取已授权的员工和项目记录。切换客户端不会复制
|
|
|
6
6
|
## 人员目录与个人主页
|
|
7
7
|
|
|
8
8
|
`/project-agents` 是简洁的人员目录,点击姓名进入 `/agents/:spaceId/:agentId`。
|
|
9
|
-
个人主页展示
|
|
9
|
+
个人主页展示 AR 配置的判断、品味、个性、用户期望,以及有来源的任职、招聘、
|
|
10
10
|
工作和合作记录。未填写的风格不自动编造;角色描述不等于实际成长证据。
|
|
11
11
|
合作次数只统计双方实际参与过的任务,不把排队或仅被分配算作已合作。
|
|
12
12
|
|
|
13
|
-
组织关系来自各项目的协调策略。
|
|
14
|
-
模糊检索,在本地完成,不额外调用模型。也可让客户端中的
|
|
13
|
+
组织关系来自各项目的协调策略。AR 人员目录支持名字、技能、职责、项目和任务
|
|
14
|
+
模糊检索,在本地完成,不额外调用模型。也可让客户端中的 AR 通过人员工具查询。
|
|
15
15
|
主页设置可修改执行平台偏好和期望;锁定的执行平台仍受原策略约束。
|
|
16
16
|
技术性配置保留在 `/project-agents/manage` 高级管理入口。
|
|
17
17
|
|
|
@@ -21,7 +21,7 @@ Provider 读取已授权的员工和项目记录。切换客户端不会复制
|
|
|
21
21
|
| --- | --- | --- |
|
|
22
22
|
| 身份 | 姓名、职责、能力、客户端与执行器偏好 | 个人空间中的稳定 Agent ID |
|
|
23
23
|
| 任职 | 负责的项目、职责及任职历史 | 精确的空间、项目和 Agent |
|
|
24
|
-
| 项目小组 | 小组长、长期成员、自动归组策略 | 项目协调策略;
|
|
24
|
+
| 项目小组 | 小组长、长期成员、自动归组策略 | 项目协调策略;AR、项目经理保持同级 |
|
|
25
25
|
| 工作记录 | 本次结果、状态、来源客户端和时间 | Provider 中的任务生命周期记录 |
|
|
26
26
|
| 可见对话 | 用户消息、助手回复和工具记录 | 同一数据库中独立日志;按空间、项目、Agent 隔离 |
|
|
27
27
|
| 私有工作记忆 | 摘要、决策、未完成问题、下一步 | Neo4j 中按空间、项目、Agent 隔离的版本记录 |
|
|
@@ -32,7 +32,7 @@ Provider 读取已授权的员工和项目记录。切换客户端不会复制
|
|
|
32
32
|
|
|
33
33
|
## 小组随项目成长
|
|
34
34
|
|
|
35
|
-
新项目可以没有专业员工。
|
|
35
|
+
新项目可以没有专业员工。AR 按任务需要招募长期员工;默认首位成为小组长,
|
|
36
36
|
后续新员工加入小组。归组与招聘处于同一个事务中,失败时一起回滚。
|
|
37
37
|
临时协作者只参加任务,不进入固定小组。
|
|
38
38
|
|
|
@@ -42,7 +42,7 @@ Provider 读取已授权的员工和项目记录。切换客户端不会复制
|
|
|
42
42
|
|
|
43
43
|
自动沿用开启时,项目小组长是默认沟通负责人。显式指定有效员工仍然优先;
|
|
44
44
|
关闭自动沿用后需要手动选择。角色、职能、模型策略和执行器偏好仍由用户配置。
|
|
45
|
-
小组策略不改变
|
|
45
|
+
小组策略不改变 AR 与项目经理的管理权限,也不授权启动任意 worker。
|
|
46
46
|
|
|
47
47
|
## 任务入口与首次接管
|
|
48
48
|
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
"""Version-bound AI review evidence helpers.
|
|
2
|
+
|
|
3
|
+
An AI decision is useful only for the exact item snapshot that was supplied to
|
|
4
|
+
the model. Keep the digest deliberately independent from timestamps: edits can
|
|
5
|
+
be visible in the graph before a separate revision or audit timestamp moves.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import hashlib
|
|
11
|
+
import json
|
|
12
|
+
from datetime import date, datetime
|
|
13
|
+
from typing import Any
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
_DIRECT_FIELDS = (
|
|
17
|
+
'item_kind',
|
|
18
|
+
'item_id',
|
|
19
|
+
'title',
|
|
20
|
+
'content',
|
|
21
|
+
'valid_at',
|
|
22
|
+
'invalid_at',
|
|
23
|
+
'confirmation_status',
|
|
24
|
+
'confirmation_basis_json',
|
|
25
|
+
'profile_aspect',
|
|
26
|
+
'preference_scope',
|
|
27
|
+
'preference_project_id',
|
|
28
|
+
'preference_agent_id',
|
|
29
|
+
'inheritance_mode',
|
|
30
|
+
'current_quadrant',
|
|
31
|
+
'utility_score',
|
|
32
|
+
'confidence_score',
|
|
33
|
+
'qualified_use_count',
|
|
34
|
+
'distinct_task_count',
|
|
35
|
+
'negative_evidence_count',
|
|
36
|
+
'requires_attention',
|
|
37
|
+
'human_change_version',
|
|
38
|
+
'attributes_json',
|
|
39
|
+
'attributes',
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def _json_safe(value: Any) -> Any:
|
|
44
|
+
if isinstance(value, (datetime, date)):
|
|
45
|
+
return value.isoformat()
|
|
46
|
+
to_native = getattr(value, 'to_native', None)
|
|
47
|
+
if callable(to_native):
|
|
48
|
+
return _json_safe(to_native())
|
|
49
|
+
if hasattr(value, 'model_dump'):
|
|
50
|
+
return _json_safe(value.model_dump(mode='json'))
|
|
51
|
+
if isinstance(value, dict):
|
|
52
|
+
return {str(key): _json_safe(item) for key, item in value.items()}
|
|
53
|
+
if isinstance(value, set):
|
|
54
|
+
return sorted((_json_safe(item) for item in value), key=repr)
|
|
55
|
+
if isinstance(value, (list, tuple)):
|
|
56
|
+
return [_json_safe(item) for item in value]
|
|
57
|
+
return value
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def _canonical_value(item: dict[str, Any], key: str) -> Any:
|
|
61
|
+
value = item.get(key)
|
|
62
|
+
if key == 'attributes' and value is None:
|
|
63
|
+
value = item.get('attributes_json')
|
|
64
|
+
if key == 'attributes_json' and value is None:
|
|
65
|
+
value = item.get('attributes')
|
|
66
|
+
if key in {'attributes', 'attributes_json'}:
|
|
67
|
+
if value in (None, '', '{}'):
|
|
68
|
+
return {}
|
|
69
|
+
if isinstance(value, str):
|
|
70
|
+
try:
|
|
71
|
+
value = json.loads(value)
|
|
72
|
+
except (TypeError, ValueError):
|
|
73
|
+
pass
|
|
74
|
+
return _json_safe(value)
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def ai_review_evidence_payload(
|
|
78
|
+
item: dict[str, Any],
|
|
79
|
+
*,
|
|
80
|
+
scope: str,
|
|
81
|
+
personal_project_id: str | None,
|
|
82
|
+
has_conflict: bool,
|
|
83
|
+
) -> dict[str, Any]:
|
|
84
|
+
"""Build the complete evidence identity used by candidate and CAS paths."""
|
|
85
|
+
|
|
86
|
+
payload = {
|
|
87
|
+
'direct': {
|
|
88
|
+
key: _canonical_value(item, key)
|
|
89
|
+
for key in _DIRECT_FIELDS
|
|
90
|
+
},
|
|
91
|
+
'scope': scope,
|
|
92
|
+
'personal_project_id': personal_project_id,
|
|
93
|
+
'project_ids': sorted({
|
|
94
|
+
str(project_id)
|
|
95
|
+
for project_id in (item.get('project_ids') or [])
|
|
96
|
+
if project_id
|
|
97
|
+
}),
|
|
98
|
+
'has_conflict': bool(has_conflict),
|
|
99
|
+
}
|
|
100
|
+
return _json_safe(payload)
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
def ai_review_evidence_token(
|
|
104
|
+
item: dict[str, Any],
|
|
105
|
+
*,
|
|
106
|
+
scope: str,
|
|
107
|
+
personal_project_id: str | None,
|
|
108
|
+
has_conflict: bool,
|
|
109
|
+
) -> str:
|
|
110
|
+
"""Return a deterministic SHA-256 token for the reviewable item snapshot."""
|
|
111
|
+
|
|
112
|
+
encoded = json.dumps(
|
|
113
|
+
ai_review_evidence_payload(
|
|
114
|
+
item,
|
|
115
|
+
scope=scope,
|
|
116
|
+
personal_project_id=personal_project_id,
|
|
117
|
+
has_conflict=has_conflict,
|
|
118
|
+
),
|
|
119
|
+
ensure_ascii=False,
|
|
120
|
+
sort_keys=True,
|
|
121
|
+
separators=(',', ':'),
|
|
122
|
+
).encode('utf-8')
|
|
123
|
+
return hashlib.sha256(encoded).hexdigest()
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def effective_ai_review(
|
|
127
|
+
item: dict[str, Any],
|
|
128
|
+
*,
|
|
129
|
+
stored_token: str | None,
|
|
130
|
+
stored_assessment: dict[str, Any] | str | None,
|
|
131
|
+
scope: str,
|
|
132
|
+
personal_project_id: str | None,
|
|
133
|
+
has_conflict: bool,
|
|
134
|
+
) -> dict[str, Any] | None:
|
|
135
|
+
"""Expose an assessment only while its exact current evidence still holds."""
|
|
136
|
+
|
|
137
|
+
if not stored_token or item.get('requires_attention') is True or has_conflict:
|
|
138
|
+
return None
|
|
139
|
+
current_token = ai_review_evidence_token(
|
|
140
|
+
item,
|
|
141
|
+
scope=scope,
|
|
142
|
+
personal_project_id=personal_project_id,
|
|
143
|
+
has_conflict=has_conflict,
|
|
144
|
+
)
|
|
145
|
+
if current_token != stored_token:
|
|
146
|
+
return None
|
|
147
|
+
if isinstance(stored_assessment, str):
|
|
148
|
+
try:
|
|
149
|
+
stored_assessment = json.loads(stored_assessment)
|
|
150
|
+
except (TypeError, ValueError):
|
|
151
|
+
return None
|
|
152
|
+
if not isinstance(stored_assessment, dict):
|
|
153
|
+
return None
|
|
154
|
+
return stored_assessment
|
|
@@ -330,6 +330,18 @@ def _promotion_query(item_kind):
|
|
|
330
330
|
WITH space, parent, canonical, direct_children,
|
|
331
331
|
collect({{item: duplicate, spec: duplicate_spec}}) AS duplicate_pairs
|
|
332
332
|
WHERE size(duplicate_pairs) = size($duplicate_specs)
|
|
333
|
+
WITH space, parent, canonical, direct_children, duplicate_pairs,
|
|
334
|
+
[{{kind: $item_kind, item: canonical}}] +
|
|
335
|
+
[pair IN duplicate_pairs |
|
|
336
|
+
{{kind: $item_kind, item: pair.item}}] AS lock_items
|
|
337
|
+
UNWIND lock_items AS lock_item
|
|
338
|
+
WITH space, parent, canonical, direct_children,
|
|
339
|
+
duplicate_pairs, lock_item
|
|
340
|
+
ORDER BY lock_item.kind + ':' + lock_item.item.uuid
|
|
341
|
+
SET lock_item.item.fuli_ai_review_lock_version =
|
|
342
|
+
coalesce(lock_item.item.fuli_ai_review_lock_version, 0) + 1
|
|
343
|
+
WITH space, parent, canonical, direct_children,
|
|
344
|
+
duplicate_pairs, collect(lock_item) AS _locked_items
|
|
333
345
|
SET canonical.fuli_inheritance_mode = 'descendants',
|
|
334
346
|
canonical.fuli_inherited_project_ids = []
|
|
335
347
|
{duplicate_update}
|
|
@@ -83,6 +83,6 @@ class StoreDefaultProjectLead:
|
|
|
83
83
|
break
|
|
84
84
|
return ProjectAgentContextResolution(
|
|
85
85
|
status='ready', reason='default_project_lead',
|
|
86
|
-
match_basis=['
|
|
86
|
+
match_basis=['AR hired the project lead for its first task'],
|
|
87
87
|
candidate_count=1, agent=lead,
|
|
88
88
|
)
|
|
@@ -55,6 +55,13 @@ class GraphNode(StrictModel):
|
|
|
55
55
|
last_human_changed_at: datetime | None = None
|
|
56
56
|
last_agent_viewed_at: datetime | None = None
|
|
57
57
|
last_agent_reviewed_at: datetime | None = None
|
|
58
|
+
ai_review_evidence_token: str | None = None
|
|
59
|
+
ai_assessment: dict[str, Any] | None = None
|
|
60
|
+
ai_review_scope: str | None = None
|
|
61
|
+
ai_review_project_id: str | None = None
|
|
62
|
+
ai_reviewed_at: datetime | None = None
|
|
63
|
+
ai_review_id: str | None = None
|
|
64
|
+
ai_review_decision_id: str | None = None
|
|
58
65
|
utility_score: float = Field(default=0, ge=0, le=1)
|
|
59
66
|
confidence_score: float = Field(default=0.5, ge=0, le=1)
|
|
60
67
|
qualified_use_count: int = Field(default=0, ge=0)
|
|
@@ -109,6 +116,13 @@ class GraphEdge(StrictModel):
|
|
|
109
116
|
last_human_changed_at: datetime | None = None
|
|
110
117
|
last_agent_viewed_at: datetime | None = None
|
|
111
118
|
last_agent_reviewed_at: datetime | None = None
|
|
119
|
+
ai_review_evidence_token: str | None = None
|
|
120
|
+
ai_assessment: dict[str, Any] | None = None
|
|
121
|
+
ai_review_scope: str | None = None
|
|
122
|
+
ai_review_project_id: str | None = None
|
|
123
|
+
ai_reviewed_at: datetime | None = None
|
|
124
|
+
ai_review_id: str | None = None
|
|
125
|
+
ai_review_decision_id: str | None = None
|
|
112
126
|
utility_score: float = Field(default=0, ge=0, le=1)
|
|
113
127
|
confidence_score: float = Field(default=0.5, ge=0, le=1)
|
|
114
128
|
qualified_use_count: int = Field(default=0, ge=0)
|