evolcore 0.0.1 → 0.0.3

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 (379) hide show
  1. package/CHANGELOG.md +64 -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/bin/ec-safe-output.js +161 -0
  8. package/bin/ec.js +29 -0
  9. package/dist/agents/baseagent.js +163 -0
  10. package/dist/agents/claude-runner.js +2565 -0
  11. package/dist/agents/codex-app-server-client.js +448 -0
  12. package/dist/agents/codex-runner.js +2682 -0
  13. package/dist/agents/gemini-runner.js +666 -0
  14. package/dist/agents/runner-types.js +75 -0
  15. package/dist/aun/aid/agentmd.js +216 -0
  16. package/dist/aun/aid/client.js +132 -0
  17. package/dist/aun/aid/control-aid.js +91 -0
  18. package/dist/aun/aid/identity.js +518 -0
  19. package/dist/aun/aid/index.js +4 -0
  20. package/dist/aun/aid/store.js +74 -0
  21. package/dist/aun/aid/types.js +1 -0
  22. package/dist/aun/aid/validation.js +21 -0
  23. package/dist/aun/group-identity.js +10 -0
  24. package/dist/aun/msg/group-index.js +6 -0
  25. package/dist/aun/msg/group.js +1231 -0
  26. package/dist/aun/msg/history.js +123 -0
  27. package/dist/aun/msg/index.js +5 -0
  28. package/dist/aun/msg/p2p.js +393 -0
  29. package/dist/aun/msg/payload-type.js +27 -0
  30. package/dist/aun/msg/upload.js +137 -0
  31. package/dist/aun/outbox.js +168 -0
  32. package/dist/aun/rpc/caller.js +42 -0
  33. package/dist/aun/rpc/connection.js +25 -0
  34. package/dist/aun/rpc/index.js +2 -0
  35. package/dist/aun/service-proxy.js +225 -0
  36. package/dist/aun/storage/download.js +29 -0
  37. package/dist/aun/storage/index.js +3 -0
  38. package/dist/aun/storage/manage.js +10 -0
  39. package/dist/aun/storage/upload.js +68 -0
  40. package/dist/channels/aun.js +4164 -0
  41. package/dist/channels/contact-bind-code.js +134 -0
  42. package/dist/channels/daemon.js +422 -0
  43. package/dist/channels/dingtalk.js +1479 -0
  44. package/dist/channels/feishu.js +1865 -0
  45. package/dist/channels/qqbot.js +409 -0
  46. package/dist/channels/wechat.js +817 -0
  47. package/dist/channels/wecom-card.js +101 -0
  48. package/dist/channels/wecom-onboarding.js +82 -0
  49. package/dist/channels/wecom-state.js +191 -0
  50. package/dist/channels/wecom.js +1157 -0
  51. package/dist/cli/agent-command.js +642 -0
  52. package/dist/cli/agent.js +1059 -0
  53. package/dist/cli/aun-commands.js +2003 -0
  54. package/dist/cli/bench.js +1228 -0
  55. package/dist/cli/cli-argv.js +66 -0
  56. package/dist/cli/code-stats.js +329 -0
  57. package/dist/cli/command-log.js +82 -0
  58. package/dist/cli/config-selector.js +69 -0
  59. package/dist/cli/config.js +261 -0
  60. package/dist/cli/contact.js +71 -0
  61. package/dist/cli/ctl-command.js +62 -0
  62. package/dist/cli/daemon-commands.js +2750 -0
  63. package/dist/cli/fs-command.js +1447 -0
  64. package/dist/cli/handoff-command.js +302 -0
  65. package/dist/cli/help.js +35 -0
  66. package/dist/cli/index.js +374 -0
  67. package/dist/cli/init-channel.js +1372 -0
  68. package/dist/cli/init.js +590 -0
  69. package/dist/cli/link-rules.js +240 -0
  70. package/dist/cli/model.js +591 -0
  71. package/dist/cli/net-check.js +723 -0
  72. package/dist/cli/queue-command.js +150 -0
  73. package/dist/cli/raw-key-input.js +25 -0
  74. package/dist/cli/response.js +344 -0
  75. package/dist/cli/restart-monitor.js +480 -0
  76. package/dist/cli/stats.js +609 -0
  77. package/dist/cli/task-context.js +80 -0
  78. package/dist/cli/trigger-command.js +545 -0
  79. package/dist/cli/version.js +93 -0
  80. package/dist/cli/watch-logs.js +33 -0
  81. package/dist/cli/watch-msg.js +673 -0
  82. package/dist/config/boot-log.js +266 -0
  83. package/dist/config/builtin-role-templates.js +42 -0
  84. package/dist/config/builtin-roles.js +91 -0
  85. package/dist/config/config-batch-get.js +11 -0
  86. package/dist/config/config-field-policy.js +261 -0
  87. package/dist/config/config-manager.js +1120 -0
  88. package/dist/config/config-operation-service.js +384 -0
  89. package/dist/config/contact-alias.js +68 -0
  90. package/dist/config/contact-book-store.js +454 -0
  91. package/dist/config/contact-book-v2-startup.js +35 -0
  92. package/dist/config/contact-book.js +224 -0
  93. package/dist/config/contact-operation-service.js +110 -0
  94. package/dist/config/gateway-config.js +858 -0
  95. package/dist/config/lifecycle.js +17 -0
  96. package/dist/config/mention-mode.js +27 -0
  97. package/dist/config/merge.js +161 -0
  98. package/dist/config/owner-policy.js +4 -0
  99. package/dist/config/peer-role-resolver.js +218 -0
  100. package/dist/config/resolved-config-op.js +483 -0
  101. package/dist/config/role-config-v4-startup.js +32 -0
  102. package/dist/config/role-config-v5-startup.js +27 -0
  103. package/dist/config/role-ranks.js +18 -0
  104. package/dist/config/role-schema.js +105 -0
  105. package/dist/config/role-service.js +156 -0
  106. package/dist/config/role-store.js +215 -0
  107. package/dist/config/roles.js +64 -0
  108. package/dist/config/schema-registry.js +154 -0
  109. package/dist/config/snapshot.js +598 -0
  110. package/dist/config-store.js +501 -0
  111. package/dist/core/auth/agent-delegation.js +111 -0
  112. package/dist/core/auth/auth-gateway.js +166 -0
  113. package/dist/core/auth/authenticated-actor.js +6 -0
  114. package/dist/core/auth/authorization-audit.js +119 -0
  115. package/dist/core/auth/operation-authorizer.js +720 -0
  116. package/dist/core/auth/operation-catalog.js +731 -0
  117. package/dist/core/baseagent-loader.js +54 -0
  118. package/dist/core/bootstrap-service.js +175 -0
  119. package/dist/core/capability/capability-manager.js +316 -0
  120. package/dist/core/capability/providers/claude-capability-provider.js +176 -0
  121. package/dist/core/capability/providers/codex-capability-provider.js +148 -0
  122. package/dist/core/capability/providers/gemini-capability-provider.js +10 -0
  123. package/dist/core/capability/types.js +27 -0
  124. package/dist/core/causation/audit.js +103 -0
  125. package/dist/core/causation/aun-association.js +111 -0
  126. package/dist/core/causation/context.js +93 -0
  127. package/dist/core/causation/index.js +4 -0
  128. package/dist/core/causation/types.js +2 -0
  129. package/dist/core/channel-loader.js +277 -0
  130. package/dist/core/command/agent-control.js +616 -0
  131. package/dist/core/command/cli-intent-parser.js +225 -0
  132. package/dist/core/command/command-handler.js +1733 -0
  133. package/dist/core/command/connect-menu.js +374 -0
  134. package/dist/core/command/menu-handler.js +3452 -0
  135. package/dist/core/command/menu-protocol.js +247 -0
  136. package/dist/core/command/role-menu.js +1623 -0
  137. package/dist/core/command/slash-gate.js +148 -0
  138. package/dist/core/command/slash-handler.js +3066 -0
  139. package/dist/core/daemon-file-cache.js +222 -0
  140. package/dist/core/event-bus.js +32 -0
  141. package/dist/core/event-catalog.js +810 -0
  142. package/dist/core/evolagent-registry.js +545 -0
  143. package/dist/core/evolagent.js +342 -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 +659 -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 +874 -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 +1446 -0
  161. package/dist/core/message/message-utils.js +76 -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 +4020 -0
  166. package/dist/core/message/response-snapshot.js +83 -0
  167. package/dist/core/message/send-receipt.js +24 -0
  168. package/dist/core/message/stream-debouncer.js +139 -0
  169. package/dist/core/message/stream-idle-monitor.js +124 -0
  170. package/dist/core/model/config-scope.js +162 -0
  171. package/dist/core/model/field-scope.js +78 -0
  172. package/dist/core/model/model-catalog.js +227 -0
  173. package/dist/core/model/model-diagnostics.js +182 -0
  174. package/dist/core/model/model-permission.js +90 -0
  175. package/dist/core/permission/approval-gateway.js +1017 -0
  176. package/dist/core/permission/ec-command-parser.js +347 -0
  177. package/dist/core/permission/execution-sandbox.js +16 -0
  178. package/dist/core/permission/index.js +6 -0
  179. package/dist/core/permission/mode.js +24 -0
  180. package/dist/core/permission/sandbox-runtime.js +265 -0
  181. package/dist/core/permission/tool-policy.js +1019 -0
  182. package/dist/core/permission/unix-socket-policy.js +99 -0
  183. package/dist/core/protected-paths.js +332 -0
  184. package/dist/core/relation/peer-identity.js +222 -0
  185. package/dist/core/relation/peer-key.js +1 -0
  186. package/dist/core/role/runtime-policy.js +141 -0
  187. package/dist/core/session/adapters/claude-session-file-adapter.js +218 -0
  188. package/dist/core/session/adapters/codex-session-file-adapter.js +333 -0
  189. package/dist/core/session/adapters/gemini-session-file-adapter.js +181 -0
  190. package/dist/core/session/session-file-adapter.js +7 -0
  191. package/dist/core/session/session-file-health.js +45 -0
  192. package/dist/core/session/session-fs-store.js +273 -0
  193. package/dist/core/session/session-key.js +24 -0
  194. package/dist/core/session/session-manager.js +1643 -0
  195. package/dist/core/session/session-mapper.js +100 -0
  196. package/dist/core/session/session-renew.js +314 -0
  197. package/dist/core/session/session-title.js +128 -0
  198. package/dist/core/session/session-turn-coordinator.js +205 -0
  199. package/dist/core/session/session-turns.js +67 -0
  200. package/dist/core/system-channels.js +29 -0
  201. package/dist/eck/baseagent-caps.js +18 -0
  202. package/dist/eck/detect.js +47 -0
  203. package/dist/eck/group-rules-sync.js +345 -0
  204. package/dist/eck/init.js +77 -0
  205. package/dist/eck/kit-renderer.js +359 -0
  206. package/dist/eck/manifest-engine.js +446 -0
  207. package/dist/eck/message-renderer.js +199 -0
  208. package/dist/eck/rules-loader.js +28 -0
  209. package/dist/index.js +2926 -4
  210. package/dist/ipc.js +777 -0
  211. package/dist/paths.js +262 -0
  212. package/dist/product.js +18 -0
  213. package/dist/response-system/context-builder.js +71 -0
  214. package/dist/response-system/coordinator.js +117 -0
  215. package/dist/response-system/decision-executor.js +86 -0
  216. package/dist/response-system/engines/v1/index.js +21 -0
  217. package/dist/response-system/engines/v1/interactive-flow.js +27 -0
  218. package/dist/response-system/engines/v1/proactive-flow.js +137 -0
  219. package/dist/response-system/engines/v1/types.js +1 -0
  220. package/dist/response-system/extensions.js +41 -0
  221. package/dist/response-system/index.js +6 -0
  222. package/dist/response-system/modes/index.js +7 -0
  223. package/dist/response-system/modes/single-session/index.js +72 -0
  224. package/dist/response-system/queues/fifo-queue.js +44 -0
  225. package/dist/response-system/queues/index.js +6 -0
  226. package/dist/response-system/queues/lifo-queue.js +42 -0
  227. package/dist/response-system/queues/priority-queue.js +63 -0
  228. package/dist/response-system/registry.js +97 -0
  229. package/dist/response-system/resolver.js +37 -0
  230. package/dist/response-system/selector.js +23 -0
  231. package/dist/response-system/types.js +7 -0
  232. package/dist/stats/billing.js +163 -0
  233. package/dist/stats/budget.js +93 -0
  234. package/dist/stats/db.js +403 -0
  235. package/dist/stats/eck-vars.js +89 -0
  236. package/dist/stats/index.js +11 -0
  237. package/dist/stats/normalizer.js +80 -0
  238. package/dist/stats/price-resolver.js +138 -0
  239. package/dist/stats/query.js +763 -0
  240. package/dist/stats/role-budget.js +168 -0
  241. package/dist/stats/writer.js +151 -0
  242. package/dist/trigger/anomaly-store.js +258 -0
  243. package/dist/trigger/audit.js +152 -0
  244. package/dist/trigger/event-source.js +119 -0
  245. package/dist/trigger/feedback.js +685 -0
  246. package/dist/trigger/history.js +290 -0
  247. package/dist/trigger/manager.js +294 -0
  248. package/dist/trigger/parser.js +595 -0
  249. package/dist/trigger/patch.js +155 -0
  250. package/dist/trigger/scheduler.js +1602 -0
  251. package/dist/trigger/script-executor.js +155 -0
  252. package/dist/trigger/state.js +145 -0
  253. package/dist/trigger/types.js +1 -0
  254. package/dist/trigger/validation.js +634 -0
  255. package/dist/types.js +12 -0
  256. package/dist/utils/aid-bind.js +313 -0
  257. package/dist/utils/atomic-write.js +95 -0
  258. package/dist/utils/avatar-upload.js +123 -0
  259. package/dist/utils/cross-platform.js +297 -0
  260. package/dist/utils/ecweb-utils.js +73 -0
  261. package/dist/utils/error-dict.json +153 -0
  262. package/dist/utils/error-utils.js +349 -0
  263. package/dist/utils/instance-registry.js +444 -0
  264. package/dist/utils/locale.js +21 -0
  265. package/dist/utils/log-writer.js +270 -0
  266. package/dist/utils/logger.js +89 -0
  267. package/dist/utils/markdown-to-plain-text.js +20 -0
  268. package/dist/utils/media-cache.js +274 -0
  269. package/dist/utils/model-prices.jsonl +20 -0
  270. package/dist/utils/npm-ops.js +210 -0
  271. package/dist/utils/process-introspect.js +133 -0
  272. package/dist/utils/process-tree-stats.js +271 -0
  273. package/dist/utils/project-path.js +74 -0
  274. package/dist/utils/restart-safety.js +31 -0
  275. package/dist/utils/stats.js +410 -0
  276. package/dist/utils/system-memory.js +62 -0
  277. package/dist/utils/tool-summary.js +284 -0
  278. package/dist/utils/welcome.js +268 -0
  279. package/kits/docs/GUIDE.md +20 -0
  280. package/kits/docs/INDEX.md +66 -0
  281. package/kits/docs/aun/CHEATSHEET.md +19 -0
  282. package/kits/docs/aun/SYNC_PROTOCOL.md +15 -0
  283. package/kits/docs/channels/aun.md +65 -0
  284. package/kits/docs/channels/feishu.md +56 -0
  285. package/kits/docs/context-assembly.md +366 -0
  286. package/kits/docs/eck_templates/GUIDE.template.md +22 -0
  287. package/kits/docs/eck_templates/INDEX.template.md +28 -0
  288. package/kits/docs/eck_templates/path-registry.template.md +33 -0
  289. package/kits/docs/eck_templates/runtime.template.md +19 -0
  290. package/kits/docs/evolcore/INDEX.md +68 -0
  291. package/kits/docs/evolcore/agent.md +77 -0
  292. package/kits/docs/evolcore/aid.md +52 -0
  293. package/kits/docs/evolcore/config.md +149 -0
  294. package/kits/docs/evolcore/contact.md +57 -0
  295. package/kits/docs/evolcore/ctl.md +46 -0
  296. package/kits/docs/evolcore/event.md +216 -0
  297. package/kits/docs/evolcore/fs-architecture.md +1215 -0
  298. package/kits/docs/evolcore/fs.md +110 -0
  299. package/kits/docs/evolcore/group-fs.md +17 -0
  300. package/kits/docs/evolcore/group-rules.md +226 -0
  301. package/kits/docs/evolcore/group.md +150 -0
  302. package/kits/docs/evolcore/model.md +50 -0
  303. package/kits/docs/evolcore/msg.md +136 -0
  304. package/kits/docs/evolcore/response.md +75 -0
  305. package/kits/docs/evolcore/rpc.md +37 -0
  306. package/kits/docs/evolcore/self-summary.md +29 -0
  307. package/kits/docs/evolcore/stats.md +83 -0
  308. package/kits/docs/evolcore/storage.md +50 -0
  309. package/kits/docs/evolcore/trigger.md +539 -0
  310. package/kits/docs/identity/AID_PROFILE_SPEC.md +26 -0
  311. package/kits/docs/identity/PATH_OPS.md +16 -0
  312. package/kits/docs/identity/ROLE_DETAIL.md +23 -0
  313. package/kits/docs/identity/identity-tools.md +26 -0
  314. package/kits/docs/path-registry.md +43 -0
  315. package/kits/docs/prompt-loading-architecture.md +266 -0
  316. package/kits/docs/venues/aun-group.md +45 -0
  317. package/kits/docs/venues/aun-private.md +10 -0
  318. package/kits/docs/venues/client-desktop.md +10 -0
  319. package/kits/docs/venues/client-mobile.md +10 -0
  320. package/kits/docs/venues/feishu-group.md +13 -0
  321. package/kits/docs/venues/feishu-private.md +9 -0
  322. package/kits/docs/venues/group.md +25 -0
  323. package/kits/docs/venues/private.md +10 -0
  324. package/kits/eck_manifest.auxiliary.json +43 -0
  325. package/kits/eck_manifest.json +203 -0
  326. package/kits/eck_message_manifest.json +63 -0
  327. package/kits/migrations/README-role-config-v4.md +32 -0
  328. package/kits/migrations/migrate-contact-book-v2.mjs +747 -0
  329. package/kits/migrations/migrate-role-config-v4.mjs +623 -0
  330. package/kits/migrations/migrate-role-config-v5.mjs +346 -0
  331. package/kits/migrations/rename-config-file.mjs +99 -0
  332. package/kits/rules/01-overview.md +142 -0
  333. package/kits/rules/02-navigation.md +76 -0
  334. package/kits/rules/03-identity.md +34 -0
  335. package/kits/rules/04-relation.md +59 -0
  336. package/kits/rules/05-venue.md +44 -0
  337. package/kits/rules/06-channel.md +59 -0
  338. package/kits/schemas/_meta.json +32 -0
  339. package/kits/schemas/agent-config.schema.1.json +177 -0
  340. package/kits/schemas/agent-config.schema.2.json +239 -0
  341. package/kits/schemas/agent-config.schema.3.json +119 -0
  342. package/kits/schemas/agent-config.schema.4.json +208 -0
  343. package/kits/schemas/agent-config.schema.5.json +326 -0
  344. package/kits/schemas/agent-config.schema.6.json +322 -0
  345. package/kits/schemas/contact-book.schema.1.json +36 -0
  346. package/kits/schemas/contact-book.schema.2.json +43 -0
  347. package/kits/schemas/daemon.schema.1.json +90 -0
  348. package/kits/schemas/defaults.schema.1.json +81 -0
  349. package/kits/schemas/menu-exec-schema-commands.md +208 -0
  350. package/kits/schemas/migrations/README.md +28 -0
  351. package/kits/schemas/relation-config.schema.1.json +158 -0
  352. package/kits/schemas/relation-config.schema.2.json +73 -0
  353. package/kits/schemas/relation-config.schema.3.json +50 -0
  354. package/kits/schemas/relation-config.schema.4.json +47 -0
  355. package/kits/schemas/relation-config.schema.5.json +47 -0
  356. package/kits/schemas/role-config.schema.1.json +201 -0
  357. package/kits/schemas/role-registry.schema.1.json +35 -0
  358. package/kits/schemas/single-session.schema.1.json +31 -0
  359. package/kits/templates/bootstrap-welcome.md +15 -0
  360. package/kits/templates/message-fragments/handoff-request-to-target.md +13 -0
  361. package/kits/templates/message-fragments/handoff-response-to-origin.md +10 -0
  362. package/kits/templates/message-fragments/inject-default.md +2 -0
  363. package/kits/templates/message-fragments/item.md +2 -0
  364. package/kits/templates/roles/admin.json +9 -0
  365. package/kits/templates/roles/member.json +41 -0
  366. package/kits/templates/roles/owner.json +9 -0
  367. package/kits/templates/roles/visitor.json +40 -0
  368. package/kits/templates/system-fragments/baseagent.md +14 -0
  369. package/kits/templates/system-fragments/bootstrap.md +16 -0
  370. package/kits/templates/system-fragments/channel.md +48 -0
  371. package/kits/templates/system-fragments/commands.md +28 -0
  372. package/kits/templates/system-fragments/identity.md +11 -0
  373. package/kits/templates/system-fragments/relation.md +19 -0
  374. package/kits/templates/system-fragments/session.md +53 -0
  375. package/kits/templates/system-fragments/venue.md +31 -0
  376. package/package.json +50 -15
  377. package/dist/index.d.ts +0 -7
  378. package/dist/index.d.ts.map +0 -1
  379. package/dist/index.js.map +0 -1
@@ -0,0 +1,349 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import { getPackageRoot, resolvePaths } from '../paths.js';
4
+ import { logger } from './logger.js';
5
+ export var ErrorType;
6
+ (function (ErrorType) {
7
+ ErrorType["SDK_TIMEOUT"] = "sdk_timeout";
8
+ ErrorType["API_ERROR"] = "api_error";
9
+ ErrorType["AUTH_ERROR"] = "auth_error";
10
+ ErrorType["FILE_CORRUPT"] = "file_corrupt";
11
+ ErrorType["STREAM_ERROR"] = "stream_error";
12
+ ErrorType["CONTEXT_TOO_LONG"] = "context_too_long";
13
+ ErrorType["MODEL_UNAVAILABLE"] = "model_unavailable";
14
+ ErrorType["UNKNOWN"] = "unknown";
15
+ })(ErrorType || (ErrorType = {}));
16
+ /**
17
+ * 错误来源前缀 — 区分基础设施异常 vs Agent 任务失败
18
+ *
19
+ * infra: 基础设施级(SDK 崩溃、API 不可用、文件损坏)— 应累计安全模式
20
+ * agent: Agent 任务级(权限拒绝、max turns、工具失败)— 仅统计,不累计安全模式
21
+ */
22
+ export const ERROR_PREFIX = {
23
+ INFRA: 'infra',
24
+ AGENT: 'agent',
25
+ };
26
+ /**
27
+ * 判断 Agent complete.subtype 是否属于系统级故障(应累计安全模式)
28
+ *
29
+ * 非系统级(用户操作或任务边界):
30
+ * - end_turn / max_turns: Agent 正常结束或达到轮次上限
31
+ * - permission_denied: 用户主动拒绝权限
32
+ * - stop: 用户主动停止
33
+ *
34
+ * 系统级(SDK/模型/平台故障):
35
+ * - error_model / error_tool_use / error_api 等:基础设施异常
36
+ * - 未知 subtype:保守地视为系统级
37
+ *
38
+ * terminalReason 提供更精确的判断(SDK 0.2.100+):
39
+ * - rapid_refill_breaker: API 限流,不是代码问题
40
+ * - tool_deferred: 工具延迟,不是错误
41
+ * - stop_hook_prevented: Stop hook 阻止,不是错误
42
+ * - aborted_streaming / aborted_tools: 中断,已有中断处理逻辑
43
+ */
44
+ const NON_INFRA_SUBTYPES = new Set([
45
+ 'end_turn',
46
+ 'max_turns',
47
+ 'permission_denied',
48
+ 'stop',
49
+ ]);
50
+ const NON_INFRA_TERMINAL_REASONS = new Set([
51
+ 'rapid_refill_breaker',
52
+ 'tool_deferred',
53
+ 'stop_hook_prevented',
54
+ 'aborted_streaming',
55
+ 'aborted_tools',
56
+ ]);
57
+ export function isInfraError(subtype, terminalReason) {
58
+ // terminalReason 优先级更高(更精确)
59
+ if (terminalReason && NON_INFRA_TERMINAL_REASONS.has(terminalReason)) {
60
+ return false;
61
+ }
62
+ if (!subtype)
63
+ return true; // 未知 subtype,保守视为系统级
64
+ return !NON_INFRA_SUBTYPES.has(subtype);
65
+ }
66
+ /** 为 errorType 添加来源前缀 */
67
+ export function prefixErrorType(prefix, errorType) {
68
+ return `${prefix}:${errorType}`;
69
+ }
70
+ // ── 错误字典 ──────────────────────────────────────────────────────────
71
+ const VALID_ACTIONS = new Set(['retry', 'stop', 'ignore']);
72
+ let _dictPath = null;
73
+ let _dictPathExplicit = false;
74
+ let _rules = [];
75
+ let _lastMtime = 0;
76
+ function getDictPath() {
77
+ if (!_dictPath) {
78
+ _dictPath = resolveBestDictPath();
79
+ _dictPathExplicit = false;
80
+ }
81
+ return _dictPath;
82
+ }
83
+ function resolveBestDictPath(excludePath) {
84
+ const candidates = [
85
+ path.join(resolvePaths().dataDir, 'error-dict.json'),
86
+ // Bundled default: 与本文件同目录(src/utils/ 或 dist/utils/)
87
+ path.resolve(import.meta.dirname, 'error-dict.json'),
88
+ // Dev-mode fallback: dist may be rebuilt while the daemon is running.
89
+ path.join(getPackageRoot(), 'src', 'utils', 'error-dict.json'),
90
+ ];
91
+ const seen = new Set();
92
+ const normalizedExclude = excludePath ? path.resolve(excludePath) : undefined;
93
+ for (const candidate of candidates) {
94
+ const normalized = path.resolve(candidate);
95
+ if (seen.has(normalized) || normalized === normalizedExclude)
96
+ continue;
97
+ seen.add(normalized);
98
+ if (fs.existsSync(normalized))
99
+ return normalized;
100
+ }
101
+ return path.resolve(candidates[1]);
102
+ }
103
+ /** 校验单条规则,返回错误原因(null = 合法) */
104
+ function validateRule(r, index) {
105
+ if (!r || typeof r !== 'object')
106
+ return `rules[${index}]: 不是对象`;
107
+ if (!r.id || typeof r.id !== 'string')
108
+ return `rules[${index}]: 缺少 id 或类型不是 string`;
109
+ if (!r.match || typeof r.match !== 'string')
110
+ return `rules[${index}] (${r.id}): 缺少 match 或类型不是 string`;
111
+ if (!VALID_ACTIONS.has(r.action))
112
+ return `rules[${index}] (${r.id}): action 无效 "${r.action}",允许值: retry/stop/ignore`;
113
+ if (r.type !== undefined && typeof r.type !== 'string')
114
+ return `rules[${index}] (${r.id}): type 类型不是 string`;
115
+ if (r.message !== undefined && typeof r.message !== 'string')
116
+ return `rules[${index}] (${r.id}): message 类型不是 string`;
117
+ return null;
118
+ }
119
+ /**
120
+ * 刷新字典:检查文件 mtime,有变化则重新读取并校验。
121
+ * 校验不通过 → 不更新内存数据,记录告警日志。
122
+ */
123
+ function refreshDict() {
124
+ const dictPath = getDictPath();
125
+ let stat;
126
+ try {
127
+ stat = fs.statSync(dictPath);
128
+ }
129
+ catch {
130
+ if (!_dictPathExplicit) {
131
+ const fallbackPath = resolveBestDictPath(dictPath);
132
+ if (fallbackPath !== path.resolve(dictPath) && fs.existsSync(fallbackPath)) {
133
+ logger.warn(`[error-dict] 字典文件不可用,切换到备用字典: ${dictPath} → ${fallbackPath}`);
134
+ _dictPath = fallbackPath;
135
+ _lastMtime = 0;
136
+ refreshDict();
137
+ return;
138
+ }
139
+ }
140
+ // 文件短暂不可用时保留已加载规则,避免构建窗口把重试规则清空。
141
+ if (_rules.length > 0) {
142
+ logger.warn(`[error-dict] 字典文件不可用,保留已加载规则: ${dictPath}`);
143
+ _lastMtime = 0;
144
+ }
145
+ return;
146
+ }
147
+ const mtime = stat.mtimeMs;
148
+ if (mtime === _lastMtime)
149
+ return; // 文件未变化,跳过
150
+ // 文件有变化,尝试加载
151
+ try {
152
+ const content = fs.readFileSync(dictPath, 'utf-8');
153
+ let raw;
154
+ try {
155
+ raw = JSON.parse(content);
156
+ }
157
+ catch (parseErr) {
158
+ logger.warn(`[error-dict] JSON 解析失败,保留原有规则: ${dictPath} — ${parseErr.message}`);
159
+ _lastMtime = mtime; // 标记已检查,避免重复读取
160
+ return;
161
+ }
162
+ if (!raw || typeof raw !== 'object' || !Array.isArray(raw.rules)) {
163
+ logger.warn(`[error-dict] 字典格式错误(缺少 rules 数组),保留原有规则: ${dictPath}`);
164
+ _lastMtime = mtime;
165
+ return;
166
+ }
167
+ // 逐条校验
168
+ const errors = [];
169
+ for (let i = 0; i < raw.rules.length; i++) {
170
+ const err = validateRule(raw.rules[i], i);
171
+ if (err)
172
+ errors.push(err);
173
+ }
174
+ if (errors.length > 0) {
175
+ logger.warn(`[error-dict] 字典校验失败(${errors.length} 条错误),保留原有规则:\n ${errors.join('\n ')}`);
176
+ _lastMtime = mtime;
177
+ return;
178
+ }
179
+ // 全部通过,更新
180
+ _rules = raw.rules;
181
+ _lastMtime = mtime;
182
+ logger.info(`[error-dict] 已加载 ${_rules.length} 条规则: ${dictPath}`);
183
+ }
184
+ catch (err) {
185
+ logger.warn(`[error-dict] 读取失败,保留原有规则: ${dictPath} — ${err.message}`);
186
+ }
187
+ }
188
+ /**
189
+ * 匹配错误消息,返回首条命中的规则。
190
+ * 每次调用自动检查文件变化(基于 mtime,无变化零开销)。
191
+ * @param errorMessage 已 toLowerCase 的错误消息
192
+ */
193
+ export function matchErrorRule(errorMessage) {
194
+ refreshDict();
195
+ for (const rule of _rules) {
196
+ if (errorMessage.includes(rule.match.toLowerCase())) {
197
+ return rule;
198
+ }
199
+ }
200
+ return null;
201
+ }
202
+ /** 获取当前已加载的规则数量(供测试和状态查询使用) */
203
+ export function getLoadedRuleCount() {
204
+ refreshDict();
205
+ return _rules.length;
206
+ }
207
+ /** 重置字典状态(仅供测试使用) */
208
+ export function _resetDict() {
209
+ _rules = [];
210
+ _lastMtime = 0;
211
+ _dictPath = null;
212
+ _dictPathExplicit = false;
213
+ }
214
+ /** 设置字典文件路径(仅供测试使用) */
215
+ export function _setDictPath(p) {
216
+ _dictPath = p;
217
+ _dictPathExplicit = true;
218
+ _lastMtime = 0; // 强制下次刷新
219
+ }
220
+ // ── 上下文过长检测(统一真相源)─────────────────────────────────────
221
+ //
222
+ // 覆盖所有已知的「上下文/输入超限」错误措辞,来源包括:
223
+ // - Anthropic 标准:prompt is too long / input is too long
224
+ // - OpenAI 兼容:context_length_exceeded / maximum context length
225
+ // - 网关自定义:reached its context window limit / context window limit
226
+ // - 中文:上下文过长
227
+ //
228
+ // ⚠️ 新增措辞统一往这里加,不要再在各模块本地复制正则。
229
+ export const CONTEXT_TOO_LONG_PATTERN = /prompt is too long|input is too long|context too long|context limit|context_length_exceeded|context_window_exceeded|context window limit|reached its context window|exceed(?:s|ed)? the context window|maximum context length|上下文过长/i;
230
+ /** 判断一段文本是否为「上下文过长」类错误。空文本返回 false。 */
231
+ export function isContextTooLongText(text) {
232
+ if (!text)
233
+ return false;
234
+ return CONTEXT_TOO_LONG_PATTERN.test(text);
235
+ }
236
+ // ── 错误分类 / 重试 / 消息 ──────────────────────────────────────────
237
+ const RETRYABLE_HTTP_STATUS_PATTERN = /\b(?:api error|http|status|last status|status code)\s*:?\s*(?:429|5\d{2})\b|\b429\b[^.\n\r]*(?:too many requests|rate limit)|(?:too many requests|rate limit)[^.\n\r]*\b429\b/i;
238
+ function hasRetryableHttpStatus(text) {
239
+ return RETRYABLE_HTTP_STATUS_PATTERN.test(text);
240
+ }
241
+ export function classifyError(error) {
242
+ const msg = (error?.message || '').toLowerCase();
243
+ // 字典优先 — 命中则直接返回
244
+ const rule = matchErrorRule(msg);
245
+ if (rule) {
246
+ if (rule.type)
247
+ return rule.type;
248
+ if (rule.action === 'retry')
249
+ return ErrorType.API_ERROR;
250
+ if (rule.action === 'stop')
251
+ return ErrorType.AUTH_ERROR;
252
+ return ErrorType.UNKNOWN;
253
+ }
254
+ // 内置兜底规则(结构性、稳定的错误模式)
255
+ if (msg.includes('context_compact_failed') || isContextTooLongText(msg)) {
256
+ return ErrorType.CONTEXT_TOO_LONG;
257
+ }
258
+ if (msg.includes('invalid_model') || msg.includes('model_not_found')
259
+ || msg.includes('no such model') || msg.includes('unknown model')
260
+ || /api error: 404\b/.test(msg)) {
261
+ return ErrorType.MODEL_UNAVAILABLE;
262
+ }
263
+ if (msg.includes('401') || msg.includes('authentication_error') || msg.includes('unauthorized')) {
264
+ return ErrorType.AUTH_ERROR;
265
+ }
266
+ if (hasRetryableHttpStatus(msg)) {
267
+ return ErrorType.API_ERROR;
268
+ }
269
+ if (msg.includes('timeout') || msg.includes('etimedout')) {
270
+ return ErrorType.SDK_TIMEOUT;
271
+ }
272
+ if (msg.includes('enoent') || msg.includes('corrupt')) {
273
+ return ErrorType.FILE_CORRUPT;
274
+ }
275
+ if (msg.includes('aborted') || msg.includes('interrupted')) {
276
+ return ErrorType.STREAM_ERROR;
277
+ }
278
+ return ErrorType.UNKNOWN;
279
+ }
280
+ /**
281
+ * 判断错误是否可重试(暂时性 API 错误)
282
+ * 403 算力池切换、429 限流、5xx 服务端错误
283
+ * 注意:401 认证错误不可重试(API Key 无效不会因重试恢复)
284
+ */
285
+ export function isRetryableError(error) {
286
+ const msg = error?.message || String(error);
287
+ const lower = msg.toLowerCase();
288
+ // 字典优先 — 命中则直接返回
289
+ const rule = matchErrorRule(lower);
290
+ if (rule)
291
+ return rule.action === 'retry';
292
+ // 内置兜底规则(结构性错误码)
293
+ if (lower.includes('401') || lower.includes('authentication_error') || lower.includes('unauthorized')) {
294
+ return false; // 认证错误不可重试
295
+ }
296
+ // HTTP 5xx / 429 — 标准可重试状态码。Codex SDK 可能把上游内部重试耗尽
297
+ // 包成 "exceeded retry limit, last status: 429 Too Many Requests"。
298
+ if (hasRetryableHttpStatus(lower))
299
+ return true;
300
+ return false;
301
+ }
302
+ export function getErrorMessage(error, terminalReason, includeEmoji = true) {
303
+ // terminalReason 提供更精确的错误提示(SDK 0.2.100+)
304
+ if (terminalReason) {
305
+ const prefix = includeEmoji ? '❌ ' : '';
306
+ const warnPrefix = includeEmoji ? '⚠️ ' : '';
307
+ switch (terminalReason) {
308
+ case 'max_turns':
309
+ return `${prefix}任务达到最大轮次限制,请简化需求或分步执行`;
310
+ case 'prompt_too_long':
311
+ return `${warnPrefix}输入过长,请精简提问或使用 /compact 压缩上下文`;
312
+ case 'rapid_refill_breaker':
313
+ return `${warnPrefix}API 限流中,请稍后重试`;
314
+ case 'context_compact_failed':
315
+ return `${warnPrefix}上下文过长,自动压缩失败,请手动输入 /compact 重试`;
316
+ case 'model_error':
317
+ return `${prefix}模型服务异常,请稍后重试`;
318
+ case 'tool_error':
319
+ return `${prefix}工具执行失败,请检查操作或重试`;
320
+ case 'permission_denied':
321
+ return `${prefix}权限被拒绝,操作已取消`;
322
+ case 'aborted_streaming':
323
+ case 'aborted_tools':
324
+ return `${prefix}任务已中断`;
325
+ }
326
+ }
327
+ // 回退到原有的错误消息匹配逻辑
328
+ const msg = error?.message || String(error);
329
+ // 字典优先 — 命中且有自定义消息则直接返回
330
+ const rule = matchErrorRule(msg.toLowerCase());
331
+ if (rule?.message)
332
+ return rule.message;
333
+ // 内置兜底规则(结构性错误)
334
+ const warnPrefix = includeEmoji ? '⚠️ ' : '';
335
+ const errPrefix = includeEmoji ? '❌ ' : '';
336
+ if (msg.includes('CONTEXT_COMPACT_FAILED') || isContextTooLongText(msg)) {
337
+ return `${warnPrefix}上下文过长,自动压缩失败,请手动输入 /compact 重试`;
338
+ }
339
+ if (msg.includes('401') || msg.includes('authentication_error') || msg.toLowerCase().includes('unauthorized')) {
340
+ return `${errPrefix}API Key 无效,请检查密钥配置。使用 /status 查看当前配置`;
341
+ }
342
+ if (hasRetryableHttpStatus(msg)) {
343
+ return `${warnPrefix}API 服务暂时不可用,请稍后重试`;
344
+ }
345
+ if (msg.includes('timeout')) {
346
+ return `${warnPrefix}请求超时,请重试`;
347
+ }
348
+ return `${errPrefix}处理消息时出错,请稍后重试`;
349
+ }