compact-agent 1.1.0

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 (324) hide show
  1. package/README.md +394 -0
  2. package/bin/anycode.js +2 -0
  3. package/bin/crowcoder.js +19 -0
  4. package/bin/ecc-hooks.cjs +138 -0
  5. package/dist/agents.d.ts +17 -0
  6. package/dist/agents.js +1603 -0
  7. package/dist/agents.js.map +1 -0
  8. package/dist/api.d.ts +16 -0
  9. package/dist/api.js +115 -0
  10. package/dist/api.js.map +1 -0
  11. package/dist/autonomous-loops.d.ts +108 -0
  12. package/dist/autonomous-loops.js +526 -0
  13. package/dist/autonomous-loops.js.map +1 -0
  14. package/dist/codemaps.d.ts +53 -0
  15. package/dist/codemaps.js +325 -0
  16. package/dist/codemaps.js.map +1 -0
  17. package/dist/compaction.d.ts +30 -0
  18. package/dist/compaction.js +125 -0
  19. package/dist/compaction.js.map +1 -0
  20. package/dist/config.d.ts +5 -0
  21. package/dist/config.js +79 -0
  22. package/dist/config.js.map +1 -0
  23. package/dist/content-engine.d.ts +97 -0
  24. package/dist/content-engine.js +721 -0
  25. package/dist/content-engine.js.map +1 -0
  26. package/dist/cost-tracker.d.ts +49 -0
  27. package/dist/cost-tracker.js +150 -0
  28. package/dist/cost-tracker.js.map +1 -0
  29. package/dist/counter-button.d.ts +35 -0
  30. package/dist/counter-button.js +48 -0
  31. package/dist/counter-button.js.map +1 -0
  32. package/dist/counter.d.ts +21 -0
  33. package/dist/counter.js +31 -0
  34. package/dist/counter.js.map +1 -0
  35. package/dist/coverage.d.ts +23 -0
  36. package/dist/coverage.js +215 -0
  37. package/dist/coverage.js.map +1 -0
  38. package/dist/docs-sync.d.ts +23 -0
  39. package/dist/docs-sync.js +266 -0
  40. package/dist/docs-sync.js.map +1 -0
  41. package/dist/ecc.d.ts +41 -0
  42. package/dist/ecc.js +644 -0
  43. package/dist/ecc.js.map +1 -0
  44. package/dist/evaluation.d.ts +24 -0
  45. package/dist/evaluation.js +412 -0
  46. package/dist/evaluation.js.map +1 -0
  47. package/dist/export.d.ts +22 -0
  48. package/dist/export.js +109 -0
  49. package/dist/export.js.map +1 -0
  50. package/dist/git-workflow.d.ts +22 -0
  51. package/dist/git-workflow.js +197 -0
  52. package/dist/git-workflow.js.map +1 -0
  53. package/dist/hook-controls.d.ts +34 -0
  54. package/dist/hook-controls.js +90 -0
  55. package/dist/hook-controls.js.map +1 -0
  56. package/dist/hooks.d.ts +30 -0
  57. package/dist/hooks.js +130 -0
  58. package/dist/hooks.js.map +1 -0
  59. package/dist/html-parser.d.ts +18 -0
  60. package/dist/html-parser.js +101 -0
  61. package/dist/html-parser.js.map +1 -0
  62. package/dist/index.d.ts +12 -0
  63. package/dist/index.js +1230 -0
  64. package/dist/index.js.map +1 -0
  65. package/dist/learning.d.ts +35 -0
  66. package/dist/learning.js +238 -0
  67. package/dist/learning.js.map +1 -0
  68. package/dist/login.d.ts +37 -0
  69. package/dist/login.js +191 -0
  70. package/dist/login.js.map +1 -0
  71. package/dist/memory.d.ts +39 -0
  72. package/dist/memory.js +183 -0
  73. package/dist/memory.js.map +1 -0
  74. package/dist/model-router.d.ts +23 -0
  75. package/dist/model-router.js +145 -0
  76. package/dist/model-router.js.map +1 -0
  77. package/dist/modes.d.ts +17 -0
  78. package/dist/modes.js +217 -0
  79. package/dist/modes.js.map +1 -0
  80. package/dist/orchestration.d.ts +37 -0
  81. package/dist/orchestration.js +139 -0
  82. package/dist/orchestration.js.map +1 -0
  83. package/dist/package-detect.d.ts +36 -0
  84. package/dist/package-detect.js +529 -0
  85. package/dist/package-detect.js.map +1 -0
  86. package/dist/permissions.d.ts +25 -0
  87. package/dist/permissions.js +50 -0
  88. package/dist/permissions.js.map +1 -0
  89. package/dist/pm2-manager.d.ts +40 -0
  90. package/dist/pm2-manager.js +127 -0
  91. package/dist/pm2-manager.js.map +1 -0
  92. package/dist/query.d.ts +15 -0
  93. package/dist/query.js +278 -0
  94. package/dist/query.js.map +1 -0
  95. package/dist/refactor.d.ts +22 -0
  96. package/dist/refactor.js +226 -0
  97. package/dist/refactor.js.map +1 -0
  98. package/dist/retry.d.ts +20 -0
  99. package/dist/retry.js +88 -0
  100. package/dist/retry.js.map +1 -0
  101. package/dist/rules.d.ts +34 -0
  102. package/dist/rules.js +942 -0
  103. package/dist/rules.js.map +1 -0
  104. package/dist/schema.d.ts +23 -0
  105. package/dist/schema.js +12 -0
  106. package/dist/schema.js.map +1 -0
  107. package/dist/search-first.d.ts +17 -0
  108. package/dist/search-first.js +301 -0
  109. package/dist/search-first.js.map +1 -0
  110. package/dist/security.d.ts +10 -0
  111. package/dist/security.js +145 -0
  112. package/dist/security.js.map +1 -0
  113. package/dist/sessions.d.ts +21 -0
  114. package/dist/sessions.js +112 -0
  115. package/dist/sessions.js.map +1 -0
  116. package/dist/skill-create.d.ts +38 -0
  117. package/dist/skill-create.js +389 -0
  118. package/dist/skill-create.js.map +1 -0
  119. package/dist/skills.d.ts +34 -0
  120. package/dist/skills.js +161 -0
  121. package/dist/skills.js.map +1 -0
  122. package/dist/strategic-compaction.d.ts +24 -0
  123. package/dist/strategic-compaction.js +144 -0
  124. package/dist/strategic-compaction.js.map +1 -0
  125. package/dist/system-prompt.d.ts +3 -0
  126. package/dist/system-prompt.js +101 -0
  127. package/dist/system-prompt.js.map +1 -0
  128. package/dist/theme.d.ts +60 -0
  129. package/dist/theme.js +220 -0
  130. package/dist/theme.js.map +1 -0
  131. package/dist/tools/bash.d.ts +2 -0
  132. package/dist/tools/bash.js +49 -0
  133. package/dist/tools/bash.js.map +1 -0
  134. package/dist/tools/edit.d.ts +2 -0
  135. package/dist/tools/edit.js +76 -0
  136. package/dist/tools/edit.js.map +1 -0
  137. package/dist/tools/glob.d.ts +2 -0
  138. package/dist/tools/glob.js +54 -0
  139. package/dist/tools/glob.js.map +1 -0
  140. package/dist/tools/grep.d.ts +2 -0
  141. package/dist/tools/grep.js +64 -0
  142. package/dist/tools/grep.js.map +1 -0
  143. package/dist/tools/index.d.ts +5 -0
  144. package/dist/tools/index.js +27 -0
  145. package/dist/tools/index.js.map +1 -0
  146. package/dist/tools/list-dir.d.ts +2 -0
  147. package/dist/tools/list-dir.js +51 -0
  148. package/dist/tools/list-dir.js.map +1 -0
  149. package/dist/tools/read.d.ts +2 -0
  150. package/dist/tools/read.js +56 -0
  151. package/dist/tools/read.js.map +1 -0
  152. package/dist/tools/types.d.ts +45 -0
  153. package/dist/tools/types.js +2 -0
  154. package/dist/tools/types.js.map +1 -0
  155. package/dist/tools/web-fetch.d.ts +2 -0
  156. package/dist/tools/web-fetch.js +41 -0
  157. package/dist/tools/web-fetch.js.map +1 -0
  158. package/dist/tools/web-search.d.ts +27 -0
  159. package/dist/tools/web-search.js +139 -0
  160. package/dist/tools/web-search.js.map +1 -0
  161. package/dist/tools/write.d.ts +2 -0
  162. package/dist/tools/write.js +36 -0
  163. package/dist/tools/write.js.map +1 -0
  164. package/dist/types.d.ts +28 -0
  165. package/dist/types.js +57 -0
  166. package/dist/types.js.map +1 -0
  167. package/dist/users.d.ts +51 -0
  168. package/dist/users.js +193 -0
  169. package/dist/users.js.map +1 -0
  170. package/dist/verification.d.ts +73 -0
  171. package/dist/verification.js +269 -0
  172. package/dist/verification.js.map +1 -0
  173. package/dist/walkthrough.d.ts +10 -0
  174. package/dist/walkthrough.js +121 -0
  175. package/dist/walkthrough.js.map +1 -0
  176. package/package.json +58 -0
  177. package/resources/ecc/agents/architect.json +16 -0
  178. package/resources/ecc/agents/architect.md +212 -0
  179. package/resources/ecc/agents/build-error-resolver.json +17 -0
  180. package/resources/ecc/agents/build-error-resolver.md +116 -0
  181. package/resources/ecc/agents/chief-of-staff.json +17 -0
  182. package/resources/ecc/agents/chief-of-staff.md +153 -0
  183. package/resources/ecc/agents/code-reviewer.json +16 -0
  184. package/resources/ecc/agents/code-reviewer.md +238 -0
  185. package/resources/ecc/agents/database-reviewer.json +16 -0
  186. package/resources/ecc/agents/database-reviewer.md +92 -0
  187. package/resources/ecc/agents/doc-updater.json +16 -0
  188. package/resources/ecc/agents/doc-updater.md +108 -0
  189. package/resources/ecc/agents/e2e-runner.json +17 -0
  190. package/resources/ecc/agents/e2e-runner.md +109 -0
  191. package/resources/ecc/agents/go-build-resolver.json +17 -0
  192. package/resources/ecc/agents/go-build-resolver.md +96 -0
  193. package/resources/ecc/agents/go-reviewer.json +16 -0
  194. package/resources/ecc/agents/go-reviewer.md +77 -0
  195. package/resources/ecc/agents/harness-optimizer.json +15 -0
  196. package/resources/ecc/agents/harness-optimizer.md +34 -0
  197. package/resources/ecc/agents/loop-operator.json +16 -0
  198. package/resources/ecc/agents/loop-operator.md +36 -0
  199. package/resources/ecc/agents/planner.json +15 -0
  200. package/resources/ecc/agents/planner.md +212 -0
  201. package/resources/ecc/agents/python-reviewer.json +16 -0
  202. package/resources/ecc/agents/python-reviewer.md +99 -0
  203. package/resources/ecc/agents/refactor-cleaner.json +17 -0
  204. package/resources/ecc/agents/refactor-cleaner.md +87 -0
  205. package/resources/ecc/agents/security-reviewer.json +16 -0
  206. package/resources/ecc/agents/security-reviewer.md +109 -0
  207. package/resources/ecc/agents/tdd-guide.json +17 -0
  208. package/resources/ecc/agents/tdd-guide.md +93 -0
  209. package/resources/ecc/commands/add-language-rules.md +39 -0
  210. package/resources/ecc/commands/database-migration.md +36 -0
  211. package/resources/ecc/commands/feature-development.md +38 -0
  212. package/resources/ecc/prompts/build-fix.prompt.md +47 -0
  213. package/resources/ecc/prompts/code-review.prompt.md +56 -0
  214. package/resources/ecc/prompts/plan.prompt.md +52 -0
  215. package/resources/ecc/prompts/refactor.prompt.md +50 -0
  216. package/resources/ecc/prompts/security-review.prompt.md +70 -0
  217. package/resources/ecc/prompts/tdd.prompt.md +47 -0
  218. package/resources/ecc/rules/common-agents.md +53 -0
  219. package/resources/ecc/rules/common-coding-style.md +52 -0
  220. package/resources/ecc/rules/common-development-workflow.md +33 -0
  221. package/resources/ecc/rules/common-git-workflow.md +28 -0
  222. package/resources/ecc/rules/common-hooks.md +34 -0
  223. package/resources/ecc/rules/common-patterns.md +35 -0
  224. package/resources/ecc/rules/common-performance.md +59 -0
  225. package/resources/ecc/rules/common-security.md +33 -0
  226. package/resources/ecc/rules/common-testing.md +33 -0
  227. package/resources/ecc/rules/golang-coding-style.md +31 -0
  228. package/resources/ecc/rules/golang-hooks.md +16 -0
  229. package/resources/ecc/rules/golang-patterns.md +44 -0
  230. package/resources/ecc/rules/golang-security.md +33 -0
  231. package/resources/ecc/rules/golang-testing.md +30 -0
  232. package/resources/ecc/rules/kotlin-coding-style.md +39 -0
  233. package/resources/ecc/rules/kotlin-hooks.md +16 -0
  234. package/resources/ecc/rules/kotlin-patterns.md +50 -0
  235. package/resources/ecc/rules/kotlin-security.md +58 -0
  236. package/resources/ecc/rules/kotlin-testing.md +38 -0
  237. package/resources/ecc/rules/php-coding-style.md +25 -0
  238. package/resources/ecc/rules/php-hooks.md +21 -0
  239. package/resources/ecc/rules/php-patterns.md +23 -0
  240. package/resources/ecc/rules/php-security.md +24 -0
  241. package/resources/ecc/rules/php-testing.md +26 -0
  242. package/resources/ecc/rules/python-coding-style.md +42 -0
  243. package/resources/ecc/rules/python-hooks.md +19 -0
  244. package/resources/ecc/rules/python-patterns.md +39 -0
  245. package/resources/ecc/rules/python-security.md +30 -0
  246. package/resources/ecc/rules/python-testing.md +38 -0
  247. package/resources/ecc/rules/swift-coding-style.md +47 -0
  248. package/resources/ecc/rules/swift-hooks.md +20 -0
  249. package/resources/ecc/rules/swift-patterns.md +66 -0
  250. package/resources/ecc/rules/swift-security.md +33 -0
  251. package/resources/ecc/rules/swift-testing.md +45 -0
  252. package/resources/ecc/rules/typescript-coding-style.md +63 -0
  253. package/resources/ecc/rules/typescript-hooks.md +20 -0
  254. package/resources/ecc/rules/typescript-patterns.md +50 -0
  255. package/resources/ecc/rules/typescript-security.md +26 -0
  256. package/resources/ecc/rules/typescript-testing.md +16 -0
  257. package/resources/ecc/skills/agent-introspection-debugging/SKILL.md +152 -0
  258. package/resources/ecc/skills/agent-introspection-debugging/agents/openai.yaml +7 -0
  259. package/resources/ecc/skills/agent-sort/SKILL.md +214 -0
  260. package/resources/ecc/skills/agent-sort/agents/openai.yaml +7 -0
  261. package/resources/ecc/skills/api-design/SKILL.md +522 -0
  262. package/resources/ecc/skills/api-design/agents/openai.yaml +7 -0
  263. package/resources/ecc/skills/article-writing/SKILL.md +78 -0
  264. package/resources/ecc/skills/article-writing/agents/openai.yaml +7 -0
  265. package/resources/ecc/skills/backend-patterns/SKILL.md +597 -0
  266. package/resources/ecc/skills/backend-patterns/agents/openai.yaml +7 -0
  267. package/resources/ecc/skills/brand-voice/SKILL.md +96 -0
  268. package/resources/ecc/skills/brand-voice/agents/openai.yaml +7 -0
  269. package/resources/ecc/skills/brand-voice/references/voice-profile-schema.md +55 -0
  270. package/resources/ecc/skills/bun-runtime/SKILL.md +83 -0
  271. package/resources/ecc/skills/bun-runtime/agents/openai.yaml +7 -0
  272. package/resources/ecc/skills/coding-standards/SKILL.md +548 -0
  273. package/resources/ecc/skills/coding-standards/agents/openai.yaml +7 -0
  274. package/resources/ecc/skills/content-engine/SKILL.md +130 -0
  275. package/resources/ecc/skills/content-engine/agents/openai.yaml +7 -0
  276. package/resources/ecc/skills/crosspost/SKILL.md +110 -0
  277. package/resources/ecc/skills/crosspost/agents/openai.yaml +7 -0
  278. package/resources/ecc/skills/deep-research/SKILL.md +154 -0
  279. package/resources/ecc/skills/deep-research/agents/openai.yaml +7 -0
  280. package/resources/ecc/skills/dmux-workflows/SKILL.md +143 -0
  281. package/resources/ecc/skills/dmux-workflows/agents/openai.yaml +7 -0
  282. package/resources/ecc/skills/documentation-lookup/SKILL.md +89 -0
  283. package/resources/ecc/skills/documentation-lookup/agents/openai.yaml +7 -0
  284. package/resources/ecc/skills/e2e-testing/SKILL.md +325 -0
  285. package/resources/ecc/skills/e2e-testing/agents/openai.yaml +7 -0
  286. package/resources/ecc/skills/eval-harness/SKILL.md +235 -0
  287. package/resources/ecc/skills/eval-harness/agents/openai.yaml +7 -0
  288. package/resources/ecc/skills/everything-claude-code/SKILL.md +442 -0
  289. package/resources/ecc/skills/everything-claude-code/agents/openai.yaml +7 -0
  290. package/resources/ecc/skills/exa-search/SKILL.md +169 -0
  291. package/resources/ecc/skills/exa-search/agents/openai.yaml +7 -0
  292. package/resources/ecc/skills/fal-ai-media/SKILL.md +276 -0
  293. package/resources/ecc/skills/fal-ai-media/agents/openai.yaml +7 -0
  294. package/resources/ecc/skills/frontend-patterns/SKILL.md +647 -0
  295. package/resources/ecc/skills/frontend-patterns/agents/openai.yaml +7 -0
  296. package/resources/ecc/skills/frontend-slides/SKILL.md +183 -0
  297. package/resources/ecc/skills/frontend-slides/STYLE_PRESETS.md +330 -0
  298. package/resources/ecc/skills/frontend-slides/agents/openai.yaml +7 -0
  299. package/resources/ecc/skills/investor-materials/SKILL.md +95 -0
  300. package/resources/ecc/skills/investor-materials/agents/openai.yaml +7 -0
  301. package/resources/ecc/skills/investor-outreach/SKILL.md +90 -0
  302. package/resources/ecc/skills/investor-outreach/agents/openai.yaml +7 -0
  303. package/resources/ecc/skills/market-research/SKILL.md +74 -0
  304. package/resources/ecc/skills/market-research/agents/openai.yaml +7 -0
  305. package/resources/ecc/skills/mcp-server-patterns/SKILL.md +66 -0
  306. package/resources/ecc/skills/mcp-server-patterns/agents/openai.yaml +7 -0
  307. package/resources/ecc/skills/mle-workflow/SKILL.md +346 -0
  308. package/resources/ecc/skills/mle-workflow/agents/openai.yaml +7 -0
  309. package/resources/ecc/skills/nextjs-turbopack/SKILL.md +43 -0
  310. package/resources/ecc/skills/nextjs-turbopack/agents/openai.yaml +7 -0
  311. package/resources/ecc/skills/product-capability/SKILL.md +140 -0
  312. package/resources/ecc/skills/product-capability/agents/openai.yaml +7 -0
  313. package/resources/ecc/skills/security-review/SKILL.md +494 -0
  314. package/resources/ecc/skills/security-review/agents/openai.yaml +7 -0
  315. package/resources/ecc/skills/strategic-compact/SKILL.md +102 -0
  316. package/resources/ecc/skills/strategic-compact/agents/openai.yaml +7 -0
  317. package/resources/ecc/skills/tdd-workflow/SKILL.md +409 -0
  318. package/resources/ecc/skills/tdd-workflow/agents/openai.yaml +7 -0
  319. package/resources/ecc/skills/verification-loop/SKILL.md +125 -0
  320. package/resources/ecc/skills/verification-loop/agents/openai.yaml +7 -0
  321. package/resources/ecc/skills/video-editing/SKILL.md +307 -0
  322. package/resources/ecc/skills/video-editing/agents/openai.yaml +7 -0
  323. package/resources/ecc/skills/x-api/SKILL.md +229 -0
  324. package/resources/ecc/skills/x-api/agents/openai.yaml +7 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../src/login.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,eAAe,EAAsB,MAAM,aAAa,CAAC;AACvF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAEpE,wEAAwE;AACxE,wEAAwE;AACxE,4CAA4C;AAC5C,SAAS,WAAW,CAClB,QAAgB,EAChB,IAAY,EACZ,MAAc,EACd,OAAsB;IAEtB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE;YACvD,IAAI,GAAG;gBAAE,MAAM,CAAC,GAAG,CAAC,CAAC;;gBAChB,OAAO,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,WAAW,CAAC,CAAC;AACpD,MAAM,gBAAgB,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,kBAAkB,CAAC,CAAC;AAsBlE,6DAA6D;AAE7D,MAAM,QAAQ,GAAG,KAAK,CAAC;AACvB,MAAM,aAAa,GAAG,EAAE,CAAC;AAEzB,KAAK,UAAU,YAAY,CAAC,QAAgB;IAC1C,MAAM,IAAI,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;IAC7B,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAW,CAAC;IAC5F,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;AAC9D,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,QAAgB,EAAE,MAAc;IAC5D,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7C,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAEvC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAW,CAAC;IAE9F,OAAO,eAAe,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AAC5C,CAAC;AAED,6DAA6D;AAE7D,SAAS,eAAe;IACtB,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAClC,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;IAC7B,CAAC;IACD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAoB,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;IAC7B,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,IAAqB;IAC5C,SAAS,CAAC,YAAY,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,aAAa,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAC1E,CAAC;AAED,6DAA6D;AAE7D,SAAS,aAAa;IACpB,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC;IACxC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAc,CAAC;QAC3C,eAAe;QACf,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC;YAC3C,cAAc,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,KAAgB;IACrC,SAAS,CAAC,YAAY,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,cAAc;IACrB,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1B,aAAa,CAAC,SAAS,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;AACH,CAAC;AAED,8DAA8D;AAE9D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAAc,EAAE,QAAgB;IACrE,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7B,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IAExB,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;IAC/B,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IAEnE,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;QACf,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;YACpB,MAAM;YACN,YAAY,EAAE,IAAI;YAClB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,YAAY,GAAG,IAAI,CAAC;QAC1C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC7D,CAAC;IAED,eAAe,CAAC,IAAI,CAAC,CAAC;IACtB,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,KAAa,EAAE,QAAgB;IACzD,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACnC,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvB,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;IAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC;IAChE,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvB,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IAChE,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,yCAAyC;IACzC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAC9D,MAAM,KAAK,GAAc;QACvB,KAAK,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;QACtC,MAAM,EAAE,IAAI,CAAC,EAAE;QACf,SAAS,EAAE,GAAG,CAAC,WAAW,EAAE;QAC5B,SAAS,EAAE,OAAO,CAAC,WAAW,EAAE;KACjC,CAAC;IAEF,aAAa,CAAC,KAAK,CAAC,CAAC;IACrB,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvB,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,MAAM;IACpB,cAAc,EAAE,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB;IAClC,MAAM,KAAK,GAAG,aAAa,EAAE,CAAC;IAC9B,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACnC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,cAAc,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;AACtD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;IAC/B,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;AAC3D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;IAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IACnE,IAAI,GAAG,KAAK,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7B,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAChC,eAAe,CAAC,IAAI,CAAC,CAAC;IACtB,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,39 @@
1
+ import type { Message } from './types.js';
2
+ export interface MemoryEntry {
3
+ key: string;
4
+ value: string;
5
+ category: 'project' | 'preference' | 'context' | 'decision';
6
+ sessionId: string;
7
+ createdAt: string;
8
+ accessCount: number;
9
+ }
10
+ /**
11
+ * Save or update a memory entry.
12
+ */
13
+ export declare function saveMemory(key: string, value: string, category: MemoryEntry['category'], sessionId: string): void;
14
+ /**
15
+ * Load a memory entry by key.
16
+ */
17
+ export declare function loadMemory(key: string): MemoryEntry | null;
18
+ /**
19
+ * Search memories by keyword across all entries.
20
+ */
21
+ export declare function searchMemory(query: string): MemoryEntry[];
22
+ /**
23
+ * Get all memories for a specific project (by cwd path).
24
+ */
25
+ export declare function getProjectMemory(cwd: string): MemoryEntry[];
26
+ /**
27
+ * Called at session start — returns a context string to inject into system prompt.
28
+ * Loads relevant memories for the given project.
29
+ */
30
+ export declare function onSessionStart(sessionId: string, cwd: string): string;
31
+ /**
32
+ * Called at session end — auto-extract key decisions and context from conversation.
33
+ */
34
+ export declare function onSessionEnd(sessionId: string, messages: Message[], cwd: string): void;
35
+ /**
36
+ * Remove memories older than maxAge days.
37
+ */
38
+ export declare function pruneOldMemories(maxAge: number): number;
39
+ export declare function printMemoryStatus(): void;
package/dist/memory.js ADDED
@@ -0,0 +1,183 @@
1
+ /**
2
+ * Enhanced memory persistence — session-aware memory that persists key context across sessions.
3
+ * Data stored in ~/.crowcoder/memory/
4
+ */
5
+ import { readFileSync, writeFileSync, readdirSync, mkdirSync, existsSync, unlinkSync } from 'node:fs';
6
+ import { join } from 'node:path';
7
+ import chalk from 'chalk';
8
+ import { getConfigDir } from './config.js';
9
+ const MEMORY_DIR = join(getConfigDir(), 'memory');
10
+ function ensureDir() {
11
+ mkdirSync(MEMORY_DIR, { recursive: true });
12
+ }
13
+ function memoryPath(key) {
14
+ // Sanitize key for filesystem
15
+ const sanitized = key.replace(/[/\\:*?"<>|]/g, '_');
16
+ return join(MEMORY_DIR, `${sanitized}.json`);
17
+ }
18
+ /**
19
+ * Save or update a memory entry.
20
+ */
21
+ export function saveMemory(key, value, category, sessionId) {
22
+ ensureDir();
23
+ const entry = {
24
+ key,
25
+ value,
26
+ category,
27
+ sessionId,
28
+ createdAt: new Date().toISOString(),
29
+ accessCount: 0,
30
+ };
31
+ writeFileSync(memoryPath(key), JSON.stringify(entry, null, 2), 'utf-8');
32
+ }
33
+ /**
34
+ * Load a memory entry by key.
35
+ */
36
+ export function loadMemory(key) {
37
+ const p = memoryPath(key);
38
+ if (!existsSync(p))
39
+ return null;
40
+ try {
41
+ const entry = JSON.parse(readFileSync(p, 'utf-8'));
42
+ entry.accessCount++;
43
+ writeFileSync(p, JSON.stringify(entry, null, 2), 'utf-8');
44
+ return entry;
45
+ }
46
+ catch {
47
+ return null;
48
+ }
49
+ }
50
+ /**
51
+ * Search memories by keyword across all entries.
52
+ */
53
+ export function searchMemory(query) {
54
+ ensureDir();
55
+ const files = readdirSync(MEMORY_DIR).filter((f) => f.endsWith('.json'));
56
+ const results = [];
57
+ const queryLower = query.toLowerCase();
58
+ for (const file of files) {
59
+ try {
60
+ const entry = JSON.parse(readFileSync(join(MEMORY_DIR, file), 'utf-8'));
61
+ const text = `${entry.key} ${entry.value} ${entry.category}`.toLowerCase();
62
+ if (text.includes(queryLower)) {
63
+ results.push(entry);
64
+ }
65
+ }
66
+ catch { /* skip */ }
67
+ }
68
+ return results.sort((a, b) => b.accessCount - a.accessCount);
69
+ }
70
+ /**
71
+ * Get all memories for a specific project (by cwd path).
72
+ */
73
+ export function getProjectMemory(cwd) {
74
+ ensureDir();
75
+ const files = readdirSync(MEMORY_DIR).filter((f) => f.endsWith('.json'));
76
+ const results = [];
77
+ for (const file of files) {
78
+ try {
79
+ const entry = JSON.parse(readFileSync(join(MEMORY_DIR, file), 'utf-8'));
80
+ // Match project memories by key pattern (e.g., "project:/path/to/project")
81
+ if (entry.key.startsWith(`project:${cwd}`) || entry.category === 'project') {
82
+ results.push(entry);
83
+ }
84
+ }
85
+ catch { /* skip */ }
86
+ }
87
+ return results.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());
88
+ }
89
+ /**
90
+ * Called at session start — returns a context string to inject into system prompt.
91
+ * Loads relevant memories for the given project.
92
+ */
93
+ export function onSessionStart(sessionId, cwd) {
94
+ const projectMemories = getProjectMemory(cwd);
95
+ if (projectMemories.length === 0)
96
+ return '';
97
+ const lines = [
98
+ '## Relevant Project Context from Previous Sessions:',
99
+ ];
100
+ for (const mem of projectMemories.slice(0, 10)) {
101
+ lines.push(`- [${mem.category}] ${mem.key}: ${mem.value}`);
102
+ }
103
+ return lines.join('\n');
104
+ }
105
+ /**
106
+ * Called at session end — auto-extract key decisions and context from conversation.
107
+ */
108
+ export function onSessionEnd(sessionId, messages, cwd) {
109
+ // Extract key decision points and context
110
+ for (let i = 0; i < messages.length; i++) {
111
+ const msg = messages[i];
112
+ // Look for user messages that indicate decisions
113
+ if (msg.role === 'user' && typeof msg.content === 'string') {
114
+ const text = msg.content.toLowerCase();
115
+ // Decision keywords
116
+ if (text.includes('decided') || text.includes('decided to') || text.includes('we will')) {
117
+ const key = `decision:${sessionId}:${i}`;
118
+ saveMemory(key, msg.content.slice(0, 500), 'decision', sessionId);
119
+ }
120
+ // Project context
121
+ if (text.includes('project') || text.includes('codebase') || text.includes('architecture')) {
122
+ const key = `project:${cwd}:context:${i}`;
123
+ saveMemory(key, msg.content.slice(0, 500), 'project', sessionId);
124
+ }
125
+ // User preferences
126
+ if (text.includes('prefer') || text.includes('prefer ') || text.includes('always')) {
127
+ const key = `preference:${sessionId}:${i}`;
128
+ saveMemory(key, msg.content.slice(0, 500), 'preference', sessionId);
129
+ }
130
+ }
131
+ }
132
+ }
133
+ /**
134
+ * Remove memories older than maxAge days.
135
+ */
136
+ export function pruneOldMemories(maxAge) {
137
+ ensureDir();
138
+ const files = readdirSync(MEMORY_DIR).filter((f) => f.endsWith('.json'));
139
+ const now = new Date();
140
+ let pruned = 0;
141
+ for (const file of files) {
142
+ const p = join(MEMORY_DIR, file);
143
+ try {
144
+ const entry = JSON.parse(readFileSync(p, 'utf-8'));
145
+ const age = (now.getTime() - new Date(entry.createdAt).getTime()) / (1000 * 60 * 60 * 24);
146
+ if (age > maxAge) {
147
+ unlinkSync(p);
148
+ pruned++;
149
+ }
150
+ }
151
+ catch { /* skip */ }
152
+ }
153
+ return pruned;
154
+ }
155
+ export function printMemoryStatus() {
156
+ ensureDir();
157
+ const files = readdirSync(MEMORY_DIR).filter((f) => f.endsWith('.json'));
158
+ const entries = [];
159
+ for (const file of files) {
160
+ try {
161
+ entries.push(JSON.parse(readFileSync(join(MEMORY_DIR, file), 'utf-8')));
162
+ }
163
+ catch { /* skip */ }
164
+ }
165
+ console.log(chalk.cyan(`\n Memory: ${entries.length} entries`));
166
+ const byCat = new Map();
167
+ for (const e of entries) {
168
+ byCat.set(e.category, (byCat.get(e.category) || 0) + 1);
169
+ }
170
+ for (const [cat, count] of Array.from(byCat.entries()).sort((a, b) => b[1] - a[1])) {
171
+ console.log(chalk.dim(` ${cat}: ${count}`));
172
+ }
173
+ if (entries.length > 0) {
174
+ console.log(chalk.dim(`\n Most accessed:`));
175
+ const byAccess = entries.sort((a, b) => b.accessCount - a.accessCount);
176
+ for (const entry of byAccess.slice(0, 5)) {
177
+ const valuePreview = entry.value.slice(0, 50).replace(/\n/g, ' ');
178
+ console.log(chalk.dim(` [${entry.accessCount}x] ${entry.key}: ${valuePreview}...`));
179
+ }
180
+ }
181
+ console.log();
182
+ }
183
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { CrowcoderConfig } from './types.js';
2
+ export interface ModelOption {
3
+ id: string;
4
+ tier: 'fast' | 'balanced' | 'powerful';
5
+ description: string;
6
+ }
7
+ export type TaskComplexity = 'simple' | 'medium' | 'complex';
8
+ /**
9
+ * Classify task complexity from the user's message.
10
+ */
11
+ export declare function classifyComplexity(message: string): TaskComplexity;
12
+ /**
13
+ * Suggest the best model for a given complexity and provider.
14
+ */
15
+ export declare function routeModel(config: CrowcoderConfig, complexity: TaskComplexity): {
16
+ model: string;
17
+ reason: string;
18
+ };
19
+ export declare function printModelOptions(config: CrowcoderConfig): void;
20
+ /**
21
+ * Switch to a model by name or tier.
22
+ */
23
+ export declare function switchModel(config: CrowcoderConfig, nameOrTier: string): string | null;
@@ -0,0 +1,145 @@
1
+ /**
2
+ * Model router — cost-aware model selection.
3
+ * Routes to cheaper models for simple tasks, expensive for complex ones.
4
+ */
5
+ import chalk from 'chalk';
6
+ import { getModelCost } from './cost-tracker.js';
7
+ // Provider-specific model tiers
8
+ const MODEL_TIERS = {
9
+ openrouter: [
10
+ { id: 'anthropic/claude-haiku-4', tier: 'fast', description: 'Claude Haiku — fast, cheap' },
11
+ { id: 'anthropic/claude-sonnet-4', tier: 'balanced', description: 'Claude Sonnet — balanced' },
12
+ { id: 'anthropic/claude-opus-4', tier: 'powerful', description: 'Claude Opus — most capable' },
13
+ { id: 'openai/gpt-4o-mini', tier: 'fast', description: 'GPT-4o Mini — fast, cheap' },
14
+ { id: 'openai/gpt-4o', tier: 'balanced', description: 'GPT-4o — balanced' },
15
+ { id: 'google/gemini-2.5-flash', tier: 'fast', description: 'Gemini Flash — fast, cheap' },
16
+ { id: 'google/gemini-2.5-pro', tier: 'powerful', description: 'Gemini Pro — powerful' },
17
+ { id: 'deepseek/deepseek-chat', tier: 'fast', description: 'DeepSeek V3 — very cheap' },
18
+ { id: 'meta-llama/llama-4-maverick', tier: 'balanced', description: 'Llama 4 Maverick — open' },
19
+ ],
20
+ openai: [
21
+ { id: 'gpt-4o-mini', tier: 'fast', description: 'GPT-4o Mini' },
22
+ { id: 'gpt-4o', tier: 'balanced', description: 'GPT-4o' },
23
+ { id: 'o3-mini', tier: 'powerful', description: 'o3-mini (reasoning)' },
24
+ ],
25
+ glm: [
26
+ { id: 'glm-4-flash', tier: 'fast', description: 'GLM-4 Flash' },
27
+ { id: 'glm-4-plus', tier: 'balanced', description: 'GLM-4 Plus' },
28
+ { id: 'glm-4-long', tier: 'powerful', description: 'GLM-4 Long (128k context)' },
29
+ ],
30
+ deepseek: [
31
+ { id: 'deepseek-chat', tier: 'fast', description: 'DeepSeek Chat — fast' },
32
+ { id: 'deepseek-reasoner', tier: 'powerful', description: 'DeepSeek Reasoner — R1' },
33
+ ],
34
+ ollama: [
35
+ { id: 'qwen2.5-coder:latest', tier: 'fast', description: 'Qwen 2.5 Coder (local)' },
36
+ { id: 'deepseek-coder-v2:latest', tier: 'balanced', description: 'DeepSeek Coder v2 (local)' },
37
+ { id: 'llama3.3:latest', tier: 'powerful', description: 'Llama 3.3 (local)' },
38
+ ],
39
+ };
40
+ /**
41
+ * Classify task complexity from the user's message.
42
+ */
43
+ export function classifyComplexity(message) {
44
+ const lower = message.toLowerCase();
45
+ // Simple: short messages, single operations, questions
46
+ const simpleSignals = [
47
+ /^(what|how|why|where|when|who|which|list|show|print|explain)\b/,
48
+ /^(read|cat|ls|find|search|grep|look)\b/,
49
+ /\?([\s]*$)/,
50
+ /^(yes|no|ok|sure|thanks|y|n)\b/i,
51
+ ];
52
+ if (message.length < 100 && simpleSignals.some((r) => r.test(lower))) {
53
+ return 'simple';
54
+ }
55
+ // Complex: multi-step, architecture, large changes
56
+ const complexSignals = [
57
+ /\b(refactor|rewrite|architect|redesign|migrate|implement|build|create .+ system)\b/,
58
+ /\b(entire|whole|all files|full|complete|comprehensive)\b/,
59
+ /\b(performance|security audit|review all|test all)\b/,
60
+ /and\b.*\band\b.*\band\b/, // multiple "and"s = multi-part request
61
+ ];
62
+ if (complexSignals.some((r) => r.test(lower))) {
63
+ return 'complex';
64
+ }
65
+ return 'medium';
66
+ }
67
+ /**
68
+ * Map provider display names to tier keys
69
+ */
70
+ function getProviderKey(displayName) {
71
+ const map = {
72
+ 'openrouter': 'openrouter',
73
+ 'glm (zhipuai)': 'glm',
74
+ 'glm': 'glm',
75
+ 'ollama (local)': 'ollama',
76
+ 'ollama': 'ollama',
77
+ 'lm studio': 'lmstudio',
78
+ 'lmstudio': 'lmstudio',
79
+ 'openai': 'openai',
80
+ 'deepseek': 'deepseek',
81
+ 'custom': 'custom',
82
+ };
83
+ const key = displayName.toLowerCase();
84
+ return map[key] || key.replace(/[^a-z]/g, '');
85
+ }
86
+ /**
87
+ * Suggest the best model for a given complexity and provider.
88
+ */
89
+ export function routeModel(config, complexity) {
90
+ const provider = getProviderKey(config.provider);
91
+ const tiers = MODEL_TIERS[provider];
92
+ if (!tiers) {
93
+ return { model: config.model, reason: 'No routing available for this provider' };
94
+ }
95
+ const tierMap = {
96
+ simple: 'fast',
97
+ medium: 'balanced',
98
+ complex: 'powerful',
99
+ };
100
+ const targetTier = tierMap[complexity];
101
+ const match = tiers.find((m) => m.tier === targetTier);
102
+ if (!match) {
103
+ return { model: config.model, reason: 'No matching model tier' };
104
+ }
105
+ const cost = getModelCost(match.id);
106
+ return {
107
+ model: match.id,
108
+ reason: `${complexity} task → ${match.description} ($${cost.input}/$${cost.output} per 1M tokens)`,
109
+ };
110
+ }
111
+ export function printModelOptions(config) {
112
+ const provider = getProviderKey(config.provider);
113
+ const tiers = MODEL_TIERS[provider] || [];
114
+ console.log(chalk.cyan(`\n Models for ${config.provider}:`));
115
+ const current = config.model;
116
+ for (const m of tiers) {
117
+ const marker = m.id === current ? chalk.green(' ◀ current') : '';
118
+ const cost = getModelCost(m.id);
119
+ console.log(chalk.white(` ${m.tier.padEnd(10)}`) +
120
+ chalk.dim(`${m.id.padEnd(35)} $${cost.input}/$${cost.output} per 1M`) +
121
+ marker);
122
+ }
123
+ console.log();
124
+ }
125
+ /**
126
+ * Switch to a model by name or tier.
127
+ */
128
+ export function switchModel(config, nameOrTier) {
129
+ const provider = getProviderKey(config.provider);
130
+ const tiers = MODEL_TIERS[provider] || [];
131
+ // Try exact match first
132
+ const exact = tiers.find((m) => m.id === nameOrTier);
133
+ if (exact)
134
+ return exact.id;
135
+ // Try tier match
136
+ const tier = tiers.find((m) => m.tier === nameOrTier);
137
+ if (tier)
138
+ return tier.id;
139
+ // Try partial match
140
+ const partial = tiers.find((m) => m.id.includes(nameOrTier) || m.description.toLowerCase().includes(nameOrTier.toLowerCase()));
141
+ if (partial)
142
+ return partial.id;
143
+ return null;
144
+ }
145
+ //# sourceMappingURL=model-router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-router.js","sourceRoot":"","sources":["../src/model-router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Dynamic modes — dev/review/TDD/research/plan mode switching.
3
+ * Each mode injects specialized system prompt additions and behavior.
4
+ */
5
+ export type Mode = 'dev' | 'review' | 'tdd' | 'research' | 'plan' | 'debug' | 'architect' | 'hermes';
6
+ export interface ModeConfig {
7
+ name: Mode;
8
+ label: string;
9
+ description: string;
10
+ systemPromptAddition: string;
11
+ suggestedTools: string[];
12
+ temperature?: number;
13
+ }
14
+ export declare const MODES: Record<Mode, ModeConfig>;
15
+ export declare function getMode(name: string): ModeConfig | undefined;
16
+ export declare function getModePromptAddition(mode: Mode): string;
17
+ export declare function listModes(): ModeConfig[];
package/dist/modes.js ADDED
@@ -0,0 +1,217 @@
1
+ /**
2
+ * Dynamic modes — dev/review/TDD/research/plan mode switching.
3
+ * Each mode injects specialized system prompt additions and behavior.
4
+ */
5
+ export const MODES = {
6
+ dev: {
7
+ name: 'dev',
8
+ label: 'Development',
9
+ description: 'General coding — write features, fix bugs, refactor',
10
+ systemPromptAddition: `
11
+ # Mode: Development
12
+ You are in development mode. Focus on:
13
+ - Writing clean, correct, secure code
14
+ - Following existing patterns in the codebase
15
+ - Making minimal changes to achieve the goal
16
+ - Testing your changes work before considering them done
17
+ - Reading files before editing them`,
18
+ suggestedTools: ['bash', 'read_file', 'edit_file', 'write_file', 'grep', 'glob'],
19
+ },
20
+ review: {
21
+ name: 'review',
22
+ label: 'Code Review',
23
+ description: 'Review code for quality, security, and correctness',
24
+ systemPromptAddition: `
25
+ # Mode: Code Review
26
+ You are in code review mode. For every piece of code you examine:
27
+ 1. **Correctness**: Does it do what it claims? Edge cases? Off-by-one errors?
28
+ 2. **Security**: SQL injection, XSS, command injection, path traversal, secrets in code?
29
+ 3. **Performance**: N+1 queries, unbounded loops, memory leaks, missing indexes?
30
+ 4. **Maintainability**: Clear naming, reasonable complexity, no dead code?
31
+ 5. **Testing**: Are tests adequate? What's untested?
32
+
33
+ Rate each file: PASS / WARN / FAIL with specific line-level feedback.
34
+ Output a structured review with severity levels: critical / high / medium / low / nit.`,
35
+ suggestedTools: ['read_file', 'grep', 'glob', 'bash'],
36
+ },
37
+ tdd: {
38
+ name: 'tdd',
39
+ label: 'Test-Driven Development',
40
+ description: 'Write tests first, then make them pass',
41
+ systemPromptAddition: `
42
+ # Mode: Test-Driven Development
43
+ Follow the strict TDD cycle:
44
+ 1. **RED**: Write a failing test that defines the desired behavior
45
+ 2. **GREEN**: Write the minimal code to make the test pass
46
+ 3. **REFACTOR**: Clean up without changing behavior, ensure tests still pass
47
+
48
+ Rules:
49
+ - NEVER write implementation before a failing test
50
+ - Each test should test ONE behavior
51
+ - Run tests after every change
52
+ - Keep the feedback loop tight: write test → run → fail → implement → run → pass → refactor`,
53
+ suggestedTools: ['bash', 'write_file', 'edit_file', 'read_file'],
54
+ temperature: 0.2,
55
+ },
56
+ research: {
57
+ name: 'research',
58
+ label: 'Research',
59
+ description: 'Explore codebases, read docs, understand systems',
60
+ systemPromptAddition: `
61
+ # Mode: Research
62
+ You are in research/exploration mode. Focus on:
63
+ - Reading and understanding code thoroughly before suggesting changes
64
+ - Tracing execution paths and data flow
65
+ - Mapping dependencies and architecture
66
+ - Summarizing findings clearly
67
+ - DO NOT modify files unless explicitly asked — read only
68
+ - Use grep and glob extensively to find relevant code
69
+ - Build a mental map and share it with the user`,
70
+ suggestedTools: ['read_file', 'grep', 'glob', 'list_dir', 'web_fetch'],
71
+ temperature: 0.4,
72
+ },
73
+ plan: {
74
+ name: 'plan',
75
+ label: 'Planning',
76
+ description: 'Design implementation plans before coding',
77
+ systemPromptAddition: `
78
+ # Mode: Planning
79
+ You are in planning mode. Help the user design before building:
80
+ 1. **Understand**: Read relevant code, understand the current state
81
+ 2. **Options**: Present 2-3 implementation approaches with trade-offs
82
+ 3. **Plan**: Write a step-by-step implementation plan
83
+ 4. **Files**: List every file that needs to change and what changes
84
+ 5. **Risks**: Identify risks, edge cases, and migration concerns
85
+
86
+ DO NOT write code in this mode. Only produce plans.
87
+ Format plans as numbered steps with file paths and descriptions.`,
88
+ suggestedTools: ['read_file', 'grep', 'glob', 'list_dir'],
89
+ temperature: 0.5,
90
+ },
91
+ debug: {
92
+ name: 'debug',
93
+ label: 'Debug',
94
+ description: 'Systematic debugging of issues',
95
+ systemPromptAddition: `
96
+ # Mode: Debug
97
+ You are in debugging mode. Follow a systematic approach:
98
+ 1. **Reproduce**: Understand and reproduce the bug
99
+ 2. **Hypothesize**: Form hypotheses about root cause
100
+ 3. **Test**: Check each hypothesis with targeted reads/searches
101
+ 4. **Isolate**: Narrow down to the exact line/function
102
+ 5. **Fix**: Apply minimal fix
103
+ 6. **Verify**: Confirm the fix works and doesn't break other things
104
+
105
+ Use logs, error messages, and stack traces. Check git blame for recent changes.
106
+ Never guess — always verify with evidence.`,
107
+ suggestedTools: ['bash', 'read_file', 'grep', 'glob', 'edit_file'],
108
+ temperature: 0.2,
109
+ },
110
+ architect: {
111
+ name: 'architect',
112
+ label: 'Architect',
113
+ description: 'System design and architecture decisions',
114
+ systemPromptAddition: `
115
+ # Mode: Architect
116
+ You are in architecture mode. Help with system-level decisions:
117
+ - Component boundaries and interfaces
118
+ - Data flow and state management
119
+ - Technology choices and trade-offs
120
+ - Scalability and performance considerations
121
+ - Security architecture
122
+ - API design (REST, GraphQL, gRPC)
123
+ - Database schema design
124
+ - Infrastructure and deployment
125
+
126
+ Think at the system level. Draw diagrams using ASCII art or Mermaid syntax.
127
+ Consider both current needs and reasonable future growth.`,
128
+ suggestedTools: ['read_file', 'grep', 'glob', 'list_dir', 'web_fetch'],
129
+ temperature: 0.5,
130
+ },
131
+ hermes: {
132
+ name: 'hermes',
133
+ label: 'Hermes (Growing Agent)',
134
+ description: 'Self-improving loop — search prior work, learn skills from experience, model the user, parallelize, persist knowledge. Inspired by nousresearch/hermes-agent.',
135
+ systemPromptAddition: `
136
+ # Mode: Hermes — The Agent That Grows With You
137
+
138
+ You operate as a continuously-learning agent. The current session is one link in
139
+ a chain — your effectiveness depends on what you remember from prior chains and
140
+ what you bank for the next one. Inspired by nousresearch/hermes-agent.
141
+
142
+ ## Core loop — every turn, in order
143
+
144
+ 1. **Recall first.** Before answering anything non-trivial, check what already
145
+ exists: search prior session memory (\`/memory\`), look up matching instincts
146
+ (\`/instincts\`), and scan the skill library (\`/skills\`) for relevant patterns.
147
+ Do not propose work that duplicates a learned skill — invoke the skill.
148
+
149
+ 2. **Model the user.** Track who you're working with: their stack, vocabulary,
150
+ constraints, recurring goals, and the things they've corrected you on. When
151
+ you notice a stable preference ("user always rejects emoji in code", "user
152
+ prefers integration tests over mocks"), surface it briefly and persist it as
153
+ feedback via \`/learn\`.
154
+
155
+ 3. **Act in parallel when independent.** If a task decomposes into independent
156
+ subtasks (multi-file edits, multi-service investigations, parallel research
157
+ questions), use \`/orchestrate\` or the multi-agent prompts (\`/multi-plan\`,
158
+ \`/multi-execute\`, \`/multi-backend\`, \`/multi-frontend\`) instead of doing
159
+ them sequentially.
160
+
161
+ 4. **Distill skills from experience.** After any non-trivial completed task,
162
+ ask yourself: *"Will I want to do this again?"* If yes, extract the pattern
163
+ via \`/learn\` (raw instinct) or \`/skill-create\` (reusable skill from git
164
+ history). High-confidence instincts evolve into skills via \`/evolve\`.
165
+
166
+ 5. **Nudge to persist.** At the end of substantive work, propose what's worth
167
+ keeping: a new skill, an updated rule, a checkpoint (\`/checkpoint\`), a
168
+ scheduled follow-up. Don't just finish — bank the lesson.
169
+
170
+ 6. **Schedule the unattended.** If a task has a natural follow-up that doesn't
171
+ need to happen right now (a verification window, a watchdog, a periodic
172
+ sweep), suggest \`/schedule\` or a cron-style routine.
173
+
174
+ ## Behavioral defaults
175
+
176
+ - **Continuity over freshness.** Reuse and refine what already works. New skills
177
+ are earned by demonstrated value, not invented for novelty.
178
+ - **Confidence calibration.** When recalling from memory, mark it: "I remember X
179
+ (memory, 2026-MM-DD)" vs "I'm verifying X now." Stale memory is worse than no
180
+ memory — re-check before acting.
181
+ - **Compression.** Long sessions drift. When context grows large
182
+ (\`/history\` shows compaction needed), summarize aggressively into a checkpoint
183
+ before continuing.
184
+ - **Cross-session search.** Before saying "I don't know," search session history
185
+ and memory for prior conversations that touched the same problem.
186
+ - **Skill self-improvement.** After invoking a skill, if you noticed a gap or
187
+ edge case, update the skill — don't leave it stale.
188
+
189
+ ## What NOT to do
190
+
191
+ - Don't act as if this is a fresh session. Memory and instincts exist; check
192
+ them.
193
+ - Don't propose generic plans when a learned skill or instinct fits — invoke
194
+ the existing pattern.
195
+ - Don't finish a multi-step task without proposing at least one piece of
196
+ knowledge to persist (or explicitly noting "nothing worth keeping").
197
+ - Don't sequentialize work that can be parallelized.
198
+
199
+ ## Crowcoder commands you should reach for in this mode
200
+
201
+ \`/memory\`, \`/instincts\`, \`/skills\`, \`/learn\`, \`/skill-create\`, \`/evolve\`,
202
+ \`/orchestrate\`, \`/multi-plan\`, \`/multi-execute\`, \`/checkpoint\`, \`/checkpoints\`,
203
+ \`/instinct-export\`, \`/instinct-import\`, \`/prune\`, \`/git-patterns\`, \`/ecc-skills\`.`,
204
+ suggestedTools: ['bash', 'read_file', 'edit_file', 'write_file', 'grep', 'glob', 'list_dir', 'web_fetch'],
205
+ temperature: 0.4,
206
+ },
207
+ };
208
+ export function getMode(name) {
209
+ return MODES[name];
210
+ }
211
+ export function getModePromptAddition(mode) {
212
+ return MODES[mode]?.systemPromptAddition || '';
213
+ }
214
+ export function listModes() {
215
+ return Object.values(MODES);
216
+ }
217
+ //# sourceMappingURL=modes.js.map