micro-models-agent 2.10.0 → 2.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +33 -0
- package/dist/assets/app.js +22 -4
- package/dist/assets/index.html +29 -0
- package/dist/assets/js/dom.js +2 -1
- package/dist/assets/js/feed.js +38 -26
- package/dist/assets/js/format.js +1 -1
- package/dist/assets/js/rail.js +114 -0
- package/dist/assets/js/settings-controls.js +2 -2
- package/dist/assets/js/settings.js +246 -51
- package/dist/assets/js/store.js +3 -0
- package/dist/assets/js/tabs.js +104 -2
- package/dist/assets/styles.css +215 -66
- package/dist/cli/cache-line.js +1 -0
- package/dist/cli/command-suggest.js +5 -4
- package/dist/cli/commands.js +231 -122
- package/dist/cli/completer.js +132 -31
- package/dist/cli/index.js +1 -0
- package/dist/cli/json-payload.js +4 -4
- package/dist/cli/main.js +166 -61
- package/dist/cli/onboarding-commands.js +126 -0
- package/dist/cli/plugin-commands.js +2 -1
- package/dist/cli/relaunch.js +16 -13
- package/dist/cli/repl-commands-lsp.js +75 -0
- package/dist/cli/repl-commands-skills.js +105 -0
- package/dist/cli/repl-commands.js +589 -266
- package/dist/cli/repl.js +436 -177
- package/dist/cli/run-result.js +5 -6
- package/dist/cli/security-commands.js +37 -28
- package/dist/cli/setup-order.js +4 -55
- package/dist/cli/setup-prompt.js +3 -2
- package/dist/cli/setup.js +27 -107
- package/dist/cli/web-command.js +98 -0
- package/dist/config/budget.js +5 -5
- package/dist/config/config.js +103 -96
- package/dist/config/defaults.js +38 -8
- package/dist/config/domains.js +24 -27
- package/dist/config/env.js +46 -0
- package/dist/config/experts.js +2 -0
- package/dist/config/index.js +1 -0
- package/dist/config/paths.js +56 -0
- package/dist/config/redact.js +44 -0
- package/dist/config/registry-extra.js +334 -0
- package/dist/config/registry.js +584 -0
- package/dist/config/security.js +35 -36
- package/dist/config/timeouts.js +74 -0
- package/dist/config/utils.js +16 -15
- package/dist/core/agent/artifact-progress.js +59 -0
- package/dist/core/agent/artifact-resolve.js +79 -0
- package/dist/core/agent/audit-gate.js +7 -3
- package/dist/core/agent/compaction.js +2 -2
- package/dist/core/agent/constants.js +33 -4
- package/dist/core/agent/context-log.js +454 -0
- package/dist/core/agent/context-renderer.js +5 -0
- package/dist/core/agent/critic-gate.js +132 -0
- package/dist/core/agent/hallucination-gate.js +148 -38
- package/dist/core/agent/loop-state.js +15 -0
- package/dist/core/agent/prefix-monitor.js +1 -1
- package/dist/core/agent/reasoning-resolver.js +10 -1
- package/dist/core/agent/token-tracker.js +7 -4
- package/dist/core/agent/tool-batch.js +93 -18
- package/dist/core/agent/tool-images.js +18 -0
- package/dist/core/agent/tool-output.js +65 -11
- package/dist/core/agent/tool-pairing.js +60 -0
- package/dist/core/agent-moe.js +25 -24
- package/dist/core/agent.js +429 -108
- package/dist/core/bootstrap/agent-phase.js +66 -0
- package/dist/core/bootstrap/config-phase.js +86 -0
- package/dist/core/bootstrap/modules-phase.js +269 -0
- package/dist/core/bootstrap/provider-phase.js +183 -0
- package/dist/core/bootstrap/session-phase.js +204 -0
- package/dist/core/bootstrap/state.js +94 -0
- package/dist/core/bootstrap/workspace-phase.js +115 -0
- package/dist/core/bootstrap.js +92 -660
- package/dist/core/crash-handler.js +17 -7
- package/dist/core/environment.js +37 -12
- package/dist/core/host-plan.js +43 -0
- package/dist/core/host.js +23 -0
- package/dist/core/index.js +1 -0
- package/dist/core/prompt-builder.js +17 -1
- package/dist/core/prompt-overflow.js +42 -43
- package/dist/core/session-logger.js +122 -30
- package/dist/core/system-prompt.js +117 -0
- package/dist/core/version.js +6 -4
- package/dist/core/web-host.js +34 -0
- package/dist/core/workspace.js +19 -15
- package/dist/i18n/en.json +106 -21
- package/dist/i18n/index.js +37 -3
- package/dist/i18n/ru.json +109 -21
- package/dist/index.js +7 -3
- package/dist/llm/image-utils.js +55 -64
- package/dist/llm/llm-errors.js +9 -0
- package/dist/llm/model-loader.js +10 -32
- package/dist/llm/models-dev.js +121 -0
- package/dist/llm/openai-compat.js +146 -73
- package/dist/llm/orchestrator.js +33 -11
- package/dist/llm/provider-budget.js +2 -2
- package/dist/llm/provider-context.js +233 -0
- package/dist/llm/provider.js +1 -1
- package/dist/llm/response.js +5 -0
- package/dist/llm/token-counter.js +27 -11
- package/dist/logger/app-logger.js +48 -22
- package/dist/logger/file-log.js +28 -19
- package/dist/logger/index.js +1 -0
- package/dist/main.js +24285 -22447
- package/dist/migration/backup.js +14 -3
- package/dist/migration/detect.js +12 -3
- package/dist/migration/index.js +1 -0
- package/dist/modules/artifacts/store.js +9 -8
- package/dist/modules/browser/actions.js +6 -0
- package/dist/modules/browser/bridge-client.js +14 -12
- package/dist/modules/browser/bridge-path.js +4 -4
- package/dist/modules/browser/console-buffer.js +37 -0
- package/dist/modules/browser/cookie-store.js +5 -0
- package/dist/modules/browser/driver-types.js +1 -0
- package/dist/modules/browser/driver.js +19 -11
- package/dist/modules/browser/index.js +3 -1
- package/dist/modules/browser/module.js +2 -1
- package/dist/modules/browser/session.js +10 -30
- package/dist/modules/browser/snapshot.js +19 -13
- package/dist/modules/browser/types.js +1 -0
- package/dist/modules/certification/cli.js +28 -20
- package/dist/modules/certification/fact-checker.js +9 -1
- package/dist/modules/certification/loader.js +9 -2
- package/dist/modules/certification/manifest.js +83 -21
- package/dist/modules/certification/runner.js +23 -13
- package/dist/modules/certification/scenarios.js +20 -20
- package/dist/modules/certification/syntax-scenarios.js +1 -2
- package/dist/modules/context/chunk-query.js +11 -9
- package/dist/modules/context/fact-extractor.js +37 -39
- package/dist/modules/context/index.js +1 -0
- package/dist/modules/context/manager.js +106 -80
- package/dist/modules/critic/client.js +176 -0
- package/dist/modules/critic/evidence.js +81 -0
- package/dist/modules/critic/provider.js +45 -0
- package/dist/modules/critic/tools.js +78 -0
- package/dist/modules/critic/types.js +1 -0
- package/dist/modules/execution/audit-runners.js +28 -34
- package/dist/modules/execution/auditor.js +53 -49
- package/dist/modules/execution/execution-plugin.js +142 -102
- package/dist/modules/execution/index.js +1 -1
- package/dist/modules/execution/input-from.js +37 -13
- package/dist/modules/execution/module.js +368 -191
- package/dist/modules/execution/moe-executor.js +53 -26
- package/dist/modules/execution/plan-actions.js +320 -202
- package/dist/modules/execution/plan-checks.js +35 -0
- package/dist/modules/execution/plan-coverage.js +36 -33
- package/dist/modules/execution/plan-steps.js +11 -3
- package/dist/modules/execution/plan-store.js +83 -17
- package/dist/modules/execution/plan-tool.js +89 -35
- package/dist/modules/execution/plan-validator.js +30 -10
- package/dist/modules/execution/planner.js +22 -13
- package/dist/modules/execution/stuck-detector.js +196 -93
- package/dist/modules/execution/tracker.js +22 -8
- package/dist/modules/execution/verifier.js +69 -48
- package/dist/modules/execution/windows-commands.js +12 -12
- package/dist/modules/hallucination/artifact-claim.js +93 -0
- package/dist/modules/hallucination/confidence.js +13 -11
- package/dist/modules/hallucination/consistency.js +10 -2
- package/dist/modules/hallucination/detector.js +10 -5
- package/dist/modules/hallucination/factual.js +43 -26
- package/dist/modules/hallucination/index.js +1 -0
- package/dist/modules/hallucination/js-identifiers.js +44 -45
- package/dist/modules/hallucination/llm-judge.js +17 -12
- package/dist/modules/hallucination/success-claim.js +59 -0
- package/dist/modules/indexer/cache.js +52 -4
- package/dist/modules/indexer/index.js +1 -0
- package/dist/modules/indexer/map-command.js +2 -4
- package/dist/modules/indexer/map-select.js +16 -16
- package/dist/modules/indexer/module.js +47 -12
- package/dist/modules/indexer/project-profile.js +8 -7
- package/dist/modules/indexer/symbols.js +15 -15
- package/dist/modules/indexer/walker.js +159 -29
- package/dist/modules/lsp/check-tool.js +7 -5
- package/dist/modules/lsp/client.js +39 -39
- package/dist/modules/lsp/command.js +17 -24
- package/dist/modules/lsp/config.js +12 -11
- package/dist/modules/lsp/index.js +1 -0
- package/dist/modules/lsp/module.js +48 -46
- package/dist/modules/lsp/probe.js +13 -14
- package/dist/modules/lsp/project-root.js +14 -17
- package/dist/modules/lsp/startup-check.js +18 -16
- package/dist/modules/mcp/client.js +59 -62
- package/dist/modules/mcp/index.js +1 -0
- package/dist/modules/mcp/module.js +66 -37
- package/dist/modules/mcp/registry.js +5 -0
- package/dist/modules/memory/index.js +1 -0
- package/dist/modules/memory/module.js +12 -8
- package/dist/modules/memory/search.js +4 -1
- package/dist/modules/memory/store.js +40 -2
- package/dist/modules/onboarding/init.js +47 -0
- package/dist/modules/onboarding/meet.js +30 -0
- package/dist/modules/onboarding/mode.js +30 -0
- package/dist/modules/onboarding/prompts.js +43 -0
- package/dist/modules/pipelines/engine.js +10 -0
- package/dist/modules/pipelines/index.js +1 -0
- package/dist/modules/pipelines/parser.js +4 -1
- package/dist/modules/pipelines/template.js +4 -0
- package/dist/modules/plugins/builtin/lint-on-write.js +80 -67
- package/dist/modules/plugins/builtin/notify.js +2 -0
- package/dist/modules/plugins/index.js +1 -0
- package/dist/modules/plugins/loader.js +18 -3
- package/dist/modules/plugins/manager.js +37 -17
- package/dist/modules/pricing/index.js +10 -11
- package/dist/modules/pricing/prices.js +12 -12
- package/dist/modules/processes/index.js +1 -0
- package/dist/modules/processes/kill-tree.js +27 -31
- package/dist/modules/processes/registry.js +44 -25
- package/dist/modules/processes/runner.js +4 -4
- package/dist/modules/providers/capabilities.js +28 -0
- package/dist/modules/providers/create.js +3 -4
- package/dist/modules/providers/factory.js +7 -7
- package/dist/modules/providers/fallback.js +12 -12
- package/dist/modules/providers/health.js +4 -4
- package/dist/modules/providers/manager.js +50 -19
- package/dist/modules/providers/naming.js +15 -0
- package/dist/modules/providers/preflight.js +71 -0
- package/dist/modules/providers/presets.js +39 -8
- package/dist/modules/providers/registry.js +7 -2
- package/dist/modules/reasoning/policy.js +8 -6
- package/dist/modules/reasoning/probe.js +30 -25
- package/dist/modules/security/audit-log.js +19 -36
- package/dist/modules/security/audit-notifier.js +35 -75
- package/dist/modules/security/command-validator.js +99 -51
- package/dist/modules/security/content-scanner.js +8 -8
- package/dist/modules/security/data-sanitizer.js +9 -16
- package/dist/modules/security/encryption.js +32 -52
- package/dist/modules/security/index.js +2 -1
- package/dist/modules/security/network-validator.js +120 -43
- package/dist/modules/security/path-validator.js +61 -46
- package/dist/modules/security/protected-paths.js +73 -0
- package/dist/modules/security/rate-limiter.js +17 -49
- package/dist/modules/security/security-policies.js +25 -57
- package/dist/modules/security/session-encryption.js +32 -71
- package/dist/modules/security/session-isolation.js +15 -28
- package/dist/modules/session/auto-name.js +63 -0
- package/dist/modules/session/export.js +98 -0
- package/dist/modules/session/index.js +1 -0
- package/dist/modules/session/manager.js +79 -28
- package/dist/modules/session/module.js +4 -3
- package/dist/modules/session/store.js +57 -20
- package/dist/modules/setup/answers.js +35 -0
- package/dist/modules/setup/apply.js +79 -0
- package/dist/modules/setup/discovery.js +72 -0
- package/dist/modules/skills/index.js +1 -0
- package/dist/modules/skills/loader.js +9 -1
- package/dist/modules/skills/module.js +11 -0
- package/dist/modules/updater/changelog-reader.js +15 -16
- package/dist/modules/updater/checker.js +9 -4
- package/dist/modules/updater/dev-detect.js +7 -6
- package/dist/modules/updater/index.js +1 -0
- package/dist/modules/updater/module.js +17 -15
- package/dist/modules/user-profile/compressor.js +2 -0
- package/dist/modules/user-profile/index.js +1 -0
- package/dist/modules/user-profile/profile.js +10 -1
- package/dist/modules/webui/answer-api.js +29 -0
- package/dist/modules/webui/assets.js +50 -0
- package/dist/modules/webui/body.js +21 -0
- package/dist/modules/webui/commands-settings.js +209 -0
- package/dist/modules/webui/commands-shared.js +60 -0
- package/dist/modules/webui/commands.js +174 -0
- package/dist/modules/webui/config-api.js +134 -0
- package/dist/modules/webui/file-api.js +202 -0
- package/dist/modules/webui/forward.js +159 -0
- package/dist/modules/webui/history-api.js +112 -0
- package/dist/modules/webui/host-state.js +60 -0
- package/dist/modules/webui/i18n-api.js +9 -0
- package/dist/modules/webui/limits.js +6 -0
- package/dist/modules/webui/log-forward.js +20 -0
- package/dist/modules/webui/memory-commands.js +64 -0
- package/dist/modules/webui/model-cache.js +18 -0
- package/dist/modules/webui/module.js +148 -0
- package/dist/modules/webui/persist.js +24 -0
- package/dist/modules/webui/prompt-io.js +97 -0
- package/dist/modules/webui/providers-api.js +337 -0
- package/dist/modules/webui/providers-view.js +56 -0
- package/dist/modules/webui/reasoning-view.js +15 -0
- package/dist/modules/webui/run-agent.js +81 -0
- package/dist/modules/webui/server.js +284 -0
- package/dist/modules/webui/sessions-api.js +178 -0
- package/dist/modules/webui/settings-api.js +561 -0
- package/dist/modules/webui/setup-api.js +201 -0
- package/dist/modules/webui/state.js +74 -0
- package/dist/modules/webui/util.js +261 -0
- package/dist/output/bus.js +7 -2
- package/dist/output/channel.js +80 -28
- package/dist/output/format.js +2 -1
- package/dist/output/index.js +1 -0
- package/dist/output/json-sink.js +5 -3
- package/dist/output/machine.js +4 -3
- package/dist/output/session-sink.js +4 -4
- package/dist/tools/approve.js +4 -0
- package/dist/tools/attach-image.js +5 -4
- package/dist/tools/auto-fixer.js +26 -44
- package/dist/tools/auto-tags.js +83 -0
- package/dist/tools/bash.js +193 -116
- package/dist/tools/browser.js +76 -31
- package/dist/tools/chunk-query.js +14 -6
- package/dist/tools/create-dir.js +9 -5
- package/dist/tools/delete-file.js +9 -5
- package/dist/tools/download-file.js +32 -7
- package/dist/tools/edit-file.js +52 -14
- package/dist/tools/enable-tools.js +6 -6
- package/dist/tools/executor.js +132 -27
- package/dist/tools/file-info.js +3 -1
- package/dist/tools/filter-tools.js +3 -3
- package/dist/tools/glob-tool.js +4 -1
- package/dist/tools/grep-tool.js +13 -10
- package/dist/tools/hidden-tools-block.js +6 -6
- package/dist/tools/index.js +16 -8
- package/dist/tools/list-dir.js +4 -2
- package/dist/tools/load-skill.js +7 -0
- package/dist/tools/mcp-call.js +15 -4
- package/dist/tools/meet-done.js +14 -0
- package/dist/tools/move-file.js +14 -7
- package/dist/tools/path-utils.js +29 -29
- package/dist/tools/pipeline-run.js +29 -7
- package/dist/tools/preview.js +1 -1
- package/dist/tools/process-ids.js +31 -0
- package/dist/tools/process-kill.js +9 -16
- package/dist/tools/process-list.js +1 -0
- package/dist/tools/process-log.js +11 -16
- package/dist/tools/process-wait.js +63 -0
- package/dist/tools/prompt-io.js +4 -3
- package/dist/tools/question.js +172 -25
- package/dist/tools/read-file.js +55 -34
- package/dist/tools/recall.js +14 -8
- package/dist/tools/registry.js +6 -5
- package/dist/tools/remember.js +8 -4
- package/dist/tools/scope-request.js +11 -6
- package/dist/tools/search-history.js +5 -2
- package/dist/tools/session-info.js +2 -0
- package/dist/tools/set-thinking.js +8 -4
- package/dist/tools/subagent.js +59 -39
- package/dist/tools/syntax-validator.js +292 -90
- package/dist/tools/user-input.js +22 -18
- package/dist/tools/web-browse.js +9 -3
- package/dist/tools/web-fetch.js +12 -23
- package/dist/tools/web-search.js +7 -5
- package/dist/tools/write-file.js +45 -15
- package/dist/ui/action-log.js +13 -0
- package/dist/ui/box.js +4 -3
- package/dist/ui/colors.js +2 -0
- package/dist/ui/diff.js +6 -5
- package/dist/ui/index.js +1 -0
- package/dist/ui/line-editor.js +230 -122
- package/dist/ui/line-math.js +10 -2
- package/dist/ui/md-formatter.js +57 -37
- package/dist/ui/output.js +8 -3
- package/dist/ui/plan-view.js +21 -10
- package/dist/ui/renderer.js +393 -67
- package/dist/ui/spinner.js +16 -5
- package/dist/ui/table.js +15 -17
- package/dist/ui/theme.js +143 -0
- package/dist/utils/child-run.js +20 -0
- package/dist/utils/error.js +1 -1
- package/dist/utils/index.js +2 -0
- package/dist/utils/retry.js +2 -2
- package/dist/utils/truncate.js +1 -1
- package/package.json +1 -1
package/dist/ui/spinner.js
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
|
+
// Спиннер прогресса: одна перезаписываемая строка в stderr (только TTY).
|
|
1
2
|
import { pc } from "./colors";
|
|
2
3
|
import stringWidth from "string-width";
|
|
3
4
|
import { getTerminalWidth } from "./table";
|
|
4
5
|
const FRAMES = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
|
|
6
|
+
/** Поддерживается ли спиннер на потоке (TTY и не CI). */
|
|
5
7
|
export function isSpinnerSupported(stream) {
|
|
6
8
|
const s = stream ?? process.stderr;
|
|
7
9
|
return Boolean(s.isTTY) && !process.env.CI;
|
|
8
10
|
}
|
|
9
11
|
/**
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* when the target stream is not a TTY.
|
|
12
|
+
* ANSI-спиннер без зависимостей. Пишет в stderr одной перезаписываемой строкой
|
|
13
|
+
* (`\r` + текст + чистка до конца). На не-TTY автоматически выключен.
|
|
13
14
|
*/
|
|
14
15
|
export class Spinner {
|
|
15
16
|
timer = null;
|
|
@@ -20,6 +21,7 @@ export class Spinner {
|
|
|
20
21
|
stream;
|
|
21
22
|
intervalMs;
|
|
22
23
|
width;
|
|
24
|
+
startedAt = 0;
|
|
23
25
|
constructor(opts = {}) {
|
|
24
26
|
this.channel = opts.channel;
|
|
25
27
|
this.stream = process.stderr;
|
|
@@ -27,23 +29,28 @@ export class Spinner {
|
|
|
27
29
|
this.intervalMs = opts.intervalMs ?? 80;
|
|
28
30
|
this.width = opts.width ?? getTerminalWidth();
|
|
29
31
|
}
|
|
32
|
+
/** Крутится ли сейчас. */
|
|
30
33
|
get running() {
|
|
31
34
|
return this.timer !== null;
|
|
32
35
|
}
|
|
36
|
+
/** Старт с сообщением (перезапускает, если уже крутится). */
|
|
33
37
|
start(message) {
|
|
34
38
|
if (!this.enabled)
|
|
35
39
|
return;
|
|
36
40
|
this.stop();
|
|
37
41
|
this.message = this.truncate(message);
|
|
38
42
|
this.frame = 0;
|
|
43
|
+
this.startedAt = Date.now();
|
|
39
44
|
this.timer = setInterval(() => this.tick(), this.intervalMs);
|
|
40
45
|
this.tick();
|
|
41
46
|
}
|
|
47
|
+
/** Смена сообщения на лету. */
|
|
42
48
|
setMessage(message) {
|
|
43
49
|
this.message = this.truncate(message);
|
|
44
50
|
if (this.timer)
|
|
45
51
|
this.tick();
|
|
46
52
|
}
|
|
53
|
+
/** Стоп со стиранием строки. */
|
|
47
54
|
stop() {
|
|
48
55
|
if (this.timer) {
|
|
49
56
|
clearInterval(this.timer);
|
|
@@ -64,14 +71,18 @@ export class Spinner {
|
|
|
64
71
|
break;
|
|
65
72
|
acc += ch;
|
|
66
73
|
}
|
|
67
|
-
return acc
|
|
74
|
+
return `${acc}…`;
|
|
68
75
|
}
|
|
69
76
|
tick() {
|
|
70
77
|
if (!this.timer)
|
|
71
78
|
return;
|
|
72
79
|
const frame = FRAMES[this.frame % FRAMES.length];
|
|
73
80
|
this.frame++;
|
|
74
|
-
|
|
81
|
+
// Секунды показываем, лишь когда ожидание заметно: тихий хинт, что тул
|
|
82
|
+
// ещё работает, а не быстрый вывод.
|
|
83
|
+
const elapsed = Date.now() - this.startedAt;
|
|
84
|
+
const suffix = elapsed >= 3000 ? pc.dim(` · ${Math.floor(elapsed / 1000)}s`) : "";
|
|
85
|
+
const text = `\r${pc.cyan(frame)} ${this.message}${suffix}\x1b[K`;
|
|
75
86
|
if (this.channel)
|
|
76
87
|
this.channel.writeOverlay(text);
|
|
77
88
|
else
|
package/dist/ui/table.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
// Таблицы чата: парсинг markdown-строк, выравнивание колонок (без рамок, см. STYLE.md).
|
|
1
2
|
import stringWidth from "string-width";
|
|
2
3
|
import { pc } from "./colors";
|
|
3
4
|
const ELLIPSIS = "…";
|
|
@@ -23,7 +24,7 @@ function truncate(text, width) {
|
|
|
23
24
|
}
|
|
24
25
|
return acc + ELLIPSIS;
|
|
25
26
|
}
|
|
26
|
-
/**
|
|
27
|
+
/** Режет строку `| a | b |` на ячейки. */
|
|
27
28
|
export function splitRow(line) {
|
|
28
29
|
const trimmed = line.trim();
|
|
29
30
|
let body = trimmed;
|
|
@@ -33,7 +34,7 @@ export function splitRow(line) {
|
|
|
33
34
|
body = body.slice(0, -1);
|
|
34
35
|
return body.split("|").map((c) => c.trim());
|
|
35
36
|
}
|
|
36
|
-
/**
|
|
37
|
+
/** Детект строки-разделителя вида `|---|---|` / `:---:` / `---:`. */
|
|
37
38
|
export function isSeparatorRow(line) {
|
|
38
39
|
const trimmed = line.trim();
|
|
39
40
|
if (!trimmed.includes("-"))
|
|
@@ -43,7 +44,7 @@ export function isSeparatorRow(line) {
|
|
|
43
44
|
return false;
|
|
44
45
|
return cells.every((c) => /^:?-{3,}:?$/.test(c));
|
|
45
46
|
}
|
|
46
|
-
/**
|
|
47
|
+
/** Выравнивания из строки-разделителя, по индексу колонки. */
|
|
47
48
|
export function parseAlignments(separator) {
|
|
48
49
|
const out = {};
|
|
49
50
|
splitRow(separator).forEach((cell, i) => {
|
|
@@ -57,8 +58,8 @@ export function parseAlignments(separator) {
|
|
|
57
58
|
return out;
|
|
58
59
|
}
|
|
59
60
|
/**
|
|
60
|
-
*
|
|
61
|
-
* `tableLines`
|
|
61
|
+
* Рендерит markdown-блок таблицы в выровненные строки без рамок.
|
|
62
|
+
* `tableLines` включает строку шапки и опц. строку-разделитель.
|
|
62
63
|
*/
|
|
63
64
|
export function formatTable(tableLines, opts = {}) {
|
|
64
65
|
const align = opts.align ?? {};
|
|
@@ -85,9 +86,9 @@ export function formatTable(tableLines, opts = {}) {
|
|
|
85
86
|
widths.push(w);
|
|
86
87
|
}
|
|
87
88
|
const maxWidth = opts.maxWidth ?? getTerminalWidth();
|
|
89
|
+
const GAP = " ";
|
|
88
90
|
const contentWidth = widths.reduce((a, b) => a + b, 0);
|
|
89
|
-
const
|
|
90
|
-
const totalWidth = contentWidth + borderWidth;
|
|
91
|
+
const totalWidth = contentWidth + GAP.length * Math.max(0, columnCount - 1);
|
|
91
92
|
if (totalWidth > maxWidth) {
|
|
92
93
|
const over = totalWidth - maxWidth;
|
|
93
94
|
let remaining = over;
|
|
@@ -106,33 +107,30 @@ export function formatTable(tableLines, opts = {}) {
|
|
|
106
107
|
for (let c = 0; c < columnCount; c++) {
|
|
107
108
|
const raw = row[c] ?? "";
|
|
108
109
|
const cell = truncate(raw, widths[c]);
|
|
109
|
-
const a = isHeader && align[c] === undefined ? "
|
|
110
|
+
const a = isHeader && align[c] === undefined ? "left" : (align[c] ?? "left");
|
|
110
111
|
cells.push(pad(cell, widths[c], a));
|
|
111
112
|
}
|
|
112
|
-
const content = cells.
|
|
113
|
+
const content = cells.join(GAP);
|
|
113
114
|
return isHeader ? pc.bold(content) : content;
|
|
114
115
|
};
|
|
115
|
-
|
|
116
|
-
const seg = widths.map((w) => "─".repeat(w + 2)).join(m);
|
|
117
|
-
return pc.dim(l + seg + r);
|
|
118
|
-
};
|
|
116
|
+
// Без box-рамок: жирная шапка, dim-линейка, выровненные колонки.
|
|
119
117
|
const out = [];
|
|
120
|
-
out.push(border("┌", "┬", "┐"));
|
|
121
118
|
out.push(renderRow(headerRow, true));
|
|
122
|
-
|
|
119
|
+
const ruleWidth = widths.reduce((a, b) => a + b, 0) + GAP.length * Math.max(0, columnCount - 1);
|
|
120
|
+
out.push(pc.dim("─".repeat(Math.max(3, Math.min(ruleWidth, maxWidth - 1)))));
|
|
123
121
|
for (const row of dataRows) {
|
|
124
122
|
out.push(renderRow(row, false));
|
|
125
123
|
}
|
|
126
|
-
out.push(border("└", "┴", "┘"));
|
|
127
124
|
return out;
|
|
128
125
|
}
|
|
126
|
+
/** Ширина терминала; вне TTY — 80. */
|
|
129
127
|
export function getTerminalWidth() {
|
|
130
128
|
if (process.stdout.isTTY && process.stdout.columns) {
|
|
131
129
|
return process.stdout.columns;
|
|
132
130
|
}
|
|
133
131
|
return 80;
|
|
134
132
|
}
|
|
135
|
-
/**
|
|
133
|
+
/** Строит pipe-строки из структурных данных и рендерит таблицей. */
|
|
136
134
|
export function renderTable(headers, rows, opts = {}) {
|
|
137
135
|
const lines = [];
|
|
138
136
|
lines.push(`| ${headers.join(" | ")} |`);
|
package/dist/ui/theme.js
ADDED
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
// Тема чата: глифы, болтливость, акцентные цвета категорий тулов (см. STYLE.md).
|
|
2
|
+
import { pc } from "./colors";
|
|
3
|
+
/**
|
|
4
|
+
* Канонические глифы чата — единственный источник правды.
|
|
5
|
+
* См. `docs/design/ui/STYLE.md`. Свои маркеры по модулям не выдумывать.
|
|
6
|
+
*/
|
|
7
|
+
export const glyph = {
|
|
8
|
+
/** Действие (дальше — локализованный ярлык тула). */
|
|
9
|
+
action: "◇",
|
|
10
|
+
success: "✓",
|
|
11
|
+
failure: "✗",
|
|
12
|
+
warning: "⚠",
|
|
13
|
+
/** Рассуждение / обдумывание. */
|
|
14
|
+
thinking: "✦",
|
|
15
|
+
question: "?",
|
|
16
|
+
/** Эхо ввода пользователя в транскрипте. */
|
|
17
|
+
user: "↵",
|
|
18
|
+
/** Деталь или хинт восстановления. */
|
|
19
|
+
detail: "↳",
|
|
20
|
+
/** Продолжение сгруппированного прогона. */
|
|
21
|
+
group: "│",
|
|
22
|
+
/** Строка сводных метрик. */
|
|
23
|
+
metric: "⟡",
|
|
24
|
+
/** Компакция / обновление. */
|
|
25
|
+
compact: "⟳",
|
|
26
|
+
};
|
|
27
|
+
/** Тайпгард болтливости. */
|
|
28
|
+
export function isVerbosity(value) {
|
|
29
|
+
return value === "quiet" || value === "normal" || value === "verbose";
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Резолвит итоговую болтливость из конфига. Явный `verbosity` побеждает;
|
|
33
|
+
* иначе legacy-bool `verbose` маппится в `verbose`/`quiet`.
|
|
34
|
+
*/
|
|
35
|
+
export function resolveVerbosity(ui) {
|
|
36
|
+
if (ui?.verbosity)
|
|
37
|
+
return ui.verbosity;
|
|
38
|
+
return ui?.verbose ? "verbose" : "quiet";
|
|
39
|
+
}
|
|
40
|
+
/** Акцентная метка действия (cyan). */
|
|
41
|
+
export function actionMark() {
|
|
42
|
+
return pc.cyan(glyph.action);
|
|
43
|
+
}
|
|
44
|
+
const CATEGORY_TOOLS = {
|
|
45
|
+
recon: new Set([
|
|
46
|
+
"read_file",
|
|
47
|
+
"list_dir",
|
|
48
|
+
"glob",
|
|
49
|
+
"grep",
|
|
50
|
+
"file_info",
|
|
51
|
+
"project_map",
|
|
52
|
+
"chunk_query",
|
|
53
|
+
"web_search",
|
|
54
|
+
"web_fetch",
|
|
55
|
+
"web_browse",
|
|
56
|
+
"search_history",
|
|
57
|
+
"recall",
|
|
58
|
+
"session_info",
|
|
59
|
+
"process_list",
|
|
60
|
+
"process_log",
|
|
61
|
+
"process_wait",
|
|
62
|
+
]),
|
|
63
|
+
mutate: new Set([
|
|
64
|
+
"write_file",
|
|
65
|
+
"edit_file",
|
|
66
|
+
"create_dir",
|
|
67
|
+
"delete_file",
|
|
68
|
+
"move_file",
|
|
69
|
+
"attach_image",
|
|
70
|
+
]),
|
|
71
|
+
execute: new Set([
|
|
72
|
+
"bash",
|
|
73
|
+
"process_kill",
|
|
74
|
+
"pipeline_run",
|
|
75
|
+
"browser",
|
|
76
|
+
"download_file",
|
|
77
|
+
"subagent",
|
|
78
|
+
"mcp_call",
|
|
79
|
+
]),
|
|
80
|
+
meta: new Set([
|
|
81
|
+
"plan",
|
|
82
|
+
"plan_step",
|
|
83
|
+
"todo",
|
|
84
|
+
"verify",
|
|
85
|
+
"lsp_check",
|
|
86
|
+
"enable_tools",
|
|
87
|
+
"set_thinking",
|
|
88
|
+
"load_skill",
|
|
89
|
+
"remember",
|
|
90
|
+
]),
|
|
91
|
+
};
|
|
92
|
+
/** Категория тула по имени. Неизвестные — meta. */
|
|
93
|
+
export function toolCategory(tool) {
|
|
94
|
+
for (const [category, tools] of Object.entries(CATEGORY_TOOLS)) {
|
|
95
|
+
if (tools.has(tool))
|
|
96
|
+
return category;
|
|
97
|
+
}
|
|
98
|
+
return "meta";
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Акцентный цвет категории тула. Один цвет красит И глиф действия, И
|
|
102
|
+
* локализованный ярлык — они читаются как единое целое
|
|
103
|
+
* (см. `docs/design/ui/STYLE.md`). Цвета не пересекаются с семантическими
|
|
104
|
+
* success/warning/error, чтобы цветной ярлык не читался как исход.
|
|
105
|
+
*/
|
|
106
|
+
export function toolAccent(tool) {
|
|
107
|
+
switch (toolCategory(tool)) {
|
|
108
|
+
case "recon":
|
|
109
|
+
return pc.cyan;
|
|
110
|
+
case "mutate":
|
|
111
|
+
return pc.magenta;
|
|
112
|
+
case "execute":
|
|
113
|
+
return pc.blue;
|
|
114
|
+
default:
|
|
115
|
+
return pc.dim;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/** Метка действия в цвете категории тула. */
|
|
119
|
+
export function actionMarkFor(tool) {
|
|
120
|
+
return toolAccent(tool)(glyph.action);
|
|
121
|
+
}
|
|
122
|
+
/** Зелёная метка успеха. */
|
|
123
|
+
export function successMark() {
|
|
124
|
+
return pc.green(glyph.success);
|
|
125
|
+
}
|
|
126
|
+
/** Красная метка провала — только реальные сбои, не мягкие гарды. */
|
|
127
|
+
export function failureMark() {
|
|
128
|
+
return pc.red(glyph.failure);
|
|
129
|
+
}
|
|
130
|
+
/** Жёлтая метка предупреждения — мягкие блоки, защищённые пути, нефатальное. */
|
|
131
|
+
export function warningMark() {
|
|
132
|
+
return pc.yellow(glyph.warning);
|
|
133
|
+
}
|
|
134
|
+
/** Dim-метка детали/хинта. */
|
|
135
|
+
export function detailMark() {
|
|
136
|
+
return pc.dim(glyph.detail);
|
|
137
|
+
}
|
|
138
|
+
/** Человеческая длительность: `ms` до секунды, `s` выше (как в мокапе). */
|
|
139
|
+
export function formatDuration(ms) {
|
|
140
|
+
if (ms < 1000)
|
|
141
|
+
return `${ms}ms`;
|
|
142
|
+
return `${(ms / 1000).toFixed(1)}s`;
|
|
143
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Общий финал ожидания child-процесса: закрывает дублированный `close`-хендлер
|
|
3
|
+
* в verifier / syntax-validator / lint-on-write (один клон на троих по fallow).
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Резолвит промис раннера на `code === 0`, иначе реджектит обогащённой
|
|
7
|
+
* ошибкой (сообщение + `stdout`/`stderr`/`status` полями). Поведение 1:1
|
|
8
|
+
* с инлайн-версиями: текст сообщения формирует вызывающий.
|
|
9
|
+
*/
|
|
10
|
+
export function settleChildClose(code, stdout, stderr, message, resolve, reject) {
|
|
11
|
+
if (code === 0) {
|
|
12
|
+
resolve({ stdout, stderr });
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
const err = new Error(message);
|
|
16
|
+
err.stdout = stdout;
|
|
17
|
+
err.stderr = stderr;
|
|
18
|
+
err.status = code;
|
|
19
|
+
reject(err);
|
|
20
|
+
}
|
package/dist/utils/error.js
CHANGED
package/dist/utils/index.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
// Общие утилиты без зависимостей: сон, обрезка строк, бэкофф, ошибки, child-процессы.
|
|
1
2
|
export { sleep } from "./sleep";
|
|
2
3
|
export { truncate } from "./truncate";
|
|
3
4
|
export { backoffDelay } from "./retry";
|
|
4
5
|
export { errMsg } from "./error";
|
|
6
|
+
export { settleChildClose } from "./child-run";
|
package/dist/utils/retry.js
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
*/
|
|
12
12
|
export function backoffDelay(attempt, baseDelay, maxDelay, jitterFactor = 0) {
|
|
13
13
|
const base = maxDelay !== undefined
|
|
14
|
-
? Math.min(baseDelay *
|
|
15
|
-
: baseDelay *
|
|
14
|
+
? Math.min(baseDelay * 2 ** attempt, maxDelay)
|
|
15
|
+
: baseDelay * 2 ** attempt;
|
|
16
16
|
return base + Math.random() * baseDelay * jitterFactor;
|
|
17
17
|
}
|
package/dist/utils/truncate.js
CHANGED