agim-cli 1.2.149 → 1.2.151

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 (192) hide show
  1. package/CHANGELOG.md +156 -0
  2. package/dist/core/skills/loader.d.ts +92 -0
  3. package/dist/core/skills/loader.d.ts.map +1 -1
  4. package/dist/core/skills/loader.js +381 -68
  5. package/dist/core/skills/loader.js.map +1 -1
  6. package/dist/web/agim-skills-api.d.ts.map +1 -1
  7. package/dist/web/agim-skills-api.js +75 -1
  8. package/dist/web/agim-skills-api.js.map +1 -1
  9. package/dist/web/public/assets/{a2a-Cll3P4QN.js → a2a-BJ4YL13Y.js} +2 -2
  10. package/dist/web/public/assets/{a2a-Cll3P4QN.js.map → a2a-BJ4YL13Y.js.map} +1 -1
  11. package/dist/web/public/assets/{activity-B7T7YFlD.js → activity-Dzy3LsL8.js} +2 -2
  12. package/dist/web/public/assets/{activity-B7T7YFlD.js.map → activity-Dzy3LsL8.js.map} +1 -1
  13. package/dist/web/public/assets/{admins-CN7P018S.js → admins-CUAm5mP9.js} +2 -2
  14. package/dist/web/public/assets/{admins-CN7P018S.js.map → admins-CUAm5mP9.js.map} +1 -1
  15. package/dist/web/public/assets/{agents-Bqgq7GBF.js → agents-CyDJ89HA.js} +2 -2
  16. package/dist/web/public/assets/{agents-Bqgq7GBF.js.map → agents-CyDJ89HA.js.map} +1 -1
  17. package/dist/web/public/assets/{approvals-C8IUJQ_A.js → approvals-i39FaOuk.js} +2 -2
  18. package/dist/web/public/assets/{approvals-C8IUJQ_A.js.map → approvals-i39FaOuk.js.map} +1 -1
  19. package/dist/web/public/assets/{arrow-down-SLWKqtDc.js → arrow-down-BQ-kUumo.js} +2 -2
  20. package/dist/web/public/assets/{arrow-down-SLWKqtDc.js.map → arrow-down-BQ-kUumo.js.map} +1 -1
  21. package/dist/web/public/assets/{arrow-up-BOADc9ce.js → arrow-up-C8L1uMX_.js} +2 -2
  22. package/dist/web/public/assets/{arrow-up-BOADc9ce.js.map → arrow-up-C8L1uMX_.js.map} +1 -1
  23. package/dist/web/public/assets/{asks-C-j-DypC.js → asks-D20T9unh.js} +2 -2
  24. package/dist/web/public/assets/{asks-C-j-DypC.js.map → asks-D20T9unh.js.map} +1 -1
  25. package/dist/web/public/assets/{audit-DQb-RuXh.js → audit-DLENxEeu.js} +2 -2
  26. package/dist/web/public/assets/{audit-DQb-RuXh.js.map → audit-DLENxEeu.js.map} +1 -1
  27. package/dist/web/public/assets/{bell-CV88-ul6.js → bell-IZMkMv1H.js} +2 -2
  28. package/dist/web/public/assets/{bell-CV88-ul6.js.map → bell-IZMkMv1H.js.map} +1 -1
  29. package/dist/web/public/assets/{bgjobs-CDrK0d-W.js → bgjobs-B1lhvGco.js} +2 -2
  30. package/dist/web/public/assets/{bgjobs-CDrK0d-W.js.map → bgjobs-B1lhvGco.js.map} +1 -1
  31. package/dist/web/public/assets/{brain-B7HtSOQU.js → brain-R_LZjZV8.js} +2 -2
  32. package/dist/web/public/assets/{brain-B7HtSOQU.js.map → brain-R_LZjZV8.js.map} +1 -1
  33. package/dist/web/public/assets/{briefcase-mdzuIa__.js → briefcase-BdiZ_zkr.js} +2 -2
  34. package/dist/web/public/assets/{briefcase-mdzuIa__.js.map → briefcase-BdiZ_zkr.js.map} +1 -1
  35. package/dist/web/public/assets/{chat-CSjtY2rN.js → chat-CLZP47Tv.js} +2 -2
  36. package/dist/web/public/assets/{chat-CSjtY2rN.js.map → chat-CLZP47Tv.js.map} +1 -1
  37. package/dist/web/public/assets/{chevron-left-uSfPn636.js → chevron-left-Y59fTozP.js} +2 -2
  38. package/dist/web/public/assets/{chevron-left-uSfPn636.js.map → chevron-left-Y59fTozP.js.map} +1 -1
  39. package/dist/web/public/assets/{chevron-right-CtelqacW.js → chevron-right-x790nj7i.js} +2 -2
  40. package/dist/web/public/assets/{chevron-right-CtelqacW.js.map → chevron-right-x790nj7i.js.map} +1 -1
  41. package/dist/web/public/assets/{circle-check-8dbL-u7O.js → circle-check-DFYX85pc.js} +2 -2
  42. package/dist/web/public/assets/{circle-check-8dbL-u7O.js.map → circle-check-DFYX85pc.js.map} +1 -1
  43. package/dist/web/public/assets/{circle-check-big-D8-svk9a.js → circle-check-big-CSJIRIBe.js} +2 -2
  44. package/dist/web/public/assets/{circle-check-big-D8-svk9a.js.map → circle-check-big-CSJIRIBe.js.map} +1 -1
  45. package/dist/web/public/assets/{circle-x-rUxzIz5P.js → circle-x-Bb8WBDc7.js} +2 -2
  46. package/dist/web/public/assets/{circle-x-rUxzIz5P.js.map → circle-x-Bb8WBDc7.js.map} +1 -1
  47. package/dist/web/public/assets/{clock-CG5dlBGB.js → clock-CjFbXxT9.js} +2 -2
  48. package/dist/web/public/assets/{clock-CG5dlBGB.js.map → clock-CjFbXxT9.js.map} +1 -1
  49. package/dist/web/public/assets/{confirm-dialog-DlUsSur3.js → confirm-dialog-BxRHoNWb.js} +2 -2
  50. package/dist/web/public/assets/{confirm-dialog-DlUsSur3.js.map → confirm-dialog-BxRHoNWb.js.map} +1 -1
  51. package/dist/web/public/assets/{copy-DnC76wFT.js → copy-MTv1G7jQ.js} +2 -2
  52. package/dist/web/public/assets/{copy-DnC76wFT.js.map → copy-MTv1G7jQ.js.map} +1 -1
  53. package/dist/web/public/assets/{data-table-DswkWUfG.js → data-table-CyskwqK3.js} +2 -2
  54. package/dist/web/public/assets/{data-table-DswkWUfG.js.map → data-table-CyskwqK3.js.map} +1 -1
  55. package/dist/web/public/assets/{dialog-Ceo4YuXy.js → dialog-CbUUUyma.js} +2 -2
  56. package/dist/web/public/assets/{dialog-Ceo4YuXy.js.map → dialog-CbUUUyma.js.map} +1 -1
  57. package/dist/web/public/assets/{download-DF-46tS4.js → download-Cuz5HSTK.js} +2 -2
  58. package/dist/web/public/assets/{download-DF-46tS4.js.map → download-Cuz5HSTK.js.map} +1 -1
  59. package/dist/web/public/assets/{email-CZee26-_.js → email-JVBTD9Cm.js} +2 -2
  60. package/dist/web/public/assets/{email-CZee26-_.js.map → email-JVBTD9Cm.js.map} +1 -1
  61. package/dist/web/public/assets/{empty-state-D9Hi0Atm.js → empty-state-mrWiD3Ah.js} +2 -2
  62. package/dist/web/public/assets/{empty-state-D9Hi0Atm.js.map → empty-state-mrWiD3Ah.js.map} +1 -1
  63. package/dist/web/public/assets/{external-link-D64iZa9P.js → external-link-B08yOP0L.js} +2 -2
  64. package/dist/web/public/assets/{external-link-D64iZa9P.js.map → external-link-B08yOP0L.js.map} +1 -1
  65. package/dist/web/public/assets/{eye-sY6WZb7D.js → eye-BSA7oBlI.js} +2 -2
  66. package/dist/web/public/assets/{eye-sY6WZb7D.js.map → eye-BSA7oBlI.js.map} +1 -1
  67. package/dist/web/public/assets/{facts-B7bGGwvi.js → facts-IPC6o6jR.js} +2 -2
  68. package/dist/web/public/assets/{facts-B7bGGwvi.js.map → facts-IPC6o6jR.js.map} +1 -1
  69. package/dist/web/public/assets/{goals-BfQbsvZv.js → goals-CQiFEtCu.js} +2 -2
  70. package/dist/web/public/assets/{goals-BfQbsvZv.js.map → goals-CQiFEtCu.js.map} +1 -1
  71. package/dist/web/public/assets/{health-Ba_mY0Ts.js → health-C2wwtDRS.js} +2 -2
  72. package/dist/web/public/assets/{health-Ba_mY0Ts.js.map → health-C2wwtDRS.js.map} +1 -1
  73. package/dist/web/public/assets/{heart-pulse-BjikOVwU.js → heart-pulse-l8ycLqPJ.js} +2 -2
  74. package/dist/web/public/assets/{heart-pulse-BjikOVwU.js.map → heart-pulse-l8ycLqPJ.js.map} +1 -1
  75. package/dist/web/public/assets/{heartbeat-BM8LlPes.js → heartbeat-CxeGyQ1p.js} +2 -2
  76. package/dist/web/public/assets/{heartbeat-BM8LlPes.js.map → heartbeat-CxeGyQ1p.js.map} +1 -1
  77. package/dist/web/public/assets/{hot-BtuLL6n8.js → hot-CqahuXWL.js} +2 -2
  78. package/dist/web/public/assets/{hot-BtuLL6n8.js.map → hot-CqahuXWL.js.map} +1 -1
  79. package/dist/web/public/assets/{index-DEWFfW_Z.js → index-1mxdI2Ts.js} +11 -11
  80. package/dist/web/public/assets/index-1mxdI2Ts.js.map +1 -0
  81. package/dist/web/public/assets/{index-f1K5Q2Yz.css → index-B5zx5382.css} +1 -1
  82. package/dist/web/public/assets/injection-DTlETF-9.js +2 -0
  83. package/dist/web/public/assets/injection-DTlETF-9.js.map +1 -0
  84. package/dist/web/public/assets/installed-BYrIRWsr.js +31 -0
  85. package/dist/web/public/assets/installed-BYrIRWsr.js.map +1 -0
  86. package/dist/web/public/assets/{jobs-Ddy81Udm.js → jobs-DGKn7wsS.js} +2 -2
  87. package/dist/web/public/assets/{jobs-Ddy81Udm.js.map → jobs-DGKn7wsS.js.map} +1 -1
  88. package/dist/web/public/assets/{layout-Bn2qUxcK.js → layout-5GOGK7pX.js} +2 -2
  89. package/dist/web/public/assets/{layout-Bn2qUxcK.js.map → layout-5GOGK7pX.js.map} +1 -1
  90. package/dist/web/public/assets/{layout-BL74fT-L.js → layout-BNsrCbDd.js} +2 -2
  91. package/dist/web/public/assets/{layout-BL74fT-L.js.map → layout-BNsrCbDd.js.map} +1 -1
  92. package/dist/web/public/assets/{layout-Bp4SAA8_.js → layout-BRwzzJRD.js} +2 -2
  93. package/dist/web/public/assets/{layout-Bp4SAA8_.js.map → layout-BRwzzJRD.js.map} +1 -1
  94. package/dist/web/public/assets/layout-Bov7xJjG.js +2 -0
  95. package/dist/web/public/assets/layout-Bov7xJjG.js.map +1 -0
  96. package/dist/web/public/assets/{layout-CZ9pGnW8.js → layout-CxlJCe_U.js} +2 -2
  97. package/dist/web/public/assets/{layout-CZ9pGnW8.js.map → layout-CxlJCe_U.js.map} +1 -1
  98. package/dist/web/public/assets/{llm-yp7b5xxL.js → llm-pv7DKMXd.js} +2 -2
  99. package/dist/web/public/assets/{llm-yp7b5xxL.js.map → llm-pv7DKMXd.js.map} +1 -1
  100. package/dist/web/public/assets/{loader-circle-Bbw4pEyE.js → loader-circle-D-_gvYI1.js} +2 -2
  101. package/dist/web/public/assets/{loader-circle-Bbw4pEyE.js.map → loader-circle-D-_gvYI1.js.map} +1 -1
  102. package/dist/web/public/assets/{map-pin-DIXHUQgM.js → map-pin-B0I4Ww6U.js} +2 -2
  103. package/dist/web/public/assets/{map-pin-DIXHUQgM.js.map → map-pin-B0I4Ww6U.js.map} +1 -1
  104. package/dist/web/public/assets/{mcp-DyaljIM_.js → mcp-B4NfRtYe.js} +2 -2
  105. package/dist/web/public/assets/{mcp-DyaljIM_.js.map → mcp-B4NfRtYe.js.map} +1 -1
  106. package/dist/web/public/assets/{memos-Dkoc157i.js → memos-C0kKjNm0.js} +2 -2
  107. package/dist/web/public/assets/{memos-Dkoc157i.js.map → memos-C0kKjNm0.js.map} +1 -1
  108. package/dist/web/public/assets/{messengers-CcyGDeUI.js → messengers-BRtpzgyO.js} +2 -2
  109. package/dist/web/public/assets/{messengers-CcyGDeUI.js.map → messengers-BRtpzgyO.js.map} +1 -1
  110. package/dist/web/public/assets/{mobile-DqzIv4Xb.js → mobile-Csr4VGd9.js} +2 -2
  111. package/dist/web/public/assets/{mobile-DqzIv4Xb.js.map → mobile-Csr4VGd9.js.map} +1 -1
  112. package/dist/web/public/assets/{native-agent-BQ7WaRGK.js → native-agent-BBgHqG48.js} +2 -2
  113. package/dist/web/public/assets/{native-agent-BQ7WaRGK.js.map → native-agent-BBgHqG48.js.map} +1 -1
  114. package/dist/web/public/assets/{network-B_yUFAqC.js → network-D-_C1Id9.js} +2 -2
  115. package/dist/web/public/assets/{network-B_yUFAqC.js.map → network-D-_C1Id9.js.map} +1 -1
  116. package/dist/web/public/assets/{outbox-l8aVOZqO.js → outbox-D-k0S4z0.js} +2 -2
  117. package/dist/web/public/assets/{outbox-l8aVOZqO.js.map → outbox-D-k0S4z0.js.map} +1 -1
  118. package/dist/web/public/assets/{pagination-BAKRGKa9.js → pagination-H9_6NsCl.js} +2 -2
  119. package/dist/web/public/assets/{pagination-BAKRGKa9.js.map → pagination-H9_6NsCl.js.map} +1 -1
  120. package/dist/web/public/assets/{persona-D3VL9Rg1.js → persona-C_8JNYfR.js} +2 -2
  121. package/dist/web/public/assets/{persona-D3VL9Rg1.js.map → persona-C_8JNYfR.js.map} +1 -1
  122. package/dist/web/public/assets/{plans-BBB5e9my.js → plans-D6YmQW_N.js} +2 -2
  123. package/dist/web/public/assets/{plans-BBB5e9my.js.map → plans-D6YmQW_N.js.map} +1 -1
  124. package/dist/web/public/assets/{play-7-Wd369f.js → play-CzbLMGqe.js} +2 -2
  125. package/dist/web/public/assets/{play-7-Wd369f.js.map → play-CzbLMGqe.js.map} +1 -1
  126. package/dist/web/public/assets/{plus-B0sfZy-j.js → plus-DHmf4GJ2.js} +2 -2
  127. package/dist/web/public/assets/{plus-B0sfZy-j.js.map → plus-DHmf4GJ2.js.map} +1 -1
  128. package/dist/web/public/assets/{policy-BM1WRXH0.js → policy-BN_bs6Io.js} +2 -2
  129. package/dist/web/public/assets/{policy-BM1WRXH0.js.map → policy-BN_bs6Io.js.map} +1 -1
  130. package/dist/web/public/assets/{qr-code-DcKs5fi3.js → qr-code-DnK1SL3l.js} +2 -2
  131. package/dist/web/public/assets/{qr-code-DcKs5fi3.js.map → qr-code-DnK1SL3l.js.map} +1 -1
  132. package/dist/web/public/assets/{refresh-ccw-uNKeBeRl.js → refresh-ccw-DSNfamTD.js} +2 -2
  133. package/dist/web/public/assets/{refresh-ccw-uNKeBeRl.js.map → refresh-ccw-DSNfamTD.js.map} +1 -1
  134. package/dist/web/public/assets/{reminders-DHM8K0_O.js → reminders-BCfQpyhh.js} +2 -2
  135. package/dist/web/public/assets/{reminders-DHM8K0_O.js.map → reminders-BCfQpyhh.js.map} +1 -1
  136. package/dist/web/public/assets/{save-qwJa5_SA.js → save-B6RwcyoS.js} +2 -2
  137. package/dist/web/public/assets/{save-qwJa5_SA.js.map → save-B6RwcyoS.js.map} +1 -1
  138. package/dist/web/public/assets/{schedules-Bcd0wbT4.js → schedules-Djaw4gdH.js} +2 -2
  139. package/dist/web/public/assets/{schedules-Bcd0wbT4.js.map → schedules-Djaw4gdH.js.map} +1 -1
  140. package/dist/web/public/assets/{search-BUlzNWrj.js → search-DW9n3_SF.js} +2 -2
  141. package/dist/web/public/assets/{search-BUlzNWrj.js.map → search-DW9n3_SF.js.map} +1 -1
  142. package/dist/web/public/assets/{search-i1tP2maJ.js → search-Dyl0DQcw.js} +2 -2
  143. package/dist/web/public/assets/{search-i1tP2maJ.js.map → search-Dyl0DQcw.js.map} +1 -1
  144. package/dist/web/public/assets/{security-DgJyTT4g.js → security-BLuVCXkh.js} +2 -2
  145. package/dist/web/public/assets/{security-DgJyTT4g.js.map → security-BLuVCXkh.js.map} +1 -1
  146. package/dist/web/public/assets/{service-A0Hzear0.js → service-DBpd7pkl.js} +2 -2
  147. package/dist/web/public/assets/{service-A0Hzear0.js.map → service-DBpd7pkl.js.map} +1 -1
  148. package/dist/web/public/assets/{shield-alert-DrnN6fz_.js → shield-alert-CdF1C1OF.js} +2 -2
  149. package/dist/web/public/assets/{shield-alert-DrnN6fz_.js.map → shield-alert-CdF1C1OF.js.map} +1 -1
  150. package/dist/web/public/assets/{status-badge-Ryzf96Pl.js → status-badge-BCIoenPM.js} +2 -2
  151. package/dist/web/public/assets/{status-badge-Ryzf96Pl.js.map → status-badge-BCIoenPM.js.map} +1 -1
  152. package/dist/web/public/assets/{subtasks-Bzh3o3EF.js → subtasks-ZimmkSar.js} +2 -2
  153. package/dist/web/public/assets/{subtasks-Bzh3o3EF.js.map → subtasks-ZimmkSar.js.map} +1 -1
  154. package/dist/web/public/assets/{table-BbAOSyc8.js → table-Bm0gEvxM.js} +2 -2
  155. package/dist/web/public/assets/{table-BbAOSyc8.js.map → table-Bm0gEvxM.js.map} +1 -1
  156. package/dist/web/public/assets/{topn-DkhYw-Gp.js → topn-CIqrKIEG.js} +2 -2
  157. package/dist/web/public/assets/{topn-DkhYw-Gp.js.map → topn-CIqrKIEG.js.map} +1 -1
  158. package/dist/web/public/assets/{trash-2-CA0cLpnU.js → trash-2-C5e_ChRg.js} +2 -2
  159. package/dist/web/public/assets/{trash-2-CA0cLpnU.js.map → trash-2-C5e_ChRg.js.map} +1 -1
  160. package/dist/web/public/assets/use-agim-skills-DpOfgXTF.js +2 -0
  161. package/dist/web/public/assets/use-agim-skills-DpOfgXTF.js.map +1 -0
  162. package/dist/web/public/assets/{use-background-tasks-B64YjlA8.js → use-background-tasks-P7MRkIjy.js} +2 -2
  163. package/dist/web/public/assets/{use-background-tasks-B64YjlA8.js.map → use-background-tasks-P7MRkIjy.js.map} +1 -1
  164. package/dist/web/public/assets/{use-llm-admin-DY2axI4D.js → use-llm-admin-5KWvGX-n.js} +2 -2
  165. package/dist/web/public/assets/{use-llm-admin-DY2axI4D.js.map → use-llm-admin-5KWvGX-n.js.map} +1 -1
  166. package/dist/web/public/assets/{use-memory-BYEjVWbU.js → use-memory-D1oAiAgA.js} +2 -2
  167. package/dist/web/public/assets/{use-memory-BYEjVWbU.js.map → use-memory-D1oAiAgA.js.map} +1 -1
  168. package/dist/web/public/assets/{use-observability-Coj02yDo.js → use-observability-DmZsQEH6.js} +2 -2
  169. package/dist/web/public/assets/{use-observability-Coj02yDo.js.map → use-observability-DmZsQEH6.js.map} +1 -1
  170. package/dist/web/public/assets/{use-settings-i1MhlkyC.js → use-settings-C35Hb-qN.js} +2 -2
  171. package/dist/web/public/assets/{use-settings-i1MhlkyC.js.map → use-settings-C35Hb-qN.js.map} +1 -1
  172. package/dist/web/public/assets/{use-workspace-DgEM35PY.js → use-workspace-CMhnIsjv.js} +2 -2
  173. package/dist/web/public/assets/{use-workspace-DgEM35PY.js.map → use-workspace-CMhnIsjv.js.map} +1 -1
  174. package/dist/web/public/assets/{useQuery-CY2iazjN.js → useQuery-qIxOSePS.js} +2 -2
  175. package/dist/web/public/assets/{useQuery-CY2iazjN.js.map → useQuery-qIxOSePS.js.map} +1 -1
  176. package/dist/web/public/assets/{vector-Ic76u2hY.js → vector-DpAG-MwT.js} +2 -2
  177. package/dist/web/public/assets/{vector-Ic76u2hY.js.map → vector-DpAG-MwT.js.map} +1 -1
  178. package/dist/web/public/assets/{viewer-BXbUN1Rl.js → viewer-oV2bNGun.js} +2 -2
  179. package/dist/web/public/assets/{viewer-BXbUN1Rl.js.map → viewer-oV2bNGun.js.map} +1 -1
  180. package/dist/web/public/assets/{workspace-CUg0JPn6.js → workspace-ndMN69ms.js} +2 -2
  181. package/dist/web/public/assets/{workspace-CUg0JPn6.js.map → workspace-ndMN69ms.js.map} +1 -1
  182. package/dist/web/public/assets/{workspaces-C-wb5FQj.js → workspaces-CQd3UL8p.js} +2 -2
  183. package/dist/web/public/assets/{workspaces-C-wb5FQj.js.map → workspaces-CQd3UL8p.js.map} +1 -1
  184. package/dist/web/public/assets/{x-D1iSuoqg.js → x-BbSX_WMw.js} +2 -2
  185. package/dist/web/public/assets/{x-D1iSuoqg.js.map → x-BbSX_WMw.js.map} +1 -1
  186. package/dist/web/public/index.html +2 -2
  187. package/package.json +1 -1
  188. package/dist/web/public/assets/index-DEWFfW_Z.js.map +0 -1
  189. package/dist/web/public/assets/installed-Xr8p31ij.js +0 -31
  190. package/dist/web/public/assets/installed-Xr8p31ij.js.map +0 -1
  191. package/dist/web/public/assets/layout-pasFRkKV.js +0 -2
  192. package/dist/web/public/assets/layout-pasFRkKV.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -4,6 +4,162 @@ All notable changes to this project will be documented in this file.
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [1.2.151] - 2026-06-13
8
+
9
+ ### Changed (skills injection — workspace 完整注入铁律 + 编辑入口)
10
+
11
+ v1.2.150 的 cluster 压缩对 workspace 太狠:35 个 `fin-data-*` 折成一行
12
+ `fin-data-* (35): name1 · name2 · …` 后 LLM 路由质量下降——只剩名字猜,没了
13
+ description 关键词。运营者亲装的 workspace skill 是最强 "我要用" 信号,
14
+ 不应该为省 token 牺牲精度。
15
+
16
+ #### 铁律:workspace 完整注入,不折叠
17
+
18
+ `buildSkillsSummary` 拆出 `buildAutoInjectionBlock(all)`,bucket 3(workspace)
19
+ 重新走 `renderSkillRow`(完整描述行):
20
+
21
+ - bucket 0/1/3 全部 full row(agim 框架 / agim builtin / **workspace**)
22
+ - bucket 2 ECC picks 仍 full row(20 个 curated 推荐)
23
+ - 只有 bucket 4(ECC remainder 210 个)才 cluster
24
+
25
+ #### 渲染顺序调整:0 → 1 → 3 → 2 → 4
26
+
27
+ workspace 排在 ECC picks 之前。运营者亲装 > 框架预选 > ECC remainder。
28
+
29
+ #### cluster refine bug fix
30
+
31
+ 旧实现遇到"所有成员都在单个 sub-key 下"(例如全部 `fin-data-*` skill 都共享
32
+ 2 段前缀)时 bottom out 不再递归,导致 fin-data 全部折成一行 cluster。
33
+ 现在加分支:单 sub-key 占全部成员时自动 `segDepth+1` 继续细分,
34
+ 所以 `fin-data-aspd-*` / `fin-data-stock-*` / `fin-data-fund-*` 会拆成
35
+ 独立 cluster 而非合并。
36
+
37
+ #### 编辑入口:~/.agim/skill-injection-override.md
38
+
39
+ 运营者可以覆盖自动生成的 skill 块。文件存在且非空时,**全文替换** auto block
40
+ (路由头 + always-on body 保留)。三个 helper:
41
+ `readInjectionOverride / writeInjectionOverride / deleteInjectionOverride`。
42
+ 环境变量 `IMHUB_SKILLS_INJECTION_OVERRIDE_PATH` 可改路径(测试用)。
43
+
44
+ #### Admin API + SPA 页
45
+
46
+ - `GET /api/agim-skills/injection` → 返回 `{ auto, override, overrideActive, overridePath, maxOverrideChars }`
47
+ - `PUT /api/agim-skills/injection` body `{ body: string }` → 写 override(空 body=删除;>40k 字符 413)
48
+ - `DELETE /api/agim-skills/injection` → 清除 override
49
+ - 受现有 `/api/agim-skills/*` admin allowlist 守卫
50
+ - 新页面 `/settings/agim-skills/injection`:auto 只读 textarea + override 可编辑 textarea +
51
+ Save / Clear / Copy-auto / Refresh 按钮 + 字符计数 + ≥10k 警告
52
+ - 中英 i18n 全套
53
+
54
+ #### 新增 env knob
55
+
56
+ - `IMHUB_SKILLS_ECC_PICKS=name1,name2,...` 覆盖默认 20 picks(推荐池)
57
+ - `IMHUB_SKILLS_INJECT_ECC_REMAINDER=on|off|name-list`:
58
+ - `on`(默认):cluster 模式
59
+ - `off`:完全抑制 ECC remainder 块(省 token)
60
+ - 逗号分隔白名单:只保留指定 skill
61
+
62
+ ### Files
63
+
64
+ - `src/core/skills/loader.ts` — workspace 完整注入 + 顺序调整 + refine bug fix +
65
+ env knob 解析(`resolveEccTopPicks` / `resolveEccRemainderMode`)+
66
+ override 文件 helper(read / write / delete / `injectionOverridePath`)+
67
+ `buildAutoInjectionBlock` 导出供 API 预览
68
+ - `src/web/agim-skills-api.ts` — 新 GET/PUT/DELETE `/api/agim-skills/injection`
69
+ - `src/web/agim-skills-api.test.ts` — +5 case(GET 元数据 / PUT 保存 / DELETE / 空 body=删 / 413 超限)
70
+ - `src/web-app/src/hooks/use-agim-skills.ts` — `useSkillInjection / Save / Delete`
71
+ - `src/web-app/src/routes/settings/agim-skills/injection.tsx` — 新页面
72
+ - `src/web-app/src/routes/settings/agim-skills/layout.tsx` — tab 新增"系统提示注入"
73
+ - `src/web-app/src/router.tsx` — 注册新 route
74
+ - `src/web-app/src/i18n/locales/{zh,en}/settings.json` — `skillInjection.*` 文案
75
+ - `src/core/skills/loader.test.ts` — +5 case(refine 单 sub-key 递归 / picks env / remainder off / remainder allowlist / override 全文替换);2 case 旧断言更新(workspace 不聚类 / workspace 排在 ECC picks 前)
76
+
77
+ ### Tests
78
+
79
+ - `loader.test.ts`:42/42 全过
80
+ - `agim-skills-api.test.ts`:19/19 全过
81
+ - typecheck 干净(search.tsx 是历史遗留,不归本 PR)
82
+ - SPA build 干净(`injection-*.js` chunk 已生成)
83
+
84
+ ## [1.2.150] - 2026-06-12
85
+
86
+ ### Changed (skills system-prompt injection — cluster-aware compression)
87
+
88
+ v1.2.149 的固定 32 行排序在 builtin 加了 230 ECC 后产生回归:
89
+ **用户业务 skill(workspace 源的 fin-data-* / ash-* / 白猪 / 等)全部跌出 top 32**,
90
+ LLM 看不到 description → 无法 route。
91
+
92
+ #### 新模型:按桶 + cluster 压缩
93
+
94
+ `buildSkillsSummary` 重写为"按桶+ cluster"输出:
95
+
96
+ - **Bucket 0–2**:逐行完整 description(curated 小集合,需要颗粒度)
97
+ - 0 = `agim-*` 框架(4)
98
+ - 1 = 非 ECC builtin(github / image-generation / long-goal / my / skill-creator / summarize / tmux / weather)
99
+ - 2 = ECC pinned 推荐(20)
100
+ - **Bucket 3(workspace)**:≥3 个同前缀 skill 自动 cluster——一行块标注 `prefix-* (N)` + 全名 + 短指引;singleton 仍 full row。运营者业务 skill(如 60 个 `fin-data-*`)只用 ~500 字符就能让 **LLM 看到所有名字 + 触发关键词**,而非吃掉 12000 字符 description 预算
101
+ - **Bucket 4(ECC 余下 210)**:cluster + name-only 输出(无 trigger hint)。LLM 看得到这 210 个名字,但要触发时按 description 关键词或显式 `read_skill('exact-name')` 拉全文
102
+
103
+ #### `clusterSkills(skills, minSize=3)` 算法(pure helper)
104
+
105
+ 按 dash-segment 分层 group:先一段(`fin-*`),≥3 个则尝试细化到二段(`fin-data-*` 单独成 cluster)……最多 3 段深。Cluster prefix 取实际**最长公共段前缀**,所以 35 个 `fin-data-s000..s034` 合成一个 `fin-data` cluster,不是浅 `fin`。
106
+
107
+ #### 重新分桶(rankSkillBucket)
108
+
109
+ - workspace 与 ECC 余下 split 开(之前混在 bucket 3):
110
+ - workspace → bucket 3(按运营者意图—亲装的优先 cluster 露出,trigger hint 详细)
111
+ - ECC 余下 → bucket 4(aggressive cluster,仅名字)
112
+
113
+ #### 实测(agim 默认 builtin)
114
+
115
+ ```
116
+ ## Framework (agim-* — …) (4)
117
+ - agim-memory: …(full row)
118
+ - agim-reminders: …
119
+ - agim-self: …
120
+ - agim-skill-discovery: …
121
+
122
+ ## Agim builtin (8)
123
+ - github: … / image-generation / long-goal / my / skill-creator / summarize / tmux / weather
124
+
125
+ ## ECC harness + methodology picks (recommended) (20)
126
+ - agent-eval / agent-harness-construction / agent-introspection-debugging / agentic-engineering
127
+ / architecture-decision-records / article-writing / autonomous-* / benchmark / blueprint
128
+ / code-tour / coding-standards / content-engine / context-budget / continuous-learning-v2
129
+ / cost-aware-llm-pipeline / prompt-optimizer / security-review / tdd-workflow / verification-loop
130
+
131
+ ## ECC remainder (read full description via mcp__imhub__read_skill) (210)
132
+ - django-* (5): django-celery · django-patterns · django-security · django-tdd · django-verification
133
+ - kotlin-* (5): kotlin-coroutines-flows · kotlin-exposed-patterns · kotlin-ktor-patterns
134
+ · kotlin-patterns · kotlin-testing
135
+ - laravel-* (5): laravel-{patterns, plugin-discovery, security, tdd, verification}
136
+ - springboot-* (4): springboot-{patterns, security, tdd, verification}
137
+ - quarkus-* (4): quarkus-{patterns, security, tdd, verification}
138
+ - orch-* (6): orch-add-feature · orch-build-mvp · orch-change-feature · …
139
+ - … 14 个 cluster 共 56 skill + (other ECC, 154 个) name 列表
140
+ ```
141
+
142
+ #### Token 预算
143
+
144
+ - v1.2.149 old: 32 行 × ~200 chars = ~1700 tokens(32 个 skill 露脸)
145
+ - v1.2.150 new: ~3300 tokens(**241 builtin + workspace skill 全部露脸**)
146
+ - net: token +~1600,但**每个 skill 的"存在感"露出**——对 LLM routing 是巨大改善
147
+ - 用户有 ~80 workspace skill 时,预计 +~500 tokens 加 workspace cluster;总 ~3800 tokens
148
+
149
+ #### `always: true` 行为
150
+
151
+ 原本只走 visible 32;现在改成扫所有 buckets,按 `s.always && s.available` 来内联——
152
+ operator 主动标 `always: true` 的少数 skill 仍可正常 inline。
153
+
154
+ ### Files
155
+
156
+ - `src/core/skills/loader.ts` — 新增 `SkillCluster` interface + `clusterSkills` pure function + cluster-aware `buildSkillsSummary` + bucket 3/4 split in `rankSkillBucket`
157
+ - `src/core/skills/loader.test.ts` — 更新 2 case(bucket order workspace=3 / ECC remainder=4;cap test 改为验证 cluster 块)
158
+
159
+ ### Tests
160
+
161
+ 37/37 全过,typecheck 双绿,build 8.2s。
162
+
7
163
  ## [1.2.149] - 2026-06-12
8
164
 
9
165
  ### Fixed (ECC pack — folded-description parser bug)
@@ -104,6 +104,40 @@ export declare function getSkillByName(name: string): SkillMeta | null;
104
104
  * unknown name OR read failure. Honors the MAX_SKILL_BODY_CHARS cap;
105
105
  * oversize files come back truncated with a `[truncated …]` footer. */
106
106
  export declare function readSkillBody(name: string): string | null;
107
+ /**
108
+ * v1.2.151 — Resolve the active ECC top-pick set. Operators can override
109
+ * via `IMHUB_SKILLS_ECC_PICKS=name1,name2,...`. An empty or unset value
110
+ * falls back to the default 20-name list. Validation is intentionally
111
+ * forgiving: unknown names pass through (they just become no-ops when
112
+ * the named skill isn't installed).
113
+ */
114
+ export declare function resolveEccTopPicks(): ReadonlySet<string>;
115
+ /**
116
+ * v1.2.151 — ECC remainder injection policy. Default `on` emits the
117
+ * cluster block. `off` suppresses it entirely (token-saving for ops
118
+ * who only want the recommended picks). A comma-list value flips to
119
+ * "allowlist" mode: only remainder skills in the list are emitted.
120
+ */
121
+ type EccRemainderMode = {
122
+ mode: 'on';
123
+ } | {
124
+ mode: 'off';
125
+ } | {
126
+ mode: 'allowlist';
127
+ names: Set<string>;
128
+ };
129
+ export declare function resolveEccRemainderMode(): EccRemainderMode;
130
+ export declare function injectionOverridePath(): string;
131
+ /** Read the override file. Returns the trimmed body, or null when the
132
+ * file is missing / empty / unreadable. Never throws. */
133
+ export declare function readInjectionOverride(): string | null;
134
+ /** Write (or replace) the override file. The caller is responsible for
135
+ * authorization — this is a thin filesystem helper. Returns true on
136
+ * success, false on any disk error. */
137
+ export declare function writeInjectionOverride(body: string): boolean;
138
+ /** Delete the override file. Returns true when a file was actually
139
+ * removed (or already gone), false on filesystem error. */
140
+ export declare function deleteInjectionOverride(): boolean;
107
141
  /**
108
142
  * v1.2.149 — Rank a skill into one of four buckets for system-prompt
109
143
  * injection. Lower rank wins (fills the visible 32 first). Within a
@@ -127,5 +161,63 @@ export declare function readSkillBody(name: string): string | null;
127
161
  * homelab skills. Both belong in the on-demand pool, not the cap.
128
162
  */
129
163
  export declare function rankSkillBucket(s: SkillMeta): number;
164
+ /**
165
+ * v1.2.150 — A prefix-based skill cluster. Many skills sharing a name
166
+ * prefix (`fin-data-aspd-*`, `white-pig-*`, …) get collapsed into one
167
+ * block: title + name list + brief trigger hint. The LLM still sees
168
+ * every skill name, just not every full description; it can call
169
+ * `read_skill('exact-name')` for granular content.
170
+ */
171
+ export interface SkillCluster {
172
+ /** The shared prefix, e.g. "fin-data-aspd" or "white-pig". */
173
+ prefix: string;
174
+ /** Skill names in the cluster, alphabetically sorted. */
175
+ names: string[];
176
+ /** One-line trigger summary derived from member descriptions
177
+ * (best effort). Empty when descriptions are unhelpful. */
178
+ triggerHint: string;
179
+ }
180
+ /**
181
+ * v1.2.150 — Pure helper: group `skills` into prefix-based clusters.
182
+ *
183
+ * Algorithm:
184
+ * 1. Group by first dash-segment (`fin-data-aspd-*` → key `fin`).
185
+ * 2. For groups of size ≥ minSize, try refining to TWO segments
186
+ * (`fin-data-*`). If at least 2 two-segment sub-groups themselves
187
+ * reach minSize, emit each sub-group as a cluster and the leftover
188
+ * single-segment-only members as a fallback `<seg1>-*` cluster.
189
+ * 3. Sub-clustering attempts also at THREE segments before bottoming
190
+ * out, so `fin-data-aspd-*` peels off `fin-data-aspd` instead of
191
+ * drowning in a generic `fin-data`.
192
+ * 4. Skills that don't land in any cluster (≤ minSize − 1 with their
193
+ * prefix peers) are returned as singletons; the caller renders
194
+ * them as individual rows.
195
+ *
196
+ * Pure / deterministic — same input always yields same output.
197
+ */
198
+ export declare function clusterSkills(skills: ReadonlyArray<SkillMeta>, minSize?: number): {
199
+ clusters: SkillCluster[];
200
+ singletons: SkillMeta[];
201
+ };
202
+ /**
203
+ * v1.2.151 — Build the auto-generated tier-1 block (no header, no
204
+ * always-on bodies — caller wraps). Separated so the SPA editor can
205
+ * preview "what would auto produce right now" via the admin API.
206
+ *
207
+ * Bucket render order:
208
+ * 0 framework → 1 builtin → **3 workspace** → 2 ECC picks → 4 ECC remainder
209
+ *
210
+ * Operator-installed workspace skills out-rank ECC pinned picks because
211
+ * they are the strongest "I want this" signal. ECC picks (curated
212
+ * harness vocabulary) come right after so the LLM still has them
213
+ * within reach. ECC remainder lives at the bottom as the on-demand
214
+ * pool.
215
+ *
216
+ * Buckets 0/1/2/3 all emit full rows (renderSkillRow). Only bucket 4
217
+ * (ECC remainder) clusters — and even then, the cluster path can be
218
+ * disabled or scoped via `IMHUB_SKILLS_INJECT_ECC_REMAINDER`.
219
+ */
220
+ export declare function buildAutoInjectionBlock(all: ReadonlyArray<SkillMeta>): string;
130
221
  export declare function buildSkillsSummary(): string;
222
+ export {};
131
223
  //# sourceMappingURL=loader.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/core/skills/loader.ts"],"names":[],"mappings":"AAiDA;;sEAEsE;AACtE,eAAO,MAAM,oBAAoB,QAAS,CAAA;AAE1C;;gDAEgD;AAChD,eAAO,MAAM,qBAAqB,MAAM,CAAA;AAExC;;oDAEoD;AACpD,eAAO,MAAM,mBAAmB,KAAK,CAAA;AAErC,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,4EAA4E;IAC5E,MAAM,EAAE,WAAW,GAAG,SAAS,CAAA;IAC/B,mEAAmE;IACnE,GAAG,EAAE,MAAM,CAAA;IACX;;2DAEuD;IACvD,MAAM,EAAE,OAAO,CAAA;IACf;qCACiC;IACjC,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB;0DACsD;IACtD,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB;;0EAEsE;IACtE,SAAS,EAAE,OAAO,CAAA;IAClB,qDAAqD;IACrD,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B;;mEAE+D;IAC/D,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAmCD,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAA;AA4BxD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CAiB7C;AAED;sEACsE;AACtE,wBAAgB,oBAAoB,IAAI;IACtC,IAAI,EAAE,UAAU,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;CACpB,CAOA;AAuBD,wEAAwE;AACxE,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAmB3E;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAajD;AAYD;;oDAEoD;AACpD,wBAAgB,UAAU,IAAI,SAAS,EAAE,CAExC;AAED;;6BAE6B;AAC7B,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAE7D;AAED;;wEAEwE;AACxE,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAYzD;AAkDD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,SAAS,GAAG,MAAM,CAiBpD;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAmE3C"}
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/core/skills/loader.ts"],"names":[],"mappings":"AAiDA;;sEAEsE;AACtE,eAAO,MAAM,oBAAoB,QAAS,CAAA;AAE1C;;gDAEgD;AAChD,eAAO,MAAM,qBAAqB,MAAM,CAAA;AAExC;;oDAEoD;AACpD,eAAO,MAAM,mBAAmB,KAAK,CAAA;AAErC,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,4EAA4E;IAC5E,MAAM,EAAE,WAAW,GAAG,SAAS,CAAA;IAC/B,mEAAmE;IACnE,GAAG,EAAE,MAAM,CAAA;IACX;;2DAEuD;IACvD,MAAM,EAAE,OAAO,CAAA;IACf;qCACiC;IACjC,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB;0DACsD;IACtD,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB;;0EAEsE;IACtE,SAAS,EAAE,OAAO,CAAA;IAClB,qDAAqD;IACrD,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B;;mEAE+D;IAC/D,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAmCD,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAA;AA4BxD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CAiB7C;AAED;sEACsE;AACtE,wBAAgB,oBAAoB,IAAI;IACtC,IAAI,EAAE,UAAU,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;CACpB,CAOA;AAuBD,wEAAwE;AACxE,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAmB3E;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAajD;AAYD;;oDAEoD;AACpD,wBAAgB,UAAU,IAAI,SAAS,EAAE,CAExC;AAED;;6BAE6B;AAC7B,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAE7D;AAED;;wEAEwE;AACxE,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAYzD;AAkDD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,IAAI,WAAW,CAAC,MAAM,CAAC,CAMxD;AAED;;;;;GAKG;AACH,KAAK,gBAAgB,GACjB;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,GACd;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,GACf;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CAAE,CAAA;AAE7C,wBAAgB,uBAAuB,IAAI,gBAAgB,CAQ1D;AAwBD,wBAAgB,qBAAqB,IAAI,MAAM,CAI9C;AAED;0DAC0D;AAC1D,wBAAgB,qBAAqB,IAAI,MAAM,GAAG,IAAI,CAUrD;AAED;;wCAEwC;AACxC,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAU5D;AAED;4DAC4D;AAC5D,wBAAgB,uBAAuB,IAAI,OAAO,CAUjD;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,SAAS,GAAG,MAAM,CAsBpD;AAED;;;;;;GAMG;AACH,MAAM,WAAW,YAAY;IAC3B,8DAA8D;IAC9D,MAAM,EAAE,MAAM,CAAA;IACd,yDAAyD;IACzD,KAAK,EAAE,MAAM,EAAE,CAAA;IACf;gEAC4D;IAC5D,WAAW,EAAE,MAAM,CAAA;CACpB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,aAAa,CAAC,SAAS,CAAC,EAChC,OAAO,SAAI,GACV;IAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;IAAC,UAAU,EAAE,SAAS,EAAE,CAAA;CAAE,CA6FvD;AAkFD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,aAAa,CAAC,SAAS,CAAC,GAAG,MAAM,CA0C7E;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAmB3C"}