@bolloon/bolloon-agent 0.2.12 → 0.2.14

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 (284) hide show
  1. package/README.md +495 -467
  2. package/bin/bolloon-cli.cjs +183 -183
  3. package/bin/bolloon-daemon.sh +207 -0
  4. package/bin/bolloon.cjs +0 -0
  5. package/bin/ipfs +0 -0
  6. package/dist/agents/agent-manifest-protocol.js +52 -0
  7. package/dist/agents/chat-segmenter.js +298 -0
  8. package/dist/agents/constraint-layer.js +19 -19
  9. package/dist/agents/judgment-protocol.js +479 -0
  10. package/dist/agents/parse-tool-call.js +304 -0
  11. package/dist/agents/peer-manifest-loader.js +210 -0
  12. package/dist/agents/pi-sdk-session-factory.js +110 -0
  13. package/dist/agents/pi-sdk-session-manager.js +297 -0
  14. package/dist/agents/pi-sdk-tools.js +1288 -0
  15. package/dist/agents/pi-sdk-types.js +13 -0
  16. package/dist/agents/pi-sdk.js +553 -1306
  17. package/dist/agents/react-loop.js +120 -0
  18. package/dist/agents/session-store.js +171 -0
  19. package/dist/agents/shell-guard.js +2 -2
  20. package/dist/agents/tool-registry.js +136 -0
  21. package/dist/agents/workflow-pivot-loop.js +200 -22
  22. package/dist/bollharness/src/scripts/context_router.js +7 -0
  23. package/dist/bollharness/src/scripts/deploy-guard.js +8 -8
  24. package/dist/bollharness-integration/context-router-judgment.js +4 -4
  25. package/dist/bollharness-integration/context-router.js +292 -292
  26. package/dist/bollharness-integration/gate-state-machine.js +26 -13
  27. package/dist/bollharness-integration/integration.js +71 -0
  28. package/dist/bollharness-integration/llm-judgment-engine.js +134 -134
  29. package/dist/bollharness-integration/skill-adapter.js +57 -127
  30. package/dist/bootstrap/chat-archiver.js +276 -0
  31. package/dist/bootstrap/context-collector.js +6 -3
  32. package/dist/bootstrap/event-log.js +160 -0
  33. package/dist/bootstrap/lifecycle-hooks.js +15 -1
  34. package/dist/bootstrap/memory-compressor.js +170 -0
  35. package/dist/bootstrap/persona-loader.js +94 -0
  36. package/dist/bootstrap/project-state.js +159 -0
  37. package/dist/bootstrap/remote-mirror.js +97 -0
  38. package/dist/bootstrap/session-window.js +121 -0
  39. package/dist/bootstrap/vector-index.js +248 -0
  40. package/dist/cli/loading-tui.js +40 -0
  41. package/dist/cli-entry.js +41 -37
  42. package/dist/context-compaction/auto-compact.js +7 -7
  43. package/dist/electron/config.js +21 -0
  44. package/dist/electron/config.js.map +1 -0
  45. package/dist/electron/dialogs.js +108 -0
  46. package/dist/electron/dialogs.js.map +1 -0
  47. package/dist/electron/first-run.js +170 -0
  48. package/dist/electron/first-run.js.map +1 -0
  49. package/dist/electron/ipc.js +20 -0
  50. package/dist/electron/ipc.js.map +1 -0
  51. package/dist/electron/logger.js +114 -0
  52. package/dist/electron/logger.js.map +1 -0
  53. package/dist/electron/main.js +63 -0
  54. package/dist/electron/main.js.map +1 -0
  55. package/dist/electron/menu.js +145 -0
  56. package/dist/electron/menu.js.map +1 -0
  57. package/dist/electron/paths.js +75 -0
  58. package/dist/electron/paths.js.map +1 -0
  59. package/dist/electron/server.js +119 -0
  60. package/dist/electron/server.js.map +1 -0
  61. package/dist/electron/tray.js +111 -0
  62. package/dist/electron/tray.js.map +1 -0
  63. package/dist/electron/window.js +111 -0
  64. package/dist/electron/window.js.map +1 -0
  65. package/dist/electron-preload.js +26 -6
  66. package/dist/electron-preload.js.map +1 -1
  67. package/dist/electron.js +6 -168
  68. package/dist/electron.js.map +1 -1
  69. package/dist/index.js +323 -266
  70. package/dist/llm/config-store.js +29 -8
  71. package/dist/llm/llm-judgment-client.js +102 -102
  72. package/dist/llm/pi-ai.js +139 -85
  73. package/dist/llm/system-prompt/layers/channel/local.md +14 -14
  74. package/dist/llm/system-prompt/layers/channel/p2p-agent.md +18 -18
  75. package/dist/llm/system-prompt/layers/channel/p2p-visitor.md +19 -19
  76. package/dist/llm/system-prompt/layers/core/artifacts_storage.md +89 -89
  77. package/dist/llm/system-prompt/layers/core/evenhandedness.md +21 -21
  78. package/dist/llm/system-prompt/layers/core/hibs_reminders.md +15 -15
  79. package/dist/llm/system-prompt/layers/core/identity.md +37 -37
  80. package/dist/llm/system-prompt/layers/core/knowledge.md +17 -17
  81. package/dist/llm/system-prompt/layers/core/memory_system.md +12 -12
  82. package/dist/llm/system-prompt/layers/core/network_filesystem.md +28 -28
  83. package/dist/llm/system-prompt/layers/core/refusal.md +37 -37
  84. package/dist/llm/system-prompt/layers/core/tone.md +31 -31
  85. package/dist/llm/system-prompt/layers/core/tools.thin.md +13 -13
  86. package/dist/llm/system-prompt/layers/core/wellbeing.md +41 -41
  87. package/dist/llm/system-prompt/layers/role/architect.md +20 -20
  88. package/dist/llm/system-prompt/layers/role/expert.md +19 -19
  89. package/dist/llm/system-prompt/layers/role/implementer.md +15 -15
  90. package/dist/llm/system-prompt/layers/role/security.md +15 -15
  91. package/dist/llm/system-prompt/layers/tool/artifacts.md +72 -72
  92. package/dist/llm/system-prompt/layers/tool/bash.md +25 -25
  93. package/dist/llm/system-prompt/layers/tool/hibs_api.md +171 -171
  94. package/dist/llm/system-prompt/layers/tool/image_search.md +70 -70
  95. package/dist/llm/system-prompt/layers/tool/manifest.md +89 -89
  96. package/dist/llm/system-prompt/layers/tool/mcp_apps.md +53 -53
  97. package/dist/llm/system-prompt/layers/tool/web_search.md +83 -83
  98. package/dist/llm/tool-manifest/ask_user_input.js +1 -1
  99. package/dist/llm/tool-manifest/bash.js +3 -3
  100. package/dist/llm/tool-manifest/create_file.js +4 -4
  101. package/dist/llm/tool-manifest/fetch_sports_data.js +3 -3
  102. package/dist/llm/tool-manifest/image_search.js +2 -2
  103. package/dist/llm/tool-manifest/mcp.js +2 -2
  104. package/dist/llm/tool-manifest/message_compose.js +3 -3
  105. package/dist/llm/tool-manifest/places.js +2 -2
  106. package/dist/llm/tool-manifest/present_files.js +1 -1
  107. package/dist/llm/tool-manifest/recipe.js +2 -2
  108. package/dist/llm/tool-manifest/str_replace.js +5 -5
  109. package/dist/llm/tool-manifest/view.js +3 -3
  110. package/dist/llm/tool-manifest/weather.js +4 -4
  111. package/dist/llm/tool-manifest/web.js +4 -4
  112. package/dist/network/local-inbox-bus.js +73 -0
  113. package/dist/network/p2p-outbox.js +161 -0
  114. package/dist/network/peer-fs.js +420 -0
  115. package/dist/network/peer-resource-bridge.js +216 -0
  116. package/dist/pi-ecosystem-judgment/causal-judge.js +51 -51
  117. package/dist/pi-ecosystem-judgment/cleanup.js +126 -0
  118. package/dist/pi-ecosystem-judgment/distill-prompt.js +42 -42
  119. package/dist/pi-ecosystem-judgment/distillation.js +14 -14
  120. package/dist/pi-ecosystem-judgment/human-value-store.js +45 -11
  121. package/dist/pi-ecosystem-judgment/monitor-gate.js +28 -28
  122. package/dist/pi-ecosystem-judgment/value-injection.js +102 -102
  123. package/dist/security/context-router-tool.js +15 -15
  124. package/dist/security/tool-gate.js +11 -0
  125. package/dist/web/api-config.html +520 -520
  126. package/dist/web/client-loop-status.js +220 -0
  127. package/dist/web/client.js +22 -5
  128. package/dist/web/client.js.map +7 -0
  129. package/dist/web/components/wallet-viem.mjs +118 -118
  130. package/dist/web/index.html +375 -375
  131. package/dist/web/input-validator.js +103 -0
  132. package/dist/web/manifest.json +20 -20
  133. package/dist/web/routes-judgments.js +738 -0
  134. package/dist/web/routes-llm-config.js +279 -0
  135. package/dist/web/routes-tasks.js +222 -0
  136. package/dist/web/server-sse.js +121 -0
  137. package/dist/web/server-storage.js +154 -0
  138. package/dist/web/server-types.js +15 -0
  139. package/dist/web/server-v3-p2p.js +224 -0
  140. package/dist/web/server.js +1070 -1307
  141. package/dist/web/style.css +4742 -4742
  142. package/dist/web/util/safe-name.js +32 -0
  143. package/package.json +162 -160
  144. package/scripts/build-cli.js +215 -215
  145. package/scripts/build-web.ts +130 -130
  146. package/scripts/postinstall.js +152 -152
  147. package/bin/bolloon.js +0 -157
  148. package/dist/constraint-runtime/src/_archive_helper.js +0 -9
  149. package/dist/constraint-runtime/src/agent/coordinator.js +0 -48
  150. package/dist/constraint-runtime/src/agent/index.js +0 -1
  151. package/dist/constraint-runtime/src/assistant/index.js +0 -12
  152. package/dist/constraint-runtime/src/bootstrap/index.js +0 -12
  153. package/dist/constraint-runtime/src/bootstrap_graph.js +0 -13
  154. package/dist/constraint-runtime/src/bridge/index.js +0 -12
  155. package/dist/constraint-runtime/src/buddy/index.js +0 -12
  156. package/dist/constraint-runtime/src/cli/index.js +0 -12
  157. package/dist/constraint-runtime/src/command_graph.js +0 -10
  158. package/dist/constraint-runtime/src/commands.js +0 -60
  159. package/dist/constraint-runtime/src/components/index.js +0 -12
  160. package/dist/constraint-runtime/src/constants/index.js +0 -12
  161. package/dist/constraint-runtime/src/constraint/budget.js +0 -22
  162. package/dist/constraint-runtime/src/constraint/index.js +0 -2
  163. package/dist/constraint-runtime/src/constraint/permission.js +0 -20
  164. package/dist/constraint-runtime/src/context.js +0 -30
  165. package/dist/constraint-runtime/src/coordinator/index.js +0 -12
  166. package/dist/constraint-runtime/src/cost_hook.js +0 -4
  167. package/dist/constraint-runtime/src/cost_tracker.js +0 -8
  168. package/dist/constraint-runtime/src/deferred_init.js +0 -10
  169. package/dist/constraint-runtime/src/direct_modes.js +0 -6
  170. package/dist/constraint-runtime/src/dynamic-tool-loader.js +0 -85
  171. package/dist/constraint-runtime/src/entrypoints/index.js +0 -12
  172. package/dist/constraint-runtime/src/execution_registry.js +0 -44
  173. package/dist/constraint-runtime/src/history.js +0 -9
  174. package/dist/constraint-runtime/src/hooks/index.js +0 -12
  175. package/dist/constraint-runtime/src/index.js +0 -26
  176. package/dist/constraint-runtime/src/ink.js +0 -4
  177. package/dist/constraint-runtime/src/keybindings/index.js +0 -12
  178. package/dist/constraint-runtime/src/memdir/index.js +0 -12
  179. package/dist/constraint-runtime/src/migrations/index.js +0 -12
  180. package/dist/constraint-runtime/src/models.js +0 -1
  181. package/dist/constraint-runtime/src/moreright/index.js +0 -12
  182. package/dist/constraint-runtime/src/native_ts/index.js +0 -12
  183. package/dist/constraint-runtime/src/output_styles/index.js +0 -12
  184. package/dist/constraint-runtime/src/parity_audit.js +0 -12
  185. package/dist/constraint-runtime/src/plugins/index.js +0 -12
  186. package/dist/constraint-runtime/src/port_manifest.js +0 -11
  187. package/dist/constraint-runtime/src/prefetch.js +0 -9
  188. package/dist/constraint-runtime/src/query.js +0 -1
  189. package/dist/constraint-runtime/src/remote/index.js +0 -12
  190. package/dist/constraint-runtime/src/remote_runtime.js +0 -9
  191. package/dist/constraint-runtime/src/runtime/index.js +0 -1
  192. package/dist/constraint-runtime/src/runtime/session.js +0 -35
  193. package/dist/constraint-runtime/src/schemas/index.js +0 -12
  194. package/dist/constraint-runtime/src/screens/index.js +0 -12
  195. package/dist/constraint-runtime/src/server/index.js +0 -12
  196. package/dist/constraint-runtime/src/services/index.js +0 -12
  197. package/dist/constraint-runtime/src/session_store.js +0 -22
  198. package/dist/constraint-runtime/src/setup.js +0 -30
  199. package/dist/constraint-runtime/src/skills/index.js +0 -1
  200. package/dist/constraint-runtime/src/skills/skill-registry.js +0 -28
  201. package/dist/constraint-runtime/src/state/index.js +0 -12
  202. package/dist/constraint-runtime/src/system_init.js +0 -20
  203. package/dist/constraint-runtime/src/thinking/engine.js +0 -42
  204. package/dist/constraint-runtime/src/thinking/index.js +0 -1
  205. package/dist/constraint-runtime/src/tool_pool.js +0 -8
  206. package/dist/constraint-runtime/src/tools/OpenCLI/execAdapter.js +0 -7
  207. package/dist/constraint-runtime/src/tools/OpenCLI/listAdapters.js +0 -7
  208. package/dist/constraint-runtime/src/tools/OpenCLI/runCommand.js +0 -7
  209. package/dist/constraint-runtime/src/tools/SafeSDK/confirmTransaction.js +0 -6
  210. package/dist/constraint-runtime/src/tools/SafeSDK/createTransaction.js +0 -8
  211. package/dist/constraint-runtime/src/tools/SafeSDK/executeTransaction.js +0 -6
  212. package/dist/constraint-runtime/src/tools/SafeSDK/getBalance.js +0 -6
  213. package/dist/constraint-runtime/src/tools/SafeSDK/getPendingTransactions.js +0 -6
  214. package/dist/constraint-runtime/src/tools/SafeSDK/proposeTransaction.js +0 -6
  215. package/dist/constraint-runtime/src/tools.js +0 -80
  216. package/dist/constraint-runtime/src/transcript.js +0 -19
  217. package/dist/constraint-runtime/src/types/index.js +0 -12
  218. package/dist/constraint-runtime/src/upstream_proxy/index.js +0 -12
  219. package/dist/constraint-runtime/src/utils/index.js +0 -12
  220. package/dist/constraint-runtime/src/vim/index.js +0 -12
  221. package/dist/constraint-runtime/src/voice/index.js +0 -12
  222. package/dist/constraint-runtime/tests/agent.test.js +0 -16
  223. package/dist/constraint-runtime/tests/constraint.test.js +0 -41
  224. package/dist/constraint-runtime/tests/skill.test.js +0 -19
  225. package/dist/constraint-runtime/tests/thinking.test.js +0 -22
  226. package/dist/pi-ecosystem-colony/index.js +0 -365
  227. package/dist/social/ant-colony/AdaptiveHeartbeat.js +0 -101
  228. package/dist/social/ant-colony/PheromoneEngine.js +0 -227
  229. package/dist/social/ant-colony/index.js +0 -6
  230. package/dist/social/ant-colony/types.js +0 -24
  231. package/dist/test/ai-judgment-test.js +0 -80
  232. package/dist/test/bollharness-integration.test.js +0 -318
  233. package/dist/test/channel-agent-multi-dialogue.js +0 -205
  234. package/dist/test/channel-heartbeat-agent-test.js +0 -201
  235. package/dist/test/constraint-layer.test.js +0 -164
  236. package/dist/test/diap-identity-test.js +0 -172
  237. package/dist/test/diap-quick-test.js +0 -62
  238. package/dist/test/global-shared-context.test.js +0 -315
  239. package/dist/test/harness-judgment-injection.test.js +0 -246
  240. package/dist/test/harness-workflow-integrator-test.js +0 -228
  241. package/dist/test/human-value-store.test.js +0 -243
  242. package/dist/test/hybrid-integration-test.js +0 -118
  243. package/dist/test/hybrid-messenger-verify.js +0 -55
  244. package/dist/test/iroh-bistream-debug.js +0 -38
  245. package/dist/test/iroh-communication.test.js +0 -66
  246. package/dist/test/iroh-debug-test.js +0 -57
  247. package/dist/test/iroh-diap-test.js +0 -71
  248. package/dist/test/iroh-direct-connect.js +0 -55
  249. package/dist/test/iroh-e2e-fixed.js +0 -89
  250. package/dist/test/iroh-e2e-same-process.js +0 -63
  251. package/dist/test/iroh-e2e.js +0 -66
  252. package/dist/test/iroh-final-e2e.js +0 -72
  253. package/dist/test/iroh-relay-test.js +0 -37
  254. package/dist/test/iroh-simple-test.js +0 -41
  255. package/dist/test/iroh-transport-verify.js +0 -54
  256. package/dist/test/iroh-transport.test.js +0 -37
  257. package/dist/test/iroh-two-nodes.js +0 -70
  258. package/dist/test/iroh-verify.js +0 -44
  259. package/dist/test/judgment-decision.test.js +0 -219
  260. package/dist/test/llm-judgment-integration.test.js +0 -220
  261. package/dist/test/p2p-agent-complex-dialogue.js +0 -385
  262. package/dist/test/p2p-agent-dialogue.js +0 -341
  263. package/dist/test/p2p-agent-full-bidirectional.js +0 -510
  264. package/dist/test/p2p-agent-harness-flow.js +0 -437
  265. package/dist/test/p2p-agent-harness-single.js +0 -143
  266. package/dist/test/p2p-ai-dialogue-test.js +0 -318
  267. package/dist/test/p2p-cid-connect-test.js +0 -195
  268. package/dist/test/p2p-connect-receiver.js +0 -69
  269. package/dist/test/p2p-doc-transfer.js +0 -110
  270. package/dist/test/p2p-identity-page-test.js +0 -77
  271. package/dist/test/p2p-iroh-test.js +0 -171
  272. package/dist/test/p2p-minimal-test.js +0 -241
  273. package/dist/test/p2p-node-1.js +0 -148
  274. package/dist/test/p2p-node-2.js +0 -148
  275. package/dist/test/p2p-server.js +0 -281
  276. package/dist/test/p2p-two-nodes-test.js +0 -438
  277. package/dist/test/pi-sdk.test.js +0 -44
  278. package/dist/test/set-persona.js +0 -40
  279. package/dist/test/simple.test.js +0 -9
  280. package/dist/test/storage-integration.test.js +0 -150
  281. package/dist/test/subagent-manager.test.js +0 -276
  282. package/dist/test/test-gate-flow.test.js +0 -81
  283. package/dist/test/workflow-engine.test.js +0 -87
  284. package/dist/test/workflow-pivot-loop.test.js +0 -246
@@ -0,0 +1,297 @@
1
+ import * as fs from 'fs/promises';
2
+ import * as path from 'path';
3
+ import { getGlobalSharedContext } from '../social/global-shared-context.js';
4
+ import { Session, saveSession, loadSession } from '@bolloon/constraint-runtime';
5
+ const SHARED_SESSION_PATH = path.join(process.env.HOME || '/tmp', '.bolloon', 'sessions');
6
+ const PERSONA_PATH = path.join(process.env.HOME || '/tmp', '.bolloon', 'persona.json');
7
+ /**
8
+ * PiSessionManager — 负责:
9
+ * - 加载 / 持久化 persona
10
+ * - 加载 / 持久化 channels (含 P2P 远端 channel)
11
+ * - 维护 working memory + summarized memory + file context
12
+ * - token 用量累加
13
+ * - shared context (addUserAction / addSharedKnowledge / createCooperation)
14
+ *
15
+ * 从 pi-sdk.ts 抽出 (2026-07-06) — 业务逻辑独立, 不依赖 PiAgentSession 的 LLM 循环.
16
+ */
17
+ export class PiSessionManager {
18
+ session;
19
+ state;
20
+ memory;
21
+ persona = null;
22
+ channels = new Map();
23
+ channelsPath;
24
+ initialized = false;
25
+ sessionDir;
26
+ cwd;
27
+ sharedContext;
28
+ agentId;
29
+ constructor(agentId, cwd) {
30
+ this.cwd = cwd;
31
+ this.sessionDir = path.join(cwd, '.port_sessions');
32
+ this.agentId = agentId;
33
+ const sessionId = `pi-session-${Date.now()}`;
34
+ this.session = new Session(sessionId);
35
+ this.state = {
36
+ id: sessionId,
37
+ agentId,
38
+ cwd,
39
+ startedAt: new Date().toISOString(),
40
+ lastActive: new Date().toISOString()
41
+ };
42
+ this.memory = {
43
+ workingMemory: [],
44
+ summarizedMemory: [],
45
+ fileContext: new Map()
46
+ };
47
+ this.channelsPath = path.join(SHARED_SESSION_PATH, 'pi-channels.json');
48
+ this.sharedContext = getGlobalSharedContext();
49
+ }
50
+ get sessionId() {
51
+ return this.session.sessionId;
52
+ }
53
+ get turnCount() {
54
+ return this.session.turnCount;
55
+ }
56
+ addSessionMessage(msg) {
57
+ this.session.addMessage(msg);
58
+ this.persistSession();
59
+ }
60
+ getSessionHistory() {
61
+ return this.session.history;
62
+ }
63
+ setSessionContext(key, value) {
64
+ this.session.setContext(key, value);
65
+ this.persistSession();
66
+ }
67
+ getSessionContext(key) {
68
+ return this.session.getContext(key);
69
+ }
70
+ persistSession() {
71
+ try {
72
+ const stored = {
73
+ sessionId: this.session.sessionId,
74
+ messages: this.session.history,
75
+ inputTokens: 0,
76
+ outputTokens: 0
77
+ };
78
+ saveSession(stored);
79
+ }
80
+ catch (e) {
81
+ console.warn('Failed to persist session:', e);
82
+ }
83
+ }
84
+ loadPersistedSession() {
85
+ try {
86
+ const sessionId = this.state.id;
87
+ const stored = loadSession(sessionId);
88
+ for (const msg of stored.messages) {
89
+ this.session.addMessage(msg);
90
+ }
91
+ }
92
+ catch {
93
+ // No persisted session found, start fresh
94
+ }
95
+ }
96
+ async initialize() {
97
+ if (this.initialized)
98
+ return;
99
+ await fs.mkdir(SHARED_SESSION_PATH, { recursive: true });
100
+ await fs.mkdir(this.sessionDir, { recursive: true });
101
+ this.persona = await this.loadPersona();
102
+ await this.loadChannels();
103
+ this.loadPersistedSession();
104
+ await this.sharedContext.initialize();
105
+ await this.sharedContext.registerAgent({
106
+ agentId: this.agentId,
107
+ sessionId: this.sessionId,
108
+ channelId: 'system',
109
+ capabilities: this.persona?.capabilities || [],
110
+ status: 'active',
111
+ name: this.persona?.name,
112
+ persona: this.persona ? {
113
+ name: this.persona.name,
114
+ description: this.persona.description,
115
+ capabilities: this.persona.capabilities
116
+ } : undefined
117
+ });
118
+ this.initialized = true;
119
+ }
120
+ async loadPersona() {
121
+ try {
122
+ const data = await fs.readFile(PERSONA_PATH, 'utf-8');
123
+ return JSON.parse(data);
124
+ }
125
+ catch {
126
+ return null;
127
+ }
128
+ }
129
+ async loadChannels() {
130
+ try {
131
+ const data = await fs.readFile(this.channelsPath, 'utf-8');
132
+ const channelsArray = JSON.parse(data);
133
+ this.channels.clear();
134
+ for (const channel of channelsArray) {
135
+ this.channels.set(channel.id, channel);
136
+ }
137
+ }
138
+ catch {
139
+ this.channels.clear();
140
+ }
141
+ }
142
+ async saveChannels() {
143
+ const channelsArray = Array.from(this.channels.values());
144
+ await fs.writeFile(this.channelsPath, JSON.stringify(channelsArray, null, 2));
145
+ }
146
+ async savePersona(persona) {
147
+ await fs.writeFile(PERSONA_PATH, JSON.stringify(persona, null, 2));
148
+ this.persona = persona;
149
+ }
150
+ getPersona() {
151
+ return this.persona;
152
+ }
153
+ getState() {
154
+ return { ...this.state, lastActive: new Date().toISOString() };
155
+ }
156
+ getMemory() {
157
+ return this.memory;
158
+ }
159
+ addToWorkingMemory(content) {
160
+ this.memory.workingMemory.push(content);
161
+ if (this.memory.workingMemory.length > 100) {
162
+ this.memory.workingMemory = this.memory.workingMemory.slice(-100);
163
+ }
164
+ this.state.lastActive = new Date().toISOString();
165
+ }
166
+ addSummarizedMemory(content) {
167
+ this.memory.summarizedMemory.push(content);
168
+ if (this.memory.summarizedMemory.length > 50) {
169
+ this.memory.summarizedMemory = this.memory.summarizedMemory.slice(-50);
170
+ }
171
+ }
172
+ addFileContext(filePath, content) {
173
+ this.memory.fileContext.set(filePath, content);
174
+ if (this.memory.fileContext.size > 20) {
175
+ const entries = Array.from(this.memory.fileContext.entries());
176
+ this.memory.fileContext = new Map(entries.slice(-20));
177
+ }
178
+ }
179
+ updateTokenUsage(promptTokens, completionTokens) {
180
+ this.state.tokenUsage = {
181
+ promptTokens: (this.state.tokenUsage?.promptTokens || 0) + promptTokens,
182
+ completionTokens: (this.state.tokenUsage?.completionTokens || 0) + completionTokens,
183
+ totalTokens: (this.state.tokenUsage?.totalTokens || 0) + promptTokens + completionTokens
184
+ };
185
+ }
186
+ async addMessage(channelId, message) {
187
+ await this.initialize();
188
+ if (!this.channels.has(channelId)) {
189
+ this.channels.set(channelId, {
190
+ id: channelId,
191
+ name: channelId,
192
+ messages: [],
193
+ createdAt: new Date().toISOString(),
194
+ updatedAt: new Date().toISOString()
195
+ });
196
+ }
197
+ const channel = this.channels.get(channelId);
198
+ channel.messages.push(message);
199
+ channel.updatedAt = new Date().toISOString();
200
+ await this.saveChannels();
201
+ }
202
+ async getChannelMessages(channelId) {
203
+ await this.initialize();
204
+ return this.channels.get(channelId)?.messages || [];
205
+ }
206
+ async createChannel(name, peerInfo, persona) {
207
+ await this.initialize();
208
+ const channelId = `ch_${Date.now()}_${Math.random().toString(36).substring(2, 8)}`;
209
+ const channel = {
210
+ id: channelId,
211
+ name,
212
+ messages: [],
213
+ createdAt: new Date().toISOString(),
214
+ updatedAt: new Date().toISOString(),
215
+ ...peerInfo,
216
+ persona: persona || undefined
217
+ };
218
+ this.channels.set(channelId, channel);
219
+ await this.saveChannels();
220
+ return channel;
221
+ }
222
+ async getOrCreatePeerChannel(peerDid, peerName, persona) {
223
+ await this.initialize();
224
+ for (const channel of this.channels.values()) {
225
+ if (channel.peerDid === peerDid) {
226
+ return channel;
227
+ }
228
+ }
229
+ return this.createChannel(`与 ${peerName} 的对话`, {
230
+ peerDid,
231
+ peerName
232
+ }, persona);
233
+ }
234
+ async setChannelInfo(channelId, info) {
235
+ await this.initialize();
236
+ const channel = this.channels.get(channelId);
237
+ if (channel) {
238
+ Object.assign(channel, info, { updatedAt: new Date().toISOString() });
239
+ await this.saveChannels();
240
+ }
241
+ }
242
+ getAllChannels() {
243
+ return Array.from(this.channels.values());
244
+ }
245
+ getChannelPersona(channelId) {
246
+ return this.channels.get(channelId)?.persona;
247
+ }
248
+ async setChannelPersona(channelId, persona) {
249
+ await this.initialize();
250
+ const channel = this.channels.get(channelId);
251
+ if (channel) {
252
+ channel.persona = persona;
253
+ channel.updatedAt = new Date().toISOString();
254
+ await this.saveChannels();
255
+ }
256
+ }
257
+ async addUserActionToSharedContext(content, importance) {
258
+ await this.initialize();
259
+ await this.sharedContext.addUserAction(content, this.agentId, undefined, importance);
260
+ await this.sharedContext.updateAgentStatus(this.agentId, 'active');
261
+ }
262
+ async addSharedKnowledge(knowledge) {
263
+ await this.initialize();
264
+ await this.sharedContext.addSharedKnowledge(knowledge);
265
+ }
266
+ async getRecentActionsSummary(count) {
267
+ return this.sharedContext.getRecentActionsSummary(count);
268
+ }
269
+ async getSharedKnowledge() {
270
+ return this.sharedContext.getSharedKnowledge();
271
+ }
272
+ async getGlobalContext() {
273
+ return this.sharedContext.getFullContext();
274
+ }
275
+ async getGlobalContextSummary() {
276
+ return this.sharedContext.getContextSummary();
277
+ }
278
+ async createCooperation(type, task, toAgentId, context) {
279
+ await this.initialize();
280
+ return this.sharedContext.createCooperation(type, this.agentId, task, toAgentId, context);
281
+ }
282
+ async getPendingCooperations() {
283
+ return this.sharedContext.getPendingCooperations(this.agentId);
284
+ }
285
+ async updateCooperationStatus(cooperationId, status, result) {
286
+ await this.sharedContext.updateCooperationStatus(cooperationId, status, result);
287
+ }
288
+ async getAllRegisteredAgents() {
289
+ return this.sharedContext.getAllAgents();
290
+ }
291
+ async findAgentByCapability(capability) {
292
+ return this.sharedContext.findAgentByCapability(capability);
293
+ }
294
+ async updateAgentStatusInRegistry(status) {
295
+ await this.sharedContext.updateAgentStatus(this.agentId, status);
296
+ }
297
+ }