@agi-fans/dsh-tui 0.22.0 → 0.23.1
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/LICENSE +26 -0
- package/lib/CHANGELOG.md +219 -1
- package/lib/chrome/box.d.ts +1 -18
- package/lib/chrome/box.js +2 -45
- package/lib/chrome/box.js.map +1 -1
- package/lib/chrome/code-highlight.js +4 -4
- package/lib/chrome/code-highlight.js.map +1 -1
- package/lib/chrome/command-output.d.ts +0 -1
- package/lib/chrome/command-output.js +11 -5
- package/lib/chrome/command-output.js.map +1 -1
- package/lib/chrome/goal-bar.js +1 -1
- package/lib/chrome/goal-bar.js.map +1 -1
- package/lib/chrome/main-screen-renderer.js +4 -3
- package/lib/chrome/main-screen-renderer.js.map +1 -1
- package/lib/chrome/markdown.d.ts +3 -3
- package/lib/chrome/markdown.js +85 -36
- package/lib/chrome/markdown.js.map +1 -1
- package/lib/chrome/md-style.d.ts +5 -2
- package/lib/chrome/md-style.js +13 -4
- package/lib/chrome/md-style.js.map +1 -1
- package/lib/chrome/renderer.d.ts +37 -1
- package/lib/chrome/renderer.js.map +1 -1
- package/lib/chrome/status-line.d.ts +3 -3
- package/lib/chrome/status-line.js +5 -5
- package/lib/chrome/status-line.js.map +1 -1
- package/lib/chrome/theme.d.ts +8 -3
- package/lib/chrome/theme.js +51 -153
- package/lib/chrome/theme.js.map +1 -1
- package/lib/commands/auth-account.d.ts +9 -0
- package/lib/commands/auth-account.js +202 -0
- package/lib/commands/auth-account.js.map +1 -0
- package/lib/commands/auth.js +238 -414
- package/lib/commands/auth.js.map +1 -1
- package/lib/commands/diff.js +22 -16
- package/lib/commands/diff.js.map +1 -1
- package/lib/commands/export.d.ts +0 -1
- package/lib/commands/export.js +99 -32
- package/lib/commands/export.js.map +1 -1
- package/lib/commands/files.js +11 -9
- package/lib/commands/files.js.map +1 -1
- package/lib/commands/integrations.d.ts +12 -1
- package/lib/commands/integrations.js +120 -23
- package/lib/commands/integrations.js.map +1 -1
- package/lib/commands/jobs-browser.d.ts +3 -0
- package/lib/commands/jobs-browser.js +152 -0
- package/lib/commands/jobs-browser.js.map +1 -0
- package/lib/commands/jobs.d.ts +3 -14
- package/lib/commands/jobs.js +26 -18
- package/lib/commands/jobs.js.map +1 -1
- package/lib/commands/model.d.ts +3 -0
- package/lib/commands/model.js +212 -128
- package/lib/commands/model.js.map +1 -1
- package/lib/commands/open-external.d.ts +2 -0
- package/lib/commands/open-external.js +19 -0
- package/lib/commands/open-external.js.map +1 -0
- package/lib/commands/permission.js +65 -54
- package/lib/commands/permission.js.map +1 -1
- package/lib/commands/plugins.js +381 -139
- package/lib/commands/plugins.js.map +1 -1
- package/lib/commands/schedule-catalog.d.ts +12 -0
- package/lib/commands/schedule-catalog.js +41 -0
- package/lib/commands/schedule-catalog.js.map +1 -0
- package/lib/commands/schedule-history.d.ts +4 -0
- package/lib/commands/schedule-history.js +62 -0
- package/lib/commands/schedule-history.js.map +1 -0
- package/lib/commands/schedule.d.ts +12 -15
- package/lib/commands/schedule.js +220 -187
- package/lib/commands/schedule.js.map +1 -1
- package/lib/commands/session-configuration.d.ts +3 -0
- package/lib/commands/session-configuration.js +62 -28
- package/lib/commands/session-configuration.js.map +1 -1
- package/lib/commands/session.js +116 -66
- package/lib/commands/session.js.map +1 -1
- package/lib/commands/terminal.js +14 -8
- package/lib/commands/terminal.js.map +1 -1
- package/lib/definition.d.ts +115 -15
- package/lib/index.d.ts +1 -0
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -1
- package/lib/input/actions.d.ts +1 -1
- package/lib/input/actions.js +5 -2
- package/lib/input/actions.js.map +1 -1
- package/lib/input/composer-files.d.ts +2 -0
- package/lib/input/composer-files.js +13 -3
- package/lib/input/composer-files.js.map +1 -1
- package/lib/input/image-paste.d.ts +5 -12
- package/lib/input/image-paste.js +32 -28
- package/lib/input/image-paste.js.map +1 -1
- package/lib/input/key-test.d.ts +5 -0
- package/lib/input/key-test.js +19 -0
- package/lib/input/key-test.js.map +1 -0
- package/lib/input/keys.d.ts +2 -0
- package/lib/input/keys.js +4 -1
- package/lib/input/keys.js.map +1 -1
- package/lib/locale/index.d.ts +6 -0
- package/lib/locale/index.js +32 -0
- package/lib/locale/index.js.map +1 -0
- package/lib/locale/prompt.d.ts +4 -0
- package/lib/locale/prompt.js +24 -0
- package/lib/locale/prompt.js.map +1 -0
- package/lib/locale/zh.d.ts +1114 -0
- package/lib/locale/zh.js +1115 -0
- package/lib/locale/zh.js.map +1 -0
- package/lib/prompt-intents.d.ts +4 -0
- package/lib/prompt-intents.js +4 -0
- package/lib/prompt-intents.js.map +1 -1
- package/lib/runtime/account-settings.d.ts +18 -0
- package/lib/runtime/account-settings.js +241 -0
- package/lib/runtime/account-settings.js.map +1 -0
- package/lib/runtime/agent-profile.d.ts +3 -3
- package/lib/runtime/agent-profile.js +4 -4
- package/lib/runtime/agent-profile.js.map +1 -1
- package/lib/runtime/btw-policy.js +2 -1
- package/lib/runtime/btw-policy.js.map +1 -1
- package/lib/runtime/btw.js +1 -2
- package/lib/runtime/btw.js.map +1 -1
- package/lib/runtime/composer-images.d.ts +2 -2
- package/lib/runtime/composer-images.js +4 -4
- package/lib/runtime/composer-images.js.map +1 -1
- package/lib/runtime/composer-shell.js +27 -1
- package/lib/runtime/composer-shell.js.map +1 -1
- package/lib/runtime/file-browser.d.ts +19 -0
- package/lib/runtime/file-browser.js +291 -0
- package/lib/runtime/file-browser.js.map +1 -0
- package/lib/runtime/file-review.d.ts +6 -9
- package/lib/runtime/file-review.js +91 -7
- package/lib/runtime/file-review.js.map +1 -1
- package/lib/runtime/help-reader.d.ts +12 -0
- package/lib/runtime/help-reader.js +50 -0
- package/lib/runtime/help-reader.js.map +1 -0
- package/lib/runtime/human-interaction.js +1 -1
- package/lib/runtime/human-interaction.js.map +1 -1
- package/lib/runtime/model-catalog-editor.d.ts +12 -0
- package/lib/runtime/model-catalog-editor.js +215 -0
- package/lib/runtime/model-catalog-editor.js.map +1 -0
- package/lib/runtime/model-settings.d.ts +11 -0
- package/lib/runtime/model-settings.js +404 -0
- package/lib/runtime/model-settings.js.map +1 -0
- package/lib/runtime/plugin-settings.d.ts +4 -1
- package/lib/runtime/plugin-settings.js +164 -88
- package/lib/runtime/plugin-settings.js.map +1 -1
- package/lib/runtime/prompt-browser.d.ts +9 -0
- package/lib/runtime/prompt-browser.js +19 -0
- package/lib/runtime/prompt-browser.js.map +1 -0
- package/lib/runtime/provider-local.d.ts +27 -27
- package/lib/runtime/provider-local.js +1288 -308
- package/lib/runtime/provider-local.js.map +1 -1
- package/lib/runtime/reference-reader.d.ts +15 -0
- package/lib/runtime/reference-reader.js +78 -0
- package/lib/runtime/reference-reader.js.map +1 -0
- package/lib/runtime/runner.js +38 -29
- package/lib/runtime/runner.js.map +1 -1
- package/lib/runtime/session-runtime.js +1 -1
- package/lib/runtime/session-runtime.js.map +1 -1
- package/lib/runtime/settings-draft.d.ts +21 -0
- package/lib/runtime/settings-draft.js +166 -0
- package/lib/runtime/settings-draft.js.map +1 -0
- package/lib/runtime/settings-preferences.js +1 -1
- package/lib/runtime/settings-preferences.js.map +1 -1
- package/lib/runtime/startup-notices.d.ts +0 -1
- package/lib/runtime/startup-notices.js +35 -6
- package/lib/runtime/startup-notices.js.map +1 -1
- package/lib/runtime/subagent-model-selection.js +2 -1
- package/lib/runtime/subagent-model-selection.js.map +1 -1
- package/lib/runtime/subagent-settings.d.ts +14 -0
- package/lib/runtime/subagent-settings.js +288 -0
- package/lib/runtime/subagent-settings.js.map +1 -0
- package/lib/runtime/terminal-notifications.d.ts +3 -0
- package/lib/runtime/terminal-notifications.js +13 -8
- package/lib/runtime/terminal-notifications.js.map +1 -1
- package/lib/runtime/terminal-probe.d.ts +2 -0
- package/lib/runtime/terminal-probe.js +9 -0
- package/lib/runtime/terminal-probe.js.map +1 -1
- package/lib/runtime/tool-presentation.js.map +1 -1
- package/lib/runtime/tool-reader.d.ts +5 -0
- package/lib/runtime/tool-reader.js +27 -0
- package/lib/runtime/tool-reader.js.map +1 -0
- package/lib/runtime/web-settings.d.ts +14 -0
- package/lib/runtime/web-settings.js +339 -0
- package/lib/runtime/web-settings.js.map +1 -0
- package/lib/session/command-attachments.d.ts +17 -0
- package/lib/session/command-attachments.js +50 -0
- package/lib/session/command-attachments.js.map +1 -0
- package/lib/session/context-diagnostics.d.ts +16 -0
- package/lib/session/context-diagnostics.js +15 -0
- package/lib/session/context-diagnostics.js.map +1 -1
- package/lib/session/external-agents.d.ts +3 -1
- package/lib/session/external-agents.js +35 -10
- package/lib/session/external-agents.js.map +1 -1
- package/lib/session/generation-continuation.d.ts +11 -0
- package/lib/session/generation-continuation.js +34 -0
- package/lib/session/generation-continuation.js.map +1 -0
- package/lib/session/goal-controls.d.ts +5 -0
- package/lib/session/goal-controls.js +81 -0
- package/lib/session/goal-controls.js.map +1 -0
- package/lib/session/interaction-adapter.d.ts +7 -3
- package/lib/session/interaction-adapter.js +121 -49
- package/lib/session/interaction-adapter.js.map +1 -1
- package/lib/session/message-queue.d.ts +2 -0
- package/lib/session/message-queue.js +102 -17
- package/lib/session/message-queue.js.map +1 -1
- package/lib/session/pending-inputs.d.ts +30 -0
- package/lib/session/pending-inputs.js +183 -0
- package/lib/session/pending-inputs.js.map +1 -0
- package/lib/session/session-configuration.js +1 -1
- package/lib/session/session-configuration.js.map +1 -1
- package/lib/session/session-controller.d.ts +33 -20
- package/lib/session/session-controller.js +500 -129
- package/lib/session/session-controller.js.map +1 -1
- package/lib/session/session-library.d.ts +3 -1
- package/lib/session/session-library.js +15 -0
- package/lib/session/session-library.js.map +1 -1
- package/lib/session/subagent-roster.d.ts +1 -0
- package/lib/session/subagent-roster.js +16 -5
- package/lib/session/subagent-roster.js.map +1 -1
- package/lib/session/subagent-tracker.d.ts +2 -0
- package/lib/session/subagent-tracker.js +18 -0
- package/lib/session/subagent-tracker.js.map +1 -1
- package/lib/session/tui-settings.d.ts +9 -5
- package/lib/session/tui-settings.js +3 -1
- package/lib/session/tui-settings.js.map +1 -1
- package/lib/session/workflow-projection.d.ts +2 -1
- package/lib/session/workflow-projection.js +34 -4
- package/lib/session/workflow-projection.js.map +1 -1
- package/lib/views/autocomplete.d.ts +12 -12
- package/lib/views/autocomplete.js +54 -45
- package/lib/views/autocomplete.js.map +1 -1
- package/lib/views/context-overview.d.ts +4 -0
- package/lib/views/context-overview.js +43 -0
- package/lib/views/context-overview.js.map +1 -0
- package/lib/views/copy-targets.d.ts +6 -2
- package/lib/views/copy-targets.js +19 -14
- package/lib/views/copy-targets.js.map +1 -1
- package/lib/views/document-reader.d.ts +10 -1
- package/lib/views/document-reader.js +63 -6
- package/lib/views/document-reader.js.map +1 -1
- package/lib/views/event-views.js +29 -11
- package/lib/views/event-views.js.map +1 -1
- package/lib/views/file-actions.js +21 -0
- package/lib/views/file-actions.js.map +1 -1
- package/lib/views/file-browser.d.ts +98 -0
- package/lib/views/file-browser.js +120 -0
- package/lib/views/file-browser.js.map +1 -0
- package/lib/views/history-search.js +4 -4
- package/lib/views/history-search.js.map +1 -1
- package/lib/views/hotkey-format.d.ts +3 -2
- package/lib/views/hotkey-format.js +4 -3
- package/lib/views/hotkey-format.js.map +1 -1
- package/lib/views/hotkeys.js +10 -12
- package/lib/views/hotkeys.js.map +1 -1
- package/lib/views/list-view.js +16 -11
- package/lib/views/list-view.js.map +1 -1
- package/lib/views/prompt-selector.d.ts +23 -1
- package/lib/views/prompt-selector.js +123 -60
- package/lib/views/prompt-selector.js.map +1 -1
- package/lib/views/settings-list.d.ts +6 -1
- package/lib/views/settings-list.js +69 -46
- package/lib/views/settings-list.js.map +1 -1
- package/lib/views/tool-actions.d.ts +16 -0
- package/lib/views/tool-actions.js +29 -0
- package/lib/views/tool-actions.js.map +1 -0
- package/lib/views/trajectory-timeline.d.ts +5 -6
- package/lib/views/trajectory-timeline.js +25 -15
- package/lib/views/trajectory-timeline.js.map +1 -1
- package/lib/views/trajectory.d.ts +23 -2
- package/lib/views/trajectory.js +404 -186
- package/lib/views/trajectory.js.map +1 -1
- package/lib/views/transcript-render.d.ts +39 -15
- package/lib/views/transcript-render.js +406 -208
- package/lib/views/transcript-render.js.map +1 -1
- package/lib/views/transcript-types.d.ts +3 -2
- package/lib/views/transcript-types.js.map +1 -1
- package/lib/views/workflow.d.ts +16 -0
- package/lib/views/workflow.js +42 -0
- package/lib/views/workflow.js.map +1 -0
- package/package.json +61 -58
- package/lib/chrome/welcome-tips.d.ts +0 -23
- package/lib/chrome/welcome-tips.js +0 -24
- package/lib/chrome/welcome-tips.js.map +0 -1
- package/lib/session/steering.d.ts +0 -3
- package/lib/session/steering.js +0 -9
- package/lib/session/steering.js.map +0 -1
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
/** Integration discovery commands registered through dsh-commands. */
|
|
2
|
+
import { createPromptBrowser } from "../runtime/prompt-browser.js";
|
|
3
|
+
import { readReference } from "../runtime/reference-reader.js";
|
|
4
|
+
import { browseTools } from "../runtime/tool-reader.js";
|
|
5
|
+
import { choosePrompt } from "../prompt-intents.js";
|
|
6
|
+
import { resolveUiLanguage, uiText } from "../locale/index.js";
|
|
2
7
|
import { registerCommands } from "./registration.js";
|
|
3
8
|
export const name = 'omdsh-command-integrations';
|
|
4
9
|
export const inject = ['commands', 'tui'];
|
|
@@ -7,7 +12,7 @@ function compactDescription(value, maxLength = 140) {
|
|
|
7
12
|
return normalized.length <= maxLength ? normalized : normalized.slice(0, maxLength - 1).trimEnd() + '…';
|
|
8
13
|
}
|
|
9
14
|
/** Render the MCP subset of the unified Harness tool catalog. */
|
|
10
|
-
export function mcpCatalogText(tools) {
|
|
15
|
+
export function mcpCatalogText(tools, t = (source, values) => uiText('en', source, values)) {
|
|
11
16
|
const servers = new Map();
|
|
12
17
|
for (const tool of tools) {
|
|
13
18
|
const match = /^mcp__(.+?)__(.+)$/u.exec(tool.name);
|
|
@@ -18,44 +23,136 @@ export function mcpCatalogText(tools) {
|
|
|
18
23
|
servers.set(match[1], rows);
|
|
19
24
|
}
|
|
20
25
|
if (servers.size === 0) {
|
|
21
|
-
return 'No MCP tools are available to this session. This does not establish whether a server is connected.';
|
|
26
|
+
return t('No MCP tools are available to this session. This does not establish whether a server is connected.');
|
|
22
27
|
}
|
|
23
28
|
const total = [...servers.values()].reduce((count, rows) => count + rows.length, 0);
|
|
24
29
|
return [
|
|
25
|
-
|
|
30
|
+
t('MCP tools · Servers: {servers} · Tools: {tools}', { servers: servers.size, tools: total }),
|
|
26
31
|
...[...servers].flatMap(([server, rows]) => [
|
|
27
32
|
'',
|
|
28
|
-
`**${server} · ${
|
|
29
|
-
'
|
|
33
|
+
`**${server} · ${t('Tools: {count}', { count: rows.length })}**`,
|
|
34
|
+
`| ${t('Tool')} | ${t('Description')} |`,
|
|
30
35
|
'|---|---|',
|
|
31
|
-
...rows.map(row => `| \`${row.name.replace(/\|/gu, '\\|')}\` | ${(row.description || 'No description provided.').replace(/\|/gu, '\\|')} |`),
|
|
36
|
+
...rows.map(row => `| \`${row.name.replace(/\|/gu, '\\|')}\` | ${(row.description || t('No description provided.')).replace(/\|/gu, '\\|')} |`),
|
|
32
37
|
]),
|
|
33
38
|
].join('\n');
|
|
34
39
|
}
|
|
40
|
+
/** Historical outcomes never imply that a connection is currently healthy. */
|
|
41
|
+
export function recentMcpCalls(events) {
|
|
42
|
+
const calls = new Map();
|
|
43
|
+
for (const event of events) {
|
|
44
|
+
if (event.type === 'tool/call' && event.data.name.startsWith('mcp__')) {
|
|
45
|
+
calls.set(event.data.callId, { id: event.data.callId, name: event.data.name, seq: event.seq, outcome: 'No result recorded', detail: '' });
|
|
46
|
+
}
|
|
47
|
+
else if (event.type === 'tool/ptc-dispatch-start' && event.data.name.startsWith('mcp__')) {
|
|
48
|
+
calls.set(event.data.subCallId, { id: event.data.subCallId, name: event.data.name, seq: event.seq, outcome: 'No result recorded', detail: '' });
|
|
49
|
+
}
|
|
50
|
+
else if (event.type === 'tool/result' || event.type === 'tool/ptc-dispatch') {
|
|
51
|
+
const result = event.type === 'tool/result' ? event.data.message : event.data;
|
|
52
|
+
const id = event.type === 'tool/result' ? event.data.message.toolCallId : event.data.subCallId;
|
|
53
|
+
let call = calls.get(id);
|
|
54
|
+
if (call === undefined && event.type === 'tool/ptc-dispatch' && event.data.name.startsWith('mcp__')) {
|
|
55
|
+
call = { id, name: event.data.name, seq: event.seq, outcome: 'No result recorded', detail: '' };
|
|
56
|
+
calls.set(id, call);
|
|
57
|
+
}
|
|
58
|
+
if (call !== undefined) {
|
|
59
|
+
call.outcome = result.isError ? 'Returned an error' : 'Completed';
|
|
60
|
+
call.detail = result.isError ? result.content.flatMap(block => block.type === 'text' ? [block.text] : []).join('\n') : '';
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return [...calls.values()].slice(-10).reverse();
|
|
65
|
+
}
|
|
35
66
|
async function showMcp(ctx, invocation) {
|
|
36
67
|
if (invocation.rawInput.trim() !== '')
|
|
37
68
|
return { kind: 'error', text: 'Usage: /mcp' };
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
const
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
69
|
+
const lifetime = new AbortController();
|
|
70
|
+
const signal = AbortSignal.any([invocation.signal, lifetime.signal]);
|
|
71
|
+
const tui = { prompt: (request) => ctx.tui.prompt({ ...request, signal, onSuperseded: () => lifetime.abort() }),
|
|
72
|
+
...(ctx.tui.copyText === undefined ? {} : { copyText: (text, label) => ctx.tui.copyText(text, label) }) };
|
|
73
|
+
const t = (source, values) => uiText(resolveUiLanguage(ctx.tui.prefs?.().uiLanguage), source, values);
|
|
74
|
+
const caveat = t('Plugin registration and tool availability do not verify transport health or authentication.');
|
|
75
|
+
const connection = t('Live connection and authentication status are unavailable in this Harness version.');
|
|
76
|
+
const setup = t('Configure project servers in `.dsh/mcp.json` or home servers in `$OMDSH_HOME/mcp.json` (default `~/.dsh/mcp.json`), then restart omdsh.');
|
|
77
|
+
let entries, tools = [], calls = [];
|
|
78
|
+
let loaded = false, error = '';
|
|
79
|
+
const load = async () => {
|
|
80
|
+
try {
|
|
81
|
+
const next = await ctx.get('pluginManager')?.listPlugins();
|
|
82
|
+
signal.throwIfAborted();
|
|
83
|
+
const schemas = ctx.get('tools')?.schemas(invocation.agent) ?? [];
|
|
84
|
+
const nextEntries = next?.filter(entry => entry.moduleName === '@deepseek-ai/dsh-mcp-client');
|
|
85
|
+
const nextTools = schemas.filter(schema => schema.name.startsWith('mcp__')).map(schema => ({ name: schema.name, description: schema.description }));
|
|
86
|
+
const nextCalls = recentMcpCalls(invocation.agent.session.snapshotEvents());
|
|
87
|
+
entries = nextEntries;
|
|
88
|
+
tools = nextTools;
|
|
89
|
+
calls = nextCalls;
|
|
90
|
+
loaded = true;
|
|
91
|
+
error = '';
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
if (!signal.aborted)
|
|
95
|
+
error = t(loaded ? 'Could not refresh MCP diagnostics. Showing the last loaded state; use Refresh to try again.' : 'Could not load MCP diagnostics. Use Refresh to try again.');
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
const phase = (entry) => t(!entry.enabled ? 'disabled' : entry.fiberPhase ?? 'not mounted');
|
|
99
|
+
const document = () => [
|
|
100
|
+
'## MCP', error, setup, '', connection, caveat, '', '### ' + t('Plugin registration'),
|
|
101
|
+
...(entries === undefined ? [t('Registration status is unavailable in this host.')] : entries.length === 0 ? [t('No MCP client entries are registered.')] : entries.map(entry => `- ${entry.entryId} · ${phase(entry)}${entry.diagnostic ? '\n ' + entry.diagnostic : ''}`)),
|
|
102
|
+
'', mcpCatalogText(tools, t), '', '### ' + t('Recent calls in this session'),
|
|
103
|
+
t('Recorded outcomes are historical; an error may come from the tool rather than the connection.'),
|
|
104
|
+
...calls.map(call => `${call.name} · ${t(call.outcome)} · #${call.seq}${call.detail ? '\n' + call.detail : ''}`),
|
|
105
|
+
...(calls.length === 0 ? [t('No MCP calls recorded in this session.')] : []),
|
|
53
106
|
].join('\n');
|
|
54
|
-
|
|
107
|
+
await load();
|
|
108
|
+
signal.throwIfAborted();
|
|
109
|
+
if (ctx.tui.interactive === false)
|
|
110
|
+
return { kind: error && !loaded ? 'error' : 'success', text: document() };
|
|
111
|
+
const browse = createPromptBrowser(tui.prompt);
|
|
112
|
+
while (!signal.aborted) {
|
|
113
|
+
const servers = [...new Set(tools.map(tool => /^mcp__(.+?)__/u.exec(tool.name)?.[1]).filter((server) => server !== undefined))];
|
|
114
|
+
const answer = await browse(choosePrompt({ title: t('MCP diagnostics'), question: t('Inspect registration, available tools and recent calls'), filterable: true,
|
|
115
|
+
detail: [error, connection, caveat, setup, entries === undefined ? t('Registration status is unavailable in this host.') : entries.length === 0 ? t('No MCP client entries are registered.') : ''].filter(Boolean).join('\n'),
|
|
116
|
+
signal, options: [
|
|
117
|
+
...servers.map(server => ({ label: server, value: `server:${server}`,
|
|
118
|
+
description: t('Tools: {count}', { count: tools.filter(tool => tool.name.startsWith(`mcp__${server}__`)).length }),
|
|
119
|
+
preview: calls.filter(call => call.name.startsWith(`mcp__${server}__`)).map(call => `${call.name} · ${t(call.outcome)}`).join('\n') })),
|
|
120
|
+
...(entries ?? []).map((entry, index) => ({ label: String(entry.entryId), value: `entry:${index}`, description: phase(entry),
|
|
121
|
+
...(entry.diagnostic ? { preview: entry.diagnostic } : {}) })),
|
|
122
|
+
{ label: t('Available tools'), value: 'tools', description: String(tools.length) },
|
|
123
|
+
{ label: t('Recent calls in this session'), value: 'calls', description: String(calls.length) },
|
|
124
|
+
{ label: t('Refresh'), value: 'refresh' },
|
|
125
|
+
] }));
|
|
126
|
+
if (signal.aborted || answer === null)
|
|
127
|
+
break;
|
|
128
|
+
if (answer === 'refresh') {
|
|
129
|
+
await load();
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
if (answer === 'tools') {
|
|
133
|
+
await browseTools(tui, tools, resolveUiLanguage(ctx.tui.prefs?.().uiLanguage), signal, 'Available tools');
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
if (answer.startsWith('server:')) {
|
|
137
|
+
const server = answer.slice(7);
|
|
138
|
+
const serverTools = tools.filter(tool => tool.name.startsWith(`mcp__${server}__`));
|
|
139
|
+
const recent = calls.filter(call => call.name.startsWith(`mcp__${server}__`));
|
|
140
|
+
await readReference(tui, server, [connection, '', mcpCatalogText(serverTools, t), '', '## ' + t('Recent calls in this session'),
|
|
141
|
+
...recent.map(call => `${call.name} · ${t(call.outcome)}${call.detail ? '\n\n' + call.detail : ''}`),
|
|
142
|
+
...(recent.length === 0 ? [t('No MCP calls recorded in this session.')] : [])].join('\n'), signal);
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
const entry = answer.startsWith('entry:') ? entries?.[Number(answer.slice(6))] : undefined;
|
|
146
|
+
const text = entry !== undefined ? [String(entry.entryId), phase(entry), entry.diagnostic, connection, t('Manage plugin configuration in /settings or /plugins.')].filter(Boolean).join('\n\n')
|
|
147
|
+
: answer === 'calls' ? [t('Recorded outcomes are historical; an error may come from the tool rather than the connection.'), ...calls.map(call => `${call.name} · ${t(call.outcome)} · #${call.seq}${call.detail ? '\n' + call.detail : ''}`), ...(calls.length === 0 ? [t('No MCP calls recorded in this session.')] : [])].join('\n\n') : undefined;
|
|
148
|
+
if (text !== undefined)
|
|
149
|
+
await readReference(tui, entry?.entryId ?? t('Recent calls in this session'), text, signal);
|
|
150
|
+
}
|
|
151
|
+
return { kind: 'success' };
|
|
55
152
|
}
|
|
56
153
|
export function apply(ctx) {
|
|
57
154
|
registerCommands(ctx, [
|
|
58
|
-
{ name: 'mcp', description: 'Inspect MCP registration and
|
|
155
|
+
{ name: 'mcp', description: 'Inspect MCP registration, tools and recent calls', handler: invocation => showMcp(ctx, invocation) },
|
|
59
156
|
], 'omdsh integration commands');
|
|
60
157
|
}
|
|
61
158
|
//# sourceMappingURL=integrations.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"integrations.js","sourceRoot":"","sources":["../../src/commands/integrations.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"integrations.js","sourceRoot":"","sources":["../../src/commands/integrations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/** Session-owned job navigation and non-consuming output observation. */
|
|
2
|
+
import { createPromptBrowser } from "../runtime/prompt-browser.js";
|
|
3
|
+
import { confirmPrompt, readPrompt } from "../prompt-intents.js";
|
|
4
|
+
import { resolveUiLanguage, uiText } from "../locale/index.js";
|
|
5
|
+
import { formatDuration } from "../chrome/status-line.js";
|
|
6
|
+
import { JOB_STATUS_WORD } from "../session/job-notice.js";
|
|
7
|
+
const live = (job) => job.status === 'running' || job.status === 'stopping';
|
|
8
|
+
const errorText = (error) => error instanceof Error ? error.message : String(error);
|
|
9
|
+
export async function browseJobs(ctx, invocation, initialId, stop = false) {
|
|
10
|
+
const lifetime = new AbortController();
|
|
11
|
+
const signal = AbortSignal.any([invocation.signal, lifetime.signal]);
|
|
12
|
+
const owner = invocation.agent.session.id;
|
|
13
|
+
const t = (source) => uiText(resolveUiLanguage(ctx.tui.prefs?.().uiLanguage), source);
|
|
14
|
+
const prompt = (request) => ctx.tui.prompt({ ...request, signal, notify: false, onSuperseded: () => lifetime.abort() });
|
|
15
|
+
const browse = createPromptBrowser(prompt);
|
|
16
|
+
let rows = [], diagnostic = '', failed = false, dirty = true;
|
|
17
|
+
const off = ctx.jobs.events.subscribe({ owner }, event => { if (event.type !== 'output')
|
|
18
|
+
dirty = true; });
|
|
19
|
+
const refresh = (force = false) => {
|
|
20
|
+
if (signal.aborted || (!force && !dirty))
|
|
21
|
+
return;
|
|
22
|
+
dirty = false;
|
|
23
|
+
try {
|
|
24
|
+
rows = ctx.jobs.list(owner);
|
|
25
|
+
failed = false;
|
|
26
|
+
diagnostic = '';
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
failed = true;
|
|
30
|
+
diagnostic = t('Could not refresh jobs. Showing the last loaded state.') + '\n' + errorText(error);
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
const current = (id) => { refresh(); return rows.find(row => row.id === id); };
|
|
34
|
+
const status = (job) => [t(JOB_STATUS_WORD[job.status]), formatDuration(Math.max(0, (job.finishedAt ?? Date.now()) - job.startedAt)), live(job) ? job.progress : job.detail].filter(Boolean).join(' · ');
|
|
35
|
+
const cancel = async (id) => {
|
|
36
|
+
refresh(true);
|
|
37
|
+
const job = current(id);
|
|
38
|
+
if (failed || !job || job.status !== 'running' || signal.aborted)
|
|
39
|
+
return;
|
|
40
|
+
if (!await confirmPrompt(prompt, { title: t('Stop job'), question: t('Stop this background job?'), detail: `${job.label || job.kind}\n${job.id}`,
|
|
41
|
+
acceptLabel: t('Stop job'), cancelLabel: t('Keep running'), signal }) || signal.aborted)
|
|
42
|
+
return;
|
|
43
|
+
refresh(true);
|
|
44
|
+
const latest = current(id);
|
|
45
|
+
if (failed || !latest || latest.status !== 'running')
|
|
46
|
+
return;
|
|
47
|
+
try {
|
|
48
|
+
ctx.jobs.kill(latest.id, owner, 'stopped from /jobs');
|
|
49
|
+
dirty = true;
|
|
50
|
+
refresh();
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
diagnostic = errorText(error);
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
const output = async (id) => {
|
|
57
|
+
const job = current(id);
|
|
58
|
+
if (!job || failed)
|
|
59
|
+
return;
|
|
60
|
+
let changed = true, source = { text: '' };
|
|
61
|
+
const unwatch = ctx.jobs.events.subscribe({ owner }, event => {
|
|
62
|
+
if ((event.type === 'output' ? event.id : event.job.id) === id)
|
|
63
|
+
changed = true;
|
|
64
|
+
});
|
|
65
|
+
const read = (following) => {
|
|
66
|
+
if (signal.aborted || !following || !changed)
|
|
67
|
+
return source;
|
|
68
|
+
changed = false;
|
|
69
|
+
try {
|
|
70
|
+
const state = ctx.jobs.get(job.id, owner);
|
|
71
|
+
const retained = ctx.jobs.readAt(job.id, 0, owner);
|
|
72
|
+
const text = retained.chunks.map(chunk => (chunk.gapBefore ? '\n…\n' : '') + chunk.text).join('');
|
|
73
|
+
// The host owns retention. The reader bounds its own snapshot and reports clipping.
|
|
74
|
+
const tail = text.slice(-262_144).split('\n').slice(-10_000).join('\n');
|
|
75
|
+
const clipped = tail.length !== text.length;
|
|
76
|
+
source = { text: [status(state), retained.lossy ? t('Earlier output is no longer retained.') : '',
|
|
77
|
+
clipped ? t('Showing the latest output; earlier text is omitted from this view.') : '',
|
|
78
|
+
tail || t('No retained output for this job.')].filter(Boolean).join('\n\n') };
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
source = { text: source.text + '\n\n' + t('Output observation stopped:') + ' ' + errorText(error) };
|
|
82
|
+
}
|
|
83
|
+
return source;
|
|
84
|
+
};
|
|
85
|
+
let position;
|
|
86
|
+
const options = () => [
|
|
87
|
+
{ label: t('Back'), value: 'back' },
|
|
88
|
+
{ label: t('Stop job'), value: 'stop', disabled: failed || current(id)?.status !== 'running' },
|
|
89
|
+
{ label: t('Refresh'), value: 'refresh' },
|
|
90
|
+
];
|
|
91
|
+
try {
|
|
92
|
+
while (!signal.aborted) {
|
|
93
|
+
const action = await prompt({ ...readPrompt({ title: t('Job output'), question: job.label || job.kind, source: read(position?.following !== false),
|
|
94
|
+
tail: true, ...(position === undefined ? {} : { position }), onPosition: value => { position = value; }, signal }),
|
|
95
|
+
options: options(), refreshOptions: options, refreshDocumentSource: read });
|
|
96
|
+
if (signal.aborted || action === null || action === 'back')
|
|
97
|
+
return;
|
|
98
|
+
if (action === 'stop')
|
|
99
|
+
await cancel(id);
|
|
100
|
+
else if (action === 'refresh') {
|
|
101
|
+
refresh(true);
|
|
102
|
+
changed = true;
|
|
103
|
+
read(true);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
finally {
|
|
108
|
+
unwatch();
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
try {
|
|
112
|
+
refresh(true);
|
|
113
|
+
if (initialId !== undefined) {
|
|
114
|
+
if (!failed && !current(initialId))
|
|
115
|
+
throw new Error(t('This job is no longer available.'));
|
|
116
|
+
if (stop)
|
|
117
|
+
await cancel(initialId);
|
|
118
|
+
else
|
|
119
|
+
await output(initialId);
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
let selected, key = '', cached = [];
|
|
123
|
+
const options = () => {
|
|
124
|
+
refresh();
|
|
125
|
+
const next = [...rows.filter(live), ...rows.filter(job => !live(job))].map(job => ({ label: job.label || job.kind, value: job.id,
|
|
126
|
+
description: status(job), preview: `${job.id}\n${job.kind}`, disabled: failed }));
|
|
127
|
+
next.push({ label: t('Refresh'), value: '__refresh__', description: '', preview: '', disabled: false });
|
|
128
|
+
const nextKey = JSON.stringify(next);
|
|
129
|
+
if (key !== nextKey) {
|
|
130
|
+
cached = next;
|
|
131
|
+
key = nextKey;
|
|
132
|
+
}
|
|
133
|
+
return cached;
|
|
134
|
+
};
|
|
135
|
+
const overview = () => { refresh(); return diagnostic || (rows.length ? t('Select a job to inspect output or stop it.') : t('No background jobs in this session.')); };
|
|
136
|
+
while (!signal.aborted) {
|
|
137
|
+
const answer = await browse({ title: t('Background jobs'), question: '', detail: overview(), refreshDocument: overview, options: options(), refreshOptions: options,
|
|
138
|
+
...(selected === undefined ? {} : { initialValue: selected }), filterable: true, allowCustom: false });
|
|
139
|
+
if (signal.aborted || answer === null)
|
|
140
|
+
return;
|
|
141
|
+
selected = answer;
|
|
142
|
+
refresh(true);
|
|
143
|
+
if (answer !== '__refresh__' && !failed)
|
|
144
|
+
await output(answer);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
finally {
|
|
148
|
+
lifetime.abort();
|
|
149
|
+
off();
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=jobs-browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jobs-browser.js","sourceRoot":"","sources":["../../src/commands/jobs-browser.ts"],"names":[],"mappings":"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"}
|
package/lib/commands/jobs.d.ts
CHANGED
|
@@ -1,16 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Human-facing background-job surface over the Harness job registry.
|
|
3
|
-
* `/jobs` lists this session's jobs, `/jobs <id>` replays one run's observer-only
|
|
4
|
-
* narration, and `/jobs kill <id>` requests cancellation.
|
|
5
|
-
*
|
|
6
|
-
* Reading `stdout` and `stderr` stays with the model: those channels feed the
|
|
7
|
-
* registry's consuming cursor, so a human read would steal the model's next
|
|
8
|
-
* `job_output`. The `log` channel is the opposite — the Harness marks it as
|
|
9
|
-
* producer narration that only observers see, which is why a workflow's phase
|
|
10
|
-
* lines can be replayed here without taking anything from the model.
|
|
11
|
-
*
|
|
12
|
-
* @module @agi-fans/dsh-tui/command-jobs
|
|
13
|
-
*/
|
|
1
|
+
/** Background jobs: interactive observation and line-mode narration over Harness ownership. */
|
|
14
2
|
import type { Context } from '@deepseek-ai/cordis';
|
|
15
3
|
import { type JobOutputRead, type JobView } from '@deepseek-ai/dsh-jobs';
|
|
16
4
|
export declare const name = "omdsh-command-jobs";
|
|
@@ -22,7 +10,8 @@ export declare function jobsText(jobs: readonly JobView[], now: number): string;
|
|
|
22
10
|
*
|
|
23
11
|
* `readAt` from zero reads retained bytes at absolute offsets without moving the
|
|
24
12
|
* model's cursor; only `log` chunks are printed, because `stdout` and `stderr`
|
|
25
|
-
*
|
|
13
|
+
* are omitted from this line-mode narration. The interactive browser observes all
|
|
14
|
+
* channels with the same non-consuming API. A lossy read says so rather than pretending the
|
|
26
15
|
* run started where retention begins.
|
|
27
16
|
*/
|
|
28
17
|
export declare function runText(snapshot: JobView, read: JobOutputRead, now: number): string;
|
package/lib/commands/jobs.js
CHANGED
|
@@ -1,22 +1,11 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Human-facing background-job surface over the Harness job registry.
|
|
3
|
-
* `/jobs` lists this session's jobs, `/jobs <id>` replays one run's observer-only
|
|
4
|
-
* narration, and `/jobs kill <id>` requests cancellation.
|
|
5
|
-
*
|
|
6
|
-
* Reading `stdout` and `stderr` stays with the model: those channels feed the
|
|
7
|
-
* registry's consuming cursor, so a human read would steal the model's next
|
|
8
|
-
* `job_output`. The `log` channel is the opposite — the Harness marks it as
|
|
9
|
-
* producer narration that only observers see, which is why a workflow's phase
|
|
10
|
-
* lines can be replayed here without taking anything from the model.
|
|
11
|
-
*
|
|
12
|
-
* @module @agi-fans/dsh-tui/command-jobs
|
|
13
|
-
*/
|
|
1
|
+
/** Background jobs: interactive observation and line-mode narration over Harness ownership. */
|
|
14
2
|
import { JobId } from '@deepseek-ai/dsh-jobs';
|
|
15
3
|
import { formatDuration } from "../chrome/status-line.js";
|
|
16
4
|
import { JOB_STATUS_WORD } from "../session/job-notice.js";
|
|
5
|
+
import { browseJobs } from "./jobs-browser.js";
|
|
17
6
|
import { registerCommands } from "./registration.js";
|
|
18
7
|
export const name = 'omdsh-command-jobs';
|
|
19
|
-
export const inject = ['commands', 'jobs'];
|
|
8
|
+
export const inject = ['commands', 'jobs', 'tui'];
|
|
20
9
|
function elapsed(snapshot, now) {
|
|
21
10
|
const end = snapshot.finishedAt ?? now;
|
|
22
11
|
return formatDuration(Math.max(0, end - snapshot.startedAt));
|
|
@@ -66,7 +55,8 @@ function killJob(ctx, invocation) {
|
|
|
66
55
|
*
|
|
67
56
|
* `readAt` from zero reads retained bytes at absolute offsets without moving the
|
|
68
57
|
* model's cursor; only `log` chunks are printed, because `stdout` and `stderr`
|
|
69
|
-
*
|
|
58
|
+
* are omitted from this line-mode narration. The interactive browser observes all
|
|
59
|
+
* channels with the same non-consuming API. A lossy read says so rather than pretending the
|
|
70
60
|
* run started where retention begins.
|
|
71
61
|
*/
|
|
72
62
|
export function runText(snapshot, read, now) {
|
|
@@ -96,9 +86,13 @@ function showRun(ctx, invocation, id) {
|
|
|
96
86
|
return { kind: 'error', text: error instanceof Error ? error.message : String(error) };
|
|
97
87
|
}
|
|
98
88
|
}
|
|
99
|
-
function showJobs(ctx, invocation) {
|
|
89
|
+
async function showJobs(ctx, invocation) {
|
|
100
90
|
const raw = invocation.rawInput.trim();
|
|
101
91
|
if (raw === '') {
|
|
92
|
+
if (ctx.tui.interactive === true) {
|
|
93
|
+
await browseJobs(ctx, invocation);
|
|
94
|
+
return { kind: 'success' };
|
|
95
|
+
}
|
|
102
96
|
return { kind: 'success', text: jobsText(ctx.jobs.list(invocation.agent.session.id), Date.now()) };
|
|
103
97
|
}
|
|
104
98
|
const [verb, ...rest] = raw.split(/\s+/u);
|
|
@@ -106,20 +100,34 @@ function showJobs(ctx, invocation) {
|
|
|
106
100
|
const id = rest[0];
|
|
107
101
|
if (id === undefined || rest.length > 1)
|
|
108
102
|
return { kind: 'error', text: 'Usage: /jobs kill <id>' };
|
|
103
|
+
if (ctx.tui.interactive === true) {
|
|
104
|
+
await browseJobs(ctx, invocation, id, true);
|
|
105
|
+
return { kind: 'success' };
|
|
106
|
+
}
|
|
109
107
|
return killJob(ctx, { ...invocation, rawInput: id });
|
|
110
108
|
}
|
|
111
|
-
if (rest.length === 0)
|
|
109
|
+
if (rest.length === 0) {
|
|
110
|
+
if (ctx.tui.interactive === true) {
|
|
111
|
+
await browseJobs(ctx, invocation, verb);
|
|
112
|
+
return { kind: 'success' };
|
|
113
|
+
}
|
|
112
114
|
return showRun(ctx, invocation, verb);
|
|
115
|
+
}
|
|
113
116
|
return { kind: 'error', text: 'Usage: /jobs [<id>|kill <id>]' };
|
|
114
117
|
}
|
|
115
118
|
export function apply(ctx) {
|
|
119
|
+
const closing = new AbortController();
|
|
116
120
|
registerCommands(ctx, [
|
|
117
121
|
{
|
|
118
122
|
name: 'jobs',
|
|
119
123
|
description: 'List background jobs, replay one run, or stop one',
|
|
120
124
|
input: { hint: '[<id>|kill <id>]' },
|
|
121
|
-
handler: invocation =>
|
|
125
|
+
handler: invocation => {
|
|
126
|
+
const active = ctx.get('omdshSession')?.interactionSignal;
|
|
127
|
+
return showJobs(ctx, { ...invocation, signal: AbortSignal.any([invocation.signal, closing.signal, ...(active ? [active] : [])]) });
|
|
128
|
+
},
|
|
122
129
|
},
|
|
123
130
|
], 'omdsh jobs command');
|
|
131
|
+
ctx.effect(() => () => { closing.abort(); });
|
|
124
132
|
}
|
|
125
133
|
//# sourceMappingURL=jobs.js.map
|
package/lib/commands/jobs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jobs.js","sourceRoot":"","sources":["../../src/commands/jobs.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"jobs.js","sourceRoot":"","sources":["../../src/commands/jobs.ts"],"names":[],"mappings":"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"}
|
package/lib/commands/model.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/** Model/provider selection command registered through dsh-commands. */
|
|
2
2
|
import type { Context } from '@deepseek-ai/cordis';
|
|
3
|
+
import type { CommandInvocation, CommandResult } from '@deepseek-ai/dsh-commands';
|
|
3
4
|
export declare const name = "omdsh-command-model";
|
|
4
5
|
export declare const inject: string[];
|
|
5
6
|
/** One public-catalog model row used by query resolution (no private metadata). */
|
|
@@ -27,4 +28,6 @@ export type ModelQueryResolution = {
|
|
|
27
28
|
* fetches the catalog and performs the side effects.
|
|
28
29
|
*/
|
|
29
30
|
export declare function resolveModelQuery(query: string, catalog: readonly ModelCatalogEntry[]): ModelQueryResolution;
|
|
31
|
+
/** Shared picker retains favorites, reasoning defaults and session/default scope. */
|
|
32
|
+
export declare function openModelPicker(ctx: Context, invocation: Pick<CommandInvocation, 'agent' | 'signal'>, sessionOnly?: boolean, providerId?: string, favoritesOnly?: boolean): Promise<CommandResult>;
|
|
30
33
|
export declare function apply(ctx: Context): void;
|