agim-cli 1.2.45 → 1.2.49

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 (434) hide show
  1. package/CHANGELOG.md +340 -0
  2. package/README.md +40 -6
  3. package/README.zh-CN.md +40 -6
  4. package/dist/cli-ui/config-wizard.js +16 -2
  5. package/dist/cli-ui/config-wizard.js.map +1 -1
  6. package/dist/cli-ui/diag.d.ts +29 -0
  7. package/dist/cli-ui/diag.d.ts.map +1 -0
  8. package/dist/cli-ui/diag.js +135 -0
  9. package/dist/cli-ui/diag.js.map +1 -0
  10. package/dist/cli-ui/i18n.d.ts +38 -0
  11. package/dist/cli-ui/i18n.d.ts.map +1 -1
  12. package/dist/cli-ui/i18n.js +101 -0
  13. package/dist/cli-ui/i18n.js.map +1 -1
  14. package/dist/cli-ui/setup-llm.d.ts +30 -0
  15. package/dist/cli-ui/setup-llm.d.ts.map +1 -0
  16. package/dist/cli-ui/setup-llm.js +460 -0
  17. package/dist/cli-ui/setup-llm.js.map +1 -0
  18. package/dist/cli-ui/setup-mcp.d.ts +19 -0
  19. package/dist/cli-ui/setup-mcp.d.ts.map +1 -0
  20. package/dist/cli-ui/setup-mcp.js +308 -0
  21. package/dist/cli-ui/setup-mcp.js.map +1 -0
  22. package/dist/cli-ui/token-menu.js +2 -2
  23. package/dist/cli-ui/token-menu.js.map +1 -1
  24. package/dist/cli.js +121 -22
  25. package/dist/cli.js.map +1 -1
  26. package/dist/core/access-token.d.ts +16 -5
  27. package/dist/core/access-token.d.ts.map +1 -1
  28. package/dist/core/access-token.js +82 -13
  29. package/dist/core/access-token.js.map +1 -1
  30. package/dist/core/agent-cwd.d.ts.map +1 -1
  31. package/dist/core/agent-cwd.js +74 -0
  32. package/dist/core/agent-cwd.js.map +1 -1
  33. package/dist/core/approval-bus.d.ts +22 -0
  34. package/dist/core/approval-bus.d.ts.map +1 -1
  35. package/dist/core/approval-bus.js +93 -0
  36. package/dist/core/approval-bus.js.map +1 -1
  37. package/dist/core/ask-user-router.d.ts +24 -0
  38. package/dist/core/ask-user-router.d.ts.map +1 -0
  39. package/dist/core/ask-user-router.js +84 -0
  40. package/dist/core/ask-user-router.js.map +1 -0
  41. package/dist/core/ask-user-rpc.d.ts +80 -0
  42. package/dist/core/ask-user-rpc.d.ts.map +1 -0
  43. package/dist/core/ask-user-rpc.js +388 -0
  44. package/dist/core/ask-user-rpc.js.map +1 -0
  45. package/dist/core/audit-log.d.ts +1 -1
  46. package/dist/core/audit-log.d.ts.map +1 -1
  47. package/dist/core/audit-log.js.map +1 -1
  48. package/dist/core/commands/builtin.d.ts.map +1 -1
  49. package/dist/core/commands/builtin.js +21 -5
  50. package/dist/core/commands/builtin.js.map +1 -1
  51. package/dist/core/commands/goal.d.ts +3 -0
  52. package/dist/core/commands/goal.d.ts.map +1 -0
  53. package/dist/core/commands/goal.js +240 -0
  54. package/dist/core/commands/goal.js.map +1 -0
  55. package/dist/core/commands/heartbeat.d.ts +3 -0
  56. package/dist/core/commands/heartbeat.d.ts.map +1 -0
  57. package/dist/core/commands/heartbeat.js +219 -0
  58. package/dist/core/commands/heartbeat.js.map +1 -0
  59. package/dist/core/commands/router-compare.d.ts +3 -0
  60. package/dist/core/commands/router-compare.d.ts.map +1 -0
  61. package/dist/core/commands/router-compare.js +81 -0
  62. package/dist/core/commands/router-compare.js.map +1 -0
  63. package/dist/core/commands/router.d.ts.map +1 -1
  64. package/dist/core/commands/router.js +9 -1
  65. package/dist/core/commands/router.js.map +1 -1
  66. package/dist/core/commands/skill.d.ts +3 -0
  67. package/dist/core/commands/skill.d.ts.map +1 -0
  68. package/dist/core/commands/skill.js +91 -0
  69. package/dist/core/commands/skill.js.map +1 -0
  70. package/dist/core/config-schema.d.ts +28 -0
  71. package/dist/core/config-schema.d.ts.map +1 -1
  72. package/dist/core/config-schema.js +124 -0
  73. package/dist/core/config-schema.js.map +1 -1
  74. package/dist/core/goals.d.ts +81 -0
  75. package/dist/core/goals.d.ts.map +1 -0
  76. package/dist/core/goals.js +361 -0
  77. package/dist/core/goals.js.map +1 -0
  78. package/dist/core/heartbeat-store.d.ts +90 -0
  79. package/dist/core/heartbeat-store.d.ts.map +1 -0
  80. package/dist/core/heartbeat-store.js +302 -0
  81. package/dist/core/heartbeat-store.js.map +1 -0
  82. package/dist/core/heartbeat.d.ts +35 -0
  83. package/dist/core/heartbeat.d.ts.map +1 -0
  84. package/dist/core/heartbeat.js +332 -0
  85. package/dist/core/heartbeat.js.map +1 -0
  86. package/dist/core/intent-llm.d.ts +9 -0
  87. package/dist/core/intent-llm.d.ts.map +1 -1
  88. package/dist/core/intent-llm.js +77 -32
  89. package/dist/core/intent-llm.js.map +1 -1
  90. package/dist/core/llm/agent-loop.d.ts +112 -0
  91. package/dist/core/llm/agent-loop.d.ts.map +1 -0
  92. package/dist/core/llm/agent-loop.js +313 -0
  93. package/dist/core/llm/agent-loop.js.map +1 -0
  94. package/dist/core/llm/anthropic-provider.d.ts +53 -0
  95. package/dist/core/llm/anthropic-provider.d.ts.map +1 -0
  96. package/dist/core/llm/anthropic-provider.js +339 -0
  97. package/dist/core/llm/anthropic-provider.js.map +1 -0
  98. package/dist/core/llm/auto-compact.d.ts +35 -0
  99. package/dist/core/llm/auto-compact.d.ts.map +1 -0
  100. package/dist/core/llm/auto-compact.js +149 -0
  101. package/dist/core/llm/auto-compact.js.map +1 -0
  102. package/dist/core/llm/builtin-dispatcher.d.ts +21 -0
  103. package/dist/core/llm/builtin-dispatcher.d.ts.map +1 -0
  104. package/dist/core/llm/builtin-dispatcher.js +196 -0
  105. package/dist/core/llm/builtin-dispatcher.js.map +1 -0
  106. package/dist/core/llm/imhub-dispatcher.d.ts +27 -0
  107. package/dist/core/llm/imhub-dispatcher.d.ts.map +1 -0
  108. package/dist/core/llm/imhub-dispatcher.js +308 -0
  109. package/dist/core/llm/imhub-dispatcher.js.map +1 -0
  110. package/dist/core/llm/index.d.ts +11 -0
  111. package/dist/core/llm/index.d.ts.map +1 -0
  112. package/dist/core/llm/index.js +16 -0
  113. package/dist/core/llm/index.js.map +1 -0
  114. package/dist/core/llm/introspection.d.ts +73 -0
  115. package/dist/core/llm/introspection.d.ts.map +1 -0
  116. package/dist/core/llm/introspection.js +90 -0
  117. package/dist/core/llm/introspection.js.map +1 -0
  118. package/dist/core/llm/mcp-client.d.ts +80 -0
  119. package/dist/core/llm/mcp-client.d.ts.map +1 -0
  120. package/dist/core/llm/mcp-client.js +270 -0
  121. package/dist/core/llm/mcp-client.js.map +1 -0
  122. package/dist/core/llm/mcp-registry.d.ts +57 -0
  123. package/dist/core/llm/mcp-registry.d.ts.map +1 -0
  124. package/dist/core/llm/mcp-registry.js +155 -0
  125. package/dist/core/llm/mcp-registry.js.map +1 -0
  126. package/dist/core/llm/openai-compat-provider.d.ts +65 -0
  127. package/dist/core/llm/openai-compat-provider.d.ts.map +1 -0
  128. package/dist/core/llm/openai-compat-provider.js +451 -0
  129. package/dist/core/llm/openai-compat-provider.js.map +1 -0
  130. package/dist/core/llm/policy-approval-gate.d.ts +30 -0
  131. package/dist/core/llm/policy-approval-gate.d.ts.map +1 -0
  132. package/dist/core/llm/policy-approval-gate.js +86 -0
  133. package/dist/core/llm/policy-approval-gate.js.map +1 -0
  134. package/dist/core/llm/provider-base.d.ts +302 -0
  135. package/dist/core/llm/provider-base.d.ts.map +1 -0
  136. package/dist/core/llm/provider-base.js +222 -0
  137. package/dist/core/llm/provider-base.js.map +1 -0
  138. package/dist/core/llm/registry.d.ts +44 -0
  139. package/dist/core/llm/registry.d.ts.map +1 -0
  140. package/dist/core/llm/registry.js +160 -0
  141. package/dist/core/llm/registry.js.map +1 -0
  142. package/dist/core/llm/secrets.d.ts +46 -0
  143. package/dist/core/llm/secrets.d.ts.map +1 -0
  144. package/dist/core/llm/secrets.js +157 -0
  145. package/dist/core/llm/secrets.js.map +1 -0
  146. package/dist/core/llm/tool-dispatcher.d.ts +37 -0
  147. package/dist/core/llm/tool-dispatcher.d.ts.map +1 -0
  148. package/dist/core/llm/tool-dispatcher.js +85 -0
  149. package/dist/core/llm/tool-dispatcher.js.map +1 -0
  150. package/dist/core/memory-consolidate.d.ts.map +1 -1
  151. package/dist/core/memory-consolidate.js +38 -23
  152. package/dist/core/memory-consolidate.js.map +1 -1
  153. package/dist/core/memory-distill.d.ts.map +1 -1
  154. package/dist/core/memory-distill.js +51 -25
  155. package/dist/core/memory-distill.js.map +1 -1
  156. package/dist/core/memory-rpc.d.ts.map +1 -1
  157. package/dist/core/memory-rpc.js +6 -0
  158. package/dist/core/memory-rpc.js.map +1 -1
  159. package/dist/core/message-sink.d.ts.map +1 -1
  160. package/dist/core/message-sink.js +76 -0
  161. package/dist/core/message-sink.js.map +1 -1
  162. package/dist/core/notification-evaluator.d.ts +49 -0
  163. package/dist/core/notification-evaluator.d.ts.map +1 -0
  164. package/dist/core/notification-evaluator.js +232 -0
  165. package/dist/core/notification-evaluator.js.map +1 -0
  166. package/dist/core/onboarding.d.ts.map +1 -1
  167. package/dist/core/onboarding.js +10 -0
  168. package/dist/core/onboarding.js.map +1 -1
  169. package/dist/core/persona.d.ts +10 -0
  170. package/dist/core/persona.d.ts.map +1 -1
  171. package/dist/core/persona.js +28 -14
  172. package/dist/core/persona.js.map +1 -1
  173. package/dist/core/push-rpc.d.ts +8 -0
  174. package/dist/core/push-rpc.d.ts.map +1 -1
  175. package/dist/core/push-rpc.js +41 -1
  176. package/dist/core/push-rpc.js.map +1 -1
  177. package/dist/core/registry.d.ts.map +1 -1
  178. package/dist/core/registry.js +11 -0
  179. package/dist/core/registry.js.map +1 -1
  180. package/dist/core/render-router.d.ts.map +1 -1
  181. package/dist/core/render-router.js +23 -6
  182. package/dist/core/render-router.js.map +1 -1
  183. package/dist/core/router-compare.d.ts +76 -0
  184. package/dist/core/router-compare.d.ts.map +1 -0
  185. package/dist/core/router-compare.js +253 -0
  186. package/dist/core/router-compare.js.map +1 -0
  187. package/dist/core/router.d.ts.map +1 -1
  188. package/dist/core/router.js +25 -1
  189. package/dist/core/router.js.map +1 -1
  190. package/dist/core/skills/builtin/agim-self/SKILL.md +81 -0
  191. package/dist/core/skills/loader.d.ts +120 -0
  192. package/dist/core/skills/loader.d.ts.map +1 -0
  193. package/dist/core/skills/loader.js +577 -0
  194. package/dist/core/skills/loader.js.map +1 -0
  195. package/dist/core/skills-rpc.d.ts +44 -0
  196. package/dist/core/skills-rpc.d.ts.map +1 -0
  197. package/dist/core/skills-rpc.js +71 -0
  198. package/dist/core/skills-rpc.js.map +1 -0
  199. package/dist/core/types.d.ts +35 -0
  200. package/dist/core/types.d.ts.map +1 -1
  201. package/dist/core/util/format-age.d.ts +20 -0
  202. package/dist/core/util/format-age.d.ts.map +1 -0
  203. package/dist/core/util/format-age.js +86 -0
  204. package/dist/core/util/format-age.js.map +1 -0
  205. package/dist/plugins/agents/acp/acp-adapter.d.ts +3 -0
  206. package/dist/plugins/agents/acp/acp-adapter.d.ts.map +1 -1
  207. package/dist/plugins/agents/acp/acp-adapter.js +12 -0
  208. package/dist/plugins/agents/acp/acp-adapter.js.map +1 -1
  209. package/dist/plugins/agents/antigravity/index.d.ts +1 -0
  210. package/dist/plugins/agents/antigravity/index.d.ts.map +1 -1
  211. package/dist/plugins/agents/antigravity/index.js +1 -0
  212. package/dist/plugins/agents/antigravity/index.js.map +1 -1
  213. package/dist/plugins/agents/claude-code/index.d.ts +1 -0
  214. package/dist/plugins/agents/claude-code/index.d.ts.map +1 -1
  215. package/dist/plugins/agents/claude-code/index.js +1 -0
  216. package/dist/plugins/agents/claude-code/index.js.map +1 -1
  217. package/dist/plugins/agents/claude-code/mcp-approval-server.d.ts +22 -0
  218. package/dist/plugins/agents/claude-code/mcp-approval-server.d.ts.map +1 -1
  219. package/dist/plugins/agents/claude-code/mcp-approval-server.js +157 -0
  220. package/dist/plugins/agents/claude-code/mcp-approval-server.js.map +1 -1
  221. package/dist/plugins/agents/codex/index.d.ts +1 -0
  222. package/dist/plugins/agents/codex/index.d.ts.map +1 -1
  223. package/dist/plugins/agents/codex/index.js +1 -0
  224. package/dist/plugins/agents/codex/index.js.map +1 -1
  225. package/dist/plugins/agents/cursor/ensure-mcp-config.d.ts +43 -0
  226. package/dist/plugins/agents/cursor/ensure-mcp-config.d.ts.map +1 -0
  227. package/dist/plugins/agents/cursor/ensure-mcp-config.js +99 -0
  228. package/dist/plugins/agents/cursor/ensure-mcp-config.js.map +1 -0
  229. package/dist/plugins/agents/cursor/index.d.ts +28 -0
  230. package/dist/plugins/agents/cursor/index.d.ts.map +1 -0
  231. package/dist/plugins/agents/cursor/index.js +290 -0
  232. package/dist/plugins/agents/cursor/index.js.map +1 -0
  233. package/dist/plugins/agents/native/index.d.ts +34 -0
  234. package/dist/plugins/agents/native/index.d.ts.map +1 -0
  235. package/dist/plugins/agents/native/index.js +598 -0
  236. package/dist/plugins/agents/native/index.js.map +1 -0
  237. package/dist/plugins/agents/opencode/opencode-stdio-adapter.d.ts +1 -0
  238. package/dist/plugins/agents/opencode/opencode-stdio-adapter.d.ts.map +1 -1
  239. package/dist/plugins/agents/opencode/opencode-stdio-adapter.js +1 -0
  240. package/dist/plugins/agents/opencode/opencode-stdio-adapter.js.map +1 -1
  241. package/dist/plugins/messengers/wechat/ilink-adapter.d.ts +4 -0
  242. package/dist/plugins/messengers/wechat/ilink-adapter.d.ts.map +1 -1
  243. package/dist/plugins/messengers/wechat/ilink-adapter.js +26 -1
  244. package/dist/plugins/messengers/wechat/ilink-adapter.js.map +1 -1
  245. package/dist/web/agim-skills-api.d.ts +4 -0
  246. package/dist/web/agim-skills-api.d.ts.map +1 -0
  247. package/dist/web/agim-skills-api.js +150 -0
  248. package/dist/web/agim-skills-api.js.map +1 -0
  249. package/dist/web/background-tasks-api.d.ts +7 -0
  250. package/dist/web/background-tasks-api.d.ts.map +1 -0
  251. package/dist/web/background-tasks-api.js +225 -0
  252. package/dist/web/background-tasks-api.js.map +1 -0
  253. package/dist/web/llm-api.d.ts +8 -0
  254. package/dist/web/llm-api.d.ts.map +1 -0
  255. package/dist/web/llm-api.js +300 -0
  256. package/dist/web/llm-api.js.map +1 -0
  257. package/dist/web/mcp-api.d.ts +8 -0
  258. package/dist/web/mcp-api.d.ts.map +1 -0
  259. package/dist/web/mcp-api.js +205 -0
  260. package/dist/web/mcp-api.js.map +1 -0
  261. package/dist/web/public/assets/{a2a-Cdl8iY0e.js → a2a-06bnQicA.js} +3 -3
  262. package/dist/web/public/assets/{a2a-Cdl8iY0e.js.map → a2a-06bnQicA.js.map} +1 -1
  263. package/dist/web/public/assets/{activity-DXahuK1C.js → activity-Bhc6Esfy.js} +2 -2
  264. package/dist/web/public/assets/{activity-DXahuK1C.js.map → activity-Bhc6Esfy.js.map} +1 -1
  265. package/dist/web/public/assets/{admins-C8fJsuHC.js → admins-BVpnOw3o.js} +3 -3
  266. package/dist/web/public/assets/{admins-C8fJsuHC.js.map → admins-BVpnOw3o.js.map} +1 -1
  267. package/dist/web/public/assets/agents-Cn7D3UMz.js +7 -0
  268. package/dist/web/public/assets/agents-Cn7D3UMz.js.map +1 -0
  269. package/dist/web/public/assets/{approvals-CpyL90ef.js → approvals-BJiLyoLf.js} +3 -3
  270. package/dist/web/public/assets/{approvals-CpyL90ef.js.map → approvals-BJiLyoLf.js.map} +1 -1
  271. package/dist/web/public/assets/asks-C7gKbna1.js +7 -0
  272. package/dist/web/public/assets/asks-C7gKbna1.js.map +1 -0
  273. package/dist/web/public/assets/{audit-DDqpiC3z.js → audit-DgWZD8l5.js} +2 -2
  274. package/dist/web/public/assets/{audit-DDqpiC3z.js.map → audit-DgWZD8l5.js.map} +1 -1
  275. package/dist/web/public/assets/bell-pWZT2wlM.js +7 -0
  276. package/dist/web/public/assets/bell-pWZT2wlM.js.map +1 -0
  277. package/dist/web/public/assets/{bgjobs-CAFV-I4I.js → bgjobs-DkAJdzHf.js} +2 -2
  278. package/dist/web/public/assets/{bgjobs-CAFV-I4I.js.map → bgjobs-DkAJdzHf.js.map} +1 -1
  279. package/dist/web/public/assets/{brain-CJyZe3Oa.js → brain-B0mM-ro_.js} +2 -2
  280. package/dist/web/public/assets/{brain-CJyZe3Oa.js.map → brain-B0mM-ro_.js.map} +1 -1
  281. package/dist/web/public/assets/{briefcase-DcLbQF2I.js → briefcase-CUQlj33_.js} +2 -2
  282. package/dist/web/public/assets/{briefcase-DcLbQF2I.js.map → briefcase-CUQlj33_.js.map} +1 -1
  283. package/dist/web/public/assets/{chevron-right-BhKELKvM.js → chevron-right-CJuDP_fx.js} +2 -2
  284. package/dist/web/public/assets/{chevron-right-BhKELKvM.js.map → chevron-right-CJuDP_fx.js.map} +1 -1
  285. package/dist/web/public/assets/{circle-check-D1qST9RS.js → circle-check-CYse8LRx.js} +2 -2
  286. package/dist/web/public/assets/{circle-check-D1qST9RS.js.map → circle-check-CYse8LRx.js.map} +1 -1
  287. package/dist/web/public/assets/{circle-check-big-EKe3o9y1.js → circle-check-big-9NpJLA1Z.js} +2 -2
  288. package/dist/web/public/assets/{circle-check-big-EKe3o9y1.js.map → circle-check-big-9NpJLA1Z.js.map} +1 -1
  289. package/dist/web/public/assets/{circle-x-DtePUX5x.js → circle-x-BxZ24SVG.js} +2 -2
  290. package/dist/web/public/assets/{circle-x-DtePUX5x.js.map → circle-x-BxZ24SVG.js.map} +1 -1
  291. package/dist/web/public/assets/{confirm-dialog-CCfCf6BG.js → confirm-dialog-CmHeZ7ei.js} +2 -2
  292. package/dist/web/public/assets/{confirm-dialog-CCfCf6BG.js.map → confirm-dialog-CmHeZ7ei.js.map} +1 -1
  293. package/dist/web/public/assets/{data-table-BRLUxacD.js → data-table-tu4BIahS.js} +5 -5
  294. package/dist/web/public/assets/{data-table-BRLUxacD.js.map → data-table-tu4BIahS.js.map} +1 -1
  295. package/dist/web/public/assets/{dialog-By4YA8bm.js → dialog-D8QAkLhI.js} +3 -3
  296. package/dist/web/public/assets/{dialog-By4YA8bm.js.map → dialog-D8QAkLhI.js.map} +1 -1
  297. package/dist/web/public/assets/{download-CiTB2sCh.js → download-DBS0ZPTh.js} +2 -2
  298. package/dist/web/public/assets/{download-CiTB2sCh.js.map → download-DBS0ZPTh.js.map} +1 -1
  299. package/dist/web/public/assets/{email-H-b2AExg.js → email-DgbAEEvZ.js} +3 -3
  300. package/dist/web/public/assets/{email-H-b2AExg.js.map → email-DgbAEEvZ.js.map} +1 -1
  301. package/dist/web/public/assets/{empty-state-DZJTUlvz.js → empty-state-B1S_EYNJ.js} +2 -2
  302. package/dist/web/public/assets/{empty-state-DZJTUlvz.js.map → empty-state-B1S_EYNJ.js.map} +1 -1
  303. package/dist/web/public/assets/{external-link-CfU6Rttn.js → external-link-Dkmwlv6p.js} +2 -2
  304. package/dist/web/public/assets/{external-link-CfU6Rttn.js.map → external-link-Dkmwlv6p.js.map} +1 -1
  305. package/dist/web/public/assets/{eye-BvWcd0pJ.js → eye-Ch0DLviZ.js} +4 -4
  306. package/dist/web/public/assets/{eye-BvWcd0pJ.js.map → eye-Ch0DLviZ.js.map} +1 -1
  307. package/dist/web/public/assets/{facts-BRDbQLSI.js → facts-C3YV1Mkp.js} +2 -2
  308. package/dist/web/public/assets/{facts-BRDbQLSI.js.map → facts-C3YV1Mkp.js.map} +1 -1
  309. package/dist/web/public/assets/goals-DEt5gGry.js +17 -0
  310. package/dist/web/public/assets/goals-DEt5gGry.js.map +1 -0
  311. package/dist/web/public/assets/{health-DJPFOiKw.js → health-DuB9uNiZ.js} +2 -2
  312. package/dist/web/public/assets/{health-DJPFOiKw.js.map → health-DuB9uNiZ.js.map} +1 -1
  313. package/dist/web/public/assets/heart-pulse-CD8xNAGs.js +7 -0
  314. package/dist/web/public/assets/heart-pulse-CD8xNAGs.js.map +1 -0
  315. package/dist/web/public/assets/heartbeat-DbR8VwmG.js +7 -0
  316. package/dist/web/public/assets/heartbeat-DbR8VwmG.js.map +1 -0
  317. package/dist/web/public/assets/hot-izk3vGQB.js +17 -0
  318. package/dist/web/public/assets/hot-izk3vGQB.js.map +1 -0
  319. package/dist/web/public/assets/index-B7QRVy9N.css +1 -0
  320. package/dist/web/public/assets/index-BY1vfCja.js +166 -0
  321. package/dist/web/public/assets/index-BY1vfCja.js.map +1 -0
  322. package/dist/web/public/assets/installed-BXB3-YIy.js +31 -0
  323. package/dist/web/public/assets/installed-BXB3-YIy.js.map +1 -0
  324. package/dist/web/public/assets/{jobs-DdWaBgOh.js → jobs-DkbM4mIQ.js} +2 -2
  325. package/dist/web/public/assets/{jobs-DdWaBgOh.js.map → jobs-DkbM4mIQ.js.map} +1 -1
  326. package/dist/web/public/assets/{layout-Dr12u0W_.js → layout-5ePj6Bek.js} +2 -2
  327. package/dist/web/public/assets/{layout-Dr12u0W_.js.map → layout-5ePj6Bek.js.map} +1 -1
  328. package/dist/web/public/assets/layout-B5Dzy_Zc.js +2 -0
  329. package/dist/web/public/assets/layout-B5Dzy_Zc.js.map +1 -0
  330. package/dist/web/public/assets/layout-BZpbNQFb.js +2 -0
  331. package/dist/web/public/assets/layout-BZpbNQFb.js.map +1 -0
  332. package/dist/web/public/assets/layout-DY9Xq34u.js +2 -0
  333. package/dist/web/public/assets/layout-DY9Xq34u.js.map +1 -0
  334. package/dist/web/public/assets/{layout-BybpkTy0.js → layout-DxzBaeTv.js} +2 -2
  335. package/dist/web/public/assets/{layout-BybpkTy0.js.map → layout-DxzBaeTv.js.map} +1 -1
  336. package/dist/web/public/assets/llm-Dg4W7eRM.js +7 -0
  337. package/dist/web/public/assets/llm-Dg4W7eRM.js.map +1 -0
  338. package/dist/web/public/assets/{loader-circle-BiR4Xs-3.js → loader-circle-pGNYdPoE.js} +2 -2
  339. package/dist/web/public/assets/{loader-circle-BiR4Xs-3.js.map → loader-circle-pGNYdPoE.js.map} +1 -1
  340. package/dist/web/public/assets/{map-pin-B8hea8yW.js → map-pin-D1UX9mg7.js} +2 -2
  341. package/dist/web/public/assets/{map-pin-B8hea8yW.js.map → map-pin-D1UX9mg7.js.map} +1 -1
  342. package/dist/web/public/assets/mcp-uoOzu4_J.js +7 -0
  343. package/dist/web/public/assets/mcp-uoOzu4_J.js.map +1 -0
  344. package/dist/web/public/assets/{memos-C0_I1Uzt.js → memos-CAWASHg5.js} +2 -2
  345. package/dist/web/public/assets/{memos-C0_I1Uzt.js.map → memos-CAWASHg5.js.map} +1 -1
  346. package/dist/web/public/assets/{messengers-DuS5_JlE.js → messengers-B1-mZms8.js} +3 -3
  347. package/dist/web/public/assets/{messengers-DuS5_JlE.js.map → messengers-B1-mZms8.js.map} +1 -1
  348. package/dist/web/public/assets/native-agent-UuVvvzsW.js +7 -0
  349. package/dist/web/public/assets/native-agent-UuVvvzsW.js.map +1 -0
  350. package/dist/web/public/assets/{network-CpkocMHV.js → network-DpjSgAwW.js} +2 -2
  351. package/dist/web/public/assets/{network-CpkocMHV.js.map → network-DpjSgAwW.js.map} +1 -1
  352. package/dist/web/public/assets/{outbox-mGqTV2Ex.js → outbox-DeAgiXkY.js} +3 -3
  353. package/dist/web/public/assets/{outbox-mGqTV2Ex.js.map → outbox-DeAgiXkY.js.map} +1 -1
  354. package/dist/web/public/assets/{pagination-BAYvy11u.js → pagination-5GD_he3L.js} +3 -3
  355. package/dist/web/public/assets/{pagination-BAYvy11u.js.map → pagination-5GD_he3L.js.map} +1 -1
  356. package/dist/web/public/assets/{persona-CM0TLPJa.js → persona-BhkDCmeB.js} +2 -2
  357. package/dist/web/public/assets/{persona-CM0TLPJa.js.map → persona-BhkDCmeB.js.map} +1 -1
  358. package/dist/web/public/assets/{play-DMgMpe7N.js → play-B7o6cJ8W.js} +2 -2
  359. package/dist/web/public/assets/{play-DMgMpe7N.js.map → play-B7o6cJ8W.js.map} +1 -1
  360. package/dist/web/public/assets/plus-C5d4C6Zp.js +7 -0
  361. package/dist/web/public/assets/plus-C5d4C6Zp.js.map +1 -0
  362. package/dist/web/public/assets/policy-Ct_sKm3Y.js +2 -0
  363. package/dist/web/public/assets/{policy-Ch-xirrA.js.map → policy-Ct_sKm3Y.js.map} +1 -1
  364. package/dist/web/public/assets/{refresh-ccw-D8mc4hxU.js → refresh-ccw-BlXMN3UX.js} +2 -2
  365. package/dist/web/public/assets/{refresh-ccw-D8mc4hxU.js.map → refresh-ccw-BlXMN3UX.js.map} +1 -1
  366. package/dist/web/public/assets/{reminders-Dbe7Rc4h.js → reminders-gb1Y0S3t.js} +4 -9
  367. package/dist/web/public/assets/reminders-gb1Y0S3t.js.map +1 -0
  368. package/dist/web/public/assets/{save-1aALBaZc.js → save-DAFuApnY.js} +2 -2
  369. package/dist/web/public/assets/{save-1aALBaZc.js.map → save-DAFuApnY.js.map} +1 -1
  370. package/dist/web/public/assets/{schedules-BBQ2wcnS.js → schedules-CtFumT2B.js} +3 -3
  371. package/dist/web/public/assets/{schedules-BBQ2wcnS.js.map → schedules-CtFumT2B.js.map} +1 -1
  372. package/dist/web/public/assets/{search-DDYjsJ7-.js → search-BWuZE0YD.js} +2 -2
  373. package/dist/web/public/assets/{search-DDYjsJ7-.js.map → search-BWuZE0YD.js.map} +1 -1
  374. package/dist/web/public/assets/{service-DMp11TKF.js → service-lah7RWEc.js} +3 -3
  375. package/dist/web/public/assets/{service-DMp11TKF.js.map → service-lah7RWEc.js.map} +1 -1
  376. package/dist/web/public/assets/{status-badge-Cvj81JKi.js → status-badge-BgmFa_8z.js} +2 -2
  377. package/dist/web/public/assets/{status-badge-Cvj81JKi.js.map → status-badge-BgmFa_8z.js.map} +1 -1
  378. package/dist/web/public/assets/{subtasks-BC3Pf7OZ.js → subtasks-CgqrOGhl.js} +3 -3
  379. package/dist/web/public/assets/{subtasks-BC3Pf7OZ.js.map → subtasks-CgqrOGhl.js.map} +1 -1
  380. package/dist/web/public/assets/{table-B6nK6k3L.js → table-BhDzIBvB.js} +2 -2
  381. package/dist/web/public/assets/{table-B6nK6k3L.js.map → table-BhDzIBvB.js.map} +1 -1
  382. package/dist/web/public/assets/{topn-BwFh2jKv.js → topn-DXgTCdM_.js} +3 -3
  383. package/dist/web/public/assets/{topn-BwFh2jKv.js.map → topn-DXgTCdM_.js.map} +1 -1
  384. package/dist/web/public/assets/{trash-2-CqpMjbu5.js → trash-2-i4F_Rzh3.js} +3 -3
  385. package/dist/web/public/assets/{trash-2-CqpMjbu5.js.map → trash-2-i4F_Rzh3.js.map} +1 -1
  386. package/dist/web/public/assets/use-background-tasks-Cq2D7JQJ.js +2 -0
  387. package/dist/web/public/assets/use-background-tasks-Cq2D7JQJ.js.map +1 -0
  388. package/dist/web/public/assets/use-llm-admin-BzOVXSjz.js +2 -0
  389. package/dist/web/public/assets/use-llm-admin-BzOVXSjz.js.map +1 -0
  390. package/dist/web/public/assets/{use-memory-jxZdt-RL.js → use-memory-B_RQWQyG.js} +2 -2
  391. package/dist/web/public/assets/{use-memory-jxZdt-RL.js.map → use-memory-B_RQWQyG.js.map} +1 -1
  392. package/dist/web/public/assets/{use-observability-9TDgLO9y.js → use-observability-CCTN-a71.js} +2 -2
  393. package/dist/web/public/assets/{use-observability-9TDgLO9y.js.map → use-observability-CCTN-a71.js.map} +1 -1
  394. package/dist/web/public/assets/{use-settings-DFB_c2pr.js → use-settings-D4EdDLiK.js} +2 -2
  395. package/dist/web/public/assets/{use-settings-DFB_c2pr.js.map → use-settings-D4EdDLiK.js.map} +1 -1
  396. package/dist/web/public/assets/{use-workspace-C-Eg6yWa.js → use-workspace-BhTEp_QH.js} +2 -2
  397. package/dist/web/public/assets/{use-workspace-C-Eg6yWa.js.map → use-workspace-BhTEp_QH.js.map} +1 -1
  398. package/dist/web/public/assets/useQuery-DmoWKLw3.js +2 -0
  399. package/dist/web/public/assets/{useQuery-rLmHxFp4.js.map → useQuery-DmoWKLw3.js.map} +1 -1
  400. package/dist/web/public/assets/{vector-D9UqmLi6.js → vector-By-cheMu.js} +2 -2
  401. package/dist/web/public/assets/{vector-D9UqmLi6.js.map → vector-By-cheMu.js.map} +1 -1
  402. package/dist/web/public/assets/{viewer-_OpObeWr.js → viewer-CJNrz2iw.js} +3 -3
  403. package/dist/web/public/assets/{viewer-_OpObeWr.js.map → viewer-CJNrz2iw.js.map} +1 -1
  404. package/dist/web/public/assets/{workspace-DSHRdspq.js → workspace-DvYlIAhu.js} +4 -4
  405. package/dist/web/public/assets/{workspace-DSHRdspq.js.map → workspace-DvYlIAhu.js.map} +1 -1
  406. package/dist/web/public/assets/{workspaces-CsBdhbXz.js → workspaces-2pn73O-K.js} +3 -3
  407. package/dist/web/public/assets/{workspaces-CsBdhbXz.js.map → workspaces-2pn73O-K.js.map} +1 -1
  408. package/dist/web/public/assets/{x-D1re-vBd.js → x-5Z_de5zo.js} +2 -2
  409. package/dist/web/public/assets/{x-D1re-vBd.js.map → x-5Z_de5zo.js.map} +1 -1
  410. package/dist/web/public/index.html +2 -2
  411. package/dist/web/server.d.ts.map +1 -1
  412. package/dist/web/server.js +45 -0
  413. package/dist/web/server.js.map +1 -1
  414. package/package.json +2 -2
  415. package/dist/web/public/assets/agents-lrzFDGgX.js +0 -12
  416. package/dist/web/public/assets/agents-lrzFDGgX.js.map +0 -1
  417. package/dist/web/public/assets/hot-CFGHGkqL.js +0 -17
  418. package/dist/web/public/assets/hot-CFGHGkqL.js.map +0 -1
  419. package/dist/web/public/assets/index-C4hk1i67.js +0 -166
  420. package/dist/web/public/assets/index-C4hk1i67.js.map +0 -1
  421. package/dist/web/public/assets/index-Cvacw7Jg.css +0 -1
  422. package/dist/web/public/assets/installed-UONWfKHS.js +0 -7
  423. package/dist/web/public/assets/installed-UONWfKHS.js.map +0 -1
  424. package/dist/web/public/assets/layout-C8_IQRGM.js +0 -2
  425. package/dist/web/public/assets/layout-C8_IQRGM.js.map +0 -1
  426. package/dist/web/public/assets/layout-CxRHLqvi.js +0 -2
  427. package/dist/web/public/assets/layout-CxRHLqvi.js.map +0 -1
  428. package/dist/web/public/assets/layout-LC5zjw1h.js +0 -2
  429. package/dist/web/public/assets/layout-LC5zjw1h.js.map +0 -1
  430. package/dist/web/public/assets/policy-Ch-xirrA.js +0 -2
  431. package/dist/web/public/assets/reminders-Dbe7Rc4h.js.map +0 -1
  432. package/dist/web/public/assets/use-skills-OZKB5x-S.js +0 -2
  433. package/dist/web/public/assets/use-skills-OZKB5x-S.js.map +0 -1
  434. package/dist/web/public/assets/useQuery-rLmHxFp4.js +0 -2
@@ -0,0 +1,290 @@
1
+ // Cursor (`cursor-agent`) agent adapter.
2
+ //
3
+ // CLI surface (observed from `cursor-agent --help` on v2026.05.20+):
4
+ // cursor-agent [flags] [prompt...] # interactive if TTY
5
+ // cursor-agent --print "<prompt>" # headless single-shot
6
+ // cursor-agent --print --output-format stream-json "<prompt>"
7
+ // ↓
8
+ // newline-delimited events: system.init, user, assistant, tool_call,
9
+ // result. Each event carries `session_id` (constant throughout a run).
10
+ // cursor-agent --print --resume <chatId> ... # resume an existing chat
11
+ // cursor-agent --print --continue ... # resume the most recent
12
+ // cursor-agent --print --plan ... # plan mode (read-only)
13
+ // cursor-agent --print --mode ask ... # Q&A mode (read-only)
14
+ // cursor-agent --print --model <id> ... # override model
15
+ // cursor-agent create-chat # pre-create a chat, get id
16
+ //
17
+ // Permissions model:
18
+ // - cursor reads MCP servers from `~/.cursor/mcp.json` (global) or
19
+ // `.cursor/mcp.json` (per-workspace). On adapter init we write the
20
+ // global file with an `imhub` entry pointing at the shared MCP sidecar
21
+ // (the same one claude-code uses). Subsequent tool calls hop through
22
+ // agim's approval-bus exactly like claude-code's.
23
+ // - `--approve-mcps` auto-approves MCP servers (no per-launch prompt;
24
+ // individual `mcp__imhub__*` calls still gate on agim's approval-bus).
25
+ // - `--force` (alias `--yolo`) bypasses cursor's own per-tool confirmation
26
+ // for shell / write / delete actions. Required for headless IM use —
27
+ // there's no interactive TTY to answer prompts. Operators can still
28
+ // deny via agim policy or by editing `~/.cursor/cli-config.json`'s
29
+ // `permissions.deny` array.
30
+ // - `--trust` marks the workspace as trusted; otherwise cursor refuses
31
+ // to start in `--print` mode against an unknown directory.
32
+ //
33
+ // Session lifecycle:
34
+ // - First call: spawn without `--resume`. The first event we see on
35
+ // stdout is `system.init` which carries `session_id`. inspectEvent
36
+ // calls `opts.onAgentSessionId(id)` so cli persists it on the agim
37
+ // Session row.
38
+ // - Subsequent calls: spawn with `--resume <session_id>`. cursor
39
+ // reopens the chat and appends the new turn.
40
+ // - `/new` clears the agim session row's cursor id; next run starts
41
+ // fresh.
42
+ //
43
+ // Authentication:
44
+ // - cursor stores credentials at `~/.cursor/cli-config.json` after
45
+ // `cursor-agent login`. agim runs as the same user, so the file is
46
+ // readable out of the box — no env-var dance needed. Set
47
+ // CURSOR_API_KEY env if the operator prefers a token over OAuth.
48
+ //
49
+ // Default model:
50
+ // - We respect whatever is set in `~/.cursor/cli-config.json`'s
51
+ // `model.modelId`. Operators override per-call via `opts.model` (e.g.
52
+ // `/cs model sonnet-4-thinking <prompt>`) or globally via cli-config.
53
+ import { randomUUID } from 'node:crypto';
54
+ import { existsSync, statSync } from 'node:fs';
55
+ import { mkdir } from 'node:fs/promises';
56
+ import { homedir } from 'node:os';
57
+ import { join } from 'node:path';
58
+ import { AgentBase } from '../../../core/agent-base.js';
59
+ import { approvalBus } from '../../../core/approval-bus.js';
60
+ import { resolveAgentCwd } from '../../../core/agent-cwd.js';
61
+ import { crossSpawn } from '../../../utils/cross-platform.js';
62
+ import { logger as rootLogger } from '../../../core/logger.js';
63
+ import { ensureImhubMcp } from './ensure-mcp-config.js';
64
+ const log = rootLogger.child({ component: 'agent.cursor' });
65
+ const DEFAULT_BIN = 'cursor-agent';
66
+ /** Path to the imhub MCP sidecar JS file. Shared with claude-code /
67
+ * antigravity — the protocol surface is host-agnostic. */
68
+ function sidecarPath() {
69
+ // From dist/plugins/agents/cursor/index.js the sidecar is at:
70
+ // ../claude-code/mcp-approval-server.js
71
+ return new URL('../claude-code/mcp-approval-server.js', import.meta.url).pathname;
72
+ }
73
+ export class CursorAdapter extends AgentBase {
74
+ name = 'cursor';
75
+ aliases = ['cs', 'cur'];
76
+ kind = 'cli';
77
+ /** Cached bin path resolution. null = "haven't probed";
78
+ * undefined = "probed, not found, fall back to bare name". */
79
+ resolvedBin = null;
80
+ /** Have we written the imhub MCP entry to ~/.cursor/mcp.json yet this
81
+ * agim process lifetime? Saves the disk hit on every send. Reset on
82
+ * agim restart so the next run rewrites with the fresh socket path. */
83
+ mcpReady = false;
84
+ get commandName() {
85
+ const override = process.env.IMHUB_CURSOR_BIN;
86
+ if (override)
87
+ return override;
88
+ if (this.resolvedBin !== null)
89
+ return this.resolvedBin ?? DEFAULT_BIN;
90
+ // The official installer puts the bin at `~/.local/bin/cursor-agent`
91
+ // (XDG user-local). systemd-launched agim doesn't source the user's
92
+ // shell rc, so PATH lookup of bare `cursor-agent` often fails even
93
+ // when the binary is right there. Probe the known locations.
94
+ const candidates = [
95
+ join(homedir(), '.local', 'bin', 'cursor-agent'),
96
+ '/usr/local/bin/cursor-agent',
97
+ '/opt/cursor/bin/cursor-agent',
98
+ ];
99
+ for (const p of candidates) {
100
+ try {
101
+ const s = statSync(p);
102
+ if (s.isFile() && (s.mode & 0o111) !== 0) {
103
+ this.resolvedBin = p;
104
+ log.info({ event: 'cursor.bin.resolved', path: p }, 'resolved cursor-agent outside PATH');
105
+ return p;
106
+ }
107
+ }
108
+ catch { /* not here */ }
109
+ }
110
+ this.resolvedBin = undefined;
111
+ return DEFAULT_BIN;
112
+ }
113
+ buildArgs(prompt, opts) {
114
+ const args = ['--print', '--output-format', 'stream-json'];
115
+ // Trust + force are mandatory for headless IM use — cursor refuses
116
+ // to write / shell otherwise and there's no TTY to answer prompts.
117
+ // Operators wanting tighter control can use IMHUB_NATIVE_AGENT_DENYLIST
118
+ // for agim tools and edit `~/.cursor/cli-config.json`'s `permissions.deny`
119
+ // for cursor-side tool gating.
120
+ args.push('--trust', '--force', '--approve-mcps');
121
+ if (opts.model)
122
+ args.push('--model', opts.model);
123
+ if (opts.planMode)
124
+ args.push('--plan');
125
+ if (opts.agentSessionId && !opts.agentSessionResume) {
126
+ // First call with this session id — cursor doesn't have a
127
+ // "--session-id <new>" form like claude-code; the session id is
128
+ // assigned by cursor and surfaced in system.init. Treat
129
+ // pre-supplied id as a resume hint.
130
+ args.push('--resume', opts.agentSessionId);
131
+ }
132
+ else if (opts.agentSessionId) {
133
+ args.push('--resume', opts.agentSessionId);
134
+ }
135
+ args.push(prompt);
136
+ return args;
137
+ }
138
+ async prepareCommand(prompt, opts) {
139
+ let cwd = resolveAgentCwd(this.name, opts);
140
+ if (cwd) {
141
+ try {
142
+ if (!existsSync(cwd))
143
+ await mkdir(cwd, { recursive: true });
144
+ }
145
+ catch (err) {
146
+ log.warn({ event: 'cursor.cwd.mkdir_failed', cwd, err: String(err) }, 'falling back to inherited cwd because workspace dir could not be created');
147
+ cwd = undefined;
148
+ }
149
+ }
150
+ // Append cwd to --workspace so cursor scopes file ops to the per-agent
151
+ // workspace instead of the systemd cwd ("/").
152
+ const baseArgs = this.buildArgs(prompt, opts);
153
+ if (cwd) {
154
+ // Insert before the prompt (last arg). Order matters for cursor's
155
+ // commander parser — flags before positional.
156
+ const promptArg = baseArgs.pop();
157
+ baseArgs.push('--workspace', cwd, promptArg);
158
+ }
159
+ // MCP wiring (one-shot per agim process lifetime).
160
+ const sockPath = approvalBus.getSocketPath();
161
+ if (sockPath && !this.mcpReady) {
162
+ try {
163
+ await ensureImhubMcp({
164
+ command: process.execPath,
165
+ args: [sidecarPath()],
166
+ env: { IMHUB_APPROVAL_SOCK: sockPath },
167
+ });
168
+ this.mcpReady = true;
169
+ }
170
+ catch (err) {
171
+ log.warn({ event: 'cursor.mcp.disabled', err: String(err) }, 'imhub MCP not wired into cursor — agim tools will be invisible to cursor this run');
172
+ }
173
+ }
174
+ // approval-bus registration so mcp__imhub__* tool calls inside the
175
+ // cursor run resolve to this IM thread.
176
+ const { threadId, platform, channelId, userId } = opts;
177
+ const runId = randomUUID();
178
+ let registered = false;
179
+ if (sockPath && threadId && platform && channelId) {
180
+ approvalBus.registerRun(runId, {
181
+ threadId,
182
+ platform,
183
+ userId: userId ?? '',
184
+ channelId,
185
+ callerAgent: this.name,
186
+ ...(typeof opts.parentJobId === 'number' ? { parentJobId: opts.parentJobId } : {}),
187
+ ...(typeof opts.callDepth === 'number' ? { callDepth: opts.callDepth } : {}),
188
+ });
189
+ registered = true;
190
+ log.info({ event: 'cursor.approval.routed', runId, threadId, platform }, 'cursor run routed via approval-bus');
191
+ }
192
+ return {
193
+ args: baseArgs,
194
+ cwd,
195
+ extraEnv: {
196
+ IMHUB_RUN_ID: runId,
197
+ // cursor reads CURSOR_API_KEY if set; otherwise falls back to
198
+ // OAuth creds in ~/.cursor/cli-config.json. Pass HOME through
199
+ // so systemd-stripped env doesn't break the credential lookup.
200
+ HOME: process.env.HOME || homedir(),
201
+ },
202
+ cleanup: async () => {
203
+ if (registered)
204
+ approvalBus.unregisterRun(runId);
205
+ },
206
+ };
207
+ }
208
+ /** Pull the assistant text from a single stream-json event. */
209
+ extractText(event) {
210
+ const e = event;
211
+ if (e.type === 'assistant' && e.message?.content) {
212
+ const parts = [];
213
+ for (const item of e.message.content) {
214
+ if (item.type === 'text' && item.text)
215
+ parts.push(item.text);
216
+ }
217
+ return parts.join('');
218
+ }
219
+ // The terminal `result` event carries the aggregated final answer.
220
+ // We don't double-emit it (assistant events already covered the
221
+ // text); but if the stream skipped intermediate assistant events for
222
+ // some reason, result.result is the fallback.
223
+ return '';
224
+ }
225
+ /** Capture `session_id` from system.init AND token usage from result
226
+ * events so cli persists session resume + audit log records cost
227
+ * (well, tokens — cursor doesn't price client-side). */
228
+ inspectEvent(event, opts) {
229
+ const e = event;
230
+ if (e.type === 'system' && e.subtype === 'init' && typeof e.session_id === 'string') {
231
+ // Only surface if the caller didn't already pin one — saves a
232
+ // pointless SQLite write when resuming an existing session.
233
+ if (!opts.agentSessionId && opts.onAgentSessionId) {
234
+ try {
235
+ opts.onAgentSessionId(e.session_id);
236
+ log.info({ event: 'cursor.session.captured', id: e.session_id }, 'captured fresh cursor session id');
237
+ }
238
+ catch (err) {
239
+ log.debug({ event: 'cursor.session.callback_failed', err: String(err) });
240
+ }
241
+ }
242
+ }
243
+ if (e.type === 'result' && opts.onUsage && e.usage) {
244
+ const u = e.usage;
245
+ const cacheRead = typeof u.cacheReadTokens === 'number' ? u.cacheReadTokens : 0;
246
+ const cacheWrite = typeof u.cacheWriteTokens === 'number' ? u.cacheWriteTokens : 0;
247
+ const rawInput = typeof u.inputTokens === 'number' ? u.inputTokens : 0;
248
+ const tokensInput = rawInput + cacheRead + cacheWrite;
249
+ const tokensOutput = typeof u.outputTokens === 'number' ? u.outputTokens : 0;
250
+ const delta = {};
251
+ if (tokensInput > 0)
252
+ delta.tokensInput = tokensInput;
253
+ if (tokensOutput > 0)
254
+ delta.tokensOutput = tokensOutput;
255
+ if (delta.tokensInput !== undefined || delta.tokensOutput !== undefined) {
256
+ try {
257
+ opts.onUsage(delta);
258
+ }
259
+ catch { /* best-effort */ }
260
+ }
261
+ // cursor doesn't surface USD cost client-side; operators see it on
262
+ // cursor.com/dashboard. costUsd stays unset for cursor turns.
263
+ }
264
+ }
265
+ handleError(_code, stderr, errorMessage) {
266
+ const combined = `${stderr} ${errorMessage}`;
267
+ if (/unauthor|sign in|log in|CURSOR_API_KEY/i.test(combined)) {
268
+ return [
269
+ '🔐 Cursor 未登录 / 凭据过期。',
270
+ ' 在装有 cursor-agent 的机器跑:`cursor-agent login`',
271
+ ' 或设环境变量 CURSOR_API_KEY=<your-key>',
272
+ ].join('\n');
273
+ }
274
+ return null;
275
+ }
276
+ notAvailableMessage() {
277
+ return ('Cursor CLI 未安装。安装:\n' +
278
+ ' curl https://cursor.com/install -fsS | bash\n' +
279
+ '装完后跑一次 `cursor-agent login` 完成首次登录。');
280
+ }
281
+ async isAvailable() {
282
+ return new Promise((resolve) => {
283
+ const proc = crossSpawn(this.commandName, ['--version'], { stdio: 'ignore' });
284
+ proc.on('close', (code) => resolve(code === 0));
285
+ proc.on('error', () => resolve(false));
286
+ });
287
+ }
288
+ }
289
+ export const cursorAdapter = new CursorAdapter();
290
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/plugins/agents/cursor/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import type { AgentAdapter } from '../../../core/types.js';
2
+ /** Read <cwd>/AGENTS.md (if present) and prepare it for injection into
3
+ * the system prompt. Returns '' on missing file / read failure / empty
4
+ * content. Sanitises text length (8000 char cap) and scans for the
5
+ * classic prompt-injection signals ("ignore previous instructions",
6
+ * "always allow", etc.); when matches are found we still inject (the
7
+ * operator likely wrote them deliberately) but log a warn + audit
8
+ * hit so post-incident forensics can correlate. Honours
9
+ * IMHUB_NATIVE_AGENT_ROLE_FILE for a non-default location. */
10
+ export declare function readOperatorRole(cwd: string): string;
11
+ /**
12
+ * Extract media attachments from a prompt string. Messenger adapters
13
+ * (telegram / wechat / discord / feishu / dingtalk) inline a marker like
14
+ * `[图片附件:/abs/path/to/file.jpg]` or `[image attachment: ...]` when a
15
+ * user message carries a media payload. The path is already downloaded
16
+ * to `~/.agim/media/<platform>/...` by the adapter, so we only need to
17
+ * surface it to vision-capable providers; non-vision providers see the
18
+ * original text and can still acknowledge the attachment.
19
+ *
20
+ * Heuristic-safe: matches absolute paths under common image extensions
21
+ * + a path-safety check that the file exists. Anything ambiguous (no
22
+ * extension, file missing, points outside ~/.agim/media) is silently
23
+ * skipped so we never leak random filesystem paths into a vision call.
24
+ */
25
+ export declare function parsePromptMedia(prompt: string): Array<{
26
+ path: string;
27
+ mime?: string;
28
+ }>;
29
+ export declare const nativeAgentAdapter: AgentAdapter;
30
+ /** Lightweight banner for cli.ts boot log. Lets operators see at a
31
+ * glance whether `/cc native` will work before they try it in an IM
32
+ * thread. */
33
+ export declare function describeNativeAgent(): string;
34
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/plugins/agents/native/index.ts"],"names":[],"mappings":"AAyCA,OAAO,KAAK,EACV,YAAY,EAGb,MAAM,wBAAwB,CAAA;AAyG/B;;;;;;;+DAO+D;AAC/D,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAmBpD;AAgGD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAiCvF;AA4UD,eAAO,MAAM,kBAAkB,EAAE,YAAuC,CAAA;AAExE;;cAEc;AACd,wBAAgB,mBAAmB,IAAI,MAAM,CAI5C"}