@agi-fans/dsh-tui 0.22.0 → 0.23.0
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 +199 -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 +97 -32
- package/lib/commands/export.js.map +1 -1
- package/lib/commands/files.js +2 -8
- 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 +197 -120
- 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 +111 -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 +112 -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 +1264 -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 +32 -13
- package/lib/session/session-controller.js +444 -98
- package/lib/session/session-controller.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 +10 -7
- package/lib/views/autocomplete.js +44 -37
- 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 +59 -5
- 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
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
import { credentialRef } from '@deepseek-ai/dsh-credentials';
|
|
2
|
+
import { rebaseSettingsDraft, settingsDraftSummary } from "./settings-draft.js";
|
|
3
|
+
import z from '@deepseek-ai/schemastery';
|
|
4
|
+
import { askPrompt } from "../prompt-intents.js";
|
|
5
|
+
import { resolveUiLanguage, uiText } from "../locale/index.js";
|
|
6
|
+
import { parseBaseURL } from "../commands/auth-input.js";
|
|
7
|
+
const ID = 'web:settings';
|
|
8
|
+
const namespaces = ['web', 'web-deepseek-api', 'web-search-deepseek'];
|
|
9
|
+
const list = { allowCustom: false, notify: false, localize: ['title', 'question', 'actions'] };
|
|
10
|
+
const object = (value) => typeof value === 'object' && value !== null && !Array.isArray(value) ? value : {};
|
|
11
|
+
const string = (value) => typeof value === 'string' ? value : '';
|
|
12
|
+
const text = (ctx, source) => uiText(resolveUiLanguage(ctx.tui.prefs().uiLanguage), source);
|
|
13
|
+
const describe = (ctx, ns) => ctx.settings.describe({ redactSecrets: true }).find(section => section.ns === ns);
|
|
14
|
+
const errorText = (error) => error instanceof Error ? error.message : String(error);
|
|
15
|
+
const metadata = {
|
|
16
|
+
'deepseek-search-api': { label: 'DeepSeek Search API', description: 'Uses the conversation’s DeepSeek account or the configured API key. Calls the hosted Search API without an auxiliary model turn; service charges may apply.' },
|
|
17
|
+
'deepseek-official': { label: 'DeepSeek (legacy)', description: 'Uses the conversation’s DeepSeek account or the configured API key. Runs an auxiliary Messages model turn with web search; model charges apply.' },
|
|
18
|
+
http: { label: 'Direct fetch', description: 'Fetches from this computer without a model or DeepSeek credential. Local DNS and network access apply; private addresses are blocked and content is bounded.' },
|
|
19
|
+
'deepseek-fetch-api': { label: 'DeepSeek Fetch API', description: 'Uses the conversation’s DeepSeek account or the configured API key. Fetches through DeepSeek without an auxiliary model turn or local DNS lookup; service charges and content limits apply.' },
|
|
20
|
+
};
|
|
21
|
+
/** Only fields served by the combined editor leave their generic forms. */
|
|
22
|
+
export const WEB_SETTINGS_FIELDS = {
|
|
23
|
+
web: ['searchProvider', 'fetchProvider'],
|
|
24
|
+
'web-deepseek-api': ['count'],
|
|
25
|
+
'web-search-deepseek': ['maxUses', 'baseURL', 'apiKey'],
|
|
26
|
+
};
|
|
27
|
+
export function webSettingsEntry(ctx) {
|
|
28
|
+
if (ctx.get('omdshWebProviders') === undefined || describe(ctx, 'web') === undefined)
|
|
29
|
+
return [];
|
|
30
|
+
return [{ id: ID, label: 'Web search and fetch', section: 'integrations', fields: [], behavior: ctx.settings.writable ? 'Profile · Apply to save' : 'Profile · Read only', summary: 'Configure',
|
|
31
|
+
description: 'Choose search and fetch providers, edit their settings, then Apply to save.' }];
|
|
32
|
+
}
|
|
33
|
+
export async function openWebSettings(ctx, signal) {
|
|
34
|
+
if (ctx.get('omdshWebProviders') === undefined)
|
|
35
|
+
return;
|
|
36
|
+
const drafts = new Map();
|
|
37
|
+
for (const ns of namespaces) {
|
|
38
|
+
const section = describe(ctx, ns);
|
|
39
|
+
if (section !== undefined)
|
|
40
|
+
drafts.set(ns, { section, changes: new Map() });
|
|
41
|
+
}
|
|
42
|
+
if (!drafts.has('web'))
|
|
43
|
+
return;
|
|
44
|
+
let catalog = { search: [], fetch: [] };
|
|
45
|
+
let dirty = true, loadError = '', diagnostic = '', key = '', keyRef = '';
|
|
46
|
+
const effective = (ns, field) => {
|
|
47
|
+
const draft = drafts.get(ns);
|
|
48
|
+
if (draft === undefined)
|
|
49
|
+
return undefined;
|
|
50
|
+
const root = new z(draft.section.schema);
|
|
51
|
+
const base = object(draft.section.base)[field] ?? root.dict?.[field]?.meta.default;
|
|
52
|
+
return draft.changes.has(field) ? draft.changes.get(field) ?? base : object(draft.section.value)[field] ?? root.dict?.[field]?.meta.default;
|
|
53
|
+
};
|
|
54
|
+
const selected = (kind) => string(effective('web', kind + 'Provider'));
|
|
55
|
+
const legacyRef = () => string(object(describe(ctx, 'web-search-deepseek')?.value).apiKeyEnv) || 'DEEPSEEK_API_KEY';
|
|
56
|
+
const invalidate = () => { dirty = true; };
|
|
57
|
+
const off = [ctx.on('omdsh/web-providers-changed', invalidate), ctx.on('settings/document-updated', invalidate), ctx.on('credentials/reference-updated', invalidate)];
|
|
58
|
+
const refresh = () => {
|
|
59
|
+
if (!dirty)
|
|
60
|
+
return;
|
|
61
|
+
dirty = false;
|
|
62
|
+
try {
|
|
63
|
+
const directory = ctx.get('omdshWebProviders');
|
|
64
|
+
if (directory === undefined)
|
|
65
|
+
throw new Error('Web provider directory unavailable');
|
|
66
|
+
catalog = directory.list();
|
|
67
|
+
loadError = '';
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
loadError = 'Provider list could not be loaded. The last known list is shown; retry to refresh it.';
|
|
71
|
+
}
|
|
72
|
+
if (key && keyRef !== legacyRef()) {
|
|
73
|
+
key = '';
|
|
74
|
+
keyRef = '';
|
|
75
|
+
diagnostic = 'The credential reference changed. Enter the key again for the current reference.';
|
|
76
|
+
}
|
|
77
|
+
// Clean sections can follow external edits. Dirty sections retain their revision fence.
|
|
78
|
+
for (const [ns, draft] of drafts) {
|
|
79
|
+
if (draft.changes.size || ns === 'web-search-deepseek' && key)
|
|
80
|
+
continue;
|
|
81
|
+
const next = describe(ctx, ns);
|
|
82
|
+
if (next !== undefined)
|
|
83
|
+
draft.section = next;
|
|
84
|
+
}
|
|
85
|
+
for (const ns of namespaces) {
|
|
86
|
+
const next = describe(ctx, ns);
|
|
87
|
+
if (next !== undefined && !drafts.has(ns))
|
|
88
|
+
drafts.set(ns, { section: next, changes: new Map() });
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
const providerLabel = (id) => id === '' ? text(ctx, 'Automatic') : !Object.hasOwn(metadata, id) ? id : text(ctx, metadata[id].label);
|
|
92
|
+
const providerDescription = (id) => id === '' ? text(ctx, 'Use the deployment or environment selection; multiple usable providers can be ambiguous.') : !Object.hasOwn(metadata, id) ? text(ctx, 'Configure this provider in its plugin settings.') : text(ctx, metadata[id].description);
|
|
93
|
+
const fieldSummary = (ns, field) => {
|
|
94
|
+
const draft = drafts.get(ns);
|
|
95
|
+
const origin = draft.changes.has(field) ? 'Draft' : Object.hasOwn(object(draft.section.user), field) ? 'Profile override' : 'Inherited';
|
|
96
|
+
return String(effective(ns, field) ?? text(ctx, 'Inherited')) + ' · ' + text(ctx, origin);
|
|
97
|
+
};
|
|
98
|
+
const selectionSummary = (kind) => {
|
|
99
|
+
const id = selected(kind), provider = catalog[kind].find(row => row.id === id);
|
|
100
|
+
const state = id === '' ? '' : provider === undefined ? 'Not loaded' : !provider.available ? 'Unavailable' : '';
|
|
101
|
+
return providerLabel(id) + (state ? ' · ' + text(ctx, state) : '');
|
|
102
|
+
};
|
|
103
|
+
const check = (draft) => {
|
|
104
|
+
signal.throwIfAborted();
|
|
105
|
+
if (!ctx.settings.writable)
|
|
106
|
+
throw new Error('This profile is read-only.');
|
|
107
|
+
if (describe(ctx, draft.section.ns)?.revision !== draft.section.revision)
|
|
108
|
+
throw new Error('Configuration changed. Load the latest settings to continue with your draft.');
|
|
109
|
+
};
|
|
110
|
+
const commit = async (ns) => {
|
|
111
|
+
const draft = drafts.get(ns);
|
|
112
|
+
if (draft === undefined || draft.changes.size === 0)
|
|
113
|
+
return;
|
|
114
|
+
check(draft);
|
|
115
|
+
const ops = [...draft.changes].map(([field, value]) => value === undefined ? { op: 'unset', path: [field] } : { op: 'set', path: [field], value });
|
|
116
|
+
await ctx.settings.mutate(ns, ops, draft.section.revision);
|
|
117
|
+
draft.changes.clear();
|
|
118
|
+
const next = describe(ctx, ns);
|
|
119
|
+
if (next === undefined)
|
|
120
|
+
throw new Error('Web settings are no longer available.');
|
|
121
|
+
draft.section = next;
|
|
122
|
+
};
|
|
123
|
+
const chooseProvider = async (kind) => {
|
|
124
|
+
const draft = drafts.get('web'), field = kind + 'Provider';
|
|
125
|
+
let rows = [];
|
|
126
|
+
const options = () => {
|
|
127
|
+
const update = dirty || rows.length === 0;
|
|
128
|
+
refresh();
|
|
129
|
+
if (!update)
|
|
130
|
+
return rows;
|
|
131
|
+
const priority = kind === 'search' ? ['deepseek-search-api', 'deepseek-official'] : ['http', 'deepseek-fetch-api'];
|
|
132
|
+
const rank = (id) => priority.includes(id) ? priority.indexOf(id) : priority.length;
|
|
133
|
+
const providers = [...catalog[kind]].sort((a, b) => rank(a.id) - rank(b.id));
|
|
134
|
+
const current = selected(kind), base = string(object(draft.section.base)[field]);
|
|
135
|
+
const ids = [...new Set([...providers.map(provider => provider.id), ...[current, base].filter(Boolean)])];
|
|
136
|
+
rows = [...(base === '' ? [{ label: text(ctx, 'Automatic'), value: '@automatic', description: text(ctx, 'Use the deployment or environment selection; multiple usable providers can be ambiguous.') }] : []),
|
|
137
|
+
...ids.map(id => {
|
|
138
|
+
const provider = providers.find(item => item.id === id);
|
|
139
|
+
return { label: providerLabel(id), value: 'provider:' + id, description: id, preview: providerDescription(id),
|
|
140
|
+
badge: { label: provider === undefined ? text(ctx, 'Not loaded') : !provider.available ? text(ctx, 'Unavailable') : id === base ? text(ctx, 'Deployment default') : '', tone: 'muted' } };
|
|
141
|
+
}), { label: text(ctx, 'Refresh'), value: '@refresh' }];
|
|
142
|
+
if (loadError)
|
|
143
|
+
rows = [{ label: text(ctx, 'Load error'), value: '@error', description: text(ctx, loadError), disabled: true }, ...rows];
|
|
144
|
+
return rows;
|
|
145
|
+
};
|
|
146
|
+
while (!signal.aborted) {
|
|
147
|
+
const answer = await ctx.tui.prompt({ ...list, title: kind === 'search' ? 'Search provider' : 'Fetch provider', question: 'Choose a provider', filterable: true,
|
|
148
|
+
initialValue: selected(kind) ? 'provider:' + selected(kind) : '@automatic', options: options(), refreshOptions: options, signal });
|
|
149
|
+
if (answer === null)
|
|
150
|
+
return;
|
|
151
|
+
if (answer === '@refresh') {
|
|
152
|
+
dirty = true;
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
if (answer !== '@automatic' && !answer.startsWith('provider:'))
|
|
156
|
+
continue;
|
|
157
|
+
const id = answer === '@automatic' ? '' : answer.slice(9);
|
|
158
|
+
const base = string(object(draft.section.base)[field]);
|
|
159
|
+
draft.changes.set(field, id === '' || id === base ? undefined : id);
|
|
160
|
+
if (kind === 'search' && id !== 'deepseek-official') {
|
|
161
|
+
key = '';
|
|
162
|
+
keyRef = '';
|
|
163
|
+
}
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
const editField = async (ns, field, label) => {
|
|
168
|
+
const draft = drafts.get(ns);
|
|
169
|
+
if (draft === undefined)
|
|
170
|
+
return;
|
|
171
|
+
let input = String(effective(ns, field) ?? ''), error = '';
|
|
172
|
+
while (!signal.aborted) {
|
|
173
|
+
const raw = await ctx.tui.prompt(askPrompt({ localize: ['title', 'question', 'actions'], title: 'Web search and fetch', question: label,
|
|
174
|
+
detail: text(ctx, error || 'Leave empty to restore inheritance.'), initialInput: input, signal }));
|
|
175
|
+
if (raw === null)
|
|
176
|
+
return;
|
|
177
|
+
input = raw;
|
|
178
|
+
try {
|
|
179
|
+
let value = undefined;
|
|
180
|
+
if (raw.trim()) {
|
|
181
|
+
if (field === 'baseURL')
|
|
182
|
+
value = parseBaseURL(raw);
|
|
183
|
+
else {
|
|
184
|
+
const number = Number(raw.trim());
|
|
185
|
+
if (!/^\d+$/u.test(raw.trim()) || !Number.isSafeInteger(number) || number < 1 || field === 'count' && number > 50)
|
|
186
|
+
throw new Error(field === 'count' ? 'Enter a whole number from 1 to 50.' : 'Enter a positive whole number.');
|
|
187
|
+
value = number;
|
|
188
|
+
}
|
|
189
|
+
new z(draft.section.schema).dict?.[field]?.(value);
|
|
190
|
+
}
|
|
191
|
+
draft.changes.set(field, value);
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
catch (cause) {
|
|
195
|
+
error = errorText(cause);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
};
|
|
199
|
+
try {
|
|
200
|
+
while (!signal.aborted) {
|
|
201
|
+
refresh();
|
|
202
|
+
const writable = ctx.settings.writable;
|
|
203
|
+
const legacy = selected('search') === 'deepseek-official' && describe(ctx, 'web-search-deepseek') !== undefined;
|
|
204
|
+
const api = selected('search') === 'deepseek-search-api' && describe(ctx, 'web-deepseek-api') !== undefined;
|
|
205
|
+
let credential = '';
|
|
206
|
+
if (legacy) {
|
|
207
|
+
try {
|
|
208
|
+
const info = await ctx.credentials.describe(credentialRef(legacyRef()));
|
|
209
|
+
credential = info.configured ? info.source === 'file' ? 'Key stored locally' : 'Environment credential' : 'Key not configured';
|
|
210
|
+
}
|
|
211
|
+
catch {
|
|
212
|
+
credential = 'Credential status unavailable';
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
if (signal.aborted)
|
|
216
|
+
return;
|
|
217
|
+
const answer = await ctx.tui.prompt({ ...list, title: 'Web search and fetch', question: 'Edit the draft, then Apply to save',
|
|
218
|
+
detail: [settingsDraftSummary(ctx, [...drafts.values()].reduce((count, draft) => count + draft.changes.size, key ? 1 : 0)), ...[diagnostic, loadError].filter(Boolean).map(message => text(ctx, message))].join('\n'),
|
|
219
|
+
options: [
|
|
220
|
+
{ label: text(ctx, 'Search provider'), value: 'search', description: selectionSummary('search'), preview: providerDescription(selected('search')), disabled: !writable || !!diagnostic },
|
|
221
|
+
{ label: text(ctx, 'Fetch provider'), value: 'fetch', description: selectionSummary('fetch'), preview: providerDescription(selected('fetch')), disabled: !writable || !!diagnostic },
|
|
222
|
+
...(api ? [{ label: text(ctx, 'Results per search'), value: 'count', description: fieldSummary('web-deepseek-api', 'count'), disabled: !writable }] : []),
|
|
223
|
+
...(legacy ? [
|
|
224
|
+
{ label: text(ctx, 'API key'), value: 'key', description: text(ctx, key ? 'New key ready to save' : credential), disabled: !writable },
|
|
225
|
+
{ label: text(ctx, 'Base URL'), value: 'baseURL', description: fieldSummary('web-search-deepseek', 'baseURL'), disabled: !writable },
|
|
226
|
+
{ label: text(ctx, 'Maximum searches per request'), value: 'maxUses', description: fieldSummary('web-search-deepseek', 'maxUses'), disabled: !writable },
|
|
227
|
+
] : []),
|
|
228
|
+
...([...drafts.values()].some(draft => describe(ctx, draft.section.ns)?.revision !== draft.section.revision) ? [{ label: text(ctx, 'Load latest and keep draft'), value: 'reload' }] : []),
|
|
229
|
+
{ label: text(ctx, 'Refresh'), value: 'refresh' }, { label: text(ctx, 'Apply'), value: 'apply', disabled: !writable }, { label: text(ctx, 'Cancel'), value: 'cancel' },
|
|
230
|
+
], signal });
|
|
231
|
+
if (answer === null || answer === 'cancel')
|
|
232
|
+
return;
|
|
233
|
+
if (answer === 'refresh') {
|
|
234
|
+
dirty = true;
|
|
235
|
+
continue;
|
|
236
|
+
}
|
|
237
|
+
if (!writable)
|
|
238
|
+
continue;
|
|
239
|
+
try {
|
|
240
|
+
if (answer === 'reload') {
|
|
241
|
+
const rebased = new Map();
|
|
242
|
+
for (const [ns, draft] of drafts) {
|
|
243
|
+
const latest = describe(ctx, ns);
|
|
244
|
+
if (latest === undefined)
|
|
245
|
+
throw new Error('These settings are no longer available. Cancel and reopen Settings.');
|
|
246
|
+
const result = await rebaseSettingsDraft(ctx, draft.section, latest, draft.changes, [...draft.changes.keys()].map(field => ({
|
|
247
|
+
key: field, label: { count: 'Results per search', maxUses: 'Maximum searches per request', baseURL: 'Base URL', searchProvider: 'Search provider', fetchProvider: 'Fetch provider' }[field] ?? field,
|
|
248
|
+
defaultValue: new z(latest.schema).dict?.[field]?.meta.default,
|
|
249
|
+
format: (value) => String(value ?? text(ctx, 'Inherited')),
|
|
250
|
+
})), signal);
|
|
251
|
+
if (result === undefined)
|
|
252
|
+
break;
|
|
253
|
+
rebased.set(ns, result);
|
|
254
|
+
}
|
|
255
|
+
if (rebased.size !== drafts.size || signal.aborted)
|
|
256
|
+
continue;
|
|
257
|
+
for (const [ns, draft] of rebased)
|
|
258
|
+
drafts.set(ns, draft);
|
|
259
|
+
diagnostic = '';
|
|
260
|
+
dirty = true;
|
|
261
|
+
continue;
|
|
262
|
+
}
|
|
263
|
+
if (answer === 'search' || answer === 'fetch') {
|
|
264
|
+
if (!diagnostic)
|
|
265
|
+
await chooseProvider(answer);
|
|
266
|
+
continue;
|
|
267
|
+
}
|
|
268
|
+
if (answer === 'count' && api) {
|
|
269
|
+
await editField('web-deepseek-api', 'count', 'Results per search');
|
|
270
|
+
diagnostic = '';
|
|
271
|
+
continue;
|
|
272
|
+
}
|
|
273
|
+
if ((answer === 'baseURL' || answer === 'maxUses') && legacy) {
|
|
274
|
+
await editField('web-search-deepseek', answer, answer === 'baseURL' ? 'Base URL' : 'Maximum searches per request');
|
|
275
|
+
diagnostic = '';
|
|
276
|
+
continue;
|
|
277
|
+
}
|
|
278
|
+
if (answer === 'key' && legacy) {
|
|
279
|
+
const raw = await ctx.tui.prompt(askPrompt({ localize: true, title: 'Web search and fetch', question: 'API key', detail: 'Leave empty to keep the saved credential. Stored keys are never displayed.', initialInput: key, secret: true, signal }));
|
|
280
|
+
if (raw !== null) {
|
|
281
|
+
const value = raw.trim();
|
|
282
|
+
if (value && (!/^[\x21-\x7e]+$/u.test(value) || /^\w+=/u.test(value) || /^(".*"|'.*')$/u.test(value)))
|
|
283
|
+
throw new Error('Paste only the API key, without quotes or an environment assignment.');
|
|
284
|
+
key = value;
|
|
285
|
+
keyRef = legacyRef();
|
|
286
|
+
diagnostic = '';
|
|
287
|
+
}
|
|
288
|
+
continue;
|
|
289
|
+
}
|
|
290
|
+
if (answer !== 'apply')
|
|
291
|
+
continue;
|
|
292
|
+
for (const [ns, draft] of drafts)
|
|
293
|
+
if (draft.changes.size || ns === 'web-search-deepseek' && key)
|
|
294
|
+
check(draft);
|
|
295
|
+
if (key) {
|
|
296
|
+
if (keyRef !== legacyRef()) {
|
|
297
|
+
key = '';
|
|
298
|
+
keyRef = '';
|
|
299
|
+
throw new Error('The credential reference changed. Enter the key again for the current reference.');
|
|
300
|
+
}
|
|
301
|
+
if (!(await ctx.credentials.describe(credentialRef(keyRef))).writable)
|
|
302
|
+
throw new Error('This credential is managed externally. Update its source before replacing it.');
|
|
303
|
+
const draft = drafts.get('web-search-deepseek');
|
|
304
|
+
if (draft.section.secrets?.some(secret => secret.path.join('.') === 'apiKey' && secret.set))
|
|
305
|
+
draft.changes.set('apiKey', undefined);
|
|
306
|
+
}
|
|
307
|
+
await commit('web-deepseek-api');
|
|
308
|
+
await commit('web-search-deepseek');
|
|
309
|
+
if (key) {
|
|
310
|
+
if (drafts.get('web-search-deepseek').section.secrets?.some(secret => secret.path.join('.') === 'apiKey' && secret.set))
|
|
311
|
+
throw new Error('A deployment API key still takes precedence. Update its source before replacing the referenced key.');
|
|
312
|
+
check(drafts.get('web-search-deepseek'));
|
|
313
|
+
try {
|
|
314
|
+
await ctx.credentials.set(credentialRef(keyRef), key);
|
|
315
|
+
}
|
|
316
|
+
catch {
|
|
317
|
+
throw new Error('Provider settings saved, but the key could not be stored. Apply retries the key before changing providers.');
|
|
318
|
+
}
|
|
319
|
+
key = '';
|
|
320
|
+
keyRef = '';
|
|
321
|
+
}
|
|
322
|
+
await commit('web');
|
|
323
|
+
ctx.tui.notice('Web search and fetch settings saved.');
|
|
324
|
+
return;
|
|
325
|
+
}
|
|
326
|
+
catch (error) {
|
|
327
|
+
if (signal.aborted)
|
|
328
|
+
return;
|
|
329
|
+
diagnostic = errorText(error);
|
|
330
|
+
ctx.tui.notice(text(ctx, diagnostic), { level: 'error' });
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
finally {
|
|
335
|
+
for (const dispose of off)
|
|
336
|
+
dispose();
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
//# sourceMappingURL=web-settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-settings.js","sourceRoot":"","sources":["../../src/runtime/web-settings.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Agent } from '@deepseek-ai/dsh-agent';
|
|
2
|
+
import type CommandRuntime from '@deepseek-ai/dsh-commands';
|
|
3
|
+
import type { CommandSubmitAttachment } from '@deepseek-ai/dsh-commands';
|
|
4
|
+
import type { SubmissionSegment, TuiInputImage, TuiSubmission } from '../definition.ts';
|
|
5
|
+
/** Preserve visible order and retain unmarked attachments from older drafts. */
|
|
6
|
+
export declare function orderedAttachments<T, U>(images: readonly T[], files: readonly U[], segments?: readonly SubmissionSegment[]): (T | U)[];
|
|
7
|
+
export declare function encodeCommandAttachments(images: readonly TuiInputImage[]): CommandSubmitAttachment[];
|
|
8
|
+
/** One authority per local session runtime; receipts cannot cross Agent identities or survive dispatch. */
|
|
9
|
+
export declare class CommandAttachments {
|
|
10
|
+
#private;
|
|
11
|
+
constructor(commands: Pick<CommandRuntime, 'registerFileReceiptResolver'>);
|
|
12
|
+
stage(agent: Agent, submission: TuiSubmission): {
|
|
13
|
+
attachments: CommandSubmitAttachment[];
|
|
14
|
+
dispose(): void;
|
|
15
|
+
};
|
|
16
|
+
dispose(): void;
|
|
17
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/** Scoped, short-lived file receipts for the published command admission path. */
|
|
2
|
+
import { randomUUID } from 'node:crypto';
|
|
3
|
+
/** Preserve visible order and retain unmarked attachments from older drafts. */
|
|
4
|
+
export function orderedAttachments(images, files, segments) {
|
|
5
|
+
const result = [], placedImages = new Set(), placedFiles = new Set();
|
|
6
|
+
for (const segment of segments ?? []) {
|
|
7
|
+
if (segment.kind === 'text')
|
|
8
|
+
continue;
|
|
9
|
+
const items = segment.kind === 'image' ? images : files;
|
|
10
|
+
const placed = segment.kind === 'image' ? placedImages : placedFiles;
|
|
11
|
+
const item = items[segment.index];
|
|
12
|
+
if (item !== undefined && !placed.has(segment.index)) {
|
|
13
|
+
result.push(item);
|
|
14
|
+
placed.add(segment.index);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
images.forEach((item, index) => { if (!placedImages.has(index))
|
|
18
|
+
result.push(item); });
|
|
19
|
+
files.forEach((item, index) => { if (!placedFiles.has(index))
|
|
20
|
+
result.push(item); });
|
|
21
|
+
return result;
|
|
22
|
+
}
|
|
23
|
+
export function encodeCommandAttachments(images) {
|
|
24
|
+
return images.map(image => ({ type: 'image', mediaType: image.mediaType, data: Buffer.from(image.data).toString('base64'),
|
|
25
|
+
...(image.name === undefined ? {} : { name: image.name }) }));
|
|
26
|
+
}
|
|
27
|
+
/** One authority per local session runtime; receipts cannot cross Agent identities or survive dispatch. */
|
|
28
|
+
export class CommandAttachments {
|
|
29
|
+
#receipts = new Map();
|
|
30
|
+
#unregister;
|
|
31
|
+
constructor(commands) {
|
|
32
|
+
this.#unregister = commands.registerFileReceiptResolver((agent, receiptId) => {
|
|
33
|
+
const receipt = this.#receipts.get(receiptId);
|
|
34
|
+
return receipt?.agent === agent ? receipt.file : undefined;
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
stage(agent, submission) {
|
|
38
|
+
const images = encodeCommandAttachments(submission.images);
|
|
39
|
+
const receipts = (submission.files ?? []).map(file => {
|
|
40
|
+
const receiptId = randomUUID();
|
|
41
|
+
this.#receipts.set(receiptId, { agent, file: { ...file } });
|
|
42
|
+
return { type: 'file', receiptId };
|
|
43
|
+
});
|
|
44
|
+
return { attachments: orderedAttachments(images, receipts, submission.segments),
|
|
45
|
+
dispose: () => { for (const receipt of receipts)
|
|
46
|
+
this.#receipts.delete(receipt.receiptId); } };
|
|
47
|
+
}
|
|
48
|
+
dispose() { this.#receipts.clear(); this.#unregister(); }
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=command-attachments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-attachments.js","sourceRoot":"","sources":["../../src/session/command-attachments.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,4 +5,20 @@ export interface ContextDiagnostics {
|
|
|
5
5
|
readonly usage?: TokenUsageProjection;
|
|
6
6
|
readonly breakdown?: ContextBreakdownProjection;
|
|
7
7
|
}
|
|
8
|
+
/** Current Harness projections and session identity shown by /context. */
|
|
9
|
+
export interface ContextOverview extends ContextDiagnostics {
|
|
10
|
+
sessionId: string;
|
|
11
|
+
model: string;
|
|
12
|
+
reasoning?: string;
|
|
13
|
+
agent: string;
|
|
14
|
+
workflow: string;
|
|
15
|
+
access?: string;
|
|
16
|
+
turns: number;
|
|
17
|
+
steps: number;
|
|
18
|
+
inputTokens: number;
|
|
19
|
+
outputTokens: number;
|
|
20
|
+
followUp: number;
|
|
21
|
+
steering: number;
|
|
22
|
+
}
|
|
23
|
+
export declare function contextOverviewDetails(snapshot: ContextOverview): string;
|
|
8
24
|
export declare function contextDiagnosticsMarkdown(diagnostics: ContextDiagnostics): string;
|
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
/** Client-visible context diagnostics without exposing prompt contents. */
|
|
2
2
|
import { formatTokens } from "../chrome/status-line.js";
|
|
3
|
+
export function contextOverviewDetails(snapshot) {
|
|
4
|
+
return [contextDiagnosticsMarkdown(snapshot), '', '## Session', '', '| Field | Value |', '|---|---|',
|
|
5
|
+
`| Session | \`${snapshot.sessionId}\` |`,
|
|
6
|
+
`| Model | \`${snapshot.model}\` |`,
|
|
7
|
+
`| Reasoning | \`${snapshot.reasoning ?? 'unavailable'}\` |`,
|
|
8
|
+
`| Agent | ${snapshot.agent} |`,
|
|
9
|
+
`| Workflow | ${snapshot.workflow} |`,
|
|
10
|
+
...(snapshot.access === undefined ? [] : [`| Access | ${snapshot.access} |`]),
|
|
11
|
+
`| Activity | ${snapshot.turns} turns · ${snapshot.steps} steps |`,
|
|
12
|
+
`| Tokens | ${formatTokens(snapshot.inputTokens)} in · ${formatTokens(snapshot.outputTokens)} out |`,
|
|
13
|
+
`| Queue | ${snapshot.followUp} follow-up · ${snapshot.steering} steering |`,
|
|
14
|
+
].join('\n');
|
|
15
|
+
}
|
|
3
16
|
function value(tokens) {
|
|
4
17
|
return tokens === undefined ? 'unavailable' : formatTokens(tokens);
|
|
5
18
|
}
|
|
@@ -16,6 +29,8 @@ export function contextDiagnosticsMarkdown(diagnostics) {
|
|
|
16
29
|
return [
|
|
17
30
|
'Context Details',
|
|
18
31
|
'',
|
|
32
|
+
occupancy === 'unavailable' ? 'Context usage is not available yet.' : `**${occupancy} used** · ${value(remaining)} tokens remaining`,
|
|
33
|
+
'',
|
|
19
34
|
'## Occupancy',
|
|
20
35
|
'',
|
|
21
36
|
'| Metric | Tokens |',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-diagnostics.js","sourceRoot":"","sources":["../../src/session/context-diagnostics.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAG3E,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;
|
|
1
|
+
{"version":3,"file":"context-diagnostics.js","sourceRoot":"","sources":["../../src/session/context-diagnostics.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
/** Guidance and observable profile state for native one-shot Agent bundles. */
|
|
2
2
|
import type { BundleInfo, PluginInfo } from '@deepseek-ai/dsh-plugin-manager';
|
|
3
|
+
import { type UiLanguage } from '../locale/index.ts';
|
|
4
|
+
export declare function externalAgentSummary(bundle: string, language?: UiLanguage): string | undefined;
|
|
3
5
|
export declare function externalAgentGuide(bundle: string): string | undefined;
|
|
4
6
|
/** Profile registration is observable; authentication and payload startup require a real delegation. */
|
|
5
|
-
export declare function externalAgentDiagnostic(bundle: BundleInfo, plugins: readonly PluginInfo[]): string;
|
|
7
|
+
export declare function externalAgentDiagnostic(bundle: BundleInfo, plugins: readonly PluginInfo[], language?: UiLanguage): string;
|
|
@@ -1,3 +1,14 @@
|
|
|
1
|
+
import { uiText } from "../locale/index.js";
|
|
2
|
+
export function externalAgentSummary(bundle, language = 'en') {
|
|
3
|
+
const label = bundle === '@deepseek-ai/dsh-subagent-codex' ? 'Codex'
|
|
4
|
+
: bundle === '@deepseek-ai/dsh-subagent-claude-code' ? 'Claude Code' : undefined;
|
|
5
|
+
if (label === undefined)
|
|
6
|
+
return;
|
|
7
|
+
return [
|
|
8
|
+
uiText(language, 'Bundled runtime · {name}', { name: label }),
|
|
9
|
+
uiText(language, 'Model and sign-in follow native settings. Subagent permissions are configured separately.'),
|
|
10
|
+
].join('\n');
|
|
11
|
+
}
|
|
1
12
|
export function externalAgentGuide(bundle) {
|
|
2
13
|
const codex = bundle === '@deepseek-ai/dsh-subagent-codex';
|
|
3
14
|
if (!codex && bundle !== '@deepseek-ai/dsh-subagent-claude-code')
|
|
@@ -11,17 +22,31 @@ export function externalAgentGuide(bundle) {
|
|
|
11
22
|
].join('\n\n');
|
|
12
23
|
}
|
|
13
24
|
/** Profile registration is observable; authentication and payload startup require a real delegation. */
|
|
14
|
-
export function externalAgentDiagnostic(bundle, plugins) {
|
|
25
|
+
export function externalAgentDiagnostic(bundle, plugins, language = 'en') {
|
|
26
|
+
const t = (text) => uiText(language, text);
|
|
27
|
+
const cell = (text) => text.replace(/\\/gu, '\\\\').replace(/\|/gu, '\\|').replace(/[\r\n]+/gu, ' ');
|
|
28
|
+
const installation = bundle.availability === 'missing' ? bundle.installed ? 'Declared in profile, files unavailable' : 'Not installed'
|
|
29
|
+
: bundle.availability === 'installation' ? 'Included with omdsh' : 'Installed in profile';
|
|
30
|
+
const entries = bundle.rows.map(row => ({ row, entry: plugins.find(entry => entry.entryId === row.entryId) }));
|
|
31
|
+
const diagnostics = [
|
|
32
|
+
...(bundle.error === undefined ? [] : [{ name: bundle.name, text: bundle.error.diagnostic ?? bundle.error.code }]),
|
|
33
|
+
...entries.flatMap(({ row, entry }) => entry?.diagnostic === undefined ? [] : [{ name: row.rowId, text: entry.diagnostic }]),
|
|
34
|
+
];
|
|
15
35
|
return [
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
36
|
+
`| ${t('Item')} | ${t('Details')} |`, '| --- | --- |',
|
|
37
|
+
`| ${t('Package')} | ${cell(bundle.name)} |`,
|
|
38
|
+
`| ${t('Version')} | ${cell(bundle.version ?? bundle.installTarget?.version ?? t('Unknown'))} |`,
|
|
39
|
+
`| ${t('Installation')} | ${t(installation)} |`,
|
|
40
|
+
`| ${t('Profile')} | ${t(bundle.enabled ? 'Enabled' : 'Disabled')} |`, '',
|
|
41
|
+
`### ${t('Components')}`, '',
|
|
42
|
+
...(entries.length === 0 ? [t('No component entries are registered.')] : [
|
|
43
|
+
`| ${t('Component')} | ${t('State')} |`, '| --- | --- |',
|
|
44
|
+
...entries.map(({ row, entry }) => `| ${cell(row.rowId)} | ${entry === undefined ? t('Not mounted') : `${t(entry.enabled ? 'Enabled' : 'Disabled')} · ${t(entry.fiberPhase ?? 'Unknown')}`} |`),
|
|
45
|
+
]), '',
|
|
46
|
+
`### ${t('Runtime and sign-in')}`, '',
|
|
47
|
+
t('Not checked. Runtime startup and sign-in require a real delegated task to verify.'),
|
|
48
|
+
...diagnostics.flatMap(diagnostic => ['', `### ${t('Diagnostic')} · ${cell(diagnostic.name)}`, '',
|
|
49
|
+
...diagnostic.text.split('\n').map(line => ' ' + line)]),
|
|
25
50
|
].join('\n');
|
|
26
51
|
}
|
|
27
52
|
//# sourceMappingURL=external-agents.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"external-agents.js","sourceRoot":"","sources":["../../src/session/external-agents.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"external-agents.js","sourceRoot":"","sources":["../../src/session/external-agents.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** Terminal eligibility derived from the latest durable turn, including cold replay. */
|
|
2
|
+
import type { SessionEvent } from '@deepseek-ai/dsh-session';
|
|
3
|
+
declare module '@deepseek-ai/dsh-llm' {
|
|
4
|
+
interface MessageSourceMap {
|
|
5
|
+
'omdsh-retry': {
|
|
6
|
+
kind: 'retry';
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
/** Only failed model requests after admitted human work can continue without another prompt. */
|
|
11
|
+
export declare function continuableFailure(events: readonly SessionEvent[]): number | undefined;
|