@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.
- package/README.md +577 -2
- package/assets/mascot-preview.png +0 -0
- package/assets/mascot-preview.txt +46 -0
- package/assets/mascot-source.png +0 -0
- package/assets/skills/README.md +21 -0
- package/assets/skills/brainstorming/LICENSE +21 -0
- package/assets/skills/brainstorming/SKILL.md +316 -0
- package/assets/skills/buddhist-method/LICENSE +21 -0
- package/assets/skills/buddhist-method/SKILL.md +137 -0
- package/assets/skills/buddhist-method/references/ariyasacca-debug.md +57 -0
- package/assets/skills/buddhist-method/references/extended-principles.md +100 -0
- package/assets/skills/code-humanizer/LICENSE +21 -0
- package/assets/skills/code-humanizer/SKILL.md +174 -0
- package/assets/skills/code-review/LICENSE +21 -0
- package/assets/skills/code-review/SKILL.md +232 -0
- package/assets/skills/code-review/reference/angular.md +768 -0
- package/assets/skills/code-review/reference/architecture-review-guide.md +472 -0
- package/assets/skills/code-review/reference/c.md +890 -0
- package/assets/skills/code-review/reference/code-quality-universal.md +488 -0
- package/assets/skills/code-review/reference/code-review-best-practices.md +136 -0
- package/assets/skills/code-review/reference/common-bugs-checklist.md +302 -0
- package/assets/skills/code-review/reference/cpp.md +893 -0
- package/assets/skills/code-review/reference/cross-cutting/async-concurrency-patterns.md +515 -0
- package/assets/skills/code-review/reference/cross-cutting/error-handling-principles.md +492 -0
- package/assets/skills/code-review/reference/cross-cutting/n-plus-one-queries.md +309 -0
- package/assets/skills/code-review/reference/cross-cutting/sql-injection-prevention.md +308 -0
- package/assets/skills/code-review/reference/cross-cutting/xss-prevention.md +264 -0
- package/assets/skills/code-review/reference/csharp.md +525 -0
- package/assets/skills/code-review/reference/css-less-sass.md +661 -0
- package/assets/skills/code-review/reference/dart.md +670 -0
- package/assets/skills/code-review/reference/django.md +985 -0
- package/assets/skills/code-review/reference/fastapi.md +580 -0
- package/assets/skills/code-review/reference/go.md +993 -0
- package/assets/skills/code-review/reference/java.md +409 -0
- package/assets/skills/code-review/reference/java8.md +586 -0
- package/assets/skills/code-review/reference/kotlin.md +1018 -0
- package/assets/skills/code-review/reference/nestjs.md +593 -0
- package/assets/skills/code-review/reference/performance-review-guide.md +816 -0
- package/assets/skills/code-review/reference/php.md +684 -0
- package/assets/skills/code-review/reference/python.md +1073 -0
- package/assets/skills/code-review/reference/qt.md +757 -0
- package/assets/skills/code-review/reference/react.md +871 -0
- package/assets/skills/code-review/reference/ruby.md +964 -0
- package/assets/skills/code-review/reference/rust.md +846 -0
- package/assets/skills/code-review/reference/security-review-guide.md +494 -0
- package/assets/skills/code-review/reference/svelte.md +1064 -0
- package/assets/skills/code-review/reference/swift.md +936 -0
- package/assets/skills/code-review/reference/typescript.md +1016 -0
- package/assets/skills/code-review/reference/vue.md +924 -0
- package/assets/skills/code-review/reference/zig.md +440 -0
- package/assets/skills/cyclomatic-complexity/LICENSE +201 -0
- package/assets/skills/cyclomatic-complexity/SKILL.md +69 -0
- package/assets/skills/five-whys/LICENSE +21 -0
- package/assets/skills/five-whys/SKILL.md +247 -0
- package/assets/skills/five-whys/examples/performance-regression.md +161 -0
- package/assets/skills/five-whys/examples/production-incident.md +134 -0
- package/assets/skills/five-whys/references/software-patterns.md +284 -0
- package/assets/skills/five-whys/references/toyota-origins.md +257 -0
- package/assets/skills/systematic-debugging/LICENSE +21 -0
- package/assets/skills/systematic-debugging/SKILL.md +283 -0
- package/assets/skills/test-driven-development/LICENSE +21 -0
- package/assets/skills/test-driven-development/SKILL.md +330 -0
- package/assets/skills/verification-before-completion/LICENSE +21 -0
- package/assets/skills/verification-before-completion/SKILL.md +120 -0
- package/assets/skills/vibe-sec/LICENSE +201 -0
- package/assets/skills/vibe-sec/SKILL.md +758 -0
- package/assets/skills/writing-plans/LICENSE +21 -0
- package/assets/skills/writing-plans/SKILL.md +204 -0
- package/bin/minko.js +2 -2
- package/dist/agent/approvalTokens.js +224 -0
- package/dist/agent/branchLock.js +315 -0
- package/dist/agent/compact.js +182 -0
- package/dist/agent/context.js +183 -0
- package/dist/agent/cron.js +326 -0
- package/dist/agent/hooks.js +211 -0
- package/dist/agent/lanes.js +511 -0
- package/dist/agent/loop.js +337 -0
- package/dist/agent/memory.js +159 -0
- package/dist/agent/permissions.js +71 -0
- package/dist/agent/plan.js +118 -0
- package/dist/agent/prompt.js +120 -0
- package/dist/agent/subagent.js +67 -0
- package/dist/agent/tasks.js +449 -0
- package/dist/agent/transcript.js +62 -0
- package/dist/agent/workerStore.js +172 -0
- package/dist/agent/workerTypes.js +1 -0
- package/dist/agent/workers.js +503 -0
- package/dist/cli/app.js +261 -0
- package/dist/cli/argv.js +206 -0
- package/dist/cli/commandsCommand.js +12 -0
- package/dist/cli/configCommand.js +170 -0
- package/dist/cli/doctorCommand.js +112 -0
- package/dist/cli/exportCommand.js +85 -0
- package/dist/cli/forkCommand.js +24 -0
- package/dist/cli/linkCommand.js +272 -0
- package/dist/cli/loginCommand.js +69 -0
- package/dist/cli/mcpLoginCommand.js +68 -0
- package/dist/cli/pluginCommand.js +113 -0
- package/dist/cli/powerCommand.js +174 -0
- package/dist/cli/promptFooter.js +74 -0
- package/dist/cli/relayCommand.js +38 -0
- package/dist/cli/sandboxCommand.js +31 -0
- package/dist/cli/serveCommand.js +104 -0
- package/dist/cli/statusCommand.js +120 -0
- package/dist/cli/tui.js +1104 -0
- package/dist/commands/registry.js +99 -0
- package/dist/config/paths.js +81 -0
- package/dist/config/store.js +605 -0
- package/dist/index.js +199 -0
- package/dist/link/protocol.js +159 -0
- package/dist/link/relay.js +184 -0
- package/dist/link/server.js +566 -0
- package/dist/link/tunnel.js +90 -0
- package/dist/lsp/client.js +340 -0
- package/dist/lsp/tool.js +177 -0
- package/dist/mcp/client.js +469 -0
- package/dist/mcp/httpClient.js +191 -0
- package/dist/mcp/server.js +206 -0
- package/dist/mcp/tools.js +173 -0
- package/dist/oauth/device.js +111 -0
- package/dist/oauth/store.js +56 -0
- package/dist/plugins/loader.js +291 -0
- package/dist/plugins/market.js +98 -0
- package/dist/providers/anthropic.js +279 -0
- package/dist/providers/factory.js +109 -0
- package/dist/providers/openai.js +182 -0
- package/dist/providers/retry.js +95 -0
- package/dist/providers/sse.js +67 -0
- package/dist/providers/types.js +10 -0
- package/dist/rag/embeddings.js +171 -0
- package/dist/rag/index.js +373 -0
- package/dist/rag/server.js +167 -0
- package/dist/rag/tool.js +148 -0
- package/dist/sandbox/index.js +55 -0
- package/dist/sdk/server.js +150 -0
- package/dist/sdk/session.js +104 -0
- package/dist/session/liveness.js +148 -0
- package/dist/session/recorder.js +49 -0
- package/dist/session/store.js +171 -0
- package/dist/skills/index.js +428 -0
- package/dist/theme.js +30 -0
- package/dist/tools/fs.js +195 -0
- package/dist/tools/notebook.js +109 -0
- package/dist/tools/registry.js +32 -0
- package/dist/tools/search.js +130 -0
- package/dist/tools/shell.js +200 -0
- package/dist/tools/structured.js +83 -0
- package/dist/tools/types.js +1 -0
- package/dist/ui/ansi.js +135 -0
- package/dist/ui/banner.js +103 -0
- package/dist/ui/input.js +49 -0
- package/dist/ui/inputModel.js +113 -0
- package/dist/ui/keyboard.js +142 -0
- package/dist/ui/mascot.js +34 -0
- package/dist/ui/mascotData.js +96 -0
- package/dist/ui/md.js +183 -0
- package/dist/ui/screen.js +49 -0
- package/dist/ui/spinner.js +52 -0
- package/dist/ui/transcript.js +287 -0
- package/dist/util/clipboard.js +53 -0
- package/dist/util/errors.js +50 -0
- package/dist/util/version.js +12 -0
- package/dist/web/fetch.js +168 -0
- package/dist/web/search.js +97 -0
- package/package.json +45 -36
- package/src/agent/loop.ts +0 -159
- package/src/agent/prompt.ts +0 -45
- package/src/cli/app.ts +0 -396
- package/src/cli/argv.ts +0 -139
- package/src/cli/configCommand.ts +0 -175
- package/src/config/paths.ts +0 -20
- package/src/config/store.ts +0 -149
- package/src/index.ts +0 -120
- package/src/providers/anthropic.ts +0 -215
- package/src/providers/openai.ts +0 -158
- package/src/providers/sse.ts +0 -57
- package/src/providers/types.ts +0 -59
- package/src/session/store.ts +0 -125
- package/src/theme.ts +0 -41
- package/src/tools/fs.ts +0 -143
- package/src/tools/registry.ts +0 -19
- package/src/tools/shell.ts +0 -120
- package/src/tools/types.ts +0 -26
- package/src/ui/ansi.ts +0 -110
- package/src/ui/banner.ts +0 -39
- package/src/ui/input.ts +0 -54
- package/src/ui/md.ts +0 -160
- package/src/ui/spinner.ts +0 -58
- 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
|
+
}
|