evolcore 0.0.1 → 0.0.2

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 (371) hide show
  1. package/CHANGELOG.md +813 -0
  2. package/LICENSE +21 -0
  3. package/MIGRATION-0.5.0.md +378 -0
  4. package/README.md +318 -14
  5. package/ROLE_ACCESS_CONTROL.md +174 -0
  6. package/assets/.env.template +4 -0
  7. package/assets/brand/evolcore/README.md +19 -0
  8. package/assets/brand/evolcore/evolcore-app-icon.png +0 -0
  9. package/assets/brand/evolcore/evolcore-app-icon.svg +13 -0
  10. package/assets/brand/evolcore/evolcore-brand-board.png +0 -0
  11. package/assets/brand/evolcore/evolcore-brand-board.svg +126 -0
  12. package/assets/brand/evolcore/evolcore-logo-kit.zip +0 -0
  13. package/assets/brand/evolcore/evolcore-logo-reverse.png +0 -0
  14. package/assets/brand/evolcore/evolcore-logo-reverse.svg +14 -0
  15. package/assets/brand/evolcore/evolcore-logo.png +0 -0
  16. package/assets/brand/evolcore/evolcore-logo.svg +14 -0
  17. package/assets/brand/evolcore/evolcore-mark.png +0 -0
  18. package/assets/brand/evolcore/evolcore-mark.svg +10 -0
  19. package/bin/ec-safe-output.js +161 -0
  20. package/bin/ec.js +29 -0
  21. package/dist/agents/baseagent.js +163 -0
  22. package/dist/agents/claude-runner.js +2385 -0
  23. package/dist/agents/codex-app-server-client.js +448 -0
  24. package/dist/agents/codex-runner.js +2639 -0
  25. package/dist/agents/gemini-runner.js +666 -0
  26. package/dist/agents/runner-types.js +75 -0
  27. package/dist/aun/aid/agentmd.js +216 -0
  28. package/dist/aun/aid/client.js +132 -0
  29. package/dist/aun/aid/control-aid.js +91 -0
  30. package/dist/aun/aid/identity.js +518 -0
  31. package/dist/aun/aid/index.js +4 -0
  32. package/dist/aun/aid/store.js +74 -0
  33. package/dist/aun/aid/types.js +1 -0
  34. package/dist/aun/aid/validation.js +21 -0
  35. package/dist/aun/group-identity.js +10 -0
  36. package/dist/aun/msg/group-index.js +6 -0
  37. package/dist/aun/msg/group.js +1231 -0
  38. package/dist/aun/msg/history.js +123 -0
  39. package/dist/aun/msg/index.js +5 -0
  40. package/dist/aun/msg/p2p.js +393 -0
  41. package/dist/aun/msg/payload-type.js +27 -0
  42. package/dist/aun/msg/upload.js +137 -0
  43. package/dist/aun/outbox.js +160 -0
  44. package/dist/aun/rpc/caller.js +42 -0
  45. package/dist/aun/rpc/connection.js +25 -0
  46. package/dist/aun/rpc/index.js +2 -0
  47. package/dist/aun/service-proxy.js +225 -0
  48. package/dist/aun/storage/download.js +29 -0
  49. package/dist/aun/storage/index.js +3 -0
  50. package/dist/aun/storage/manage.js +10 -0
  51. package/dist/aun/storage/upload.js +68 -0
  52. package/dist/channels/aun.js +4147 -0
  53. package/dist/channels/daemon.js +422 -0
  54. package/dist/channels/dingtalk.js +649 -0
  55. package/dist/channels/feishu.js +1789 -0
  56. package/dist/channels/qqbot.js +409 -0
  57. package/dist/channels/wechat.js +817 -0
  58. package/dist/channels/wecom.js +565 -0
  59. package/dist/cli/agent-command.js +641 -0
  60. package/dist/cli/agent.js +1059 -0
  61. package/dist/cli/aun-commands.js +1948 -0
  62. package/dist/cli/bench.js +1228 -0
  63. package/dist/cli/cli-argv.js +66 -0
  64. package/dist/cli/code-stats.js +329 -0
  65. package/dist/cli/command-log.js +82 -0
  66. package/dist/cli/config-selector.js +69 -0
  67. package/dist/cli/config.js +261 -0
  68. package/dist/cli/ctl-command.js +62 -0
  69. package/dist/cli/daemon-commands.js +2887 -0
  70. package/dist/cli/fs-command.js +1447 -0
  71. package/dist/cli/handoff-command.js +302 -0
  72. package/dist/cli/help.js +31 -0
  73. package/dist/cli/index.js +358 -0
  74. package/dist/cli/init-channel.js +1377 -0
  75. package/dist/cli/init.js +553 -0
  76. package/dist/cli/link-rules.js +240 -0
  77. package/dist/cli/model.js +590 -0
  78. package/dist/cli/net-check.js +723 -0
  79. package/dist/cli/queue-command.js +126 -0
  80. package/dist/cli/response.js +345 -0
  81. package/dist/cli/restart-monitor.js +456 -0
  82. package/dist/cli/stats.js +607 -0
  83. package/dist/cli/task-context.js +80 -0
  84. package/dist/cli/trigger-command.js +505 -0
  85. package/dist/cli/version.js +88 -0
  86. package/dist/cli/watch-logs.js +33 -0
  87. package/dist/cli/watch-msg.js +673 -0
  88. package/dist/config/boot-log.js +266 -0
  89. package/dist/config/builtin-role-templates.js +30 -0
  90. package/dist/config/builtin-roles.js +85 -0
  91. package/dist/config/config-batch-get.js +11 -0
  92. package/dist/config/config-field-policy.js +261 -0
  93. package/dist/config/config-manager.js +916 -0
  94. package/dist/config/config-operation-service.js +384 -0
  95. package/dist/config/contact-book.js +371 -0
  96. package/dist/config/gateway-config.js +858 -0
  97. package/dist/config/lifecycle.js +17 -0
  98. package/dist/config/mention-mode.js +27 -0
  99. package/dist/config/merge.js +161 -0
  100. package/dist/config/owner-policy.js +4 -0
  101. package/dist/config/peer-role-resolver.js +139 -0
  102. package/dist/config/resolved-config-op.js +483 -0
  103. package/dist/config/role-config-v4-startup.js +32 -0
  104. package/dist/config/role-config-v5-startup.js +27 -0
  105. package/dist/config/role-schema.js +105 -0
  106. package/dist/config/role-service.js +159 -0
  107. package/dist/config/role-store.js +204 -0
  108. package/dist/config/roles.js +55 -0
  109. package/dist/config/schema-registry.js +154 -0
  110. package/dist/config/snapshot.js +598 -0
  111. package/dist/config-store.js +503 -0
  112. package/dist/core/auth/agent-delegation.js +111 -0
  113. package/dist/core/auth/auth-gateway.js +166 -0
  114. package/dist/core/auth/authenticated-actor.js +6 -0
  115. package/dist/core/auth/authorization-audit.js +110 -0
  116. package/dist/core/auth/operation-authorizer.js +718 -0
  117. package/dist/core/auth/operation-catalog.js +675 -0
  118. package/dist/core/baseagent-loader.js +54 -0
  119. package/dist/core/bootstrap-service.js +175 -0
  120. package/dist/core/capability/capability-manager.js +316 -0
  121. package/dist/core/capability/providers/claude-capability-provider.js +176 -0
  122. package/dist/core/capability/providers/codex-capability-provider.js +148 -0
  123. package/dist/core/capability/providers/gemini-capability-provider.js +10 -0
  124. package/dist/core/capability/types.js +27 -0
  125. package/dist/core/causation/audit.js +103 -0
  126. package/dist/core/causation/aun-association.js +111 -0
  127. package/dist/core/causation/context.js +93 -0
  128. package/dist/core/causation/index.js +4 -0
  129. package/dist/core/causation/types.js +2 -0
  130. package/dist/core/channel-loader.js +277 -0
  131. package/dist/core/command/agent-control.js +616 -0
  132. package/dist/core/command/cli-intent-parser.js +225 -0
  133. package/dist/core/command/command-handler.js +1638 -0
  134. package/dist/core/command/menu-handler.js +3354 -0
  135. package/dist/core/command/menu-protocol.js +247 -0
  136. package/dist/core/command/role-menu.js +1524 -0
  137. package/dist/core/command/slash-gate.js +148 -0
  138. package/dist/core/command/slash-handler.js +3056 -0
  139. package/dist/core/daemon-file-cache.js +216 -0
  140. package/dist/core/event-bus.js +32 -0
  141. package/dist/core/event-catalog.js +740 -0
  142. package/dist/core/evolagent-registry.js +546 -0
  143. package/dist/core/evolagent.js +331 -0
  144. package/dist/core/handoff/dispatcher.js +229 -0
  145. package/dist/core/handoff/mutex.js +46 -0
  146. package/dist/core/handoff/runtime.js +324 -0
  147. package/dist/core/handoff/store.js +537 -0
  148. package/dist/core/handoff/types.js +12 -0
  149. package/dist/core/inference/text-inference.js +173 -0
  150. package/dist/core/interaction-registration.js +10 -0
  151. package/dist/core/interaction-router.js +278 -0
  152. package/dist/core/message/create-status.js +67 -0
  153. package/dist/core/message/im-renderer.js +657 -0
  154. package/dist/core/message/items-formatter.js +76 -0
  155. package/dist/core/message/logical-queue-bridge.js +123 -0
  156. package/dist/core/message/message-bridge.js +803 -0
  157. package/dist/core/message/message-cache.js +56 -0
  158. package/dist/core/message/message-log.js +339 -0
  159. package/dist/core/message/message-processor.js +4 -0
  160. package/dist/core/message/message-queue.js +1436 -0
  161. package/dist/core/message/message-utils.js +70 -0
  162. package/dist/core/message/peer-mode.js +105 -0
  163. package/dist/core/message/pending-hints.js +232 -0
  164. package/dist/core/message/response-depth.js +33 -0
  165. package/dist/core/message/response-engine.js +3776 -0
  166. package/dist/core/message/response-snapshot.js +83 -0
  167. package/dist/core/message/stream-debouncer.js +130 -0
  168. package/dist/core/message/stream-idle-monitor.js +124 -0
  169. package/dist/core/model/config-scope.js +162 -0
  170. package/dist/core/model/field-scope.js +78 -0
  171. package/dist/core/model/model-catalog.js +227 -0
  172. package/dist/core/model/model-diagnostics.js +182 -0
  173. package/dist/core/model/model-permission.js +90 -0
  174. package/dist/core/permission/approval-gateway.js +1017 -0
  175. package/dist/core/permission/ec-command-parser.js +347 -0
  176. package/dist/core/permission/execution-sandbox.js +16 -0
  177. package/dist/core/permission/index.js +6 -0
  178. package/dist/core/permission/mode.js +24 -0
  179. package/dist/core/permission/sandbox-runtime.js +265 -0
  180. package/dist/core/permission/tool-policy.js +987 -0
  181. package/dist/core/permission/unix-socket-policy.js +99 -0
  182. package/dist/core/protected-paths.js +330 -0
  183. package/dist/core/relation/peer-identity.js +222 -0
  184. package/dist/core/relation/peer-key.js +1 -0
  185. package/dist/core/role/runtime-policy.js +141 -0
  186. package/dist/core/session/adapters/claude-session-file-adapter.js +218 -0
  187. package/dist/core/session/adapters/codex-session-file-adapter.js +333 -0
  188. package/dist/core/session/adapters/gemini-session-file-adapter.js +181 -0
  189. package/dist/core/session/session-file-adapter.js +7 -0
  190. package/dist/core/session/session-file-health.js +45 -0
  191. package/dist/core/session/session-fs-store.js +232 -0
  192. package/dist/core/session/session-key.js +24 -0
  193. package/dist/core/session/session-manager.js +1587 -0
  194. package/dist/core/session/session-mapper.js +100 -0
  195. package/dist/core/session/session-renew.js +314 -0
  196. package/dist/core/session/session-title.js +128 -0
  197. package/dist/core/session/session-turn-coordinator.js +205 -0
  198. package/dist/core/session/session-turns.js +67 -0
  199. package/dist/core/system-channels.js +29 -0
  200. package/dist/eck/baseagent-caps.js +18 -0
  201. package/dist/eck/detect.js +47 -0
  202. package/dist/eck/group-rules-sync.js +345 -0
  203. package/dist/eck/init.js +77 -0
  204. package/dist/eck/kit-renderer.js +359 -0
  205. package/dist/eck/manifest-engine.js +446 -0
  206. package/dist/eck/message-renderer.js +199 -0
  207. package/dist/eck/rules-loader.js +28 -0
  208. package/dist/index.js +2870 -4
  209. package/dist/ipc.js +748 -0
  210. package/dist/paths.js +262 -0
  211. package/dist/product.js +18 -0
  212. package/dist/response-system/context-builder.js +71 -0
  213. package/dist/response-system/coordinator.js +117 -0
  214. package/dist/response-system/decision-executor.js +86 -0
  215. package/dist/response-system/engines/v1/index.js +21 -0
  216. package/dist/response-system/engines/v1/interactive-flow.js +27 -0
  217. package/dist/response-system/engines/v1/proactive-flow.js +137 -0
  218. package/dist/response-system/engines/v1/types.js +1 -0
  219. package/dist/response-system/extensions.js +41 -0
  220. package/dist/response-system/index.js +6 -0
  221. package/dist/response-system/modes/index.js +7 -0
  222. package/dist/response-system/modes/single-session/index.js +72 -0
  223. package/dist/response-system/queues/fifo-queue.js +44 -0
  224. package/dist/response-system/queues/index.js +6 -0
  225. package/dist/response-system/queues/lifo-queue.js +42 -0
  226. package/dist/response-system/queues/priority-queue.js +63 -0
  227. package/dist/response-system/registry.js +97 -0
  228. package/dist/response-system/resolver.js +37 -0
  229. package/dist/response-system/selector.js +23 -0
  230. package/dist/response-system/types.js +7 -0
  231. package/dist/stats/billing.js +151 -0
  232. package/dist/stats/budget.js +93 -0
  233. package/dist/stats/db.js +403 -0
  234. package/dist/stats/eck-vars.js +89 -0
  235. package/dist/stats/index.js +11 -0
  236. package/dist/stats/normalizer.js +80 -0
  237. package/dist/stats/price-resolver.js +138 -0
  238. package/dist/stats/query.js +763 -0
  239. package/dist/stats/role-budget.js +168 -0
  240. package/dist/stats/writer.js +151 -0
  241. package/dist/trigger/anomaly-store.js +258 -0
  242. package/dist/trigger/audit.js +152 -0
  243. package/dist/trigger/event-source.js +119 -0
  244. package/dist/trigger/feedback.js +685 -0
  245. package/dist/trigger/history.js +290 -0
  246. package/dist/trigger/manager.js +291 -0
  247. package/dist/trigger/parser.js +520 -0
  248. package/dist/trigger/patch.js +148 -0
  249. package/dist/trigger/scheduler.js +1600 -0
  250. package/dist/trigger/script-executor.js +155 -0
  251. package/dist/trigger/state.js +145 -0
  252. package/dist/trigger/types.js +1 -0
  253. package/dist/trigger/validation.js +621 -0
  254. package/dist/types.js +12 -0
  255. package/dist/utils/aid-bind.js +299 -0
  256. package/dist/utils/atomic-write.js +95 -0
  257. package/dist/utils/avatar-upload.js +123 -0
  258. package/dist/utils/cross-platform.js +297 -0
  259. package/dist/utils/ecweb-utils.js +73 -0
  260. package/dist/utils/error-dict.json +153 -0
  261. package/dist/utils/error-utils.js +349 -0
  262. package/dist/utils/instance-registry.js +437 -0
  263. package/dist/utils/locale.js +21 -0
  264. package/dist/utils/log-writer.js +224 -0
  265. package/dist/utils/logger.js +89 -0
  266. package/dist/utils/markdown-to-plain-text.js +20 -0
  267. package/dist/utils/media-cache.js +271 -0
  268. package/dist/utils/model-prices.jsonl +17 -0
  269. package/dist/utils/npm-ops.js +210 -0
  270. package/dist/utils/process-introspect.js +133 -0
  271. package/dist/utils/process-tree-stats.js +271 -0
  272. package/dist/utils/project-path.js +74 -0
  273. package/dist/utils/stats.js +410 -0
  274. package/dist/utils/tool-summary.js +284 -0
  275. package/dist/utils/welcome.js +268 -0
  276. package/kits/docs/GUIDE.md +20 -0
  277. package/kits/docs/INDEX.md +65 -0
  278. package/kits/docs/aun/CHEATSHEET.md +19 -0
  279. package/kits/docs/aun/SYNC_PROTOCOL.md +15 -0
  280. package/kits/docs/channels/aun.md +65 -0
  281. package/kits/docs/channels/feishu.md +56 -0
  282. package/kits/docs/context-assembly.md +366 -0
  283. package/kits/docs/eck_templates/GUIDE.template.md +22 -0
  284. package/kits/docs/eck_templates/INDEX.template.md +28 -0
  285. package/kits/docs/eck_templates/path-registry.template.md +33 -0
  286. package/kits/docs/eck_templates/runtime.template.md +19 -0
  287. package/kits/docs/evolcore/INDEX.md +66 -0
  288. package/kits/docs/evolcore/agent.md +69 -0
  289. package/kits/docs/evolcore/aid.md +49 -0
  290. package/kits/docs/evolcore/config.md +149 -0
  291. package/kits/docs/evolcore/ctl.md +46 -0
  292. package/kits/docs/evolcore/event.md +216 -0
  293. package/kits/docs/evolcore/fs-architecture.md +1215 -0
  294. package/kits/docs/evolcore/fs.md +101 -0
  295. package/kits/docs/evolcore/group-fs.md +17 -0
  296. package/kits/docs/evolcore/group-rules.md +226 -0
  297. package/kits/docs/evolcore/group.md +141 -0
  298. package/kits/docs/evolcore/model.md +47 -0
  299. package/kits/docs/evolcore/msg.md +130 -0
  300. package/kits/docs/evolcore/response.md +80 -0
  301. package/kits/docs/evolcore/rpc.md +35 -0
  302. package/kits/docs/evolcore/self-summary.md +29 -0
  303. package/kits/docs/evolcore/stats.md +70 -0
  304. package/kits/docs/evolcore/storage.md +49 -0
  305. package/kits/docs/evolcore/trigger.md +524 -0
  306. package/kits/docs/identity/AID_PROFILE_SPEC.md +26 -0
  307. package/kits/docs/identity/PATH_OPS.md +16 -0
  308. package/kits/docs/identity/ROLE_DETAIL.md +23 -0
  309. package/kits/docs/identity/identity-tools.md +26 -0
  310. package/kits/docs/path-registry.md +43 -0
  311. package/kits/docs/prompt-loading-architecture.md +266 -0
  312. package/kits/docs/venues/aun-group.md +45 -0
  313. package/kits/docs/venues/aun-private.md +10 -0
  314. package/kits/docs/venues/client-desktop.md +10 -0
  315. package/kits/docs/venues/client-mobile.md +10 -0
  316. package/kits/docs/venues/feishu-group.md +13 -0
  317. package/kits/docs/venues/feishu-private.md +9 -0
  318. package/kits/docs/venues/group.md +25 -0
  319. package/kits/docs/venues/private.md +10 -0
  320. package/kits/eck_manifest.auxiliary.json +43 -0
  321. package/kits/eck_manifest.json +191 -0
  322. package/kits/eck_message_manifest.json +63 -0
  323. package/kits/migrations/README-role-config-v4.md +32 -0
  324. package/kits/migrations/migrate-role-config-v4.mjs +623 -0
  325. package/kits/migrations/migrate-role-config-v5.mjs +346 -0
  326. package/kits/migrations/rename-config-file.mjs +99 -0
  327. package/kits/rules/01-overview.md +142 -0
  328. package/kits/rules/02-navigation.md +76 -0
  329. package/kits/rules/03-identity.md +34 -0
  330. package/kits/rules/04-relation.md +59 -0
  331. package/kits/rules/05-venue.md +44 -0
  332. package/kits/rules/06-channel.md +59 -0
  333. package/kits/schemas/_meta.json +29 -0
  334. package/kits/schemas/agent-config.schema.1.json +177 -0
  335. package/kits/schemas/agent-config.schema.2.json +239 -0
  336. package/kits/schemas/agent-config.schema.3.json +119 -0
  337. package/kits/schemas/agent-config.schema.4.json +208 -0
  338. package/kits/schemas/agent-config.schema.5.json +326 -0
  339. package/kits/schemas/contact-book.schema.1.json +36 -0
  340. package/kits/schemas/daemon.schema.1.json +90 -0
  341. package/kits/schemas/defaults.schema.1.json +81 -0
  342. package/kits/schemas/menu-exec-schema-commands.md +208 -0
  343. package/kits/schemas/migrations/README.md +28 -0
  344. package/kits/schemas/relation-config.schema.1.json +158 -0
  345. package/kits/schemas/relation-config.schema.2.json +73 -0
  346. package/kits/schemas/relation-config.schema.3.json +50 -0
  347. package/kits/schemas/relation-config.schema.4.json +47 -0
  348. package/kits/schemas/role-config.schema.1.json +200 -0
  349. package/kits/schemas/role-registry.schema.1.json +35 -0
  350. package/kits/schemas/single-session.schema.1.json +31 -0
  351. package/kits/templates/bootstrap-welcome.md +15 -0
  352. package/kits/templates/message-fragments/handoff-request-to-target.md +13 -0
  353. package/kits/templates/message-fragments/handoff-response-to-origin.md +10 -0
  354. package/kits/templates/message-fragments/inject-default.md +2 -0
  355. package/kits/templates/message-fragments/item.md +2 -0
  356. package/kits/templates/roles/admin.json +8 -0
  357. package/kits/templates/roles/member.json +40 -0
  358. package/kits/templates/roles/owner.json +8 -0
  359. package/kits/templates/roles/visitor.json +39 -0
  360. package/kits/templates/system-fragments/baseagent.md +14 -0
  361. package/kits/templates/system-fragments/bootstrap.md +16 -0
  362. package/kits/templates/system-fragments/channel.md +48 -0
  363. package/kits/templates/system-fragments/commands.md +26 -0
  364. package/kits/templates/system-fragments/identity.md +11 -0
  365. package/kits/templates/system-fragments/relation.md +19 -0
  366. package/kits/templates/system-fragments/session.md +53 -0
  367. package/kits/templates/system-fragments/venue.md +31 -0
  368. package/package.json +50 -15
  369. package/dist/index.d.ts +0 -7
  370. package/dist/index.d.ts.map +0 -1
  371. package/dist/index.js.map +0 -1
package/dist/paths.js ADDED
@@ -0,0 +1,262 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import os from 'os';
4
+ import crypto from 'crypto';
5
+ import { DAEMON_CONFIG_FILENAME, DEFAULT_RUNTIME_HOME_DIRNAME, INSTANCE_SOCKET_FILENAME, RUNTIME_HOME_ENV, WINDOWS_PIPE_PREFIX, } from './product.js';
6
+ const isWindows = process.platform === 'win32';
7
+ let _root = null;
8
+ export function resolveRoot() {
9
+ if (_root)
10
+ return _root;
11
+ if (process.env[RUNTIME_HOME_ENV]) {
12
+ _root = process.env[RUNTIME_HOME_ENV];
13
+ }
14
+ else if (fs.existsSync(path.join(process.cwd(), 'agents', 'defaults.json'))) {
15
+ _root = process.cwd();
16
+ }
17
+ else {
18
+ _root = path.join(os.homedir(), DEFAULT_RUNTIME_HOME_DIRNAME);
19
+ }
20
+ return _root;
21
+ }
22
+ /** 重置缓存(仅供测试使用) */
23
+ export function _resetRoot() {
24
+ _root = null;
25
+ }
26
+ export function resolvePaths() {
27
+ const root = resolveRoot();
28
+ return {
29
+ root,
30
+ sessionsDir: path.join(root, 'data', 'sessions'),
31
+ instanceDir: path.join(root, 'data', 'instance'),
32
+ outboxDir: path.join(root, 'data', 'outbox'),
33
+ dataDir: path.join(root, 'data'),
34
+ claudeModelCache: path.join(root, 'data', 'claude-model-cache.json'),
35
+ logs: path.join(root, 'logs'),
36
+ agentsDir: path.join(root, 'agents'),
37
+ lineStats: path.join(root, 'logs', 'line-stats.log'),
38
+ readySignal: path.join(root, 'data', 'instance', 'ready.signal'),
39
+ controlToken: path.join(root, 'data', 'instance', 'control.token'),
40
+ selfHealLog: path.join(root, 'logs', 'self-heal.md'),
41
+ socket: resolveInstanceSocketPath(root),
42
+ // ── daemon/process 配置与 ECK ─────────────────────────────
43
+ defaultsConfig: path.join(root, 'agents', 'defaults.json'),
44
+ daemonConfig: path.join(root, DAEMON_CONFIG_FILENAME),
45
+ eckDir: path.join(root, 'eck'),
46
+ instanceReadySignal: path.join(root, 'data', 'instance', 'ready.signal'),
47
+ instanceSocket: resolveInstanceSocketPath(root),
48
+ aidLogsDir: path.join(root, 'logs', 'aids'),
49
+ // ── 配置快照体系(config-system-design-v2.md §八/§九)──────
50
+ configBackupsDir: path.join(root, 'backups', 'config'),
51
+ configCurrentPointer: path.join(root, 'backups', 'config', 'current.json'),
52
+ configWVersion: path.join(root, 'backups', 'config', 'w-version.json'),
53
+ configBootLog: path.join(root, 'backups', 'config', 'boot-log.jsonl'),
54
+ configBootLogArchiveDir: path.join(root, 'backups', 'config', 'boot-log-archive'),
55
+ };
56
+ }
57
+ // per-agent relation 路径
58
+ export function agentRelationConfig(aid, peerKey) {
59
+ return path.join(resolveRoot(), 'agents', aid, 'relations', peerKey, 'config.json');
60
+ }
61
+ // ── AID 路径(agent.md 存放在 $EVOLCORE_HOME/AIDs/<aid>/)──
62
+ /**
63
+ * AUN SDK 数据根路径(密钥/证书/AgentMDs 等)。
64
+ * 与 evolcore 数据共用 $EVOLCORE_HOME 根,避免散落到 ~/.aun。
65
+ * 启动时 SDK 通过 aun_path 选项指向这里;agent.md 子目录通过 setAgentMdPath(aidsDir()) 单独设置。
66
+ */
67
+ export function aunPath() {
68
+ return resolveRoot();
69
+ }
70
+ export function aidsDir() {
71
+ return path.join(resolveRoot(), 'AIDs');
72
+ }
73
+ export function aidLocalDir(aid) {
74
+ return path.join(resolveRoot(), 'AIDs', aid);
75
+ }
76
+ export function agentMdPath(aid) {
77
+ return path.join(resolveRoot(), 'AIDs', aid, 'agent.md');
78
+ }
79
+ // ── per-agent 路径(参数化,不进 resolvePaths() 的固定 map)──
80
+ export function agentDir(aid) {
81
+ return path.join(resolveRoot(), 'agents', aid);
82
+ }
83
+ export function agentConfig(aid) {
84
+ return path.join(agentDir(aid), 'config.json');
85
+ }
86
+ export function agentContactConfig(aid) {
87
+ return path.join(agentDir(aid), 'contact.json');
88
+ }
89
+ export function agentPersonalDir(aid) {
90
+ return path.join(agentDir(aid), 'personal');
91
+ }
92
+ export function agentRolesDir(aid) {
93
+ return path.join(agentDir(aid), 'roles');
94
+ }
95
+ export function agentRolesIndex(aid) {
96
+ return path.join(agentRolesDir(aid), 'index.json');
97
+ }
98
+ export function agentRoleConfig(aid, roleId) {
99
+ return path.join(agentRolesDir(aid), `${roleId}.json`);
100
+ }
101
+ export function agentRelationsDir(aid) {
102
+ return path.join(agentDir(aid), 'relations');
103
+ }
104
+ /** @deprecated Use agentRelationsDir instead */
105
+ export function agentIdentitiesDir(aid) {
106
+ return agentRelationsDir(aid);
107
+ }
108
+ export function agentIndexDir(aid) {
109
+ return path.join(agentDir(aid), 'index');
110
+ }
111
+ export function agentVenuesDir(aid) {
112
+ return path.join(agentDir(aid), 'venues');
113
+ }
114
+ export function agentSessionsDir(aid) {
115
+ return path.join(agentDir(aid), 'sessions');
116
+ }
117
+ export function agentLogsDir(aid) {
118
+ return path.join(agentDir(aid), 'logs');
119
+ }
120
+ export function agentDataDir(aid) {
121
+ return path.join(agentDir(aid), 'data');
122
+ }
123
+ export function agentDataCacheDir(aid) {
124
+ return path.join(agentDataDir(aid), 'cache');
125
+ }
126
+ export function agentTriggersDir(aid) {
127
+ return path.join(resolveRoot(), 'data', 'triggers', aid);
128
+ }
129
+ function resolveInstanceSocketPath(root) {
130
+ if (isWindows) {
131
+ const hash = crypto.createHash('sha1').update(root).digest('hex').slice(0, 12);
132
+ return `\\\\.\\pipe\\${WINDOWS_PIPE_PREFIX}-${hash}`;
133
+ }
134
+ return path.join(root, 'data', 'instance', INSTANCE_SOCKET_FILENAME);
135
+ }
136
+ export function ensureDataDirs() {
137
+ const p = resolvePaths();
138
+ fs.mkdirSync(p.dataDir, { recursive: true });
139
+ fs.mkdirSync(p.logs, { recursive: true });
140
+ fs.mkdirSync(p.aidLogsDir, { recursive: true });
141
+ fs.mkdirSync(p.agentsDir, { recursive: true });
142
+ fs.mkdirSync(p.sessionsDir, { recursive: true });
143
+ fs.mkdirSync(p.instanceDir, { recursive: true });
144
+ fs.mkdirSync(p.outboxDir, { recursive: true });
145
+ fs.mkdirSync(p.eckDir, { recursive: true });
146
+ fs.mkdirSync(aidsDir(), { recursive: true });
147
+ seedConfigTemplates();
148
+ migrateFromAun();
149
+ }
150
+ const MIGRATION_MARKER = '.migrated-from-aun';
151
+ /**
152
+ * 一次性迁移:把 ~/.aun 下的 SDK 数据搬到 $EVOLCORE_HOME 下。
153
+ * 通过标记文件判断是否已迁移,完成后写入标记,后续版本可删除此函数。
154
+ */
155
+ function migrateFromAun() {
156
+ const newRoot = resolveRoot();
157
+ const markerPath = path.join(newRoot, MIGRATION_MARKER);
158
+ if (fs.existsSync(markerPath))
159
+ return;
160
+ const oldRoot = path.join(os.homedir(), '.aun');
161
+ if (!fs.existsSync(oldRoot) || oldRoot === newRoot) {
162
+ try {
163
+ fs.writeFileSync(markerPath, new Date().toISOString(), 'utf-8');
164
+ }
165
+ catch { }
166
+ return;
167
+ }
168
+ const copyFileIfMissing = (src, dst) => {
169
+ if (!fs.existsSync(src) || fs.existsSync(dst))
170
+ return;
171
+ fs.mkdirSync(path.dirname(dst), { recursive: true });
172
+ fs.copyFileSync(src, dst);
173
+ };
174
+ const copyDirIfMissing = (src, dst) => {
175
+ if (!fs.existsSync(src))
176
+ return;
177
+ if (!fs.statSync(src).isDirectory())
178
+ return;
179
+ for (const entry of fs.readdirSync(src, { withFileTypes: true })) {
180
+ const s = path.join(src, entry.name);
181
+ const d = path.join(dst, entry.name);
182
+ if (entry.isDirectory()) {
183
+ copyDirIfMissing(s, d);
184
+ }
185
+ else if (entry.isFile()) {
186
+ copyFileIfMissing(s, d);
187
+ }
188
+ }
189
+ };
190
+ try {
191
+ const oldAids = path.join(oldRoot, 'AIDs');
192
+ const newAids = aidsDir();
193
+ if (fs.existsSync(oldAids)) {
194
+ for (const entry of fs.readdirSync(oldAids, { withFileTypes: true })) {
195
+ if (!entry.isDirectory())
196
+ continue;
197
+ copyDirIfMissing(path.join(oldAids, entry.name), path.join(newAids, entry.name));
198
+ }
199
+ }
200
+ copyDirIfMissing(path.join(oldRoot, 'CA'), path.join(newRoot, 'CA'));
201
+ for (const f of ['.seed', '.device_id']) {
202
+ copyFileIfMissing(path.join(oldRoot, f), path.join(newRoot, f));
203
+ }
204
+ }
205
+ catch { /* best-effort */ }
206
+ try {
207
+ fs.writeFileSync(markerPath, new Date().toISOString(), 'utf-8');
208
+ }
209
+ catch { }
210
+ }
211
+ /**
212
+ * 首次运行时从 assets/ 模板拷贝 .env 到 $EVOLCORE_HOME。
213
+ * 已存在则跳过,不覆盖用户修改。
214
+ */
215
+ function seedConfigTemplates() {
216
+ const root = resolveRoot();
217
+ const assetsDir = path.join(getPackageRoot(), 'assets');
218
+ const templates = [
219
+ { src: '.env.template', dst: '.env' },
220
+ ];
221
+ for (const { src, dst } of templates) {
222
+ const dstPath = path.join(root, dst);
223
+ if (fs.existsSync(dstPath))
224
+ continue;
225
+ const srcPath = path.join(assetsDir, src);
226
+ if (!fs.existsSync(srcPath))
227
+ continue;
228
+ try {
229
+ fs.copyFileSync(srcPath, dstPath);
230
+ }
231
+ catch { /* best-effort */ }
232
+ }
233
+ }
234
+ // ── kits 路径(始终从包内读取,不复制到 EVOLCORE_HOME)──
235
+ export function kitsDir() {
236
+ return path.join(getPackageRoot(), 'kits');
237
+ }
238
+ export function kitsRulesDir() {
239
+ return path.join(getPackageRoot(), 'kits', 'rules');
240
+ }
241
+ export function kitsDocsDir() {
242
+ return path.join(getPackageRoot(), 'kits', 'docs');
243
+ }
244
+ export function kitsTemplatesDir() {
245
+ return path.join(getPackageRoot(), 'kits', 'templates');
246
+ }
247
+ export function kitsRoleTemplatesDir() {
248
+ return path.join(kitsTemplatesDir(), 'roles');
249
+ }
250
+ export function kitsSchemasDir() {
251
+ return path.join(getPackageRoot(), 'kits', 'schemas');
252
+ }
253
+ // ── Role System ──
254
+ // ── 调试输出 ──
255
+ export function eckDebugDir() {
256
+ return path.join(resolveRoot(), 'data', 'eck-debug');
257
+ }
258
+ export function getPackageRoot() {
259
+ // import.meta.dirname is available in Node.js 21.2+ and always returns
260
+ // the correct OS-native path, regardless of Git Bash or MSYS2 environment.
261
+ return path.resolve(import.meta.dirname, '..');
262
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Product/runtime naming boundary.
3
+ *
4
+ * Keep externally visible names here so the final EvolCore cutover is a
5
+ * deliberate constant flip instead of another repository-wide hunt.
6
+ */
7
+ export const PRODUCT_DISPLAY_NAME = 'EvolCore';
8
+ export const MAIN_PACKAGE_NAME = 'evolcore';
9
+ export const MAIN_CLI_BIN = 'ec';
10
+ export const WEB_PACKAGE_NAME = 'ec-web';
11
+ export const WEB_CLI_BIN = 'ec-web';
12
+ export const WEB_PACKAGE_LATEST = `${WEB_PACKAGE_NAME}@latest`;
13
+ export const DAEMON_CONFIG_FILENAME = 'daemon.json';
14
+ export const DAEMON_SCHEMA_NAME = 'daemon';
15
+ export const RUNTIME_HOME_ENV = 'EVOLCORE_HOME';
16
+ export const DEFAULT_RUNTIME_HOME_DIRNAME = '.evolcore';
17
+ export const INSTANCE_SOCKET_FILENAME = 'daemon.sock';
18
+ export const WINDOWS_PIPE_PREFIX = 'daemon';
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Response Mode Context Builder
3
+ *
4
+ * 构造 ResponseModeContext —— 响应模式的依赖注入容器。
5
+ *
6
+ * 设计:
7
+ * - 核心依赖(session/config/channel/logger/sessionState/dataDir)进入 initialize 时即就绪
8
+ * - 扩展能力(createAuxiliarySession 等)是懒创建工厂,简单模式从不触碰
9
+ * - 缓存 per-(sessionId, modeId) 的 sessionState,使同会话同模式跨消息保持状态
10
+ *
11
+ * Phase 3 范围:核心字段就绪。辅助会话/线索/工作流工厂在对应内置模式
12
+ * (Phase 6)真正需要时接入 Runner,当前提供明确的"未实现"占位,避免空壳代码。
13
+ */
14
+ import path from 'path';
15
+ import fs from 'fs';
16
+ export class ResponseModeContextBuilder {
17
+ /** (sessionId::modeId) → sessionState,跨消息保持 */
18
+ stateCache = new Map();
19
+ /**
20
+ * 构造响应模式上下文。
21
+ * @param modeId 模式 id(用于派生 dataDir 与 sessionState 缓存键)
22
+ */
23
+ build(modeId, deps) {
24
+ const sessionState = this.getOrCreateState(deps.session.id, modeId);
25
+ const dataDir = this.ensureDataDir(deps.agentDir, modeId);
26
+ return {
27
+ session: deps.session,
28
+ agentConfig: deps.agentConfig,
29
+ modeConfig: deps.modeConfig,
30
+ runner: deps.runner,
31
+ channel: deps.channel,
32
+ logger: deps.logger,
33
+ sessionState,
34
+ dataDir,
35
+ // ─── 扩展能力工厂(懒创建) ───
36
+ createAuxiliarySession: async (_options) => {
37
+ throw new Error('[ContextBuilder] createAuxiliarySession not yet implemented (Phase 6: dual-session)');
38
+ },
39
+ // createThreadManager / createWorkflowEngine 为可选方法,
40
+ // 未实现的模式不会调用;需要时在 Phase 6 接入。
41
+ };
42
+ }
43
+ /** 清理会话状态(会话结束或切换模式时调用) */
44
+ clearState(sessionId, modeId) {
45
+ if (modeId) {
46
+ this.stateCache.delete(`${sessionId}::${modeId}`);
47
+ }
48
+ else {
49
+ // 清理该会话的所有模式状态
50
+ for (const key of [...this.stateCache.keys()]) {
51
+ if (key.startsWith(`${sessionId}::`))
52
+ this.stateCache.delete(key);
53
+ }
54
+ }
55
+ }
56
+ // ─── 内部辅助 ───
57
+ getOrCreateState(sessionId, modeId) {
58
+ const key = `${sessionId}::${modeId}`;
59
+ let state = this.stateCache.get(key);
60
+ if (!state) {
61
+ state = new Map();
62
+ this.stateCache.set(key, state);
63
+ }
64
+ return state;
65
+ }
66
+ ensureDataDir(agentDir, modeId) {
67
+ const dir = path.join(agentDir, 'response-system', modeId);
68
+ fs.mkdirSync(dir, { recursive: true });
69
+ return dir;
70
+ }
71
+ }
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Response Mode Coordinator
3
+ *
4
+ * 响应模式系统接入消息流的中枢。把 Registry/Resolver/ContextBuilder 串起来,
5
+ * 为 message-processor 提供两个能力:
6
+ * - resolveInbound:解析会话该用哪个模式 + 运行 handleInbound 得到决策(含 runtimeState)
7
+ * - resolveOutbound:对某个出站 payload 运行 handleOutbound 得到发送决策
8
+ *
9
+ * 设计原则:
10
+ * - 选模式:标量 responseMode(关系级>agent级,合并后)> 注册表首选(single-session)
11
+ * - chatMode 与选模式正交:由顶层 chatmode 字典按对端类型解析后注入 modeConfig
12
+ * - 模式特有参数:从 responseModeParams[modeId] 桶读取
13
+ * - 响应模式成为「响应决策的源头」,下游 message-processor 的执行流程原样保留
14
+ * - 异常不降级(D6):解析/决策失败时回落到安全默认,记 WARN
15
+ */
16
+ import { ResponseModeResolver } from './resolver.js';
17
+ import { ResponseModeContextBuilder } from './context-builder.js';
18
+ /**
19
+ * 从模式的 configSchema 提取特有参数出厂默认值:`properties[key].default`。
20
+ *
21
+ * 模式 schema 是模式特有参数「候选值 + 默认值」的唯一事实源(architecture §五)。
22
+ * 宿主组装 modeConfig 时先铺这层默认,再叠用户显式配置——默认来源收敛到 schema,
23
+ * flow 不再硬编码 `?? true` 之类的默认。chatMode 无 default(宿主强制注入),跳过。
24
+ */
25
+ function schemaDefaults(mode) {
26
+ const props = mode.configSchema?.properties;
27
+ if (!props)
28
+ return {};
29
+ const out = {};
30
+ for (const [key, spec] of Object.entries(props)) {
31
+ if (spec && typeof spec === 'object' && 'default' in spec)
32
+ out[key] = spec.default;
33
+ }
34
+ return out;
35
+ }
36
+ export class ResponseModeCoordinator {
37
+ registry;
38
+ resolver;
39
+ contextBuilder = new ResponseModeContextBuilder();
40
+ constructor(registry) {
41
+ this.registry = registry;
42
+ this.resolver = new ResponseModeResolver(registry);
43
+ }
44
+ /**
45
+ * 解析会话该用哪个响应模式 + 构建 context(不调 handleInbound)。
46
+ * 用于消息处理阶段(_processMessageInternal):此时消息已出队,
47
+ * 需要的是处理钩子(beforeProcess/configureRun/onToolUse 等),而非入队决策。
48
+ *
49
+ * @param responseModeId 合并后的标量 responseMode(关系级>agent级,可空 → 注册表首选)
50
+ * @param resolvedChatMode 本会话生效的 chatmode(宿主按配置层级解析后传入),
51
+ * 注入进模式 config.chatmode;模式据此分流投递方式。与「选哪个模式」无关。
52
+ * @param responseModeParams 按模式分桶的参数字典 { [modeId]: {...} },取当前模式的桶注入
53
+ * @param contextDeps 构建 context 所需依赖
54
+ */
55
+ resolveMode(responseModeId, resolvedChatMode, responseModeParams, contextDeps) {
56
+ try {
57
+ const resolved = this.resolver.resolve(responseModeId);
58
+ const mode = resolved.mode;
59
+ // 模式特有参数:先铺 schema 出厂默认,再叠用户显式桶(responseModeParams[modeId],显式值优先);
60
+ // chatmode 由宿主解析后强制注入(小写,与配置层 chatmode 字典一致)。
61
+ const modeSpecificParams = responseModeParams?.[mode.id] ?? {};
62
+ const modeConfig = { ...schemaDefaults(mode), chatmode: resolvedChatMode, ...modeSpecificParams };
63
+ contextDeps.logger.debug('[ResponseSystem] resolveMode mode=' + mode.id + ' source=' + resolved.source + ' chatmode=' + (modeConfig.chatmode ?? 'none'));
64
+ const context = this.contextBuilder.build(mode.id, { ...contextDeps, modeConfig });
65
+ return { mode, context, source: resolved.source };
66
+ }
67
+ catch (e) {
68
+ contextDeps.logger.warn(`[Coordinator] resolveMode failed: ${e instanceof Error ? e.message : String(e)}`);
69
+ return null;
70
+ }
71
+ }
72
+ /**
73
+ * 解析会话的入站响应模式 + 运行 handleInbound。
74
+ *
75
+ * @param message 入站消息
76
+ * @param resolvedChatMode 本会话生效的 chatMode(宿主解析后传入)
77
+ */
78
+ async resolveInbound(message, deps, resolvedChatMode) {
79
+ try {
80
+ // 解析模式:标量 responseMode(合并后)> 注册表首选。chatMode 不参与选模式。
81
+ const resolved = this.resolver.resolve(deps.agentConfig.responseMode);
82
+ const mode = resolved.mode;
83
+ // 先铺 schema 出厂默认,再叠用户显式桶(显式值优先),chatmode 强制注入。
84
+ const modeSpecificParams = deps.agentConfig.responseModeParams?.[mode.id] ?? {};
85
+ const modeConfig = { ...schemaDefaults(mode), chatmode: resolvedChatMode, ...modeSpecificParams };
86
+ deps.contextDeps.logger.debug('[ResponseSystem] resolveInbound mode=' + mode.id + ' source=' + resolved.source + ' chatmode=' + (modeConfig.chatmode ?? 'none'));
87
+ const context = this.contextBuilder.build(mode.id, {
88
+ ...deps.contextDeps,
89
+ modeConfig,
90
+ });
91
+ await mode.initialize(context);
92
+ const decision = await mode.handleInbound(message);
93
+ return { modeId: mode.id, decision, mode, context };
94
+ }
95
+ catch (e) {
96
+ deps.contextDeps.logger.warn(`[Coordinator] resolveInbound failed: ${e instanceof Error ? e.message : String(e)}`);
97
+ return null;
98
+ }
99
+ }
100
+ /**
101
+ * 对某个出站 payload 运行 handleOutbound。
102
+ * 失败时返回 direct(安全默认:照常发送,不静默吞消息)。
103
+ */
104
+ async resolveOutbound(resolved, payload) {
105
+ try {
106
+ return await resolved.mode.handleOutbound(payload);
107
+ }
108
+ catch (e) {
109
+ resolved.context.logger.warn(`[Coordinator] resolveOutbound failed for kind='${payload.kind}', defaulting to direct: ${e instanceof Error ? e.message : String(e)}`);
110
+ return { method: 'direct', type: 'message' };
111
+ }
112
+ }
113
+ /** 暴露 registry(供 CLI/Menu 查询) */
114
+ getRegistry() {
115
+ return this.registry;
116
+ }
117
+ }
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Decision Executor
3
+ *
4
+ * 执行响应模式返回的决策对象(InboundDecision / OutboundDecision)。
5
+ *
6
+ * 设计:决策与执行分离
7
+ * - 响应模式只做决策(返回 Decision 对象,纯函数、易测试)
8
+ * - DecisionExecutor 负责执行(操作队列、发送消息、切换模型)
9
+ *
10
+ * 副作用通过 ExecutorSinks 接口注入,便于单测 mock。
11
+ *
12
+ * 异常处理(D6):不降级。执行中任何异常都记录日志、上报,由调用方决定后续。
13
+ */
14
+ export class DecisionExecutor {
15
+ sinks;
16
+ logger;
17
+ constructor(sinks, logger) {
18
+ this.sinks = sinks;
19
+ this.logger = logger;
20
+ }
21
+ /**
22
+ * 执行入站决策。
23
+ * @returns 是否实际入队(drop/defer 返回 false)
24
+ */
25
+ async executeInbound(decision, message, context) {
26
+ // 逃生舱优先
27
+ if (decision.customHandler) {
28
+ await decision.customHandler(message, context);
29
+ return false; // customHandler 自行处理,不走标准入队
30
+ }
31
+ if (decision.action === 'drop') {
32
+ this.logger.debug(`[Executor] inbound dropped: ${decision.reason ?? 'no reason'}`);
33
+ return false;
34
+ }
35
+ if (decision.action === 'defer') {
36
+ this.logger.debug(`[Executor] inbound deferred: ${decision.reason ?? 'no reason'}`);
37
+ return false;
38
+ }
39
+ // action === 'process':先执行附加指令,再入队
40
+ if (decision.instructions?.switchModel) {
41
+ await this.sinks.switchModel(decision.instructions.switchModel);
42
+ }
43
+ if (decision.instructions?.injectContext?.length) {
44
+ await this.sinks.injectContext(decision.instructions.injectContext);
45
+ }
46
+ if (decision.instructions?.interruptCurrent) {
47
+ await this.sinks.interrupt();
48
+ }
49
+ const behavior = decision.queueBehavior ?? 'enqueue';
50
+ if (behavior === 'clear-and-enqueue') {
51
+ await this.sinks.clearQueue();
52
+ await this.sinks.enqueue(message, 'enqueue');
53
+ }
54
+ else {
55
+ await this.sinks.enqueue(message, behavior);
56
+ }
57
+ return true;
58
+ }
59
+ /**
60
+ * 执行出站决策。
61
+ * @returns 是否实际发送(suppress/defer/batch 返回 false)
62
+ */
63
+ async executeOutbound(decision, payload, context) {
64
+ // 逃生舱优先
65
+ if (decision.customSender) {
66
+ await decision.customSender(payload, context);
67
+ return true;
68
+ }
69
+ switch (decision.method) {
70
+ case 'direct':
71
+ await this.sinks.send(payload, decision.type ?? 'message');
72
+ return true;
73
+ case 'suppress':
74
+ this.logger.debug(`[Executor] outbound suppressed: ${decision.reason ?? 'no reason'}`);
75
+ return false;
76
+ case 'defer':
77
+ case 'batch':
78
+ // defer/batch 由响应模式自行决定何时调 send,此处不发
79
+ this.logger.debug(`[Executor] outbound ${decision.method}: held by mode`);
80
+ return false;
81
+ default:
82
+ this.logger.warn(`[Executor] unknown outbound method: ${decision.method}`);
83
+ return false;
84
+ }
85
+ }
86
+ }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * V1 引擎 —— 单会话处理行为的载体。
3
+ *
4
+ * 对外只暴露 flowForChatMode:按 chatMode 取对应流(interactive / proactive)。
5
+ * chatMode 分流收拢于此,模式层(modes/single-session)与调用方不再散布分支。
6
+ */
7
+ import { interactiveFlow } from './interactive-flow.js';
8
+ import { proactiveFlow } from './proactive-flow.js';
9
+ const FLOWS = {
10
+ interactive: interactiveFlow,
11
+ proactive: proactiveFlow,
12
+ };
13
+ /** 按 chatMode 取处理流。 */
14
+ export function flowForChatMode(chatMode) {
15
+ const flow = FLOWS[chatMode];
16
+ if (!flow)
17
+ throw new Error(`[V1Engine] unknown chatMode: ${chatMode}`);
18
+ return flow;
19
+ }
20
+ export { interactiveFlow } from './interactive-flow.js';
21
+ export { proactiveFlow } from './proactive-flow.js';
@@ -0,0 +1,27 @@
1
+ /**
2
+ * V1 引擎 —— 交互流(interactive)
3
+ *
4
+ * 行为自合并前的 modes/interactive(InteractiveMode)下沉,语义不变:
5
+ * 输出即回复,所有消息立即处理;Runner 返回后扫描文本中的文件标记
6
+ * ([SEND_FILE:...]),实际发送由引擎能力 ctx.processFileMarkers 完成。
7
+ *
8
+ * flow 是无状态单例:不持有 context,全部依赖由调用点显式传入。
9
+ */
10
+ export const interactiveFlow = {
11
+ chatMode: 'interactive',
12
+ handleInbound(message, ctx) {
13
+ ctx.logger.debug('[V1Engine] interactive inbound chatType=' + message.chatType + ' peerId=' + message.peerId);
14
+ return { action: 'process', queueBehavior: 'enqueue' };
15
+ },
16
+ handleOutbound(payload, ctx) {
17
+ ctx.logger.debug('[V1Engine] interactive outbound kind=' + (payload.kind ?? 'unknown'));
18
+ return { method: 'direct', type: 'message' };
19
+ },
20
+ /**
21
+ * Runner 返回后:处理文本中的文件标记([SEND_FILE:...])。
22
+ * interactive 特有——proactive 改用 ctl file 工具,不走标记。
23
+ */
24
+ async afterProcess(ctx) {
25
+ await ctx.processFileMarkers(ctx.fullText);
26
+ },
27
+ };