@duckmind/dm-darwin-x64 0.43.4 → 0.48.5

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 (254) hide show
  1. package/dm +0 -0
  2. package/extensions/.dm-extensions.json +242 -50
  3. package/extensions/dm-9router-ext/package.json +2 -19
  4. package/extensions/dm-9router-ext/src/index.js +5 -0
  5. package/extensions/dm-ask-user/index.js +10 -0
  6. package/extensions/dm-ask-user/package.json +1 -21
  7. package/extensions/dm-cli-anything/package.json +0 -6
  8. package/extensions/dm-context/package.json +2 -12
  9. package/extensions/dm-context/src/context.js +1 -0
  10. package/extensions/dm-context/src/index.js +7 -0
  11. package/extensions/dm-context/src/utils.js +1 -0
  12. package/extensions/dm-cua/package.json +0 -7
  13. package/extensions/dm-fff/package.json +1 -28
  14. package/extensions/dm-fff/src/index.js +15 -0
  15. package/extensions/dm-fff/src/query.js +1 -0
  16. package/extensions/dm-goal/package.json +2 -31
  17. package/extensions/dm-goal/src/goal.js +43 -0
  18. package/extensions/dm-grill-me/index.js +174 -0
  19. package/extensions/dm-grill-me/package.json +1 -26
  20. package/extensions/dm-image2/package.json +0 -7
  21. package/extensions/dm-subagents/package.json +1 -32
  22. package/extensions/dm-subagents/src/agents/agent-management.js +37 -0
  23. package/extensions/dm-subagents/src/agents/agent-memory.js +6 -0
  24. package/extensions/dm-subagents/src/agents/agent-scope.js +1 -0
  25. package/extensions/dm-subagents/src/agents/agent-selection.js +1 -0
  26. package/extensions/dm-subagents/src/agents/agent-serializer.js +7 -0
  27. package/extensions/dm-subagents/src/agents/agents.js +11 -0
  28. package/extensions/dm-subagents/src/agents/chain-serializer.js +12 -0
  29. package/extensions/dm-subagents/src/agents/frontmatter.js +6 -0
  30. package/extensions/dm-subagents/src/agents/identity.js +1 -0
  31. package/extensions/dm-subagents/src/agents/proactive-skills.js +1 -0
  32. package/extensions/dm-subagents/src/agents/skills.js +6 -0
  33. package/extensions/dm-subagents/src/extension/config.js +2 -0
  34. package/extensions/dm-subagents/src/extension/control-notices.js +4 -0
  35. package/extensions/dm-subagents/src/extension/doctor.js +16 -0
  36. package/extensions/dm-subagents/src/extension/fanout-child.js +231 -0
  37. package/extensions/dm-subagents/src/extension/index.js +367 -0
  38. package/extensions/dm-subagents/src/extension/rpc.js +8 -0
  39. package/extensions/dm-subagents/src/extension/schemas.js +1 -0
  40. package/extensions/dm-subagents/src/extension/{tool-description.ts → tool-description.js} +6 -126
  41. package/extensions/dm-subagents/src/intercom/intercom-bridge.js +13 -0
  42. package/extensions/dm-subagents/src/intercom/native-supervisor-channel.js +5 -0
  43. package/extensions/dm-subagents/src/intercom/result-intercom.js +3 -0
  44. package/extensions/dm-subagents/src/profiles/profiles.js +3 -0
  45. package/extensions/dm-subagents/src/runs/background/async-execution.js +46 -0
  46. package/extensions/dm-subagents/src/runs/background/async-job-tracker.js +14 -0
  47. package/extensions/dm-subagents/src/runs/background/async-resume.js +8 -0
  48. package/extensions/dm-subagents/src/runs/background/async-status.js +12 -0
  49. package/extensions/dm-subagents/src/runs/background/chain-append.js +2 -0
  50. package/extensions/dm-subagents/src/runs/background/chain-root-attachment.js +1 -0
  51. package/extensions/dm-subagents/src/runs/background/completion-batcher.js +1 -0
  52. package/extensions/dm-subagents/src/runs/background/completion-dedupe.js +1 -0
  53. package/extensions/dm-subagents/src/runs/background/control-channel.js +1 -0
  54. package/extensions/dm-subagents/src/runs/background/fleet-view.js +17 -0
  55. package/extensions/dm-subagents/src/runs/background/notify.js +3 -0
  56. package/extensions/dm-subagents/src/runs/background/parallel-groups.js +1 -0
  57. package/extensions/dm-subagents/src/runs/background/result-watcher.js +8 -0
  58. package/extensions/dm-subagents/src/runs/background/run-id-resolver.js +4 -0
  59. package/extensions/dm-subagents/src/runs/background/run-status.js +23 -0
  60. package/extensions/dm-subagents/src/runs/background/scheduled-runs.js +4 -0
  61. package/extensions/dm-subagents/src/runs/background/stale-run-reconciler.js +11 -0
  62. package/extensions/dm-subagents/src/runs/background/subagent-runner.js +78 -0
  63. package/extensions/dm-subagents/src/runs/background/top-level-async.js +1 -0
  64. package/extensions/dm-subagents/src/runs/background/wait.js +11 -0
  65. package/extensions/dm-subagents/src/runs/foreground/chain-clarify.js +12 -0
  66. package/extensions/dm-subagents/src/runs/foreground/chain-execution.js +102 -0
  67. package/extensions/dm-subagents/src/runs/foreground/execution.js +51 -0
  68. package/extensions/dm-subagents/src/runs/foreground/subagent-executor.js +228 -0
  69. package/extensions/dm-subagents/src/runs/shared/acceptance.js +3 -0
  70. package/extensions/dm-subagents/src/runs/shared/chain-outputs.js +1 -0
  71. package/extensions/dm-subagents/src/runs/shared/completion-guard.js +3 -0
  72. package/extensions/dm-subagents/src/runs/shared/dm-args.js +1 -0
  73. package/extensions/dm-subagents/src/runs/shared/dm-spawn.js +1 -0
  74. package/extensions/dm-subagents/src/runs/shared/dynamic-fanout.js +1 -0
  75. package/extensions/dm-subagents/src/runs/shared/long-running-guard.js +1 -0
  76. package/extensions/dm-subagents/src/runs/shared/mcp-direct-tool-allowlist.js +1 -0
  77. package/extensions/dm-subagents/src/runs/shared/model-fallback.js +1 -0
  78. package/extensions/dm-subagents/src/runs/shared/model-scope.js +1 -0
  79. package/extensions/dm-subagents/src/runs/shared/nested-events.js +8 -0
  80. package/extensions/dm-subagents/src/runs/shared/nested-path.js +1 -0
  81. package/extensions/dm-subagents/src/runs/shared/nested-render.js +1 -0
  82. package/extensions/dm-subagents/src/runs/shared/parallel-utils.js +5 -0
  83. package/extensions/dm-subagents/src/runs/shared/run-history.js +5 -0
  84. package/extensions/dm-subagents/src/runs/shared/single-output.js +14 -0
  85. package/extensions/dm-subagents/src/runs/shared/structured-output.js +1 -0
  86. package/extensions/dm-subagents/src/runs/shared/subagent-control.js +5 -0
  87. package/extensions/dm-subagents/src/runs/shared/subagent-prompt-runtime.js +22 -0
  88. package/extensions/dm-subagents/src/runs/shared/tool-budget.js +1 -0
  89. package/extensions/dm-subagents/src/runs/shared/turn-budget.js +7 -0
  90. package/extensions/dm-subagents/src/runs/shared/workflow-graph.js +1 -0
  91. package/extensions/dm-subagents/src/runs/shared/worktree.js +3 -0
  92. package/extensions/dm-subagents/src/shared/artifacts.js +2 -0
  93. package/extensions/dm-subagents/src/shared/atomic-json.js +1 -0
  94. package/extensions/dm-subagents/src/shared/child-transcript.js +5 -0
  95. package/extensions/dm-subagents/src/shared/file-coalescer.js +1 -0
  96. package/extensions/dm-subagents/src/shared/fork-context.js +6 -0
  97. package/extensions/dm-subagents/src/shared/formatters.js +9 -0
  98. package/extensions/dm-subagents/src/shared/jsonl-writer.js +2 -0
  99. package/extensions/dm-subagents/src/shared/model-info.js +1 -0
  100. package/extensions/dm-subagents/src/shared/post-exit-stdio-guard.js +1 -0
  101. package/extensions/dm-subagents/src/shared/session-identity.js +1 -0
  102. package/extensions/dm-subagents/src/shared/session-tokens.js +2 -0
  103. package/extensions/dm-subagents/src/shared/settings.js +23 -0
  104. package/extensions/dm-subagents/src/shared/status-format.js +1 -0
  105. package/extensions/dm-subagents/src/shared/types.js +8 -0
  106. package/extensions/dm-subagents/src/shared/utils.js +2 -0
  107. package/extensions/dm-subagents/src/slash/prompt-template-bridge.js +1 -0
  108. package/extensions/dm-subagents/src/slash/prompt-workflows.js +7 -0
  109. package/extensions/dm-subagents/src/slash/slash-bridge.js +1 -0
  110. package/extensions/dm-subagents/src/slash/slash-commands.js +38 -0
  111. package/extensions/dm-subagents/src/slash/slash-live-state.js +6 -0
  112. package/extensions/dm-subagents/src/tui/render-helpers.js +1 -0
  113. package/extensions/dm-subagents/src/tui/render.js +4 -0
  114. package/extensions/dm-tasks/package.json +1 -30
  115. package/extensions/dm-tasks/src/auto-clear.js +1 -0
  116. package/extensions/dm-tasks/src/index.js +212 -0
  117. package/extensions/dm-tasks/src/process-tracker.js +1 -0
  118. package/extensions/dm-tasks/src/task-store.js +1 -0
  119. package/extensions/dm-tasks/src/tasks-config.js +1 -0
  120. package/extensions/dm-tasks/src/types.js +0 -0
  121. package/extensions/dm-tasks/src/ui/settings-menu.js +1 -0
  122. package/extensions/dm-tasks/src/ui/task-widget.js +1 -0
  123. package/extensions/dm-usage/index.js +9 -0
  124. package/extensions/dm-usage/package.json +1 -18
  125. package/extensions/greedysearch-dm/bin/search.mjs +51 -51
  126. package/extensions/greedysearch-dm/index.js +20 -0
  127. package/extensions/greedysearch-dm/package.json +1 -22
  128. package/extensions/greedysearch-dm/src/formatters/results.js +8 -0
  129. package/extensions/greedysearch-dm/src/formatters/sources.js +1 -0
  130. package/extensions/greedysearch-dm/src/formatters/synthesis.js +1 -0
  131. package/extensions/greedysearch-dm/src/search/research.mjs +59 -59
  132. package/extensions/greedysearch-dm/src/search/synthesis-runner.mjs +10 -10
  133. package/extensions/greedysearch-dm/src/tools/greedy-search-handler.js +20 -0
  134. package/extensions/greedysearch-dm/src/tools/shared.js +9 -0
  135. package/extensions/greedysearch-dm/src/types.js +0 -0
  136. package/extensions/greedysearch-dm/src/utils/helpers.js +1 -0
  137. package/package.json +1 -1
  138. package/extensions/dm-9router-ext/src/index.ts +0 -541
  139. package/extensions/dm-ask-user/index.ts +0 -857
  140. package/extensions/dm-context/src/context.ts +0 -158
  141. package/extensions/dm-context/src/index.ts +0 -439
  142. package/extensions/dm-context/src/utils.ts +0 -6
  143. package/extensions/dm-fff/src/index.ts +0 -1023
  144. package/extensions/dm-fff/src/query.ts +0 -87
  145. package/extensions/dm-goal/src/goal.ts +0 -1073
  146. package/extensions/dm-grill-me/index.ts +0 -1085
  147. package/extensions/dm-subagents/src/agents/agent-management.ts +0 -1052
  148. package/extensions/dm-subagents/src/agents/agent-memory.ts +0 -254
  149. package/extensions/dm-subagents/src/agents/agent-scope.ts +0 -6
  150. package/extensions/dm-subagents/src/agents/agent-selection.ts +0 -25
  151. package/extensions/dm-subagents/src/agents/agent-serializer.ts +0 -121
  152. package/extensions/dm-subagents/src/agents/agents.ts +0 -1553
  153. package/extensions/dm-subagents/src/agents/chain-serializer.ts +0 -277
  154. package/extensions/dm-subagents/src/agents/frontmatter.ts +0 -93
  155. package/extensions/dm-subagents/src/agents/identity.ts +0 -30
  156. package/extensions/dm-subagents/src/agents/proactive-skills.ts +0 -191
  157. package/extensions/dm-subagents/src/agents/skills.ts +0 -729
  158. package/extensions/dm-subagents/src/extension/config.ts +0 -39
  159. package/extensions/dm-subagents/src/extension/control-notices.ts +0 -92
  160. package/extensions/dm-subagents/src/extension/doctor.ts +0 -214
  161. package/extensions/dm-subagents/src/extension/fanout-child.ts +0 -172
  162. package/extensions/dm-subagents/src/extension/index.ts +0 -656
  163. package/extensions/dm-subagents/src/extension/rpc.ts +0 -369
  164. package/extensions/dm-subagents/src/extension/schemas.ts +0 -309
  165. package/extensions/dm-subagents/src/intercom/intercom-bridge.ts +0 -180
  166. package/extensions/dm-subagents/src/intercom/native-supervisor-channel.ts +0 -519
  167. package/extensions/dm-subagents/src/intercom/result-intercom.ts +0 -377
  168. package/extensions/dm-subagents/src/profiles/profiles.ts +0 -637
  169. package/extensions/dm-subagents/src/runs/background/async-execution.ts +0 -1065
  170. package/extensions/dm-subagents/src/runs/background/async-job-tracker.ts +0 -441
  171. package/extensions/dm-subagents/src/runs/background/async-resume.ts +0 -391
  172. package/extensions/dm-subagents/src/runs/background/async-status.ts +0 -395
  173. package/extensions/dm-subagents/src/runs/background/chain-append.ts +0 -282
  174. package/extensions/dm-subagents/src/runs/background/chain-root-attachment.ts +0 -191
  175. package/extensions/dm-subagents/src/runs/background/completion-batcher.ts +0 -166
  176. package/extensions/dm-subagents/src/runs/background/completion-dedupe.ts +0 -63
  177. package/extensions/dm-subagents/src/runs/background/control-channel.ts +0 -332
  178. package/extensions/dm-subagents/src/runs/background/fleet-view.ts +0 -515
  179. package/extensions/dm-subagents/src/runs/background/notify.ts +0 -225
  180. package/extensions/dm-subagents/src/runs/background/parallel-groups.ts +0 -45
  181. package/extensions/dm-subagents/src/runs/background/result-watcher.ts +0 -315
  182. package/extensions/dm-subagents/src/runs/background/run-id-resolver.ts +0 -84
  183. package/extensions/dm-subagents/src/runs/background/run-status.ts +0 -434
  184. package/extensions/dm-subagents/src/runs/background/scheduled-runs.ts +0 -514
  185. package/extensions/dm-subagents/src/runs/background/stale-run-reconciler.ts +0 -368
  186. package/extensions/dm-subagents/src/runs/background/subagent-runner.ts +0 -3171
  187. package/extensions/dm-subagents/src/runs/background/top-level-async.ts +0 -13
  188. package/extensions/dm-subagents/src/runs/background/wait.ts +0 -353
  189. package/extensions/dm-subagents/src/runs/foreground/chain-clarify.ts +0 -1333
  190. package/extensions/dm-subagents/src/runs/foreground/chain-execution.ts +0 -1313
  191. package/extensions/dm-subagents/src/runs/foreground/execution.ts +0 -1239
  192. package/extensions/dm-subagents/src/runs/foreground/subagent-executor.ts +0 -3613
  193. package/extensions/dm-subagents/src/runs/shared/acceptance.ts +0 -879
  194. package/extensions/dm-subagents/src/runs/shared/chain-outputs.ts +0 -116
  195. package/extensions/dm-subagents/src/runs/shared/completion-guard.ts +0 -147
  196. package/extensions/dm-subagents/src/runs/shared/dm-args.ts +0 -271
  197. package/extensions/dm-subagents/src/runs/shared/dm-spawn.ts +0 -147
  198. package/extensions/dm-subagents/src/runs/shared/dynamic-fanout.ts +0 -295
  199. package/extensions/dm-subagents/src/runs/shared/long-running-guard.ts +0 -175
  200. package/extensions/dm-subagents/src/runs/shared/mcp-direct-tool-allowlist.ts +0 -365
  201. package/extensions/dm-subagents/src/runs/shared/model-fallback.ts +0 -292
  202. package/extensions/dm-subagents/src/runs/shared/model-scope.ts +0 -128
  203. package/extensions/dm-subagents/src/runs/shared/nested-events.ts +0 -908
  204. package/extensions/dm-subagents/src/runs/shared/nested-path.ts +0 -52
  205. package/extensions/dm-subagents/src/runs/shared/nested-render.ts +0 -115
  206. package/extensions/dm-subagents/src/runs/shared/parallel-utils.ts +0 -198
  207. package/extensions/dm-subagents/src/runs/shared/run-history.ts +0 -60
  208. package/extensions/dm-subagents/src/runs/shared/single-output.ts +0 -180
  209. package/extensions/dm-subagents/src/runs/shared/structured-output.ts +0 -77
  210. package/extensions/dm-subagents/src/runs/shared/subagent-control.ts +0 -223
  211. package/extensions/dm-subagents/src/runs/shared/subagent-prompt-runtime.ts +0 -342
  212. package/extensions/dm-subagents/src/runs/shared/tool-budget.ts +0 -74
  213. package/extensions/dm-subagents/src/runs/shared/turn-budget.ts +0 -52
  214. package/extensions/dm-subagents/src/runs/shared/workflow-graph.ts +0 -206
  215. package/extensions/dm-subagents/src/runs/shared/worktree.ts +0 -600
  216. package/extensions/dm-subagents/src/shared/artifacts.ts +0 -113
  217. package/extensions/dm-subagents/src/shared/atomic-json.ts +0 -86
  218. package/extensions/dm-subagents/src/shared/child-transcript.ts +0 -212
  219. package/extensions/dm-subagents/src/shared/file-coalescer.ts +0 -40
  220. package/extensions/dm-subagents/src/shared/fork-context.ts +0 -194
  221. package/extensions/dm-subagents/src/shared/formatters.ts +0 -133
  222. package/extensions/dm-subagents/src/shared/jsonl-writer.ts +0 -81
  223. package/extensions/dm-subagents/src/shared/model-info.ts +0 -78
  224. package/extensions/dm-subagents/src/shared/post-exit-stdio-guard.ts +0 -85
  225. package/extensions/dm-subagents/src/shared/session-identity.ts +0 -10
  226. package/extensions/dm-subagents/src/shared/session-tokens.ts +0 -44
  227. package/extensions/dm-subagents/src/shared/settings.ts +0 -450
  228. package/extensions/dm-subagents/src/shared/status-format.ts +0 -49
  229. package/extensions/dm-subagents/src/shared/types.ts +0 -1257
  230. package/extensions/dm-subagents/src/shared/utils.ts +0 -554
  231. package/extensions/dm-subagents/src/slash/prompt-template-bridge.ts +0 -420
  232. package/extensions/dm-subagents/src/slash/prompt-workflows.ts +0 -330
  233. package/extensions/dm-subagents/src/slash/slash-bridge.ts +0 -176
  234. package/extensions/dm-subagents/src/slash/slash-commands.ts +0 -1296
  235. package/extensions/dm-subagents/src/slash/slash-live-state.ts +0 -292
  236. package/extensions/dm-subagents/src/tui/render-helpers.ts +0 -80
  237. package/extensions/dm-subagents/src/tui/render.ts +0 -1748
  238. package/extensions/dm-tasks/src/auto-clear.ts +0 -91
  239. package/extensions/dm-tasks/src/index.ts +0 -1145
  240. package/extensions/dm-tasks/src/process-tracker.ts +0 -140
  241. package/extensions/dm-tasks/src/task-store.ts +0 -305
  242. package/extensions/dm-tasks/src/tasks-config.ts +0 -23
  243. package/extensions/dm-tasks/src/types.ts +0 -40
  244. package/extensions/dm-tasks/src/ui/settings-menu.ts +0 -100
  245. package/extensions/dm-tasks/src/ui/task-widget.ts +0 -265
  246. package/extensions/dm-usage/index.ts +0 -1718
  247. package/extensions/greedysearch-dm/index.ts +0 -177
  248. package/extensions/greedysearch-dm/src/formatters/results.ts +0 -163
  249. package/extensions/greedysearch-dm/src/formatters/sources.ts +0 -116
  250. package/extensions/greedysearch-dm/src/formatters/synthesis.ts +0 -87
  251. package/extensions/greedysearch-dm/src/tools/greedy-search-handler.ts +0 -370
  252. package/extensions/greedysearch-dm/src/tools/shared.ts +0 -187
  253. package/extensions/greedysearch-dm/src/types.ts +0 -110
  254. package/extensions/greedysearch-dm/src/utils/helpers.ts +0 -40
@@ -1,177 +0,0 @@
1
- /**
2
- * GreedySearch DM Extension
3
- *
4
- * Adds `greedy_search` tool to DM.
5
- * Use depth: "deep" for deep research (source fetching + synthesis + confidence).
6
- *
7
- * Reports streaming progress as each engine completes.
8
- * Requires Chrome to be running (or it auto-launches a dedicated instance).
9
- */
10
-
11
- import { spawn } from "node:child_process";
12
- import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
13
- import { homedir } from "node:os";
14
- import { dirname, join } from "node:path";
15
- import { fileURLToPath } from "node:url";
16
-
17
- import { registerGreedySearchTool } from "./src/tools/greedy-search-handler.js";
18
-
19
- type ExtensionAPI = any;
20
- import { cdpAvailable } from "./src/tools/shared.js";
21
- import { nodeRuntimeCommand } from "./src/utils/node-runtime.mjs";
22
-
23
- const __dir = dirname(fileURLToPath(import.meta.url));
24
-
25
- export default function greedySearchExtension(dm: ExtensionAPI) {
26
- dm.on("session_start", async (_event, ctx) => {
27
- if (!cdpAvailable(__dir)) {
28
- ctx.ui.notify(
29
- "GreedySearch: cdp.mjs missing from package directory — try reinstall DM or rebuild the bundled GreedySearch asset",
30
- "warning",
31
- );
32
- }
33
- });
34
-
35
- // ─── greedy_search ────────────────────────────────────────────────────────
36
- registerGreedySearchTool(dm, __dir);
37
-
38
- // ─── GreedySearch Chrome commands ─────────────────────────────────────────
39
- dm.registerCommand("greedy-visible", {
40
- description:
41
- "Launch GreedySearch Chrome in visible mode for captcha/login/cookie setup.",
42
- handler: async (_args, ctx) => {
43
- await runChromeCommand([], ctx, "Visible GreedySearch Chrome launched.");
44
- },
45
- });
46
-
47
- dm.registerCommand("greedy-status", {
48
- description: "Show GreedySearch Chrome status.",
49
- handler: async (_args, ctx) => {
50
- await runChromeCommand(["--status"], ctx);
51
- },
52
- });
53
-
54
- dm.registerCommand("greedy-kill", {
55
- description: "Stop GreedySearch Chrome.",
56
- handler: async (_args, ctx) => {
57
- await runChromeCommand(["--kill"], ctx, "GreedySearch Chrome stopped.");
58
- },
59
- });
60
-
61
- // ─── /set-greedy-locale command ───────────────────────────────────────────
62
- dm.registerCommand("set-greedy-locale", {
63
- description:
64
- "Set default locale for GreedySearch results (e.g., /set-greedy-locale de, /set-greedy-locale --clear, /set-greedy-locale --show)",
65
- handler: async (args, ctx) => {
66
- const arg = args.trim() || "--show";
67
-
68
- if (arg === "--show") {
69
- const config = loadUserConfig();
70
- if (config.locale) {
71
- ctx.ui.notify(`Default locale: ${config.locale}`, "info");
72
- } else {
73
- ctx.ui.notify("No default locale (uses: en)", "info");
74
- }
75
- return;
76
- }
77
-
78
- if (arg === "--clear") {
79
- const config = loadUserConfig();
80
- delete config.locale;
81
- saveUserConfig(config);
82
- ctx.ui.notify("Default locale cleared (now uses: en).", "info");
83
- return;
84
- }
85
-
86
- // Set locale
87
- const locale = arg.toLowerCase();
88
- const VALID_LOCALES = [
89
- "en",
90
- "de",
91
- "fr",
92
- "es",
93
- "it",
94
- "pt",
95
- "nl",
96
- "pl",
97
- "ru",
98
- "ja",
99
- "ko",
100
- "zh",
101
- "ar",
102
- "hi",
103
- "tr",
104
- "sv",
105
- "da",
106
- "no",
107
- "fi",
108
- "cs",
109
- "hu",
110
- "ro",
111
- "el",
112
- ];
113
-
114
- if (!VALID_LOCALES.includes(locale)) {
115
- ctx.ui.notify(
116
- `Invalid locale "${locale}". Valid: ${VALID_LOCALES.join(", ")}`,
117
- "error",
118
- );
119
- return;
120
- }
121
-
122
- const config = loadUserConfig();
123
- config.locale = locale;
124
- saveUserConfig(config);
125
- ctx.ui.notify(`Default locale set to: ${locale}`, "info");
126
- },
127
- });
128
- }
129
-
130
- const USER_CONFIG_DIR = join(homedir(), ".config", "greedysearch");
131
- const USER_CONFIG_FILE = join(USER_CONFIG_DIR, "config.json");
132
-
133
- async function runChromeCommand(
134
- args: string[],
135
- ctx: any,
136
- successMessage?: string,
137
- ): Promise<void> {
138
- const visibleBin = join(__dir, "bin", "visible.mjs");
139
- const { code, output } = await new Promise<{
140
- code: number | null;
141
- output: string;
142
- }>((resolve) => {
143
- const proc = spawn(nodeRuntimeCommand(), [visibleBin, ...args], {
144
- stdio: ["ignore", "pipe", "pipe"],
145
- env: { ...process.env, GREEDY_SEARCH_VISIBLE: "1" },
146
- });
147
- let output = "";
148
- proc.stdout.on("data", (d: Buffer) => (output += d.toString()));
149
- proc.stderr.on("data", (d: Buffer) => (output += d.toString()));
150
- proc.on("close", (code: number | null) => resolve({ code, output }));
151
- });
152
-
153
- if (code === 0) {
154
- ctx.ui.notify((successMessage || output.trim() || "Done.").trim(), "info");
155
- } else {
156
- ctx.ui.notify(
157
- output.trim() || `GreedySearch Chrome command failed (${code})`,
158
- "error",
159
- );
160
- }
161
- }
162
-
163
- function loadUserConfig(): Record<string, string> {
164
- try {
165
- if (existsSync(USER_CONFIG_FILE)) {
166
- return JSON.parse(readFileSync(USER_CONFIG_FILE, "utf8"));
167
- }
168
- } catch {
169
- // Ignore parse errors
170
- }
171
- return {};
172
- }
173
-
174
- function saveUserConfig(config: Record<string, string>): void {
175
- mkdirSync(USER_CONFIG_DIR, { recursive: true });
176
- writeFileSync(USER_CONFIG_FILE, JSON.stringify(config, null, 2), "utf8");
177
- }
@@ -1,163 +0,0 @@
1
- /**
2
- * Search results formatters
3
- * Extracted from index.ts
4
- */
5
-
6
- import { formatEngineName } from "../utils/helpers.js";
7
- import { renderSynthesis } from "./synthesis.js";
8
-
9
- /**
10
- * Format search results based on engine type
11
- */
12
- export function formatResults(
13
- engine: string,
14
- data: Record<string, unknown>,
15
- ): string {
16
- const lines: string[] = [];
17
-
18
- if (engine === "all") {
19
- return formatAllEnginesResult(data, lines);
20
- }
21
-
22
- return formatSingleEngineResult(data, lines);
23
- }
24
-
25
- /**
26
- * Format multi-engine results with synthesis
27
- */
28
- function formatAllEnginesResult(
29
- data: Record<string, unknown>,
30
- lines: string[],
31
- ): string {
32
- const synthesis = data._synthesis as Record<string, unknown> | undefined;
33
- const dedupedSources = data._sources as
34
- | Array<Record<string, unknown>>
35
- | undefined;
36
- const needsHuman = data._needsHumanVerification as
37
- | Record<string, unknown>
38
- | undefined;
39
- const research = data._research as Record<string, unknown> | undefined;
40
-
41
- if (needsHuman) {
42
- const engines = Array.isArray(needsHuman.engines)
43
- ? needsHuman.engines.join(", ")
44
- : "one or more engines";
45
- lines.push("## Manual verification required");
46
- lines.push(
47
- String(
48
- needsHuman.message ||
49
- "Visible Chrome is open. Solve the verification challenge, then rerun the same search.",
50
- ),
51
- );
52
- lines.push(`Engines: ${engines}`);
53
- lines.push("");
54
- }
55
-
56
- // If we have a synthesis answer, render it
57
- if (synthesis?.answer) {
58
- if (research?.mode === "iterative") renderResearchHeader(lines, research);
59
- renderSynthesis(lines, synthesis, dedupedSources || [], 6);
60
- const synthesizedBy = String(
61
- synthesis.synthesizedBy || "configured synthesizer",
62
- );
63
- lines.push(
64
- research?.mode === "iterative"
65
- ? "*Research mode: iterative planning, source fetching, citation audit, and bundle output*\n"
66
- : `*Synthesized by ${synthesizedBy} from multi-engine results and fetched sources*\n`,
67
- );
68
- return lines.join("\n").trim();
69
- }
70
-
71
- // Fallback: render individual engine results
72
- for (const [eng, result] of Object.entries(data)) {
73
- if (eng.startsWith("_")) continue;
74
- lines.push(`\n## ${formatEngineName(eng)}`);
75
- formatEngineResult(result as Record<string, unknown>, lines, 3);
76
- }
77
-
78
- return lines.join("\n").trim();
79
- }
80
-
81
- function renderResearchHeader(
82
- lines: string[],
83
- research: Record<string, unknown>,
84
- ): void {
85
- const floor = research.floor as Record<string, unknown> | undefined;
86
- const metrics = floor?.metrics as Record<string, unknown> | undefined;
87
- const bundle = research.bundle as Record<string, unknown> | undefined;
88
- const manifest = research.manifest as Record<string, unknown> | undefined;
89
- lines.push("## Research Run");
90
- lines.push(
91
- `- Status: ${floor?.floorMet ? "floor met" : "partial / floor unmet"}`,
92
- );
93
- if (manifest?.terminationReason)
94
- lines.push(`- Stop reason: ${String(manifest.terminationReason)}`);
95
- if (metrics) {
96
- lines.push(
97
- `- Evidence: ${metrics.fetchedOk || 0} fetched sources, ${metrics.primarySources || 0} primary/official, ${metrics.claims || 0} claims, ${metrics.cited || 0} citations`,
98
- );
99
- lines.push(
100
- `- Questions: ${metrics.closedQuestions || 0}/${metrics.totalQuestions || 0} closed${metrics.openQuestions ? `, ${metrics.openQuestions} open` : ""}`,
101
- );
102
- }
103
- if (bundle?.dir) lines.push(`- Bundle: ${String(bundle.dir)}`);
104
- lines.push("");
105
- }
106
-
107
- /**
108
- * Format single engine result
109
- */
110
- function formatSingleEngineResult(
111
- data: Record<string, unknown>,
112
- lines: string[],
113
- ): string {
114
- const needsHuman = data._needsHumanVerification as
115
- | Record<string, unknown>
116
- | undefined;
117
- if (needsHuman) {
118
- const engines = Array.isArray(needsHuman.engines)
119
- ? needsHuman.engines.join(", ")
120
- : "this engine";
121
- lines.push("## Manual verification required");
122
- lines.push(
123
- String(
124
- needsHuman.message ||
125
- "Visible Chrome is open. Solve the verification challenge, then rerun the same search.",
126
- ),
127
- );
128
- lines.push(`Engines: ${engines}`);
129
- lines.push("");
130
- }
131
- formatEngineResult(data, lines, 5);
132
- return lines.join("\n").trim();
133
- }
134
-
135
- /**
136
- * Format a single engine's result (answer + sources)
137
- */
138
- function formatEngineResult(
139
- data: Record<string, unknown>,
140
- lines: string[],
141
- maxSources: number,
142
- ): void {
143
- if (data.error) {
144
- lines.push(`Error: ${data.error}`);
145
- return;
146
- }
147
-
148
- if (data.answer) {
149
- lines.push(String(data.answer));
150
- }
151
-
152
- const sources = data.sources as Array<Record<string, string>> | undefined;
153
- if (Array.isArray(sources) && sources.length > 0) {
154
- lines.push("\nSources:");
155
- for (const s of sources.slice(0, maxSources)) {
156
- lines.push(`- [${s.title || s.url}](${s.url})`);
157
- }
158
- }
159
- }
160
-
161
- /**
162
- * Format deep research results with confidence metrics
163
- */
@@ -1,116 +0,0 @@
1
- /**
2
- * Source formatting utilities
3
- * Extracted from index.ts
4
- */
5
-
6
- import { formatEngineName, humanizeSourceType } from "../utils/helpers.js";
7
-
8
- /**
9
- * Get source URL from various possible fields
10
- */
11
- export function sourceUrl(source: Record<string, unknown>): string {
12
- return String(source.displayUrl || source.canonicalUrl || source.url || "");
13
- }
14
-
15
- /**
16
- * Get source label/title from various possible fields
17
- */
18
- export function sourceLabel(source: Record<string, unknown>): string {
19
- return String(
20
- source.title || source.domain || sourceUrl(source) || "Untitled source",
21
- );
22
- }
23
-
24
- /**
25
- * Calculate consensus score (engine count)
26
- */
27
- export function sourceConsensus(source: Record<string, unknown>): number {
28
- if (typeof source.engineCount === "number") return source.engineCount;
29
- const engines = Array.isArray(source.engines)
30
- ? (source.engines as string[])
31
- : [];
32
- return engines.length;
33
- }
34
-
35
- /**
36
- * Build a map of sources by ID for quick lookup
37
- */
38
- export function getSourceMap(
39
- sources: Array<Record<string, unknown>>,
40
- ): Map<string, Record<string, unknown>> {
41
- return new Map(
42
- sources
43
- .map((source) => [String(source.id || ""), source] as const)
44
- .filter(([id]) => id),
45
- );
46
- }
47
-
48
- /**
49
- * Format a single source line for display
50
- */
51
- export function formatSourceLine(source: Record<string, unknown>): string {
52
- const id = String(source.id || "?");
53
- const url = sourceUrl(source);
54
- const title = sourceLabel(source);
55
- const domain = String(source.domain || "");
56
- const engines = Array.isArray(source.engines)
57
- ? (source.engines as string[])
58
- : [];
59
- const consensus = sourceConsensus(source);
60
- const typeLabel = humanizeSourceType(String(source.sourceType || ""));
61
- const fetch = source.fetch as Record<string, unknown> | undefined;
62
- const fetchStatus = fetch?.ok
63
- ? `fetched ${fetch.status || 200}`
64
- : fetch?.attempted
65
- ? "fetch failed"
66
- : "";
67
-
68
- const pieces = [
69
- `${id} - [${title}](${url})`,
70
- domain,
71
- typeLabel,
72
- engines.length
73
- ? `cited by ${engines.map(formatEngineName).join(", ")} (${consensus}/3)`
74
- : `${consensus}/3`,
75
- fetchStatus,
76
- ].filter(Boolean);
77
-
78
- return `- ${pieces.join(" - ")}`;
79
- }
80
-
81
- /**
82
- * Render source evidence (snippet, last modified, errors)
83
- */
84
- export function renderSourceEvidence(
85
- lines: string[],
86
- source: Record<string, unknown>,
87
- ): void {
88
- const fetch = source.fetch as Record<string, unknown> | undefined;
89
- if (!fetch?.attempted) return;
90
-
91
- const snippet = String(fetch.snippet || "").trim();
92
- const lastModified = String(fetch.lastModified || "").trim();
93
-
94
- if (snippet) lines.push(` Evidence: ${snippet}`);
95
- if (lastModified) lines.push(` Last-Modified: ${lastModified}`);
96
- if (fetch.error) lines.push(` Fetch error: ${String(fetch.error)}`);
97
- }
98
-
99
- /**
100
- * Pick top sources, preferring recommended ones
101
- */
102
- export function pickSources(
103
- sources: Array<Record<string, unknown>>,
104
- recommendedIds: string[] = [],
105
- max = 6,
106
- ): Array<Record<string, unknown>> {
107
- if (!sources.length) return [];
108
-
109
- const sourceMap = getSourceMap(sources);
110
- const recommended = recommendedIds
111
- .map((id) => sourceMap.get(id))
112
- .filter((source): source is Record<string, unknown> => Boolean(source));
113
-
114
- if (recommended.length > 0) return recommended.slice(0, max);
115
- return sources.slice(0, max);
116
- }
@@ -1,87 +0,0 @@
1
- /**
2
- * Synthesis and research result formatters
3
- * Extracted from index.ts
4
- */
5
-
6
- import { formatAgreementLevel } from "../utils/helpers.js";
7
- import { formatSourceLine, pickSources } from "./sources.js";
8
-
9
- /**
10
- * Render synthesis data (answer, consensus, differences, caveats, claims, sources)
11
- */
12
- export function renderSynthesis(
13
- lines: string[],
14
- synthesis: Record<string, unknown>,
15
- sources: Array<Record<string, unknown>>,
16
- maxSources = 6,
17
- ): void {
18
- // Answer section
19
- if (synthesis.answer) {
20
- lines.push("## Answer");
21
- lines.push(String(synthesis.answer));
22
- lines.push("");
23
- }
24
-
25
- // Consensus section
26
- const agreement = synthesis.agreement as Record<string, unknown> | undefined;
27
- const agreementSummary = String(agreement?.summary || "").trim();
28
- const agreementLevel = String(agreement?.level || "").trim();
29
-
30
- if (agreementSummary || agreementLevel) {
31
- lines.push("## Consensus");
32
- lines.push(
33
- `- ${formatAgreementLevel(agreementLevel)}${agreementSummary ? ` - ${agreementSummary}` : ""}`,
34
- );
35
- lines.push("");
36
- }
37
-
38
- // Differences section
39
- const differences = Array.isArray(synthesis.differences)
40
- ? (synthesis.differences as string[])
41
- : [];
42
- if (differences.length > 0) {
43
- lines.push("## Where Engines Differ");
44
- for (const difference of differences) lines.push(`- ${difference}`);
45
- lines.push("");
46
- }
47
-
48
- // Caveats section
49
- const caveats = Array.isArray(synthesis.caveats)
50
- ? (synthesis.caveats as string[])
51
- : [];
52
- if (caveats.length > 0) {
53
- lines.push("## Caveats");
54
- for (const caveat of caveats) lines.push(`- ${caveat}`);
55
- lines.push("");
56
- }
57
-
58
- // Claims section
59
- const claims = Array.isArray(synthesis.claims)
60
- ? (synthesis.claims as Array<Record<string, unknown>>)
61
- : [];
62
- if (claims.length > 0) {
63
- lines.push("## Key Claims");
64
- for (const claim of claims) {
65
- const sourceIds = Array.isArray(claim.sourceIds)
66
- ? (claim.sourceIds as string[])
67
- : [];
68
- const support = String(claim.support || "moderate");
69
- lines.push(
70
- `- ${String(claim.claim || "")} [${support}${sourceIds.length ? `; ${sourceIds.join(", ")}` : ""}]`,
71
- );
72
- }
73
- lines.push("");
74
- }
75
-
76
- // Top sources section
77
- const recommendedIds = Array.isArray(synthesis.recommendedSources)
78
- ? (synthesis.recommendedSources as string[])
79
- : [];
80
- const topSources = pickSources(sources, recommendedIds, maxSources);
81
-
82
- if (topSources.length > 0) {
83
- lines.push("## Top Sources");
84
- for (const source of topSources) lines.push(formatSourceLine(source));
85
- lines.push("");
86
- }
87
- }