@minko-ai/minko 0.1.0 → 0.1.1

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 (189) hide show
  1. package/README.md +577 -2
  2. package/assets/mascot-preview.png +0 -0
  3. package/assets/mascot-preview.txt +46 -0
  4. package/assets/mascot-source.png +0 -0
  5. package/assets/skills/README.md +21 -0
  6. package/assets/skills/brainstorming/LICENSE +21 -0
  7. package/assets/skills/brainstorming/SKILL.md +316 -0
  8. package/assets/skills/buddhist-method/LICENSE +21 -0
  9. package/assets/skills/buddhist-method/SKILL.md +137 -0
  10. package/assets/skills/buddhist-method/references/ariyasacca-debug.md +57 -0
  11. package/assets/skills/buddhist-method/references/extended-principles.md +100 -0
  12. package/assets/skills/code-humanizer/LICENSE +21 -0
  13. package/assets/skills/code-humanizer/SKILL.md +174 -0
  14. package/assets/skills/code-review/LICENSE +21 -0
  15. package/assets/skills/code-review/SKILL.md +232 -0
  16. package/assets/skills/code-review/reference/angular.md +768 -0
  17. package/assets/skills/code-review/reference/architecture-review-guide.md +472 -0
  18. package/assets/skills/code-review/reference/c.md +890 -0
  19. package/assets/skills/code-review/reference/code-quality-universal.md +488 -0
  20. package/assets/skills/code-review/reference/code-review-best-practices.md +136 -0
  21. package/assets/skills/code-review/reference/common-bugs-checklist.md +302 -0
  22. package/assets/skills/code-review/reference/cpp.md +893 -0
  23. package/assets/skills/code-review/reference/cross-cutting/async-concurrency-patterns.md +515 -0
  24. package/assets/skills/code-review/reference/cross-cutting/error-handling-principles.md +492 -0
  25. package/assets/skills/code-review/reference/cross-cutting/n-plus-one-queries.md +309 -0
  26. package/assets/skills/code-review/reference/cross-cutting/sql-injection-prevention.md +308 -0
  27. package/assets/skills/code-review/reference/cross-cutting/xss-prevention.md +264 -0
  28. package/assets/skills/code-review/reference/csharp.md +525 -0
  29. package/assets/skills/code-review/reference/css-less-sass.md +661 -0
  30. package/assets/skills/code-review/reference/dart.md +670 -0
  31. package/assets/skills/code-review/reference/django.md +985 -0
  32. package/assets/skills/code-review/reference/fastapi.md +580 -0
  33. package/assets/skills/code-review/reference/go.md +993 -0
  34. package/assets/skills/code-review/reference/java.md +409 -0
  35. package/assets/skills/code-review/reference/java8.md +586 -0
  36. package/assets/skills/code-review/reference/kotlin.md +1018 -0
  37. package/assets/skills/code-review/reference/nestjs.md +593 -0
  38. package/assets/skills/code-review/reference/performance-review-guide.md +816 -0
  39. package/assets/skills/code-review/reference/php.md +684 -0
  40. package/assets/skills/code-review/reference/python.md +1073 -0
  41. package/assets/skills/code-review/reference/qt.md +757 -0
  42. package/assets/skills/code-review/reference/react.md +871 -0
  43. package/assets/skills/code-review/reference/ruby.md +964 -0
  44. package/assets/skills/code-review/reference/rust.md +846 -0
  45. package/assets/skills/code-review/reference/security-review-guide.md +494 -0
  46. package/assets/skills/code-review/reference/svelte.md +1064 -0
  47. package/assets/skills/code-review/reference/swift.md +936 -0
  48. package/assets/skills/code-review/reference/typescript.md +1016 -0
  49. package/assets/skills/code-review/reference/vue.md +924 -0
  50. package/assets/skills/code-review/reference/zig.md +440 -0
  51. package/assets/skills/cyclomatic-complexity/LICENSE +201 -0
  52. package/assets/skills/cyclomatic-complexity/SKILL.md +69 -0
  53. package/assets/skills/five-whys/LICENSE +21 -0
  54. package/assets/skills/five-whys/SKILL.md +247 -0
  55. package/assets/skills/five-whys/examples/performance-regression.md +161 -0
  56. package/assets/skills/five-whys/examples/production-incident.md +134 -0
  57. package/assets/skills/five-whys/references/software-patterns.md +284 -0
  58. package/assets/skills/five-whys/references/toyota-origins.md +257 -0
  59. package/assets/skills/systematic-debugging/LICENSE +21 -0
  60. package/assets/skills/systematic-debugging/SKILL.md +283 -0
  61. package/assets/skills/test-driven-development/LICENSE +21 -0
  62. package/assets/skills/test-driven-development/SKILL.md +330 -0
  63. package/assets/skills/verification-before-completion/LICENSE +21 -0
  64. package/assets/skills/verification-before-completion/SKILL.md +120 -0
  65. package/assets/skills/vibe-sec/LICENSE +201 -0
  66. package/assets/skills/vibe-sec/SKILL.md +758 -0
  67. package/assets/skills/writing-plans/LICENSE +21 -0
  68. package/assets/skills/writing-plans/SKILL.md +204 -0
  69. package/bin/minko.js +2 -2
  70. package/dist/agent/approvalTokens.js +224 -0
  71. package/dist/agent/branchLock.js +315 -0
  72. package/dist/agent/compact.js +182 -0
  73. package/dist/agent/context.js +183 -0
  74. package/dist/agent/cron.js +326 -0
  75. package/dist/agent/hooks.js +211 -0
  76. package/dist/agent/lanes.js +511 -0
  77. package/dist/agent/loop.js +337 -0
  78. package/dist/agent/memory.js +159 -0
  79. package/dist/agent/permissions.js +71 -0
  80. package/dist/agent/plan.js +118 -0
  81. package/dist/agent/prompt.js +120 -0
  82. package/dist/agent/subagent.js +67 -0
  83. package/dist/agent/tasks.js +449 -0
  84. package/dist/agent/transcript.js +62 -0
  85. package/dist/agent/workerStore.js +172 -0
  86. package/dist/agent/workerTypes.js +1 -0
  87. package/dist/agent/workers.js +503 -0
  88. package/dist/cli/app.js +261 -0
  89. package/dist/cli/argv.js +206 -0
  90. package/dist/cli/commandsCommand.js +12 -0
  91. package/dist/cli/configCommand.js +170 -0
  92. package/dist/cli/doctorCommand.js +112 -0
  93. package/dist/cli/exportCommand.js +85 -0
  94. package/dist/cli/forkCommand.js +24 -0
  95. package/dist/cli/linkCommand.js +272 -0
  96. package/dist/cli/loginCommand.js +69 -0
  97. package/dist/cli/mcpLoginCommand.js +68 -0
  98. package/dist/cli/pluginCommand.js +113 -0
  99. package/dist/cli/powerCommand.js +174 -0
  100. package/dist/cli/promptFooter.js +74 -0
  101. package/dist/cli/relayCommand.js +38 -0
  102. package/dist/cli/sandboxCommand.js +31 -0
  103. package/dist/cli/serveCommand.js +104 -0
  104. package/dist/cli/statusCommand.js +120 -0
  105. package/dist/cli/tui.js +1104 -0
  106. package/dist/commands/registry.js +99 -0
  107. package/dist/config/paths.js +81 -0
  108. package/dist/config/store.js +605 -0
  109. package/dist/index.js +199 -0
  110. package/dist/link/protocol.js +159 -0
  111. package/dist/link/relay.js +184 -0
  112. package/dist/link/server.js +566 -0
  113. package/dist/link/tunnel.js +90 -0
  114. package/dist/lsp/client.js +340 -0
  115. package/dist/lsp/tool.js +177 -0
  116. package/dist/mcp/client.js +469 -0
  117. package/dist/mcp/httpClient.js +191 -0
  118. package/dist/mcp/server.js +206 -0
  119. package/dist/mcp/tools.js +173 -0
  120. package/dist/oauth/device.js +111 -0
  121. package/dist/oauth/store.js +56 -0
  122. package/dist/plugins/loader.js +291 -0
  123. package/dist/plugins/market.js +98 -0
  124. package/dist/providers/anthropic.js +279 -0
  125. package/dist/providers/factory.js +109 -0
  126. package/dist/providers/openai.js +182 -0
  127. package/dist/providers/retry.js +95 -0
  128. package/dist/providers/sse.js +67 -0
  129. package/dist/providers/types.js +10 -0
  130. package/dist/rag/embeddings.js +171 -0
  131. package/dist/rag/index.js +373 -0
  132. package/dist/rag/server.js +167 -0
  133. package/dist/rag/tool.js +148 -0
  134. package/dist/sandbox/index.js +55 -0
  135. package/dist/sdk/server.js +150 -0
  136. package/dist/sdk/session.js +104 -0
  137. package/dist/session/liveness.js +148 -0
  138. package/dist/session/recorder.js +49 -0
  139. package/dist/session/store.js +171 -0
  140. package/dist/skills/index.js +428 -0
  141. package/dist/theme.js +30 -0
  142. package/dist/tools/fs.js +195 -0
  143. package/dist/tools/notebook.js +109 -0
  144. package/dist/tools/registry.js +32 -0
  145. package/dist/tools/search.js +130 -0
  146. package/dist/tools/shell.js +200 -0
  147. package/dist/tools/structured.js +83 -0
  148. package/dist/tools/types.js +1 -0
  149. package/dist/ui/ansi.js +135 -0
  150. package/dist/ui/banner.js +103 -0
  151. package/dist/ui/input.js +49 -0
  152. package/dist/ui/inputModel.js +113 -0
  153. package/dist/ui/keyboard.js +142 -0
  154. package/dist/ui/mascot.js +34 -0
  155. package/dist/ui/mascotData.js +96 -0
  156. package/dist/ui/md.js +183 -0
  157. package/dist/ui/screen.js +49 -0
  158. package/dist/ui/spinner.js +52 -0
  159. package/dist/ui/transcript.js +287 -0
  160. package/dist/util/clipboard.js +53 -0
  161. package/dist/util/errors.js +50 -0
  162. package/dist/util/version.js +12 -0
  163. package/dist/web/fetch.js +168 -0
  164. package/dist/web/search.js +97 -0
  165. package/package.json +45 -36
  166. package/src/agent/loop.ts +0 -159
  167. package/src/agent/prompt.ts +0 -45
  168. package/src/cli/app.ts +0 -396
  169. package/src/cli/argv.ts +0 -139
  170. package/src/cli/configCommand.ts +0 -175
  171. package/src/config/paths.ts +0 -20
  172. package/src/config/store.ts +0 -149
  173. package/src/index.ts +0 -120
  174. package/src/providers/anthropic.ts +0 -215
  175. package/src/providers/openai.ts +0 -158
  176. package/src/providers/sse.ts +0 -57
  177. package/src/providers/types.ts +0 -59
  178. package/src/session/store.ts +0 -125
  179. package/src/theme.ts +0 -41
  180. package/src/tools/fs.ts +0 -143
  181. package/src/tools/registry.ts +0 -19
  182. package/src/tools/shell.ts +0 -120
  183. package/src/tools/types.ts +0 -26
  184. package/src/ui/ansi.ts +0 -110
  185. package/src/ui/banner.ts +0 -39
  186. package/src/ui/input.ts +0 -54
  187. package/src/ui/md.ts +0 -160
  188. package/src/ui/spinner.ts +0 -58
  189. package/src/util/errors.ts +0 -48
@@ -0,0 +1,96 @@
1
+ // Generated by scripts/build-mascot.py — do not edit by hand.
2
+ // Pixel mascot: 16x16 pixels, drawn with half blocks.
3
+ export const MASCOT_WIDTH = 16;
4
+ export const MASCOT_HEIGHT = 16;
5
+ export const MASCOT_FRAMES = [
6
+ [
7
+ [null, null, null, null, '#9a88dc', '#b9aaf0', '#9a88dc', null, null, null, null, null, null, null, null, null],
8
+ [null, null, null, '#b9aaf0', '#b9aaf0', null, null, null, null, null, null, null, null, null, null, null],
9
+ [null, null, '#9a88dc', '#b9aaf0', '#b9aaf0', null, null, null, null, null, null, null, null, null, null, null],
10
+ [null, '#9a88dc', '#b9aaf0', '#b9aaf0', '#b9aaf0', '#9a88dc', '#9a88dc', null, null, null, '#cfc4e7', null, null, null, null, null],
11
+ [null, '#9a88dc', '#b9aaf0', '#b9aaf0', '#b9aaf0', '#cfc4e7', '#cfc4e7', '#cfc4e7', '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#cfc4e7', null, null, null],
12
+ [null, '#9a88dc', '#9a88dc', '#b9aaf0', '#cfc4e7', '#cfc4e7', '#cfc4e7', '#cfc4e7', '#cfc4e7', '#cfc4e7', '#cfc4e7', '#fef6e6', '#fef6e6', null, null, null],
13
+ [null, '#171b34', '#9a88dc', '#cfc4e7', '#171b34', '#171b34', '#171b34', '#171b34', '#171b34', '#171b34', '#171b34', '#cfc4e7', '#fef6e6', null, null, null],
14
+ [null, null, '#b9aaf0', '#171b34', '#171b34', '#7ff7ba', '#171b34', '#171b34', '#171b34', '#7ff7ba', '#171b34', '#171b34', '#fef6e6', '#9a88dc', null, null],
15
+ [null, null, '#fef6e6', '#171b34', '#171b34', '#7ff7ba', '#171b34', '#171b34', '#171b34', '#7ff7ba', '#7ff7ba', '#171b34', '#cfc4e7', '#9a88dc', null, null],
16
+ [null, null, '#fef6e6', '#171b34', '#171b34', '#7ff7ba', '#171b34', '#171b34', '#171b34', '#7ff7ba', '#171b34', '#171b34', '#fef6e6', null, null, null],
17
+ [null, null, '#cfc4e7', '#cfc4e7', '#171b34', '#171b34', '#171b34', '#171b34', '#171b34', '#171b34', '#171b34', '#cfc4e7', '#cfc4e7', '#cfc4e7', '#cfc4e7', null],
18
+ [null, null, null, '#fef6e6', '#fef6e6', '#cfc4e7', '#cfc4e7', '#cfc4e7', '#cfc4e7', '#cfc4e7', '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#cfc4e7', null],
19
+ [null, null, '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#cfc4e7', '#fef6e6', '#cfc4e7', null, null],
20
+ [null, null, '#fef6e6', '#9a88dc', '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#cfc4e7', null, null, null, null],
21
+ [null, null, '#9a88dc', null, '#cfc4e7', '#fef6e6', '#fef6e6', '#cfc4e7', '#fef6e6', '#fef6e6', '#fef6e6', '#9a88dc', null, null, null, null],
22
+ [null, null, null, null, null, '#fef6e6', '#b9aaf0', null, '#9a88dc', '#fef6e6', '#cfc4e7', null, null, null, null, null],
23
+ ],
24
+ [
25
+ [null, null, null, null, '#9a88dc', '#b9aaf0', '#9a88dc', null, null, null, null, null, null, null, null, null],
26
+ [null, null, null, '#b9aaf0', '#b9aaf0', null, null, null, null, null, null, null, null, null, null, null],
27
+ [null, null, '#9a88dc', '#b9aaf0', '#b9aaf0', null, null, null, null, null, null, null, null, null, null, null],
28
+ [null, '#9a88dc', '#b9aaf0', '#b9aaf0', '#b9aaf0', '#9a88dc', '#9a88dc', null, null, null, '#cfc4e7', null, null, null, null, null],
29
+ [null, '#9a88dc', '#b9aaf0', '#b9aaf0', '#b9aaf0', '#cfc4e7', '#cfc4e7', '#cfc4e7', '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#cfc4e7', null, null, null],
30
+ [null, '#9a88dc', '#9a88dc', '#b9aaf0', '#cfc4e7', '#cfc4e7', '#cfc4e7', '#cfc4e7', '#cfc4e7', '#cfc4e7', '#cfc4e7', '#fef6e6', '#fef6e6', null, null, null],
31
+ [null, '#171b34', '#9a88dc', '#cfc4e7', '#171b34', '#171b34', '#171b34', '#171b34', '#171b34', '#171b34', '#171b34', '#cfc4e7', '#fef6e6', null, null, null],
32
+ [null, null, '#b9aaf0', '#171b34', '#171b34', '#171b34', '#171b34', '#171b34', '#171b34', '#171b34', '#171b34', '#171b34', '#fef6e6', '#9a88dc', null, null],
33
+ [null, null, '#fef6e6', '#171b34', '#171b34', '#171b34', '#171b34', '#171b34', '#171b34', '#171b34', '#171b34', '#171b34', '#cfc4e7', '#9a88dc', null, null],
34
+ [null, null, '#fef6e6', '#171b34', '#171b34', '#7ff7ba', '#171b34', '#171b34', '#171b34', '#7ff7ba', '#171b34', '#171b34', '#fef6e6', null, null, null],
35
+ [null, null, '#cfc4e7', '#cfc4e7', '#171b34', '#171b34', '#171b34', '#171b34', '#171b34', '#171b34', '#171b34', '#cfc4e7', '#cfc4e7', '#cfc4e7', '#cfc4e7', null],
36
+ [null, null, null, '#fef6e6', '#fef6e6', '#cfc4e7', '#cfc4e7', '#cfc4e7', '#cfc4e7', '#cfc4e7', '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#cfc4e7', null],
37
+ [null, null, '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#cfc4e7', '#fef6e6', '#cfc4e7', null, null],
38
+ [null, null, '#fef6e6', '#9a88dc', '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#cfc4e7', null, null, null, null],
39
+ [null, null, '#9a88dc', null, '#cfc4e7', '#fef6e6', '#fef6e6', '#cfc4e7', '#fef6e6', '#fef6e6', '#fef6e6', '#9a88dc', null, null, null, null],
40
+ [null, null, null, null, null, '#fef6e6', '#b9aaf0', null, '#9a88dc', '#fef6e6', '#cfc4e7', null, null, null, null, null],
41
+ ],
42
+ [
43
+ [null, null, null, null, '#9a88dc', '#b9aaf0', '#9a88dc', null, null, null, null, null, null, null, null, null],
44
+ [null, null, null, '#b9aaf0', '#b9aaf0', null, null, null, null, null, null, null, null, null, null, null],
45
+ [null, null, '#9a88dc', '#b9aaf0', '#b9aaf0', null, null, null, null, null, null, null, null, null, null, null],
46
+ [null, '#9a88dc', '#b9aaf0', '#b9aaf0', '#b9aaf0', '#9a88dc', '#9a88dc', null, null, null, '#cfc4e7', null, null, null, null, null],
47
+ [null, '#9a88dc', '#b9aaf0', '#b9aaf0', '#b9aaf0', '#cfc4e7', '#cfc4e7', '#cfc4e7', '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#cfc4e7', null, null, null],
48
+ [null, '#9a88dc', '#9a88dc', '#b9aaf0', '#cfc4e7', '#cfc4e7', '#cfc4e7', '#cfc4e7', '#cfc4e7', '#cfc4e7', '#cfc4e7', '#fef6e6', '#fef6e6', null, null, null],
49
+ [null, '#171b34', '#9a88dc', '#cfc4e7', '#171b34', '#171b34', '#171b34', '#171b34', '#171b34', '#171b34', '#171b34', '#cfc4e7', '#fef6e6', null, null, null],
50
+ [null, null, '#b9aaf0', '#171b34', '#171b34', '#7ff7ba', '#171b34', '#171b34', '#171b34', '#7ff7ba', '#171b34', '#171b34', '#fef6e6', '#9a88dc', null, null],
51
+ [null, null, '#fef6e6', '#171b34', '#171b34', '#7ff7ba', '#171b34', '#171b34', '#171b34', '#7ff7ba', '#7ff7ba', '#171b34', '#cfc4e7', '#9a88dc', null, null],
52
+ [null, null, '#fef6e6', '#171b34', '#171b34', '#7ff7ba', '#171b34', '#171b34', '#171b34', '#7ff7ba', '#171b34', '#171b34', '#fef6e6', null, null, null],
53
+ [null, null, '#cfc4e7', '#cfc4e7', '#171b34', '#171b34', '#171b34', '#171b34', '#171b34', '#171b34', '#171b34', '#cfc4e7', '#cfc4e7', '#cfc4e7', '#cfc4e7', null],
54
+ [null, null, null, '#fef6e6', '#fef6e6', '#cfc4e7', '#cfc4e7', '#cfc4e7', '#cfc4e7', '#cfc4e7', '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#cfc4e7', null],
55
+ [null, null, '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#cfc4e7', '#fef6e6', '#cfc4e7', null, null],
56
+ [null, null, '#fef6e6', '#9a88dc', '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#cfc4e7', null, null, null, null],
57
+ [null, null, '#9a88dc', null, '#cfc4e7', '#fef6e6', '#fef6e6', '#cfc4e7', '#fef6e6', '#fef6e6', '#fef6e6', '#9a88dc', null, null, null, null],
58
+ [null, null, null, null, null, '#fef6e6', '#b9aaf0', null, '#9a88dc', '#fef6e6', '#cfc4e7', null, null, null, null, null],
59
+ ],
60
+ [
61
+ [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null],
62
+ [null, null, null, null, '#9a88dc', '#b9aaf0', '#9a88dc', null, null, null, null, null, null, null, null, null],
63
+ [null, null, null, '#b9aaf0', '#b9aaf0', null, null, null, null, null, null, null, null, null, null, null],
64
+ [null, null, '#9a88dc', '#b9aaf0', '#b9aaf0', null, null, null, null, null, null, null, null, null, null, null],
65
+ [null, '#9a88dc', '#b9aaf0', '#b9aaf0', '#b9aaf0', '#9a88dc', '#9a88dc', null, null, null, '#cfc4e7', null, null, null, null, null],
66
+ [null, '#9a88dc', '#b9aaf0', '#b9aaf0', '#b9aaf0', '#cfc4e7', '#cfc4e7', '#cfc4e7', '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#cfc4e7', null, null, null],
67
+ [null, '#9a88dc', '#9a88dc', '#b9aaf0', '#cfc4e7', '#cfc4e7', '#cfc4e7', '#cfc4e7', '#cfc4e7', '#cfc4e7', '#cfc4e7', '#fef6e6', '#fef6e6', null, null, null],
68
+ [null, '#171b34', '#9a88dc', '#cfc4e7', '#171b34', '#171b34', '#171b34', '#171b34', '#171b34', '#171b34', '#171b34', '#cfc4e7', '#fef6e6', null, null, null],
69
+ [null, null, '#b9aaf0', '#171b34', '#171b34', '#7ff7ba', '#171b34', '#171b34', '#171b34', '#7ff7ba', '#171b34', '#171b34', '#fef6e6', '#9a88dc', null, null],
70
+ [null, null, '#fef6e6', '#171b34', '#171b34', '#7ff7ba', '#171b34', '#171b34', '#171b34', '#7ff7ba', '#7ff7ba', '#171b34', '#cfc4e7', '#9a88dc', null, null],
71
+ [null, null, '#fef6e6', '#171b34', '#171b34', '#7ff7ba', '#171b34', '#171b34', '#171b34', '#7ff7ba', '#171b34', '#171b34', '#fef6e6', null, null, null],
72
+ [null, null, '#cfc4e7', '#cfc4e7', '#171b34', '#171b34', '#171b34', '#171b34', '#171b34', '#171b34', '#171b34', '#cfc4e7', '#cfc4e7', '#cfc4e7', '#cfc4e7', null],
73
+ [null, null, null, '#fef6e6', '#fef6e6', '#cfc4e7', '#cfc4e7', '#cfc4e7', '#cfc4e7', '#cfc4e7', '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#cfc4e7', null],
74
+ [null, null, '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#cfc4e7', '#fef6e6', '#cfc4e7', null, null],
75
+ [null, null, '#fef6e6', '#9a88dc', '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#cfc4e7', null, null, null, null],
76
+ [null, null, '#9a88dc', null, '#cfc4e7', '#fef6e6', '#fef6e6', '#cfc4e7', '#fef6e6', '#fef6e6', '#fef6e6', '#9a88dc', null, null, null, null],
77
+ ],
78
+ [
79
+ [null, null, null, null, '#9a88dc', '#b9aaf0', '#9a88dc', null, null, null, null, null, null, null, null, null],
80
+ [null, null, null, '#b9aaf0', '#b9aaf0', null, null, null, null, null, null, null, null, null, null, null],
81
+ [null, null, '#9a88dc', '#b9aaf0', '#b9aaf0', null, null, null, null, null, null, null, null, null, null, null],
82
+ [null, '#9a88dc', '#b9aaf0', '#b9aaf0', '#b9aaf0', '#9a88dc', '#9a88dc', null, null, null, '#cfc4e7', null, null, null, null, null],
83
+ [null, '#9a88dc', '#b9aaf0', '#b9aaf0', '#b9aaf0', '#cfc4e7', '#cfc4e7', '#cfc4e7', '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#cfc4e7', null, null, null],
84
+ [null, '#9a88dc', '#9a88dc', '#b9aaf0', '#cfc4e7', '#cfc4e7', '#cfc4e7', '#cfc4e7', '#cfc4e7', '#cfc4e7', '#cfc4e7', '#fef6e6', '#fef6e6', null, null, null],
85
+ [null, '#171b34', '#9a88dc', '#cfc4e7', '#171b34', '#171b34', '#171b34', '#171b34', '#171b34', '#171b34', '#171b34', '#cfc4e7', '#fef6e6', null, null, null],
86
+ [null, null, '#b9aaf0', '#171b34', '#171b34', '#7ff7ba', '#171b34', '#171b34', '#171b34', '#7ff7ba', '#171b34', '#171b34', '#fef6e6', '#9a88dc', null, null],
87
+ [null, null, '#fef6e6', '#171b34', '#171b34', '#7ff7ba', '#171b34', '#171b34', '#171b34', '#7ff7ba', '#7ff7ba', '#171b34', '#cfc4e7', '#9a88dc', null, null],
88
+ [null, null, '#fef6e6', '#171b34', '#171b34', '#7ff7ba', '#171b34', '#171b34', '#171b34', '#7ff7ba', '#171b34', '#171b34', '#fef6e6', null, null, null],
89
+ [null, null, '#cfc4e7', '#cfc4e7', '#171b34', '#171b34', '#171b34', '#171b34', '#171b34', '#171b34', '#171b34', '#cfc4e7', '#cfc4e7', '#cfc4e7', '#cfc4e7', null],
90
+ [null, null, null, '#fef6e6', '#fef6e6', '#cfc4e7', '#cfc4e7', '#cfc4e7', '#cfc4e7', '#cfc4e7', '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#cfc4e7', null],
91
+ [null, null, '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#cfc4e7', '#fef6e6', '#cfc4e7', null, null],
92
+ [null, null, '#fef6e6', '#9a88dc', '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#fef6e6', '#cfc4e7', null, null, null, null],
93
+ [null, null, '#9a88dc', null, '#cfc4e7', '#fef6e6', '#fef6e6', '#cfc4e7', '#fef6e6', '#fef6e6', '#fef6e6', '#9a88dc', null, null, null, null],
94
+ [null, null, null, null, null, '#fef6e6', '#b9aaf0', null, '#9a88dc', '#fef6e6', '#cfc4e7', null, null, null, null, null],
95
+ ]
96
+ ];
package/dist/ui/md.js ADDED
@@ -0,0 +1,183 @@
1
+ import { visibleWidth, wrapText } from "./ansi.js";
2
+ /**
3
+ * Streams model text to the terminal.
4
+ *
5
+ * Formatting happens line by line: fenced code gets a violet gutter, everything
6
+ * else is printed as-is while it streams (never re-rendered, so nothing flickers).
7
+ */
8
+ export class StreamRenderer {
9
+ painter;
10
+ sink;
11
+ pending = '';
12
+ midLine = false;
13
+ inFence = false;
14
+ fenceLang = '';
15
+ fenceWidth = 0;
16
+ width;
17
+ indent;
18
+ constructor(painter, sink, options = {}) {
19
+ this.painter = painter;
20
+ this.sink = sink;
21
+ this.width = options.width ?? 0;
22
+ this.indent = options.indent ?? ' ';
23
+ }
24
+ push(chunk) {
25
+ this.pending += chunk.replace(/\r\n/g, '\n').replace(/\r/g, '\n');
26
+ this.drain(false);
27
+ }
28
+ finish() {
29
+ this.drain(true);
30
+ if (this.midLine) {
31
+ this.sink('\n');
32
+ this.midLine = false;
33
+ }
34
+ if (this.inFence) {
35
+ this.closeFence();
36
+ }
37
+ }
38
+ drain(final) {
39
+ for (;;) {
40
+ const index = this.pending.indexOf('\n');
41
+ if (index >= 0) {
42
+ const line = this.pending.slice(0, index);
43
+ this.pending = this.pending.slice(index + 1);
44
+ this.emitLine(line, true);
45
+ continue;
46
+ }
47
+ if (final && this.pending.length > 0) {
48
+ const line = this.pending;
49
+ this.pending = '';
50
+ this.emitLine(line, true);
51
+ continue;
52
+ }
53
+ // Long single line: show it rather than waiting for a newline.
54
+ if (this.pending.length > 160) {
55
+ const parts = this.width > 0 ? wrapText(this.pending, this.width) : [this.pending];
56
+ this.sink(parts.join('\n' + this.indent));
57
+ this.pending = '';
58
+ this.midLine = true;
59
+ }
60
+ return;
61
+ }
62
+ }
63
+ emitLine(line, newline) {
64
+ if (!this.midLine && this.fenceMarker(line)) {
65
+ if (this.inFence) {
66
+ this.closeFence();
67
+ }
68
+ else {
69
+ this.openFence(line.trim().slice(3).trim());
70
+ }
71
+ this.midLine = false;
72
+ return;
73
+ }
74
+ if (!this.midLine && this.inFence) {
75
+ this.sink(this.codeLine(line) + (newline ? '\n' : ''));
76
+ this.midLine = !newline;
77
+ return;
78
+ }
79
+ const parts = this.width > 0 ? wrapText(line, this.width) : [line];
80
+ const formatted = parts.map((part, index) => index === 0
81
+ ? this.formatLine(part)
82
+ : renderInline(this.painter, part));
83
+ this.sink(formatted.join('\n' + this.indent) + (newline ? '\n' : ''));
84
+ this.midLine = !newline;
85
+ }
86
+ fenceMarker(line) {
87
+ return line.trimStart().startsWith('```');
88
+ }
89
+ /** Headings, bullets and inline markup for a finished line. */
90
+ formatLine(line) {
91
+ const heading = /^(#{1,6})\s+(.*)$/.exec(line);
92
+ if (heading) {
93
+ return this.painter.bold(this.painter.soft(heading[2]));
94
+ }
95
+ const bullet = /^(\s*)[-*+]\s+(.*)$/.exec(line);
96
+ if (bullet) {
97
+ return bullet[1] + this.painter.primary('• ') + renderInline(this.painter, bullet[2]);
98
+ }
99
+ return renderInline(this.painter, line);
100
+ }
101
+ /** Code lines sit on a soft violet band when colour is available. */
102
+ codeLine(line) {
103
+ if (!this.painter.enabled || this.width <= 0) {
104
+ return this.painter.fg('#8f7fb8', ' │ ') + line;
105
+ }
106
+ const inner = ' ' + line;
107
+ const padding = ' '.repeat(Math.max(0, this.width + 2 - visibleWidth(inner)));
108
+ return this.painter.bg('#241d33', this.painter.fg('#ded7ef', inner + padding));
109
+ }
110
+ openFence(lang) {
111
+ this.inFence = true;
112
+ this.fenceLang = lang;
113
+ if (!this.painter.enabled || this.width <= 0) {
114
+ this.fenceWidth = Math.max(24, Math.min(visibleWidth(lang) + 16, 64));
115
+ this.sink(this.painter.fg('#8f7fb8', ' ╭─ ' + (lang || '代码')) + '\n');
116
+ return;
117
+ }
118
+ const label = (lang.length > 0 ? ' ' + lang : ' 代码') + ' ';
119
+ const band = label + ' '.repeat(Math.max(0, this.width + 2 - visibleWidth(label)));
120
+ this.sink(this.painter.bg('#241d33', this.painter.soft(band)) + '\n');
121
+ }
122
+ closeFence() {
123
+ this.inFence = false;
124
+ if (!this.painter.enabled || this.width <= 0) {
125
+ this.sink(this.painter.fg('#8f7fb8', ' ╰' + '─'.repeat(Math.max(2, this.fenceWidth - 2))) + '\n');
126
+ return;
127
+ }
128
+ this.sink(this.painter.bg('#241d33', ' '.repeat(this.width + 2)) + '\n');
129
+ }
130
+ }
131
+ /** One-off markdown rendering for help text and tool output. */
132
+ export function renderInline(painter, line) {
133
+ let text = line;
134
+ text = text.replace(/`([^`]+)`/g, (_all, code) => painter.fg('#d8b4fe', code));
135
+ text = text.replace(/\*\*([^*]+)\*\*/g, (_all, bold) => painter.bold(bold));
136
+ text = text.replace(/(^|[^*])\*([^*\n]+)\*(?!\*)/g, (_all, pre, em) => pre + painter.italic(em));
137
+ text = text.replace(/\[([^\]]+)\]\((https?:[^)]+)\)/g, (_all, label, url) => painter.primary(label) + painter.dimmed(' ' + url));
138
+ return text;
139
+ }
140
+ export function renderMarkdown(painter, source) {
141
+ const out = [];
142
+ let fence = false;
143
+ let lang = '';
144
+ for (const line of source.replace(/\r\n/g, '\n').split('\n')) {
145
+ if (line.trimStart().startsWith('```')) {
146
+ if (fence) {
147
+ out.push(painter.fg('#8f7fb8', ' ╰' + '─'.repeat(40)));
148
+ fence = false;
149
+ lang = '';
150
+ }
151
+ else {
152
+ fence = true;
153
+ lang = line.trim().slice(3).trim();
154
+ out.push(painter.fg('#8f7fb8', ' ╭─ ' + (lang || '代码') + ' ' + '─'.repeat(30)));
155
+ }
156
+ continue;
157
+ }
158
+ if (fence) {
159
+ out.push(painter.fg('#8f7fb8', ' │ ') + line);
160
+ continue;
161
+ }
162
+ const heading = /^(#{1,4})\s+(.*)$/.exec(line);
163
+ if (heading) {
164
+ out.push(painter.soft(painter.bold(heading[2])));
165
+ continue;
166
+ }
167
+ if (/^\s*(---|\*\*\*)\s*$/.test(line)) {
168
+ out.push(painter.dimmed('─'.repeat(40)));
169
+ continue;
170
+ }
171
+ const bullet = /^(\s*)[-*+]\s+(.*)$/.exec(line);
172
+ if (bullet) {
173
+ out.push(bullet[1] + painter.primary('• ') + renderInline(painter, bullet[2]));
174
+ continue;
175
+ }
176
+ if (line.startsWith('> ')) {
177
+ out.push(painter.fg('#8f7fb8', '│ ') + painter.dim(renderInline(painter, line.slice(2))));
178
+ continue;
179
+ }
180
+ out.push(renderInline(painter, line));
181
+ }
182
+ return out.join('\n');
183
+ }
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Full-screen terminal control: alternate buffer, raw keys, mouse wheel and
3
+ * absolute-positioned redraws.
4
+ */
5
+ export class Screen {
6
+ entered = false;
7
+ enter() {
8
+ if (this.entered) {
9
+ return;
10
+ }
11
+ this.entered = true;
12
+ // 1000: buttons + wheel, 1002: button-motion (required for drag selection),
13
+ // 1006: SGR coordinates. Without 1002 no drag events ever arrive.
14
+ process.stdout.write('\x1b[?1049h\x1b[?25l\x1b[?2004h\x1b[?1000h\x1b[?1002h\x1b[?1006h');
15
+ }
16
+ leave() {
17
+ if (!this.entered) {
18
+ return;
19
+ }
20
+ this.entered = false;
21
+ process.stdout.write('\x1b[?2004l\x1b[?1006l\x1b[?1002l\x1b[?1000l\x1b[?25h\x1b[?1049l');
22
+ }
23
+ get rows() {
24
+ const rows = process.stdout.rows;
25
+ return typeof rows === 'number' && rows >= 8 ? rows : 30;
26
+ }
27
+ get columns() {
28
+ const columns = process.stdout.columns;
29
+ return typeof columns === 'number' && columns >= 20 ? columns : 100;
30
+ }
31
+ draw(frame, cursorRow, cursorColumn) {
32
+ if (!this.entered) {
33
+ return;
34
+ }
35
+ const rows = this.rows;
36
+ let out = '';
37
+ for (let index = 0; index < rows; index += 1) {
38
+ out += '\x1b[' + (index + 1) + ';1H\x1b[2K' + (frame[index] ?? '');
39
+ }
40
+ out += '\x1b[' + cursorRow + ';' + cursorColumn + 'H\x1b[?25h';
41
+ process.stdout.write(out);
42
+ }
43
+ hideCursor() {
44
+ process.stdout.write('\x1b[?25l');
45
+ }
46
+ showCursor() {
47
+ process.stdout.write('\x1b[?25h');
48
+ }
49
+ }
@@ -0,0 +1,52 @@
1
+ const FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
2
+ /** One-line activity indicator. Never writes when stdout is not a TTY. */
3
+ export class Spinner {
4
+ painter;
5
+ timer = null;
6
+ frame = 0;
7
+ label = '';
8
+ startedAt = 0;
9
+ showing = false;
10
+ constructor(painter) {
11
+ this.painter = painter;
12
+ }
13
+ get active() {
14
+ return this.timer !== null;
15
+ }
16
+ start(label) {
17
+ this.label = label;
18
+ if (!process.stdout.isTTY) {
19
+ return;
20
+ }
21
+ if (this.timer === null) {
22
+ this.startedAt = Date.now();
23
+ }
24
+ this.timer = this.timer ?? setInterval(() => this.tick(), 90);
25
+ this.tick();
26
+ }
27
+ update(label) {
28
+ this.label = label;
29
+ }
30
+ stop() {
31
+ if (this.timer !== null) {
32
+ clearInterval(this.timer);
33
+ this.timer = null;
34
+ }
35
+ this.clear();
36
+ }
37
+ /** Erase the spinner line so streamed text starts on a clean line. */
38
+ clear() {
39
+ if (this.showing) {
40
+ process.stdout.write('\r\x1b[2K');
41
+ this.showing = false;
42
+ }
43
+ }
44
+ tick() {
45
+ this.frame = (this.frame + 1) % FRAMES.length;
46
+ const seconds = ((Date.now() - this.startedAt) / 1000).toFixed(0);
47
+ const line = this.painter.primary(FRAMES[this.frame]) + ' ' +
48
+ this.painter.muted(this.label + ' ' + seconds + 's');
49
+ process.stdout.write('\r\x1b[2K' + line);
50
+ this.showing = true;
51
+ }
52
+ }