@duckmind/dm-darwin-x64 0.43.2 → 0.43.8
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 -49
- 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 +135 -135
- 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/engines.mjs +9 -9
- package/extensions/greedysearch-dm/src/search/paths.mjs +1 -0
- package/extensions/greedysearch-dm/src/search/research.mjs +100 -100
- 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
package/dm
CHANGED
|
Binary file
|
|
@@ -234,13 +234,21 @@
|
|
|
234
234
|
"dependencies_installed": false,
|
|
235
235
|
"dependency_mode": "none",
|
|
236
236
|
"dependencies_declared": [],
|
|
237
|
-
"dependency_patches": [
|
|
237
|
+
"dependency_patches": [
|
|
238
|
+
"dm.extensions ts->js",
|
|
239
|
+
"drop-devDependencies",
|
|
240
|
+
"drop-scripts"
|
|
241
|
+
],
|
|
238
242
|
"javascript_bundle_minify": {
|
|
239
243
|
"tool": "bun build --minify",
|
|
240
|
-
"files": [
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
+
"files": [
|
|
245
|
+
"src/context.js",
|
|
246
|
+
"src/index.js",
|
|
247
|
+
"src/utils.js"
|
|
248
|
+
],
|
|
249
|
+
"file_count": 3,
|
|
250
|
+
"before_bytes": 25960,
|
|
251
|
+
"after_bytes": 11302,
|
|
244
252
|
"externals": [
|
|
245
253
|
"@duckmind/dm-agent-core",
|
|
246
254
|
"@duckmind/dm-ai",
|
|
@@ -265,15 +273,113 @@
|
|
|
265
273
|
"jiti",
|
|
266
274
|
"typebox"
|
|
267
275
|
],
|
|
268
|
-
"dependency_patches": [
|
|
276
|
+
"dependency_patches": [
|
|
277
|
+
"dm.extensions ts->js",
|
|
278
|
+
"drop-dependencies",
|
|
279
|
+
"drop-devDependencies",
|
|
280
|
+
"drop-peerDependencies",
|
|
281
|
+
"drop-scripts"
|
|
282
|
+
],
|
|
269
283
|
"javascript_bundle_minify": {
|
|
270
284
|
"tool": "bun build --minify",
|
|
271
285
|
"files": [
|
|
272
|
-
"install.mjs"
|
|
286
|
+
"install.mjs",
|
|
287
|
+
"src/agents/agent-management.js",
|
|
288
|
+
"src/agents/agent-memory.js",
|
|
289
|
+
"src/agents/agent-scope.js",
|
|
290
|
+
"src/agents/agent-selection.js",
|
|
291
|
+
"src/agents/agent-serializer.js",
|
|
292
|
+
"src/agents/agents.js",
|
|
293
|
+
"src/agents/chain-serializer.js",
|
|
294
|
+
"src/agents/frontmatter.js",
|
|
295
|
+
"src/agents/identity.js",
|
|
296
|
+
"src/agents/proactive-skills.js",
|
|
297
|
+
"src/agents/skills.js",
|
|
298
|
+
"src/extension/config.js",
|
|
299
|
+
"src/extension/control-notices.js",
|
|
300
|
+
"src/extension/doctor.js",
|
|
301
|
+
"src/extension/fanout-child.js",
|
|
302
|
+
"src/extension/index.js",
|
|
303
|
+
"src/extension/rpc.js",
|
|
304
|
+
"src/extension/schemas.js",
|
|
305
|
+
"src/extension/tool-description.js",
|
|
306
|
+
"src/intercom/intercom-bridge.js",
|
|
307
|
+
"src/intercom/native-supervisor-channel.js",
|
|
308
|
+
"src/intercom/result-intercom.js",
|
|
309
|
+
"src/profiles/profiles.js",
|
|
310
|
+
"src/runs/background/async-execution.js",
|
|
311
|
+
"src/runs/background/async-job-tracker.js",
|
|
312
|
+
"src/runs/background/async-resume.js",
|
|
313
|
+
"src/runs/background/async-status.js",
|
|
314
|
+
"src/runs/background/chain-append.js",
|
|
315
|
+
"src/runs/background/chain-root-attachment.js",
|
|
316
|
+
"src/runs/background/completion-batcher.js",
|
|
317
|
+
"src/runs/background/completion-dedupe.js",
|
|
318
|
+
"src/runs/background/control-channel.js",
|
|
319
|
+
"src/runs/background/fleet-view.js",
|
|
320
|
+
"src/runs/background/notify.js",
|
|
321
|
+
"src/runs/background/parallel-groups.js",
|
|
322
|
+
"src/runs/background/result-watcher.js",
|
|
323
|
+
"src/runs/background/run-id-resolver.js",
|
|
324
|
+
"src/runs/background/run-status.js",
|
|
325
|
+
"src/runs/background/scheduled-runs.js",
|
|
326
|
+
"src/runs/background/stale-run-reconciler.js",
|
|
327
|
+
"src/runs/background/subagent-runner.js",
|
|
328
|
+
"src/runs/background/top-level-async.js",
|
|
329
|
+
"src/runs/background/wait.js",
|
|
330
|
+
"src/runs/foreground/chain-clarify.js",
|
|
331
|
+
"src/runs/foreground/chain-execution.js",
|
|
332
|
+
"src/runs/foreground/execution.js",
|
|
333
|
+
"src/runs/foreground/subagent-executor.js",
|
|
334
|
+
"src/runs/shared/acceptance.js",
|
|
335
|
+
"src/runs/shared/chain-outputs.js",
|
|
336
|
+
"src/runs/shared/completion-guard.js",
|
|
337
|
+
"src/runs/shared/dm-args.js",
|
|
338
|
+
"src/runs/shared/dm-spawn.js",
|
|
339
|
+
"src/runs/shared/dynamic-fanout.js",
|
|
340
|
+
"src/runs/shared/long-running-guard.js",
|
|
341
|
+
"src/runs/shared/mcp-direct-tool-allowlist.js",
|
|
342
|
+
"src/runs/shared/model-fallback.js",
|
|
343
|
+
"src/runs/shared/model-scope.js",
|
|
344
|
+
"src/runs/shared/nested-events.js",
|
|
345
|
+
"src/runs/shared/nested-path.js",
|
|
346
|
+
"src/runs/shared/nested-render.js",
|
|
347
|
+
"src/runs/shared/parallel-utils.js",
|
|
348
|
+
"src/runs/shared/run-history.js",
|
|
349
|
+
"src/runs/shared/single-output.js",
|
|
350
|
+
"src/runs/shared/structured-output.js",
|
|
351
|
+
"src/runs/shared/subagent-control.js",
|
|
352
|
+
"src/runs/shared/subagent-prompt-runtime.js",
|
|
353
|
+
"src/runs/shared/tool-budget.js",
|
|
354
|
+
"src/runs/shared/turn-budget.js",
|
|
355
|
+
"src/runs/shared/workflow-graph.js",
|
|
356
|
+
"src/runs/shared/worktree.js",
|
|
357
|
+
"src/shared/artifacts.js",
|
|
358
|
+
"src/shared/atomic-json.js",
|
|
359
|
+
"src/shared/child-transcript.js",
|
|
360
|
+
"src/shared/file-coalescer.js",
|
|
361
|
+
"src/shared/fork-context.js",
|
|
362
|
+
"src/shared/formatters.js",
|
|
363
|
+
"src/shared/jsonl-writer.js",
|
|
364
|
+
"src/shared/model-info.js",
|
|
365
|
+
"src/shared/post-exit-stdio-guard.js",
|
|
366
|
+
"src/shared/session-identity.js",
|
|
367
|
+
"src/shared/session-tokens.js",
|
|
368
|
+
"src/shared/settings.js",
|
|
369
|
+
"src/shared/status-format.js",
|
|
370
|
+
"src/shared/types.js",
|
|
371
|
+
"src/shared/utils.js",
|
|
372
|
+
"src/slash/prompt-template-bridge.js",
|
|
373
|
+
"src/slash/prompt-workflows.js",
|
|
374
|
+
"src/slash/slash-bridge.js",
|
|
375
|
+
"src/slash/slash-commands.js",
|
|
376
|
+
"src/slash/slash-live-state.js",
|
|
377
|
+
"src/tui/render-helpers.js",
|
|
378
|
+
"src/tui/render.js"
|
|
273
379
|
],
|
|
274
|
-
"file_count":
|
|
275
|
-
"before_bytes":
|
|
276
|
-
"after_bytes":
|
|
380
|
+
"file_count": 93,
|
|
381
|
+
"before_bytes": 1543524,
|
|
382
|
+
"after_bytes": 3096507,
|
|
277
383
|
"externals": [
|
|
278
384
|
"@duckmind/dm-agent-core",
|
|
279
385
|
"@duckmind/dm-ai",
|
|
@@ -297,13 +403,22 @@
|
|
|
297
403
|
"@ff-labs/fff-node",
|
|
298
404
|
"@sinclair/typebox"
|
|
299
405
|
],
|
|
300
|
-
"dependency_patches": [
|
|
406
|
+
"dependency_patches": [
|
|
407
|
+
"dm.extensions ts->js",
|
|
408
|
+
"drop-dependencies",
|
|
409
|
+
"drop-devDependencies",
|
|
410
|
+
"drop-peerDependencies",
|
|
411
|
+
"drop-scripts"
|
|
412
|
+
],
|
|
301
413
|
"javascript_bundle_minify": {
|
|
302
414
|
"tool": "bun build --minify",
|
|
303
|
-
"files": [
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
415
|
+
"files": [
|
|
416
|
+
"src/index.js",
|
|
417
|
+
"src/query.js"
|
|
418
|
+
],
|
|
419
|
+
"file_count": 2,
|
|
420
|
+
"before_bytes": 39306,
|
|
421
|
+
"after_bytes": 18215,
|
|
307
422
|
"externals": [
|
|
308
423
|
"@duckmind/dm-agent-core",
|
|
309
424
|
"@duckmind/dm-ai",
|
|
@@ -326,13 +441,27 @@
|
|
|
326
441
|
"dependencies_declared": [
|
|
327
442
|
"typebox"
|
|
328
443
|
],
|
|
329
|
-
"dependency_patches": [
|
|
444
|
+
"dependency_patches": [
|
|
445
|
+
"dm.extensions ts->js",
|
|
446
|
+
"drop-dependencies",
|
|
447
|
+
"drop-devDependencies",
|
|
448
|
+
"drop-scripts"
|
|
449
|
+
],
|
|
330
450
|
"javascript_bundle_minify": {
|
|
331
451
|
"tool": "bun build --minify",
|
|
332
|
-
"files": [
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
452
|
+
"files": [
|
|
453
|
+
"src/auto-clear.js",
|
|
454
|
+
"src/index.js",
|
|
455
|
+
"src/process-tracker.js",
|
|
456
|
+
"src/task-store.js",
|
|
457
|
+
"src/tasks-config.js",
|
|
458
|
+
"src/types.js",
|
|
459
|
+
"src/ui/settings-menu.js",
|
|
460
|
+
"src/ui/task-widget.js"
|
|
461
|
+
],
|
|
462
|
+
"file_count": 8,
|
|
463
|
+
"before_bytes": 79022,
|
|
464
|
+
"after_bytes": 49861,
|
|
336
465
|
"externals": [
|
|
337
466
|
"@biomejs/biome",
|
|
338
467
|
"@duckmind/dm-agent-core",
|
|
@@ -361,7 +490,13 @@
|
|
|
361
490
|
"pdf-parse",
|
|
362
491
|
"turndown"
|
|
363
492
|
],
|
|
364
|
-
"dependency_patches": [
|
|
493
|
+
"dependency_patches": [
|
|
494
|
+
"dm.extensions ts->js",
|
|
495
|
+
"drop-dependencies",
|
|
496
|
+
"drop-devDependencies",
|
|
497
|
+
"drop-peerDependencies",
|
|
498
|
+
"drop-scripts"
|
|
499
|
+
],
|
|
365
500
|
"javascript_bundle_minify": {
|
|
366
501
|
"tool": "bun build --minify",
|
|
367
502
|
"files": [
|
|
@@ -386,7 +521,11 @@
|
|
|
386
521
|
"extractors/perplexity.mjs",
|
|
387
522
|
"extractors/selectors.mjs",
|
|
388
523
|
"extractors/semantic-scholar.mjs",
|
|
524
|
+
"index.js",
|
|
389
525
|
"src/fetcher.mjs",
|
|
526
|
+
"src/formatters/results.js",
|
|
527
|
+
"src/formatters/sources.js",
|
|
528
|
+
"src/formatters/synthesis.js",
|
|
390
529
|
"src/github.mjs",
|
|
391
530
|
"src/reddit.mjs",
|
|
392
531
|
"src/search/browser-lifecycle.mjs",
|
|
@@ -398,6 +537,7 @@
|
|
|
398
537
|
"src/search/fetch-source.mjs",
|
|
399
538
|
"src/search/file-sources.mjs",
|
|
400
539
|
"src/search/output.mjs",
|
|
540
|
+
"src/search/paths.mjs",
|
|
401
541
|
"src/search/pdf.mjs",
|
|
402
542
|
"src/search/query.mjs",
|
|
403
543
|
"src/search/recovery.mjs",
|
|
@@ -405,14 +545,18 @@
|
|
|
405
545
|
"src/search/sources.mjs",
|
|
406
546
|
"src/search/synthesis-runner.mjs",
|
|
407
547
|
"src/search/synthesis.mjs",
|
|
548
|
+
"src/tools/greedy-search-handler.js",
|
|
549
|
+
"src/tools/shared.js",
|
|
550
|
+
"src/types.js",
|
|
408
551
|
"src/utils/browser-executable.mjs",
|
|
409
552
|
"src/utils/content.mjs",
|
|
553
|
+
"src/utils/helpers.js",
|
|
410
554
|
"src/utils/node-runtime.mjs",
|
|
411
555
|
"src/utils/system-cmds.mjs"
|
|
412
556
|
],
|
|
413
|
-
"file_count":
|
|
414
|
-
"before_bytes":
|
|
415
|
-
"after_bytes":
|
|
557
|
+
"file_count": 53,
|
|
558
|
+
"before_bytes": 514356,
|
|
559
|
+
"after_bytes": 807411,
|
|
416
560
|
"externals": [
|
|
417
561
|
"@duckmind/dm-agent-core",
|
|
418
562
|
"@duckmind/dm-ai",
|
|
@@ -439,13 +583,19 @@
|
|
|
439
583
|
"@duckmind/dm-tui",
|
|
440
584
|
"@sinclair/typebox"
|
|
441
585
|
],
|
|
442
|
-
"dependency_patches": [
|
|
586
|
+
"dependency_patches": [
|
|
587
|
+
"dm.extensions ts->js",
|
|
588
|
+
"drop-devDependencies",
|
|
589
|
+
"drop-peerDependencies"
|
|
590
|
+
],
|
|
443
591
|
"javascript_bundle_minify": {
|
|
444
592
|
"tool": "bun build --minify",
|
|
445
|
-
"files": [
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
"
|
|
593
|
+
"files": [
|
|
594
|
+
"index.js"
|
|
595
|
+
],
|
|
596
|
+
"file_count": 1,
|
|
597
|
+
"before_bytes": 30280,
|
|
598
|
+
"after_bytes": 12912,
|
|
449
599
|
"externals": [
|
|
450
600
|
"@duckmind/dm-agent-core",
|
|
451
601
|
"@duckmind/dm-ai",
|
|
@@ -466,13 +616,19 @@
|
|
|
466
616
|
"@duckmind/dm-coding-agent",
|
|
467
617
|
"@duckmind/dm-tui"
|
|
468
618
|
],
|
|
469
|
-
"dependency_patches": [
|
|
619
|
+
"dependency_patches": [
|
|
620
|
+
"dm.extensions ts->js",
|
|
621
|
+
"drop-devDependencies",
|
|
622
|
+
"drop-peerDependencies"
|
|
623
|
+
],
|
|
470
624
|
"javascript_bundle_minify": {
|
|
471
625
|
"tool": "bun build --minify",
|
|
472
|
-
"files": [
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
"
|
|
626
|
+
"files": [
|
|
627
|
+
"index.js"
|
|
628
|
+
],
|
|
629
|
+
"file_count": 1,
|
|
630
|
+
"before_bytes": 59346,
|
|
631
|
+
"after_bytes": 26869,
|
|
476
632
|
"externals": [
|
|
477
633
|
"@duckmind/dm-agent-core",
|
|
478
634
|
"@duckmind/dm-ai",
|
|
@@ -493,13 +649,22 @@
|
|
|
493
649
|
"@duckmind/dm-coding-agent",
|
|
494
650
|
"typebox"
|
|
495
651
|
],
|
|
496
|
-
"dependency_patches": [
|
|
652
|
+
"dependency_patches": [
|
|
653
|
+
"dm.extensions ts->js",
|
|
654
|
+
"main ts->js",
|
|
655
|
+
"drop-dependencies",
|
|
656
|
+
"drop-devDependencies",
|
|
657
|
+
"drop-peerDependencies",
|
|
658
|
+
"drop-scripts"
|
|
659
|
+
],
|
|
497
660
|
"javascript_bundle_minify": {
|
|
498
661
|
"tool": "bun build --minify",
|
|
499
|
-
"files": [
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
"
|
|
662
|
+
"files": [
|
|
663
|
+
"src/goal.js"
|
|
664
|
+
],
|
|
665
|
+
"file_count": 1,
|
|
666
|
+
"before_bytes": 36860,
|
|
667
|
+
"after_bytes": 18158,
|
|
503
668
|
"externals": [
|
|
504
669
|
"@biomejs/biome",
|
|
505
670
|
"@duckmind/dm-agent-core",
|
|
@@ -524,13 +689,21 @@
|
|
|
524
689
|
"@duckmind/dm-coding-agent",
|
|
525
690
|
"typebox"
|
|
526
691
|
],
|
|
527
|
-
"dependency_patches": [
|
|
692
|
+
"dependency_patches": [
|
|
693
|
+
"dm.extensions ts->js",
|
|
694
|
+
"main ts->js",
|
|
695
|
+
"drop-devDependencies",
|
|
696
|
+
"drop-peerDependencies",
|
|
697
|
+
"drop-scripts"
|
|
698
|
+
],
|
|
528
699
|
"javascript_bundle_minify": {
|
|
529
700
|
"tool": "bun build --minify",
|
|
530
|
-
"files": [
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
"
|
|
701
|
+
"files": [
|
|
702
|
+
"src/index.js"
|
|
703
|
+
],
|
|
704
|
+
"file_count": 1,
|
|
705
|
+
"before_bytes": 17266,
|
|
706
|
+
"after_bytes": 6552,
|
|
534
707
|
"externals": [
|
|
535
708
|
"@duckmind/dm-agent-core",
|
|
536
709
|
"@duckmind/dm-ai",
|
|
@@ -554,13 +727,21 @@
|
|
|
554
727
|
"@duckmind/dm-tui",
|
|
555
728
|
"typebox"
|
|
556
729
|
],
|
|
557
|
-
"dependency_patches": [
|
|
730
|
+
"dependency_patches": [
|
|
731
|
+
"dm.extensions ts->js",
|
|
732
|
+
"drop-dependencies",
|
|
733
|
+
"drop-devDependencies",
|
|
734
|
+
"drop-peerDependencies",
|
|
735
|
+
"drop-scripts"
|
|
736
|
+
],
|
|
558
737
|
"javascript_bundle_minify": {
|
|
559
738
|
"tool": "bun build --minify",
|
|
560
|
-
"files": [
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
"
|
|
739
|
+
"files": [
|
|
740
|
+
"index.js"
|
|
741
|
+
],
|
|
742
|
+
"file_count": 1,
|
|
743
|
+
"before_bytes": 53082,
|
|
744
|
+
"after_bytes": 37967,
|
|
564
745
|
"externals": [
|
|
565
746
|
"@duckmind/dm-agent-core",
|
|
566
747
|
"@duckmind/dm-ai",
|
|
@@ -579,6 +760,10 @@
|
|
|
579
760
|
"bundle_mode": "local-source-package",
|
|
580
761
|
"dependencies_installed": false,
|
|
581
762
|
"dependency_mode": "none",
|
|
763
|
+
"dependency_patches": [
|
|
764
|
+
"drop-devDependencies",
|
|
765
|
+
"drop-peerDependencies"
|
|
766
|
+
],
|
|
582
767
|
"javascript_bundle_minify": {
|
|
583
768
|
"tool": "bun build --minify",
|
|
584
769
|
"files": [
|
|
@@ -605,6 +790,10 @@
|
|
|
605
790
|
"bundle_mode": "local-source-package",
|
|
606
791
|
"dependencies_installed": false,
|
|
607
792
|
"dependency_mode": "none",
|
|
793
|
+
"dependency_patches": [
|
|
794
|
+
"drop-devDependencies",
|
|
795
|
+
"drop-peerDependencies"
|
|
796
|
+
],
|
|
608
797
|
"javascript_bundle_minify": {
|
|
609
798
|
"tool": "bun build --minify",
|
|
610
799
|
"files": [
|
|
@@ -630,6 +819,10 @@
|
|
|
630
819
|
"bundle_mode": "local-source-package",
|
|
631
820
|
"dependencies_installed": false,
|
|
632
821
|
"dependency_mode": "none",
|
|
822
|
+
"dependency_patches": [
|
|
823
|
+
"drop-devDependencies",
|
|
824
|
+
"drop-peerDependencies"
|
|
825
|
+
],
|
|
633
826
|
"javascript_bundle_minify": {
|
|
634
827
|
"tool": "bun build --minify",
|
|
635
828
|
"files": [
|
|
@@ -13,34 +13,17 @@
|
|
|
13
13
|
],
|
|
14
14
|
"license": "MIT",
|
|
15
15
|
"author": "Irfan Sofyana <mail@irfansp.dev>",
|
|
16
|
-
"repository": {
|
|
17
|
-
"type": "git",
|
|
18
|
-
"url": "git+https://github.com/que-nguyen/dm.git",
|
|
19
|
-
"directory": "extensions/dm-9router-ext"
|
|
20
|
-
},
|
|
21
16
|
"type": "module",
|
|
22
|
-
"main": "./src/index.
|
|
17
|
+
"main": "./src/index.js",
|
|
23
18
|
"files": [
|
|
24
19
|
"src",
|
|
25
20
|
"README.md",
|
|
26
21
|
"package.json",
|
|
27
22
|
"tsconfig.json"
|
|
28
23
|
],
|
|
29
|
-
"scripts": {
|
|
30
|
-
"typecheck": "tsc"
|
|
31
|
-
},
|
|
32
|
-
"peerDependencies": {
|
|
33
|
-
"typebox": "*",
|
|
34
|
-
"@duckmind/dm-coding-agent": "*"
|
|
35
|
-
},
|
|
36
|
-
"devDependencies": {
|
|
37
|
-
"@types/node": "^22.0.0",
|
|
38
|
-
"typescript": "^5.0.0",
|
|
39
|
-
"@duckmind/dm-coding-agent": "file:../../dm-mono/packages/coding-agent"
|
|
40
|
-
},
|
|
41
24
|
"dm": {
|
|
42
25
|
"extensions": [
|
|
43
|
-
"./src/index.
|
|
26
|
+
"./src/index.js"
|
|
44
27
|
]
|
|
45
28
|
}
|
|
46
29
|
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import{existsSync as k,mkdirSync as T,readFileSync as N,writeFileSync as P}from"node:fs";import{homedir as _}from"node:os";import{dirname as R,join as p}from"node:path";import{Type as y}from"typebox";var C="http://localhost:20128",u=process.env.NINE_ROUTER_BASE_URL,M=process.env.NINE_ROUTER_API_KEY,b=p(_(),".dm","agent","9router-config.json"),S="9router-config",x="9router-last-route",v=["x-9router-model","x-routed-model","x-actual-model","x-upstream-model","x-provider-model"];function G(q){return q.replace(/\/$/,"")}function I(q){if(q.length<=8)return"●".repeat(q.length);return q.slice(0,4)+"●".repeat(Math.max(0,q.length-8))+q.slice(-4)}function A(q){return{baseUrl:G(u||q.baseUrl),apiKey:M||q.apiKey}}function E(){try{if(!k(b))return null;let q=JSON.parse(N(b,"utf8"));if(!q.baseUrl||typeof q.baseUrl!=="string")return null;return{baseUrl:G(q.baseUrl),apiKey:typeof q.apiKey==="string"&&q.apiKey.trim()?q.apiKey.trim():void 0}}catch(q){return console.error("[dm-9router-ext] Failed to load persisted config:",q),null}}function a(q){try{T(R(b),{recursive:!0}),P(b,`${JSON.stringify({baseUrl:q.baseUrl,apiKey:q.apiKey},null,2)}
|
|
2
|
+
`,{mode:384})}catch(J){console.error("[dm-9router-ext] Failed to persist config:",J)}}function f(){return A(E()||{baseUrl:C,apiKey:void 0})}function g(q){for(let J of q.sessionManager.getEntries())if(J.type==="custom"&&J.customType===S){let Q=J.data;if(Q?.baseUrl)return A({baseUrl:G(Q.baseUrl),apiKey:Q.apiKey})}return null}function O(q,J){a(J),q.appendEntry(S,{baseUrl:J.baseUrl,apiKey:J.apiKey})}async function K(q,J){let Q={Accept:"application/json"};if(q.apiKey)Q.Authorization=`Bearer ${q.apiKey}`;let $=await fetch(`${q.baseUrl}/v1/models`,{method:"GET",headers:Q,signal:J});if(!$.ok){let w=await $.text().catch(()=>"");throw Error(`9router returned ${$.status}: ${w||$.statusText}`)}return(await $.json()).data||[]}async function h(q,J){try{let Q={};if(q.apiKey)Q.Authorization=`Bearer ${q.apiKey}`;let $=await fetch(`${q.baseUrl}/v1/models`,{method:"GET",headers:Q,signal:J});if($.ok)return{ok:!0};return{ok:!1,error:`HTTP ${$.status}: ${$.statusText}`}}catch(Q){return{ok:!1,error:Q instanceof Error?Q.message:String(Q)}}}function l(q){let J=q.owned_by==="combo";return{id:q.id,name:J?`\uD83D\uDD00 ${q.id}`:q.id,reasoning:!1,input:["text"],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:128000,maxTokens:4096,compat:{supportsDeveloperRole:!1,supportsReasoningEffort:!1}}}function L(q,J,Q){q.registerProvider("9router",{name:"9router",baseUrl:`${J.baseUrl}/v1`,apiKey:J.apiKey||"9router-no-api-key",api:"openai-completions",models:Q.map(l)})}function F(q){q.unregisterProvider("9router")}async function m(q){let J=f(),Q=[],$,B,w=!1;try{let V=await K(J);Q=V,w=!0,L(q,J,V)}catch(V){F(q)}q.on("session_start",async(V,W)=>{let X=g(W);if(!E()&&X){J=X,O(q,J);try{let j=await K(J,W.signal);Q=j,w=!0,L(q,J,j)}catch(j){w=!1,console.error("[dm-9router-ext] Failed to refresh migrated config:",j)}}if(w&&Q.length>0)W.ui.notify(`9router connected — ${Q.length} models available`,"info")}),q.on("after_provider_response",(V)=>{if(V.status>=400||B!=="9router")return;for(let W of v){let X=V.headers[W];if(X&&typeof X==="string"){$=X,q.appendEntry(x,{model:X,timestamp:Date.now()});break}}}),q.on("model_select",async(V)=>{if(B=V.model.provider,V.model.provider!=="9router")$=void 0}),q.registerCommand("9router-status",{description:"Show 9router connection status and configuration",handler:async(V,W)=>{let X=await h(J,W.signal),j=["\uD83D\uDD17 9router Status","",`Base URL: ${J.baseUrl}`,`API Key: ${J.apiKey?I(J.apiKey):"not set"}`,`Connection: ${X.ok?"\uD83D\uDFE2 connected":`\uD83D\uDD34 ${X.error||"disconnected"}`}`,`Models: ${Q.length} available`];if($)j.push(`Last routed: ${$}`);let D=Q.filter((Z)=>Z.owned_by==="combo"),Y=Q.filter((Z)=>Z.owned_by!=="combo");if(Y.length>0)j.push("",`Regular models: ${Y.length}`);if(D.length>0)j.push(`Combos: ${D.length}`);W.ui.notify(j.join(`
|
|
3
|
+
`),X.ok?"info":"warning")}}),q.registerCommand("9router-models",{description:"Browse 9router available models and combos",handler:async(V,W)=>{if(Q.length===0){W.ui.notify("No 9router models discovered. Check connection with /9router-status","warning");return}let X=Q.map((Z)=>{let H=Z.owned_by==="combo";return{value:Z.id,label:H?`\uD83D\uDD00 ${Z.id}`:Z.id}}),j=await W.ui.select("Select a 9router model to use:",X.map((Z)=>Z.label));if(!j)return;let D=X.find((Z)=>Z.label===j)?.value;if(!D)return;let Y=`9router/${D}`;W.ui.notify(`Switching to ${Y}...`,"info"),q.sendUserMessage(`/model ${Y}`,{deliverAs:"followUp"})}}),q.registerCommand("9router-config",{description:"Configure 9router base URL and API key",handler:async(V,W)=>{let j=(await h(J,W.signal)).ok?"\uD83D\uDFE2 connected":"\uD83D\uDD34 disconnected",D=J.apiKey?"●●●●●●●● (set)":"not set",Y=["Current config:",` Base URL: ${J.baseUrl}`,` API Key: ${J.apiKey?I(J.apiKey):"not set"}`,` Status: ${j}`,"","Enter new values (press Enter to keep current):"].join(`
|
|
4
|
+
`);W.ui.notify(Y,"info");let Z=await W.ui.input("Base URL",J.baseUrl);if(Z===void 0)return;let H=await W.ui.input("API key (press Enter to keep current, leave blank to remove):",J.apiKey||"");if(H===void 0)return;J={baseUrl:G(Z),apiKey:H.trim()||void 0},O(q,J);try{let z=await K(J,W.signal);Q=z,w=!0,L(q,J,z),W.ui.notify(`9router updated — ${z.length} models at ${J.baseUrl}`,"info")}catch(z){w=!1,F(q);let U=z instanceof Error?z.message:String(z);W.ui.notify(`Failed to connect: ${U}`,"error")}}}),q.registerCommand("9router-reload",{description:"Reload models from 9router",handler:async(V,W)=>{try{let X=await K(J,W.signal);Q=X,w=!0,L(q,J,X),W.ui.notify(`9router reloaded — ${X.length} models`,"info")}catch(X){w=!1,F(q);let j=X instanceof Error?X.message:String(X);W.ui.notify(`Reload failed: ${j}`,"error")}}}),q.registerTool({name:"ninerouter_status",label:"9router Status",description:"Check 9router connection status and list available models",parameters:y.Object({}),async execute(V,W,X,j,D){let Y=await h(J,D.signal),Z=Q.filter((z)=>z.owned_by==="combo"),H=Q.filter((z)=>z.owned_by!=="combo");return{content:[{type:"text",text:[`9router: ${Y.ok?"connected":`disconnected (${Y.error})`}`,`Base URL: ${J.baseUrl}`,`Total models: ${Q.length}`,` Regular: ${H.length}`,` Combos: ${Z.length}`,$?`Last routed model: ${$}`:""].filter(Boolean).join(`
|
|
5
|
+
`)}],details:{connected:Y.ok,baseUrl:J.baseUrl,modelCount:Q.length,regularCount:H.length,comboCount:Z.length,lastRoutedModel:$,models:Q.map((z)=>z.id)}}}})}export{m as default};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import{Editor as _j,Key as N,matchesKey as P,Text as r,truncateToWidth as Dj,visibleWidth as $j}from"@duckmind/dm-tui";import{Type as Z}from"@sinclair/typebox";var zj=Z.Object({value:Z.String({description:"Value returned when selected"}),label:Z.String({description:"Display label"}),description:Z.Optional(Z.String({description:"Help text shown below the label"}))}),Nj=Z.Object({id:Z.String({description:"Unique identifier for this question"}),type:Z.Unsafe({type:"string",enum:["radio","checkbox","text"],description:"Question type: radio (single-select), checkbox (multi-select), or text (free input)"}),prompt:Z.String({description:"The question text to display"}),label:Z.Optional(Z.String({description:"Short label for tab bar (defaults to Q1, Q2...)"})),options:Z.Optional(Z.Array(zj,{description:"Options for radio/checkbox types"})),allowOther:Z.Optional(Z.Boolean({description:"Add an 'Other...' option with text input (default: true for radio/checkbox)"})),required:Z.Optional(Z.Boolean({description:"Whether an answer is required (default: true)"})),placeholder:Z.Optional(Z.String({description:"Placeholder for text inputs"})),default:Z.Optional(Z.Union([Z.String(),Z.Array(Z.String())],{description:"Default value(s). String for radio/text, string[] for checkbox"}))}),Pj=Z.Object({title:Z.Optional(Z.String({description:"Form title displayed at the top"})),description:Z.Optional(Z.String({description:"Brief context or instructions shown under the title"})),questions:Z.Array(Nj,{description:"One or more questions to ask. Use radio for single-select, checkbox for multi-select, text for free input"})});function Uj(y){return y.map((L,U)=>({...L,label:L.label||`Q${U+1}`,options:L.options||[],allowOther:L.type==="text"?!1:L.allowOther!==!1,required:L.required!==!1}))}function Vj(y,L){let U=y.split(" "),R=[],C="";for(let k of U)if(!C)C=k;else if(C.length+1+k.length<=L)C+=` ${k}`;else R.push(C),C=k;if(C)R.push(C);return R.length?R:[""]}function Fj(y){return{content:[{type:"text",text:y}],details:{questions:[],answers:[],cancelled:!0}}}var E={radioOn:"◉",radioOff:"○",checkOn:"☑",checkOff:"☐",pointer:"❯",dot:"·",check:"✓",pencil:"✎",submit:"✓"};function Oj(y){y.registerTool({name:"ask_user_question",label:"Ask User",description:`Ask the user one or more questions using an interactive form. Supports three question types:
|
|
2
|
+
- **radio**: Single-select from predefined options (like multiple choice)
|
|
3
|
+
- **checkbox**: Multi-select from options (pick all that apply)
|
|
4
|
+
- **text**: Free-form text input
|
|
5
|
+
|
|
6
|
+
Each radio/checkbox question can include an "Other..." option that lets the user type a custom answer.
|
|
7
|
+
|
|
8
|
+
Use this tool when you need user input to proceed — for clarifying requirements, getting preferences, confirming decisions, or choosing between alternatives. Prefer this over asking plain-text questions in your response.`,promptSnippet:"Ask the user interactive questions with radio, checkbox, or text inputs",promptGuidelines:["Use ask_user_question instead of asking questions in plain text when you need structured user input.","Prefer radio for single-choice, checkbox for multi-choice, text for open-ended answers.","Always include an 'Other' escape hatch (allowOther: true) unless the options are exhaustive.","Group related questions in a single call rather than making multiple separate calls."],parameters:Pj,async execute(L,U,R,C,k){if(!k.hasUI)return Fj("Error: UI not available (running in non-interactive mode)");if(!U.questions.length)return Fj("Error: No questions provided");let _=Uj(U.questions),$=_.length>1,q=_.length+($?1:0),x=await k.ui.custom((Y,D,o,T)=>{let Q=0,f=0,v=!1,A=null,p,K=new Map,l=new Map,c=new Map,S=new Map;for(let j of _)if(j.type==="checkbox"){let B=new Set;if(Array.isArray(j.default))for(let J of j.default)B.add(J);l.set(j.id,B)}else if(j.type==="text"&&typeof j.default==="string")S.set(j.id,j.default);else if(j.type==="radio"&&typeof j.default==="string"){let B=j.options.find((J)=>J.value===j.default);if(B)K.set(j.id,{value:B.value,label:B.label,wasCustom:!1})}let W=new _j(Y,{borderColor:(j)=>D.fg("accent",j),selectList:{selectedPrefix:(j)=>D.fg("accent",j),selectedText:(j)=>D.fg("accent",j),description:(j)=>D.fg("muted",j),scrollInfo:(j)=>D.fg("dim",j),noMatch:(j)=>D.fg("warning",j)}});function Gj(){if(Q<_.length-1)return Q+1;return _.length}function n(){if(!(_.length>1))i(!1);else u(Gj())}function w(){p=void 0,Y.requestRender()}function d(){return _[Q]}function e(){if(!v||!A)return;let j=W.getText().trim(),B=_.find((J)=>J.id===A);if(B?.type==="radio"&&j)K.set(B.id,{value:j,label:j,wasCustom:!0});else if(B?.type==="checkbox"&&j)c.set(B.id,j);v=!1,A=null,W.setText("")}function Hj(j){if(j.type==="text")return 0;return j.options.length+(j.allowOther?1:0)}function s(j){if(j.type==="radio")return K.has(j.id);if(j.type==="checkbox"){let B=l.get(j.id),J=c.get(j.id);return B!=null&&B.size>0||J!=null&&J.trim().length>0}if(j.type==="text")return(S.get(j.id)?.trim()??"").length>0;return!1}function a(){return _.every((j)=>!j.required||s(j))}function u(j){h(),Q=(j%q+q)%q,f=0,v=!1,A=null;let B=d();if(B?.type==="text")W.setText(S.get(B.id)??"");w()}function h(){let j=d();if(!j)return;if(j.type==="text"){let B=W.getText().trim();if(B)S.set(j.id,B);else S.delete(j.id)}}function i(j){h();let B=[];for(let J of _)if(J.type==="radio"){let F=K.get(J.id);B.push({id:J.id,type:"radio",value:F?.value??"",wasCustom:F?.wasCustom??!1})}else if(J.type==="checkbox"){let F=l.get(J.id)??new Set,V=c.get(J.id)?.trim(),H=[...F];if(V)H.push(V);B.push({id:J.id,type:"checkbox",value:H,wasCustom:!!V})}else{let F=S.get(J.id)??"";B.push({id:J.id,type:"text",value:F,wasCustom:!0})}T({title:U.title,questions:_,answers:B,cancelled:j})}W.onSubmit=(j)=>{let B=j.trim();if(v&&A){let F=_.find((V)=>V.id===A);if(F?.type==="radio"&&B)K.set(F.id,{value:B,label:B,wasCustom:!0});else if(F?.type==="checkbox"&&B)c.set(F.id,B);v=!1,A=null,W.setText(""),n();return}let J=d();if(J?.type==="text"){let F=j.trim();if(F)S.set(J.id,F);else S.delete(J.id);n()}};function Jj(j){if(v){if(P(j,N.escape)){v=!1,A=null,W.setText(""),w();return}if(P(j,N.enter)){e(),n();return}if($&&(P(j,N.tab)||P(j,N.shift("tab")))){e(),u(Q+(P(j,N.shift("tab"))?-1:1));return}W.handleInput(j),w();return}let B=d();if(B?.type==="text"){if(P(j,N.enter)){h(),n();return}if($&&(P(j,N.tab)||P(j,N.shift("tab")))){h(),u(Q+(P(j,N.shift("tab"))?-1:1));return}if(P(j,N.escape)){i(!0);return}W.handleInput(j),w();return}if($&&Q===_.length){if(P(j,N.enter)&&a()){i(!1);return}if(P(j,N.tab)||P(j,N.right)){u(0);return}if(P(j,N.shift("tab"))||P(j,N.left)){u(Q-1);return}if(P(j,N.escape)){i(!0);return}return}if(!B)return;if($){if(P(j,N.tab)||P(j,N.right)){u(Q+1);return}if(P(j,N.shift("tab"))||P(j,N.left)){u(Q-1);return}}let J=Hj(B);if(P(j,N.up)){f=Math.max(0,f-1),w();return}if(P(j,N.down)){f=Math.min(J-1,f+1),w();return}if(P(j,N.escape)){i(!0);return}if(B.type==="radio"&&P(j,N.enter)){if(B.allowOther&&f===B.options.length){v=!0,A=B.id;let H=K.get(B.id);W.setText(H?.wasCustom?H.label:""),w();return}let V=B.options[f];if(V)K.set(B.id,{value:V.value,label:V.label,wasCustom:!1}),n();return}if(B.type==="checkbox"&&P(j,N.space)){if(B.allowOther&&f===B.options.length){v=!0,A=B.id,W.setText(c.get(B.id)??""),w();return}let V=B.options[f];if(V){let H=l.get(B.id)??new Set;if(H.has(V.value))H.delete(V.value);else H.add(V.value);l.set(B.id,H),w()}return}if(B.type==="checkbox"&&P(j,N.enter)){n();return}}function Xj(j){if(p)return p;let B=[],J=Math.min(j,120),F=(G)=>B.push(Dj(G,J)),V=()=>F(D.fg("accent","─".repeat(J)));if(V(),U.title)F(` ${D.fg("accent",D.bold(U.title))}`);if(U.description)F(` ${D.fg("muted",U.description)}`);if(U.title||U.description)B.push("");if($){let G=[];for(let O=0;O<_.length;O++){let b=O===Q,M=s(_[O]),m=_[O].label,Bj=` ${M?D.fg("success",E.check):D.fg("dim",E.dot)} ${m} `;G.push(b?D.bg("selectedBg",D.fg("text",Bj)):D.fg(M?"success":"muted",Bj))}let X=Q===_.length,z=a(),g=` ${E.submit} Submit `;G.push(X?D.bg("selectedBg",D.fg("text",g)):D.fg(z?"success":"dim",g)),F(` ${G.join(D.fg("dim","│"))}`),B.push("")}let H=d();if($&&Q===_.length){F(` ${D.fg("accent",D.bold("Review & Submit"))}`),B.push("");for(let G of _){let X=D.fg("muted",`${G.label}:`);if(G.type==="radio"){let z=K.get(G.id);if(z){let g=z.wasCustom?D.fg("dim","(wrote) "):"";F(` ${X} ${g}${z.label}`)}else F(` ${X} ${D.fg("warning","(unanswered)")}`)}else if(G.type==="checkbox"){let z=l.get(G.id)??new Set,g=c.get(G.id)?.trim(),O=[...z];if(g)O.push(`${D.fg("dim","(wrote)")} ${g}`);if(O.length)F(` ${X} ${O.join(", ")}`);else F(` ${X} ${D.fg("warning","(unanswered)")}`)}else{let z=S.get(G.id)?.trim();if(z)F(` ${X} ${Dj(z,J-$j(G.label)-5)}`);else F(` ${X} ${D.fg("warning","(unanswered)")}`)}}if(B.push(""),a())F(` ${D.fg("success","Press Enter to submit")}`);else{let G=_.filter((X)=>X.required&&!s(X)).map((X)=>X.label).join(", ");F(` ${D.fg("warning",`Required: ${G}`)}`)}return B.push(""),F(D.fg("dim"," Tab/←→ navigate questions • Enter submit • Esc cancel")),V(),p=B,B}if(!H)return V(),p=B,B;let Zj=H.type==="radio"?D.fg("dim","[single-select]"):H.type==="checkbox"?D.fg("dim","[multi-select]"):D.fg("dim","[text]"),t=Vj(H.prompt,J-2);for(let G=0;G<t.length;G++){let X=G===t.length-1;F(` ${D.fg("text",D.bold(t[G]))}${X?` ${Zj}`:""}`)}if(H.required)F(` ${D.fg("warning","*required")}`);if(B.push(""),H.type==="radio"){let G=K.get(H.id);for(let X=0;X<H.options.length;X++){let z=H.options[X],g=X===f,O=G?.value===z.value&&!G.wasCustom,b=O?D.fg("accent",E.radioOn):D.fg("dim",E.radioOff),M=g?D.fg("accent",E.pointer):" ",m=g?"accent":O?"text":"muted";if(F(` ${M} ${b} ${D.fg(m,z.label)}`),z.description)F(` ${D.fg("dim",z.description)}`)}if(H.allowOther){let X=f===H.options.length,z=G?.wasCustom===!0,g=z?D.fg("accent",E.radioOn):D.fg("dim",E.radioOff),O=X?D.fg("accent",E.pointer):" ",b=z?`Other: ${G.label}`:"Other...";if(F(` ${O} ${g} ${D.fg(X?"accent":"muted",b)}`),v){B.push(""),F(` ${D.fg("muted"," Your answer:")}`);for(let M of W.render(J-6))F(` ${M}`)}}}if(H.type==="checkbox"){let G=l.get(H.id)??new Set;for(let X=0;X<H.options.length;X++){let z=H.options[X],g=X===f,O=G.has(z.value),b=O?D.fg("accent",E.checkOn):D.fg("dim",E.checkOff),M=g?D.fg("accent",E.pointer):" ",m=g?"accent":O?"text":"muted";if(F(` ${M} ${b} ${D.fg(m,z.label)}`),z.description)F(` ${D.fg("dim",z.description)}`)}if(H.allowOther){let X=f===H.options.length,z=c.get(H.id)?.trim(),g=z?D.fg("accent",E.checkOn):D.fg("dim",E.checkOff),O=X?D.fg("accent",E.pointer):" ",b=z?`Other: ${z}`:"Other...";if(F(` ${O} ${g} ${D.fg(X?"accent":"muted",b)}`),v){B.push(""),F(` ${D.fg("muted"," Your answer:")}`);for(let M of W.render(J-6))F(` ${M}`)}}}if(H.type==="text"){if(H.placeholder&&!W.getText())F(` ${D.fg("dim",H.placeholder)}`);for(let G of W.render(J-4))F(` ${G}`)}if(B.push(""),v)F(D.fg("dim"," Enter submit • Esc go back"));else if(H.type==="text"){let G=$?"Tab/←→ navigate • ":"";F(D.fg("dim",` ${G}Enter submit • Esc cancel`))}else if(H.type==="checkbox"){let G=$?"Tab/←→ navigate • ":"";F(D.fg("dim",` ↑↓ navigate • Space toggle • ${G}Enter ${$?"next":"submit"} • Esc cancel`))}else{let G=$?"Tab/←→ navigate • ":"";F(D.fg("dim",` ↑↓ navigate • ${G}Enter select • Esc cancel`))}return V(),p=B,B}let jj=_[0];if(jj?.type==="text")W.setText(S.get(jj.id)??"");return{render:Xj,invalidate:()=>{p=void 0},handleInput:Jj}});if(x.cancelled)return{content:[{type:"text",text:"User cancelled the form"}],details:x};let I=[];for(let Y of x.answers){let o=_.find((T)=>T.id===Y.id)?.label||Y.id;if(Y.type==="radio"){let T=Y.wasCustom?"(wrote) ":"";I.push(`${o}: ${T}${Y.value}`)}else if(Y.type==="checkbox"){let T=Array.isArray(Y.value)?Y.value:[Y.value];if(T.length===0)I.push(`${o}: (none selected)`);else I.push(`${o}: ${T.join(", ")}`)}else I.push(`${o}: ${Y.value||"(empty)"}`)}return{content:[{type:"text",text:I.join(`
|
|
9
|
+
`)}],details:x}},renderCall(L,U,R){let C=L.questions||[],k=L.title,_=U.fg("toolTitle",U.bold("ask_user_question "));if(k)_+=U.fg("accent",k)+" ";_+=U.fg("muted",`${C.length} question${C.length!==1?"s":""}`);let $=[...new Set(C.map((q)=>q.type))].join(", ");if($)_+=U.fg("dim",` (${$})`);return new r(_,0,0)},renderResult(L,U,R,C){let k=L.details;if(!k){let $=L.content[0];return new r($?.type==="text"?$.text:"",0,0)}if(k.cancelled)return new r(R.fg("warning","Cancelled"),0,0);let _=k.answers.map(($)=>{let x=k.questions.find((I)=>I.id===$.id)?.label||$.id;if($.type==="radio"){let I=$.wasCustom?R.fg("dim","(wrote) "):"";return`${R.fg("success",E.check)} ${R.fg("accent",x)}: ${I}${$.value}`}if($.type==="checkbox"){let I=Array.isArray($.value)?$.value:[$.value],Y=I.length?I.join(", "):R.fg("dim","(none)");return`${R.fg("success",E.check)} ${R.fg("accent",x)}: ${Y}`}return`${R.fg("success",E.check)} ${R.fg("accent",x)}: ${$.value||R.fg("dim","(empty)")}`});return new r(_.join(`
|
|
10
|
+
`),0,0)}})}export{Oj as default};
|
|
@@ -14,29 +14,9 @@
|
|
|
14
14
|
"interactive-form",
|
|
15
15
|
"questionnaire"
|
|
16
16
|
],
|
|
17
|
-
"repository": {
|
|
18
|
-
"type": "git",
|
|
19
|
-
"url": "git+https://github.com/que-nguyen/dm.git",
|
|
20
|
-
"directory": "extensions/dm-ask-user"
|
|
21
|
-
},
|
|
22
|
-
"bugs": {
|
|
23
|
-
"url": "https://github.com/que-nguyen/dm/issues"
|
|
24
|
-
},
|
|
25
|
-
"homepage": "https://github.com/que-nguyen/dm#readme",
|
|
26
|
-
"peerDependencies": {
|
|
27
|
-
"@sinclair/typebox": "*",
|
|
28
|
-
"@duckmind/dm-coding-agent": "*",
|
|
29
|
-
"@duckmind/dm-tui": "*",
|
|
30
|
-
"@duckmind/dm-ai": "*"
|
|
31
|
-
},
|
|
32
17
|
"dm": {
|
|
33
18
|
"extensions": [
|
|
34
|
-
"./index.
|
|
19
|
+
"./index.js"
|
|
35
20
|
]
|
|
36
|
-
},
|
|
37
|
-
"devDependencies": {
|
|
38
|
-
"@duckmind/dm-ai": "file:../../dm-mono/packages/ai",
|
|
39
|
-
"@duckmind/dm-coding-agent": "file:../../dm-mono/packages/coding-agent",
|
|
40
|
-
"@duckmind/dm-tui": "file:../../dm-mono/packages/tui"
|
|
41
21
|
}
|
|
42
22
|
}
|
|
@@ -18,9 +18,6 @@
|
|
|
18
18
|
"cli-hub",
|
|
19
19
|
"registry"
|
|
20
20
|
],
|
|
21
|
-
"peerDependencies": {
|
|
22
|
-
"@duckmind/dm-coding-agent": "*"
|
|
23
|
-
},
|
|
24
21
|
"dm": {
|
|
25
22
|
"extensions": [
|
|
26
23
|
"./index.js"
|
|
@@ -28,8 +25,5 @@
|
|
|
28
25
|
"skills": [
|
|
29
26
|
"./skills"
|
|
30
27
|
]
|
|
31
|
-
},
|
|
32
|
-
"devDependencies": {
|
|
33
|
-
"@duckmind/dm-coding-agent": "file:../../dm-mono/packages/coding-agent"
|
|
34
28
|
}
|
|
35
29
|
}
|
|
@@ -5,12 +5,6 @@
|
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
8
|
-
"scripts": {},
|
|
9
|
-
"devDependencies": {
|
|
10
|
-
"@sinclair/typebox": "^0.34.13",
|
|
11
|
-
"typescript": "^5.7.2",
|
|
12
|
-
"@duckmind/dm-coding-agent": "file:../../dm-mono/packages/coding-agent"
|
|
13
|
-
},
|
|
14
8
|
"keywords": [
|
|
15
9
|
"duckmind",
|
|
16
10
|
"dm",
|
|
@@ -20,14 +14,10 @@
|
|
|
20
14
|
"checkpoint"
|
|
21
15
|
],
|
|
22
16
|
"license": "MIT",
|
|
23
|
-
"repository": {
|
|
24
|
-
"type": "git",
|
|
25
|
-
"url": "git+https://github.com/ttttmr/pi-context.git"
|
|
26
|
-
},
|
|
27
17
|
"dm": {
|
|
28
18
|
"extensions": [
|
|
29
|
-
"./src/index.
|
|
30
|
-
"./src/context.
|
|
19
|
+
"./src/index.js",
|
|
20
|
+
"./src/context.js"
|
|
31
21
|
],
|
|
32
22
|
"skills": [
|
|
33
23
|
"./skills"
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{DynamicBorder as d}from"@duckmind/dm-coding-agent";import{Container as n,Text as W,Spacer as w}from"@duckmind/dm-tui";var A=(N)=>{if(N==null)return"N/A";if(N>=1e6)return(N/1e6).toFixed(1)+"M";if(N>=1000)return Math.round(N/1000)+"k";return N.toString()};function a(N){N.registerCommand("context",{description:"Show context usage visualization",handler:async(s,O)=>{let Q=await O.getContextUsage();if(!Q){O.ui.notify("Context usage info not available.","warning");return}let R=O.sessionManager.getBranch(),g=O.getSystemPrompt(),h=N.getActiveTools(),r=N.getAllTools().filter((z)=>h.includes(z.name)),q=(z)=>Math.ceil(z.length/4),K=0,Z=0,G=0;for(let z of R)if(z.type==="message"){let _=z.message;if(_.role==="user"){if(typeof _.content==="string")K+=q(_.content);else if(Array.isArray(_.content)){for(let F of _.content)if(F.type==="text")K+=q(F.text)}}else if(_.role==="assistant"){if(typeof _.content==="string")K+=q(_.content);else if(Array.isArray(_.content))for(let F of _.content){if(F.type==="text")K+=q(F.text);if(F.type==="toolCall")Z+=q(JSON.stringify(F))}}else if(_.role==="toolResult"){if(Array.isArray(_.content)){for(let F of _.content)if(F.type==="text")G+=q(F.text)}}else if(_.role==="bashExecution")Z+=q(_.command||"")}else if(z.type==="branch_summary"||z.type==="compaction")K+=q(z.summary||"");let f=q(g),B=q(JSON.stringify(r)),V=Q.tokens,$=Q.contextWindow;if(V==null||$==null||Q.percent==null){O.ui.notify("Context usage info not available.","warning");return}let L=f+B+K+Z+G,X=L>0?V/L:1,S=Math.round(f*X),U=Math.round(B*X),b=Math.round(K*X),D=Math.round(Z*X),y=Math.round(G*X);await O.ui.custom((z,_,F,T)=>{let J=new n;J.addChild(new d((M)=>_.fg("accent",M))),J.addChild(new W(_.fg("accent",_.bold(" Context Usage")),1,0)),J.addChild(new w(1));let j=[{label:"System Prompt",value:S,color:"muted"},{label:"System Tools",value:U,color:"dim"},{label:"Tool Call",value:D+y,color:"success"},{label:"Messages",value:b,color:"accent"}],u=Math.max(0,V-(S+U+b+D+y));if(u>10)j.push({label:"Other",value:u,color:"dim"});j.push({label:"Available",value:Math.max(0,$-V),color:"borderMuted"});let v=10,x=5,P=v*x,Y=[];j.forEach((M)=>{if(M.label==="Available")return;let E=Math.round(M.value/$*P);if(E===0&&M.value>0)E=1;for(let I=0;I<E&&Y.length<P;I++)Y.push({color:M.color,filled:!0})});while(Y.length<P)Y.push({color:"borderMuted",filled:!1});let H=[];for(let M=0;M<x;M++){let E="";for(let I=0;I<v;I++){let C=Y[M*v+I];E+=_.fg(C.color,C.filled?"■ ":"□ ")}H.push(E.trimEnd())}let k=`${_.fg("text",_.bold("Total Usage".padEnd(16)))} ${_.fg("text",_.bold(A(V).padStart(7)))} ${_.fg("text",_.bold(`(${Q.percent.toFixed(1).padStart(5)}%)`))}`,l=j.map((M)=>{let E=M.label.padEnd(14),I=A(M.value).padStart(7),C=(M.value/$*100).toFixed(1).padStart(5),m=M.label==="Available"?"□":"■";return`${_.fg(M.color,m)} ${_.fg("text",E)} ${_.fg("accent",I)} (${C}%)`}),p=[k,"",...l],c=20,i=Math.max(H.length,p.length);for(let M=0;M<i;M++){let E=(H[M]||"").padEnd(c),I=p[M]||"";J.addChild(new W(` ${E} ${I}`,1,0))}return J.addChild(new w(1)),J.addChild(new W(_.fg("dim"," Press any key to close"),1,0)),J.addChild(new d((M)=>_.fg("accent",M))),{render:(M)=>J.render(M),invalidate:()=>J.invalidate(),handleInput:(M)=>T(void 0)}},{overlay:!0})}})}export{a as default};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import{Type as U}from"@sinclair/typebox";var k=(z)=>{if(z==null)return"N/A";if(z>=1e6)return(z/1e6).toFixed(1)+"M";if(z>=1000)return Math.round(z/1000)+"k";return z.toString()};var g=["context_tag","context_log","context_checkout"],L=null,R=null,v=(z)=>g.includes(z),h=(z,Y)=>{if(Y.toLowerCase()==="root"){let A=z.getTree();return A.length>0?A[0].entry.id:Y}if(/^[0-9a-f]{8,}$/i.test(Y))return Y;let O=[...z.getTree()];while(O.length>0){let A=O.pop();if(z.getLabel(A.entry.id)===Y)return A.entry.id;if(A.children?.length)O.push(...A.children)}return Y},d=U.Object({limit:U.Optional(U.Number({description:"History limit for visible entries (default: 50)."})),verbose:U.Optional(U.Boolean({description:"If true, show ALL messages. If false (default), collapses intermediate AI steps and only shows 'milestones': User messages, Tags, Branch Points, and Summaries."}))}),p=U.Object({target:U.String({description:"Where to jump/squash to. Can be a tag name (e.g., 'task-start'), a commit ID, or 'root'. This is the base for your new branch."}),message:U.String({description:"The 'Carryover Message' for the new branch. A summary of your *current* progress/lessons that you want to bring with you to the new state. This ensures you don't lose key information when switching contexts. Good summary message: '[Status] + [Reason] + [Important Changes] + [Carryover Data]'"}),backupTag:U.Optional(U.String({description:"Optional tag name to apply to the CURRENT state before checking out. Use this to create an automatic backup of the history you are about to leave/squash."}))}),y=U.Object({name:U.String({description:"The tag/milestone name. Use meaningful names."}),target:U.Optional(U.String({description:"The commit ID to tag. Defaults to HEAD (current state)."}))});function c(z){z.registerCommand("acm",{description:"Enable agentic context management for the current session",handler:async(O,A)=>{if(L=A,A.ui.notify("Agentic Context Management enabled.","info"),z.sendMessage({customType:"dm-context",content:"use context-management skill",display:!1},{deliverAs:"followUp"}),O)z.sendUserMessage(O)}});let Y=(O,A,E)=>{for(let w of A){if(O.getLabel(w.entry.id)===E)return w.entry.id;let W=Y(O,w.children,E);if(W)return W}return null};z.registerTool({name:"context_tag",label:"Context Tag",description:"Creates a 'Save Point' (Bookmark) in the history. Use this before trying risky changes or when a feature is stable. 'Untagged progress is risky'.",parameters:y,async execute(O,A,E,w,W){let F=W.sessionManager,J=Y(F,F.getTree(),A.name);if(J)return{content:[{type:"text",text:`Error: Tag '${A.name}' already exists at ${J}. Tag names must be unique. Use a different name or delete the existing tag first.`}],details:{}};let G=A.target?h(F,A.target):void 0;if(!G){let Z=F.getBranch();for(let $=Z.length-1;$>=0;$--){let Q=Z[$];if(Q.type==="message"&&Q.message.role==="toolResult"){let X=Q.message;if(v(X.toolName))continue;G=Q.id;break}if(Q.type==="message"&&Q.message.role==="assistant"){if(!Q.message.content.some((f)=>f.type==="toolCall"&&v(f.name))){G=Q.id;break}}G=Q.id;break}if(!G)G=F.getLeafId()??""}return z.setLabel(G,A.name),{content:[{type:"text",text:`Created tag '${A.name}' at ${G}`}],details:{}}}}),z.registerTool({name:"context_log",label:"Context Log",description:"Show the entire history structure (status, message, tags, milestones). Analogous to 'git log --graph --oneline --decorate'",parameters:d,async execute(O,A,E,w,W){let F=W.sessionManager,J=F.getBranch(),G=F.getLeafId(),Z=A.verbose??!1,$=A.limit??50,Q=new Set(J.map((_)=>_.id)),X=[];J.forEach((_)=>{X.push(_),F.getChildren(_.id).forEach((D)=>{if((D.type==="branch_summary"||D.type==="compaction")&&!Q.has(D.id))X.push(D)})});let I=(_)=>{if(_.type==="branch_summary"||_.type==="compaction")return _.summary||"[No summary provided]";if(_.type==="label")return`tag: ${_.label}`;if(_.type==="message"){let B=_.message;if(B.role==="toolResult"){let D=B;if(!Z&&v(D.toolName))return"";let K=((u)=>{return u.map((N)=>N.type==="text"?N.text:"").join(" ").trim()})(D.content),V=D.details;if((D.toolName==="read"||D.toolName==="edit")&&V&&"path"in V&&typeof V.path==="string")K=`${V.path}: ${K}`;return`(${D.toolName}) ${K}`}if(B.role==="bashExecution")return`[Bash] ${B.command}`;if(B.role==="user"||B.role==="assistant"){let D="";if(typeof B.content==="string")D=B.content;else if(Array.isArray(B.content))D=B.content.map((K)=>{if(typeof K==="object"&&K!==null&&"text"in K)return K.text;return""}).join(" ").trim();let j="";if(B.role==="assistant")j=B.content.filter((V)=>V.type==="toolCall").filter((V)=>Z||!v(V.name)).map((V)=>`call: ${V.name}(${JSON.stringify(V.arguments)})`).join("; ");return[D,j].filter(Boolean).join(" ")}}return""},f=(_)=>{if(_.id===G)return!0;if(J.length>0&&_.id===J[0].id)return!0;if(F.getLabel(_.id))return!0;if(_.type==="label")return!1;if(_.type==="branch_summary"||_.type==="compaction")return!0;if(F.getChildren(_.id).length>1)return!0;if(_.type==="message"&&_.message.role==="user")return!0;return!1},H=new Set;X.forEach((_)=>{if(Z||f(_))H.add(_.id)});let b=X.filter((_)=>H.has(_.id));if(b.length>$){let _=new Set(b.slice(-$).map((B)=>B.id));H.clear(),_.forEach((B)=>H.add(B))}let S=[],M=0;if(X.forEach((_)=>{if(!H.has(_.id)){M++;return}if(M>0)S.push(` : ... (${M} hidden messages) ...`),M=0;let B=_.id===G,D=F.getLabel(_.id),j=I(_).replace(/\s+/g," "),K=_.type.toUpperCase();if(_.type==="message"){let P=_.message;K=P.role==="assistant"?"AI":P.role==="user"?"USER":P.role==="bashExecution"?"BASH":"TOOL"}else if(_.type==="branch_summary"||_.type==="compaction")K="SUMMARY";if(K==="CUSTOM_MESSAGE")return;let V=_.id,N=[J.length>0&&_.id===J[0].id?"ROOT":null,B?"HEAD":null,D?`tag: ${D}`:null].filter(Boolean).join(", "),l=j.length>100?j.slice(0,100)+"...":j,o=B?"*":K==="USER"?"•":"|";S.push(`${o} ${V}${N?` (${N})`:""} [${K}] ${l}`)}),M>0)S.push(` : ... (${M} hidden messages) ...`);let q=await W.getContextUsage(),T="Unknown";if(q)T=`${q.percent.toFixed(1)}% (${k(q.tokens)}/${k(q.contextWindow)})`;let C=0,x="None";for(let _=J.length-1;_>=0;_--){let B=J[_].id,D=F.getLabel(B);if(D){x=D;break}C++}return{content:[{type:"text",text:["[Context Dashboard]",`• Context Usage: ${T}`,`• Segment Size: ${C} steps since last tag '${x}'`,"---------------------------------------------------"].join(`
|
|
2
|
+
`)+`
|
|
3
|
+
`+(S.join(`
|
|
4
|
+
`)||"(Root Path Only)")}],details:{}}}}),z.registerTool({name:"context_checkout",label:"Context Checkout",description:"Navigate to ANY point in the conversation history. This checkout only resets *conversation history*, NOT disk files. ALWAYS provide a detailed 'message' to bridge context.",parameters:p,async execute(O,A,E,w,W){if(!L)return W.ui.setEditorText(`/acm ${W.ui.getEditorText()||"continue"}`),{content:[{type:"text",text:"Agentic context management is not enabled. Ask the user to run `/acm` in DM to enable it, then retry."}],details:{}};let F=W.sessionManager,J=h(F,A.target),G=F.getLeafId();if(G===J)return{content:[{type:"text",text:`Already at target ${J}`}],details:{}};if(A.backupTag&&G)z.setLabel(G,A.backupTag);let Z=G?F.getLabel(G):void 0,Q=`(summary from ${Z?`tag: ${Z}`:G||"unknown"})
|
|
5
|
+
${A.message}`,X=await F.branchWithSummary(J,Q);return R=A,R.nid=X,R.tid=J,R.enrichedMessage=Q,{content:[{type:"text",text:"checkout start"}],details:{}}}}),z.on("turn_end",async(O,A)=>{if(!R)return;A.abort()}),z.on("agent_end",async(O,A)=>{if(!R)return;if(!L)return;await L.navigateTree(R.nid,{summarize:!1}),A.ui.notify(`Checked out ${R.target}${R.target===R.tid?"":`(${R.tid})`}
|
|
6
|
+
Backup tag created: ${R.backupTag||"none"}
|
|
7
|
+
message: ${R.enrichedMessage}`,"info"),R=null,z.sendMessage({customType:"dm-context",content:"context_checkout complete. A summary of your previous branch was injected above. Read it to understand your new state. Execute the 'Next Step' from the summary",display:!1},{triggerTurn:!0})})}export{c as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var t=(r)=>{if(r==null)return"N/A";if(r>=1e6)return(r/1e6).toFixed(1)+"M";if(r>=1000)return Math.round(r/1000)+"k";return r.toString()};export{t as formatTokens};
|