mixdog 1.1.0 → 1.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (174) hide show
  1. package/README.md +13 -6
  2. package/package.json +1 -2
  3. package/scripts/latest-guard.mjs +63 -0
  4. package/scripts/lib/run-node-tests.mjs +103 -27
  5. package/scripts/lib/test-failure-summary.mjs +7 -2
  6. package/scripts/merge-mac-update-feed.mjs +107 -0
  7. package/scripts/mobile-release.mjs +210 -0
  8. package/scripts/post-release-check.mjs +353 -0
  9. package/scripts/publish-asset-release.mjs +43 -0
  10. package/scripts/release-guard.mjs +63 -0
  11. package/scripts/release-paths.mjs +39 -2
  12. package/scripts/test.mjs +29 -7
  13. package/src/defaults/shipped-history.json +2 -0
  14. package/src/defaults/skills/computer-use/SKILL.md +1 -1
  15. package/src/defaults/skills/setup/references/actions.md +1 -0
  16. package/src/headless-role.mjs +2 -2
  17. package/src/lib/keychain-cjs.cjs +582 -17
  18. package/src/lib/rules-builder.cjs +0 -23
  19. package/src/rules/lead/LEAD.md +2 -2
  20. package/src/runtime/agent/orchestrator/config-storage.mjs +32 -4
  21. package/src/runtime/agent/orchestrator/config.mjs +18 -0
  22. package/src/runtime/agent/orchestrator/context/instruction-files.mjs +130 -0
  23. package/src/runtime/agent/orchestrator/context/role-instructions.mjs +4 -0
  24. package/src/runtime/agent/orchestrator/providers/lib/oauth-token-utils.mjs +11 -0
  25. package/src/runtime/agent/orchestrator/providers/lib/open-login-url.mjs +9 -0
  26. package/src/runtime/agent/orchestrator/providers/mimo-oauth-login.mjs +254 -0
  27. package/src/runtime/agent/orchestrator/providers/mimo-oauth-profile.mjs +218 -0
  28. package/src/runtime/agent/orchestrator/providers/mimo-oauth-tokens.mjs +239 -0
  29. package/src/runtime/agent/orchestrator/providers/mimo-oauth.mjs +233 -0
  30. package/src/runtime/agent/orchestrator/providers/muse-code-oauth-login.mjs +247 -0
  31. package/src/runtime/agent/orchestrator/providers/muse-code-oauth-tokens.mjs +225 -0
  32. package/src/runtime/agent/orchestrator/providers/muse-code-oauth.mjs +542 -0
  33. package/src/runtime/agent/orchestrator/providers/oauth-credential-probes.mjs +25 -0
  34. package/src/runtime/agent/orchestrator/providers/oauth-usage.mjs +4 -1
  35. package/src/runtime/agent/orchestrator/providers/openai-codex-model.mjs +13 -0
  36. package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +14 -6
  37. package/src/runtime/agent/orchestrator/providers/openai-oauth-catalog-store.mjs +99 -0
  38. package/src/runtime/agent/orchestrator/providers/openai-oauth-catalog.mjs +4 -8
  39. package/src/runtime/agent/orchestrator/providers/openai-oauth-login.mjs +2 -7
  40. package/src/runtime/agent/orchestrator/providers/openai-responses-payload.mjs +8 -0
  41. package/src/runtime/agent/orchestrator/providers/registry.mjs +4 -0
  42. package/src/runtime/agent/orchestrator/runtime-core/effort.mjs +2 -0
  43. package/src/runtime/agent/orchestrator/runtime-core/goal-tool-defs.mjs +15 -1
  44. package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +1 -5
  45. package/src/runtime/agent/orchestrator/session/context-utils.mjs +12 -14
  46. package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +11 -1
  47. package/src/runtime/agent/orchestrator/session/loop/tool-call-ids.mjs +90 -0
  48. package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +19 -11
  49. package/src/runtime/agent/orchestrator/session/loop/tool-phase.mjs +1 -0
  50. package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +28 -0
  51. package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +8 -0
  52. package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +3 -0
  53. package/src/runtime/agent/orchestrator/session/manager.mjs +1 -5
  54. package/src/runtime/agent/orchestrator/session/read-dedup.mjs +0 -1
  55. package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +3 -0
  56. package/src/runtime/agent/orchestrator/session/tool-batch/finalize.mjs +2 -0
  57. package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +2 -0
  58. package/src/runtime/agent/orchestrator/session/transcript-restore/tool-result-status.mjs +23 -0
  59. package/src/runtime/agent/orchestrator/session/turn-effort.mjs +18 -0
  60. package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +11 -8
  61. package/src/runtime/agent/orchestrator/tools/builtin/atomic-write.mjs +9 -4
  62. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/bashism-rewrite.mjs +245 -0
  63. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/command-preflight.mjs +13 -1
  64. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/completed-result.mjs +3 -1
  65. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/invocation-plan.mjs +2 -2
  66. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/result-format.mjs +49 -0
  67. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +3 -3
  68. package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +9 -7
  69. package/src/runtime/agent/orchestrator/tools/builtin/external-tool-adapters.mjs +61 -8
  70. package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +28 -3
  71. package/src/runtime/agent/orchestrator/tools/builtin/path-utils.mjs +73 -1
  72. package/src/runtime/agent/orchestrator/tools/builtin/read-single-guards.mjs +2 -2
  73. package/src/runtime/agent/orchestrator/tools/builtin/read-tool.mjs +3 -1
  74. package/src/runtime/agent/orchestrator/tools/builtin/search-grep-tool.mjs +17 -6
  75. package/src/runtime/agent/orchestrator/tools/builtin/search-path-diagnostics.mjs +23 -5
  76. package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +93 -43
  77. package/src/runtime/agent/orchestrator/tools/builtin/task-tool.mjs +32 -6
  78. package/src/runtime/agent/orchestrator/tools/builtin.mjs +9 -2
  79. package/src/runtime/agent/orchestrator/tools/code-graph/dispatch.mjs +3 -1
  80. package/src/runtime/agent/orchestrator/tools/lib/shell-run-background/promote-job.mjs +12 -15
  81. package/src/runtime/agent/orchestrator/tools/lib/shell-run-background.mjs +2 -2
  82. package/src/runtime/agent/orchestrator/tools/lib/shell-run-state.mjs +4 -2
  83. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +124 -91
  84. package/src/runtime/agent/orchestrator/tools/shell-exec-policy.mjs +19 -4
  85. package/src/runtime/channels/index.mjs +1 -5
  86. package/src/runtime/channels/lib/runtime-paths.mjs +8 -23
  87. package/src/runtime/channels/lib/tool-dispatch.mjs +1 -13
  88. package/src/runtime/channels/lib/worker-ipc.mjs +2 -2
  89. package/src/runtime/channels/lib/worker-main.mjs +4 -34
  90. package/src/runtime/computer-bridge/client.mjs +25 -1
  91. package/src/runtime/computer-bridge/linux-action-capabilities.mjs +84 -0
  92. package/src/runtime/computer-bridge/linux-readiness.d.mts +52 -0
  93. package/src/runtime/computer-bridge/linux-readiness.mjs +411 -0
  94. package/src/runtime/computer-bridge/test-linux-display.mjs +5 -0
  95. package/src/runtime/effort-judge/compact-tokenizer.mjs +13 -8
  96. package/src/runtime/effort-judge/judge-input.mjs +5 -2
  97. package/src/runtime/effort-judge/model-install.mjs +9 -3
  98. package/src/runtime/effort-judge/model-manifest.json +7 -7
  99. package/src/runtime/memory/lib/embedding-worker.mjs +9 -3
  100. package/src/runtime/memory/lib/pg/supervisor.mjs +3 -0
  101. package/src/runtime/shared/config.mjs +50 -2
  102. package/src/runtime/shared/developer-options.mjs +7 -0
  103. package/src/runtime/shared/instruction-files-mode.mjs +9 -0
  104. package/src/runtime/shared/llm/model-catalog.mjs +2 -1
  105. package/src/runtime/shared/llm/openai-daybreak.mjs +79 -0
  106. package/src/runtime/shared/pristine-execution-contract.json +9 -0
  107. package/src/runtime/shared/pristine-execution.mjs +1 -1
  108. package/src/runtime/shared/provider-accounts.mjs +2 -0
  109. package/src/runtime/shared/resource-admission.mjs +10 -3
  110. package/src/runtime/shared/schedule-model-ref.mjs +11 -0
  111. package/src/runtime/shared/semver.d.mts +1 -0
  112. package/src/runtime/shared/semver.mjs +57 -0
  113. package/src/runtime/shared/session-approval-wait.mjs +35 -0
  114. package/src/runtime/shared/shell-display.mjs +4 -2
  115. package/src/runtime/shared/tool-surface.mjs +2 -2
  116. package/src/runtime/shared/turn-worktree-snapshot.mjs +11 -10
  117. package/src/runtime/shared/update-checker.mjs +2 -31
  118. package/src/session-runtime/boot/apis.mjs +5 -0
  119. package/src/session-runtime/boot/begin.mjs +0 -2
  120. package/src/session-runtime/boot/tools.mjs +5 -4
  121. package/src/session-runtime/model-recency.mjs +3 -0
  122. package/src/session-runtime/provider-auth/login.mjs +10 -10
  123. package/src/session-runtime/provider-auth/setup.mjs +22 -2
  124. package/src/session-runtime/provider-models/row-hydration.mjs +12 -4
  125. package/src/session-runtime/provider-readiness.mjs +4 -0
  126. package/src/session-runtime/resource-mcp-api.mjs +7 -3
  127. package/src/session-runtime/runtime-bootstrap.mjs +0 -4
  128. package/src/session-runtime/runtime-facade.mjs +5 -0
  129. package/src/session-runtime/runtime-paths.mjs +0 -1
  130. package/src/session-runtime/schedule-session-run.mjs +3 -1
  131. package/src/session-runtime/services/agent-tool/index-write-queue.mjs +55 -14
  132. package/src/session-runtime/services/agent-tool/job-views/agent-list.mjs +15 -3
  133. package/src/session-runtime/services/agent-tool/job-views/session-progress.mjs +2 -0
  134. package/src/session-runtime/services/agent-tool/worker-index/approval-wait.mjs +97 -0
  135. package/src/session-runtime/services/agent-tool/worker-index/mutation-batch.mjs +4 -2
  136. package/src/session-runtime/services/agent-tool/worker-index/row-liveness.mjs +8 -2
  137. package/src/session-runtime/services/agent-tool/worker-index/row-shape.mjs +3 -0
  138. package/src/session-runtime/services/agent-tool/worker-index/row-store.mjs +58 -2
  139. package/src/session-runtime/services/agent-tool/worker-index.mjs +69 -15
  140. package/src/session-runtime/services/agent-tool/worker-rows.mjs +2 -0
  141. package/src/session-runtime/services/channel-admin.mjs +4 -2
  142. package/src/session-runtime/services/channel-worker.mjs +1 -1
  143. package/src/session-runtime/services/provider-admin.mjs +80 -17
  144. package/src/session-runtime/services/seeds.mjs +7 -10
  145. package/src/session-runtime/services/usage-dashboard-model.mjs +6 -0
  146. package/src/session-runtime/settings-builtin-tools-api.mjs +15 -0
  147. package/src/session-runtime/settings-profile-api.mjs +27 -2
  148. package/src/session-runtime/setup-tool/executor.mjs +5 -0
  149. package/src/session-runtime/setup-tool/tool-defs.mjs +8 -0
  150. package/src/session-runtime/starter-guide-state.mjs +62 -0
  151. package/src/session-runtime/tool-policy-refresh.mjs +3 -0
  152. package/src/session-runtime/webhook-session-run.mjs +3 -1
  153. package/src/session-runtime/workflow-agents-api/onboarding.mjs +3 -2
  154. package/src/standalone/channel-binding.mjs +1 -2
  155. package/src/standalone/channel-transport/call-dispatch.mjs +4 -10
  156. package/src/standalone/daemon-channels-loader.mjs +2 -3
  157. package/src/standalone/local-session-runtime.mjs +2 -78
  158. package/src/standalone/session-protocol.mjs +2 -0
  159. package/src/tui/app/model-options.mjs +13 -1
  160. package/src/tui/app/model-picker/route-selection/fast-parameters.mjs +10 -4
  161. package/src/tui/app/provider-setup/oauth-actions.mjs +5 -0
  162. package/src/tui/dist/index.mjs +84 -34
  163. package/src/tui/session/context-state.mjs +2 -0
  164. package/src/tui/session/live-share/owner.mjs +17 -0
  165. package/src/tui/session/oauth-flows.mjs +2 -0
  166. package/src/tui/session/session-api/extensions.mjs +12 -8
  167. package/src/tui/session/session-api/integrations.mjs +9 -8
  168. package/src/tui/session/session-api/routes.mjs +2 -2
  169. package/src/tui/session/session-api/settings.mjs +1 -0
  170. package/src/tui/session/session-api/shared.mjs +10 -6
  171. package/src/tui/session/tool-card-results/grouped-result.mjs +11 -2
  172. package/src/tui/session/transcript-spill/spill-dir.mjs +22 -6
  173. package/src/tui/spinner-meta.mjs +26 -10
  174. package/src/runtime/channels/tool-defs.mjs +0 -17
@@ -2,7 +2,7 @@
2
2
  // Single source of truth for CI/CD path selection.
3
3
  //
4
4
  // Consumers:
5
- // - .github/workflows/release-gate.yml → `node scripts/release-paths.mjs desktop-regex|runtime-regex`
5
+ // - .github/workflows/release-gate.yml → `node scripts/release-paths.mjs desktop-regex|runtime-regex|patch-regex|history-regex|mobile-regex`
6
6
  // (grep -E patterns selecting which incremental gates a change requires)
7
7
  // - .github/workflows/deploy.yml → `import { RELEASE_CRITICAL_PATHS }`
8
8
  // (git diff paths whose change invalidates the previous release's
@@ -47,6 +47,24 @@ const PATCH_GATE_FILES = [
47
47
  ...GATE_SELECTION_SOURCES,
48
48
  ];
49
49
 
50
+ // The shipped-definition history is generated from git history of the agent,
51
+ // workflow, output-style and bundled-skill trees (scripts/build-shipped-history.mjs)
52
+ // and committed under src/defaults/. Release re-checks it, so the gate checks
53
+ // it first instead of letting a stale file fail the deploy late.
54
+ const HISTORY_GATE_PREFIXES = ['src/agents/', 'src/workflows/', 'src/output-styles/', 'src/defaults/'];
55
+ const HISTORY_GATE_FILES = [
56
+ 'scripts/build-shipped-history.mjs',
57
+ 'src/runtime/shared/shipped-definitions.mjs',
58
+ '.github/workflows/release-gate.yml',
59
+ ...GATE_SELECTION_SOURCES,
60
+ ];
61
+
62
+ // The mobile release scripts (Python) carry unittest suites that no Node lane
63
+ // discovers; they run when those scripts or the mobile workflows change.
64
+ const MOBILE_GATE_PREFIXES = ['apps/mobile/scripts/'];
65
+ const MOBILE_WORKFLOW_PATTERN = '\\.github/workflows/mobile-[^/]*\\.yml$';
66
+ const MOBILE_GATE_FILES = ['.github/workflows/release-gate.yml', ...GATE_SELECTION_SOURCES];
67
+
50
68
  // deploy.yml plan: paths whose change since the published release tag marks
51
69
  // the default lane as unverified.
52
70
  export const RELEASE_CRITICAL_PATHS = ['native', 'scripts', 'src', ...PACKAGE_MANIFESTS];
@@ -77,14 +95,33 @@ export function patchGateRegex() {
77
95
  ].join('|')})`;
78
96
  }
79
97
 
98
+ export function historyGateRegex() {
99
+ return `^(${[
100
+ ...HISTORY_GATE_PREFIXES.map(escapeRegex),
101
+ ...HISTORY_GATE_FILES.map((file) => `${escapeRegex(file)}$`),
102
+ ].join('|')})`;
103
+ }
104
+
105
+ export function mobileGateRegex() {
106
+ return `^(${[
107
+ ...MOBILE_GATE_PREFIXES.map(escapeRegex),
108
+ ...MOBILE_GATE_FILES.map((file) => `${escapeRegex(file)}$`),
109
+ MOBILE_WORKFLOW_PATTERN,
110
+ ].join('|')})`;
111
+ }
112
+
80
113
  const mode = process.argv[2];
81
114
  if (mode) {
82
115
  if (mode === 'desktop-regex') process.stdout.write(`${desktopGateRegex()}\n`);
83
116
  else if (mode === 'runtime-regex') process.stdout.write(`${runtimeGateRegex()}\n`);
84
117
  else if (mode === 'patch-regex') process.stdout.write(`${patchGateRegex()}\n`);
118
+ else if (mode === 'history-regex') process.stdout.write(`${historyGateRegex()}\n`);
119
+ else if (mode === 'mobile-regex') process.stdout.write(`${mobileGateRegex()}\n`);
85
120
  else if (mode === 'critical-paths') process.stdout.write(`${RELEASE_CRITICAL_PATHS.join('\n')}\n`);
86
121
  else {
87
- process.stderr.write(`unknown mode: ${mode} (expected desktop-regex|runtime-regex|patch-regex|critical-paths)\n`);
122
+ process.stderr.write(
123
+ `unknown mode: ${mode} (expected desktop-regex|runtime-regex|patch-regex|history-regex|mobile-regex|critical-paths)\n`
124
+ );
88
125
  process.exit(1);
89
126
  }
90
127
  }
package/scripts/test.mjs CHANGED
@@ -21,7 +21,7 @@
21
21
  import { glob } from 'node:fs/promises';
22
22
  import { resolve } from 'node:path';
23
23
  import { fileURLToPath } from 'node:url';
24
- import { runNodeTests } from './lib/run-node-tests.mjs';
24
+ import { DEFAULT_TEST_TIMEOUT_MS, LONG_TEST_TIMEOUT_MS, runNodeTests } from './lib/run-node-tests.mjs';
25
25
 
26
26
  const FILE_LANES = ['fast', 'slow', 'live', 'electron'];
27
27
  const LANES = [...FILE_LANES, 'all'];
@@ -40,11 +40,14 @@ export const USAGE = `Usage: node scripts/test.mjs [--lane ${LANES.join('|')}] [
40
40
  --exclude-lane drop one lane from the selection, repeatable. Electron and
41
41
  window-capture tests cannot run twice at once, so a second
42
42
  concurrent run uses --exclude-lane electron.
43
- --rerun-failed <n> re-run the failed files up to n times (default 0 = off).
44
- A test that passes on a re-run is reported as flaky and,
45
- because the flag was passed, does NOT fail the run; a test
46
- that fails every re-run still exits 1. Without the flag every
47
- failure fails the run, as before.
43
+ --rerun-failed <n> re-run the failed files up to n times. Default: 1 for a
44
+ local run, 0 (off) when CI is set; MIXDOG_TEST_RERUN_FAILED
45
+ overrides the default. A test that passes on a re-run is
46
+ reported as flaky and does NOT fail the run; a test that
47
+ fails every re-run still exits 1. With 0 every failure fails
48
+ the run.
49
+ Per-file timeout: --test-timeout (default 120000 ms for the fast lane, 600000
50
+ ms otherwise); MIXDOG_TEST_TIMEOUT_MS overrides, 0 disables.
48
51
  --import forwarded to node (desktop passes its test-env and tsx loaders).
49
52
  --test-* forwarded to node --test (e.g. --test-name-pattern, --test-only).
50
53
  --coverage collect V8 coverage (NODE_V8_COVERAGE, no dependency) and fold
@@ -80,6 +83,17 @@ function rerunCount(value) {
80
83
  return Number(value);
81
84
  }
82
85
 
86
+ // Files run in parallel on every core, which exposes timing-sensitive tests
87
+ // that pass alone. A local run therefore re-runs failed files once and reports
88
+ // a pass on the re-run as flaky (named in the failure summary). CI keeps the
89
+ // strict policy unless it opts in with --rerun-failed or MIXDOG_TEST_RERUN_FAILED;
90
+ // MIXDOG_TEST_RERUN_FAILED=0 turns the local default off.
91
+ export function defaultRerunFailed(env = process.env) {
92
+ if (/^\d+$/.test(String(env.MIXDOG_TEST_RERUN_FAILED ?? ''))) return Number(env.MIXDOG_TEST_RERUN_FAILED);
93
+ const ci = String(env.CI ?? '').toLowerCase();
94
+ return ci && ci !== '0' && ci !== 'false' ? 0 : 1;
95
+ }
96
+
83
97
  export function parseArgs(argv) {
84
98
  const options = { lane: 'fast', list: false, nodeArgs: [], filters: [] };
85
99
  for (let index = 0; index < argv.length; index++) {
@@ -102,6 +116,10 @@ export function parseArgs(argv) {
102
116
  const spec = argv[++index];
103
117
  if (spec === undefined) throw new Error('--import requires a value');
104
118
  options.nodeArgs.push(arg, spec);
119
+ } else if (arg === '--test-timeout' || arg === '--test-concurrency') {
120
+ const value = argv[++index];
121
+ if (value === undefined) throw new Error(`${arg} requires a value`);
122
+ options.nodeArgs.push(`${arg}=${value}`);
105
123
  } else if (arg.startsWith('--import=') || arg.startsWith('--test-')) options.nodeArgs.push(arg);
106
124
  else options.filters.push(arg.replaceAll('\\', '/'));
107
125
  }
@@ -198,7 +216,11 @@ async function main() {
198
216
  '--test-force-exit',
199
217
  ],
200
218
  files,
201
- { coverage: options.coverage === true, rerunFailed: options.rerunFailed ?? 0 }
219
+ {
220
+ coverage: options.coverage === true,
221
+ rerunFailed: options.rerunFailed ?? defaultRerunFailed(),
222
+ testTimeoutMs: options.lane === 'fast' ? DEFAULT_TEST_TIMEOUT_MS : LONG_TEST_TIMEOUT_MS,
223
+ }
202
224
  );
203
225
  }
204
226
 
@@ -197,6 +197,7 @@
197
197
  "733d30c3ca6745c96a69f7e237f3d8c0",
198
198
  "7b9ce58540ed4609f290dc981a7e1719",
199
199
  "8236330f56f27dd283bda6da1239285d",
200
+ "8bc93c9320b83de81baa8cf242af5c0b",
200
201
  "8fe64c8f6d81bee2120134adf0d6a471",
201
202
  "9e7a48df5065f5073bbab6f9db3e4061",
202
203
  "b46617cc619e09c35b6bad8f6177e722",
@@ -326,6 +327,7 @@
326
327
  "6101786127a1e68778eafcd2bf2c9ce0",
327
328
  "6711dbc9d84023b8eabfa928b8d33d18",
328
329
  "6f9e9338f560fa9acd839a67b5e2d1cc",
330
+ "70c54f802c77b630863b9e17a16d8224",
329
331
  "81e979463e0066e7a45cf511a31c5d68",
330
332
  "8476c811b2f02da3a434bcb23a1c3d12",
331
333
  "9f90d3872b1ecd312977ce661b770b31",
@@ -20,7 +20,7 @@ Platform notes: on macOS, `cmd` is the Command key and Mixdog needs the
20
20
  Accessibility and Screen Recording permissions. On Linux Wayland there is no
21
21
  background pixel input, pointer and keys need write access to `/dev/uinput`,
22
22
  and window control needs a compositor that exposes it (sway, Hyprland, or
23
- GNOME with the Window Calls extension); prefer accessibility refs there.
23
+ GNOME with Mixdog's own shell extension, which the app sets up); prefer accessibility refs there.
24
24
 
25
25
  > Method and pointers only. The tool description and input schema are the
26
26
  > authority for every field; when this file and the schema disagree, the
@@ -27,6 +27,7 @@ Read this when choosing a `setup` mutation.
27
27
  | Memory capability | `set_memory_enabled` |
28
28
  | Background memory cycles | `set_recap_enabled` |
29
29
  | Web Search tool exposure | `set_web_search_enabled` |
30
+ | Which user instruction files (AGENTS.md / CLAUDE.md) new sessions load: all, agents, claude, or off | `set_instruction_files` |
30
31
  | Git, Office, Code Tidy, Local Provider, Auto Effort, Browser, Computer, or voice enabled state | `set_builtin_enabled` |
31
32
  | Git, Memory, Office, Code Tidy, Local Provider, Auto Effort, Browser, Computer, or voice preparation | `install_builtin` |
32
33
  | Managed local model installation | `install_local_model` |
@@ -140,8 +140,8 @@ export async function runHeadlessRole({
140
140
  } = {}) {
141
141
  const cleanAgent = clean(agent);
142
142
  const cleanMessage = clean(message);
143
- // Classic headless surface: web search and memory tools start OFF
144
- // and opt back in per run (--web-search / --memory). An explicit
143
+ // Web search and memory start OFF. This call can pass webSearch or memory;
144
+ // exec accepts --web-search and rejects --memory. An explicit
145
145
  // MIXDOG_FEATURE_* value from the caller environment always wins.
146
146
  for (const [key, enabled] of [
147
147
  ['MIXDOG_FEATURE_WEB_SEARCH', webSearch],