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
@@ -0,0 +1,302 @@
1
+ import fs from 'fs';
2
+ import { resolvePaths } from '../paths.js';
3
+ import { ipcQuery } from '../ipc.js';
4
+ import { HANDOFF_QUERY_DEFAULT_LIMIT, HANDOFF_QUERY_MAX_LIMIT, HANDOFF_STATES } from '../core/handoff/types.js';
5
+ import { HANDOFF_ID_RE } from '../core/handoff/store.js';
6
+ import { isHelpFlag } from './help.js';
7
+ import { AGENT_DELEGATION_TOKEN_ENV } from '../core/auth/agent-delegation.js';
8
+ function parseLimit(value) {
9
+ const limit = Number(value);
10
+ if (!value || !Number.isInteger(limit) || limit < 1 || limit > HANDOFF_QUERY_MAX_LIMIT) {
11
+ throw new Error('INVALID_HANDOFF_LIMIT');
12
+ }
13
+ return limit;
14
+ }
15
+ export function parseList(args) {
16
+ const parsed = { limit: HANDOFF_QUERY_DEFAULT_LIMIT };
17
+ for (let index = 0; index < args.length; index++) {
18
+ const arg = args[index];
19
+ const value = args[index + 1];
20
+ if (arg === '--state') {
21
+ if (!value || !HANDOFF_STATES.includes(value))
22
+ throw new Error('INVALID_HANDOFF_STATE');
23
+ parsed.state = value;
24
+ index++;
25
+ }
26
+ else if (arg === '--session') {
27
+ if (!value)
28
+ throw new Error('HANDOFF_SESSION_REQUIRED');
29
+ parsed.sessionId = value;
30
+ index++;
31
+ }
32
+ else if (arg === '--agent') {
33
+ if (!value)
34
+ throw new Error('HANDOFF_AGENT_REQUIRED');
35
+ parsed.agent = value;
36
+ index++;
37
+ }
38
+ else if (arg === '--limit') {
39
+ parsed.limit = parseLimit(value);
40
+ index++;
41
+ }
42
+ else {
43
+ throw new Error(`UNKNOWN_HANDOFF_OPTION:${arg}`);
44
+ }
45
+ }
46
+ return parsed;
47
+ }
48
+ export function parseTrace(args) {
49
+ const handoffId = args[0];
50
+ if (!handoffId || !HANDOFF_ID_RE.test(handoffId))
51
+ throw new Error('INVALID_HANDOFF_ID');
52
+ const parsed = { handoffId, limit: HANDOFF_QUERY_DEFAULT_LIMIT };
53
+ for (let index = 1; index < args.length; index++) {
54
+ const arg = args[index];
55
+ const value = args[index + 1];
56
+ if (arg === '--agent') {
57
+ if (!value)
58
+ throw new Error('HANDOFF_AGENT_REQUIRED');
59
+ parsed.agent = value;
60
+ index++;
61
+ }
62
+ else if (arg === '--limit') {
63
+ parsed.limit = parseLimit(value);
64
+ index++;
65
+ }
66
+ else {
67
+ throw new Error(`UNKNOWN_HANDOFF_OPTION:${arg}`);
68
+ }
69
+ }
70
+ return parsed;
71
+ }
72
+ export function parseReturn(args) {
73
+ const dash = args.indexOf('--');
74
+ if (dash >= 0) {
75
+ const beforeDash = args.slice(0, dash);
76
+ const first = beforeDash[0];
77
+ if (first?.startsWith('h-') && !HANDOFF_ID_RE.test(first))
78
+ throw new Error(`INVALID_HANDOFF_ID:${first}`);
79
+ const handoffId = first && HANDOFF_ID_RE.test(first) ? first : undefined;
80
+ if (beforeDash.length > (handoffId ? 1 : 0))
81
+ throw new Error('HANDOFF_CONTENT_DELIMITER_CONFLICT');
82
+ return { handoffId, content: args.slice(dash + 1).join(' ') };
83
+ }
84
+ const fileIndex = args.indexOf('--text-from-file');
85
+ const filePath = fileIndex >= 0 ? args[fileIndex + 1] : undefined;
86
+ if (fileIndex >= 0 && !filePath)
87
+ throw new Error('HANDOFF_CONTENT_FILE_READ_FAILED');
88
+ const positional = args.filter((_, index) => fileIndex < 0 || (index !== fileIndex && index !== fileIndex + 1));
89
+ const first = positional[0];
90
+ if (first?.startsWith('h-') && !HANDOFF_ID_RE.test(first))
91
+ throw new Error(`INVALID_HANDOFF_ID:${first}`);
92
+ const handoffId = first && HANDOFF_ID_RE.test(first) ? first : undefined;
93
+ const contentArgs = handoffId ? positional.slice(1) : positional;
94
+ if (filePath && contentArgs.length > 0)
95
+ throw new Error('HANDOFF_CONTENT_FILE_CONFLICT');
96
+ if (filePath) {
97
+ try {
98
+ return { handoffId, content: fs.readFileSync(filePath, 'utf8') };
99
+ }
100
+ catch {
101
+ throw new Error('HANDOFF_CONTENT_FILE_READ_FAILED');
102
+ }
103
+ }
104
+ return { handoffId, content: contentArgs.join(' ') };
105
+ }
106
+ function printReturn(result) {
107
+ if (result.ok) {
108
+ if (result.code === 'HANDOFF_RETURN_ALREADY_APPLIED') {
109
+ console.log(`✓ handoff ${result.handoff_id} 已接收过相同结果,未重复处理`);
110
+ }
111
+ else if (result.state === 'completed') {
112
+ console.log(`✓ handoff ${result.handoff_id} 已确认完成,不回流来源会话`);
113
+ }
114
+ else {
115
+ console.log(`✓ handoff ${result.handoff_id} 回流结果已接收`);
116
+ }
117
+ return;
118
+ }
119
+ switch (result.code) {
120
+ case 'HANDOFF_RETURN_CONTENT_REQUIRED':
121
+ console.error(`✗ handoff ${result.handoff_id ?? ''} 必须提供非空回流内容`.trim());
122
+ break;
123
+ case 'HANDOFF_RETURN_CONTENT_FORBIDDEN':
124
+ console.error(`✗ handoff ${result.handoff_id ?? ''} 的策略为 none,不能提供回流内容`.trim());
125
+ break;
126
+ case 'HANDOFF_NOT_RETURNABLE':
127
+ console.error(`✗ handoff ${result.handoff_id ?? ''} 当前不可 return`.trim());
128
+ break;
129
+ case 'HANDOFF_ID_REQUIRED':
130
+ console.error('✗ 当前任务没有可自动选择的 handoff,请指定 ID');
131
+ break;
132
+ case 'HANDOFF_TARGET_SESSION_MISMATCH':
133
+ console.error(`✗ handoff ${result.handoff_id ?? ''} 不能从当前会话处理`.trim());
134
+ break;
135
+ case 'HANDOFF_RETURN_CONFLICT':
136
+ console.error(`✗ handoff ${result.handoff_id ?? ''} 已接收过不同结果,本次未覆盖`.trim());
137
+ break;
138
+ case 'HANDOFF_NOT_FOUND':
139
+ console.error(`✗ handoff 不存在:${result.handoff_id ?? ''}`.trim());
140
+ break;
141
+ default:
142
+ console.error(`✗ ${result.error}`);
143
+ }
144
+ process.exitCode = 1;
145
+ }
146
+ function printQueryError(result) {
147
+ console.error(`✗ ${result.error}`);
148
+ process.exitCode = 1;
149
+ }
150
+ function formatTimestamp(value) {
151
+ return new Date(value).toISOString();
152
+ }
153
+ export async function cmdHandoff(args) {
154
+ const sub = args[0];
155
+ if (!sub || isHelpFlag(sub)) {
156
+ console.log(`用法: ec handoff <command> [args]
157
+
158
+ Commands:
159
+ return [handoff-id] [content] 确认完成;required 策略需提供回流内容
160
+ return [handoff-id] --text-from-file <path>
161
+ status <handoff-id> 查询 handoff 状态
162
+ list [--state <state>] [--session <id>] [--limit <n>] [--agent <aid>]
163
+ trace <handoff-id> [--limit <n>] [--agent <aid>]`);
164
+ return;
165
+ }
166
+ if (sub === 'return') {
167
+ let parsed;
168
+ try {
169
+ parsed = parseReturn(args.slice(1));
170
+ }
171
+ catch (error) {
172
+ const message = error instanceof Error ? error.message : String(error);
173
+ if (message.startsWith('INVALID_HANDOFF_ID:'))
174
+ console.error(`✗ handoff ID 格式无效:${message.slice(message.indexOf(':') + 1)}`);
175
+ else if (message === 'HANDOFF_CONTENT_FILE_READ_FAILED')
176
+ console.error('✗ 无法读取回流内容文件');
177
+ else
178
+ console.error('✗ --text-from-file 不能与位置正文同时使用');
179
+ process.exitCode = 1;
180
+ return;
181
+ }
182
+ const result = await ipcQuery(resolvePaths().socket, {
183
+ type: 'handoff-return',
184
+ sessionId: process.env.EVOLCORE_SESSION_ID,
185
+ handoffId: parsed.handoffId,
186
+ content: parsed.content,
187
+ delegationToken: process.env[AGENT_DELEGATION_TOKEN_ENV],
188
+ }, 5000);
189
+ if (!result) {
190
+ console.error('✗ daemon 暂时不可用');
191
+ process.exitCode = 1;
192
+ return;
193
+ }
194
+ printReturn(result);
195
+ return;
196
+ }
197
+ if (sub === 'status') {
198
+ const handoffId = args[1];
199
+ if (!handoffId || !HANDOFF_ID_RE.test(handoffId)) {
200
+ console.error(`✗ handoff ID 格式无效:${handoffId ?? ''}`);
201
+ process.exitCode = 1;
202
+ return;
203
+ }
204
+ const result = await ipcQuery(resolvePaths().socket, {
205
+ type: 'handoff-status', sessionId: process.env.EVOLCORE_SESSION_ID, handoffId,
206
+ }, 5000);
207
+ if (!result) {
208
+ console.error('✗ daemon 暂时不可用');
209
+ process.exitCode = 1;
210
+ return;
211
+ }
212
+ if (result.ok === false) {
213
+ console.error(`✗ ${result.error}`);
214
+ process.exitCode = 1;
215
+ return;
216
+ }
217
+ console.log(`handoff ${result.handoff_id}: ${result.state}${result.attention_required ? ` (attention: ${result.attention_reason})` : ''}`);
218
+ return;
219
+ }
220
+ if (sub === 'list') {
221
+ let parsed;
222
+ try {
223
+ parsed = parseList(args.slice(1));
224
+ }
225
+ catch (error) {
226
+ console.error(`✗ ${error instanceof Error ? error.message : String(error)}`);
227
+ process.exitCode = 1;
228
+ return;
229
+ }
230
+ const result = await ipcQuery(resolvePaths().socket, {
231
+ type: 'handoff-list',
232
+ sessionId: process.env.EVOLCORE_SESSION_ID,
233
+ agent: parsed.agent,
234
+ state: parsed.state,
235
+ filterSessionId: parsed.sessionId,
236
+ limit: parsed.limit,
237
+ }, 5000);
238
+ if (!result) {
239
+ console.error('✗ daemon 暂时不可用');
240
+ process.exitCode = 1;
241
+ return;
242
+ }
243
+ if (!result.ok)
244
+ return printQueryError(result);
245
+ if (result.handoffs.length === 0) {
246
+ console.log('没有匹配的 handoff');
247
+ return;
248
+ }
249
+ console.log('ID\tSTATE\tORIGIN\tTARGET\tUPDATED\tATTENTION');
250
+ for (const item of result.handoffs) {
251
+ console.log([
252
+ item.handoff_id,
253
+ item.state,
254
+ item.origin_session_id,
255
+ item.target_session_id,
256
+ formatTimestamp(item.updated_at),
257
+ item.attention_reason ?? '-',
258
+ ].join('\t'));
259
+ }
260
+ return;
261
+ }
262
+ if (sub === 'trace') {
263
+ let parsed;
264
+ try {
265
+ parsed = parseTrace(args.slice(1));
266
+ }
267
+ catch (error) {
268
+ console.error(`✗ ${error instanceof Error ? error.message : String(error)}`);
269
+ process.exitCode = 1;
270
+ return;
271
+ }
272
+ const result = await ipcQuery(resolvePaths().socket, {
273
+ type: 'handoff-trace',
274
+ sessionId: process.env.EVOLCORE_SESSION_ID,
275
+ agent: parsed.agent,
276
+ handoffId: parsed.handoffId,
277
+ limit: parsed.limit,
278
+ }, 5000);
279
+ if (!result) {
280
+ console.error('✗ daemon 暂时不可用');
281
+ process.exitCode = 1;
282
+ return;
283
+ }
284
+ if (!result.ok)
285
+ return printQueryError(result);
286
+ for (const event of result.events) {
287
+ const version = event.from_version === undefined && event.to_version === undefined
288
+ ? '-'
289
+ : `${event.from_version ?? '-'}->${event.to_version ?? '-'}`;
290
+ console.log([
291
+ formatTimestamp(event.created_at),
292
+ event.event_type,
293
+ version,
294
+ event.operation_key ?? '-',
295
+ event.details ? JSON.stringify(event.details) : '-',
296
+ ].join('\t'));
297
+ }
298
+ return;
299
+ }
300
+ console.error(`未知 handoff 子命令: ${sub}`);
301
+ process.exitCode = 1;
302
+ }
@@ -0,0 +1,31 @@
1
+ /**
2
+ * CLI help 检测 helper。
3
+ *
4
+ * 把 7 种历史写法统一为两个语义清晰的函数:
5
+ * - isHelpFlag(token):单 token 是否是 help 标记('help' / '--help' / '-h')
6
+ * - wantsHelp(args):args 任意位置出现 help 标记
7
+ *
8
+ * 两套 API 服务于不同语义:
9
+ * - 顶层路由(如 cmdAid 看到第一个 token 是子命令名时)必须用 isHelpFlag(sub),
10
+ * 否则 `ec aid delete --help` 会被顶层吞掉,永远到不了 delete 自己的 help。
11
+ * - 单层命令(如 cmdLinkRules、cmdAid 的具体 sub 处理块内)用 wantsHelp(args)
12
+ * 更宽松,任意位置都识别。
13
+ */
14
+ const HELP_TOKENS = new Set(['help', '--help', '-h']);
15
+ export function isHelpFlag(token) {
16
+ return token !== undefined && HELP_TOKENS.has(token);
17
+ }
18
+ export function wantsHelp(args) {
19
+ for (const a of args)
20
+ if (HELP_TOKENS.has(a))
21
+ return true;
22
+ return false;
23
+ }
24
+ /**
25
+ * 取出 `--flag <value>` 形式的参数值。
26
+ * flag 不存在或其后无值时返回 undefined。
27
+ */
28
+ export function getArgValue(args, flag) {
29
+ const idx = args.indexOf(flag);
30
+ return idx !== -1 && idx + 1 < args.length ? args[idx + 1] : undefined;
31
+ }
@@ -0,0 +1,358 @@
1
+ #!/usr/bin/env node
2
+ // Suppress AUN SDK logs BEFORE any imports (SDK may initialize during module load)
3
+ process.env.AUN_LOG_INI_DISABLE = '1';
4
+ import fs from 'fs';
5
+ import path from 'path';
6
+ import { resolvePaths, getPackageRoot } from '../paths.js';
7
+ import { cmdInit } from './init.js';
8
+ import { cmdInitWechat, cmdInitFeishu, cmdInitDingtalk, cmdInitQQBot, cmdInitWecom, cmdInitAun } from './init-channel.js';
9
+ import { isHelpFlag, getArgValue } from './help.js';
10
+ import * as platform from '../utils/cross-platform.js';
11
+ import { cmdRestartMonitor } from './restart-monitor.js';
12
+ import { cmdAid, cmdRpc, cmdStorage, cmdMsg, cmdGroup } from './aun-commands.js';
13
+ import { cmdAgent } from './agent-command.js';
14
+ import { cmdCtl } from './ctl-command.js';
15
+ import { cmdQueue } from './queue-command.js';
16
+ import { cmdStart, cmdStop, cmdRestart, cmdStatus, cmdLogs, cmdWatchCommand, cmdDev, cmdMv, cmdDiagnose } from './daemon-commands.js';
17
+ import { logCliCommand } from './command-log.js';
18
+ // Suppress Node.js ExperimentalWarning (e.g. SQLite) from cluttering CLI output
19
+ process.removeAllListeners('warning');
20
+ process.on('warning', (w) => { if (w.name === 'ExperimentalWarning')
21
+ return; process.stderr.write((w.stack ?? String(w)) + '\n'); });
22
+ export async function main(args) {
23
+ const cmd = args[0] || 'start';
24
+ logCliCommand(cmd, args);
25
+ if (cmd === '--version' || cmd === '-v' || cmd === '-V') {
26
+ const pkg = JSON.parse(fs.readFileSync(path.join(getPackageRoot(), 'package.json'), 'utf-8'));
27
+ console.log(pkg.version);
28
+ return;
29
+ }
30
+ switch (cmd) {
31
+ case 'init':
32
+ if (isHelpFlag(args[1])) {
33
+ console.log(`用法: ec init [渠道] [选项]
34
+
35
+ 仅初始化 defaults.json:
36
+ ec init 交互式(写完 defaults.json 后嵌套 agent new)
37
+ ec init --non-interactive [选项]
38
+ --baseagent <claude|codex|gemini> 默认: PATH 中第一个可用项
39
+ --force 已存在 defaults.json 时覆盖
40
+
41
+ 云部署非交互式初始化(结构化 JSON 输出):
42
+ ec init --non-interactive --owner <aid> [--format json] [选项]
43
+ --owner <aid> 必填。唯一 daemon owner AID
44
+ --baseagent <claude|codex|gemini> 可选。默认从 PATH 检测
45
+ --projectpath <abs-path> 可选。默认项目目录(必须绝对路径,自动创建)
46
+ --ecweb 可选。启用 ECWeb 自启动
47
+ --format json 可选但推荐。stdout 输出 init.result JSON
48
+ --force 已有不同 owner 时强制覆盖
49
+
50
+ 配置渠道(先 ec agent new 创建 agent):
51
+ ec init aun AUN owner 绑定(daemon 或指定 agent)
52
+ ec init feishu 飞书扫码登录
53
+ ec init wechat 微信扫码登录
54
+ ec init dingtalk 钉钉扫码登录
55
+ ec init qqbot QQ 机器人扫码绑定
56
+ ec init wecom 企业微信 AI Bot 配置(手动输入)`);
57
+ }
58
+ else if (args[1] === 'aun') {
59
+ const { suppressSdkLogs } = await import('../aun/aid/index.js');
60
+ suppressSdkLogs();
61
+ await cmdInitAun();
62
+ }
63
+ else if (args[1] === 'wechat') {
64
+ const { suppressSdkLogs } = await import('../aun/aid/index.js');
65
+ suppressSdkLogs();
66
+ await cmdInitWechat();
67
+ }
68
+ else if (args[1] === 'feishu') {
69
+ const { suppressSdkLogs } = await import('../aun/aid/index.js');
70
+ suppressSdkLogs();
71
+ await cmdInitFeishu();
72
+ }
73
+ else if (args[1] === 'dingtalk') {
74
+ const { suppressSdkLogs } = await import('../aun/aid/index.js');
75
+ suppressSdkLogs();
76
+ await cmdInitDingtalk();
77
+ }
78
+ else if (args[1] === 'qqbot') {
79
+ const { suppressSdkLogs } = await import('../aun/aid/index.js');
80
+ suppressSdkLogs();
81
+ await cmdInitQQBot();
82
+ }
83
+ else if (args[1] === 'wecom') {
84
+ await cmdInitWecom();
85
+ }
86
+ else if (args[1] && !args[1].startsWith('-')) {
87
+ const supported = ['feishu', 'wechat', 'aun', 'dingtalk', 'qqbot', 'wecom'];
88
+ console.error(`❌ 不支持的渠道: ${args[1]}`);
89
+ console.error(` 支持的渠道: ${supported.join(', ')}`);
90
+ process.exit(1);
91
+ }
92
+ else {
93
+ const { suppressSdkLogs } = await import('../aun/aid/index.js');
94
+ suppressSdkLogs();
95
+ const nonInteractive = args.includes('--non-interactive');
96
+ await cmdInit({
97
+ nonInteractive,
98
+ baseagent: getArgValue(args, '--baseagent'),
99
+ force: args.includes('--force'),
100
+ owner: getArgValue(args, '--owner'),
101
+ projectpath: getArgValue(args, '--projectpath'),
102
+ ecweb: args.includes('--ecweb'),
103
+ format: getArgValue(args, '--format'),
104
+ });
105
+ }
106
+ break;
107
+ case 'start':
108
+ await cmdStart({
109
+ diagnose: args.includes('--diagnose') || args.includes('-d'),
110
+ foreground: args.includes('--foreground'),
111
+ });
112
+ break;
113
+ case 'stop':
114
+ await cmdStop();
115
+ break;
116
+ case 'restart':
117
+ await cmdRestart({ clear: args.includes('--clear'), diagnose: args.includes('--diagnose') || args.includes('-d') });
118
+ break;
119
+ case 'status':
120
+ await cmdStatus();
121
+ break;
122
+ case 'logs':
123
+ cmdLogs(args.slice(1));
124
+ break;
125
+ case 'watch':
126
+ await cmdWatchCommand(args.slice(1));
127
+ break;
128
+ case 'restart-monitor':
129
+ await cmdRestartMonitor();
130
+ break;
131
+ case 'dev':
132
+ await cmdDev(args.slice(1));
133
+ break;
134
+ case 'mv':
135
+ await cmdMv(args[1], args[2]);
136
+ break;
137
+ case 'diagnose':
138
+ await cmdDiagnose();
139
+ break;
140
+ case 'net': {
141
+ const { cmdNet } = await import('./net-check.js');
142
+ await cmdNet(args.slice(1));
143
+ break;
144
+ }
145
+ case 'ctl':
146
+ await cmdCtl(args.slice(1));
147
+ break;
148
+ case 'queue':
149
+ await cmdQueue(args.slice(1));
150
+ break;
151
+ case 'trigger':
152
+ {
153
+ const { cmdTrigger } = await import('./trigger-command.js');
154
+ await cmdTrigger(args.slice(1));
155
+ }
156
+ break;
157
+ case 'agent': {
158
+ const { suppressSdkLogs } = await import('../aun/aid/index.js');
159
+ suppressSdkLogs();
160
+ await cmdAgent(args.slice(1));
161
+ break;
162
+ }
163
+ case 'aid': {
164
+ const { suppressSdkLogs } = await import('../aun/aid/index.js');
165
+ suppressSdkLogs();
166
+ await cmdAid(args.slice(1));
167
+ break;
168
+ }
169
+ case 'rpc': {
170
+ const { suppressSdkLogs } = await import('../aun/aid/index.js');
171
+ suppressSdkLogs();
172
+ await cmdRpc(args.slice(1));
173
+ break;
174
+ }
175
+ case 'storage': {
176
+ const { suppressSdkLogs } = await import('../aun/aid/index.js');
177
+ suppressSdkLogs();
178
+ await cmdStorage(args.slice(1));
179
+ break;
180
+ }
181
+ case 'fs': {
182
+ const { suppressSdkLogs } = await import('../aun/aid/index.js');
183
+ suppressSdkLogs();
184
+ const { cmdFs } = await import('./fs-command.js');
185
+ await cmdFs(args.slice(1));
186
+ break;
187
+ }
188
+ case 'msg': {
189
+ const { suppressSdkLogs } = await import('../aun/aid/index.js');
190
+ suppressSdkLogs();
191
+ await cmdMsg(args.slice(1));
192
+ break;
193
+ }
194
+ case 'handoff': {
195
+ const { cmdHandoff } = await import('./handoff-command.js');
196
+ await cmdHandoff(args.slice(1));
197
+ break;
198
+ }
199
+ case 'group': {
200
+ const { suppressSdkLogs } = await import('../aun/aid/index.js');
201
+ suppressSdkLogs();
202
+ await cmdGroup(args.slice(1));
203
+ break;
204
+ }
205
+ case 'model': {
206
+ const { cmdModel } = await import('./model.js');
207
+ await cmdModel(args.slice(1));
208
+ break;
209
+ }
210
+ case 'response': {
211
+ const { cmdResponse } = await import('./response.js');
212
+ await cmdResponse(args.slice(1));
213
+ break;
214
+ }
215
+ case 'config': {
216
+ const { cmdConfig } = await import('./config.js');
217
+ await cmdConfig(args.slice(1));
218
+ break;
219
+ }
220
+ case 'stats': {
221
+ const { handleStats } = await import('./stats.js');
222
+ await handleStats(args.slice(1));
223
+ break;
224
+ }
225
+ case 'version':
226
+ case '-v':
227
+ case '--version': {
228
+ const { handleVersion } = await import('./version.js');
229
+ handleVersion(args.slice(1));
230
+ break;
231
+ }
232
+ case 'bench': {
233
+ const { suppressSdkLogs } = await import('../aun/aid/index.js');
234
+ suppressSdkLogs();
235
+ const { cmdBench } = await import('./bench.js');
236
+ await cmdBench(args.slice(1));
237
+ break;
238
+ }
239
+ case 'link-rules': {
240
+ const { cmdLinkRules } = await import('./link-rules.js');
241
+ cmdLinkRules(args.slice(1));
242
+ break;
243
+ }
244
+ default:
245
+ console.log(`Usage: ec {init|start|stop|restart|status|logs|watch|ctl|queue|trigger|handoff|diagnose|net|mv}
246
+
247
+ Commands:
248
+ init 初始化 evolcore home (${resolvePaths().defaultsConfig})
249
+ init feishu 飞书扫码登录并写入配置
250
+ init wechat 微信扫码登录并写入配置
251
+ init dingtalk 钉钉扫码登录并写入配置
252
+ init qqbot QQ 机器人扫码绑定并写入配置
253
+ init wecom 企业微信 AI Bot 配置(手动输入 Bot ID + Secret)
254
+ start 启动服务 (默认)
255
+ --foreground 前台运行,适合 systemd/Docker 直接管理进程
256
+ stop 停止服务
257
+ restart 重启服务
258
+ --clear 顺带 SIGKILL 跨 HOME 残留的 evolcore 主进程
259
+ status 查看状态
260
+ logs 查看日志 (tail -f, 着色渲染)
261
+ --level error|warn 只显示指定级别及以上
262
+ --module <name> 只显示指定模块(如 feishu、AgentRunner)
263
+ --raw 原始输出,不着色
264
+ watch 监控面板选择菜单(↑↓ 选择 log/aid/msg)
265
+ watch logs 勾选日志类型后实时监控(记忆上次选择,存入 daemon.json)
266
+ watch log <类型...> 直接监控指定类型(如 evolcore aun),不读写偏好
267
+ watch aid AID 连接状态实时监控(显示各 AID 在线/离线/重连状态)
268
+ watch msg 消息监控(三面板交互式 TUI:AID 列表 / 对端统计 / 消息流)
269
+ ctl 当前会话工具(发送消息/文件、名称、队列、路径、状态)
270
+ ec ctl help 查看完整命令列表
271
+ trigger daemon 级触发器管理(list/show/history/create/update/run)
272
+ handoff 跨会话任务回流
273
+ handoff return [id] [content] 确认当前 handoff;required 策略需提供内容
274
+ handoff list/trace 查询实例和审计事件
275
+ queue 消息队列查询与操作
276
+ queue --agent <aid> 查看 agent 的所有队列
277
+ queue --agent <aid> --clear 清空待处理消息
278
+ queue --agent <aid> --interrupt --sessionkey <key> 打断处理中任务
279
+ agent 管理 EvolAgent
280
+ agent 列出所有 agent
281
+ agent <name> 查看指定 agent 详情
282
+ agent new <name> 创建新 agent(交互式)
283
+ agent new <name> --non-interactive ... 非交互创建(自动化)
284
+ 必填: --project <absolute path>
285
+ 可选: --baseagent <claude|codex|gemini> (默认: PATH 中第一个可用)
286
+ --owner <aid>
287
+ --name <display-name>
288
+ --description <text>
289
+ --force (覆盖已有 config.json)
290
+ agent reload 全量 resync(扫磁盘,新增上线、删除下线、修改热更新)
291
+ agent reload <n> 热重载指定 agent 配置
292
+ model 模型管理(agent/关系可写,支持角色策略预览)
293
+ model list 列出可用模型并显示当前生效模型
294
+ model current 显示实际生效的模型、强度和来源
295
+ model info <id> 查看模型详情
296
+ model use <id> 设置模型(写操作需要 --self)
297
+ model effort <lv> 设置推理强度
298
+ model reset 清除当前作用域的模型和强度设置
299
+ model check 诊断网关与模型可用性
300
+ response 响应模式管理(查看/切换/配置,作用域:全局/agent/关系)
301
+ response list 列出所有响应模式
302
+ response current 显示当前作用域生效的默认模式
303
+ response info <id> 查看单个模式详情(场景/配置参数)
304
+ response set <id> 设置默认模式(--scene private/group)
305
+ response config 查看/修改模式配置参数
306
+ response reset 清除指定作用域设置
307
+ response help 查看完整用法
308
+ aid AID 身份管理
309
+ aid list 列出本地所有 AID
310
+ aid show <aid> 查看本地 AID 详情(证书有效期、私钥状态)
311
+ aid new <aid> 创建新 AID 身份
312
+ aid lookup <aid> 远程探测 AID(是否存在 + 网关 + agent.md)
313
+ aid agentmd put <aid> 签名并上传 agent.md
314
+ aid agentmd get <aid> 下载并验签 agent.md
315
+ aid delete <aid> 删除指定 AID
316
+ aid delete --orphan 清理无私钥的外部 AID 缓存
317
+ aid delete --unrecoverable 清理云端公钥已变更、不可恢复的 AID
318
+ 默认 dry-run,加 --yes 执行
319
+ fs AUN 文件系统统一入口
320
+ fs ls|stat|cat|find <AID>:/path
321
+ fs cp <src> <dst> 上传/下载/远程复制
322
+ fs mv <src> <dst> 移动/改名(同后端)
323
+ fs rm [-r] <AID>:/path
324
+ fs mkdir [-p] <AID>:/path
325
+ fs ln -s <target> <AID>:/path
326
+ fs chmod +r|o-r <AID>:/path
327
+ fs setfacl|getfacl <AID>:/path
328
+ fs token issue|revoke|ls <AID>:/path
329
+ fs df <AID>:
330
+ fs mount <target> --volume <id>|--source <src>
331
+ net 网络链路诊断
332
+ net check [<aid>] 10 步链路检测(DNS→Discovery→TCP→TLS→WSS→Auth→Ping→Echo)
333
+ net help 查看详细帮助
334
+ rpc AUN RPC 调用
335
+ rpc --as <aid> --params <json|jsonl|file>
336
+ storage 文件存储
337
+ storage upload <aid> <file> <path> [--public]
338
+ storage download <aid> <url> [local-path]
339
+ storage ls <aid> [prefix]
340
+ storage rm <aid> <path>
341
+ storage quota <aid>
342
+ diagnose 诊断启动环境(配置、数据库、进程)
343
+ mv <old> <new> 迁移项目目录(保留 Claude/Codex/EvolCore 会话)
344
+ bench AUN 消息性能基准测试
345
+ bench --aids 5 --rounds 10 --concurrency 5
346
+
347
+ Environment:
348
+ EVOLCORE_HOME 数据目录 (默认: ~/.evolcore)
349
+ LOG_LEVEL 日志级别 (默认: INFO)
350
+ MESSAGE_LOG 消息日志 (默认: true)
351
+ EVENT_LOG 事件日志 (默认: true)`);
352
+ process.exit(1);
353
+ }
354
+ }
355
+ // 直接运行时自动执行(node dist/cli/index.js ...)
356
+ if (platform.isMainScript(import.meta.url)) {
357
+ main(process.argv.slice(2));
358
+ }