@sagmans/dsh-tui 0.6.0 → 0.7.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/.agents/skills/dsh-tui-dogfood/SKILL.md +83 -0
- package/.agents/skills/dsh-tui-dogfood/references/home-state.md +78 -0
- package/.agents/skills/dsh-tui-dogfood/scripts/clone-links.mjs +133 -0
- package/.agents/skills/dsh-tui-dogfood/scripts/run-plugin-from-worktree.sh +417 -0
- package/.agents/skills/dsh-tui-update-models/SKILL.md +121 -0
- package/.agents/skills/dsh-tui-update-models/references/model-wiring.md +162 -0
- package/.agents/skills/dsh-tui-update-models/scripts/dump-model-catalog.mjs +178 -0
- package/README.md +99 -5
- package/lib/agent/present.d.ts.map +1 -1
- package/lib/agent/present.js +2 -1
- package/lib/agent/present.js.map +1 -1
- package/lib/cards/composition.d.ts +68 -0
- package/lib/cards/composition.d.ts.map +1 -0
- package/lib/cards/composition.js +117 -0
- package/lib/cards/composition.js.map +1 -0
- package/lib/cards/presenter.d.ts +23 -0
- package/lib/cards/presenter.d.ts.map +1 -0
- package/lib/cards/presenter.js +394 -0
- package/lib/cards/presenter.js.map +1 -0
- package/lib/cards/preview.d.ts +42 -0
- package/lib/cards/preview.d.ts.map +1 -0
- package/lib/cards/preview.js +51 -0
- package/lib/cards/preview.js.map +1 -0
- package/lib/cards.d.ts +12 -120
- package/lib/cards.d.ts.map +1 -1
- package/lib/cards.js +4 -556
- package/lib/cards.js.map +1 -1
- package/lib/compat/section.d.ts +29 -0
- package/lib/compat/section.d.ts.map +1 -0
- package/lib/compat/section.js +82 -0
- package/lib/compat/section.js.map +1 -0
- package/lib/config.d.ts +27 -2
- package/lib/config.d.ts.map +1 -1
- package/lib/config.js +61 -1
- package/lib/config.js.map +1 -1
- package/lib/contracts.d.ts +28 -0
- package/lib/contracts.d.ts.map +1 -1
- package/lib/fold-cursor.d.ts +8 -0
- package/lib/fold-cursor.d.ts.map +1 -1
- package/lib/fold-cursor.js +18 -0
- package/lib/fold-cursor.js.map +1 -1
- package/lib/gates/question-card.d.ts +77 -0
- package/lib/gates/question-card.d.ts.map +1 -0
- package/lib/gates/question-card.js +113 -0
- package/lib/gates/question-card.js.map +1 -0
- package/lib/gates/questions.d.ts +127 -0
- package/lib/gates/questions.d.ts.map +1 -0
- package/lib/gates/questions.js +418 -0
- package/lib/gates/questions.js.map +1 -0
- package/lib/gates.d.ts +1 -113
- package/lib/gates.d.ts.map +1 -1
- package/lib/gates.js +1 -484
- package/lib/gates.js.map +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +343 -2602
- package/lib/index.js.map +1 -1
- package/lib/input/action-catalog.d.ts +74 -0
- package/lib/input/action-catalog.d.ts.map +1 -0
- package/lib/input/action-catalog.js +137 -0
- package/lib/input/action-catalog.js.map +1 -0
- package/lib/input/actions.d.ts +5 -81
- package/lib/input/actions.d.ts.map +1 -1
- package/lib/input/actions.js +4 -625
- package/lib/input/actions.js.map +1 -1
- package/lib/input/completion.d.ts +1 -1
- package/lib/input/completion.d.ts.map +1 -1
- package/lib/input/completion.js +2 -1
- package/lib/input/completion.js.map +1 -1
- package/lib/input/file-index.d.ts +40 -0
- package/lib/input/file-index.d.ts.map +1 -0
- package/lib/input/file-index.js +141 -0
- package/lib/input/file-index.js.map +1 -0
- package/lib/input/file-search.d.ts +1 -38
- package/lib/input/file-search.d.ts.map +1 -1
- package/lib/input/file-search.js +1 -487
- package/lib/input/file-search.js.map +1 -1
- package/lib/input/key-press.d.ts +57 -0
- package/lib/input/key-press.d.ts.map +1 -0
- package/lib/input/key-press.js +218 -0
- package/lib/input/key-press.js.map +1 -0
- package/lib/input/keymap-conflicts.d.ts +59 -0
- package/lib/input/keymap-conflicts.d.ts.map +1 -0
- package/lib/input/keymap-conflicts.js +292 -0
- package/lib/input/keymap-conflicts.js.map +1 -0
- package/lib/input/keymap-settings.js +1 -1
- package/lib/input/keymap-settings.js.map +1 -1
- package/lib/input/keymap.d.ts.map +1 -1
- package/lib/input/keymap.js +3 -1
- package/lib/input/keymap.js.map +1 -1
- package/lib/input/workspace-files.d.ts +10 -0
- package/lib/input/workspace-files.d.ts.map +1 -0
- package/lib/input/workspace-files.js +359 -0
- package/lib/input/workspace-files.js.map +1 -0
- package/lib/install-skills.d.ts +20 -0
- package/lib/install-skills.d.ts.map +1 -0
- package/lib/install-skills.js +198 -0
- package/lib/install-skills.js.map +1 -0
- package/lib/keys-command.d.ts +2 -1
- package/lib/keys-command.d.ts.map +1 -1
- package/lib/keys-command.js +2 -1
- package/lib/keys-command.js.map +1 -1
- package/lib/model-list.d.ts +37 -0
- package/lib/model-list.d.ts.map +1 -0
- package/lib/model-list.js +60 -0
- package/lib/model-list.js.map +1 -0
- package/lib/startup.d.ts +8 -0
- package/lib/startup.d.ts.map +1 -1
- package/lib/startup.js +120 -24
- package/lib/startup.js.map +1 -1
- package/lib/subagents.d.ts +7 -3
- package/lib/subagents.d.ts.map +1 -1
- package/lib/subagents.js +28 -4
- package/lib/subagents.js.map +1 -1
- package/lib/surface/appearance-preferences.d.ts +26 -0
- package/lib/surface/appearance-preferences.d.ts.map +1 -0
- package/lib/surface/appearance-preferences.js +139 -0
- package/lib/surface/appearance-preferences.js.map +1 -0
- package/lib/surface/appearance.d.ts +87 -0
- package/lib/surface/appearance.d.ts.map +1 -0
- package/lib/surface/appearance.js +353 -0
- package/lib/surface/appearance.js.map +1 -0
- package/lib/surface/background-work.d.ts +49 -0
- package/lib/surface/background-work.d.ts.map +1 -0
- package/lib/surface/background-work.js +146 -0
- package/lib/surface/background-work.js.map +1 -0
- package/lib/surface/commands.d.ts +80 -0
- package/lib/surface/commands.d.ts.map +1 -0
- package/lib/surface/commands.js +364 -0
- package/lib/surface/commands.js.map +1 -0
- package/lib/surface/modal-input.d.ts +58 -0
- package/lib/surface/modal-input.d.ts.map +1 -0
- package/lib/surface/modal-input.js +237 -0
- package/lib/surface/modal-input.js.map +1 -0
- package/lib/surface/model-choice.d.ts +54 -0
- package/lib/surface/model-choice.d.ts.map +1 -0
- package/lib/surface/model-choice.js +325 -0
- package/lib/surface/model-choice.js.map +1 -0
- package/lib/surface/preset-choice.d.ts +78 -0
- package/lib/surface/preset-choice.d.ts.map +1 -0
- package/lib/surface/preset-choice.js +163 -0
- package/lib/surface/preset-choice.js.map +1 -0
- package/lib/surface/prompt-input.d.ts +97 -0
- package/lib/surface/prompt-input.d.ts.map +1 -0
- package/lib/surface/prompt-input.js +215 -0
- package/lib/surface/prompt-input.js.map +1 -0
- package/lib/surface/prompt-memory.d.ts +76 -0
- package/lib/surface/prompt-memory.d.ts.map +1 -0
- package/lib/surface/prompt-memory.js +167 -0
- package/lib/surface/prompt-memory.js.map +1 -0
- package/lib/surface/session-lifecycle.d.ts +120 -0
- package/lib/surface/session-lifecycle.d.ts.map +1 -0
- package/lib/surface/session-lifecycle.js +321 -0
- package/lib/surface/session-lifecycle.js.map +1 -0
- package/lib/surface/session-picker.d.ts +39 -0
- package/lib/surface/session-picker.d.ts.map +1 -0
- package/lib/surface/session-picker.js +107 -0
- package/lib/surface/session-picker.js.map +1 -0
- package/lib/surface/session-view.d.ts +86 -0
- package/lib/surface/session-view.d.ts.map +1 -0
- package/lib/surface/session-view.js +215 -0
- package/lib/surface/session-view.js.map +1 -0
- package/lib/surface/staged-turns.d.ts +81 -0
- package/lib/surface/staged-turns.d.ts.map +1 -0
- package/lib/surface/staged-turns.js +206 -0
- package/lib/surface/staged-turns.js.map +1 -0
- package/lib/surface/terminal-lifecycle.d.ts +76 -0
- package/lib/surface/terminal-lifecycle.d.ts.map +1 -0
- package/lib/surface/terminal-lifecycle.js +222 -0
- package/lib/surface/terminal-lifecycle.js.map +1 -0
- package/lib/terminal-text/scan.d.ts +44 -0
- package/lib/terminal-text/scan.d.ts.map +1 -0
- package/lib/terminal-text/scan.js +195 -0
- package/lib/terminal-text/scan.js.map +1 -0
- package/lib/terminal-text/sgr.d.ts +32 -0
- package/lib/terminal-text/sgr.d.ts.map +1 -0
- package/lib/terminal-text/sgr.js +203 -0
- package/lib/terminal-text/sgr.js.map +1 -0
- package/lib/terminal-text.d.ts +1 -1
- package/lib/terminal-text.d.ts.map +1 -1
- package/lib/terminal-text.js +2 -379
- package/lib/terminal-text.js.map +1 -1
- package/lib/theme-command.js +2 -1
- package/lib/theme-command.js.map +1 -1
- package/lib/theme-defaults.d.ts +64 -0
- package/lib/theme-defaults.d.ts.map +1 -0
- package/lib/theme-defaults.js +248 -0
- package/lib/theme-defaults.js.map +1 -0
- package/lib/theme-resolver.d.ts +36 -0
- package/lib/theme-resolver.d.ts.map +1 -0
- package/lib/theme-resolver.js +112 -0
- package/lib/theme-resolver.js.map +1 -0
- package/lib/theme-schema.d.ts.map +1 -1
- package/lib/theme-schema.js +3 -2
- package/lib/theme-schema.js.map +1 -1
- package/lib/theme-settings.d.ts +5 -7
- package/lib/theme-settings.d.ts.map +1 -1
- package/lib/theme-settings.js +27 -19
- package/lib/theme-settings.js.map +1 -1
- package/lib/theme-tokens.d.ts +0 -89
- package/lib/theme-tokens.d.ts.map +1 -1
- package/lib/theme-tokens.js +0 -356
- package/lib/theme-tokens.js.map +1 -1
- package/lib/theme.d.ts +1 -1
- package/lib/theme.d.ts.map +1 -1
- package/lib/theme.js +2 -1
- package/lib/theme.js.map +1 -1
- package/lib/tool-display.d.ts.map +1 -1
- package/lib/tool-display.js +2 -1
- package/lib/tool-display.js.map +1 -1
- package/lib/transcript/message-content.d.ts +21 -0
- package/lib/transcript/message-content.d.ts.map +1 -0
- package/lib/transcript/message-content.js +61 -0
- package/lib/transcript/message-content.js.map +1 -0
- package/lib/transcript/tool-calls.d.ts +106 -0
- package/lib/transcript/tool-calls.d.ts.map +1 -0
- package/lib/transcript/tool-calls.js +254 -0
- package/lib/transcript/tool-calls.js.map +1 -0
- package/lib/transcript.d.ts +14 -55
- package/lib/transcript.d.ts.map +1 -1
- package/lib/transcript.js +31 -253
- package/lib/transcript.js.map +1 -1
- package/lib/ui/dock.d.ts +14 -2
- package/lib/ui/dock.d.ts.map +1 -1
- package/lib/ui/dock.js +52 -10
- package/lib/ui/dock.js.map +1 -1
- package/lib/ui/editor.d.ts.map +1 -1
- package/lib/ui/editor.js +2 -1
- package/lib/ui/editor.js.map +1 -1
- package/lib/ui/keymap-picker.d.ts +2 -1
- package/lib/ui/keymap-picker.d.ts.map +1 -1
- package/lib/ui/keymap-picker.js +1 -0
- package/lib/ui/keymap-picker.js.map +1 -1
- package/lib/ui/view/gate-card.d.ts +21 -0
- package/lib/ui/view/gate-card.d.ts.map +1 -0
- package/lib/ui/view/gate-card.js +104 -0
- package/lib/ui/view/gate-card.js.map +1 -0
- package/lib/ui/view/tool-card.d.ts +138 -0
- package/lib/ui/view/tool-card.d.ts.map +1 -0
- package/lib/ui/view/tool-card.js +413 -0
- package/lib/ui/view/tool-card.js.map +1 -0
- package/lib/ui/view/transcript-message.d.ts +62 -0
- package/lib/ui/view/transcript-message.d.ts.map +1 -0
- package/lib/ui/view/transcript-message.js +158 -0
- package/lib/ui/view/transcript-message.js.map +1 -0
- package/lib/ui/view.d.ts +80 -220
- package/lib/ui/view.d.ts.map +1 -1
- package/lib/ui/view.js +81 -675
- package/lib/ui/view.js.map +1 -1
- package/package.json +3 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keys-command.d.ts","sourceRoot":"","sources":["../src/keys-command.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"keys-command.d.ts","sourceRoot":"","sources":["../src/keys-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6C,KAAK,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAC3F,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAE5E,0EAA0E;AAC1E,eAAO,MAAM,aAAa,EAAE,SAAS,WAAW,EAA4E,CAAA;AAmB5H,6EAA6E;AAC7E,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAEjE;AAED,6FAA6F;AAC7F,wBAAgB,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAEpD;AAED,oDAAoD;AACpD,MAAM,WAAW,SAAS;IACxB,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,gFAAgF;IAChF,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,2FAA2F;IAC3F,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,0EAA0E;IAC1E,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,uFAAuF;IACvF,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;CACzB;AAED;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,SAAS,SAAS,EAAE,CAyBhF"}
|
package/lib/keys-command.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { actionLabel, keyName, keysFor, newShadows } from "./input/actions.js";
|
|
2
|
+
import { ACTION_CATALOG } from "./input/action-catalog.js";
|
|
2
3
|
/** The layers a reader may ask for, in the order the table lists them. */
|
|
3
4
|
export const KEYMAP_LAYERS = ['prompt', 'surface', 'chord', 'gate', 'question', 'picker', 'library'];
|
|
4
5
|
/** What each layer is for, so a list narrowed to one reads as a surface rather than a dump. */
|
package/lib/keys-command.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keys-command.js","sourceRoot":"","sources":["../src/keys-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"keys-command.js","sourceRoot":"","sources":["../src/keys-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAe,MAAM,oBAAoB,CAAA;AAC3F,OAAO,EAAE,cAAc,EAAoB,MAAM,2BAA2B,CAAA;AAE5E,0EAA0E;AAC1E,MAAM,CAAC,MAAM,aAAa,GAA2B,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAA;AAE5H,+FAA+F;AAC/F,MAAM,WAAW,GAA0C;IACzD,MAAM,EAAE,gBAAgB;IACxB,OAAO,EAAE,yCAAyC;IAClD,KAAK,EAAE,gDAAgD;IACvD,IAAI,EAAE,aAAa;IACnB,QAAQ,EAAE,4BAA4B;IACtC,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,0DAA0D;CACpE,CAAA;AAED,iGAAiG;AACjG,MAAM,YAAY,GAAG,WAAW,CAAA;AAEhC,+FAA+F;AAC/F,MAAM,WAAW,GAAG,kBAAkB,CAAA;AAEtC,6EAA6E;AAC7E,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,CAAA;AACpD,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,SAAS,CAAC,KAAkB;IAC1C,OAAO,WAAW,CAAC,KAAK,CAAC,CAAA;AAC3B,CAAC;AAgBD;;;;;;;;;GASG;AACH,MAAM,UAAU,UAAU,CAAC,GAAW,EAAE,IAAkB;IACxD,MAAM,MAAM,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;IAC1D,MAAM,IAAI,GAAgB,EAAE,CAAA;IAC5B,KAAK,MAAM,MAAM,IAAI,cAAc,EAAE,CAAC;QACpC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC;YAAE,SAAQ;QAC5C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC7D,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QAC1C,IAAI,CAAC,IAAI,CAAC;YACR,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,KAAK,EAAE,GAAG,MAAM,CAAC,EAAE,MAAM,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,MAAM,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE;YACnH,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,OAAO;YACP,MAAM,EAAE,IAAI;SACb,CAAC,CAAA;IACJ,CAAC;IACD,KAAK,MAAM,MAAM,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrC,IAAI,CAAC,IAAI,CAAC;YACR,EAAE,EAAE,UAAU,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE;YAC3C,KAAK,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,MAAM,SAAS,MAAM,CAAC,KAAK,EAAE;YACtE,KAAK,EAAE,WAAW;YAClB,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,KAAK;SACd,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
2
|
+
/**
|
|
3
|
+
* The directory slice a listing reads.
|
|
4
|
+
*
|
|
5
|
+
* Structural rather than the catalog's own type so formatting stays free of the
|
|
6
|
+
* llm service; the order and the entries are exactly what the picker reads. A
|
|
7
|
+
* name is optional here because an adapter may advertise a route without one,
|
|
8
|
+
* while the id is always the value a request would name.
|
|
9
|
+
*/
|
|
10
|
+
export interface ModelListCatalog {
|
|
11
|
+
providers(): readonly {
|
|
12
|
+
readonly id: string;
|
|
13
|
+
readonly name: string;
|
|
14
|
+
}[];
|
|
15
|
+
models(provider: string): Promise<readonly {
|
|
16
|
+
readonly id: string;
|
|
17
|
+
readonly name?: string;
|
|
18
|
+
}[]>;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Format one line per reachable route, in the picker's own order.
|
|
22
|
+
*
|
|
23
|
+
* The order — registered providers in turn, then each provider's models in the
|
|
24
|
+
* order its adapter answered — is read from the catalog and never re-sorted, so
|
|
25
|
+
* any disagreement with the picker is a catalog disagreement, never a
|
|
26
|
+
* formatting one.
|
|
27
|
+
*/
|
|
28
|
+
export declare function modelListLines(catalog: ModelListCatalog): Promise<string[]>;
|
|
29
|
+
/**
|
|
30
|
+
* Print the model directory to stdout and exit, without touching the terminal.
|
|
31
|
+
*
|
|
32
|
+
* The exit code is the command's contract for a caller that pipes the output:
|
|
33
|
+
* zero only after a line was printed, so a deployment that advertises nothing
|
|
34
|
+
* cannot pass for one that was enumerated.
|
|
35
|
+
*/
|
|
36
|
+
export declare function runModelList(ctx: Context, exit: (code: number) => void): Promise<void>;
|
|
37
|
+
//# sourceMappingURL=model-list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-list.d.ts","sourceRoot":"","sources":["../src/model-list.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAclD;;;;;;;GAOG;AACH,MAAM,WAAW,gBAAgB;IAC/B,SAAS,IAAI,SAAS;QAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IACtE,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS;QAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC,CAAA;CAC9F;AAED;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAQjF;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAuB5F"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { createModelCatalog } from "./agent/model.js";
|
|
2
|
+
/**
|
|
3
|
+
* Column separator between the route and the display name.
|
|
4
|
+
*
|
|
5
|
+
* A tab keeps the route column machine-splittable for a caller that pipes the
|
|
6
|
+
* output, and a display name is free to contain spaces.
|
|
7
|
+
*/
|
|
8
|
+
const FIELD_SEPARATOR = '\t';
|
|
9
|
+
/** Prefix every refusal carries, so a piped run names the command that failed. */
|
|
10
|
+
const FAILURE_PREFIX = 'dsh --profile tui list-models: ';
|
|
11
|
+
/**
|
|
12
|
+
* Format one line per reachable route, in the picker's own order.
|
|
13
|
+
*
|
|
14
|
+
* The order — registered providers in turn, then each provider's models in the
|
|
15
|
+
* order its adapter answered — is read from the catalog and never re-sorted, so
|
|
16
|
+
* any disagreement with the picker is a catalog disagreement, never a
|
|
17
|
+
* formatting one.
|
|
18
|
+
*/
|
|
19
|
+
export async function modelListLines(catalog) {
|
|
20
|
+
const lines = [];
|
|
21
|
+
for (const provider of catalog.providers()) {
|
|
22
|
+
for (const model of await catalog.models(provider.id)) {
|
|
23
|
+
lines.push(`${provider.id}/${model.id}${FIELD_SEPARATOR}${model.name ?? model.id}`);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return lines;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Print the model directory to stdout and exit, without touching the terminal.
|
|
30
|
+
*
|
|
31
|
+
* The exit code is the command's contract for a caller that pipes the output:
|
|
32
|
+
* zero only after a line was printed, so a deployment that advertises nothing
|
|
33
|
+
* cannot pass for one that was enumerated.
|
|
34
|
+
*/
|
|
35
|
+
export async function runModelList(ctx, exit) {
|
|
36
|
+
const fail = (message) => {
|
|
37
|
+
process.stderr.write(`${FAILURE_PREFIX}${message}\n`);
|
|
38
|
+
exit(1);
|
|
39
|
+
};
|
|
40
|
+
const catalog = createModelCatalog(ctx);
|
|
41
|
+
if (catalog === undefined) {
|
|
42
|
+
fail('this profile has no llm service, so models cannot be listed');
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
let lines;
|
|
46
|
+
try {
|
|
47
|
+
lines = await modelListLines(catalog);
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
fail(`could not list models: ${error instanceof Error ? error.message : String(error)}`);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
if (lines.length === 0) {
|
|
54
|
+
fail('no configured provider advertises a model');
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
process.stdout.write(`${lines.join('\n')}\n`);
|
|
58
|
+
exit(0);
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=model-list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-list.js","sourceRoot":"","sources":["../src/model-list.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAErD;;;;;GAKG;AACH,MAAM,eAAe,GAAG,IAAI,CAAA;AAE5B,kFAAkF;AAClF,MAAM,cAAc,GAAG,iCAAiC,CAAA;AAexD;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAyB;IAC5D,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,KAAK,MAAM,QAAQ,IAAI,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;QAC3C,KAAK,MAAM,KAAK,IAAI,MAAM,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;YACtD,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,eAAe,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE,EAAE,CAAC,CAAA;QACrF,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAY,EAAE,IAA4B;IAC3E,MAAM,IAAI,GAAG,CAAC,OAAe,EAAQ,EAAE;QACrC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,cAAc,GAAG,OAAO,IAAI,CAAC,CAAA;QACrD,IAAI,CAAC,CAAC,CAAC,CAAA;IACT,CAAC,CAAA;IACD,MAAM,OAAO,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAA;IACvC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,IAAI,CAAC,6DAA6D,CAAC,CAAA;QACnE,OAAM;IACR,CAAC;IACD,IAAI,KAAe,CAAA;IACnB,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,CAAA;IACvC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,0BAA0B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QACxF,OAAM;IACR,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,IAAI,CAAC,2CAA2C,CAAC,CAAA;QACjD,OAAM;IACR,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC7C,IAAI,CAAC,CAAC,CAAC,CAAA;AACT,CAAC"}
|
package/lib/startup.d.ts
CHANGED
|
@@ -7,6 +7,14 @@ export { PROFILE_NAME } from './identity.ts';
|
|
|
7
7
|
export declare const MAIN_AGENT_ID = "main";
|
|
8
8
|
/** Context key of the parsed launch service consumed by the tui row. */
|
|
9
9
|
export declare const TUI_STARTUP_SERVICE = "tuiStartup";
|
|
10
|
+
/**
|
|
11
|
+
* Context key of the boolean service that turns one invocation into a listing run.
|
|
12
|
+
*
|
|
13
|
+
* A boolean rather than the lines themselves: the command line runs before llm
|
|
14
|
+
* mounts, so the action can only order the listing, and the surface row that
|
|
15
|
+
* reads the directory decides when to answer it.
|
|
16
|
+
*/
|
|
17
|
+
export declare const LIST_MODELS_SERVICE = "tuiListModels";
|
|
10
18
|
/**
|
|
11
19
|
* Parse this app's own flags and publish the launch identity.
|
|
12
20
|
*
|
package/lib/startup.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"startup.d.ts","sourceRoot":"","sources":["../src/startup.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"startup.d.ts","sourceRoot":"","sources":["../src/startup.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAOlD,eAAO,MAAM,IAAI,gBAAgB,CAAA;AAEjC,6EAA6E;AAC7E,eAAO,MAAM,MAAM,UAAkB,CAAA;AAErC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAE5C,uEAAuE;AACvE,eAAO,MAAM,aAAa,SAAS,CAAA;AAEnC,wEAAwE;AACxE,eAAO,MAAM,mBAAmB,eAAe,CAAA;AAE/C;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,kBAAkB,CAAA;AAyDlD;;;;;GAKG;AACH,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CA6FxC"}
|
package/lib/startup.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { createInterface } from 'node:readline/promises';
|
|
2
3
|
import { Command } from 'commander';
|
|
3
4
|
import { parseCmdline } from '@deepseek-ai/dsh-cmdline';
|
|
4
5
|
import { CONFIGURED_AGENT_IDENTITIES_KEY } from '@deepseek-ai/dsh-agent-loop';
|
|
5
6
|
import { LaunchUsageError, PROFILE_NAME, identityOf, resolveLaunchIntent, resumeHint } from "./identity.js";
|
|
7
|
+
import { installBundledSkills, SkillAlreadyExistsError } from "./install-skills.js";
|
|
6
8
|
export const name = 'tui-startup';
|
|
7
9
|
/** The launcher owns the arguments; this row only reads its own snapshot. */
|
|
8
10
|
export const inject = ['cmdlineArgs'];
|
|
@@ -11,6 +13,53 @@ export { PROFILE_NAME } from "./identity.js";
|
|
|
11
13
|
export const MAIN_AGENT_ID = 'main';
|
|
12
14
|
/** Context key of the parsed launch service consumed by the tui row. */
|
|
13
15
|
export const TUI_STARTUP_SERVICE = 'tuiStartup';
|
|
16
|
+
/**
|
|
17
|
+
* Context key of the boolean service that turns one invocation into a listing run.
|
|
18
|
+
*
|
|
19
|
+
* A boolean rather than the lines themselves: the command line runs before llm
|
|
20
|
+
* mounts, so the action can only order the listing, and the surface row that
|
|
21
|
+
* reads the directory decides when to answer it.
|
|
22
|
+
*/
|
|
23
|
+
export const LIST_MODELS_SERVICE = 'tuiListModels';
|
|
24
|
+
/**
|
|
25
|
+
* Resolve the launch identity and the startup service both actions publish.
|
|
26
|
+
*
|
|
27
|
+
* Shared because the surface row injects `tuiStartup` and reads its own config
|
|
28
|
+
* from it: an invocation that published no startup, the listing included, would
|
|
29
|
+
* leave the row unmounted and print nothing.
|
|
30
|
+
*/
|
|
31
|
+
function launchOf(program, mode, session, options) {
|
|
32
|
+
let intent;
|
|
33
|
+
try {
|
|
34
|
+
intent = resolveLaunchIntent({
|
|
35
|
+
mode,
|
|
36
|
+
session,
|
|
37
|
+
resumeFlag: options.resume,
|
|
38
|
+
newSession: options.new,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
if (error instanceof LaunchUsageError) {
|
|
43
|
+
program.error(`dsh --profile tui: ${error.message}`);
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
throw error;
|
|
47
|
+
}
|
|
48
|
+
const identity = identityOf(intent, randomUUID());
|
|
49
|
+
return {
|
|
50
|
+
identity,
|
|
51
|
+
startup: {
|
|
52
|
+
sessionId: identity.id,
|
|
53
|
+
resume: identity.resume,
|
|
54
|
+
resumePicker: intent.resumePicker,
|
|
55
|
+
model: options.model?.trim() || undefined,
|
|
56
|
+
provider: options.provider?.trim() || undefined,
|
|
57
|
+
preset: options.preset?.trim() || undefined,
|
|
58
|
+
color: options.color !== false,
|
|
59
|
+
bell: options.bell !== false,
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
}
|
|
14
63
|
/**
|
|
15
64
|
* Parse this app's own flags and publish the launch identity.
|
|
16
65
|
*
|
|
@@ -31,36 +80,83 @@ export function apply(ctx) {
|
|
|
31
80
|
.option('--preset <preset>', 'agent preset (mode) the new session runs')
|
|
32
81
|
.option('--no-color', 'disable ANSI styling')
|
|
33
82
|
.option('--no-bell', 'do not ring the terminal bell when a long turn finishes');
|
|
34
|
-
program.
|
|
35
|
-
|
|
83
|
+
program.command('install-skills')
|
|
84
|
+
.description('install or update the bundled skills in ~/.agents/skills/')
|
|
85
|
+
.option('--update', 'replace an existing skill without asking')
|
|
86
|
+
.action((options) => {
|
|
87
|
+
const exit = ctx.get('appExit');
|
|
88
|
+
if (exit === undefined)
|
|
89
|
+
throw new Error('dsh --profile tui: the launcher must provide appExit');
|
|
90
|
+
const fail = (error) => {
|
|
91
|
+
process.stderr.write(`dsh --profile tui install-skills: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
92
|
+
exit(1);
|
|
93
|
+
};
|
|
94
|
+
const install = (update) => {
|
|
95
|
+
for (const destination of installBundledSkills(undefined, update)) {
|
|
96
|
+
process.stdout.write(`Installed ${destination}\n`);
|
|
97
|
+
}
|
|
98
|
+
exit(0);
|
|
99
|
+
};
|
|
100
|
+
if (options.update === true) {
|
|
101
|
+
try {
|
|
102
|
+
install(true);
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
fail(error);
|
|
106
|
+
}
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
36
109
|
try {
|
|
37
|
-
|
|
38
|
-
mode,
|
|
39
|
-
session,
|
|
40
|
-
resumeFlag: options.resume,
|
|
41
|
-
newSession: options.new,
|
|
42
|
-
});
|
|
110
|
+
install(false);
|
|
43
111
|
}
|
|
44
112
|
catch (error) {
|
|
45
|
-
if (error instanceof
|
|
46
|
-
|
|
113
|
+
if (!(error instanceof SkillAlreadyExistsError)) {
|
|
114
|
+
fail(error);
|
|
47
115
|
return;
|
|
48
116
|
}
|
|
49
|
-
|
|
117
|
+
if (!process.stdin.isTTY || !process.stdout.isTTY) {
|
|
118
|
+
fail(new Error(`${error.message}; rerun with --update in non-interactive mode`));
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
// parseCmdline uses synchronous Commander.parse, so handle the prompt promise here.
|
|
122
|
+
const confirmUpdate = async () => {
|
|
123
|
+
const readline = createInterface({ input: process.stdin, output: process.stdout });
|
|
124
|
+
let answer;
|
|
125
|
+
try {
|
|
126
|
+
answer = await readline.question(`Update existing skill at ${error.destination}? [y/N] `);
|
|
127
|
+
}
|
|
128
|
+
finally {
|
|
129
|
+
readline.close();
|
|
130
|
+
}
|
|
131
|
+
if (!/^(y|yes)$/i.test(answer.trim())) {
|
|
132
|
+
process.stdout.write(`Unchanged ${error.destination}\n`);
|
|
133
|
+
exit(0);
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
install(true);
|
|
137
|
+
};
|
|
138
|
+
void confirmUpdate().catch(fail);
|
|
50
139
|
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
140
|
+
});
|
|
141
|
+
program.command('list-models')
|
|
142
|
+
.description('print every provider/model the model picker can reach, then exit')
|
|
143
|
+
.action(() => {
|
|
144
|
+
// The flag is published before the startup service, because the surface
|
|
145
|
+
// row's action runs as soon as its injected tuiStartup exists and must
|
|
146
|
+
// already know this run lists instead of claiming the terminal.
|
|
147
|
+
ctx.provide(LIST_MODELS_SERVICE, true);
|
|
148
|
+
const launch = launchOf(program, undefined, undefined, {});
|
|
149
|
+
if (launch === undefined)
|
|
150
|
+
return;
|
|
151
|
+
ctx.provide(TUI_STARTUP_SERVICE, launch.startup);
|
|
152
|
+
});
|
|
153
|
+
program.action((mode, session, options) => {
|
|
154
|
+
const launch = launchOf(program, mode, session, options);
|
|
155
|
+
if (launch === undefined)
|
|
156
|
+
return;
|
|
157
|
+
ctx.provide(CONFIGURED_AGENT_IDENTITIES_KEY, { [MAIN_AGENT_ID]: launch.identity });
|
|
158
|
+
ctx.provide(TUI_STARTUP_SERVICE, launch.startup);
|
|
159
|
+
ctx.provide('tuiGoodbyeMessage', resumeHint(launch.identity.id, PROFILE_NAME));
|
|
64
160
|
});
|
|
65
161
|
parseCmdline(ctx, program);
|
|
66
162
|
}
|
package/lib/startup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"startup.js","sourceRoot":"","sources":["../src/startup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,EAAE,+BAA+B,
|
|
1
|
+
{"version":3,"file":"startup.js","sourceRoot":"","sources":["../src/startup.ts"],"names":[],"mappings":"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"}
|
package/lib/subagents.d.ts
CHANGED
|
@@ -4,26 +4,30 @@ export interface SubagentRun {
|
|
|
4
4
|
readonly runId: string;
|
|
5
5
|
readonly provider: string;
|
|
6
6
|
readonly id: string;
|
|
7
|
+
readonly label?: string;
|
|
7
8
|
readonly startedAt: number;
|
|
8
9
|
readonly status: 'running' | 'completed' | 'failed';
|
|
9
10
|
readonly stopReason?: string;
|
|
10
11
|
readonly finishedAt?: number;
|
|
11
12
|
}
|
|
12
13
|
/** Child rows the dock lists before the count takes over. */
|
|
13
|
-
export declare const DOCK_SUBAGENT_LIMIT =
|
|
14
|
+
export declare const DOCK_SUBAGENT_LIMIT = 3;
|
|
14
15
|
/** Short form of a child session id: enough to tell two children apart. */
|
|
15
16
|
export declare function shortId(id: string): string;
|
|
16
17
|
/**
|
|
17
18
|
* Track the delegations of one session.
|
|
18
19
|
*
|
|
19
20
|
* Subagent lifecycle arrives as service events rather than durable session
|
|
20
|
-
* events,
|
|
21
|
-
*
|
|
21
|
+
* events, while the parent's catalog supplies the task. This roster remains
|
|
22
|
+
* live state, so a resumed run starts empty even when its catalog is durable.
|
|
22
23
|
*/
|
|
23
24
|
export declare class SubagentRoster {
|
|
24
25
|
private readonly now;
|
|
25
26
|
private readonly runs;
|
|
27
|
+
private readonly labels;
|
|
26
28
|
constructor(now?: () => number);
|
|
29
|
+
/** Catalog entries precede starts normally; keep them for either event order. */
|
|
30
|
+
catalog(info: unknown): void;
|
|
27
31
|
/** Record a started run; an unknown shape is ignored rather than guessed at. */
|
|
28
32
|
start(info: unknown): void;
|
|
29
33
|
/** Settle a run; an end without its start still becomes a row. */
|
package/lib/subagents.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subagents.d.ts","sourceRoot":"","sources":["../src/subagents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"subagents.d.ts","sourceRoot":"","sources":["../src/subagents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAIlD,oEAAoE;AACpE,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAA;IACnD,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAC7B;AAED,6DAA6D;AAC7D,eAAO,MAAM,mBAAmB,IAAI,CAAA;AAYpC,2EAA2E;AAC3E,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAE1C;AAED;;;;;;GAMG;AACH,qBAAa,cAAc;IAIb,OAAO,CAAC,QAAQ,CAAC,GAAG;IAHhC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAiC;IACtD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA4B;gBAEtB,GAAG,GAAE,MAAM,MAAyB;IAEjE,iFAAiF;IACjF,OAAO,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAa5B,gFAAgF;IAChF,KAAK,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAgB1B,kEAAkE;IAClE,GAAG,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAkBxB,IAAI,IAAI,SAAS,WAAW,EAAE;IAI9B,OAAO,IAAI,SAAS,WAAW,EAAE;IAIjC,KAAK,IAAI,IAAI;CAId;AAED,+BAA+B;AAC/B,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAKtE;AAED,iCAAiC;AACjC,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,SAAS,WAAW,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAKnF;AAED,2DAA2D;AAC3D,MAAM,MAAM,gBAAgB,GACxB;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACzB;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC9C;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC9C;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAA;AAKzD,yFAAyF;AACzF,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,CASzE;AAED,0EAA0E;AAC1E,eAAO,MAAM,QAAQ,SAAS,CAAA;AAE9B;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,SAAS,WAAW,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAapG;AAOD;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,GAAG;IAAE,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,GAAG,SAAS,CAW7F"}
|
package/lib/subagents.js
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import { describeDuration } from "./jobs.js";
|
|
2
|
+
import { stripControlCharacters } from "./text.js";
|
|
2
3
|
/** Child rows the dock lists before the count takes over. */
|
|
3
|
-
export const DOCK_SUBAGENT_LIMIT =
|
|
4
|
+
export const DOCK_SUBAGENT_LIMIT = 3;
|
|
4
5
|
/** Id characters kept in a row, so an id cannot smuggle in a control sequence. */
|
|
5
6
|
const SHORT_ID_LENGTH = 8;
|
|
7
|
+
/** Maximum task words the dock can show without hiding child status. */
|
|
8
|
+
const MAX_TASK_WORDS = 10;
|
|
6
9
|
function asRecord(value) {
|
|
7
10
|
return typeof value === 'object' && value !== null ? value : undefined;
|
|
8
11
|
}
|
|
@@ -14,15 +17,32 @@ export function shortId(id) {
|
|
|
14
17
|
* Track the delegations of one session.
|
|
15
18
|
*
|
|
16
19
|
* Subagent lifecycle arrives as service events rather than durable session
|
|
17
|
-
* events,
|
|
18
|
-
*
|
|
20
|
+
* events, while the parent's catalog supplies the task. This roster remains
|
|
21
|
+
* live state, so a resumed run starts empty even when its catalog is durable.
|
|
19
22
|
*/
|
|
20
23
|
export class SubagentRoster {
|
|
21
24
|
now;
|
|
22
25
|
runs = new Map();
|
|
26
|
+
labels = new Map();
|
|
23
27
|
constructor(now = () => Date.now()) {
|
|
24
28
|
this.now = now;
|
|
25
29
|
}
|
|
30
|
+
/** Catalog entries precede starts normally; keep them for either event order. */
|
|
31
|
+
catalog(info) {
|
|
32
|
+
const record = asRecord(info);
|
|
33
|
+
const id = record?.childId;
|
|
34
|
+
const raw = record?.label;
|
|
35
|
+
if (typeof id !== 'string' || typeof raw !== 'string')
|
|
36
|
+
return;
|
|
37
|
+
const label = stripControlCharacters(raw).trim().replace(/\s+/gu, ' ').split(' ').slice(0, MAX_TASK_WORDS).join(' ');
|
|
38
|
+
if (label === '')
|
|
39
|
+
return;
|
|
40
|
+
this.labels.set(id, label);
|
|
41
|
+
for (const [runId, run] of this.runs) {
|
|
42
|
+
if (run.id === id)
|
|
43
|
+
this.runs.set(runId, { ...run, label });
|
|
44
|
+
}
|
|
45
|
+
}
|
|
26
46
|
/** Record a started run; an unknown shape is ignored rather than guessed at. */
|
|
27
47
|
start(info) {
|
|
28
48
|
const record = asRecord(info);
|
|
@@ -30,9 +50,11 @@ export class SubagentRoster {
|
|
|
30
50
|
const id = record?.id;
|
|
31
51
|
if (typeof runId !== 'string' || typeof id !== 'string')
|
|
32
52
|
return;
|
|
53
|
+
const label = this.labels.get(id);
|
|
33
54
|
this.runs.set(runId, {
|
|
34
55
|
runId,
|
|
35
56
|
id,
|
|
57
|
+
...(label === undefined ? {} : { label }),
|
|
36
58
|
provider: typeof record?.provider === 'string' ? record.provider : 'subagent',
|
|
37
59
|
startedAt: this.now(),
|
|
38
60
|
status: 'running',
|
|
@@ -49,6 +71,7 @@ export class SubagentRoster {
|
|
|
49
71
|
this.runs.set(runId, {
|
|
50
72
|
runId,
|
|
51
73
|
id: typeof record?.id === 'string' ? record.id : existing?.id ?? runId,
|
|
74
|
+
...(existing?.label === undefined ? {} : { label: existing.label }),
|
|
52
75
|
provider: typeof record?.provider === 'string' ? record.provider : existing?.provider ?? 'subagent',
|
|
53
76
|
startedAt: existing?.startedAt ?? this.now(),
|
|
54
77
|
status: stopReason === undefined || stopReason === 'completed' ? 'completed' : 'failed',
|
|
@@ -64,6 +87,7 @@ export class SubagentRoster {
|
|
|
64
87
|
}
|
|
65
88
|
reset() {
|
|
66
89
|
this.runs.clear();
|
|
90
|
+
this.labels.clear();
|
|
67
91
|
}
|
|
68
92
|
}
|
|
69
93
|
/** One delegation as a row. */
|
|
@@ -71,7 +95,7 @@ export function describeSubagent(run, now) {
|
|
|
71
95
|
const age = run.status === 'running'
|
|
72
96
|
? `running ${describeDuration(now - run.startedAt)}`
|
|
73
97
|
: `${run.status}${run.stopReason === undefined || run.stopReason === 'completed' ? '' : ` (${run.stopReason})`} ${describeDuration((run.finishedAt ?? run.startedAt) - run.startedAt)}`;
|
|
74
|
-
return `${shortId(run.id)} · ${run.provider} · ${age}`;
|
|
98
|
+
return `${shortId(run.id)}${run.label === undefined ? '' : ` · ${run.label}`} · ${run.provider} · ${age}`;
|
|
75
99
|
}
|
|
76
100
|
/** The whole roster as lines. */
|
|
77
101
|
export function describeSubagents(runs, now) {
|
package/lib/subagents.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subagents.js","sourceRoot":"","sources":["../src/subagents.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"subagents.js","sourceRoot":"","sources":["../src/subagents.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAA;AAclD,6DAA6D;AAC7D,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAA;AAEpC,kFAAkF;AAClF,MAAM,eAAe,GAAG,CAAC,CAAA;AAEzB,wEAAwE;AACxE,MAAM,cAAc,GAAG,EAAE,CAAA;AAEzB,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,CAAE,KAAiC,CAAC,CAAC,CAAC,SAAS,CAAA;AACrG,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,OAAO,CAAC,EAAU;IAChC,OAAO,EAAE,CAAC,MAAM,IAAI,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,CAAA;AACzE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,OAAO,cAAc;IAII;IAHZ,IAAI,GAAG,IAAI,GAAG,EAAuB,CAAA;IACrC,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAA;IAEnD,YAA6B,MAAoB,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;QAApC,QAAG,GAAH,GAAG,CAAiC;IAAG,CAAC;IAErE,iFAAiF;IACjF,OAAO,CAAC,IAAa;QACnB,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;QAC7B,MAAM,EAAE,GAAG,MAAM,EAAE,OAAO,CAAA;QAC1B,MAAM,GAAG,GAAG,MAAM,EAAE,KAAK,CAAA;QACzB,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,OAAM;QAC7D,MAAM,KAAK,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACpH,IAAI,KAAK,KAAK,EAAE;YAAE,OAAM;QACxB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;QAC1B,KAAK,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACrC,IAAI,GAAG,CAAC,EAAE,KAAK,EAAE;gBAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,GAAG,GAAG,EAAE,KAAK,EAAE,CAAC,CAAA;QAC5D,CAAC;IACH,CAAC;IAED,gFAAgF;IAChF,KAAK,CAAC,IAAa;QACjB,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;QAC7B,MAAM,KAAK,GAAG,MAAM,EAAE,KAAK,CAAA;QAC3B,MAAM,EAAE,GAAG,MAAM,EAAE,EAAE,CAAA;QACrB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,EAAE,KAAK,QAAQ;YAAE,OAAM;QAC/D,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACjC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE;YACnB,KAAK;YACL,EAAE;YACF,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;YACzC,QAAQ,EAAE,OAAO,MAAM,EAAE,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU;YAC7E,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,MAAM,EAAE,SAAS;SAClB,CAAC,CAAA;IACJ,CAAC;IAED,kEAAkE;IAClE,GAAG,CAAC,IAAa;QACf,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;QAC7B,MAAM,KAAK,GAAG,MAAM,EAAE,KAAK,CAAA;QAC3B,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAM;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QACrC,MAAM,UAAU,GAAG,OAAO,MAAM,EAAE,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAA;QACzF,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE;YACnB,KAAK;YACL,EAAE,EAAE,OAAO,MAAM,EAAE,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,IAAI,KAAK;YACtE,GAAG,CAAC,QAAQ,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC;YACnE,QAAQ,EAAE,OAAO,MAAM,EAAE,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,IAAI,UAAU;YACnG,SAAS,EAAE,QAAQ,EAAE,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE;YAC5C,MAAM,EAAE,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ;YACvF,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC;YACnD,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;SACvB,CAAC,CAAA;IACJ,CAAC;IAED,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,CAAA;IACxF,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAA;IAC5D,CAAC;IAED,KAAK;QACH,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAA;QACjB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;IACrB,CAAC;CACF;AAED,+BAA+B;AAC/B,MAAM,UAAU,gBAAgB,CAAC,GAAgB,EAAE,GAAW;IAC5D,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,KAAK,SAAS;QAClC,CAAC,CAAC,WAAW,gBAAgB,CAAC,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,EAAE;QACpD,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,UAAU,KAAK,SAAS,IAAI,GAAG,CAAC,UAAU,KAAK,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,UAAU,GAAG,IAAI,gBAAgB,CAAC,CAAC,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC,SAAS,CAAC,EAAE,CAAA;IACzL,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,QAAQ,MAAM,GAAG,EAAE,CAAA;AAC3G,CAAC;AAED,iCAAiC;AACjC,MAAM,UAAU,iBAAiB,CAAC,IAA4B,EAAE,GAAW;IACzE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,uCAAuC,CAAA;IACrE,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM,CAAA;IACnE,MAAM,MAAM,GAAG,eAAe,IAAI,CAAC,MAAM,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,OAAO,WAAW,EAAE,CAAA;IAC1F,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACnF,CAAC;AASD,sFAAsF;AACtF,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;AAEzC,yFAAyF;AACzF,MAAM,UAAU,sBAAsB,CAAC,QAAgB;IACrD,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,CAAA;IACvE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;IAC/C,MAAM,CAAC,IAAI,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,GAAG,KAAK,CAAA;IAClC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,mBAAmB,IAAI,mEAAmE,EAAE,CAAA;IAChI,CAAC;IACD,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI,0CAA0C,EAAE,CAAA;IACpG,OAAO,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAA;AACtE,CAAC;AAED,0EAA0E;AAC1E,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAA;AAE9B;;;;;;GAMG;AACH,MAAM,UAAU,UAAU,CAAC,IAA4B,EAAE,UAAkB;IACzE,4EAA4E;IAC5E,yEAAyE;IACzE,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC,MAAM,CAChB,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,MAAM,KAAK,SAAS,IAAI,GAAG,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EACxF,SAAS,CACV,CAAA;IACH,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,UAAU,CAAC,CAAA;IACrD,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAA;IACrC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAA;IACjE,OAAO,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;AACtD,CAAC;AAOD;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,GAAY;IAChD,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAkC,CAAA;IACjE,IAAI,OAAO,MAAM,EAAE,GAAG,KAAK,UAAU;QAAE,OAAO,SAAS,CAAA;IACvD,OAAO;QACL,IAAI,EAAE,EAAE,CAAC,EAAE;YACT,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAA;YAC9B,IAAI,KAAK,EAAE,MAAM,KAAK,SAAS;gBAAE,OAAO,KAAK,CAAA;YAC7C,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAA;YAC9B,OAAO,IAAI,CAAA;QACb,CAAC;KACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
2
|
+
import { type TuiSettings } from '../theme-settings.ts';
|
|
3
|
+
/** The painter keeps applied state; this owner only coordinates its durable preference source. */
|
|
4
|
+
export interface AppearancePreferencePorts {
|
|
5
|
+
readonly rowSettings: () => unknown;
|
|
6
|
+
readonly rowSettingsLive: boolean;
|
|
7
|
+
readonly applied: () => TuiSettings | undefined;
|
|
8
|
+
readonly apply: () => void;
|
|
9
|
+
readonly restyle: () => void;
|
|
10
|
+
readonly restorePreview: () => void;
|
|
11
|
+
readonly disableHistory: () => void;
|
|
12
|
+
readonly notice: (message: string) => void;
|
|
13
|
+
readonly problem: (message: string) => void;
|
|
14
|
+
}
|
|
15
|
+
/** Preference ownership stays independent of theme files, rendering, and picker state. */
|
|
16
|
+
export interface AppearancePreferences {
|
|
17
|
+
readonly read: () => TuiSettings;
|
|
18
|
+
readonly configBacked: () => boolean;
|
|
19
|
+
readonly chooseTheme: (name: string) => void;
|
|
20
|
+
readonly allowsHistory: (field: 'enabled' | 'ghost', applied: boolean) => boolean;
|
|
21
|
+
readonly register: () => void;
|
|
22
|
+
readonly listen: () => () => void;
|
|
23
|
+
}
|
|
24
|
+
/** Keep attachment, persistence, and notifications on the same checked settings source. */
|
|
25
|
+
export declare function createAppearancePreferences(ctx: Context, ports: AppearancePreferencePorts): AppearancePreferences;
|
|
26
|
+
//# sourceMappingURL=appearance-preferences.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"appearance-preferences.d.ts","sourceRoot":"","sources":["../../src/surface/appearance-preferences.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAGlD,OAAO,EAAgF,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAIrI,kGAAkG;AAClG,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,WAAW,EAAE,MAAM,OAAO,CAAA;IACnC,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAA;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,WAAW,GAAG,SAAS,CAAA;IAC/C,QAAQ,CAAC,KAAK,EAAE,MAAM,IAAI,CAAA;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAA;IAC5B,QAAQ,CAAC,cAAc,EAAE,MAAM,IAAI,CAAA;IACnC,QAAQ,CAAC,cAAc,EAAE,MAAM,IAAI,CAAA;IACnC,QAAQ,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IAC1C,QAAQ,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CAC5C;AAED,0FAA0F;AAC1F,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,WAAW,CAAA;IAChC,QAAQ,CAAC,YAAY,EAAE,MAAM,OAAO,CAAA;IACpC,QAAQ,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC5C,QAAQ,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,CAAA;IACjF,QAAQ,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAA;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,MAAM,IAAI,CAAA;CAClC;AAED,2FAA2F;AAC3F,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,yBAAyB,GAAG,qBAAqB,CA4HjH"}
|