@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,15 @@
|
|
|
1
|
+
/** Searchable Markdown reference pages built from the shared prompt surfaces. */
|
|
2
|
+
import type { TuiService } from '../definition.ts';
|
|
3
|
+
interface ReferenceSection {
|
|
4
|
+
title: string;
|
|
5
|
+
text: string;
|
|
6
|
+
}
|
|
7
|
+
/** Headings inside fenced examples are content, not navigation. */
|
|
8
|
+
export declare function referenceSections(text: string): ReferenceSection[];
|
|
9
|
+
/** Copyable field values in the two-column diagnostic tables. */
|
|
10
|
+
export declare function referenceFields(text: string): {
|
|
11
|
+
label: string;
|
|
12
|
+
value: string;
|
|
13
|
+
}[];
|
|
14
|
+
export declare function readReference(tui: Pick<TuiService, 'prompt' | 'copyText'>, title: string, text: string, signal?: AbortSignal): Promise<void>;
|
|
15
|
+
export {};
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { choosePrompt } from "../prompt-intents.js";
|
|
2
|
+
/** Headings inside fenced examples are content, not navigation. */
|
|
3
|
+
export function referenceSections(text) {
|
|
4
|
+
const lines = text.split('\n');
|
|
5
|
+
const headings = [];
|
|
6
|
+
let fence;
|
|
7
|
+
for (const [row, line] of lines.entries()) {
|
|
8
|
+
const delimiter = /^ {0,3}(`{3,}|~{3,})/u.exec(line)?.[1];
|
|
9
|
+
if (delimiter !== undefined) {
|
|
10
|
+
if (fence === undefined)
|
|
11
|
+
fence = delimiter;
|
|
12
|
+
else if (delimiter[0] === fence[0] && delimiter.length >= fence.length)
|
|
13
|
+
fence = undefined;
|
|
14
|
+
continue;
|
|
15
|
+
}
|
|
16
|
+
if (fence !== undefined)
|
|
17
|
+
continue;
|
|
18
|
+
const match = /^(#{1,6})\s+(.+?)\s*#*\s*$/u.exec(line);
|
|
19
|
+
if (match !== null)
|
|
20
|
+
headings.push({ title: match[2], level: match[1].length, row });
|
|
21
|
+
}
|
|
22
|
+
return headings.map((heading, index) => ({
|
|
23
|
+
title: heading.title,
|
|
24
|
+
text: lines.slice(heading.row, headings.slice(index + 1).find(next => next.level <= heading.level)?.row).join('\n').trim(),
|
|
25
|
+
})).filter(section => section.text !== text.trim());
|
|
26
|
+
}
|
|
27
|
+
/** Copyable field values in the two-column diagnostic tables. */
|
|
28
|
+
export function referenceFields(text) {
|
|
29
|
+
return text.split('\n').flatMap(line => {
|
|
30
|
+
const match = /^\|\s*([^|]+?)\s*\|\s*`([^`]+)`\s*\|\s*$/u.exec(line);
|
|
31
|
+
return match === null ? [] : [{ label: match[1], value: match[2] }];
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
export async function readReference(tui, title, text, signal) {
|
|
35
|
+
const abort = new AbortController();
|
|
36
|
+
const active = signal === undefined ? abort.signal : AbortSignal.any([signal, abort.signal]);
|
|
37
|
+
const sections = [{ title: 'All sections', text }, ...referenceSections(text)];
|
|
38
|
+
const positions = new Map();
|
|
39
|
+
let selected = 0;
|
|
40
|
+
const prompt = (request) => tui.prompt({ ...request, signal: active, onSuperseded: () => { abort.abort(); } });
|
|
41
|
+
while (!active.aborted) {
|
|
42
|
+
const section = sections[selected];
|
|
43
|
+
const action = await prompt({
|
|
44
|
+
localize: ['options', 'actions'], title, question: selected === 0 ? '' : section.title, detail: section.text,
|
|
45
|
+
presentation: 'document', allowCustom: false, notify: false,
|
|
46
|
+
options: [{ label: 'Back', value: 'close' }],
|
|
47
|
+
actions: [
|
|
48
|
+
...(sections.length > 1 ? [{ key: 's', label: 'sections', valuePrefix: 'sections', scope: 'list' }] : []),
|
|
49
|
+
...(tui.copyText === undefined ? [] : [{ key: 'y', label: 'copy', valuePrefix: 'copy', scope: 'list' }]),
|
|
50
|
+
],
|
|
51
|
+
...(positions.has(selected) ? { documentPosition: positions.get(selected) } : {}),
|
|
52
|
+
onDocumentPosition: position => { positions.set(selected, position); },
|
|
53
|
+
});
|
|
54
|
+
if (active.aborted || action === null || action === 'close')
|
|
55
|
+
return;
|
|
56
|
+
if (action === 'sections') {
|
|
57
|
+
const answer = await prompt(choosePrompt({ localize: ['question', 'options'], title, question: 'Choose a section', filterable: true,
|
|
58
|
+
initialValue: String(selected), options: sections.map((item, index) => ({
|
|
59
|
+
label: item.title, value: String(index),
|
|
60
|
+
...(sections.filter(other => other.title === item.title).length > 1 ? {
|
|
61
|
+
description: item.text.split('\n').find(line => line.trim() !== '' && !line.startsWith('#'))?.replace(/^[-*] /u, '') ?? '',
|
|
62
|
+
} : {}),
|
|
63
|
+
})) }));
|
|
64
|
+
if (answer !== null && sections[Number(answer)] !== undefined)
|
|
65
|
+
selected = Number(answer);
|
|
66
|
+
}
|
|
67
|
+
else if (action === 'copy') {
|
|
68
|
+
const fields = referenceFields(section.text);
|
|
69
|
+
const choices = [{ label: 'This page', value: section.text }, ...fields];
|
|
70
|
+
const answer = fields.length === 0 ? '0' : await prompt(choosePrompt({ localize: ['title', 'question', 'options'], title: 'Copy', question: 'Choose content', filterable: true,
|
|
71
|
+
options: choices.map((item, index) => ({ label: item.label, value: String(index), ...(index === 0 ? {} : { description: item.value }) })) }));
|
|
72
|
+
const choice = answer === null ? undefined : choices[Number(answer)];
|
|
73
|
+
if (!active.aborted && choice !== undefined)
|
|
74
|
+
await tui.copyText?.(choice.value, choice.label);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=reference-reader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reference-reader.js","sourceRoot":"","sources":["../../src/runtime/reference-reader.ts"],"names":[],"mappings":"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"}
|
package/lib/runtime/runner.js
CHANGED
|
@@ -28,26 +28,23 @@ async function run(ctx, tui, cancelled) {
|
|
|
28
28
|
const onCancelled = () => { operation?.abort(new Error('runner unloaded')); };
|
|
29
29
|
cancelled.addEventListener('abort', onCancelled, { once: true });
|
|
30
30
|
const offInterrupt = tui.onInterrupt(() => {
|
|
31
|
+
if (controller.interruptVisible())
|
|
32
|
+
return;
|
|
31
33
|
if (shellActive) {
|
|
32
34
|
operation?.abort(new Error('Shell interrupted by user'));
|
|
33
35
|
return;
|
|
34
36
|
}
|
|
35
|
-
if (controller.interruptVisible())
|
|
36
|
-
return;
|
|
37
37
|
operation?.abort(new Error('cancelled by user'));
|
|
38
|
-
controller.agent?.cancel({ kind: 'user' });
|
|
38
|
+
controller.agent?.cancel({ kind: 'user' }, { keepInbox: true });
|
|
39
39
|
});
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
return;
|
|
44
|
-
queueEditInFlight = true;
|
|
45
|
-
void controller.editLatestFollowup().then((submission) => {
|
|
46
|
-
tui.resolveQueueEdit(submission ?? null);
|
|
40
|
+
const offQueueEdit = tui.onQueueEdit(request => {
|
|
41
|
+
void controller.editLatestFollowup(request).then(submission => {
|
|
42
|
+
tui.resolveQueueEdit(submission ?? null, request);
|
|
47
43
|
}).catch((error) => {
|
|
48
|
-
tui.resolveQueueEdit(null);
|
|
49
|
-
|
|
50
|
-
|
|
44
|
+
tui.resolveQueueEdit(null, request);
|
|
45
|
+
if (!request?.signal.aborted)
|
|
46
|
+
tui.notice(error instanceof Error ? error.message : String(error), { level: 'error' });
|
|
47
|
+
});
|
|
51
48
|
});
|
|
52
49
|
const offRewind = tui.onRewind(() => {
|
|
53
50
|
if (operation !== undefined || controller.agent?.status !== 'idle')
|
|
@@ -88,43 +85,54 @@ async function run(ctx, tui, cancelled) {
|
|
|
88
85
|
// Re-check after the read: an unmount may have aborted while it awaited.
|
|
89
86
|
if (cancelled.aborted)
|
|
90
87
|
break;
|
|
91
|
-
|
|
88
|
+
const agent = controller.agent;
|
|
89
|
+
const receipt = tui.pendingInputs?.receipt?.(submission);
|
|
90
|
+
const sessionId = receipt?.sessionId ?? agent?.session?.id;
|
|
91
|
+
if (receipt !== undefined && receipt.sessionId !== agent?.id) {
|
|
92
|
+
tui.restoreInput(submission, receipt.sessionId);
|
|
92
93
|
continue;
|
|
94
|
+
}
|
|
95
|
+
if (submission.text.trim() === '' && submission.images.length === 0 && !submission.files?.length) {
|
|
96
|
+
tui.pendingInputs?.acknowledge?.(submission);
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
93
99
|
const shellCommand = composerShellCommand(submission);
|
|
94
100
|
if (shellCommand !== undefined) {
|
|
95
101
|
operation = new AbortController();
|
|
96
102
|
shellActive = true;
|
|
97
103
|
try {
|
|
98
|
-
const agent = controller.agent;
|
|
99
104
|
if (agent === undefined)
|
|
100
105
|
throw new Error('Start a session before running a Shell command.');
|
|
101
106
|
await runComposerShell(ctx, agent, shellCommand, operation.signal, { share: composerShellShare(submission) });
|
|
107
|
+
tui.pendingInputs?.acknowledge?.(submission);
|
|
102
108
|
}
|
|
103
109
|
catch (error) {
|
|
104
110
|
if (!operation.signal.aborted) {
|
|
105
|
-
tui.restoreInput(submission);
|
|
111
|
+
tui.restoreInput(submission, sessionId);
|
|
106
112
|
tui.notice(error instanceof Error ? error.message : String(error), { level: 'error' });
|
|
107
113
|
}
|
|
114
|
+
else
|
|
115
|
+
tui.pendingInputs?.acknowledge?.(submission);
|
|
108
116
|
}
|
|
109
117
|
finally {
|
|
110
118
|
shellActive = false;
|
|
111
119
|
operation = undefined;
|
|
112
120
|
}
|
|
113
121
|
}
|
|
114
|
-
else if (!submission.literal &&
|
|
122
|
+
else if (!submission.literal && looksLikeSlashCommand(submission.text, submission.images)) {
|
|
115
123
|
operation = new AbortController();
|
|
116
124
|
try {
|
|
117
|
-
const handled = await controller.execute(submission
|
|
125
|
+
const handled = await controller.execute(submission, operation.signal);
|
|
126
|
+
if (handled)
|
|
127
|
+
tui.pendingInputs?.acknowledge?.(submission);
|
|
118
128
|
if (!handled) {
|
|
119
|
-
|
|
120
|
-
tui.restoreInput(submission);
|
|
129
|
+
tui.restoreInput(submission, sessionId);
|
|
121
130
|
const command = stripComposerImageMarkers(submission.text, submission.images).trim();
|
|
122
131
|
tui.notice(`Unknown command: ${command.split(/\s/u, 1)[0] ?? command}`, { level: 'error' });
|
|
123
132
|
}
|
|
124
133
|
}
|
|
125
134
|
catch (error) {
|
|
126
|
-
|
|
127
|
-
tui.restoreInput(submission);
|
|
135
|
+
tui.restoreInput(submission, sessionId);
|
|
128
136
|
if (!operation.signal.aborted) {
|
|
129
137
|
tui.notice(error instanceof Error ? error.message : String(error), { level: 'error' });
|
|
130
138
|
}
|
|
@@ -138,18 +146,19 @@ async function run(ctx, tui, cancelled) {
|
|
|
138
146
|
// `/loop` used to intercept submissions here. The command is gone: a
|
|
139
147
|
// repeated prompt is what the agent's own turns are for, and a
|
|
140
148
|
// process-local resender could run unattended through a token budget.
|
|
141
|
-
await controller.send(submission);
|
|
149
|
+
await controller.send(submission, agent);
|
|
150
|
+
tui.pendingInputs?.acknowledge?.(submission);
|
|
142
151
|
}
|
|
143
152
|
catch (error) {
|
|
144
|
-
tui.restoreInput(submission);
|
|
153
|
+
tui.restoreInput(submission, sessionId);
|
|
145
154
|
tui.notice(error instanceof Error ? error.message : String(error), { level: 'error' });
|
|
146
155
|
}
|
|
147
156
|
}
|
|
148
157
|
}
|
|
149
|
-
if (!cancelled.aborted) {
|
|
150
|
-
// EOF means "no more input", not "discard the accepted work".
|
|
151
|
-
//
|
|
152
|
-
//
|
|
158
|
+
if (!cancelled.aborted && !tui.interactive) {
|
|
159
|
+
// Pipe EOF means "no more input", not "discard the accepted work".
|
|
160
|
+
// Interactive quit instead hands shutdown to the host immediately,
|
|
161
|
+
// including when background children have not settled yet.
|
|
153
162
|
const agent = controller.agent;
|
|
154
163
|
if (agent !== undefined) {
|
|
155
164
|
const stopped = Promise.withResolvers();
|
|
@@ -170,7 +179,7 @@ async function run(ctx, tui, cancelled) {
|
|
|
170
179
|
}
|
|
171
180
|
}
|
|
172
181
|
}
|
|
173
|
-
else {
|
|
182
|
+
else if (cancelled.aborted) {
|
|
174
183
|
// An unmount cancel aborts the in-flight command instead of waiting.
|
|
175
184
|
operation?.abort(new Error('runner unloaded'));
|
|
176
185
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/runtime/runner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAWH,OAAO,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAA;AAG1F,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAEhG,MAAM,CAAC,MAAM,IAAI,GAAG,cAAc,CAAA;AAClC,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,KAAK,EAAE,cAAc,EAAE,cAAc,CAAC,CAAA;AAE7D,SAAS,IAAI,CAAC,KAAc,EAAE,IAA4B;IACxD,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IACnF,IAAI,CAAC,CAAC,CAAC,CAAA;AACT,CAAC;AAED,KAAK,UAAU,GAAG,CAAC,GAAY,EAAE,GAAe,EAAE,SAAsB;IACtE,MAAM,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAA;IAChC,MAAM,UAAU,GAAG,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;IAC1C,IAAI,UAAU,KAAK,SAAS;QAAE,OAAM;IAEpC,MAAM,UAAU,CAAC,KAAK,EAAE,CAAA;IACxB,2EAA2E;IAC3E,qCAAqC;IACrC,IAAI,SAAS,CAAC,OAAO;QAAE,OAAM;IAC7B,KAAK,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,iBAAiB,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;IACjE,IAAI,SAAsC,CAAA;IAC1C,IAAI,WAAW,GAAG,KAAK,CAAA;IACvB,6EAA6E;IAC7E,MAAM,WAAW,GAAG,GAAS,EAAE,GAAG,SAAS,EAAE,KAAK,CAAC,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAA,CAAC,CAAC,CAAA;IAClF,SAAS,CAAC,gBAAgB,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;IAChE,MAAM,YAAY,GAAG,GAAG,CAAC,WAAW,CAAC,GAAG,EAAE;QACxC,IAAI,WAAW,EAAE,CAAC;YAChB,SAAS,EAAE,KAAK,CAAC,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC,CAAA;YACxD,OAAM;QACR,CAAC;QACD,
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/runtime/runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { SessionRuntime } from "../session/session-controller.js";
|
|
6
6
|
export const name = 'omdsh-session-runtime';
|
|
7
|
-
export const inject = ['tui', 'agentDefaultModel', 'agents', 'agentPresets', 'tools', 'workingDirectory'];
|
|
7
|
+
export const inject = ['tui', 'agentDefaultModel', 'agents', 'agentPresets', 'tools', 'workingDirectory', 'commands'];
|
|
8
8
|
export function apply(ctx, config = {}) {
|
|
9
9
|
const tui = ctx.get('tui');
|
|
10
10
|
if (tui === undefined)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-runtime.js","sourceRoot":"","sources":["../../src/runtime/session-runtime.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAA;AAEjE,MAAM,CAAC,MAAM,IAAI,GAAG,uBAAuB,CAAA;AAC3C,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,cAAc,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"session-runtime.js","sourceRoot":"","sources":["../../src/runtime/session-runtime.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAA;AAEjE,MAAM,CAAC,MAAM,IAAI,GAAG,uBAAuB,CAAA;AAC3C,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,cAAc,EAAE,OAAO,EAAE,kBAAkB,EAAE,UAAU,CAAC,CAAA;AAkBrH,MAAM,UAAU,KAAK,CAAC,GAAY,EAAE,SAAiB,EAAE;IACrD,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,KAAK,CAA2B,CAAA;IACpD,IAAI,GAAG,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAA;IACjG,MAAM,OAAO,GAAG,IAAI,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAA;IAChH,GAAG,CAAC,OAAO,CAAC,cAAc,EAAE,OAAO,CAAC,CAAA;IACpC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,EAAE,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAA,CAAC,CAAC,EAAE,iCAAiC,CAAC,CAAA;AAC9F,CAAC;AAED,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAA"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
2
|
+
import type { SettingsDescriptor } from '@deepseek-ai/dsh-settings';
|
|
3
|
+
interface DraftField {
|
|
4
|
+
key: string;
|
|
5
|
+
label: string;
|
|
6
|
+
help: string;
|
|
7
|
+
defaultValue: unknown;
|
|
8
|
+
parse(raw: string): unknown;
|
|
9
|
+
format(value: unknown): string;
|
|
10
|
+
validate(value: unknown): void;
|
|
11
|
+
}
|
|
12
|
+
/** Shared status line for staged settings; the count includes pending field writes. */
|
|
13
|
+
export declare function settingsDraftSummary(ctx: Context, count: number): string;
|
|
14
|
+
/** Resolve changed fields against a fresh revision without mutating the caller's draft. */
|
|
15
|
+
export declare function rebaseSettingsDraft(ctx: Context, baseline: SettingsDescriptor, latest: SettingsDescriptor, changes: ReadonlyMap<string, unknown>, fields: readonly Pick<DraftField, 'key' | 'label' | 'defaultValue' | 'format'>[], signal: AbortSignal, prefix?: readonly string[]): Promise<{
|
|
16
|
+
section: SettingsDescriptor;
|
|
17
|
+
changes: Map<string, unknown>;
|
|
18
|
+
} | undefined>;
|
|
19
|
+
/** Cancel drops only this form's draft. Apply writes all changed fields in one mutation. */
|
|
20
|
+
export declare function editSettingsDraft(ctx: Context, section: SettingsDescriptor, title: string, fields: readonly DraftField[], signal: AbortSignal, resetOnly?: boolean): Promise<void>;
|
|
21
|
+
export {};
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/** A single Harness namespace edited through a staged, revision-fenced form. */
|
|
2
|
+
import { isDeepStrictEqual } from 'node:util';
|
|
3
|
+
import { walkPath } from "../commands/auth-providers.js";
|
|
4
|
+
import { askPrompt } from "../prompt-intents.js";
|
|
5
|
+
import { resolveUiLanguage, uiText } from "../locale/index.js";
|
|
6
|
+
const object = (value) => typeof value === 'object' && value !== null && !Array.isArray(value) ? value : {};
|
|
7
|
+
const list = { allowCustom: false, notify: false, localize: ['title', 'question', 'actions'] };
|
|
8
|
+
/** Shared status line for staged settings; the count includes pending field writes. */
|
|
9
|
+
export function settingsDraftSummary(ctx, count) {
|
|
10
|
+
const language = resolveUiLanguage(ctx.tui.prefs().uiLanguage);
|
|
11
|
+
if (!ctx.settings.writable)
|
|
12
|
+
return uiText(language, 'Profile · Read only');
|
|
13
|
+
if (count === 1)
|
|
14
|
+
return uiText(language, 'Profile · 1 pending change · Apply to save');
|
|
15
|
+
return count === 0 ? uiText(language, 'Profile · No pending changes')
|
|
16
|
+
: uiText(language, 'Profile · {count} pending changes · Apply to save', { count });
|
|
17
|
+
}
|
|
18
|
+
/** Resolve changed fields against a fresh revision without mutating the caller's draft. */
|
|
19
|
+
export async function rebaseSettingsDraft(ctx, baseline, latest, changes, fields, signal, prefix = []) {
|
|
20
|
+
const text = (source) => uiText(resolveUiLanguage(ctx.tui.prefs().uiLanguage), source);
|
|
21
|
+
const next = structuredClone(latest), rebased = new Map(changes);
|
|
22
|
+
for (const field of fields) {
|
|
23
|
+
if (!changes.has(field.key))
|
|
24
|
+
continue;
|
|
25
|
+
const path = [...prefix, field.key];
|
|
26
|
+
const read = (value) => walkPath(value, path);
|
|
27
|
+
const owns = (value) => Object.hasOwn(object(walkPath(value, prefix)), field.key);
|
|
28
|
+
const desired = changes.get(field.key);
|
|
29
|
+
const state = (section) => [read(section.value), read(section.base), owns(section.user), read(section.user),
|
|
30
|
+
section.secrets?.filter(secret => secret.path.slice(0, path.length).join('.') === path.join('.'))];
|
|
31
|
+
const alreadyApplied = desired === undefined ? !owns(next.user) : owns(next.user) && isDeepStrictEqual(read(next.user), desired);
|
|
32
|
+
if (alreadyApplied) {
|
|
33
|
+
rebased.delete(field.key);
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
if (isDeepStrictEqual(state(baseline), state(next)))
|
|
37
|
+
continue;
|
|
38
|
+
const protectedField = [baseline, next].some(section => section.secrets?.some(secret => path.slice(0, secret.path.length).join('.') === secret.path.join('.') || secret.path.slice(0, path.length).join('.') === path.join('.')));
|
|
39
|
+
const format = (value) => protectedField ? text('Protected value') : field.format(value);
|
|
40
|
+
const answer = await ctx.tui.prompt({ ...list, title: 'Setting changed elsewhere', question: field.label, dismissLabel: 'Back',
|
|
41
|
+
detail: text('Choose which value to keep in the draft. Apply saves the result.'),
|
|
42
|
+
options: [
|
|
43
|
+
{ label: text('Keep my change'), value: 'mine', description: format(desired ?? read(next.base) ?? field.defaultValue) + (desired === undefined ? ' · ' + text('Inherited') : '') },
|
|
44
|
+
{ label: text('Use latest value'), value: 'latest', description: format(read(next.value) ?? field.defaultValue) },
|
|
45
|
+
], signal });
|
|
46
|
+
if (answer === null || signal.aborted)
|
|
47
|
+
return undefined;
|
|
48
|
+
if (answer === 'latest')
|
|
49
|
+
rebased.delete(field.key);
|
|
50
|
+
}
|
|
51
|
+
return signal.aborted ? undefined : { section: next, changes: rebased };
|
|
52
|
+
}
|
|
53
|
+
/** Cancel drops only this form's draft. Apply writes all changed fields in one mutation. */
|
|
54
|
+
export async function editSettingsDraft(ctx, section, title, fields, signal, resetOnly = false) {
|
|
55
|
+
if (!fields.length || signal.aborted)
|
|
56
|
+
return;
|
|
57
|
+
let baseline = structuredClone(section);
|
|
58
|
+
const changes = new Map();
|
|
59
|
+
const text = (source) => uiText(resolveUiLanguage(ctx.tui.prefs().uiLanguage), source);
|
|
60
|
+
const inherited = (field) => object(baseline.base)[field.key] ?? field.defaultValue;
|
|
61
|
+
const effective = (field) => changes.has(field.key) ? changes.get(field.key) ?? inherited(field) : object(baseline.value)[field.key] ?? field.defaultValue;
|
|
62
|
+
const summary = (field) => field.format(effective(field)) + ' · ' + text(changes.has(field.key) ? 'Draft' : Object.hasOwn(object(baseline.user), field.key) ? 'Profile override' : 'Inherited');
|
|
63
|
+
let diagnostic = '', focused = fields[0].key, stale = false;
|
|
64
|
+
const reload = async () => {
|
|
65
|
+
const latest = ctx.settings.describe({ redactSecrets: true }).find(item => item.ns === baseline.ns);
|
|
66
|
+
if (latest === undefined) {
|
|
67
|
+
diagnostic = 'These settings are no longer available. Cancel and reopen Settings.';
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
const result = await rebaseSettingsDraft(ctx, baseline, latest, changes, fields, signal);
|
|
71
|
+
if (result === undefined)
|
|
72
|
+
return;
|
|
73
|
+
baseline = result.section;
|
|
74
|
+
changes.clear();
|
|
75
|
+
for (const [key, value] of result.changes)
|
|
76
|
+
changes.set(key, value);
|
|
77
|
+
stale = false;
|
|
78
|
+
diagnostic = 'Latest settings loaded. Your remaining changes are ready to apply.';
|
|
79
|
+
};
|
|
80
|
+
const restore = async () => {
|
|
81
|
+
const choice = await ctx.tui.prompt({ ...list, title, question: 'Choose a setting to restore', detail: text('Restoring inheritance changes the draft. Apply saves it.'), initialValue: focused,
|
|
82
|
+
options: fields.map(field => ({ label: text(field.label), value: field.key, description: summary(field), preview: text(field.help) })), signal });
|
|
83
|
+
const field = fields.find(field => field.key === choice);
|
|
84
|
+
if (field !== undefined && !signal.aborted) {
|
|
85
|
+
changes.set(field.key, undefined);
|
|
86
|
+
focused = field.key;
|
|
87
|
+
diagnostic = '';
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
const edit = async (field) => {
|
|
91
|
+
let input = effective(field) === undefined ? '' : field.format(effective(field)), error = '';
|
|
92
|
+
while (!signal.aborted) {
|
|
93
|
+
const raw = await ctx.tui.prompt(askPrompt({ localize: ['title', 'question', 'actions'], title, question: field.label, initialInput: input,
|
|
94
|
+
detail: [text(field.help), text(error || 'Leave empty to restore inheritance.')].join('\n'), signal }));
|
|
95
|
+
if (raw === null)
|
|
96
|
+
return;
|
|
97
|
+
input = raw;
|
|
98
|
+
try {
|
|
99
|
+
const value = raw.trim() ? field.parse(raw) : undefined;
|
|
100
|
+
if (value !== undefined)
|
|
101
|
+
field.validate(value);
|
|
102
|
+
changes.set(field.key, value);
|
|
103
|
+
diagnostic = '';
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
catch (cause) {
|
|
107
|
+
error = cause instanceof Error ? cause.message : String(cause);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
if (resetOnly && ctx.settings.writable)
|
|
112
|
+
await restore();
|
|
113
|
+
while (!signal.aborted) {
|
|
114
|
+
const writable = ctx.settings.writable;
|
|
115
|
+
const choice = await ctx.tui.prompt({ ...list, title, question: 'Edit the draft, then Apply to save', detail: [settingsDraftSummary(ctx, changes.size), text(diagnostic)].filter(Boolean).join('\n'), initialValue: focused,
|
|
116
|
+
options: [...fields.map(field => ({ label: text(field.label), value: field.key, description: summary(field), preview: text(field.help), disabled: !writable })),
|
|
117
|
+
{ label: text('Restore inherited setting…'), value: '@restore', disabled: !writable },
|
|
118
|
+
...(stale ? [{ label: text('Load latest and keep draft'), value: '@reload' }] : []),
|
|
119
|
+
{ label: text('Apply'), value: '@apply', disabled: !writable || !changes.size }, { label: text('Cancel'), value: '@cancel' }], signal });
|
|
120
|
+
if (choice === null || choice === '@cancel' || signal.aborted)
|
|
121
|
+
return;
|
|
122
|
+
if (!ctx.settings.writable)
|
|
123
|
+
continue;
|
|
124
|
+
const field = fields.find(field => field.key === choice);
|
|
125
|
+
if (field !== undefined) {
|
|
126
|
+
focused = field.key;
|
|
127
|
+
await edit(field);
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
if (choice === '@reload') {
|
|
131
|
+
await reload();
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
if (choice === '@restore') {
|
|
135
|
+
await restore();
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
if (choice !== '@apply' || !changes.size)
|
|
139
|
+
continue;
|
|
140
|
+
try {
|
|
141
|
+
signal.throwIfAborted();
|
|
142
|
+
const current = ctx.settings.describe({ redactSecrets: true }).find(item => item.ns === baseline.ns);
|
|
143
|
+
if (current === undefined)
|
|
144
|
+
throw new Error('These settings are no longer available. Cancel and reopen Settings.');
|
|
145
|
+
if (current.revision !== baseline.revision) {
|
|
146
|
+
stale = true;
|
|
147
|
+
throw new Error('Configuration changed. Load the latest settings to continue with your draft.');
|
|
148
|
+
}
|
|
149
|
+
for (const field of fields)
|
|
150
|
+
if (changes.has(field.key) && effective(field) !== undefined)
|
|
151
|
+
field.validate(effective(field));
|
|
152
|
+
const ops = [...changes].map(([key, value]) => value === undefined ? { op: 'unset', path: [key] } : { op: 'set', path: [key], value });
|
|
153
|
+
await ctx.settings.mutate(baseline.ns, ops, baseline.revision);
|
|
154
|
+
if (!signal.aborted)
|
|
155
|
+
ctx.tui.notice(`${text(title)}: ${text('Settings saved.')}`);
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
catch (cause) {
|
|
159
|
+
if (signal.aborted)
|
|
160
|
+
return;
|
|
161
|
+
stale = ctx.settings.describe({ redactSecrets: true }).some(item => item.ns === baseline.ns && item.revision !== baseline.revision);
|
|
162
|
+
diagnostic = cause instanceof Error ? cause.message : String(cause);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=settings-draft.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings-draft.js","sourceRoot":"","sources":["../../src/runtime/settings-draft.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,7 +27,7 @@ export function preferencePaths(id) {
|
|
|
27
27
|
const status = { statusEnabled: 'enabled', statusLabels: 'labels', statusContextStyle: 'contextStyle' };
|
|
28
28
|
if (Object.hasOwn(status, id))
|
|
29
29
|
return [['statusBar', status[id]]];
|
|
30
|
-
if (['theme', 'colors', 'motion', 'mathMode', 'mermaidMode', 'hideThinking', 'editor', 'terminalTitle', 'terminalState', 'pasteProtection', 'copyOnSelect', 'mouseInteraction', 'checkUpdates', 'startupChangelog', 'notifications', 'notificationFocus', 'notificationThreshold'].includes(id))
|
|
30
|
+
if (['uiLanguage', 'theme', 'colors', 'motion', 'mathMode', 'mermaidMode', 'hideThinking', 'editor', 'terminalTitle', 'terminalState', 'busyEnter', 'pasteProtection', 'copyOnSelect', 'mouseInteraction', 'checkUpdates', 'startupChangelog', 'notifications', 'notificationFocus', 'notificationThreshold'].includes(id))
|
|
31
31
|
return [[id]];
|
|
32
32
|
return undefined;
|
|
33
33
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings-preferences.js","sourceRoot":"","sources":["../../src/runtime/settings-preferences.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAG7C,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAE3D,MAAM,UAAU,iBAAiB,CAAC,QAAkB,EAAE,IAAc;IAClE,MAAM,KAAK,GAAqB,EAAE,CAAA;IAClC,MAAM,IAAI,GAAG,CAAC,MAAe,EAAE,KAAc,EAAE,IAAc,EAAQ,EAAE;QACrE,IAAI,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC;YAAE,OAAM;QAC5C,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzE,MAAM,GAAG,GAAG,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAiC,CAAC,CAAC,CAAC,EAAE,CAAA;YAClG,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;gBAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC,CAAA;QACzF,CAAC;aAAM,IAAI,KAAK,KAAK,SAAS;YAAE,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;IAC/E,CAAC,CAAA;IACD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,IAAI,CAAE,QAA+C,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;IAC1H,OAAO,KAAK,CAAA;AACd,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,eAAe,CAAC,EAAU;IACxC,IAAI,EAAE,KAAK,aAAa;QAAE,OAAO,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAA;IAClE,IAAI,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,cAAc,CAAC,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC,WAAW,EAAE,QAAQ,EAAE,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;IACpJ,MAAM,MAAM,GAA2B,EAAE,aAAa,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,kBAAkB,EAAE,cAAc,EAAE,CAAA;IAC/H,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;QAAE,OAAO,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,CAAE,CAAC,CAAC,CAAA;IAClE,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,EAAE,cAAc,EAAE,QAAQ,EAAE,eAAe,EAAE,eAAe,EAAE,iBAAiB,EAAE,cAAc,EAAE,kBAAkB,EAAE,cAAc,EAAE,kBAAkB,EAAE,eAAe,EAAE,mBAAmB,EAAE,uBAAuB,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;QAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"settings-preferences.js","sourceRoot":"","sources":["../../src/runtime/settings-preferences.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAG7C,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAE3D,MAAM,UAAU,iBAAiB,CAAC,QAAkB,EAAE,IAAc;IAClE,MAAM,KAAK,GAAqB,EAAE,CAAA;IAClC,MAAM,IAAI,GAAG,CAAC,MAAe,EAAE,KAAc,EAAE,IAAc,EAAQ,EAAE;QACrE,IAAI,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC;YAAE,OAAM;QAC5C,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzE,MAAM,GAAG,GAAG,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAiC,CAAC,CAAC,CAAC,EAAE,CAAA;YAClG,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;gBAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC,CAAA;QACzF,CAAC;aAAM,IAAI,KAAK,KAAK,SAAS;YAAE,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;IAC/E,CAAC,CAAA;IACD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,IAAI,CAAE,QAA+C,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;IAC1H,OAAO,KAAK,CAAA;AACd,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,eAAe,CAAC,EAAU;IACxC,IAAI,EAAE,KAAK,aAAa;QAAE,OAAO,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAA;IAClE,IAAI,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,cAAc,CAAC,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC,WAAW,EAAE,QAAQ,EAAE,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;IACpJ,MAAM,MAAM,GAA2B,EAAE,aAAa,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,kBAAkB,EAAE,cAAc,EAAE,CAAA;IAC/H,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;QAAE,OAAO,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,CAAE,CAAC,CAAC,CAAA;IAClE,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,EAAE,cAAc,EAAE,QAAQ,EAAE,eAAe,EAAE,eAAe,EAAE,WAAW,EAAE,iBAAiB,EAAE,cAAc,EAAE,kBAAkB,EAAE,cAAc,EAAE,kBAAkB,EAAE,eAAe,EAAE,mBAAmB,EAAE,uBAAuB,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;QAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACzU,OAAO,SAAS,CAAA;AAClB,CAAC"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
|
+
import { choosePrompt } from "../prompt-intents.js";
|
|
2
|
+
import { readReference } from "./reference-reader.js";
|
|
1
3
|
/** Startup release notes and update-notification Cordis plugin. */
|
|
2
4
|
import { mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
3
5
|
import { homedir } from 'node:os';
|
|
4
6
|
import { join } from 'node:path';
|
|
5
7
|
import { fileURLToPath } from 'node:url';
|
|
6
8
|
import { registerCommands } from "../commands/registration.js";
|
|
7
|
-
import { changelogText, resolveStartupChangelog } from "../session/release-notes.js";
|
|
9
|
+
import { changelogText, parseChangelog, resolveStartupChangelog } from "../session/release-notes.js";
|
|
8
10
|
import { APP_VERSION, PACKAGE_NAME } from "../session/package-metadata.js";
|
|
9
11
|
import { checkForUpdate } from "../session/update-check.js";
|
|
10
12
|
export const name = 'omdsh-startup-notices';
|
|
@@ -109,15 +111,42 @@ class StartupNotices {
|
|
|
109
111
|
}
|
|
110
112
|
}
|
|
111
113
|
}
|
|
112
|
-
async function showChangelog(config, invocation) {
|
|
114
|
+
async function showChangelog(tui, config, invocation) {
|
|
113
115
|
const input = invocation.rawInput.trim().toLowerCase();
|
|
114
116
|
if (input !== '' && input !== 'full')
|
|
115
117
|
return { kind: 'error', text: 'Usage: /changelog [full]' };
|
|
116
118
|
try {
|
|
117
119
|
const changelog = await readFile(config.changelogPath, 'utf8');
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
120
|
+
if (tui.interactive !== true)
|
|
121
|
+
return { kind: 'success', text: changelogText(changelog, input === 'full') };
|
|
122
|
+
const abort = new AbortController();
|
|
123
|
+
const signal = AbortSignal.any([invocation.signal, abort.signal]);
|
|
124
|
+
const surface = {
|
|
125
|
+
prompt: (request) => tui.prompt({ ...request, signal, onSuperseded: () => { abort.abort(); } }),
|
|
126
|
+
...(tui.copyText === undefined ? {} : { copyText: (text, label) => tui.copyText(text, label) }),
|
|
127
|
+
};
|
|
128
|
+
const entries = parseChangelog(changelog);
|
|
129
|
+
if (input === 'full' || entries.length === 0) {
|
|
130
|
+
await readReference(surface, 'Changelog', changelogText(changelog, true), signal);
|
|
131
|
+
return { kind: 'success' };
|
|
132
|
+
}
|
|
133
|
+
let selected = entries[0].version;
|
|
134
|
+
while (!signal.aborted) {
|
|
135
|
+
const answer = await surface.prompt(choosePrompt({ localize: ['title', 'question'], title: 'Changelog', question: 'Choose a release', filterable: true, initialValue: selected,
|
|
136
|
+
options: entries.map(entry => ({ label: `v${entry.version}`, value: entry.version,
|
|
137
|
+
description: [entry.markdown.split('\n')[0]?.match(/\d{4}-\d{2}-\d{2}/u)?.[0],
|
|
138
|
+
...Object.entries(entry.categoryCounts).map(([category, count]) => `${count} ${category.toLowerCase()}`)].filter(Boolean).join(' · '),
|
|
139
|
+
})),
|
|
140
|
+
}));
|
|
141
|
+
if (answer === null || signal.aborted)
|
|
142
|
+
break;
|
|
143
|
+
const entry = entries.find(item => item.version === answer);
|
|
144
|
+
if (entry === undefined)
|
|
145
|
+
break;
|
|
146
|
+
selected = entry.version;
|
|
147
|
+
await readReference(surface, `Changelog · v${entry.version}`, entry.markdown, signal);
|
|
148
|
+
}
|
|
149
|
+
return { kind: 'success' };
|
|
121
150
|
}
|
|
122
151
|
catch (error) {
|
|
123
152
|
return { kind: 'error', text: 'Changelog unavailable: ' + (error instanceof Error ? error.message : String(error)) };
|
|
@@ -137,7 +166,7 @@ export function apply(ctx, config = {}) {
|
|
|
137
166
|
name: 'changelog',
|
|
138
167
|
description: 'Show recent release notes',
|
|
139
168
|
input: { hint: '[full]' },
|
|
140
|
-
handler: invocation => showChangelog(resolved, invocation),
|
|
169
|
+
handler: invocation => showChangelog(tui, resolved, invocation),
|
|
141
170
|
}], 'omdsh changelog command');
|
|
142
171
|
ctx.provide('omdshStartup', new StartupNotices(tui, resolved));
|
|
143
172
|
}
|