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.
Files changed (205) hide show
  1. package/LICENSES/MIT.txt +8 -14
  2. package/NOTICE.md +66 -34
  3. package/package.json +3 -10
  4. package/scripts/model-catalog-audit.mjs +2 -2
  5. package/scripts/tool-stress.mjs +3 -3
  6. package/src/defaults/mixdog-config.template.json +2 -2
  7. package/src/defaults/skills/setup/SKILL.md +11 -9
  8. package/src/help.mjs +1 -1
  9. package/src/lib/output-style-meta.cjs +115 -0
  10. package/src/lib/rules-builder.cjs +107 -34
  11. package/src/output-styles/common.md +38 -0
  12. package/src/output-styles/detailed.md +8 -17
  13. package/src/output-styles/extreme-minimal.md +10 -7
  14. package/src/output-styles/minimal.md +10 -8
  15. package/src/output-styles/simple.md +11 -14
  16. package/src/rules/lead/01-general.md +7 -2
  17. package/src/rules/lead/02-persona.md +7 -0
  18. package/src/rules/shared/00-general.md +4 -0
  19. package/src/rules/shared/10-tool-workflow.md +22 -0
  20. package/src/rules/shared/20-research.md +6 -0
  21. package/src/rules/shared/30-exploration.md +44 -0
  22. package/src/rules/shared/40-editing.md +12 -0
  23. package/src/rules/shared/50-execution.md +5 -0
  24. package/src/rules/shared/60-verification.md +10 -0
  25. package/src/rules/shared/70-delivery.md +6 -0
  26. package/src/rules/shared/80-memory.md +11 -0
  27. package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +8 -4
  28. package/src/runtime/agent/orchestrator/agent-runtime/maintenance-route.mjs +4 -1
  29. package/src/runtime/agent/orchestrator/config.mjs +37 -9
  30. package/src/runtime/agent/orchestrator/context/collect.mjs +20 -10
  31. package/src/runtime/agent/orchestrator/providers/admission-scheduler.mjs +12 -26
  32. package/src/runtime/agent/orchestrator/providers/anthropic-effort.mjs +1 -1
  33. package/src/runtime/agent/orchestrator/providers/anthropic-messages.mjs +9 -5
  34. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +6 -2
  35. package/src/runtime/agent/orchestrator/providers/antigravity-oauth-login.mjs +297 -0
  36. package/src/runtime/agent/orchestrator/providers/antigravity-oauth-tokens.mjs +311 -0
  37. package/src/runtime/agent/orchestrator/providers/antigravity-oauth.mjs +383 -0
  38. package/src/runtime/agent/orchestrator/providers/antigravity-oauth.test.mjs +165 -0
  39. package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +12 -3
  40. package/src/runtime/agent/orchestrator/providers/gemini.mjs +1 -1
  41. package/src/runtime/agent/orchestrator/providers/oauth-credential-probes.mjs +15 -0
  42. package/src/runtime/agent/orchestrator/providers/oauth-usage.mjs +3 -3
  43. package/src/runtime/agent/orchestrator/providers/openai-compat-xai.mjs +21 -8
  44. package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +31 -4
  45. package/src/runtime/agent/orchestrator/providers/openai-ws-stream.mjs +1 -1
  46. package/src/runtime/agent/orchestrator/providers/registry.mjs +11 -1
  47. package/src/runtime/agent/orchestrator/providers/retry-classifier.mjs +1 -1
  48. package/src/runtime/agent/orchestrator/session/agent-loop.mjs +4 -4
  49. package/src/runtime/agent/orchestrator/session/context-utils.mjs +24 -10
  50. package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +16 -0
  51. package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +8 -0
  52. package/src/runtime/agent/orchestrator/session/loop/tool-helpers.mjs +6 -5
  53. package/src/runtime/agent/orchestrator/session/lossless-tool-output.test.mjs +6 -5
  54. package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +5 -0
  55. package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +63 -8
  56. package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +1 -1
  57. package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +23 -10
  58. package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +9 -7
  59. package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +21 -0
  60. package/src/runtime/agent/orchestrator/session/send-with-recovery.mjs +16 -9
  61. package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +107 -6
  62. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +22 -4
  63. package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +49 -34
  64. package/src/runtime/agent/orchestrator/tools/builtin/edit-sequential-occupation.test.mjs +55 -0
  65. package/src/runtime/agent/orchestrator/tools/builtin/external-tool-adapters.mjs +27 -7
  66. package/src/runtime/agent/orchestrator/tools/builtin/git-command-policy.mjs +21 -2
  67. package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +66 -35
  68. package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.test.mjs +50 -1
  69. package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +32 -4
  70. package/src/runtime/agent/orchestrator/tools/builtin/native-search-client.mjs +5 -1
  71. package/src/runtime/agent/orchestrator/tools/builtin/shell-analysis.mjs +9 -4
  72. package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +125 -3
  73. package/src/runtime/agent/orchestrator/tools/builtin/shell-monitor.mjs +57 -0
  74. package/src/runtime/agent/orchestrator/tools/builtin/shell-monitor.test.mjs +57 -0
  75. package/src/runtime/agent/orchestrator/tools/builtin/task-tool.mjs +28 -3
  76. package/src/runtime/agent/orchestrator/tools/code-graph-tool-defs.mjs +6 -6
  77. package/src/runtime/agent/orchestrator/tools/graph-manifest.json +11 -11
  78. package/src/runtime/agent/orchestrator/tools/lib/native-spawn-client.mjs +29 -2
  79. package/src/runtime/agent/orchestrator/tools/patch/native-server.mjs +7 -2
  80. package/src/runtime/agent/orchestrator/tools/patch/v4a-anchors.mjs +27 -0
  81. package/src/runtime/agent/orchestrator/tools/patch/v4a-convert.mjs +6 -0
  82. package/src/runtime/agent/orchestrator/tools/patch-manifest.json +10 -10
  83. package/src/runtime/agent/orchestrator/tools/patch-tool-defs.mjs +8 -32
  84. package/src/runtime/agent/orchestrator/tools/progress-message.mjs +2 -2
  85. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +72 -4
  86. package/src/runtime/agent/orchestrator/tools/shell-snapshot.mjs +2 -2
  87. package/src/runtime/agent/orchestrator/tools/spawn-manifest.json +11 -11
  88. package/src/runtime/channels/lib/scheduler.mjs +1 -1
  89. package/src/runtime/media/download.mjs +1 -1
  90. package/src/runtime/media/jobs.mjs +9 -0
  91. package/src/runtime/media/store.mjs +4 -9
  92. package/src/runtime/memory/lib/core-memory-file.mjs +8 -1
  93. package/src/runtime/memory/lib/embedding-worker.mjs +9 -4
  94. package/src/runtime/memory/lib/http-router.mjs +36 -4
  95. package/src/runtime/memory/lib/ko-morph.mjs +8 -1
  96. package/src/runtime/memory/lib/memory-cycle1.mjs +28 -2
  97. package/src/runtime/memory/lib/tool-call-handler.mjs +1 -1
  98. package/src/runtime/memory/tool-defs.mjs +17 -29
  99. package/src/runtime/shared/agent-route-config.mjs +46 -1
  100. package/src/runtime/shared/background-tasks.mjs +1 -1
  101. package/src/runtime/shared/err-text.mjs +42 -1
  102. package/src/runtime/shared/llm/http-agent.mjs +1 -1
  103. package/src/runtime/shared/pristine-execution-contract.json +6 -0
  104. package/src/runtime/shared/shell-display.mjs +17 -0
  105. package/src/runtime/shared/task-notification-envelope.mjs +2 -1
  106. package/src/runtime/shared/tool-card-model.mjs +5 -5
  107. package/src/runtime/shared/tool-result-summary.mjs +0 -8
  108. package/src/runtime/shared/tool-surface.mjs +0 -4
  109. package/src/runtime/shared/turn-snapshot.mjs +41 -18
  110. package/src/runtime/shared/webhook-session-run.mjs +6 -0
  111. package/src/runtime/shared/webhook-session-run.test.mjs +14 -0
  112. package/src/runtime/{search → web-search}/index.mjs +52 -52
  113. package/src/runtime/{search → web-search}/lib/cache.mjs +2 -2
  114. package/src/runtime/{search → web-search}/lib/config.mjs +3 -7
  115. package/src/runtime/{search → web-search}/lib/formatter.mjs +4 -4
  116. package/src/runtime/{search → web-search}/lib/http-fetch.mjs +1 -1
  117. package/src/runtime/{search → web-search}/lib/ssrf-guard.mjs +1 -0
  118. package/src/runtime/{search → web-search}/lib/state.mjs +2 -2
  119. package/src/runtime/{search → web-search}/lib/web-tools.mjs +1 -1
  120. package/src/runtime/{search → web-search}/tool-defs.mjs +6 -6
  121. package/src/session-runtime/agent-disable.test.mjs +121 -0
  122. package/src/session-runtime/config-lifecycle.mjs +8 -8
  123. package/src/session-runtime/context-status.mjs +4 -2
  124. package/src/session-runtime/cwd-tool-routing.test.mjs +56 -0
  125. package/src/session-runtime/effort.mjs +3 -0
  126. package/src/session-runtime/lifecycle-api.mjs +47 -0
  127. package/src/session-runtime/model-capabilities.mjs +6 -6
  128. package/src/session-runtime/model-recency.mjs +3 -3
  129. package/src/session-runtime/model-route-api.mjs +47 -41
  130. package/src/session-runtime/model-settings-persist.test.mjs +4 -4
  131. package/src/session-runtime/{native-search.mjs → native-web-search.mjs} +72 -61
  132. package/src/session-runtime/output-styles.mjs +39 -84
  133. package/src/session-runtime/provider-models.mjs +31 -31
  134. package/src/session-runtime/quick-model-rows.mjs +50 -50
  135. package/src/session-runtime/{quick-search-models.mjs → quick-web-search-models.mjs} +2 -2
  136. package/src/session-runtime/runtime-core.mjs +96 -75
  137. package/src/session-runtime/runtime-paths.mjs +2 -2
  138. package/src/session-runtime/runtime-tool-routing.mjs +7 -7
  139. package/src/session-runtime/session-turn-api.mjs +26 -0
  140. package/src/session-runtime/settings-api.mjs +12 -8
  141. package/src/session-runtime/skills-api.mjs +10 -7
  142. package/src/session-runtime/tool-catalog-data.mjs +5 -5
  143. package/src/session-runtime/tool-catalog-schema.mjs +1 -1
  144. package/src/session-runtime/tool-catalog.mjs +2 -2
  145. package/src/session-runtime/tool-defs.mjs +8 -8
  146. package/src/session-runtime/tool-policy-refresh.mjs +22 -3
  147. package/src/session-runtime/tool-policy-surface.test.mjs +78 -45
  148. package/src/session-runtime/workflow-agents-api.mjs +33 -13
  149. package/src/session-runtime/workflow.mjs +36 -23
  150. package/src/standalone/agent-tool/spawn-flow.mjs +6 -0
  151. package/src/standalone/agent-tool/tool-def.mjs +11 -11
  152. package/src/standalone/hook-bus/handlers.mjs +1 -1
  153. package/src/standalone/memory-runtime-proxy.mjs +1 -1
  154. package/src/standalone/provider-admin.mjs +8 -0
  155. package/src/standalone/session-client.mjs +1 -1
  156. package/src/standalone/session-protocol.mjs +5 -3
  157. package/src/standalone/session-service.mjs +2 -2
  158. package/src/standalone/session-wire.mjs +1 -1
  159. package/src/tui/App.jsx +15 -15
  160. package/src/tui/app/app-format.mjs +8 -7
  161. package/src/tui/app/app-view.jsx +1 -1
  162. package/src/tui/app/create-app-pickers.mjs +6 -6
  163. package/src/tui/app/maintenance-pickers.mjs +36 -1
  164. package/src/tui/app/model-options.mjs +2 -0
  165. package/src/tui/app/model-picker.mjs +5 -5
  166. package/src/tui/app/onboarding-steps.mjs +37 -37
  167. package/src/tui/app/route-pickers.mjs +62 -18
  168. package/src/tui/app/settings-picker.mjs +11 -10
  169. package/src/tui/app/slash-commands.mjs +3 -2
  170. package/src/tui/app/slash-dispatch.mjs +24 -6
  171. package/src/tui/app/transcript-row-estimate.mjs +1 -1
  172. package/src/tui/app/use-prompt-handlers.mjs +1 -1
  173. package/src/tui/app/use-transcript-activity.mjs +10 -10
  174. package/src/tui/app/use-transcript-window.mjs +1 -1
  175. package/src/tui/app/use-welcome-prompt-hint.mjs +8 -8
  176. package/src/tui/components/StatusLine.jsx +31 -82
  177. package/src/tui/dist/index.mjs +1664 -1151
  178. package/src/tui/keyboard-protocol.mjs +1 -1
  179. package/src/tui/markdown/format-token.mjs +80 -13
  180. package/src/tui/markdown/render-ansi.mjs +27 -3
  181. package/src/tui/markdown/stream-fence.mjs +40 -17
  182. package/src/tui/markdown/streaming-markdown.mjs +133 -29
  183. package/src/tui/session/agent-envelope.mjs +2 -2
  184. package/src/tui/session/context-state.mjs +1 -1
  185. package/src/tui/session/labels.mjs +6 -1
  186. package/src/tui/session/session-api-ext.mjs +29 -10
  187. package/src/tui/session/session-api.mjs +5 -3
  188. package/src/tui/session/turn.mjs +35 -2
  189. package/src/tui/session-local.mjs +6 -6
  190. package/src/tui/themes/light.mjs +4 -4
  191. package/src/tui/themes/teal.mjs +1 -1
  192. package/src/ui/markdown.mjs +200 -11
  193. package/src/ui/statusline-agents.mjs +1 -1
  194. package/src/ui/statusline-segments.mjs +25 -6
  195. package/src/ui/statusline.mjs +13 -13
  196. package/src/workflows/default/WORKFLOW.md +2 -2
  197. package/src/workflows/solo/WORKFLOW.md +2 -2
  198. package/vendor/ink/build/_baseline-termio-keypress.js +240 -0
  199. package/vendor/ink/build/_baseline-termio-tokenize.js +253 -0
  200. package/vendor/ink/build/ink.js +3 -3
  201. package/vendor/ink/build/input-parser.js +1 -1
  202. package/vendor/ink/build/output.js +5 -5
  203. package/vendor/ink/build/termio-keypress.js +1 -1
  204. package/vendor/ink/build/termio-tokenize.js +160 -225
  205. 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
- Files
16
- https://github.com/files-community/Files
17
- Copyright (c) 2018 - present Files Community
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`). Parts of it were written
4
- against the public source of the projects listed below. Their terms are
5
- preserved here in one place so the individual source files can stay free of
6
- scattered attribution comments.
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
- ### Files — Copyright (c) Files Community
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
- Transcript auto-scroll gesture grammar, virtual-timeline anchoring and the
61
- streaming-markdown projection model.
64
+ <https://github.com/BurntSushi/ripgrep>
62
65
 
63
- - `apps/desktop/src/renderer/use-transcript-follow.ts`, `TranscriptList.tsx`,
64
- `transcript-measure.ts`, `transcript-rows.ts`, `transcript-virtual-cache.ts`,
65
- `StreamingMarkdownBody.tsx`, `streaming-markdown.ts`, `Conversation.tsx`
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
- ### pi Copyright (c) 2025 Mario Zechner
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.138",
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 { QUICK_SEARCH_MODELS } from '../src/session-runtime/quick-search-models.mjs';
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(QUICK_SEARCH_MODELS)) {
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);
@@ -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'), /01-tool\.md|file/, () => executeBuiltinTool('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 Use|read/, () => executeBuiltinTool('read', {
94
- path: [['src/rules/shared/01-tool.md', 0, 10], ['package.json', 0, 5]],
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": "default",
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.searchRoute` |
34
+ | Web Search 모델 | `agent.webSearchRoute` |
35
35
  | Provider·MCP·프로필·스킬·업데이트·셸·autoClear·compaction | `agent.*` |
36
- | Web search 도구 | `agent.modules.search.enabled` |
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 `/search`, `getSearchRoute()`, 디스크 `agent.searchRoute`.
102
- 2. **변경**: Desktop **Web Search → Edit** 또는 TUI `/search` → `setSearchRoute()`.
103
- 3. **검증**: 저장 route가 native-search 가능 provider/model인지 확인하고 다음 `search` 도구 호출에서 사용되는지 확인한다.
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
- `/search` 인자는 route를 직접 지정하지 않으며 피커를 연다.
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.search.enabled`.
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
- `agent.outputStyle`은 읽기 호환용 레거시 경로다. 변경 시 루트 `outputStyle`에 저장하고 `agent.outputStyle`은 제거한다.
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
- ' /search set the web search provider/model',
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
+ };