@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
package/dm
CHANGED
|
Binary file
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"status": "ok",
|
|
3
|
-
"prepared_at": "2026-07-
|
|
3
|
+
"prepared_at": "2026-07-09T19:06:11.396850+00:00",
|
|
4
4
|
"managed_entries": [
|
|
5
5
|
{
|
|
6
6
|
"id": "dm-context",
|
|
@@ -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",
|
|
@@ -406,14 +545,18 @@
|
|
|
406
545
|
"src/search/sources.mjs",
|
|
407
546
|
"src/search/synthesis-runner.mjs",
|
|
408
547
|
"src/search/synthesis.mjs",
|
|
548
|
+
"src/tools/greedy-search-handler.js",
|
|
549
|
+
"src/tools/shared.js",
|
|
550
|
+
"src/types.js",
|
|
409
551
|
"src/utils/browser-executable.mjs",
|
|
410
552
|
"src/utils/content.mjs",
|
|
553
|
+
"src/utils/helpers.js",
|
|
411
554
|
"src/utils/node-runtime.mjs",
|
|
412
555
|
"src/utils/system-cmds.mjs"
|
|
413
556
|
],
|
|
414
|
-
"file_count":
|
|
415
|
-
"before_bytes":
|
|
416
|
-
"after_bytes":
|
|
557
|
+
"file_count": 53,
|
|
558
|
+
"before_bytes": 514420,
|
|
559
|
+
"after_bytes": 807613,
|
|
417
560
|
"externals": [
|
|
418
561
|
"@duckmind/dm-agent-core",
|
|
419
562
|
"@duckmind/dm-ai",
|
|
@@ -440,13 +583,19 @@
|
|
|
440
583
|
"@duckmind/dm-tui",
|
|
441
584
|
"@sinclair/typebox"
|
|
442
585
|
],
|
|
443
|
-
"dependency_patches": [
|
|
586
|
+
"dependency_patches": [
|
|
587
|
+
"dm.extensions ts->js",
|
|
588
|
+
"drop-devDependencies",
|
|
589
|
+
"drop-peerDependencies"
|
|
590
|
+
],
|
|
444
591
|
"javascript_bundle_minify": {
|
|
445
592
|
"tool": "bun build --minify",
|
|
446
|
-
"files": [
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
"
|
|
593
|
+
"files": [
|
|
594
|
+
"index.js"
|
|
595
|
+
],
|
|
596
|
+
"file_count": 1,
|
|
597
|
+
"before_bytes": 30280,
|
|
598
|
+
"after_bytes": 12912,
|
|
450
599
|
"externals": [
|
|
451
600
|
"@duckmind/dm-agent-core",
|
|
452
601
|
"@duckmind/dm-ai",
|
|
@@ -467,13 +616,19 @@
|
|
|
467
616
|
"@duckmind/dm-coding-agent",
|
|
468
617
|
"@duckmind/dm-tui"
|
|
469
618
|
],
|
|
470
|
-
"dependency_patches": [
|
|
619
|
+
"dependency_patches": [
|
|
620
|
+
"dm.extensions ts->js",
|
|
621
|
+
"drop-devDependencies",
|
|
622
|
+
"drop-peerDependencies"
|
|
623
|
+
],
|
|
471
624
|
"javascript_bundle_minify": {
|
|
472
625
|
"tool": "bun build --minify",
|
|
473
|
-
"files": [
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
"
|
|
626
|
+
"files": [
|
|
627
|
+
"index.js"
|
|
628
|
+
],
|
|
629
|
+
"file_count": 1,
|
|
630
|
+
"before_bytes": 59346,
|
|
631
|
+
"after_bytes": 26869,
|
|
477
632
|
"externals": [
|
|
478
633
|
"@duckmind/dm-agent-core",
|
|
479
634
|
"@duckmind/dm-ai",
|
|
@@ -494,13 +649,22 @@
|
|
|
494
649
|
"@duckmind/dm-coding-agent",
|
|
495
650
|
"typebox"
|
|
496
651
|
],
|
|
497
|
-
"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
|
+
],
|
|
498
660
|
"javascript_bundle_minify": {
|
|
499
661
|
"tool": "bun build --minify",
|
|
500
|
-
"files": [
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
"
|
|
662
|
+
"files": [
|
|
663
|
+
"src/goal.js"
|
|
664
|
+
],
|
|
665
|
+
"file_count": 1,
|
|
666
|
+
"before_bytes": 36860,
|
|
667
|
+
"after_bytes": 18158,
|
|
504
668
|
"externals": [
|
|
505
669
|
"@biomejs/biome",
|
|
506
670
|
"@duckmind/dm-agent-core",
|
|
@@ -525,13 +689,21 @@
|
|
|
525
689
|
"@duckmind/dm-coding-agent",
|
|
526
690
|
"typebox"
|
|
527
691
|
],
|
|
528
|
-
"dependency_patches": [
|
|
692
|
+
"dependency_patches": [
|
|
693
|
+
"dm.extensions ts->js",
|
|
694
|
+
"main ts->js",
|
|
695
|
+
"drop-devDependencies",
|
|
696
|
+
"drop-peerDependencies",
|
|
697
|
+
"drop-scripts"
|
|
698
|
+
],
|
|
529
699
|
"javascript_bundle_minify": {
|
|
530
700
|
"tool": "bun build --minify",
|
|
531
|
-
"files": [
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
"
|
|
701
|
+
"files": [
|
|
702
|
+
"src/index.js"
|
|
703
|
+
],
|
|
704
|
+
"file_count": 1,
|
|
705
|
+
"before_bytes": 17266,
|
|
706
|
+
"after_bytes": 6552,
|
|
535
707
|
"externals": [
|
|
536
708
|
"@duckmind/dm-agent-core",
|
|
537
709
|
"@duckmind/dm-ai",
|
|
@@ -555,13 +727,21 @@
|
|
|
555
727
|
"@duckmind/dm-tui",
|
|
556
728
|
"typebox"
|
|
557
729
|
],
|
|
558
|
-
"dependency_patches": [
|
|
730
|
+
"dependency_patches": [
|
|
731
|
+
"dm.extensions ts->js",
|
|
732
|
+
"drop-dependencies",
|
|
733
|
+
"drop-devDependencies",
|
|
734
|
+
"drop-peerDependencies",
|
|
735
|
+
"drop-scripts"
|
|
736
|
+
],
|
|
559
737
|
"javascript_bundle_minify": {
|
|
560
738
|
"tool": "bun build --minify",
|
|
561
|
-
"files": [
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
"
|
|
739
|
+
"files": [
|
|
740
|
+
"index.js"
|
|
741
|
+
],
|
|
742
|
+
"file_count": 1,
|
|
743
|
+
"before_bytes": 53082,
|
|
744
|
+
"after_bytes": 37967,
|
|
565
745
|
"externals": [
|
|
566
746
|
"@duckmind/dm-agent-core",
|
|
567
747
|
"@duckmind/dm-ai",
|
|
@@ -580,6 +760,10 @@
|
|
|
580
760
|
"bundle_mode": "local-source-package",
|
|
581
761
|
"dependencies_installed": false,
|
|
582
762
|
"dependency_mode": "none",
|
|
763
|
+
"dependency_patches": [
|
|
764
|
+
"drop-devDependencies",
|
|
765
|
+
"drop-peerDependencies"
|
|
766
|
+
],
|
|
583
767
|
"javascript_bundle_minify": {
|
|
584
768
|
"tool": "bun build --minify",
|
|
585
769
|
"files": [
|
|
@@ -606,6 +790,10 @@
|
|
|
606
790
|
"bundle_mode": "local-source-package",
|
|
607
791
|
"dependencies_installed": false,
|
|
608
792
|
"dependency_mode": "none",
|
|
793
|
+
"dependency_patches": [
|
|
794
|
+
"drop-devDependencies",
|
|
795
|
+
"drop-peerDependencies"
|
|
796
|
+
],
|
|
609
797
|
"javascript_bundle_minify": {
|
|
610
798
|
"tool": "bun build --minify",
|
|
611
799
|
"files": [
|
|
@@ -631,6 +819,10 @@
|
|
|
631
819
|
"bundle_mode": "local-source-package",
|
|
632
820
|
"dependencies_installed": false,
|
|
633
821
|
"dependency_mode": "none",
|
|
822
|
+
"dependency_patches": [
|
|
823
|
+
"drop-devDependencies",
|
|
824
|
+
"drop-peerDependencies"
|
|
825
|
+
],
|
|
634
826
|
"javascript_bundle_minify": {
|
|
635
827
|
"tool": "bun build --minify",
|
|
636
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};
|