mixdog 0.9.138 → 0.9.140
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/LICENSES/MIT.txt +8 -14
- package/NOTICE.md +66 -34
- package/package.json +3 -10
- package/scripts/model-catalog-audit.mjs +2 -2
- package/scripts/tool-stress.mjs +3 -3
- package/src/defaults/mixdog-config.template.json +2 -2
- package/src/defaults/skills/setup/SKILL.md +11 -9
- package/src/help.mjs +1 -1
- package/src/lib/output-style-meta.cjs +115 -0
- package/src/lib/rules-builder.cjs +107 -34
- package/src/output-styles/common.md +38 -0
- package/src/output-styles/detailed.md +8 -17
- package/src/output-styles/extreme-minimal.md +10 -7
- package/src/output-styles/minimal.md +10 -8
- package/src/output-styles/simple.md +11 -14
- package/src/rules/lead/01-general.md +7 -2
- package/src/rules/lead/02-persona.md +7 -0
- package/src/rules/shared/00-general.md +4 -0
- package/src/rules/shared/10-tool-workflow.md +22 -0
- package/src/rules/shared/20-research.md +6 -0
- package/src/rules/shared/30-exploration.md +44 -0
- package/src/rules/shared/40-editing.md +12 -0
- package/src/rules/shared/50-execution.md +5 -0
- package/src/rules/shared/60-verification.md +10 -0
- package/src/rules/shared/70-delivery.md +6 -0
- package/src/rules/shared/80-memory.md +11 -0
- package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +8 -4
- package/src/runtime/agent/orchestrator/agent-runtime/maintenance-route.mjs +4 -1
- package/src/runtime/agent/orchestrator/config.mjs +37 -9
- package/src/runtime/agent/orchestrator/context/collect.mjs +20 -10
- package/src/runtime/agent/orchestrator/providers/admission-scheduler.mjs +12 -26
- package/src/runtime/agent/orchestrator/providers/anthropic-effort.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-messages.mjs +9 -5
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +6 -2
- package/src/runtime/agent/orchestrator/providers/antigravity-oauth-login.mjs +297 -0
- package/src/runtime/agent/orchestrator/providers/antigravity-oauth-tokens.mjs +311 -0
- package/src/runtime/agent/orchestrator/providers/antigravity-oauth.mjs +383 -0
- package/src/runtime/agent/orchestrator/providers/antigravity-oauth.test.mjs +165 -0
- package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +12 -3
- package/src/runtime/agent/orchestrator/providers/gemini.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/oauth-credential-probes.mjs +15 -0
- package/src/runtime/agent/orchestrator/providers/oauth-usage.mjs +3 -3
- package/src/runtime/agent/orchestrator/providers/openai-compat-xai.mjs +21 -8
- package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +31 -4
- package/src/runtime/agent/orchestrator/providers/openai-ws-stream.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/registry.mjs +11 -1
- package/src/runtime/agent/orchestrator/providers/retry-classifier.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/agent-loop.mjs +4 -4
- package/src/runtime/agent/orchestrator/session/context-utils.mjs +24 -10
- package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +16 -0
- package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +8 -0
- package/src/runtime/agent/orchestrator/session/loop/tool-helpers.mjs +6 -5
- package/src/runtime/agent/orchestrator/session/lossless-tool-output.test.mjs +6 -5
- package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +5 -0
- package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +63 -8
- package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +23 -10
- package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +9 -7
- package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +21 -0
- package/src/runtime/agent/orchestrator/session/send-with-recovery.mjs +16 -9
- package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +107 -6
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +22 -4
- package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +49 -34
- package/src/runtime/agent/orchestrator/tools/builtin/edit-sequential-occupation.test.mjs +55 -0
- package/src/runtime/agent/orchestrator/tools/builtin/external-tool-adapters.mjs +27 -7
- package/src/runtime/agent/orchestrator/tools/builtin/git-command-policy.mjs +21 -2
- package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +66 -35
- package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.test.mjs +50 -1
- package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +32 -4
- package/src/runtime/agent/orchestrator/tools/builtin/native-search-client.mjs +5 -1
- package/src/runtime/agent/orchestrator/tools/builtin/shell-analysis.mjs +9 -4
- package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +125 -3
- package/src/runtime/agent/orchestrator/tools/builtin/shell-monitor.mjs +57 -0
- package/src/runtime/agent/orchestrator/tools/builtin/shell-monitor.test.mjs +57 -0
- package/src/runtime/agent/orchestrator/tools/builtin/task-tool.mjs +28 -3
- package/src/runtime/agent/orchestrator/tools/code-graph-tool-defs.mjs +6 -6
- package/src/runtime/agent/orchestrator/tools/graph-manifest.json +11 -11
- package/src/runtime/agent/orchestrator/tools/lib/native-spawn-client.mjs +29 -2
- package/src/runtime/agent/orchestrator/tools/patch/native-server.mjs +7 -2
- package/src/runtime/agent/orchestrator/tools/patch/v4a-anchors.mjs +27 -0
- package/src/runtime/agent/orchestrator/tools/patch/v4a-convert.mjs +6 -0
- package/src/runtime/agent/orchestrator/tools/patch-manifest.json +10 -10
- package/src/runtime/agent/orchestrator/tools/patch-tool-defs.mjs +8 -32
- package/src/runtime/agent/orchestrator/tools/progress-message.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/shell-command.mjs +72 -4
- package/src/runtime/agent/orchestrator/tools/shell-snapshot.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/spawn-manifest.json +11 -11
- package/src/runtime/channels/lib/scheduler.mjs +1 -1
- package/src/runtime/media/download.mjs +1 -1
- package/src/runtime/media/jobs.mjs +9 -0
- package/src/runtime/media/store.mjs +4 -9
- package/src/runtime/memory/lib/core-memory-file.mjs +8 -1
- package/src/runtime/memory/lib/embedding-worker.mjs +9 -4
- package/src/runtime/memory/lib/http-router.mjs +36 -4
- package/src/runtime/memory/lib/ko-morph.mjs +8 -1
- package/src/runtime/memory/lib/memory-cycle1.mjs +28 -2
- package/src/runtime/memory/lib/tool-call-handler.mjs +1 -1
- package/src/runtime/memory/tool-defs.mjs +17 -29
- package/src/runtime/shared/agent-route-config.mjs +46 -1
- package/src/runtime/shared/background-tasks.mjs +1 -1
- package/src/runtime/shared/err-text.mjs +42 -1
- package/src/runtime/shared/llm/http-agent.mjs +1 -1
- package/src/runtime/shared/pristine-execution-contract.json +6 -0
- package/src/runtime/shared/shell-display.mjs +17 -0
- package/src/runtime/shared/task-notification-envelope.mjs +2 -1
- package/src/runtime/shared/tool-card-model.mjs +5 -5
- package/src/runtime/shared/tool-result-summary.mjs +0 -8
- package/src/runtime/shared/tool-surface.mjs +0 -4
- package/src/runtime/shared/turn-snapshot.mjs +41 -18
- package/src/runtime/shared/webhook-session-run.mjs +6 -0
- package/src/runtime/shared/webhook-session-run.test.mjs +14 -0
- package/src/runtime/{search → web-search}/index.mjs +52 -52
- package/src/runtime/{search → web-search}/lib/cache.mjs +2 -2
- package/src/runtime/{search → web-search}/lib/config.mjs +3 -7
- package/src/runtime/{search → web-search}/lib/formatter.mjs +4 -4
- package/src/runtime/{search → web-search}/lib/http-fetch.mjs +1 -1
- package/src/runtime/{search → web-search}/lib/ssrf-guard.mjs +1 -0
- package/src/runtime/{search → web-search}/lib/state.mjs +2 -2
- package/src/runtime/{search → web-search}/lib/web-tools.mjs +1 -1
- package/src/runtime/{search → web-search}/tool-defs.mjs +6 -6
- package/src/session-runtime/agent-disable.test.mjs +121 -0
- package/src/session-runtime/config-lifecycle.mjs +8 -8
- package/src/session-runtime/context-status.mjs +4 -2
- package/src/session-runtime/cwd-tool-routing.test.mjs +56 -0
- package/src/session-runtime/effort.mjs +3 -0
- package/src/session-runtime/lifecycle-api.mjs +47 -0
- package/src/session-runtime/model-capabilities.mjs +6 -6
- package/src/session-runtime/model-recency.mjs +3 -3
- package/src/session-runtime/model-route-api.mjs +47 -41
- package/src/session-runtime/model-settings-persist.test.mjs +4 -4
- package/src/session-runtime/{native-search.mjs → native-web-search.mjs} +72 -61
- package/src/session-runtime/output-styles.mjs +39 -84
- package/src/session-runtime/provider-models.mjs +31 -31
- package/src/session-runtime/quick-model-rows.mjs +50 -50
- package/src/session-runtime/{quick-search-models.mjs → quick-web-search-models.mjs} +2 -2
- package/src/session-runtime/runtime-core.mjs +96 -75
- package/src/session-runtime/runtime-paths.mjs +2 -2
- package/src/session-runtime/runtime-tool-routing.mjs +7 -7
- package/src/session-runtime/session-turn-api.mjs +26 -0
- package/src/session-runtime/settings-api.mjs +12 -8
- package/src/session-runtime/skills-api.mjs +10 -7
- package/src/session-runtime/tool-catalog-data.mjs +5 -5
- package/src/session-runtime/tool-catalog-schema.mjs +1 -1
- package/src/session-runtime/tool-catalog.mjs +2 -2
- package/src/session-runtime/tool-defs.mjs +8 -8
- package/src/session-runtime/tool-policy-refresh.mjs +22 -3
- package/src/session-runtime/tool-policy-surface.test.mjs +78 -45
- package/src/session-runtime/workflow-agents-api.mjs +33 -13
- package/src/session-runtime/workflow.mjs +36 -23
- package/src/standalone/agent-tool/spawn-flow.mjs +6 -0
- package/src/standalone/agent-tool/tool-def.mjs +11 -11
- package/src/standalone/hook-bus/handlers.mjs +1 -1
- package/src/standalone/memory-runtime-proxy.mjs +1 -1
- package/src/standalone/provider-admin.mjs +8 -0
- package/src/standalone/session-client.mjs +1 -1
- package/src/standalone/session-protocol.mjs +5 -3
- package/src/standalone/session-service.mjs +2 -2
- package/src/standalone/session-wire.mjs +1 -1
- package/src/tui/App.jsx +15 -15
- package/src/tui/app/app-format.mjs +8 -7
- package/src/tui/app/app-view.jsx +1 -1
- package/src/tui/app/create-app-pickers.mjs +6 -6
- package/src/tui/app/maintenance-pickers.mjs +36 -1
- package/src/tui/app/model-options.mjs +2 -0
- package/src/tui/app/model-picker.mjs +5 -5
- package/src/tui/app/onboarding-steps.mjs +37 -37
- package/src/tui/app/route-pickers.mjs +62 -18
- package/src/tui/app/settings-picker.mjs +11 -10
- package/src/tui/app/slash-commands.mjs +3 -2
- package/src/tui/app/slash-dispatch.mjs +24 -6
- package/src/tui/app/transcript-row-estimate.mjs +1 -1
- package/src/tui/app/use-prompt-handlers.mjs +1 -1
- package/src/tui/app/use-transcript-activity.mjs +10 -10
- package/src/tui/app/use-transcript-window.mjs +1 -1
- package/src/tui/app/use-welcome-prompt-hint.mjs +8 -8
- package/src/tui/components/StatusLine.jsx +31 -82
- package/src/tui/dist/index.mjs +1664 -1151
- package/src/tui/keyboard-protocol.mjs +1 -1
- package/src/tui/markdown/format-token.mjs +80 -13
- package/src/tui/markdown/render-ansi.mjs +27 -3
- package/src/tui/markdown/stream-fence.mjs +40 -17
- package/src/tui/markdown/streaming-markdown.mjs +133 -29
- package/src/tui/session/agent-envelope.mjs +2 -2
- package/src/tui/session/context-state.mjs +1 -1
- package/src/tui/session/labels.mjs +6 -1
- package/src/tui/session/session-api-ext.mjs +29 -10
- package/src/tui/session/session-api.mjs +5 -3
- package/src/tui/session/turn.mjs +35 -2
- package/src/tui/session-local.mjs +6 -6
- package/src/tui/themes/light.mjs +4 -4
- package/src/tui/themes/teal.mjs +1 -1
- package/src/ui/markdown.mjs +200 -11
- package/src/ui/statusline-agents.mjs +1 -1
- package/src/ui/statusline-segments.mjs +25 -6
- package/src/ui/statusline.mjs +13 -13
- package/src/workflows/default/WORKFLOW.md +2 -2
- package/src/workflows/solo/WORKFLOW.md +2 -2
- package/vendor/ink/build/_baseline-termio-keypress.js +240 -0
- package/vendor/ink/build/_baseline-termio-tokenize.js +253 -0
- package/vendor/ink/build/ink.js +3 -3
- package/vendor/ink/build/input-parser.js +1 -1
- package/vendor/ink/build/output.js +5 -5
- package/vendor/ink/build/termio-keypress.js +1 -1
- package/vendor/ink/build/termio-tokenize.js +160 -225
- package/src/rules/shared/01-tool.md +0 -113
package/LICENSES/MIT.txt
CHANGED
|
@@ -8,24 +8,18 @@ component listed here. Each component keeps its own copyright notice.
|
|
|
8
8
|
https://github.com/microsoft/vscode
|
|
9
9
|
Copyright (c) 2015 - present Microsoft Corporation
|
|
10
10
|
|
|
11
|
+
Visual Studio Code Codicons (icon font; the icons are CC BY 4.0)
|
|
12
|
+
https://github.com/microsoft/vscode-codicons
|
|
13
|
+
Copyright (c) Microsoft Corporation
|
|
14
|
+
|
|
11
15
|
GitHub Pull Requests and Issues (VS Code extension)
|
|
12
16
|
https://github.com/microsoft/vscode-pull-request-github
|
|
13
17
|
Copyright (c) Microsoft Corporation. All rights reserved.
|
|
14
18
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
OpenCode
|
|
20
|
-
https://github.com/anomalyco/opencode
|
|
21
|
-
Copyright (c) 2025 opencode
|
|
22
|
-
|
|
23
|
-
pi
|
|
24
|
-
https://github.com/earendil-works/pi
|
|
25
|
-
Copyright (c) 2025 Mario Zechner
|
|
26
|
-
|
|
27
|
-
Orca
|
|
28
|
-
Copyright (c) 2026 Lovecast Inc.
|
|
19
|
+
ripgrep (grep/ignore crates plus the packaged rg executable; offered as
|
|
20
|
+
MIT OR Unlicense — the MIT terms are taken here)
|
|
21
|
+
https://github.com/BurntSushi/ripgrep
|
|
22
|
+
Copyright (c) 2015 Andrew Gallant
|
|
29
23
|
|
|
30
24
|
Ink (vendored under vendor/ink, which keeps its own license file)
|
|
31
25
|
https://github.com/vadimdemedes/ink
|
package/NOTICE.md
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
# NOTICE
|
|
2
2
|
|
|
3
|
-
Mixdog itself is MIT-licensed (see `LICENSE`).
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
Mixdog itself is MIT-licensed (see `LICENSE`). The license sections below
|
|
4
|
+
cover third-party code and data that Mixdog actually carries. The closing
|
|
5
|
+
"Behavioral references" section records projects that only informed the
|
|
6
|
+
implementation, with no code taken. Everything is kept here in one place so
|
|
7
|
+
the individual source files stay free of scattered attribution comments.
|
|
7
8
|
|
|
8
9
|
Full license texts live in `LICENSES/`:
|
|
9
10
|
|
|
@@ -12,6 +13,10 @@ Full license texts live in `LICENSES/`:
|
|
|
12
13
|
- `LICENSES/Apache-2.0.txt` — the Apache License 2.0.
|
|
13
14
|
- `LICENSES/codex-NOTICE.txt` — the upstream NOTICE file of the Codex CLI,
|
|
14
15
|
carried forward as Apache-2.0 section 4(d) requires.
|
|
16
|
+
- `LICENSES/ripgrep-NOTICE.txt` — the ripgrep notice for the search crates
|
|
17
|
+
compiled into the native binaries.
|
|
18
|
+
- `LICENSES/editor-assets-NOTICE.txt` — the editor icon and language-data
|
|
19
|
+
notice referenced by the generated files.
|
|
15
20
|
|
|
16
21
|
## MIT
|
|
17
22
|
|
|
@@ -34,6 +39,14 @@ language contributions used to generate the Monaco pane languages.
|
|
|
34
39
|
`editor-ansi.ts` the terminal ANSI palette values, and `seti-icons.ts` /
|
|
35
40
|
`editor-languages.ts` are generated from the shipped extension data.
|
|
36
41
|
|
|
42
|
+
### Visual Studio Code Codicons — Copyright (c) Microsoft Corporation
|
|
43
|
+
|
|
44
|
+
<https://github.com/microsoft/vscode-codicons>
|
|
45
|
+
|
|
46
|
+
The chrome-level UI glyph font used by the desktop and web renderer. The code
|
|
47
|
+
is MIT; the icons themselves are licensed under Creative Commons Attribution
|
|
48
|
+
4.0 International (CC BY 4.0).
|
|
49
|
+
|
|
37
50
|
### GitHub Pull Requests extension — Copyright (c) Microsoft Corporation
|
|
38
51
|
|
|
39
52
|
<https://github.com/microsoft/vscode-pull-request-github>
|
|
@@ -46,39 +59,17 @@ The default pull-request query set and its category labels in
|
|
|
46
59
|
Bundled glyphs and colour tables. Full license text in
|
|
47
60
|
`apps/desktop/THIRD-PARTY-NOTICES.txt`.
|
|
48
61
|
|
|
49
|
-
###
|
|
50
|
-
|
|
51
|
-
<https://github.com/files-community/Files>
|
|
52
|
-
|
|
53
|
-
Folder-pane grouping keys, date-span labels, size buckets and the discrete
|
|
54
|
-
layout size ladder in `apps/desktop/src/renderer/FolderPane.lazy.tsx`.
|
|
55
|
-
|
|
56
|
-
### OpenCode — Copyright (c) Anomaly / SST
|
|
57
|
-
|
|
58
|
-
<https://github.com/anomalyco/opencode>
|
|
62
|
+
### ripgrep — Copyright (c) 2015 Andrew Gallant
|
|
59
63
|
|
|
60
|
-
|
|
61
|
-
streaming-markdown projection model.
|
|
64
|
+
<https://github.com/BurntSushi/ripgrep>
|
|
62
65
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
+
The `grep` and `ignore` library crates are compiled into the native search
|
|
67
|
+
binary, and the packaged `rg` executable ships as the grep tool's fast path.
|
|
68
|
+
ripgrep is offered under the MIT License OR the Unlicense; Mixdog takes the
|
|
69
|
+
MIT terms. The upstream notice is preserved as `LICENSES/ripgrep-NOTICE.txt`.
|
|
66
70
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
<https://github.com/earendil-works/pi>
|
|
70
|
-
|
|
71
|
-
`trimPartialClosingFences()` in `src/tui/markdown/stream-fence.mjs`, ported
|
|
72
|
-
from the TUI markdown component.
|
|
73
|
-
|
|
74
|
-
### Orca — Copyright (c) 2026 Lovecast Inc.
|
|
75
|
-
|
|
76
|
-
Editor-surface and tab-hierarchy structure, the terminal host portal, the
|
|
77
|
-
keep-awake power-save blocker and the hosted-review link derivation.
|
|
78
|
-
|
|
79
|
-
- `apps/desktop/src/renderer/EditorPane.lazy.tsx`, `PaneSurfaceGate.tsx`,
|
|
80
|
-
`PullRequestsPane.tsx`, `SourceControlDock.tsx`
|
|
81
|
-
- `apps/desktop/src/main/agent-awake.ts`
|
|
71
|
+
- `native/mixdog-graph/` (the `grep` and `ignore` crates)
|
|
72
|
+
- `src/runtime/agent/orchestrator/tools/builtin/` (the `rg` fast path)
|
|
82
73
|
|
|
83
74
|
### Ink — Copyright (c) Vadim Demedes
|
|
84
75
|
|
|
@@ -107,3 +98,44 @@ upstream NOTICE file is preserved as `LICENSES/codex-NOTICE.txt`.
|
|
|
107
98
|
The Apache-2.0 terms require this notice to travel with any redistribution of
|
|
108
99
|
the derived files. Full license text: `LICENSES/Apache-2.0.txt`
|
|
109
100
|
(<https://www.apache.org/licenses/LICENSE-2.0>).
|
|
101
|
+
|
|
102
|
+
## Behavioral references
|
|
103
|
+
|
|
104
|
+
The projects below informed Mixdog through publicly observable behavior, a
|
|
105
|
+
published wire contract, or a documented algorithm. No source code from them
|
|
106
|
+
is present in Mixdog, so no license obligation travels with the result; they
|
|
107
|
+
are recorded here because the source files themselves carry no attribution
|
|
108
|
+
comments.
|
|
109
|
+
|
|
110
|
+
- **Chromium** — the workspace tab strip follows Chromium's tab-strip layout
|
|
111
|
+
semantics: two layout domains around the crossover width, the active-tab
|
|
112
|
+
floor, the inactive sliver floor, the left-to-right remainder grant and the
|
|
113
|
+
icon visibility ladder. The implementation is independent TypeScript and CSS
|
|
114
|
+
on Mixdog's own constants (`apps/desktop/src/renderer/WorkspaceTabStrip.tsx`,
|
|
115
|
+
`apps/desktop/src/renderer/desktop/04-workspace-tabs.css`).
|
|
116
|
+
- **GitHub Desktop** — the Source Control dock grammar: commit-form layout,
|
|
117
|
+
changed-file status glyph semantics, single-sentence path colouring, history
|
|
118
|
+
context-menu gating, and detached-checkout / tag rules. Painted entirely on
|
|
119
|
+
Mixdog's own semantic tokens.
|
|
120
|
+
- **OpenCode** — transcript auto-scroll gesture grammar, virtual-timeline
|
|
121
|
+
anchoring and the streaming-markdown projection model.
|
|
122
|
+
- **Orca** — editor-surface and tab-hierarchy structure, the terminal host
|
|
123
|
+
portal, the keep-awake power-save blocker and the hosted-review link
|
|
124
|
+
derivation.
|
|
125
|
+
- **Files** — the folder pane's grouping keys, date-span labels, size buckets
|
|
126
|
+
and discrete layout size ladder
|
|
127
|
+
(`apps/desktop/src/renderer/FolderPane.lazy.tsx`).
|
|
128
|
+
- **Claude Code** (Anthropic) — terminal input tokenizing and keypress
|
|
129
|
+
parsing, the TUI selection word model in `vendor/ink`, and interactive turn
|
|
130
|
+
semantics such as queued-message recall, message-selector rewind and
|
|
131
|
+
background-task lifetime. The Anthropic OAuth route additionally sends the
|
|
132
|
+
client identity that Anthropic's token edge validates; those values are a
|
|
133
|
+
wire requirement, not a derivation.
|
|
134
|
+
- **opencode-antigravity-auth** — MIT
|
|
135
|
+
(<https://github.com/NoeFabris/opencode-antigravity-auth>). The Google Cloud
|
|
136
|
+
Code Assist wire contract used by the Antigravity OAuth provider: OAuth
|
|
137
|
+
client parameters, endpoint fallback order, client impersonation headers,
|
|
138
|
+
request envelope and thinking-signature handling.
|
|
139
|
+
- **assistant-ui, Chatbox, Cherry Studio, Jan, Zed** — the heading-size and
|
|
140
|
+
list-density survey behind the desktop markdown ladder in
|
|
141
|
+
`apps/desktop/src/renderer/desktop/22-markdown.css`.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mixdog",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.140",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "Standalone mixdog coding-agent CLI/TUI workspace.",
|
|
@@ -52,6 +52,7 @@
|
|
|
52
52
|
"smoke:boot": "node scripts/boot-smoke.mjs",
|
|
53
53
|
"smoke:compact": "node scripts/compact-smoke.mjs",
|
|
54
54
|
"test:compact": "node --test scripts/suite-compact-test.mjs",
|
|
55
|
+
"test:markdown": "node --test scripts/markdown-surface-test.mjs",
|
|
55
56
|
"smoke:loop": "node scripts/smoke-loop.mjs",
|
|
56
57
|
"smoke:loop:final": "node scripts/smoke-loop-report.mjs --require-complete --min-elapsed 5h --min-iterations 400 --max-gap 60s --max-smoke-ms 10000 --max-avg-smoke-ms 8500 --max-step-ms smoke.mjs=4000 --max-step-ms boot-smoke.mjs=8000 --max-rss-mb 140 --max-rss-growth-mb 50",
|
|
57
58
|
"smoke:loop:report": "node scripts/smoke-loop-report.mjs",
|
|
@@ -63,11 +64,10 @@
|
|
|
63
64
|
"test:embedding-runtime:warmup": "node scripts/verify-embedding-runtime.mjs --warmup",
|
|
64
65
|
"test:release-assets": "node --check scripts/verify-release-assets.mjs && node --check scripts/release-gate-test.mjs && node --check scripts/prepare-native-assets.mjs && node --test scripts/release-gate-test.mjs scripts/prepare-native-assets-test.mjs",
|
|
65
66
|
"test:native-edit-wire": "node scripts/native-edit-wire-test.mjs",
|
|
66
|
-
"test:release-focused": "npm run test:release-critical && npm run test:compact && npm run test:shellhardening && npm run test:tool-contracts && npm run test:session && npm run test:session-transport",
|
|
67
67
|
"test:release-critical": "npm run test:release-assets && npm run smoke:patch && npm run test:providers",
|
|
68
68
|
"test:spec-advisory": "node scripts/advisory-spec-test.mjs && npm run test:spec-advisory --prefix apps/desktop",
|
|
69
69
|
"test:session-transport": "node --test scripts/session-transport-test.mjs scripts/daemon-bootstrap-test.mjs",
|
|
70
|
-
"test:session": "node --test scripts/runtime-turn-contract-test.mjs scripts/session-save-fault-store-test.mjs src/runtime/shared/tool-surface.test.mjs",
|
|
70
|
+
"test:session": "node --test scripts/runtime-turn-contract-test.mjs scripts/session-save-fault-store-test.mjs scripts/turn-review-revert-test.mjs src/runtime/shared/tool-surface.test.mjs",
|
|
71
71
|
"test:media": "node --test src/runtime/media/store.test.mjs src/runtime/media/renditions.test.mjs src/runtime/media/adapters/codex-image.test.mjs",
|
|
72
72
|
"failures": "node scripts/tool-failures.mjs",
|
|
73
73
|
"trace:llm": "node scripts/llm-trace-summary.mjs",
|
|
@@ -108,7 +108,6 @@
|
|
|
108
108
|
"chalk": "^5.6.2",
|
|
109
109
|
"cli-highlight": "^2.1.11",
|
|
110
110
|
"diff": "^9.0.0",
|
|
111
|
-
"discord.js": "^14.26.4",
|
|
112
111
|
"ink": "^7.1.0",
|
|
113
112
|
"jsdom": "^27.0.0",
|
|
114
113
|
"kiwi-nlp": "^0.21.0",
|
|
@@ -129,12 +128,6 @@
|
|
|
129
128
|
"zod": "^3.25.76"
|
|
130
129
|
},
|
|
131
130
|
"overrides": {
|
|
132
|
-
"discord.js": {
|
|
133
|
-
"undici": "6.28.0"
|
|
134
|
-
},
|
|
135
|
-
"@discordjs/rest": {
|
|
136
|
-
"undici": "6.28.0"
|
|
137
|
-
},
|
|
138
131
|
"onnxruntime-node": {
|
|
139
132
|
"global-agent": "^4.1.3"
|
|
140
133
|
},
|
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
loadModelsDevCatalog,
|
|
6
6
|
warmModelMetadataCatalogs,
|
|
7
7
|
} from '../src/runtime/agent/orchestrator/providers/model-catalog.mjs';
|
|
8
|
-
import {
|
|
8
|
+
import { QUICK_WEB_SEARCH_MODELS } from '../src/session-runtime/quick-web-search-models.mjs';
|
|
9
9
|
|
|
10
10
|
const args = new Set(process.argv.slice(2));
|
|
11
11
|
const json = args.has('--json');
|
|
@@ -155,7 +155,7 @@ for (const [name, provider] of getAllProviders()) {
|
|
|
155
155
|
}
|
|
156
156
|
|
|
157
157
|
const quickRows = [];
|
|
158
|
-
for (const [provider, models] of Object.entries(
|
|
158
|
+
for (const [provider, models] of Object.entries(QUICK_WEB_SEARCH_MODELS)) {
|
|
159
159
|
for (const model of models) {
|
|
160
160
|
if (model?.contextWindow == null) continue;
|
|
161
161
|
const external = externalMeta(modelsDev, litellm, provider, model.id);
|
package/scripts/tool-stress.mjs
CHANGED
|
@@ -87,11 +87,11 @@ try {
|
|
|
87
87
|
timed(metric('find'), /tool-defs|no fuzzy match/, () => executeBuiltinTool('find', {
|
|
88
88
|
query: 'tool-defs', limit: 8,
|
|
89
89
|
}, root, opts)),
|
|
90
|
-
timed(metric('list'), /
|
|
90
|
+
timed(metric('list'), /10-tool-workflow\.md|file/, () => executeBuiltinTool('list', {
|
|
91
91
|
path: 'src/rules/shared',
|
|
92
92
|
}, root, opts)),
|
|
93
|
-
timed(metric('read'), /Tool
|
|
94
|
-
path: [['src/rules/shared/
|
|
93
|
+
timed(metric('read'), /Tool Workflow|read/, () => executeBuiltinTool('read', {
|
|
94
|
+
path: [['src/rules/shared/10-tool-workflow.md', 0, 10], ['package.json', 0, 5]],
|
|
95
95
|
}, root, opts)),
|
|
96
96
|
timed(metric('code_graph'), /symbol|binding|files|edges/i, () => executeCodeGraphTool('code_graph', {
|
|
97
97
|
mode: 'symbols', files: 'scripts/smoke.mjs',
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
|
-
"outputStyle": "
|
|
2
|
+
"outputStyle": "simple",
|
|
3
3
|
"agent": {
|
|
4
4
|
"mcpServers": {},
|
|
5
|
-
"profile": { "title": "", "language": "system" },
|
|
5
|
+
"profile": { "title": "", "language": "system", "experienceLevel": "" },
|
|
6
6
|
"recap": { "enabled": true }
|
|
7
7
|
},
|
|
8
8
|
"channels": {},
|
|
@@ -31,9 +31,9 @@ description: Use this skill only to inspect or modify a Mixdog user's persisted
|
|
|
31
31
|
|---|---|
|
|
32
32
|
| Lead 모델 | `agent.presets[id=workflow-lead]` + `agent.default` |
|
|
33
33
|
| 에이전트 라우트 | `agent.agents.<id>` |
|
|
34
|
-
| Search 모델 | `agent.
|
|
34
|
+
| Web Search 모델 | `agent.webSearchRoute` |
|
|
35
35
|
| Provider·MCP·프로필·스킬·업데이트·셸·autoClear·compaction | `agent.*` |
|
|
36
|
-
| Web search 도구 | `agent.modules.
|
|
36
|
+
| Web search 도구 | `agent.modules.webSearch.enabled` |
|
|
37
37
|
| Recap(배경 사이클) | `agent.recap.enabled` |
|
|
38
38
|
| 출력 스타일 | 루트 `outputStyle` |
|
|
39
39
|
| Webhook server | `channels.webhook.*` |
|
|
@@ -98,11 +98,11 @@ API 키·토큰·OAuth 자격은 config에 쓰지 않는다.
|
|
|
98
98
|
|
|
99
99
|
### 웹 검색 모델
|
|
100
100
|
|
|
101
|
-
1. **확인**: Desktop **Workflows → Default agents → Web Search**, TUI `/
|
|
102
|
-
2. **변경**: Desktop **Web Search → Edit** 또는 TUI `/
|
|
103
|
-
3. **검증**: 저장 route가 native-search 가능 provider/model인지 확인하고 다음 `
|
|
101
|
+
1. **확인**: Desktop **Workflows → Default agents → Web Search**, TUI `/websearch`, `getWebSearchRoute()`, 디스크 `agent.webSearchRoute`.
|
|
102
|
+
2. **변경**: Desktop **Web Search → Edit** 또는 TUI `/websearch` → `setWebSearchRoute()`.
|
|
103
|
+
3. **검증**: 저장 route가 native web-search 가능 provider/model인지 확인하고 다음 `web_search` 도구 호출에서 사용되는지 확인한다.
|
|
104
104
|
|
|
105
|
-
`/
|
|
105
|
+
`/websearch` 인자는 route를 직접 지정하지 않으며 피커를 연다.
|
|
106
106
|
|
|
107
107
|
### Web search 도구 토글
|
|
108
108
|
|
|
@@ -110,7 +110,7 @@ API 키·토큰·OAuth 자격은 config에 쓰지 않는다.
|
|
|
110
110
|
|
|
111
111
|
1. **확인**: Desktop **Settings → General → Web search**, TUI `/setting → Web search`.
|
|
112
112
|
2. **변경**: toggle → `setWebSearchEnabled()`.
|
|
113
|
-
3. **저장**: `agent.modules.
|
|
113
|
+
3. **저장**: `agent.modules.webSearch.enabled`.
|
|
114
114
|
4. **검증**: 다음 세션의 tool surface.
|
|
115
115
|
|
|
116
116
|
### reasoning effort / Fast
|
|
@@ -119,7 +119,7 @@ API 키·토큰·OAuth 자격은 config에 쓰지 않는다.
|
|
|
119
119
|
- Fast: `/fast [on|off]` 또는 model picker의 Tab → 현재 Main route에 저장
|
|
120
120
|
- Desktop 세션 헤더에서도 같은 Main route를 바꾼다.
|
|
121
121
|
- 진행 중 turn은 시작 값을 유지하고 새 값은 다음 turn부터 적용된다.
|
|
122
|
-
- agent/search route의 effort/Fast는 각 route에 격리되며 Main의 `modelSettings`를 덮어쓰지 않는다.
|
|
122
|
+
- agent/web-search route의 effort/Fast는 각 route에 격리되며 Main의 `modelSettings`를 덮어쓰지 않는다.
|
|
123
123
|
|
|
124
124
|
### 워크플로 팩
|
|
125
125
|
|
|
@@ -188,7 +188,9 @@ API 키·토큰·OAuth 자격은 config에 쓰지 않는다.
|
|
|
188
188
|
3. **사용자 정의**: `<mixdogData>/output-styles/<id>.md`.
|
|
189
189
|
4. **검증**: 대화 이력이 있으면 현재 chat에는 적용되지 않으므로 `/clear` 후 확인한다.
|
|
190
190
|
|
|
191
|
-
|
|
191
|
+
루트 `outputStyle`만 읽고 쓴다. `agent.outputStyle`은 더 이상 읽지 않으므로 발견하면 제거한다.
|
|
192
|
+
|
|
193
|
+
사용자 정의 스타일은 기본적으로 빌트인 공통 포맷(`output-styles/common.md`)을 상속한다. 전면 교체는 frontmatter에 `keep-shared-format: false`를 넣고, 공통 포맷 자체를 바꾸려면 `<mixdogData>/output-styles/common.md`를 둔다.
|
|
192
194
|
|
|
193
195
|
### 테마
|
|
194
196
|
|
package/src/help.mjs
CHANGED
|
@@ -33,7 +33,7 @@ export const HELP_LINES = [
|
|
|
33
33
|
' /context show current context surface',
|
|
34
34
|
' /usage [refresh] show total provider quota / balance',
|
|
35
35
|
' /model [name|refresh] switch model for subsequent turns',
|
|
36
|
-
' /
|
|
36
|
+
' /websearch set the web search provider/model',
|
|
37
37
|
' /workflow [name] switch the active workflow',
|
|
38
38
|
' /OutputStyle [name] switch Lead output style (alias: /style)',
|
|
39
39
|
' /theme [id] change the TUI color theme',
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
// Output-style metadata contract: id normalization, frontmatter parsing,
|
|
2
|
+
// catalog ordering, and lookup. Required by the CJS rules builder (prompt
|
|
3
|
+
// injection) and imported by the ESM session runtime (pickers, config), so one
|
|
4
|
+
// schema governs both instead of two parallel copies drifting apart.
|
|
5
|
+
//
|
|
6
|
+
// Frontmatter schema for `output-styles/<id>.md`:
|
|
7
|
+
// name — canonical id (defaults to the file name)
|
|
8
|
+
// title | label — display label (defaults to a title-cased id)
|
|
9
|
+
// description — one-line picker text
|
|
10
|
+
// aliases — comma-separated alternate ids; the only alias source
|
|
11
|
+
// partial — true hides the file from the selectable catalog
|
|
12
|
+
// keep-shared-format — false replaces common.md instead of extending it
|
|
13
|
+
'use strict';
|
|
14
|
+
|
|
15
|
+
const DEFAULT_OUTPUT_STYLE_ID = 'simple';
|
|
16
|
+
// Catalog order: deepest first, then unknown/custom styles by label.
|
|
17
|
+
const OUTPUT_STYLE_ORDER = ['detailed', 'simple', 'minimal', 'extreme-minimal'];
|
|
18
|
+
|
|
19
|
+
/** Slug form of a style id. Aliases live in frontmatter, never in code. */
|
|
20
|
+
function normalizeOutputStyleId(value) {
|
|
21
|
+
const slug = String(value ?? '').trim().toLowerCase()
|
|
22
|
+
.replace(/[_\s]+/g, '-')
|
|
23
|
+
.replace(/^-+|-+$/g, '');
|
|
24
|
+
return /^[a-z0-9.-]+$/.test(slug) ? slug : '';
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** Separator-insensitive key so `one-line`, `one_line`, and `oneline` match. */
|
|
28
|
+
function outputStyleCompactKey(value) {
|
|
29
|
+
return normalizeOutputStyleId(value).replace(/[_.-]+/g, '');
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function titleCaseOutputStyle(id) {
|
|
33
|
+
return String(id || '')
|
|
34
|
+
.split(/[_.-]+/)
|
|
35
|
+
.filter(Boolean)
|
|
36
|
+
.map((part) => `${part.charAt(0).toUpperCase()}${part.slice(1)}`)
|
|
37
|
+
.join(' ') || 'Default';
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function parseOutputStyleFrontmatter(markdown) {
|
|
41
|
+
const match = String(markdown || '').match(/^---\r?\n([\s\S]*?)\r?\n---/);
|
|
42
|
+
const meta = {};
|
|
43
|
+
if (!match) return meta;
|
|
44
|
+
for (const line of match[1].split(/\r?\n/)) {
|
|
45
|
+
const kv = line.match(/^([A-Za-z0-9_-]+):\s*(.*?)\s*$/);
|
|
46
|
+
if (!kv) continue;
|
|
47
|
+
meta[kv[1]] = kv[2].replace(/^['"]|['"]$/g, '').trim();
|
|
48
|
+
}
|
|
49
|
+
return meta;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function outputStyleFlag(value, fallback) {
|
|
53
|
+
const raw = String(value ?? '').trim().toLowerCase();
|
|
54
|
+
if (!raw) return fallback;
|
|
55
|
+
if (/^(?:true|1|yes|on)$/.test(raw)) return true;
|
|
56
|
+
if (/^(?:false|0|no|off)$/.test(raw)) return false;
|
|
57
|
+
return fallback;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Frontmatter → catalog entry. Returns null for `partial: true` files (the
|
|
62
|
+
* shared format partial) and for files with no usable id.
|
|
63
|
+
*/
|
|
64
|
+
function outputStyleMetaFromMarkdown(markdown, fileName) {
|
|
65
|
+
const meta = parseOutputStyleFrontmatter(markdown);
|
|
66
|
+
if (outputStyleFlag(meta.partial, false)) return null;
|
|
67
|
+
const fileId = normalizeOutputStyleId(String(fileName || '').replace(/\.md$/i, ''));
|
|
68
|
+
const id = normalizeOutputStyleId(meta.name) || fileId;
|
|
69
|
+
if (!id) return null;
|
|
70
|
+
return {
|
|
71
|
+
id,
|
|
72
|
+
label: String(meta.title || meta.label || '').trim() || titleCaseOutputStyle(id),
|
|
73
|
+
description: String(meta.description || '').trim(),
|
|
74
|
+
aliases: String(meta.aliases || '').split(',')
|
|
75
|
+
.map((alias) => normalizeOutputStyleId(alias))
|
|
76
|
+
.filter(Boolean),
|
|
77
|
+
// Built-in and custom styles both inherit the shared format partial; a
|
|
78
|
+
// style opts out only by declaring `keep-shared-format: false`.
|
|
79
|
+
keepSharedFormat: outputStyleFlag(meta['keep-shared-format'], true),
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function sortOutputStyles(styles) {
|
|
84
|
+
return [...(styles || [])].sort((a, b) => {
|
|
85
|
+
const ai = OUTPUT_STYLE_ORDER.indexOf(a.id);
|
|
86
|
+
const bi = OUTPUT_STYLE_ORDER.indexOf(b.id);
|
|
87
|
+
if (ai !== bi) return (ai < 0 ? 999 : ai) - (bi < 0 ? 999 : bi);
|
|
88
|
+
return a.label.localeCompare(b.label, 'en', { sensitivity: 'base' });
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/** Resolve an id, label, or frontmatter alias, ignoring separators and case. */
|
|
93
|
+
function matchOutputStyle(value, styles) {
|
|
94
|
+
const id = normalizeOutputStyleId(value);
|
|
95
|
+
const compact = outputStyleCompactKey(value);
|
|
96
|
+
if (!id && !compact) return null;
|
|
97
|
+
return (styles || []).find((style) => {
|
|
98
|
+
if (style.id === id || outputStyleCompactKey(style.id) === compact) return true;
|
|
99
|
+
if (outputStyleCompactKey(style.label) === compact) return true;
|
|
100
|
+
return (style.aliases || []).some((alias) => alias === id || outputStyleCompactKey(alias) === compact);
|
|
101
|
+
}) || null;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
module.exports = {
|
|
105
|
+
DEFAULT_OUTPUT_STYLE_ID,
|
|
106
|
+
OUTPUT_STYLE_ORDER,
|
|
107
|
+
normalizeOutputStyleId,
|
|
108
|
+
outputStyleCompactKey,
|
|
109
|
+
titleCaseOutputStyle,
|
|
110
|
+
parseOutputStyleFrontmatter,
|
|
111
|
+
outputStyleFlag,
|
|
112
|
+
outputStyleMetaFromMarkdown,
|
|
113
|
+
sortOutputStyles,
|
|
114
|
+
matchOutputStyle,
|
|
115
|
+
};
|