evolcore 0.0.25 → 0.0.27

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 (304) hide show
  1. package/CHANGELOG.md +632 -565
  2. package/LICENSE +21 -21
  3. package/README.md +455 -455
  4. package/bin/codex-managed-acl.ps1 +203 -160
  5. package/bin/codex-managed-hook.mjs +208 -208
  6. package/bin/ec-safe-output.js +327 -327
  7. package/bin/ec.js +40 -29
  8. package/bin/install-codex-managed-hooks.mjs +582 -555
  9. package/dist/agents/baseagent-availability.js +68 -0
  10. package/dist/agents/baseagent.js +96 -46
  11. package/dist/agents/claude-runner.js +172 -33
  12. package/dist/agents/codex/app-server-client.js +76 -31
  13. package/dist/agents/codex/catalog.js +1 -1
  14. package/dist/agents/codex/diagnostics.js +34 -1
  15. package/dist/agents/codex-runner.js +434 -446
  16. package/dist/agents/ecagent-runner.js +174 -34
  17. package/dist/agents/gemini-runner.js +8 -7
  18. package/dist/agents/runner-types.js +75 -19
  19. package/dist/aun/aid/agentmd.js +151 -36
  20. package/dist/aun/aid/client.js +1 -1
  21. package/dist/aun/aid/control-aid.js +180 -1
  22. package/dist/aun/aid/identity.js +4 -4
  23. package/dist/aun/aid/index.js +1 -1
  24. package/dist/aun/aid/store.js +17 -13
  25. package/dist/aun/group/history.js +303 -0
  26. package/dist/aun/group/identity.js +43 -0
  27. package/dist/aun/group/index.js +5 -0
  28. package/dist/aun/{msg/group.js → group/operations.js} +162 -39
  29. package/dist/aun/{menu-client.js → menu/client.js} +85 -6
  30. package/dist/aun/menu/index.js +2 -0
  31. package/dist/aun/menu/transport.js +49 -0
  32. package/dist/aun/msg/index.js +2 -1
  33. package/dist/aun/msg/managed-operation.js +85 -19
  34. package/dist/aun/msg/mention-schema.js +51 -0
  35. package/dist/aun/msg/p2p.js +19 -9
  36. package/dist/aun/msg/upload.js +43 -80
  37. package/dist/aun/outbox.js +29 -7
  38. package/dist/aun/rpc/client.js +1 -0
  39. package/dist/aun/storage/client.js +39 -50
  40. package/dist/channels/aun.js +842 -318
  41. package/dist/channels/daemon.js +10 -6
  42. package/dist/cli/agent-command.js +212 -89
  43. package/dist/cli/agent-create.js +626 -11
  44. package/dist/cli/agent.js +125 -13
  45. package/dist/cli/aun-commands.js +487 -337
  46. package/dist/cli/bench.js +20 -20
  47. package/dist/cli/config.js +55 -33
  48. package/dist/cli/contact.js +72 -15
  49. package/dist/cli/ctl-command.js +24 -24
  50. package/dist/cli/daemon-commands.js +140 -63
  51. package/dist/cli/diag.js +31 -0
  52. package/dist/cli/fs-command.js +70 -70
  53. package/dist/cli/handoff-command.js +46 -14
  54. package/dist/cli/index.js +91 -79
  55. package/dist/cli/init.js +34 -1
  56. package/dist/cli/link-rules.js +21 -21
  57. package/dist/cli/managed-command-guard.js +5 -1
  58. package/dist/cli/menu-client.js +51 -32
  59. package/dist/cli/model.js +3 -3
  60. package/dist/cli/net-check.js +22 -22
  61. package/dist/cli/queue-command.js +31 -31
  62. package/dist/cli/response.js +32 -32
  63. package/dist/cli/restart-monitor.js +103 -42
  64. package/dist/cli/stats.js +51 -51
  65. package/dist/cli/task-command.js +59 -0
  66. package/dist/cli/task-context.js +97 -49
  67. package/dist/cli/trigger-command.js +74 -64
  68. package/dist/config/builtin-roles.js +11 -0
  69. package/dist/config/config-field-policy.js +11 -0
  70. package/dist/config/config-manager.js +32 -4
  71. package/dist/config/config-operation-service.js +160 -0
  72. package/dist/config/contact-book-store.js +1 -1
  73. package/dist/config/contact-book.js +1 -1
  74. package/dist/config/contact-operation-service.js +97 -8
  75. package/dist/config/peer-role-resolver.js +1 -1
  76. package/dist/config/resolved-config-op.js +30 -7
  77. package/dist/config-store.js +1 -1
  78. package/dist/core/agent-application-service.js +7 -1
  79. package/dist/core/audit/event-key.js +17 -2
  80. package/dist/core/audit/log-integrity.js +34 -8
  81. package/dist/core/auth/agent-delegation.js +48 -14
  82. package/dist/core/auth/auth-gateway.js +2 -0
  83. package/dist/core/auth/authorization-audit.js +53 -49
  84. package/dist/core/auth/operation-authorizer.js +90 -7
  85. package/dist/core/auth/operation-catalog.js +145 -4
  86. package/dist/core/auth/remote-access-store.js +155 -10
  87. package/dist/core/bootstrap-messages.js +66 -7
  88. package/dist/core/bootstrap-service.js +111 -20
  89. package/dist/core/command/agent-control.js +88 -7
  90. package/dist/core/command/agent-storage-menu.js +443 -0
  91. package/dist/core/command/cli-intent-parser.js +19 -0
  92. package/dist/core/command/command-handler.js +159 -65
  93. package/dist/core/command/data-root-resolver.js +273 -0
  94. package/dist/core/command/diag-service.js +118 -0
  95. package/dist/core/command/group-menu.js +7 -2
  96. package/dist/core/command/menu-catalog.js +46 -7
  97. package/dist/core/command/menu-handler.js +392 -100
  98. package/dist/core/command/menu-protocol.js +45 -6
  99. package/dist/core/command/menu-token-store.js +41 -8
  100. package/dist/core/command/role-menu.js +2 -2
  101. package/dist/core/command/slash-gate.js +34 -4
  102. package/dist/core/command/slash-handler.js +123 -43
  103. package/dist/core/event-catalog.js +4 -0
  104. package/dist/core/evolagent-registry.js +28 -2
  105. package/dist/core/group/invite-service.js +924 -0
  106. package/dist/core/handoff/runtime.js +205 -27
  107. package/dist/core/handoff/store.js +193 -4
  108. package/dist/core/interaction-router.js +22 -8
  109. package/dist/core/message/im-renderer.js +146 -34
  110. package/dist/core/message/message-bridge.js +163 -20
  111. package/dist/core/message/message-log.js +5 -3
  112. package/dist/core/message/message-queue.js +99 -41
  113. package/dist/core/message/message-utils.js +1 -0
  114. package/dist/core/message/response-engine.js +755 -144
  115. package/dist/core/model/catalog-service.js +79 -49
  116. package/dist/core/model/context-window-suffix.js +33 -0
  117. package/dist/core/model/model-catalog.js +1 -1
  118. package/dist/core/model/model-permission.js +12 -3
  119. package/dist/core/permission/approval-gateway.js +36 -3
  120. package/dist/core/permission/ec-command-parser.js +112 -41
  121. package/dist/core/permission/protected-paths.js +134 -16
  122. package/dist/core/permission/sandbox-runtime.js +108 -17
  123. package/dist/core/permission/tool-error-code.js +15 -0
  124. package/dist/core/permission/tool-policy.js +9 -8
  125. package/dist/core/relation/peer-identity.js +57 -6
  126. package/dist/core/relation/shared-data.js +106 -0
  127. package/dist/core/role/runtime-policy.js +64 -0
  128. package/dist/core/runtime-lock.js +10 -26
  129. package/dist/core/session/runner-task-history.js +170 -0
  130. package/dist/core/session/session-manager.js +34 -6
  131. package/dist/core/session/session-mapper.js +41 -0
  132. package/dist/core/session/session-turn-coordinator.js +37 -7
  133. package/dist/core/session/session-turns.js +48 -7
  134. package/dist/core/task/task-recovery-service.js +176 -0
  135. package/dist/core/task/task-resume-operation.js +32 -0
  136. package/dist/eck/group-rules-sync.js +5 -3
  137. package/dist/eck/kit-renderer.js +1 -0
  138. package/dist/index.js +588 -217
  139. package/dist/ipc.js +193 -15
  140. package/dist/paths.js +17 -4
  141. package/dist/product.js +2 -0
  142. package/dist/response-system/engines/v1/proactive-flow.js +59 -2
  143. package/dist/stats/billing.js +41 -15
  144. package/dist/stats/db.js +159 -159
  145. package/dist/stats/eck-vars.js +9 -9
  146. package/dist/stats/price-resolver.js +28 -10
  147. package/dist/stats/query.js +139 -139
  148. package/dist/stats/role-budget.js +6 -6
  149. package/dist/stats/writer.js +51 -51
  150. package/dist/trigger/event-source.js +19 -0
  151. package/dist/trigger/feedback.js +233 -40
  152. package/dist/trigger/parser.js +55 -5
  153. package/dist/trigger/patch.js +9 -0
  154. package/dist/trigger/scheduler.js +30 -4
  155. package/dist/trigger/validation.js +20 -3
  156. package/dist/utils/cross-platform.js +30 -1
  157. package/dist/utils/ecweb-utils.js +1 -0
  158. package/dist/utils/error-dict.json +160 -160
  159. package/dist/utils/error-utils.js +61 -2
  160. package/dist/utils/evolcore-version.js +129 -0
  161. package/dist/utils/logger.js +26 -14
  162. package/dist/utils/macos-autostart.js +22 -22
  163. package/dist/utils/model-prices.jsonl +23 -23
  164. package/dist/utils/npm-ops.js +176 -35
  165. package/dist/utils/tool-summary.js +59 -3
  166. package/dist/utils/welcome.js +196 -23
  167. package/ecagent/LICENSE +21 -21
  168. package/ecagent/NOTICE +11 -11
  169. package/ecagent/README.md +61 -61
  170. package/ecagent/dist/harness/agent-harness.js +3 -0
  171. package/ecagent/dist/harness/compaction/branch-summarization.js +30 -30
  172. package/ecagent/dist/harness/compaction/compaction.js +83 -83
  173. package/ecagent/dist/harness/messages.js +7 -7
  174. package/ecagent/dist/harness/session/jsonl-storage.js +21 -2
  175. package/kits/docs/GUIDE.md +20 -20
  176. package/kits/docs/INDEX.md +60 -66
  177. package/kits/docs/aun/CHEATSHEET.md +19 -19
  178. package/kits/docs/aun/SYNC_PROTOCOL.md +15 -15
  179. package/kits/docs/channels/aun.md +69 -56
  180. package/kits/docs/channels/feishu.md +56 -56
  181. package/kits/docs/context-assembly.md +379 -367
  182. package/kits/docs/eck_templates/GUIDE.template.md +22 -22
  183. package/kits/docs/eck_templates/INDEX.template.md +28 -28
  184. package/kits/docs/eck_templates/path-registry.template.md +33 -33
  185. package/kits/docs/eck_templates/runtime.template.md +19 -19
  186. package/kits/docs/evolcore/INDEX.md +76 -71
  187. package/kits/docs/evolcore/agent-create.md +202 -165
  188. package/kits/docs/evolcore/agent.md +99 -67
  189. package/kits/docs/evolcore/aid.md +68 -60
  190. package/kits/docs/evolcore/codex-windows-sandbox.md +146 -146
  191. package/kits/docs/evolcore/config.md +241 -195
  192. package/kits/docs/evolcore/contact.md +75 -68
  193. package/kits/docs/evolcore/ctl.md +46 -46
  194. package/kits/docs/evolcore/event.md +216 -216
  195. package/kits/docs/evolcore/fs-architecture.md +1215 -1215
  196. package/kits/docs/evolcore/fs.md +110 -110
  197. package/kits/docs/evolcore/group-collaboration.md +244 -244
  198. package/kits/docs/evolcore/group-fs.md +17 -17
  199. package/kits/docs/evolcore/group-rules.md +251 -251
  200. package/kits/docs/evolcore/group.md +267 -152
  201. package/kits/docs/evolcore/menu-client.md +58 -34
  202. package/kits/docs/evolcore/model.md +50 -50
  203. package/kits/docs/evolcore/msg.md +169 -165
  204. package/kits/docs/evolcore/response.md +75 -75
  205. package/kits/docs/evolcore/rpc.md +37 -37
  206. package/kits/docs/evolcore/self-summary.md +29 -29
  207. package/kits/docs/evolcore/stats.md +83 -83
  208. package/kits/docs/evolcore/storage.md +53 -50
  209. package/kits/docs/evolcore/task.md +14 -0
  210. package/kits/docs/evolcore/trigger.md +623 -575
  211. package/kits/docs/identity/AID_PROFILE_SPEC.md +26 -26
  212. package/kits/docs/identity/PATH_OPS.md +16 -16
  213. package/kits/docs/identity/ROLE_DETAIL.md +25 -25
  214. package/kits/docs/identity/identity-tools.md +26 -26
  215. package/kits/docs/path-registry.md +62 -62
  216. package/kits/docs/prompt-loading-architecture.md +269 -269
  217. package/kits/docs/venues/aun-group.md +45 -45
  218. package/kits/docs/venues/aun-private.md +10 -10
  219. package/kits/docs/venues/client-desktop.md +10 -10
  220. package/kits/docs/venues/client-mobile.md +10 -10
  221. package/kits/docs/venues/feishu-group.md +13 -13
  222. package/kits/docs/venues/feishu-private.md +9 -9
  223. package/kits/docs/venues/group.md +42 -25
  224. package/kits/docs/venues/private.md +10 -10
  225. package/kits/eck_manifest.auxiliary.json +43 -43
  226. package/kits/eck_manifest.json +217 -190
  227. package/kits/eck_message_manifest.json +74 -74
  228. package/kits/migrations/README-role-config-v4.md +32 -32
  229. package/kits/migrations/migrate-contact-book-v2.mjs +748 -748
  230. package/kits/migrations/migrate-role-config-v4.mjs +614 -614
  231. package/kits/migrations/migrate-role-config-v5.mjs +365 -365
  232. package/kits/migrations/rename-config-file.mjs +99 -99
  233. package/kits/rules/01-overview.md +166 -162
  234. package/kits/rules/02-navigation.md +96 -96
  235. package/kits/rules/03-identity.md +36 -36
  236. package/kits/rules/04-relation.md +76 -75
  237. package/kits/rules/05-venue.md +60 -60
  238. package/kits/rules/06-channel.md +65 -63
  239. package/kits/schemas/_meta.json +53 -53
  240. package/kits/schemas/agent-config.schema.1.json +177 -177
  241. package/kits/schemas/agent-config.schema.10.json +395 -395
  242. package/kits/schemas/agent-config.schema.11.json +421 -421
  243. package/kits/schemas/agent-config.schema.12.json +451 -427
  244. package/kits/schemas/agent-config.schema.2.json +239 -239
  245. package/kits/schemas/agent-config.schema.3.json +119 -119
  246. package/kits/schemas/agent-config.schema.4.json +208 -208
  247. package/kits/schemas/agent-config.schema.5.json +326 -326
  248. package/kits/schemas/agent-config.schema.6.json +322 -322
  249. package/kits/schemas/agent-config.schema.7.json +303 -303
  250. package/kits/schemas/agent-config.schema.8.json +304 -304
  251. package/kits/schemas/agent-config.schema.9.json +364 -364
  252. package/kits/schemas/contact-book.schema.1.json +36 -36
  253. package/kits/schemas/contact-book.schema.2.json +43 -43
  254. package/kits/schemas/contact-book.schema.3.json +67 -67
  255. package/kits/schemas/daemon.schema.1.json +91 -91
  256. package/kits/schemas/daemon.schema.2.json +101 -101
  257. package/kits/schemas/daemon.schema.3.json +123 -123
  258. package/kits/schemas/daemon.schema.4.json +136 -136
  259. package/kits/schemas/daemon.schema.5.json +135 -135
  260. package/kits/schemas/daemon.schema.6.json +131 -131
  261. package/kits/schemas/defaults.schema.1.json +81 -81
  262. package/kits/schemas/defaults.schema.2.json +85 -85
  263. package/kits/schemas/defaults.schema.3.json +73 -73
  264. package/kits/schemas/defaults.schema.4.json +107 -107
  265. package/kits/schemas/defaults.schema.5.json +119 -119
  266. package/kits/schemas/menu-exec-schema-commands.md +208 -208
  267. package/kits/schemas/migrations/README.md +30 -30
  268. package/kits/schemas/relation-config.schema.1.json +158 -158
  269. package/kits/schemas/relation-config.schema.2.json +73 -73
  270. package/kits/schemas/relation-config.schema.3.json +50 -50
  271. package/kits/schemas/relation-config.schema.4.json +47 -47
  272. package/kits/schemas/relation-config.schema.5.json +47 -47
  273. package/kits/schemas/relation-config.schema.6.json +46 -46
  274. package/kits/schemas/relation-config.schema.7.json +59 -59
  275. package/kits/schemas/relation-config.schema.8.json +103 -103
  276. package/kits/schemas/role-config.schema.1.json +215 -201
  277. package/kits/schemas/role-registry.schema.1.json +35 -35
  278. package/kits/schemas/single-session.schema.1.json +31 -31
  279. package/kits/schemas/single-session.schema.2.json +57 -57
  280. package/kits/schemas/single-session.schema.3.json +32 -32
  281. package/kits/templates/bootstrap-welcome.md +17 -17
  282. package/kits/templates/message-fragments/handoff-context-to-target.md +9 -9
  283. package/kits/templates/message-fragments/handoff-request-to-target.md +19 -19
  284. package/kits/templates/message-fragments/handoff-response-to-origin.md +9 -9
  285. package/kits/templates/message-fragments/inject-default.md +2 -2
  286. package/kits/templates/message-fragments/item.md +2 -2
  287. package/kits/templates/roles/admin.json +92 -92
  288. package/kits/templates/roles/member.json +101 -96
  289. package/kits/templates/roles/owner.json +9 -9
  290. package/kits/templates/roles/visitor.json +90 -85
  291. package/kits/templates/system-fragments/baseagent.md +14 -14
  292. package/kits/templates/system-fragments/bootstrap.md +53 -34
  293. package/kits/templates/system-fragments/channel.md +28 -64
  294. package/kits/templates/system-fragments/commands.md +36 -28
  295. package/kits/templates/system-fragments/group-unread-history.md +7 -0
  296. package/kits/templates/system-fragments/identity.md +13 -13
  297. package/kits/templates/system-fragments/relation.md +19 -19
  298. package/kits/templates/system-fragments/reply.md +56 -0
  299. package/kits/templates/system-fragments/session.md +59 -59
  300. package/kits/templates/system-fragments/venue.md +31 -31
  301. package/package.json +104 -98
  302. package/dist/aun/group-identity.js +0 -9
  303. /package/dist/aun/{group-fs-download.js → group/fs-download.js} +0 -0
  304. /package/dist/aun/{msg/group-index.js → group/index-rpc.js} +0 -0
@@ -137,25 +137,25 @@ function _queryAggregatedDaily(evolcoreHome, granularity, filter) {
137
137
  if (!db)
138
138
  return [];
139
139
  try {
140
- const sql = `
141
- SELECT
142
- ${periodExpr} AS period,
143
- SUM(input_tokens) AS input_tokens,
144
- SUM(output_tokens) AS output_tokens,
145
- SUM(cache_creation_tokens) AS cache_creation_tokens,
146
- SUM(cache_read_tokens) AS cache_read_tokens,
147
- SUM(cache_hit_tokens) AS cache_hit_tokens,
148
- SUM(cache_miss_tokens) AS cache_miss_tokens,
149
- SUM(image_tokens) AS image_tokens,
150
- SUM(total_context_tokens) AS total_context_tokens,
151
- SUM(turns) AS turns,
152
- SUM(calls) AS call_count,
153
- COALESCE(SUM(cost_official_usd), 0) AS cost_official_usd,
154
- COALESCE(SUM(cost_official_cny), 0) AS cost_official_cny,
155
- COALESCE(SUM(cost_gateway_usd), 0) AS cost_gateway_usd,
156
- COALESCE(SUM(cost_gateway_cny), 0) AS cost_gateway_cny
157
- FROM usage_daily ${clause}
158
- GROUP BY ${periodExpr}
140
+ const sql = `
141
+ SELECT
142
+ ${periodExpr} AS period,
143
+ SUM(input_tokens) AS input_tokens,
144
+ SUM(output_tokens) AS output_tokens,
145
+ SUM(cache_creation_tokens) AS cache_creation_tokens,
146
+ SUM(cache_read_tokens) AS cache_read_tokens,
147
+ SUM(cache_hit_tokens) AS cache_hit_tokens,
148
+ SUM(cache_miss_tokens) AS cache_miss_tokens,
149
+ SUM(image_tokens) AS image_tokens,
150
+ SUM(total_context_tokens) AS total_context_tokens,
151
+ SUM(turns) AS turns,
152
+ SUM(calls) AS call_count,
153
+ COALESCE(SUM(cost_official_usd), 0) AS cost_official_usd,
154
+ COALESCE(SUM(cost_official_cny), 0) AS cost_official_cny,
155
+ COALESCE(SUM(cost_gateway_usd), 0) AS cost_gateway_usd,
156
+ COALESCE(SUM(cost_gateway_cny), 0) AS cost_gateway_cny
157
+ FROM usage_daily ${clause}
158
+ GROUP BY ${periodExpr}
159
159
  `;
160
160
  const rows = db.prepare(sql).all(...params);
161
161
  if (groupCol) {
@@ -180,45 +180,45 @@ function _queryAggregatedEvents(evolcoreHome, granularity, filter) {
180
180
  let sql;
181
181
  if (groupCol) {
182
182
  // 非时间维度:按字段分组
183
- sql = `
184
- SELECT
185
- ${groupCol} AS period,
186
- SUM(input_tokens) AS input_tokens,
187
- SUM(output_tokens) AS output_tokens,
188
- SUM(cache_creation_tokens) AS cache_creation_tokens,
189
- SUM(cache_read_tokens) AS cache_read_tokens,
190
- SUM(COALESCE(cache_hit_tokens,0)) AS cache_hit_tokens,
191
- SUM(COALESCE(cache_miss_tokens,0)) AS cache_miss_tokens,
192
- SUM(COALESCE(image_tokens,0)) AS image_tokens,
193
- SUM(COALESCE(total_context_tokens,0)) AS total_context_tokens,
194
- SUM(turns) AS turns,
195
- COUNT(*) AS call_count
196
- FROM usage_events ${clause}
197
- GROUP BY ${groupCol} ORDER BY (input_tokens + output_tokens) DESC
183
+ sql = `
184
+ SELECT
185
+ ${groupCol} AS period,
186
+ SUM(input_tokens) AS input_tokens,
187
+ SUM(output_tokens) AS output_tokens,
188
+ SUM(cache_creation_tokens) AS cache_creation_tokens,
189
+ SUM(cache_read_tokens) AS cache_read_tokens,
190
+ SUM(COALESCE(cache_hit_tokens,0)) AS cache_hit_tokens,
191
+ SUM(COALESCE(cache_miss_tokens,0)) AS cache_miss_tokens,
192
+ SUM(COALESCE(image_tokens,0)) AS image_tokens,
193
+ SUM(COALESCE(total_context_tokens,0)) AS total_context_tokens,
194
+ SUM(turns) AS turns,
195
+ COUNT(*) AS call_count
196
+ FROM usage_events ${clause}
197
+ GROUP BY ${groupCol} ORDER BY (input_tokens + output_tokens) DESC
198
198
  `;
199
199
  }
200
200
  else {
201
201
  // 时间维度:strftime 分组
202
202
  const fmt = GRAN_FMT[granularity] || GRAN_FMT.day;
203
- sql = `
204
- SELECT
205
- strftime('${fmt}', ts/1000, 'unixepoch', 'localtime') AS period,
206
- SUM(input_tokens) AS input_tokens,
207
- SUM(output_tokens) AS output_tokens,
208
- SUM(cache_creation_tokens) AS cache_creation_tokens,
209
- SUM(cache_read_tokens) AS cache_read_tokens,
210
- SUM(COALESCE(cache_hit_tokens,0)) AS cache_hit_tokens,
211
- SUM(COALESCE(cache_miss_tokens,0)) AS cache_miss_tokens,
212
- SUM(COALESCE(image_tokens,0)) AS image_tokens,
213
- SUM(COALESCE(total_context_tokens,0)) AS total_context_tokens,
214
- SUM(turns) AS turns,
215
- COUNT(*) AS call_count,
216
- COALESCE(SUM(cost_official_usd), 0) AS cost_official_usd,
217
- COALESCE(SUM(cost_official_cny), 0) AS cost_official_cny,
218
- COALESCE(SUM(cost_gateway_usd), 0) AS cost_gateway_usd,
219
- COALESCE(SUM(cost_gateway_cny), 0) AS cost_gateway_cny
220
- FROM usage_events ${clause}
221
- GROUP BY period ORDER BY period
203
+ sql = `
204
+ SELECT
205
+ strftime('${fmt}', ts/1000, 'unixepoch', 'localtime') AS period,
206
+ SUM(input_tokens) AS input_tokens,
207
+ SUM(output_tokens) AS output_tokens,
208
+ SUM(cache_creation_tokens) AS cache_creation_tokens,
209
+ SUM(cache_read_tokens) AS cache_read_tokens,
210
+ SUM(COALESCE(cache_hit_tokens,0)) AS cache_hit_tokens,
211
+ SUM(COALESCE(cache_miss_tokens,0)) AS cache_miss_tokens,
212
+ SUM(COALESCE(image_tokens,0)) AS image_tokens,
213
+ SUM(COALESCE(total_context_tokens,0)) AS total_context_tokens,
214
+ SUM(turns) AS turns,
215
+ COUNT(*) AS call_count,
216
+ COALESCE(SUM(cost_official_usd), 0) AS cost_official_usd,
217
+ COALESCE(SUM(cost_official_cny), 0) AS cost_official_cny,
218
+ COALESCE(SUM(cost_gateway_usd), 0) AS cost_gateway_usd,
219
+ COALESCE(SUM(cost_gateway_cny), 0) AS cost_gateway_cny
220
+ FROM usage_events ${clause}
221
+ GROUP BY period ORDER BY period
222
222
  `;
223
223
  }
224
224
  // 收集所有相关 DB 的原始行,再按 period 合并
@@ -295,17 +295,17 @@ export function querySessionSummary(evolcoreHome, sessionId) {
295
295
  cost_official_usd: 0, cost_official_cny: 0, cost_gateway_usd: 0, cost_gateway_cny: 0,
296
296
  usd: 0, cny: 0,
297
297
  };
298
- const sql = `
299
- SELECT
300
- COALESCE(SUM(input_tokens), 0) AS input_tokens,
301
- COALESCE(SUM(output_tokens), 0) AS output_tokens,
302
- COALESCE(SUM(cache_creation_tokens), 0) AS cache_creation_tokens,
303
- COALESCE(SUM(cache_read_tokens), 0) AS cache_read_tokens,
304
- COUNT(*) AS calls,
305
- COALESCE(SUM(cost_official_usd), 0) AS cost_official_usd,
306
- COALESCE(SUM(cost_official_cny), 0) AS cost_official_cny,
307
- COALESCE(SUM(cost_gateway_usd), 0) AS cost_gateway_usd,
308
- COALESCE(SUM(cost_gateway_cny), 0) AS cost_gateway_cny
298
+ const sql = `
299
+ SELECT
300
+ COALESCE(SUM(input_tokens), 0) AS input_tokens,
301
+ COALESCE(SUM(output_tokens), 0) AS output_tokens,
302
+ COALESCE(SUM(cache_creation_tokens), 0) AS cache_creation_tokens,
303
+ COALESCE(SUM(cache_read_tokens), 0) AS cache_read_tokens,
304
+ COUNT(*) AS calls,
305
+ COALESCE(SUM(cost_official_usd), 0) AS cost_official_usd,
306
+ COALESCE(SUM(cost_official_cny), 0) AS cost_official_cny,
307
+ COALESCE(SUM(cost_gateway_usd), 0) AS cost_gateway_usd,
308
+ COALESCE(SUM(cost_gateway_cny), 0) AS cost_gateway_cny
309
309
  FROM usage_events WHERE session_id = ?`;
310
310
  const acc = { ...empty };
311
311
  for (const dbPath of _relevantDbs(evolcoreHome, {})) {
@@ -355,11 +355,11 @@ export function queryContextBreakdown(evolcoreHome, sessionId) {
355
355
  /** Top-N 对端(按 token 总量排序)。读预聚合表 usage_daily。 */
356
356
  export function queryTopPeers(evolcoreHome, filter, limit = 10) {
357
357
  const { clause, params } = _buildDailyWhere(filter);
358
- const sql = `
359
- SELECT peer_key, SUM(input_tokens+output_tokens) AS total_tokens,
360
- SUM(calls) AS call_count
361
- FROM usage_daily ${clause}
362
- GROUP BY peer_key ORDER BY total_tokens DESC LIMIT ${limit}
358
+ const sql = `
359
+ SELECT peer_key, SUM(input_tokens+output_tokens) AS total_tokens,
360
+ SUM(calls) AS call_count
361
+ FROM usage_daily ${clause}
362
+ GROUP BY peer_key ORDER BY total_tokens DESC LIMIT ${limit}
363
363
  `;
364
364
  const db = openReadonlyDb(getDbPath(evolcoreHome));
365
365
  if (!db)
@@ -374,11 +374,11 @@ export function queryTopPeers(evolcoreHome, filter, limit = 10) {
374
374
  /** Top-N 模型(按 token 总量排序)。读预聚合表 usage_daily。 */
375
375
  export function queryTopModels(evolcoreHome, filter, limit = 10) {
376
376
  const { clause, params } = _buildDailyWhere(filter);
377
- const sql = `
378
- SELECT model, SUM(input_tokens+output_tokens) AS total_tokens,
379
- SUM(calls) AS call_count
380
- FROM usage_daily ${clause}
381
- GROUP BY model ORDER BY total_tokens DESC LIMIT ${limit}
377
+ const sql = `
378
+ SELECT model, SUM(input_tokens+output_tokens) AS total_tokens,
379
+ SUM(calls) AS call_count
380
+ FROM usage_daily ${clause}
381
+ GROUP BY model ORDER BY total_tokens DESC LIMIT ${limit}
382
382
  `;
383
383
  const db = openReadonlyDb(getDbPath(evolcoreHome));
384
384
  if (!db)
@@ -446,29 +446,29 @@ export function queryPeerList(evolcoreHome, opts) {
446
446
  if (!db)
447
447
  return [];
448
448
  try {
449
- const listSql = `
450
- SELECT peer_key,
451
- SUM(input_tokens) AS input_tokens, SUM(output_tokens) AS output_tokens,
452
- SUM(cache_creation_tokens) AS cache_creation_tokens,
453
- SUM(cache_read_tokens) AS cache_read_tokens,
454
- SUM(input_tokens+output_tokens+cache_read_tokens+cache_creation_tokens) AS total_tokens,
455
- SUM(calls) AS calls,
456
- COUNT(DISTINCT session_id) AS session_count,
457
- MIN(day) AS first_day, MAX(day) AS last_day,
458
- MAX(peer_type) AS peer_type
459
- FROM usage_daily ${peerCond}
460
- GROUP BY peer_key ORDER BY total_tokens DESC LIMIT ${limit}
449
+ const listSql = `
450
+ SELECT peer_key,
451
+ SUM(input_tokens) AS input_tokens, SUM(output_tokens) AS output_tokens,
452
+ SUM(cache_creation_tokens) AS cache_creation_tokens,
453
+ SUM(cache_read_tokens) AS cache_read_tokens,
454
+ SUM(input_tokens+output_tokens+cache_read_tokens+cache_creation_tokens) AS total_tokens,
455
+ SUM(calls) AS calls,
456
+ COUNT(DISTINCT session_id) AS session_count,
457
+ MIN(day) AS first_day, MAX(day) AS last_day,
458
+ MAX(peer_type) AS peer_type
459
+ FROM usage_daily ${peerCond}
460
+ GROUP BY peer_key ORDER BY total_tokens DESC LIMIT ${limit}
461
461
  `;
462
462
  const rows = db.prepare(listSql).all(...listParams);
463
463
  // 每个 peer 的成本:按 (peer_key, model, billing_fn) 分组算 calcCost 累加。
464
- const costSql = `
465
- SELECT peer_key, model, COALESCE(billing_fn,'') AS billing_fn,
466
- SUM(input_tokens) AS input_tokens, SUM(output_tokens) AS output_tokens,
467
- SUM(cache_creation_tokens) AS cache_creation_tokens, SUM(cache_read_tokens) AS cache_read_tokens,
468
- SUM(cache_hit_tokens) AS cache_hit_tokens, SUM(cache_miss_tokens) AS cache_miss_tokens,
469
- SUM(image_tokens) AS image_tokens, SUM(total_context_tokens) AS total_context_tokens
470
- FROM usage_daily ${peerCond}
471
- GROUP BY peer_key, model, billing_fn
464
+ const costSql = `
465
+ SELECT peer_key, model, COALESCE(billing_fn,'') AS billing_fn,
466
+ SUM(input_tokens) AS input_tokens, SUM(output_tokens) AS output_tokens,
467
+ SUM(cache_creation_tokens) AS cache_creation_tokens, SUM(cache_read_tokens) AS cache_read_tokens,
468
+ SUM(cache_hit_tokens) AS cache_hit_tokens, SUM(cache_miss_tokens) AS cache_miss_tokens,
469
+ SUM(image_tokens) AS image_tokens, SUM(total_context_tokens) AS total_context_tokens
470
+ FROM usage_daily ${peerCond}
471
+ GROUP BY peer_key, model, billing_fn
472
472
  `;
473
473
  const costByPeer = new Map();
474
474
  for (const r of db.prepare(costSql).all(...listParams)) {
@@ -519,17 +519,17 @@ export function querySummary(evolcoreHome, opts) {
519
519
  if (!db)
520
520
  return empty;
521
521
  try {
522
- const row = db.prepare(`
523
- SELECT
524
- SUM(input_tokens) AS input_tokens, SUM(output_tokens) AS output_tokens,
525
- SUM(cache_creation_tokens) AS cache_creation_tokens,
526
- SUM(cache_read_tokens) AS cache_read_tokens,
527
- SUM(calls) AS calls,
528
- COALESCE(SUM(cost_official_usd), 0) AS cost_official_usd,
529
- COALESCE(SUM(cost_official_cny), 0) AS cost_official_cny,
530
- COALESCE(SUM(cost_gateway_usd), 0) AS cost_gateway_usd,
531
- COALESCE(SUM(cost_gateway_cny), 0) AS cost_gateway_cny
532
- FROM usage_daily ${clause}
522
+ const row = db.prepare(`
523
+ SELECT
524
+ SUM(input_tokens) AS input_tokens, SUM(output_tokens) AS output_tokens,
525
+ SUM(cache_creation_tokens) AS cache_creation_tokens,
526
+ SUM(cache_read_tokens) AS cache_read_tokens,
527
+ SUM(calls) AS calls,
528
+ COALESCE(SUM(cost_official_usd), 0) AS cost_official_usd,
529
+ COALESCE(SUM(cost_official_cny), 0) AS cost_official_cny,
530
+ COALESCE(SUM(cost_gateway_usd), 0) AS cost_gateway_usd,
531
+ COALESCE(SUM(cost_gateway_cny), 0) AS cost_gateway_cny
532
+ FROM usage_daily ${clause}
533
533
  `).get(...params);
534
534
  if (!row || row.calls == null)
535
535
  return empty;
@@ -571,28 +571,28 @@ export function queryPeerDaily(evolcoreHome, opts) {
571
571
  if (!db)
572
572
  return [];
573
573
  try {
574
- const sql = `
575
- SELECT day AS period,
576
- SUM(input_tokens) AS input_tokens, SUM(output_tokens) AS output_tokens,
577
- SUM(cache_creation_tokens) AS cache_creation_tokens,
578
- SUM(cache_read_tokens) AS cache_read_tokens,
579
- SUM(cache_hit_tokens) AS cache_hit_tokens, SUM(cache_miss_tokens) AS cache_miss_tokens,
580
- SUM(image_tokens) AS image_tokens, SUM(total_context_tokens) AS total_context_tokens,
581
- SUM(turns) AS turns, SUM(calls) AS call_count
582
- FROM usage_daily ${where}
583
- GROUP BY day ORDER BY day
574
+ const sql = `
575
+ SELECT day AS period,
576
+ SUM(input_tokens) AS input_tokens, SUM(output_tokens) AS output_tokens,
577
+ SUM(cache_creation_tokens) AS cache_creation_tokens,
578
+ SUM(cache_read_tokens) AS cache_read_tokens,
579
+ SUM(cache_hit_tokens) AS cache_hit_tokens, SUM(cache_miss_tokens) AS cache_miss_tokens,
580
+ SUM(image_tokens) AS image_tokens, SUM(total_context_tokens) AS total_context_tokens,
581
+ SUM(turns) AS turns, SUM(calls) AS call_count
582
+ FROM usage_daily ${where}
583
+ GROUP BY day ORDER BY day
584
584
  `;
585
585
  const periodMap = new Map();
586
586
  for (const r of db.prepare(sql).all(...qParams))
587
587
  periodMap.set(r.period, r);
588
- const costSql = `
589
- SELECT day AS period, model, COALESCE(billing_fn,'') AS billing_fn,
590
- SUM(input_tokens) AS input_tokens, SUM(output_tokens) AS output_tokens,
591
- SUM(cache_creation_tokens) AS cache_creation_tokens, SUM(cache_read_tokens) AS cache_read_tokens,
592
- SUM(cache_hit_tokens) AS cache_hit_tokens, SUM(cache_miss_tokens) AS cache_miss_tokens,
593
- SUM(image_tokens) AS image_tokens, SUM(total_context_tokens) AS total_context_tokens
594
- FROM usage_daily ${where}
595
- GROUP BY day, model, billing_fn
588
+ const costSql = `
589
+ SELECT day AS period, model, COALESCE(billing_fn,'') AS billing_fn,
590
+ SUM(input_tokens) AS input_tokens, SUM(output_tokens) AS output_tokens,
591
+ SUM(cache_creation_tokens) AS cache_creation_tokens, SUM(cache_read_tokens) AS cache_read_tokens,
592
+ SUM(cache_hit_tokens) AS cache_hit_tokens, SUM(cache_miss_tokens) AS cache_miss_tokens,
593
+ SUM(image_tokens) AS image_tokens, SUM(total_context_tokens) AS total_context_tokens
594
+ FROM usage_daily ${where}
595
+ GROUP BY day, model, billing_fn
596
596
  `;
597
597
  const costMap = new Map();
598
598
  const byPeriod = new Map();
@@ -674,26 +674,26 @@ export function queryMessageAggregated(evolcoreHome, granularity, filter) {
674
674
  let sql;
675
675
  if (groupCol) {
676
676
  const col = groupCol === 'model' ? 'agent_aid' : groupCol; // model 无意义,降级 agent
677
- sql = `
678
- SELECT ${col} AS period,
679
- SUM(CASE WHEN direction='in' THEN 1 ELSE 0 END) AS msg_in,
680
- SUM(CASE WHEN direction='out' THEN 1 ELSE 0 END) AS msg_out,
681
- SUM(CASE WHEN direction='in' THEN bytes ELSE 0 END) AS bytes_in,
682
- SUM(CASE WHEN direction='out' THEN bytes ELSE 0 END) AS bytes_out
683
- FROM message_events ${clause}
684
- GROUP BY ${col} ORDER BY (bytes_in + bytes_out) DESC
677
+ sql = `
678
+ SELECT ${col} AS period,
679
+ SUM(CASE WHEN direction='in' THEN 1 ELSE 0 END) AS msg_in,
680
+ SUM(CASE WHEN direction='out' THEN 1 ELSE 0 END) AS msg_out,
681
+ SUM(CASE WHEN direction='in' THEN bytes ELSE 0 END) AS bytes_in,
682
+ SUM(CASE WHEN direction='out' THEN bytes ELSE 0 END) AS bytes_out
683
+ FROM message_events ${clause}
684
+ GROUP BY ${col} ORDER BY (bytes_in + bytes_out) DESC
685
685
  `;
686
686
  }
687
687
  else {
688
688
  const fmt = GRAN_FMT[granularity] || GRAN_FMT.day;
689
- sql = `
690
- SELECT strftime('${fmt}', ts/1000, 'unixepoch', 'localtime') AS period,
691
- SUM(CASE WHEN direction='in' THEN 1 ELSE 0 END) AS msg_in,
692
- SUM(CASE WHEN direction='out' THEN 1 ELSE 0 END) AS msg_out,
693
- SUM(CASE WHEN direction='in' THEN bytes ELSE 0 END) AS bytes_in,
694
- SUM(CASE WHEN direction='out' THEN bytes ELSE 0 END) AS bytes_out
695
- FROM message_events ${clause}
696
- GROUP BY period ORDER BY period
689
+ sql = `
690
+ SELECT strftime('${fmt}', ts/1000, 'unixepoch', 'localtime') AS period,
691
+ SUM(CASE WHEN direction='in' THEN 1 ELSE 0 END) AS msg_in,
692
+ SUM(CASE WHEN direction='out' THEN 1 ELSE 0 END) AS msg_out,
693
+ SUM(CASE WHEN direction='in' THEN bytes ELSE 0 END) AS bytes_in,
694
+ SUM(CASE WHEN direction='out' THEN bytes ELSE 0 END) AS bytes_out
695
+ FROM message_events ${clause}
696
+ GROUP BY period ORDER BY period
697
697
  `;
698
698
  }
699
699
  const periodMap = new Map();
@@ -137,12 +137,12 @@ function queryPeriodUsage(evolcoreHome, opts) {
137
137
  where.push('usage_subject_key = ?');
138
138
  params.push(opts.usageSubjectKey);
139
139
  }
140
- const row = db.prepare(`
141
- SELECT
142
- COALESCE(SUM(${prefix}_cny), 0) AS cny,
143
- COALESCE(SUM(${prefix}_usd), 0) AS usd
144
- FROM usage_events
145
- WHERE ${where.join(' AND ')}
140
+ const row = db.prepare(`
141
+ SELECT
142
+ COALESCE(SUM(${prefix}_cny), 0) AS cny,
143
+ COALESCE(SUM(${prefix}_usd), 0) AS usd
144
+ FROM usage_events
145
+ WHERE ${where.join(' AND ')}
146
146
  `).get(...params);
147
147
  return {
148
148
  cny: Number(row?.cny ?? 0),
@@ -48,43 +48,43 @@ function isSchemaMismatchError(error) {
48
48
  function writeUsageEvent(db, event, prices) {
49
49
  // 明细 INSERT + rollup UPSERT 包进同一事务:进程在两者间崩溃也不会让 rollup 与明细漂移。
50
50
  db.exec('BEGIN');
51
- db.prepare(`
52
- INSERT INTO usage_events
53
- (ts, agent_aid, peer_key, usage_subject_key, role, peer_type, session_id, model, billing_fn,
54
- input_tokens, output_tokens, cache_creation_tokens, cache_read_tokens,
55
- cache_hit_tokens, cache_miss_tokens, image_tokens, total_context_tokens,
56
- turns, duration_ms, context_window_pct,
57
- cost_official_usd, cost_official_cny, cost_gateway_usd, cost_gateway_cny)
58
- VALUES
59
- (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
51
+ db.prepare(`
52
+ INSERT INTO usage_events
53
+ (ts, agent_aid, peer_key, usage_subject_key, role, peer_type, session_id, model, billing_fn,
54
+ input_tokens, output_tokens, cache_creation_tokens, cache_read_tokens,
55
+ cache_hit_tokens, cache_miss_tokens, image_tokens, total_context_tokens,
56
+ turns, duration_ms, context_window_pct,
57
+ cost_official_usd, cost_official_cny, cost_gateway_usd, cost_gateway_cny)
58
+ VALUES
59
+ (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
60
60
  `).run(event.ts, event.agent_aid, event.peer_key, event.usage_subject_key ?? event.peer_key ?? '', event.role ?? '', event.peer_type ?? null, event.session_id ?? null, event.model, event.billing_fn, event.input_tokens, event.output_tokens, event.cache_creation_tokens, event.cache_read_tokens, event.cache_hit_tokens ?? null, event.cache_miss_tokens ?? null, event.image_tokens ?? null, event.total_context_tokens ?? null, event.turns, event.duration_ms ?? null, event.context_window_pct ?? null, prices.official?.usd ?? null, prices.official?.cny ?? null, prices.gateway?.usd ?? null, prices.gateway?.cny ?? null);
61
61
  // 写时增量:累加到日级预聚合表(grain 与 db.ts rebuildDailyRollup 一致)。
62
- db.prepare(`
63
- INSERT INTO usage_daily
64
- (day, agent_aid, peer_key, peer_type, session_id, model, billing_fn,
65
- input_tokens, output_tokens, cache_creation_tokens, cache_read_tokens,
66
- cache_hit_tokens, cache_miss_tokens, image_tokens, total_context_tokens,
67
- turns, calls,
68
- cost_official_usd, cost_official_cny, cost_gateway_usd, cost_gateway_cny)
69
- VALUES
70
- (strftime('%Y-%m-%d', ?/1000, 'unixepoch', 'localtime'),
71
- ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 1, ?, ?, ?, ?)
72
- ON CONFLICT(day, agent_aid, peer_key, session_id, model, billing_fn) DO UPDATE SET
73
- peer_type = excluded.peer_type,
74
- input_tokens = input_tokens + excluded.input_tokens,
75
- output_tokens = output_tokens + excluded.output_tokens,
76
- cache_creation_tokens = cache_creation_tokens + excluded.cache_creation_tokens,
77
- cache_read_tokens = cache_read_tokens + excluded.cache_read_tokens,
78
- cache_hit_tokens = cache_hit_tokens + excluded.cache_hit_tokens,
79
- cache_miss_tokens = cache_miss_tokens + excluded.cache_miss_tokens,
80
- image_tokens = image_tokens + excluded.image_tokens,
81
- total_context_tokens = total_context_tokens + excluded.total_context_tokens,
82
- turns = turns + excluded.turns,
83
- calls = calls + 1,
84
- cost_official_usd = COALESCE(cost_official_usd, 0) + COALESCE(excluded.cost_official_usd, 0),
85
- cost_official_cny = COALESCE(cost_official_cny, 0) + COALESCE(excluded.cost_official_cny, 0),
86
- cost_gateway_usd = COALESCE(cost_gateway_usd, 0) + COALESCE(excluded.cost_gateway_usd, 0),
87
- cost_gateway_cny = COALESCE(cost_gateway_cny, 0) + COALESCE(excluded.cost_gateway_cny, 0)
62
+ db.prepare(`
63
+ INSERT INTO usage_daily
64
+ (day, agent_aid, peer_key, peer_type, session_id, model, billing_fn,
65
+ input_tokens, output_tokens, cache_creation_tokens, cache_read_tokens,
66
+ cache_hit_tokens, cache_miss_tokens, image_tokens, total_context_tokens,
67
+ turns, calls,
68
+ cost_official_usd, cost_official_cny, cost_gateway_usd, cost_gateway_cny)
69
+ VALUES
70
+ (strftime('%Y-%m-%d', ?/1000, 'unixepoch', 'localtime'),
71
+ ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 1, ?, ?, ?, ?)
72
+ ON CONFLICT(day, agent_aid, peer_key, session_id, model, billing_fn) DO UPDATE SET
73
+ peer_type = excluded.peer_type,
74
+ input_tokens = input_tokens + excluded.input_tokens,
75
+ output_tokens = output_tokens + excluded.output_tokens,
76
+ cache_creation_tokens = cache_creation_tokens + excluded.cache_creation_tokens,
77
+ cache_read_tokens = cache_read_tokens + excluded.cache_read_tokens,
78
+ cache_hit_tokens = cache_hit_tokens + excluded.cache_hit_tokens,
79
+ cache_miss_tokens = cache_miss_tokens + excluded.cache_miss_tokens,
80
+ image_tokens = image_tokens + excluded.image_tokens,
81
+ total_context_tokens = total_context_tokens + excluded.total_context_tokens,
82
+ turns = turns + excluded.turns,
83
+ calls = calls + 1,
84
+ cost_official_usd = COALESCE(cost_official_usd, 0) + COALESCE(excluded.cost_official_usd, 0),
85
+ cost_official_cny = COALESCE(cost_official_cny, 0) + COALESCE(excluded.cost_official_cny, 0),
86
+ cost_gateway_usd = COALESCE(cost_gateway_usd, 0) + COALESCE(excluded.cost_gateway_usd, 0),
87
+ cost_gateway_cny = COALESCE(cost_gateway_cny, 0) + COALESCE(excluded.cost_gateway_cny, 0)
88
88
  `).run(event.ts, event.agent_aid, event.peer_key, event.peer_type ?? '', event.session_id ?? '', event.model, event.billing_fn, event.input_tokens, event.output_tokens, event.cache_creation_tokens, event.cache_read_tokens, event.cache_hit_tokens ?? 0, event.cache_miss_tokens ?? 0, event.image_tokens ?? 0, event.total_context_tokens ?? 0, event.turns, prices.official?.usd ?? null, prices.official?.cny ?? null, prices.gateway?.usd ?? null, prices.gateway?.cny ?? null);
89
89
  db.exec('COMMIT');
90
90
  }
@@ -93,12 +93,12 @@ export function insertContextBreakdown(evolcoreHome, bd) {
93
93
  if (!db)
94
94
  return;
95
95
  try {
96
- db.prepare(`
97
- INSERT INTO context_breakdown
98
- (ts, agent_aid, session_id, turn_count, model, max_tokens,
99
- system_prompt, system_tools, mcp_tools, custom_agents,
100
- memory_files, skills, messages, free_space, total_estimated)
101
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
96
+ db.prepare(`
97
+ INSERT INTO context_breakdown
98
+ (ts, agent_aid, session_id, turn_count, model, max_tokens,
99
+ system_prompt, system_tools, mcp_tools, custom_agents,
100
+ memory_files, skills, messages, free_space, total_estimated)
101
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
102
102
  `).run(bd.ts, bd.agent_aid, bd.session_id, bd.turn_count, bd.model, bd.max_tokens, bd.system_prompt ?? null, bd.system_tools ?? null, bd.mcp_tools ?? null, bd.custom_agents ?? null, bd.memory_files ?? null, bd.skills ?? null, bd.messages ?? null, bd.free_space ?? null, bd.total_estimated ?? null);
103
103
  }
104
104
  catch (e) {
@@ -110,10 +110,10 @@ export function insertMessageEvent(evolcoreHome, event) {
110
110
  if (!db)
111
111
  return;
112
112
  try {
113
- db.prepare(`
114
- INSERT INTO message_events
115
- (ts, agent_aid, peer_key, direction, msg_type, bytes, encrypted, chatmode)
116
- VALUES (?, ?, ?, ?, ?, ?, ?, ?)
113
+ db.prepare(`
114
+ INSERT INTO message_events
115
+ (ts, agent_aid, peer_key, direction, msg_type, bytes, encrypted, chatmode)
116
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)
117
117
  `).run(event.ts, event.agent_aid, event.peer_key, event.direction, event.msg_type ?? null, event.bytes, event.encrypted ? 1 : 0, event.chatmode ?? null);
118
118
  }
119
119
  catch (e) {
@@ -128,12 +128,12 @@ export function insertModelCalls(evolcoreHome, rows) {
128
128
  if (!db)
129
129
  return;
130
130
  try {
131
- const stmt = db.prepare(`
132
- INSERT INTO model_calls
133
- (ts, task_id, session_id, agent_session_id, agent_aid, peer_key, call_index, model,
134
- request_id, message_id, input_tokens, output_tokens, cache_creation_tokens,
135
- cache_read_tokens, context_tokens, max_tokens, auto_compact_tokens, degraded)
136
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
131
+ const stmt = db.prepare(`
132
+ INSERT INTO model_calls
133
+ (ts, task_id, session_id, agent_session_id, agent_aid, peer_key, call_index, model,
134
+ request_id, message_id, input_tokens, output_tokens, cache_creation_tokens,
135
+ cache_read_tokens, context_tokens, max_tokens, auto_compact_tokens, degraded)
136
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
137
137
  `);
138
138
  db.exec('BEGIN');
139
139
  for (const r of rows) {
@@ -1,4 +1,8 @@
1
1
  import { logger } from '../utils/logger.js';
2
+ export function isDaemonEventSessionTrigger(trigger) {
3
+ return trigger.feedback.strategy === 'event_session'
4
+ && (trigger.origin?.channelKey === 'daemon' || trigger.origin?.channelType === 'daemon');
5
+ }
2
6
  /** Match a real or simulated event without publishing it to the event bus. */
3
7
  export function matchTriggerEvent(source, event) {
4
8
  if (typeof event.type !== 'string' || !event.type.trim()) {
@@ -34,6 +38,21 @@ export class TriggerEventSource {
34
38
  return;
35
39
  if (event.type.startsWith('trigger:') && event.originTriggerId === trigger.id)
36
40
  return;
41
+ // Dynamic routing is agent-local for ordinary Agent Triggers. A
42
+ // daemon-origin event_session Trigger is explicitly allowed to route
43
+ // the event to the owning Agent discovered from the payload.
44
+ if (trigger.feedback.strategy === 'event_session') {
45
+ const payload = event;
46
+ const daemonScoped = isDaemonEventSessionTrigger(trigger);
47
+ if (daemonScoped && event.type === 'task:error' && payload.originTriggerId === trigger.id)
48
+ return;
49
+ if (typeof payload.agentAid !== 'string' || !payload.agentAid.trim()
50
+ || (!daemonScoped && payload.agentAid !== trigger.agentAid)
51
+ || typeof payload.sessionId !== 'string' || !payload.sessionId)
52
+ return;
53
+ }
54
+ if (event.causation?.trigger?.path.some(node => node.triggerId === trigger.id))
55
+ return;
37
56
  if (!matchTriggerEvent({ type: 'event', eventPattern, ...(filter ? { filter } : {}) }, event).matched)
38
57
  return;
39
58
  this.fire(trigger.id, {