@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.
- package/dm +0 -0
- package/extensions/.dm-extensions.json +242 -50
- package/extensions/dm-9router-ext/package.json +2 -19
- package/extensions/dm-9router-ext/src/index.js +5 -0
- package/extensions/dm-ask-user/index.js +10 -0
- package/extensions/dm-ask-user/package.json +1 -21
- package/extensions/dm-cli-anything/package.json +0 -6
- package/extensions/dm-context/package.json +2 -12
- package/extensions/dm-context/src/context.js +1 -0
- package/extensions/dm-context/src/index.js +7 -0
- package/extensions/dm-context/src/utils.js +1 -0
- package/extensions/dm-cua/package.json +0 -7
- package/extensions/dm-fff/package.json +1 -28
- package/extensions/dm-fff/src/index.js +15 -0
- package/extensions/dm-fff/src/query.js +1 -0
- package/extensions/dm-goal/package.json +2 -31
- package/extensions/dm-goal/src/goal.js +43 -0
- package/extensions/dm-grill-me/index.js +174 -0
- package/extensions/dm-grill-me/package.json +1 -26
- package/extensions/dm-image2/package.json +0 -7
- package/extensions/dm-subagents/package.json +1 -32
- package/extensions/dm-subagents/src/agents/agent-management.js +37 -0
- package/extensions/dm-subagents/src/agents/agent-memory.js +6 -0
- package/extensions/dm-subagents/src/agents/agent-scope.js +1 -0
- package/extensions/dm-subagents/src/agents/agent-selection.js +1 -0
- package/extensions/dm-subagents/src/agents/agent-serializer.js +7 -0
- package/extensions/dm-subagents/src/agents/agents.js +11 -0
- package/extensions/dm-subagents/src/agents/chain-serializer.js +12 -0
- package/extensions/dm-subagents/src/agents/frontmatter.js +6 -0
- package/extensions/dm-subagents/src/agents/identity.js +1 -0
- package/extensions/dm-subagents/src/agents/proactive-skills.js +1 -0
- package/extensions/dm-subagents/src/agents/skills.js +6 -0
- package/extensions/dm-subagents/src/extension/config.js +2 -0
- package/extensions/dm-subagents/src/extension/control-notices.js +4 -0
- package/extensions/dm-subagents/src/extension/doctor.js +16 -0
- package/extensions/dm-subagents/src/extension/fanout-child.js +231 -0
- package/extensions/dm-subagents/src/extension/index.js +367 -0
- package/extensions/dm-subagents/src/extension/rpc.js +8 -0
- package/extensions/dm-subagents/src/extension/schemas.js +1 -0
- package/extensions/dm-subagents/src/extension/{tool-description.ts → tool-description.js} +6 -126
- package/extensions/dm-subagents/src/intercom/intercom-bridge.js +13 -0
- package/extensions/dm-subagents/src/intercom/native-supervisor-channel.js +5 -0
- package/extensions/dm-subagents/src/intercom/result-intercom.js +3 -0
- package/extensions/dm-subagents/src/profiles/profiles.js +3 -0
- package/extensions/dm-subagents/src/runs/background/async-execution.js +46 -0
- package/extensions/dm-subagents/src/runs/background/async-job-tracker.js +14 -0
- package/extensions/dm-subagents/src/runs/background/async-resume.js +8 -0
- package/extensions/dm-subagents/src/runs/background/async-status.js +12 -0
- package/extensions/dm-subagents/src/runs/background/chain-append.js +2 -0
- package/extensions/dm-subagents/src/runs/background/chain-root-attachment.js +1 -0
- package/extensions/dm-subagents/src/runs/background/completion-batcher.js +1 -0
- package/extensions/dm-subagents/src/runs/background/completion-dedupe.js +1 -0
- package/extensions/dm-subagents/src/runs/background/control-channel.js +1 -0
- package/extensions/dm-subagents/src/runs/background/fleet-view.js +17 -0
- package/extensions/dm-subagents/src/runs/background/notify.js +3 -0
- package/extensions/dm-subagents/src/runs/background/parallel-groups.js +1 -0
- package/extensions/dm-subagents/src/runs/background/result-watcher.js +8 -0
- package/extensions/dm-subagents/src/runs/background/run-id-resolver.js +4 -0
- package/extensions/dm-subagents/src/runs/background/run-status.js +23 -0
- package/extensions/dm-subagents/src/runs/background/scheduled-runs.js +4 -0
- package/extensions/dm-subagents/src/runs/background/stale-run-reconciler.js +11 -0
- package/extensions/dm-subagents/src/runs/background/subagent-runner.js +78 -0
- package/extensions/dm-subagents/src/runs/background/top-level-async.js +1 -0
- package/extensions/dm-subagents/src/runs/background/wait.js +11 -0
- package/extensions/dm-subagents/src/runs/foreground/chain-clarify.js +12 -0
- package/extensions/dm-subagents/src/runs/foreground/chain-execution.js +102 -0
- package/extensions/dm-subagents/src/runs/foreground/execution.js +51 -0
- package/extensions/dm-subagents/src/runs/foreground/subagent-executor.js +228 -0
- package/extensions/dm-subagents/src/runs/shared/acceptance.js +3 -0
- package/extensions/dm-subagents/src/runs/shared/chain-outputs.js +1 -0
- package/extensions/dm-subagents/src/runs/shared/completion-guard.js +3 -0
- package/extensions/dm-subagents/src/runs/shared/dm-args.js +1 -0
- package/extensions/dm-subagents/src/runs/shared/dm-spawn.js +1 -0
- package/extensions/dm-subagents/src/runs/shared/dynamic-fanout.js +1 -0
- package/extensions/dm-subagents/src/runs/shared/long-running-guard.js +1 -0
- package/extensions/dm-subagents/src/runs/shared/mcp-direct-tool-allowlist.js +1 -0
- package/extensions/dm-subagents/src/runs/shared/model-fallback.js +1 -0
- package/extensions/dm-subagents/src/runs/shared/model-scope.js +1 -0
- package/extensions/dm-subagents/src/runs/shared/nested-events.js +8 -0
- package/extensions/dm-subagents/src/runs/shared/nested-path.js +1 -0
- package/extensions/dm-subagents/src/runs/shared/nested-render.js +1 -0
- package/extensions/dm-subagents/src/runs/shared/parallel-utils.js +5 -0
- package/extensions/dm-subagents/src/runs/shared/run-history.js +5 -0
- package/extensions/dm-subagents/src/runs/shared/single-output.js +14 -0
- package/extensions/dm-subagents/src/runs/shared/structured-output.js +1 -0
- package/extensions/dm-subagents/src/runs/shared/subagent-control.js +5 -0
- package/extensions/dm-subagents/src/runs/shared/subagent-prompt-runtime.js +22 -0
- package/extensions/dm-subagents/src/runs/shared/tool-budget.js +1 -0
- package/extensions/dm-subagents/src/runs/shared/turn-budget.js +7 -0
- package/extensions/dm-subagents/src/runs/shared/workflow-graph.js +1 -0
- package/extensions/dm-subagents/src/runs/shared/worktree.js +3 -0
- package/extensions/dm-subagents/src/shared/artifacts.js +2 -0
- package/extensions/dm-subagents/src/shared/atomic-json.js +1 -0
- package/extensions/dm-subagents/src/shared/child-transcript.js +5 -0
- package/extensions/dm-subagents/src/shared/file-coalescer.js +1 -0
- package/extensions/dm-subagents/src/shared/fork-context.js +6 -0
- package/extensions/dm-subagents/src/shared/formatters.js +9 -0
- package/extensions/dm-subagents/src/shared/jsonl-writer.js +2 -0
- package/extensions/dm-subagents/src/shared/model-info.js +1 -0
- package/extensions/dm-subagents/src/shared/post-exit-stdio-guard.js +1 -0
- package/extensions/dm-subagents/src/shared/session-identity.js +1 -0
- package/extensions/dm-subagents/src/shared/session-tokens.js +2 -0
- package/extensions/dm-subagents/src/shared/settings.js +23 -0
- package/extensions/dm-subagents/src/shared/status-format.js +1 -0
- package/extensions/dm-subagents/src/shared/types.js +8 -0
- package/extensions/dm-subagents/src/shared/utils.js +2 -0
- package/extensions/dm-subagents/src/slash/prompt-template-bridge.js +1 -0
- package/extensions/dm-subagents/src/slash/prompt-workflows.js +7 -0
- package/extensions/dm-subagents/src/slash/slash-bridge.js +1 -0
- package/extensions/dm-subagents/src/slash/slash-commands.js +38 -0
- package/extensions/dm-subagents/src/slash/slash-live-state.js +6 -0
- package/extensions/dm-subagents/src/tui/render-helpers.js +1 -0
- package/extensions/dm-subagents/src/tui/render.js +4 -0
- package/extensions/dm-tasks/package.json +1 -30
- package/extensions/dm-tasks/src/auto-clear.js +1 -0
- package/extensions/dm-tasks/src/index.js +212 -0
- package/extensions/dm-tasks/src/process-tracker.js +1 -0
- package/extensions/dm-tasks/src/task-store.js +1 -0
- package/extensions/dm-tasks/src/tasks-config.js +1 -0
- package/extensions/dm-tasks/src/types.js +0 -0
- package/extensions/dm-tasks/src/ui/settings-menu.js +1 -0
- package/extensions/dm-tasks/src/ui/task-widget.js +1 -0
- package/extensions/dm-usage/index.js +9 -0
- package/extensions/dm-usage/package.json +1 -18
- package/extensions/greedysearch-dm/bin/search.mjs +51 -51
- package/extensions/greedysearch-dm/index.js +20 -0
- package/extensions/greedysearch-dm/package.json +1 -22
- package/extensions/greedysearch-dm/src/formatters/results.js +8 -0
- package/extensions/greedysearch-dm/src/formatters/sources.js +1 -0
- package/extensions/greedysearch-dm/src/formatters/synthesis.js +1 -0
- package/extensions/greedysearch-dm/src/search/research.mjs +59 -59
- package/extensions/greedysearch-dm/src/search/synthesis-runner.mjs +10 -10
- package/extensions/greedysearch-dm/src/tools/greedy-search-handler.js +20 -0
- package/extensions/greedysearch-dm/src/tools/shared.js +9 -0
- package/extensions/greedysearch-dm/src/types.js +0 -0
- package/extensions/greedysearch-dm/src/utils/helpers.js +1 -0
- package/package.json +1 -1
- package/extensions/dm-9router-ext/src/index.ts +0 -541
- package/extensions/dm-ask-user/index.ts +0 -857
- package/extensions/dm-context/src/context.ts +0 -158
- package/extensions/dm-context/src/index.ts +0 -439
- package/extensions/dm-context/src/utils.ts +0 -6
- package/extensions/dm-fff/src/index.ts +0 -1023
- package/extensions/dm-fff/src/query.ts +0 -87
- package/extensions/dm-goal/src/goal.ts +0 -1073
- package/extensions/dm-grill-me/index.ts +0 -1085
- package/extensions/dm-subagents/src/agents/agent-management.ts +0 -1052
- package/extensions/dm-subagents/src/agents/agent-memory.ts +0 -254
- package/extensions/dm-subagents/src/agents/agent-scope.ts +0 -6
- package/extensions/dm-subagents/src/agents/agent-selection.ts +0 -25
- package/extensions/dm-subagents/src/agents/agent-serializer.ts +0 -121
- package/extensions/dm-subagents/src/agents/agents.ts +0 -1553
- package/extensions/dm-subagents/src/agents/chain-serializer.ts +0 -277
- package/extensions/dm-subagents/src/agents/frontmatter.ts +0 -93
- package/extensions/dm-subagents/src/agents/identity.ts +0 -30
- package/extensions/dm-subagents/src/agents/proactive-skills.ts +0 -191
- package/extensions/dm-subagents/src/agents/skills.ts +0 -729
- package/extensions/dm-subagents/src/extension/config.ts +0 -39
- package/extensions/dm-subagents/src/extension/control-notices.ts +0 -92
- package/extensions/dm-subagents/src/extension/doctor.ts +0 -214
- package/extensions/dm-subagents/src/extension/fanout-child.ts +0 -172
- package/extensions/dm-subagents/src/extension/index.ts +0 -656
- package/extensions/dm-subagents/src/extension/rpc.ts +0 -369
- package/extensions/dm-subagents/src/extension/schemas.ts +0 -309
- package/extensions/dm-subagents/src/intercom/intercom-bridge.ts +0 -180
- package/extensions/dm-subagents/src/intercom/native-supervisor-channel.ts +0 -519
- package/extensions/dm-subagents/src/intercom/result-intercom.ts +0 -377
- package/extensions/dm-subagents/src/profiles/profiles.ts +0 -637
- package/extensions/dm-subagents/src/runs/background/async-execution.ts +0 -1065
- package/extensions/dm-subagents/src/runs/background/async-job-tracker.ts +0 -441
- package/extensions/dm-subagents/src/runs/background/async-resume.ts +0 -391
- package/extensions/dm-subagents/src/runs/background/async-status.ts +0 -395
- package/extensions/dm-subagents/src/runs/background/chain-append.ts +0 -282
- package/extensions/dm-subagents/src/runs/background/chain-root-attachment.ts +0 -191
- package/extensions/dm-subagents/src/runs/background/completion-batcher.ts +0 -166
- package/extensions/dm-subagents/src/runs/background/completion-dedupe.ts +0 -63
- package/extensions/dm-subagents/src/runs/background/control-channel.ts +0 -332
- package/extensions/dm-subagents/src/runs/background/fleet-view.ts +0 -515
- package/extensions/dm-subagents/src/runs/background/notify.ts +0 -225
- package/extensions/dm-subagents/src/runs/background/parallel-groups.ts +0 -45
- package/extensions/dm-subagents/src/runs/background/result-watcher.ts +0 -315
- package/extensions/dm-subagents/src/runs/background/run-id-resolver.ts +0 -84
- package/extensions/dm-subagents/src/runs/background/run-status.ts +0 -434
- package/extensions/dm-subagents/src/runs/background/scheduled-runs.ts +0 -514
- package/extensions/dm-subagents/src/runs/background/stale-run-reconciler.ts +0 -368
- package/extensions/dm-subagents/src/runs/background/subagent-runner.ts +0 -3171
- package/extensions/dm-subagents/src/runs/background/top-level-async.ts +0 -13
- package/extensions/dm-subagents/src/runs/background/wait.ts +0 -353
- package/extensions/dm-subagents/src/runs/foreground/chain-clarify.ts +0 -1333
- package/extensions/dm-subagents/src/runs/foreground/chain-execution.ts +0 -1313
- package/extensions/dm-subagents/src/runs/foreground/execution.ts +0 -1239
- package/extensions/dm-subagents/src/runs/foreground/subagent-executor.ts +0 -3613
- package/extensions/dm-subagents/src/runs/shared/acceptance.ts +0 -879
- package/extensions/dm-subagents/src/runs/shared/chain-outputs.ts +0 -116
- package/extensions/dm-subagents/src/runs/shared/completion-guard.ts +0 -147
- package/extensions/dm-subagents/src/runs/shared/dm-args.ts +0 -271
- package/extensions/dm-subagents/src/runs/shared/dm-spawn.ts +0 -147
- package/extensions/dm-subagents/src/runs/shared/dynamic-fanout.ts +0 -295
- package/extensions/dm-subagents/src/runs/shared/long-running-guard.ts +0 -175
- package/extensions/dm-subagents/src/runs/shared/mcp-direct-tool-allowlist.ts +0 -365
- package/extensions/dm-subagents/src/runs/shared/model-fallback.ts +0 -292
- package/extensions/dm-subagents/src/runs/shared/model-scope.ts +0 -128
- package/extensions/dm-subagents/src/runs/shared/nested-events.ts +0 -908
- package/extensions/dm-subagents/src/runs/shared/nested-path.ts +0 -52
- package/extensions/dm-subagents/src/runs/shared/nested-render.ts +0 -115
- package/extensions/dm-subagents/src/runs/shared/parallel-utils.ts +0 -198
- package/extensions/dm-subagents/src/runs/shared/run-history.ts +0 -60
- package/extensions/dm-subagents/src/runs/shared/single-output.ts +0 -180
- package/extensions/dm-subagents/src/runs/shared/structured-output.ts +0 -77
- package/extensions/dm-subagents/src/runs/shared/subagent-control.ts +0 -223
- package/extensions/dm-subagents/src/runs/shared/subagent-prompt-runtime.ts +0 -342
- package/extensions/dm-subagents/src/runs/shared/tool-budget.ts +0 -74
- package/extensions/dm-subagents/src/runs/shared/turn-budget.ts +0 -52
- package/extensions/dm-subagents/src/runs/shared/workflow-graph.ts +0 -206
- package/extensions/dm-subagents/src/runs/shared/worktree.ts +0 -600
- package/extensions/dm-subagents/src/shared/artifacts.ts +0 -113
- package/extensions/dm-subagents/src/shared/atomic-json.ts +0 -86
- package/extensions/dm-subagents/src/shared/child-transcript.ts +0 -212
- package/extensions/dm-subagents/src/shared/file-coalescer.ts +0 -40
- package/extensions/dm-subagents/src/shared/fork-context.ts +0 -194
- package/extensions/dm-subagents/src/shared/formatters.ts +0 -133
- package/extensions/dm-subagents/src/shared/jsonl-writer.ts +0 -81
- package/extensions/dm-subagents/src/shared/model-info.ts +0 -78
- package/extensions/dm-subagents/src/shared/post-exit-stdio-guard.ts +0 -85
- package/extensions/dm-subagents/src/shared/session-identity.ts +0 -10
- package/extensions/dm-subagents/src/shared/session-tokens.ts +0 -44
- package/extensions/dm-subagents/src/shared/settings.ts +0 -450
- package/extensions/dm-subagents/src/shared/status-format.ts +0 -49
- package/extensions/dm-subagents/src/shared/types.ts +0 -1257
- package/extensions/dm-subagents/src/shared/utils.ts +0 -554
- package/extensions/dm-subagents/src/slash/prompt-template-bridge.ts +0 -420
- package/extensions/dm-subagents/src/slash/prompt-workflows.ts +0 -330
- package/extensions/dm-subagents/src/slash/slash-bridge.ts +0 -176
- package/extensions/dm-subagents/src/slash/slash-commands.ts +0 -1296
- package/extensions/dm-subagents/src/slash/slash-live-state.ts +0 -292
- package/extensions/dm-subagents/src/tui/render-helpers.ts +0 -80
- package/extensions/dm-subagents/src/tui/render.ts +0 -1748
- package/extensions/dm-tasks/src/auto-clear.ts +0 -91
- package/extensions/dm-tasks/src/index.ts +0 -1145
- package/extensions/dm-tasks/src/process-tracker.ts +0 -140
- package/extensions/dm-tasks/src/task-store.ts +0 -305
- package/extensions/dm-tasks/src/tasks-config.ts +0 -23
- package/extensions/dm-tasks/src/types.ts +0 -40
- package/extensions/dm-tasks/src/ui/settings-menu.ts +0 -100
- package/extensions/dm-tasks/src/ui/task-widget.ts +0 -265
- package/extensions/dm-usage/index.ts +0 -1718
- package/extensions/greedysearch-dm/index.ts +0 -177
- package/extensions/greedysearch-dm/src/formatters/results.ts +0 -163
- package/extensions/greedysearch-dm/src/formatters/sources.ts +0 -116
- package/extensions/greedysearch-dm/src/formatters/synthesis.ts +0 -87
- package/extensions/greedysearch-dm/src/tools/greedy-search-handler.ts +0 -370
- package/extensions/greedysearch-dm/src/tools/shared.ts +0 -187
- package/extensions/greedysearch-dm/src/types.ts +0 -110
- 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
|
-
}
|