@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,62 @@
1
+ export const INTERRUPTED_TOOL_RESULT = '工具没有执行:本轮被中断或者没有返回结果。';
2
+ /**
3
+ * Every assistant tool call must be followed by a tool result. Providers
4
+ * reject a resumed transcript that contains an orphaned tool call.
5
+ */
6
+ export function transcriptProblems(messages) {
7
+ const problems = [];
8
+ let pending = [];
9
+ const flush = () => {
10
+ for (const call of pending) {
11
+ problems.push('tool call ' + call.id + ' (' + call.name + ') 没有 tool_result');
12
+ }
13
+ pending = [];
14
+ };
15
+ for (const message of messages) {
16
+ if (message.role === 'assistant') {
17
+ flush();
18
+ pending = message.toolCalls.slice();
19
+ }
20
+ else if (message.role === 'tool') {
21
+ pending = pending.filter((call) => call.id !== message.toolCallId);
22
+ }
23
+ else {
24
+ flush();
25
+ }
26
+ }
27
+ flush();
28
+ return problems;
29
+ }
30
+ /**
31
+ * Fills unanswered tool calls with an explicit error result so the transcript
32
+ * stays valid across interrupts and resumed sessions.
33
+ */
34
+ export function repairTranscript(messages, reason = INTERRUPTED_TOOL_RESULT) {
35
+ const out = [];
36
+ let pending = [];
37
+ let added = 0;
38
+ const flush = () => {
39
+ for (const call of pending) {
40
+ out.push({ role: 'tool', toolCallId: call.id, name: call.name, content: reason });
41
+ added += 1;
42
+ }
43
+ pending = [];
44
+ };
45
+ for (const message of messages) {
46
+ if (message.role === 'assistant') {
47
+ flush();
48
+ out.push(message);
49
+ pending = message.toolCalls.slice();
50
+ }
51
+ else if (message.role === 'tool') {
52
+ out.push(message);
53
+ pending = pending.filter((call) => call.id !== message.toolCallId);
54
+ }
55
+ else {
56
+ flush();
57
+ out.push(message);
58
+ }
59
+ }
60
+ flush();
61
+ return { messages: out, added };
62
+ }
@@ -0,0 +1,172 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { minkoHome } from "../config/paths.js";
4
+ import { repairTranscript } from "./transcript.js";
5
+ const STATES = ['queued', 'running', 'done', 'failed', 'stopped'];
6
+ /** Durable worker records and transcripts under ~/.minko/workers. */
7
+ export class WorkerStore {
8
+ dir;
9
+ constructor(dir = path.join(minkoHome(), 'workers')) {
10
+ this.dir = dir;
11
+ }
12
+ save(info, pid = process.pid) {
13
+ try {
14
+ fs.mkdirSync(this.dir, { recursive: true });
15
+ const record = {
16
+ ...info,
17
+ pid,
18
+ updatedAt: new Date().toISOString(),
19
+ };
20
+ const file = this.metaFile(info.id);
21
+ const payload = JSON.stringify(record, null, 2);
22
+ const temporary = file + '.tmp';
23
+ fs.writeFileSync(temporary, payload, 'utf8');
24
+ try {
25
+ fs.renameSync(temporary, file);
26
+ }
27
+ catch {
28
+ fs.writeFileSync(file, payload, 'utf8');
29
+ try {
30
+ fs.unlinkSync(temporary);
31
+ }
32
+ catch { /* best effort */ }
33
+ }
34
+ }
35
+ catch {
36
+ // Persistence is advisory; the worker keeps running.
37
+ }
38
+ }
39
+ appendMessage(id, message) {
40
+ try {
41
+ fs.mkdirSync(this.dir, { recursive: true });
42
+ fs.appendFileSync(this.messagesFile(id), JSON.stringify(message) + '\n', 'utf8');
43
+ }
44
+ catch {
45
+ // Ignore transcript write failures.
46
+ }
47
+ }
48
+ loadMessages(id) {
49
+ try {
50
+ const lines = fs.readFileSync(this.messagesFile(id), 'utf8').split('\n');
51
+ const messages = [];
52
+ for (const line of lines) {
53
+ if (line.trim().length === 0) {
54
+ continue;
55
+ }
56
+ try {
57
+ const parsed = JSON.parse(line);
58
+ if (parsed && typeof parsed === 'object' && typeof parsed.role === 'string') {
59
+ messages.push(parsed);
60
+ }
61
+ }
62
+ catch {
63
+ // Skip a torn line.
64
+ }
65
+ }
66
+ return repairTranscript(messages).messages;
67
+ }
68
+ catch {
69
+ return [];
70
+ }
71
+ }
72
+ list() {
73
+ let names;
74
+ try {
75
+ names = fs.readdirSync(this.dir);
76
+ }
77
+ catch {
78
+ return [];
79
+ }
80
+ const workers = [];
81
+ for (const name of names) {
82
+ if (!name.endsWith('.json') || name.endsWith('.messages.jsonl')) {
83
+ continue;
84
+ }
85
+ const id = name.slice(0, -'.json'.length);
86
+ if (!/^[A-Za-z0-9._-]+$/.test(id)) {
87
+ continue;
88
+ }
89
+ try {
90
+ const raw = JSON.parse(fs.readFileSync(path.join(this.dir, name), 'utf8'));
91
+ const record = parseRecord(id, raw);
92
+ if (record) {
93
+ workers.push(record);
94
+ }
95
+ }
96
+ catch {
97
+ // Skip a corrupt record.
98
+ }
99
+ }
100
+ workers.sort((a, b) => (b.updatedAt ?? '').localeCompare(a.updatedAt ?? ''));
101
+ return workers;
102
+ }
103
+ get(id) {
104
+ const worker = this.list().find((entry) => entry.id === id);
105
+ if (!worker) {
106
+ return null;
107
+ }
108
+ return { worker, messages: this.loadMessages(id) };
109
+ }
110
+ /** Marks workers from previous processes as stopped. */
111
+ markStale() {
112
+ for (const worker of this.list()) {
113
+ if ((worker.state === 'running' || worker.state === 'queued')
114
+ && worker.pid !== undefined && worker.pid !== process.pid) {
115
+ this.save({
116
+ ...worker,
117
+ state: 'stopped',
118
+ error: '进程已退出(持久化恢复)',
119
+ endedAt: worker.endedAt ?? new Date().toISOString(),
120
+ }, process.pid);
121
+ }
122
+ }
123
+ }
124
+ remove(id) {
125
+ let removed = false;
126
+ try {
127
+ fs.unlinkSync(this.metaFile(id));
128
+ removed = true;
129
+ }
130
+ catch { /* missing */ }
131
+ try {
132
+ fs.unlinkSync(this.messagesFile(id));
133
+ }
134
+ catch { /* missing */ }
135
+ return removed;
136
+ }
137
+ metaFile(id) {
138
+ return path.join(this.dir, safeId(id) + '.json');
139
+ }
140
+ messagesFile(id) {
141
+ return path.join(this.dir, safeId(id) + '.messages.jsonl');
142
+ }
143
+ }
144
+ function parseRecord(id, raw) {
145
+ if (typeof raw.name !== 'string' || typeof raw.prompt !== 'string'
146
+ || typeof raw.createdAt !== 'string' || typeof raw.allowWrite !== 'boolean'
147
+ || typeof raw.state !== 'string' || !STATES.includes(raw.state)) {
148
+ return null;
149
+ }
150
+ return {
151
+ id,
152
+ name: raw.name,
153
+ prompt: raw.prompt,
154
+ team: typeof raw.team === 'string' ? raw.team : undefined,
155
+ cwd: typeof raw.cwd === 'string' ? raw.cwd : undefined,
156
+ allowWrite: raw.allowWrite,
157
+ state: raw.state,
158
+ result: typeof raw.result === 'string' ? raw.result : undefined,
159
+ error: typeof raw.error === 'string' ? raw.error : undefined,
160
+ createdAt: raw.createdAt,
161
+ startedAt: typeof raw.startedAt === 'string' ? raw.startedAt : undefined,
162
+ endedAt: typeof raw.endedAt === 'string' ? raw.endedAt : undefined,
163
+ pid: typeof raw.pid === 'number' ? raw.pid : undefined,
164
+ updatedAt: typeof raw.updatedAt === 'string' ? raw.updatedAt : undefined,
165
+ };
166
+ }
167
+ function safeId(id) {
168
+ if (!/^[A-Za-z0-9._-]+$/.test(id)) {
169
+ throw new Error('非法的 worker id');
170
+ }
171
+ return id;
172
+ }
@@ -0,0 +1 @@
1
+ export {};