micro-models-agent 0.50.4 → 0.51.2
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 +358 -358
- package/dist/main.js +923 -590
- package/dist/modules/browser/bridge-server.mjs +202 -202
- package/dist/skills/builtin/git.md +36 -36
- package/dist/skills/builtin/typescript.md +35 -35
- package/package.json +48 -48
- package/dist/cli/commands.js +0 -323
- package/dist/cli/completer.js +0 -167
- package/dist/cli/index.js +0 -2
- package/dist/cli/main.js +0 -165
- package/dist/cli/plugin-commands.js +0 -36
- package/dist/cli/repl-commands.js +0 -661
- package/dist/cli/repl.js +0 -616
- package/dist/cli/run-result.js +0 -22
- package/dist/cli/security-commands.js +0 -164
- package/dist/cli/setup.js +0 -231
- package/dist/config/config.js +0 -249
- package/dist/config/defaults.js +0 -124
- package/dist/config/experts.js +0 -15
- package/dist/config/index.js +0 -3
- package/dist/config/security.js +0 -193
- package/dist/config/types.js +0 -1
- package/dist/core/agent-moe.js +0 -102
- package/dist/core/agent.js +0 -886
- package/dist/core/bootstrap.js +0 -404
- package/dist/core/index.js +0 -2
- package/dist/core/prompt-builder.js +0 -76
- package/dist/core/session-logger.js +0 -197
- package/dist/core/types.js +0 -1
- package/dist/core/version.js +0 -24
- package/dist/core/workspace.js +0 -76
- package/dist/i18n/en.json +0 -598
- package/dist/i18n/index.js +0 -46
- package/dist/i18n/ru.json +0 -598
- package/dist/index.js +0 -22
- package/dist/llm/image-utils.js +0 -143
- package/dist/llm/index.js +0 -4
- package/dist/llm/model-loader.js +0 -78
- package/dist/llm/openai-compat.js +0 -359
- package/dist/llm/orchestrator.js +0 -198
- package/dist/llm/provider.js +0 -10
- package/dist/llm/response.js +0 -39
- package/dist/llm/token-counter.js +0 -39
- package/dist/llm/types.js +0 -1
- package/dist/logger/app-logger.js +0 -143
- package/dist/logger/file-log.js +0 -151
- package/dist/logger/index.js +0 -1
- package/dist/migration/backup.js +0 -45
- package/dist/migration/detect.js +0 -50
- package/dist/migration/index.js +0 -2
- package/dist/modules/artifacts/store.js +0 -61
- package/dist/modules/browser/actions.js +0 -76
- package/dist/modules/browser/bridge-client.js +0 -199
- package/dist/modules/browser/bridge-path.js +0 -10
- package/dist/modules/browser/cookie-store.js +0 -24
- package/dist/modules/browser/driver.js +0 -136
- package/dist/modules/browser/index.js +0 -7
- package/dist/modules/browser/module.js +0 -29
- package/dist/modules/browser/session.js +0 -338
- package/dist/modules/browser/snapshot.js +0 -148
- package/dist/modules/browser/types.js +0 -12
- package/dist/modules/certification/cli.js +0 -174
- package/dist/modules/certification/fact-checker.js +0 -82
- package/dist/modules/certification/loader.js +0 -105
- package/dist/modules/certification/manifest.js +0 -50
- package/dist/modules/certification/runner.js +0 -159
- package/dist/modules/certification/scenarios.js +0 -124
- package/dist/modules/certification/types.js +0 -1
- package/dist/modules/context/chunk-query.js +0 -100
- package/dist/modules/context/fact-extractor.js +0 -162
- package/dist/modules/context/history.js +0 -15
- package/dist/modules/context/index.js +0 -1
- package/dist/modules/context/manager.js +0 -423
- package/dist/modules/execution/audit-runners.js +0 -152
- package/dist/modules/execution/auditor.js +0 -218
- package/dist/modules/execution/execution-plugin.js +0 -272
- package/dist/modules/execution/index.js +0 -8
- package/dist/modules/execution/module.js +0 -436
- package/dist/modules/execution/moe-executor.js +0 -291
- package/dist/modules/execution/plan-coverage.js +0 -68
- package/dist/modules/execution/plan-persister.js +0 -46
- package/dist/modules/execution/plan-store.js +0 -157
- package/dist/modules/execution/plan-tool.js +0 -508
- package/dist/modules/execution/plan-validator.js +0 -153
- package/dist/modules/execution/planner.js +0 -90
- package/dist/modules/execution/stuck-detector.js +0 -510
- package/dist/modules/execution/tracker.js +0 -67
- package/dist/modules/execution/types.js +0 -1
- package/dist/modules/execution/verifier.js +0 -222
- package/dist/modules/execution/windows-commands.js +0 -41
- package/dist/modules/hallucination/confidence.js +0 -66
- package/dist/modules/hallucination/consistency.js +0 -26
- package/dist/modules/hallucination/detector.js +0 -43
- package/dist/modules/hallucination/factual.js +0 -129
- package/dist/modules/hallucination/index.js +0 -5
- package/dist/modules/hallucination/js-identifiers.js +0 -262
- package/dist/modules/hallucination/llm-judge.js +0 -101
- package/dist/modules/index.js +0 -5
- package/dist/modules/indexer/cache.js +0 -40
- package/dist/modules/indexer/index.js +0 -3
- package/dist/modules/indexer/module.js +0 -245
- package/dist/modules/indexer/project-profile.js +0 -183
- package/dist/modules/indexer/walker.js +0 -101
- package/dist/modules/lsp/check-tool.js +0 -58
- package/dist/modules/lsp/client.js +0 -278
- package/dist/modules/lsp/command.js +0 -60
- package/dist/modules/lsp/config.js +0 -135
- package/dist/modules/lsp/index.js +0 -3
- package/dist/modules/lsp/module.js +0 -232
- package/dist/modules/lsp/probe.js +0 -76
- package/dist/modules/lsp/project-root.js +0 -32
- package/dist/modules/lsp/startup-check.js +0 -141
- package/dist/modules/lsp/types.js +0 -1
- package/dist/modules/mcp/client.js +0 -399
- package/dist/modules/mcp/index.js +0 -3
- package/dist/modules/mcp/module.js +0 -142
- package/dist/modules/mcp/registry.js +0 -15
- package/dist/modules/memory/index.js +0 -1
- package/dist/modules/memory/module.js +0 -96
- package/dist/modules/memory/search.js +0 -42
- package/dist/modules/memory/store.js +0 -69
- package/dist/modules/pipelines/engine.js +0 -60
- package/dist/modules/pipelines/index.js +0 -3
- package/dist/modules/pipelines/parser.js +0 -56
- package/dist/modules/pipelines/template.js +0 -14
- package/dist/modules/plugins/builtin/lint-on-write.js +0 -231
- package/dist/modules/plugins/builtin/notify.js +0 -9
- package/dist/modules/plugins/index.js +0 -1
- package/dist/modules/plugins/loader.js +0 -70
- package/dist/modules/plugins/manager.js +0 -217
- package/dist/modules/plugins/types.js +0 -1
- package/dist/modules/processes/detect.js +0 -34
- package/dist/modules/processes/index.js +0 -2
- package/dist/modules/processes/registry.js +0 -327
- package/dist/modules/processes/runner.js +0 -23
- package/dist/modules/registry.js +0 -47
- package/dist/modules/security/audit-log.js +0 -136
- package/dist/modules/security/audit-notifier.js +0 -292
- package/dist/modules/security/command-validator.js +0 -205
- package/dist/modules/security/content-scanner.js +0 -53
- package/dist/modules/security/data-sanitizer.js +0 -89
- package/dist/modules/security/encryption.js +0 -242
- package/dist/modules/security/index.js +0 -14
- package/dist/modules/security/network-validator.js +0 -71
- package/dist/modules/security/path-validator.js +0 -207
- package/dist/modules/security/rate-limiter.js +0 -119
- package/dist/modules/security/security-policies.js +0 -531
- package/dist/modules/security/session-encryption.js +0 -210
- package/dist/modules/security/session-isolation.js +0 -95
- package/dist/modules/session/index.js +0 -3
- package/dist/modules/session/manager.js +0 -172
- package/dist/modules/session/module.js +0 -24
- package/dist/modules/session/store.js +0 -222
- package/dist/modules/session/types.js +0 -1
- package/dist/modules/skills/index.js +0 -2
- package/dist/modules/skills/loader.js +0 -72
- package/dist/modules/skills/matcher.js +0 -27
- package/dist/modules/skills/module.js +0 -129
- package/dist/modules/types.js +0 -1
- package/dist/modules/updater/checker.js +0 -96
- package/dist/modules/updater/index.js +0 -2
- package/dist/modules/updater/module.js +0 -116
- package/dist/modules/user-profile/compressor.js +0 -16
- package/dist/modules/user-profile/index.js +0 -1
- package/dist/modules/user-profile/profile.js +0 -68
- package/dist/tools/approve.js +0 -32
- package/dist/tools/attach-image.js +0 -89
- package/dist/tools/bash.js +0 -496
- package/dist/tools/browser.js +0 -114
- package/dist/tools/chunk-query.js +0 -99
- package/dist/tools/create-dir.js +0 -55
- package/dist/tools/delete-file.js +0 -62
- package/dist/tools/download-file.js +0 -116
- package/dist/tools/edit-file.js +0 -79
- package/dist/tools/enable-tools.js +0 -58
- package/dist/tools/executor.js +0 -144
- package/dist/tools/file-info.js +0 -46
- package/dist/tools/filter-tools.js +0 -17
- package/dist/tools/glob-tool.js +0 -26
- package/dist/tools/grep-tool.js +0 -84
- package/dist/tools/hidden-tools-block.js +0 -37
- package/dist/tools/index.js +0 -78
- package/dist/tools/list-dir.js +0 -48
- package/dist/tools/load-skill.js +0 -42
- package/dist/tools/mcp-call.js +0 -68
- package/dist/tools/move-file.js +0 -85
- package/dist/tools/path-utils.js +0 -51
- package/dist/tools/pipeline-run.js +0 -144
- package/dist/tools/preview.js +0 -2
- package/dist/tools/process-kill.js +0 -29
- package/dist/tools/process-list.js +0 -36
- package/dist/tools/process-log.js +0 -45
- package/dist/tools/question.js +0 -140
- package/dist/tools/read-file.js +0 -91
- package/dist/tools/recall.js +0 -117
- package/dist/tools/registry.js +0 -47
- package/dist/tools/remember.js +0 -67
- package/dist/tools/scope-check.js +0 -30
- package/dist/tools/search-history.js +0 -84
- package/dist/tools/subagent.js +0 -196
- package/dist/tools/types.js +0 -1
- package/dist/tools/user-input.js +0 -123
- package/dist/tools/web-browse.js +0 -86
- package/dist/tools/web-fetch.js +0 -98
- package/dist/tools/web-search.js +0 -78
- package/dist/tools/write-file.js +0 -81
- package/dist/ui/box.js +0 -77
- package/dist/ui/colors.js +0 -4
- package/dist/ui/diff.js +0 -178
- package/dist/ui/index.js +0 -6
- package/dist/ui/line-editor.js +0 -703
- package/dist/ui/line-math.js +0 -69
- package/dist/ui/md-formatter.js +0 -212
- package/dist/ui/output.js +0 -13
- package/dist/ui/plan-view.js +0 -103
- package/dist/ui/renderer.js +0 -209
- package/dist/ui/spinner.js +0 -70
- package/dist/ui/table.js +0 -144
|
@@ -1,202 +1,202 @@
|
|
|
1
|
-
import { createRequire } from "module";
|
|
2
|
-
import readline from "readline";
|
|
3
|
-
|
|
4
|
-
const require = createRequire(import.meta.url);
|
|
5
|
-
const { chromium } = require("playwright");
|
|
6
|
-
|
|
7
|
-
const CONSOLE_CAP = 500;
|
|
8
|
-
const NETWORK_CAP = 100;
|
|
9
|
-
let maxLineChars = 400;
|
|
10
|
-
|
|
11
|
-
let browser = null;
|
|
12
|
-
let context = null;
|
|
13
|
-
let page = null;
|
|
14
|
-
let consoleBuf = [];
|
|
15
|
-
let networkBuf = [];
|
|
16
|
-
let lastUrl = "";
|
|
17
|
-
|
|
18
|
-
function pushConsole(type, text) {
|
|
19
|
-
if (consoleBuf.length >= CONSOLE_CAP) return;
|
|
20
|
-
const clean = String(text).replace(/\s+/g, " ").trim();
|
|
21
|
-
if (!clean) return;
|
|
22
|
-
const line = clean.length > maxLineChars ? clean.slice(0, maxLineChars) + "…" : clean;
|
|
23
|
-
consoleBuf.push({ type, text: line });
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
function pushNetwork(err) {
|
|
27
|
-
if (networkBuf.length >= NETWORK_CAP) return;
|
|
28
|
-
networkBuf.push(err);
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
function drain() {
|
|
32
|
-
const consoleEvents = consoleBuf;
|
|
33
|
-
const networkEvents = networkBuf;
|
|
34
|
-
consoleBuf = [];
|
|
35
|
-
networkBuf = [];
|
|
36
|
-
return { console: consoleEvents, network: networkEvents };
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
function readInt(v, fallback) {
|
|
40
|
-
const n = Number(v);
|
|
41
|
-
return Number.isFinite(n) && n > 0 ? n : fallback;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
async function handleLaunch(params) {
|
|
45
|
-
if (browser) return { ok: true };
|
|
46
|
-
maxLineChars = readInt(params?.maxConsoleLineChars, 400);
|
|
47
|
-
browser = await chromium.launch({
|
|
48
|
-
headless: params?.headless !== false,
|
|
49
|
-
timeout: readInt(params?.timeoutMs, 30000),
|
|
50
|
-
});
|
|
51
|
-
context = await browser.newContext({
|
|
52
|
-
viewport: params?.viewport || { width: 1280, height: 720 },
|
|
53
|
-
});
|
|
54
|
-
page = await context.newPage();
|
|
55
|
-
page.setDefaultTimeout(readInt(params?.timeoutMs, 30000));
|
|
56
|
-
|
|
57
|
-
page.on("console", (msg) => pushConsole(msg.type(), msg.text()));
|
|
58
|
-
page.on("pageerror", (err) => pushConsole("pageerror", `Page error: ${err.message}`));
|
|
59
|
-
page.on("requestfailed", (req) => {
|
|
60
|
-
const failure = req.failure();
|
|
61
|
-
pushNetwork({ method: req.method(), url: req.url(), error: failure?.errorText || "unknown" });
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
return { ok: true };
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
async function handleGoto(params) {
|
|
68
|
-
if (!page) return { ok: false, error: "No page open" };
|
|
69
|
-
const url = String(params?.url || "");
|
|
70
|
-
const timeoutMs = readInt(params?.timeoutMs, 15000);
|
|
71
|
-
consoleBuf = [];
|
|
72
|
-
networkBuf = [];
|
|
73
|
-
try {
|
|
74
|
-
await page.goto(url, { waitUntil: "domcontentloaded", timeout: timeoutMs });
|
|
75
|
-
lastUrl = page.url();
|
|
76
|
-
return { ok: true, data: { url: lastUrl } };
|
|
77
|
-
} catch (err) {
|
|
78
|
-
lastUrl = page.url();
|
|
79
|
-
return { ok: false, error: err.message, data: { url: lastUrl } };
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
async function handleEvaluate(params) {
|
|
84
|
-
if (!page) return { ok: false, error: "No page open" };
|
|
85
|
-
const js = String(params?.js || "");
|
|
86
|
-
try {
|
|
87
|
-
const result = await page.evaluate(js);
|
|
88
|
-
return { ok: true, data: { result } };
|
|
89
|
-
} catch (err) {
|
|
90
|
-
return { ok: false, error: err.message };
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
async function handleClose() {
|
|
95
|
-
try {
|
|
96
|
-
if (page) await page.close();
|
|
97
|
-
} catch {}
|
|
98
|
-
try {
|
|
99
|
-
if (context) await context.close();
|
|
100
|
-
} catch {}
|
|
101
|
-
try {
|
|
102
|
-
if (browser) await browser.close();
|
|
103
|
-
} catch {}
|
|
104
|
-
page = null;
|
|
105
|
-
context = null;
|
|
106
|
-
browser = null;
|
|
107
|
-
return { ok: true };
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
const handlers = {
|
|
111
|
-
ping: async () => ({ ok: true, data: { pong: true, runtime: process.version } }),
|
|
112
|
-
launch: handleLaunch,
|
|
113
|
-
goto: handleGoto,
|
|
114
|
-
evaluate: handleEvaluate,
|
|
115
|
-
content: async () => ({ ok: true, data: { html: page ? await page.content() : "" } }),
|
|
116
|
-
title: async () => ({ ok: true, data: { title: page ? await page.title() : "" } }),
|
|
117
|
-
url: async () => ({ ok: true, data: { url: page ? page.url() : lastUrl } }),
|
|
118
|
-
waitLoad: async (params) => {
|
|
119
|
-
if (!page) return { ok: false, error: "No page open" };
|
|
120
|
-
try {
|
|
121
|
-
await page.waitForLoadState("domcontentloaded", {
|
|
122
|
-
timeout: readInt(params?.timeoutMs, 15000),
|
|
123
|
-
});
|
|
124
|
-
} catch {}
|
|
125
|
-
return { ok: true };
|
|
126
|
-
},
|
|
127
|
-
screenshot: async () => {
|
|
128
|
-
if (!page) return { ok: false, error: "No page open" };
|
|
129
|
-
try {
|
|
130
|
-
const buf = await page.screenshot({ type: "png", fullPage: false });
|
|
131
|
-
return { ok: true, data: { base64: buf.toString("base64") } };
|
|
132
|
-
} catch (err) {
|
|
133
|
-
return { ok: false, error: err.message };
|
|
134
|
-
}
|
|
135
|
-
},
|
|
136
|
-
cookies: async () => {
|
|
137
|
-
if (!context) return { ok: true, data: { cookies: [] } };
|
|
138
|
-
const cookies = await context.cookies();
|
|
139
|
-
return { ok: true, data: { cookies } };
|
|
140
|
-
},
|
|
141
|
-
setCookies: async (params) => {
|
|
142
|
-
if (!context) return { ok: false, error: "No context" };
|
|
143
|
-
const cookies = Array.isArray(params?.cookies) ? params.cookies : [];
|
|
144
|
-
if (cookies.length > 0) {
|
|
145
|
-
try {
|
|
146
|
-
await context.addCookies(cookies);
|
|
147
|
-
} catch (err) {
|
|
148
|
-
return { ok: false, error: err.message };
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
return { ok: true };
|
|
152
|
-
},
|
|
153
|
-
back: async (params) => {
|
|
154
|
-
if (!page) return { ok: false, error: "No page open" };
|
|
155
|
-
try {
|
|
156
|
-
await page.goBack({
|
|
157
|
-
waitUntil: "domcontentloaded",
|
|
158
|
-
timeout: readInt(params?.timeoutMs, 15000),
|
|
159
|
-
});
|
|
160
|
-
} catch {}
|
|
161
|
-
lastUrl = page.url();
|
|
162
|
-
return { ok: true, data: { url: lastUrl } };
|
|
163
|
-
},
|
|
164
|
-
forward: async (params) => {
|
|
165
|
-
if (!page) return { ok: false, error: "No page open" };
|
|
166
|
-
try {
|
|
167
|
-
await page.goForward({
|
|
168
|
-
waitUntil: "domcontentloaded",
|
|
169
|
-
timeout: readInt(params?.timeoutMs, 15000),
|
|
170
|
-
});
|
|
171
|
-
} catch {}
|
|
172
|
-
lastUrl = page.url();
|
|
173
|
-
return { ok: true, data: { url: lastUrl } };
|
|
174
|
-
},
|
|
175
|
-
close: handleClose,
|
|
176
|
-
};
|
|
177
|
-
|
|
178
|
-
const rl = readline.createInterface({ input: process.stdin });
|
|
179
|
-
rl.on("line", async (line) => {
|
|
180
|
-
let req;
|
|
181
|
-
try {
|
|
182
|
-
req = JSON.parse(line);
|
|
183
|
-
} catch {
|
|
184
|
-
return;
|
|
185
|
-
}
|
|
186
|
-
const handler = handlers[req.cmd];
|
|
187
|
-
let resp;
|
|
188
|
-
if (!handler) {
|
|
189
|
-
resp = { id: req.id, ok: false, error: `Unknown command: ${req.cmd}`, ...drain() };
|
|
190
|
-
} else {
|
|
191
|
-
try {
|
|
192
|
-
const result = await handler(req.params || {});
|
|
193
|
-
resp = { id: req.id, ...result, ...drain() };
|
|
194
|
-
} catch (err) {
|
|
195
|
-
resp = { id: req.id, ok: false, error: err.message, ...drain() };
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
process.stdout.write(JSON.stringify(resp) + "\n");
|
|
199
|
-
});
|
|
200
|
-
|
|
201
|
-
process.on("SIGTERM", () => process.exit(0));
|
|
202
|
-
process.on("SIGINT", () => process.exit(0));
|
|
1
|
+
import { createRequire } from "module";
|
|
2
|
+
import readline from "readline";
|
|
3
|
+
|
|
4
|
+
const require = createRequire(import.meta.url);
|
|
5
|
+
const { chromium } = require("playwright");
|
|
6
|
+
|
|
7
|
+
const CONSOLE_CAP = 500;
|
|
8
|
+
const NETWORK_CAP = 100;
|
|
9
|
+
let maxLineChars = 400;
|
|
10
|
+
|
|
11
|
+
let browser = null;
|
|
12
|
+
let context = null;
|
|
13
|
+
let page = null;
|
|
14
|
+
let consoleBuf = [];
|
|
15
|
+
let networkBuf = [];
|
|
16
|
+
let lastUrl = "";
|
|
17
|
+
|
|
18
|
+
function pushConsole(type, text) {
|
|
19
|
+
if (consoleBuf.length >= CONSOLE_CAP) return;
|
|
20
|
+
const clean = String(text).replace(/\s+/g, " ").trim();
|
|
21
|
+
if (!clean) return;
|
|
22
|
+
const line = clean.length > maxLineChars ? clean.slice(0, maxLineChars) + "…" : clean;
|
|
23
|
+
consoleBuf.push({ type, text: line });
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function pushNetwork(err) {
|
|
27
|
+
if (networkBuf.length >= NETWORK_CAP) return;
|
|
28
|
+
networkBuf.push(err);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function drain() {
|
|
32
|
+
const consoleEvents = consoleBuf;
|
|
33
|
+
const networkEvents = networkBuf;
|
|
34
|
+
consoleBuf = [];
|
|
35
|
+
networkBuf = [];
|
|
36
|
+
return { console: consoleEvents, network: networkEvents };
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function readInt(v, fallback) {
|
|
40
|
+
const n = Number(v);
|
|
41
|
+
return Number.isFinite(n) && n > 0 ? n : fallback;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
async function handleLaunch(params) {
|
|
45
|
+
if (browser) return { ok: true };
|
|
46
|
+
maxLineChars = readInt(params?.maxConsoleLineChars, 400);
|
|
47
|
+
browser = await chromium.launch({
|
|
48
|
+
headless: params?.headless !== false,
|
|
49
|
+
timeout: readInt(params?.timeoutMs, 30000),
|
|
50
|
+
});
|
|
51
|
+
context = await browser.newContext({
|
|
52
|
+
viewport: params?.viewport || { width: 1280, height: 720 },
|
|
53
|
+
});
|
|
54
|
+
page = await context.newPage();
|
|
55
|
+
page.setDefaultTimeout(readInt(params?.timeoutMs, 30000));
|
|
56
|
+
|
|
57
|
+
page.on("console", (msg) => pushConsole(msg.type(), msg.text()));
|
|
58
|
+
page.on("pageerror", (err) => pushConsole("pageerror", `Page error: ${err.message}`));
|
|
59
|
+
page.on("requestfailed", (req) => {
|
|
60
|
+
const failure = req.failure();
|
|
61
|
+
pushNetwork({ method: req.method(), url: req.url(), error: failure?.errorText || "unknown" });
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
return { ok: true };
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
async function handleGoto(params) {
|
|
68
|
+
if (!page) return { ok: false, error: "No page open" };
|
|
69
|
+
const url = String(params?.url || "");
|
|
70
|
+
const timeoutMs = readInt(params?.timeoutMs, 15000);
|
|
71
|
+
consoleBuf = [];
|
|
72
|
+
networkBuf = [];
|
|
73
|
+
try {
|
|
74
|
+
await page.goto(url, { waitUntil: "domcontentloaded", timeout: timeoutMs });
|
|
75
|
+
lastUrl = page.url();
|
|
76
|
+
return { ok: true, data: { url: lastUrl } };
|
|
77
|
+
} catch (err) {
|
|
78
|
+
lastUrl = page.url();
|
|
79
|
+
return { ok: false, error: err.message, data: { url: lastUrl } };
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
async function handleEvaluate(params) {
|
|
84
|
+
if (!page) return { ok: false, error: "No page open" };
|
|
85
|
+
const js = String(params?.js || "");
|
|
86
|
+
try {
|
|
87
|
+
const result = await page.evaluate(js);
|
|
88
|
+
return { ok: true, data: { result } };
|
|
89
|
+
} catch (err) {
|
|
90
|
+
return { ok: false, error: err.message };
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
async function handleClose() {
|
|
95
|
+
try {
|
|
96
|
+
if (page) await page.close();
|
|
97
|
+
} catch {}
|
|
98
|
+
try {
|
|
99
|
+
if (context) await context.close();
|
|
100
|
+
} catch {}
|
|
101
|
+
try {
|
|
102
|
+
if (browser) await browser.close();
|
|
103
|
+
} catch {}
|
|
104
|
+
page = null;
|
|
105
|
+
context = null;
|
|
106
|
+
browser = null;
|
|
107
|
+
return { ok: true };
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const handlers = {
|
|
111
|
+
ping: async () => ({ ok: true, data: { pong: true, runtime: process.version } }),
|
|
112
|
+
launch: handleLaunch,
|
|
113
|
+
goto: handleGoto,
|
|
114
|
+
evaluate: handleEvaluate,
|
|
115
|
+
content: async () => ({ ok: true, data: { html: page ? await page.content() : "" } }),
|
|
116
|
+
title: async () => ({ ok: true, data: { title: page ? await page.title() : "" } }),
|
|
117
|
+
url: async () => ({ ok: true, data: { url: page ? page.url() : lastUrl } }),
|
|
118
|
+
waitLoad: async (params) => {
|
|
119
|
+
if (!page) return { ok: false, error: "No page open" };
|
|
120
|
+
try {
|
|
121
|
+
await page.waitForLoadState("domcontentloaded", {
|
|
122
|
+
timeout: readInt(params?.timeoutMs, 15000),
|
|
123
|
+
});
|
|
124
|
+
} catch {}
|
|
125
|
+
return { ok: true };
|
|
126
|
+
},
|
|
127
|
+
screenshot: async () => {
|
|
128
|
+
if (!page) return { ok: false, error: "No page open" };
|
|
129
|
+
try {
|
|
130
|
+
const buf = await page.screenshot({ type: "png", fullPage: false });
|
|
131
|
+
return { ok: true, data: { base64: buf.toString("base64") } };
|
|
132
|
+
} catch (err) {
|
|
133
|
+
return { ok: false, error: err.message };
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
cookies: async () => {
|
|
137
|
+
if (!context) return { ok: true, data: { cookies: [] } };
|
|
138
|
+
const cookies = await context.cookies();
|
|
139
|
+
return { ok: true, data: { cookies } };
|
|
140
|
+
},
|
|
141
|
+
setCookies: async (params) => {
|
|
142
|
+
if (!context) return { ok: false, error: "No context" };
|
|
143
|
+
const cookies = Array.isArray(params?.cookies) ? params.cookies : [];
|
|
144
|
+
if (cookies.length > 0) {
|
|
145
|
+
try {
|
|
146
|
+
await context.addCookies(cookies);
|
|
147
|
+
} catch (err) {
|
|
148
|
+
return { ok: false, error: err.message };
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
return { ok: true };
|
|
152
|
+
},
|
|
153
|
+
back: async (params) => {
|
|
154
|
+
if (!page) return { ok: false, error: "No page open" };
|
|
155
|
+
try {
|
|
156
|
+
await page.goBack({
|
|
157
|
+
waitUntil: "domcontentloaded",
|
|
158
|
+
timeout: readInt(params?.timeoutMs, 15000),
|
|
159
|
+
});
|
|
160
|
+
} catch {}
|
|
161
|
+
lastUrl = page.url();
|
|
162
|
+
return { ok: true, data: { url: lastUrl } };
|
|
163
|
+
},
|
|
164
|
+
forward: async (params) => {
|
|
165
|
+
if (!page) return { ok: false, error: "No page open" };
|
|
166
|
+
try {
|
|
167
|
+
await page.goForward({
|
|
168
|
+
waitUntil: "domcontentloaded",
|
|
169
|
+
timeout: readInt(params?.timeoutMs, 15000),
|
|
170
|
+
});
|
|
171
|
+
} catch {}
|
|
172
|
+
lastUrl = page.url();
|
|
173
|
+
return { ok: true, data: { url: lastUrl } };
|
|
174
|
+
},
|
|
175
|
+
close: handleClose,
|
|
176
|
+
};
|
|
177
|
+
|
|
178
|
+
const rl = readline.createInterface({ input: process.stdin });
|
|
179
|
+
rl.on("line", async (line) => {
|
|
180
|
+
let req;
|
|
181
|
+
try {
|
|
182
|
+
req = JSON.parse(line);
|
|
183
|
+
} catch {
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
const handler = handlers[req.cmd];
|
|
187
|
+
let resp;
|
|
188
|
+
if (!handler) {
|
|
189
|
+
resp = { id: req.id, ok: false, error: `Unknown command: ${req.cmd}`, ...drain() };
|
|
190
|
+
} else {
|
|
191
|
+
try {
|
|
192
|
+
const result = await handler(req.params || {});
|
|
193
|
+
resp = { id: req.id, ...result, ...drain() };
|
|
194
|
+
} catch (err) {
|
|
195
|
+
resp = { id: req.id, ok: false, error: err.message, ...drain() };
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
process.stdout.write(JSON.stringify(resp) + "\n");
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
process.on("SIGTERM", () => process.exit(0));
|
|
202
|
+
process.on("SIGINT", () => process.exit(0));
|
|
@@ -1,36 +1,36 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: git-expert
|
|
3
|
-
description: Git branching, merge conflicts, rebasing, workflow strategies
|
|
4
|
-
keywords: [git, branch, merge, rebase, commit, conflict, workflow]
|
|
5
|
-
mma_version: 2
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Git Expert
|
|
9
|
-
|
|
10
|
-
## Branching Strategies
|
|
11
|
-
|
|
12
|
-
- **Feature branches**: `feature/xxx` from `main`, merge via PR
|
|
13
|
-
- **Hotfix**: `hotfix/xxx` from `main`, merge to both `main` and `develop`
|
|
14
|
-
- **Release**: `release/xxx` from `develop`, merge to `main` + `develop`
|
|
15
|
-
|
|
16
|
-
## Conflict Resolution
|
|
17
|
-
|
|
18
|
-
1. `git fetch origin` — get latest
|
|
19
|
-
2. `git checkout your-branch`
|
|
20
|
-
3. `git rebase origin/main` — apply your commits on top
|
|
21
|
-
4. Resolve conflicts file by file
|
|
22
|
-
5. `git add <files>` then `git rebase --continue`
|
|
23
|
-
|
|
24
|
-
## Useful Commands
|
|
25
|
-
|
|
26
|
-
- `git log --oneline --graph --all` — visualize history
|
|
27
|
-
- `git diff --stat` — summary of changes
|
|
28
|
-
- `git stash pop` — restore stashed changes
|
|
29
|
-
- `git cherry-pick <commit>` — apply specific commit
|
|
30
|
-
|
|
31
|
-
## Best Practices
|
|
32
|
-
|
|
33
|
-
- Commit often with clear messages
|
|
34
|
-
- Keep commits atomic (one logical change)
|
|
35
|
-
- Never force push to shared branches
|
|
36
|
-
- Use `git rebase -i` to clean up before PR
|
|
1
|
+
---
|
|
2
|
+
name: git-expert
|
|
3
|
+
description: Git branching, merge conflicts, rebasing, workflow strategies
|
|
4
|
+
keywords: [git, branch, merge, rebase, commit, conflict, workflow]
|
|
5
|
+
mma_version: 2
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Git Expert
|
|
9
|
+
|
|
10
|
+
## Branching Strategies
|
|
11
|
+
|
|
12
|
+
- **Feature branches**: `feature/xxx` from `main`, merge via PR
|
|
13
|
+
- **Hotfix**: `hotfix/xxx` from `main`, merge to both `main` and `develop`
|
|
14
|
+
- **Release**: `release/xxx` from `develop`, merge to `main` + `develop`
|
|
15
|
+
|
|
16
|
+
## Conflict Resolution
|
|
17
|
+
|
|
18
|
+
1. `git fetch origin` — get latest
|
|
19
|
+
2. `git checkout your-branch`
|
|
20
|
+
3. `git rebase origin/main` — apply your commits on top
|
|
21
|
+
4. Resolve conflicts file by file
|
|
22
|
+
5. `git add <files>` then `git rebase --continue`
|
|
23
|
+
|
|
24
|
+
## Useful Commands
|
|
25
|
+
|
|
26
|
+
- `git log --oneline --graph --all` — visualize history
|
|
27
|
+
- `git diff --stat` — summary of changes
|
|
28
|
+
- `git stash pop` — restore stashed changes
|
|
29
|
+
- `git cherry-pick <commit>` — apply specific commit
|
|
30
|
+
|
|
31
|
+
## Best Practices
|
|
32
|
+
|
|
33
|
+
- Commit often with clear messages
|
|
34
|
+
- Keep commits atomic (one logical change)
|
|
35
|
+
- Never force push to shared branches
|
|
36
|
+
- Use `git rebase -i` to clean up before PR
|
|
@@ -1,35 +1,35 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: typescript-expert
|
|
3
|
-
description: TypeScript type system, generics, advanced patterns, compiler API
|
|
4
|
-
keywords: [typescript, types, generics, tsconfig, compiler, interface, type]
|
|
5
|
-
mma_version: 2
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# TypeScript Expert
|
|
9
|
-
|
|
10
|
-
## Key Patterns
|
|
11
|
-
|
|
12
|
-
- Use `readonly` for immutable properties
|
|
13
|
-
- Prefer `interface` over `type` for object shapes
|
|
14
|
-
- Use `as const` for literal types
|
|
15
|
-
- Prefer `unknown` over `any` for type safety
|
|
16
|
-
|
|
17
|
-
## Common Pitfalls
|
|
18
|
-
|
|
19
|
-
- Avoid `any` — use `unknown` + type guards
|
|
20
|
-
- Don't use `enum` — use `const` objects or union types
|
|
21
|
-
- Avoid `namespace` — use ES modules
|
|
22
|
-
|
|
23
|
-
## Type Guards
|
|
24
|
-
|
|
25
|
-
```ts
|
|
26
|
-
function isString(val: unknown): val is string {
|
|
27
|
-
return typeof val === 'string'
|
|
28
|
-
}
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
## Generics
|
|
32
|
-
|
|
33
|
-
- Use `extends` for constraints
|
|
34
|
-
- Use `infer` for conditional type extraction
|
|
35
|
-
- Prefer explicit over implicit for complex cases
|
|
1
|
+
---
|
|
2
|
+
name: typescript-expert
|
|
3
|
+
description: TypeScript type system, generics, advanced patterns, compiler API
|
|
4
|
+
keywords: [typescript, types, generics, tsconfig, compiler, interface, type]
|
|
5
|
+
mma_version: 2
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# TypeScript Expert
|
|
9
|
+
|
|
10
|
+
## Key Patterns
|
|
11
|
+
|
|
12
|
+
- Use `readonly` for immutable properties
|
|
13
|
+
- Prefer `interface` over `type` for object shapes
|
|
14
|
+
- Use `as const` for literal types
|
|
15
|
+
- Prefer `unknown` over `any` for type safety
|
|
16
|
+
|
|
17
|
+
## Common Pitfalls
|
|
18
|
+
|
|
19
|
+
- Avoid `any` — use `unknown` + type guards
|
|
20
|
+
- Don't use `enum` — use `const` objects or union types
|
|
21
|
+
- Avoid `namespace` — use ES modules
|
|
22
|
+
|
|
23
|
+
## Type Guards
|
|
24
|
+
|
|
25
|
+
```ts
|
|
26
|
+
function isString(val: unknown): val is string {
|
|
27
|
+
return typeof val === 'string'
|
|
28
|
+
}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Generics
|
|
32
|
+
|
|
33
|
+
- Use `extends` for constraints
|
|
34
|
+
- Use `infer` for conditional type extraction
|
|
35
|
+
- Prefer explicit over implicit for complex cases
|
package/package.json
CHANGED
|
@@ -1,48 +1,48 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "micro-models-agent",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Micro Models Agent (MMA) — LLM agent harness for small models (Qwen3.5-9B, 32K-64K context)",
|
|
5
|
-
"type": "module",
|
|
6
|
-
"bin": {
|
|
7
|
-
"mma": "bin/mma.mjs"
|
|
8
|
-
},
|
|
9
|
-
"files": [
|
|
10
|
-
"dist/",
|
|
11
|
-
"bin/"
|
|
12
|
-
],
|
|
13
|
-
"engines": {
|
|
14
|
-
"node": ">=20"
|
|
15
|
-
},
|
|
16
|
-
"scripts": {
|
|
17
|
-
"mma": "bun run src/cli/main.ts",
|
|
18
|
-
"build": "bun run build:tsc && bun run build:copy-assets",
|
|
19
|
-
"build:tsc": "tsc -p tsconfig.build.json",
|
|
20
|
-
"build:copy-assets": "bun run scripts/copy-assets.ts",
|
|
21
|
-
"build:prod": "bun run 'build:bundle' && bun run 'build:copy-assets'",
|
|
22
|
-
"build:clean": "cmd /c \"if exist dist rmdir /s /q dist\"",
|
|
23
|
-
"build:bundle": "bun build ./src/cli/main.ts --outfile ./dist/main.js --target node --format esm --external playwright",
|
|
24
|
-
"dev": "bun --watch src/cli/main.ts",
|
|
25
|
-
"typecheck": "tsc --noEmit",
|
|
26
|
-
"test": "bun test",
|
|
27
|
-
"test:watch": "bun test --watch",
|
|
28
|
-
"test:integration": "vitest run --config vitest.integration.config.ts",
|
|
29
|
-
"format": "prettier --write \"src/**/*.{ts,js,mjs,json}\" \"tests/**/*.{ts,js,json}\" \"scripts/**/*.ts\" \"*.{ts,json}\"",
|
|
30
|
-
"format:check": "prettier --check \"src/**/*.{ts,js,mjs,json}\" \"tests/**/*.{ts,js,json}\" \"scripts/**/*.ts\" \"*.{ts,json}\""
|
|
31
|
-
},
|
|
32
|
-
"dependencies": {
|
|
33
|
-
"commander": "^12.0.0",
|
|
34
|
-
"js-tiktoken": "^1.0.0",
|
|
35
|
-
"jsonrepair": "^3.15.0",
|
|
36
|
-
"picocolors": "^1.1.1",
|
|
37
|
-
"playwright": "^1.62.0",
|
|
38
|
-
"string-width": "^8.2.2",
|
|
39
|
-
"yaml": "^2.9.0"
|
|
40
|
-
},
|
|
41
|
-
"devDependencies": {
|
|
42
|
-
"@types/bun": "^1.3.14",
|
|
43
|
-
"@types/node": "^22.20.1",
|
|
44
|
-
"prettier": "^3.9.6",
|
|
45
|
-
"typescript": "^5.9.3",
|
|
46
|
-
"vitest": "^4.1.11"
|
|
47
|
-
}
|
|
48
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "micro-models-agent",
|
|
3
|
+
"version": "0.51.2",
|
|
4
|
+
"description": "Micro Models Agent (MMA) — LLM agent harness for small models (Qwen3.5-9B, 32K-64K context)",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"mma": "bin/mma.mjs"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist/",
|
|
11
|
+
"bin/"
|
|
12
|
+
],
|
|
13
|
+
"engines": {
|
|
14
|
+
"node": ">=20"
|
|
15
|
+
},
|
|
16
|
+
"scripts": {
|
|
17
|
+
"mma": "bun run src/cli/main.ts",
|
|
18
|
+
"build": "bun run build:tsc && bun run build:copy-assets",
|
|
19
|
+
"build:tsc": "tsc -p tsconfig.build.json",
|
|
20
|
+
"build:copy-assets": "bun run scripts/copy-assets.ts",
|
|
21
|
+
"build:prod": "bun run 'build:bundle' && bun run 'build:copy-assets'",
|
|
22
|
+
"build:clean": "cmd /c \"if exist dist rmdir /s /q dist\"",
|
|
23
|
+
"build:bundle": "bun build ./src/cli/main.ts --outfile ./dist/main.js --target node --format esm --external playwright",
|
|
24
|
+
"dev": "bun --watch src/cli/main.ts",
|
|
25
|
+
"typecheck": "tsc --noEmit",
|
|
26
|
+
"test": "bun test",
|
|
27
|
+
"test:watch": "bun test --watch",
|
|
28
|
+
"test:integration": "vitest run --config vitest.integration.config.ts",
|
|
29
|
+
"format": "prettier --write \"src/**/*.{ts,js,mjs,json}\" \"tests/**/*.{ts,js,json}\" \"scripts/**/*.ts\" \"*.{ts,json}\"",
|
|
30
|
+
"format:check": "prettier --check \"src/**/*.{ts,js,mjs,json}\" \"tests/**/*.{ts,js,json}\" \"scripts/**/*.ts\" \"*.{ts,json}\""
|
|
31
|
+
},
|
|
32
|
+
"dependencies": {
|
|
33
|
+
"commander": "^12.0.0",
|
|
34
|
+
"js-tiktoken": "^1.0.0",
|
|
35
|
+
"jsonrepair": "^3.15.0",
|
|
36
|
+
"picocolors": "^1.1.1",
|
|
37
|
+
"playwright": "^1.62.0",
|
|
38
|
+
"string-width": "^8.2.2",
|
|
39
|
+
"yaml": "^2.9.0"
|
|
40
|
+
},
|
|
41
|
+
"devDependencies": {
|
|
42
|
+
"@types/bun": "^1.3.14",
|
|
43
|
+
"@types/node": "^22.20.1",
|
|
44
|
+
"prettier": "^3.9.6",
|
|
45
|
+
"typescript": "^5.9.3",
|
|
46
|
+
"vitest": "^4.1.11"
|
|
47
|
+
}
|
|
48
|
+
}
|