deck-plugin-sdk 1.12.1 → 1.12.3

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "deck-plugin-sdk",
3
- "version": "1.12.1",
3
+ "version": "1.12.3",
4
4
  "description": "Build a plugin for Deck, outside the Deck repository.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -5,6 +5,6 @@
5
5
  "icon": "Sparkles",
6
6
  "color": "#a78bfa",
7
7
  "version": "0.1.0",
8
- "minDeck": "1.12.1",
8
+ "minDeck": "1.12.3",
9
9
  "permissions": []
10
10
  }
@@ -26,10 +26,20 @@ export interface TextSurface {
26
26
  focus(): void;
27
27
  /** Whether the keyboard is in this text, for the markdown keys (Ctrl+B, Ctrl+I). */
28
28
  hasFocus(): boolean;
29
+ /** Where the selection is on screen (window coordinates), or null when nothing is selected or
30
+ * it is out of view: where a floating toolbar goes. A surface without it never floats. */
31
+ selectionBox?(): {
32
+ left: number;
33
+ right: number;
34
+ top: number;
35
+ bottom: number;
36
+ } | null;
37
+ /** Calls `fn` whenever the selection or the scroll changes; returns the unsubscribe. */
38
+ watch?(fn: () => void): () => void;
29
39
  }
30
40
  /** A TextSurface over a CodeMirror EditorView. */
31
41
  export declare function cmSurface(view: EditorView): TextSurface;
32
- export declare function MarkdownToolbar({ surface, zoom, onZoom, floating, view }: {
42
+ export declare function MarkdownToolbar({ surface, zoom, onZoom, floating }: {
33
43
  /** The editor to drive. Null disables every button — there is nothing to type into. */
34
44
  surface: TextSurface | null;
35
45
  /** Current text size in px. Omit to hide the zoom controls entirely. */
@@ -41,10 +51,11 @@ export declare function MarkdownToolbar({ surface, zoom, onZoom, floating, view
41
51
  *
42
52
  * Omit it and the editor's own "Floating markdown toolbar" setting decides, which is what
43
53
  * every caller should do — this exists only for a surface that has a reason to override it.
44
- * Needs `view`, which is what turns a document offset into screen coordinates.
54
+ * Needs a surface that says where its selection is (selectionBox: both of Deck's do). The bar is
55
+ * placed in its own positioned parent, which should be the box the editor fills.
45
56
  */
46
57
  floating?: boolean;
47
- /** The CodeMirror view, for positioning a floating bar. Ignored otherwise. */
58
+ /** No longer needed: the surface says where its selection is. Kept so plugins passing it still compile. */
48
59
  view?: EditorView | null;
49
60
  }): import("react").JSX.Element;
50
61
  export default MarkdownToolbar;
@@ -260,7 +260,6 @@ export interface Settings {
260
260
  startMinimized: boolean;
261
261
  reduceMotion: boolean;
262
262
  /** The Servers list (hosts from ~/.ssh/config) under the workspace list. */
263
- serversList: boolean;
264
263
  /** The mouse wheel over a tab bar switches tabs rather than scrolling the bar. */
265
264
  tabWheelSwitch: boolean;
266
265
  /** When the tabs do not fit, every one but the open tab shrinks to its icon. */
@@ -588,8 +587,9 @@ export interface ExecOut {
588
587
  * Run a command to completion and read its output. `runScriptNow` is fire-and-forget; this is
589
588
  * for when the output IS the point — asking a tool what it knows rather than telling it to do
590
589
  * something. A bare name goes through cmd.exe, so PATH and .bat shims (`flutter`, `npm`) work.
590
+ * `env` adds variables for this run only (a CLI's token), never seen by anything else.
591
591
  */
592
- export declare const exec: (command: string, args?: string[], cwd?: string) => Promise<ExecOut>;
592
+ export declare const exec: (command: string, args?: string[], cwd?: string, env?: Record<string, string>) => Promise<ExecOut>;
593
593
  /** One header, one value. A list rather than a map: order matters, and repeats are legal. */
594
594
  export type HttpHeader = [string, string];
595
595
  export interface HttpSendRequest {
@@ -934,7 +934,7 @@ export interface ProcResult {
934
934
  * command and read the output" into driving a long-lived tool that takes commands — a daemon
935
935
  * speaking one JSON object per line, or a program reading single keypresses.
936
936
  */
937
- export declare const procStream: (id: string, program: string, args: string[], cwd?: string, stdin?: boolean) => Promise<ProcResult>;
937
+ export declare const procStream: (id: string, program: string, args: string[], cwd?: string, stdin?: boolean, env?: Record<string, string>) => Promise<ProcResult>;
938
938
  /** What receives a `procStreamBytes` run's stdout, one chunk at a time. */
939
939
  export type ByteSink = (chunk: Uint8Array) => void;
940
940
  /**
@@ -182,14 +182,13 @@ export declare function setLspOpenFileHandler(fn: OpenFileHandler): void;
182
182
  export declare function stopIdleServers(now?: number): string[];
183
183
  /** Stop all sessions (e.g. on workspace close). */
184
184
  export declare function lspStopAll(): void;
185
- /** Restart one server (UI action from the status popover). */
186
185
  /**
187
186
  * Stop a language server. The next file opened for that root starts a fresh one, which is why
188
- * this is both the Restart action and the memory readout's stop button — there is no difference
189
- * between the two beyond what the caller says about it.
187
+ * this is the Restart action, the popover's × and the memory readout's stop button. `forget`
188
+ * (the last two) shows it as stopped rather than restarting, and lets an edit start it again.
190
189
  *
191
190
  * Deleting the frontend session alongside the process matters: leaving it would send didOpen to
192
191
  * a dead pipe on the next open, and the editor would sit at "ready" with no diagnostics.
193
192
  */
194
- export declare function lspRestart(id: string): Promise<void>;
193
+ export declare function lspRestart(id: string, forget?: boolean): Promise<void>;
195
194
  export {};
@@ -49,6 +49,9 @@ export interface LayoutTab {
49
49
  * the main window. Dropped the moment the tab is moved by hand: then it is one of yours.
50
50
  */
51
51
  transient?: true;
52
+ /** Pinned from its menu (tabops.ts): only its icon, before the unpinned tabs beside it, and left
53
+ * open by Close others, Close to the right and Close all. */
54
+ pinned?: true;
52
55
  }
53
56
  export interface LayoutWorkspace {
54
57
  id: string;
@@ -84,6 +84,12 @@ export declare function reorderTab(tabs: readonly LayoutTab[], srcId: string, ov
84
84
  * (null: none, held over a tab outside any group or over a group's chip). Left out, the tabs
85
85
  * either side decide (settleGroup). */
86
86
  group?: string | null): LayoutTab[];
87
+ /**
88
+ * Each strip's pinned tabs (tabops.ts) before its unpinned ones, each side kept in its order: a drag
89
+ * can neither take a pinned tab among the others nor put another before the pinned ones. Takes a
90
+ * placed list (placeAll), whose zones a reorder of the list cannot change.
91
+ */
92
+ export declare function pinnedFirst(tabs: LayoutTab[]): LayoutTab[];
87
93
  /**
88
94
  * A tab group's tabs sit together in their zone's row: a tab dropped between two of one group's
89
95
  * tabs joins it, and one moved away from every other tab of its own group leaves it. Next to one
@@ -170,9 +176,10 @@ export declare function showActiveTab(w: LayoutWorkspace): LayoutWorkspace;
170
176
  /**
171
177
  * Which tab becomes active when `closing` goes: the one beside it in the same zone (the next, or
172
178
  * the one before when it was last), as a browser does, so closing a tab neither throws you out of
173
- * the zone nor back to its first tab; otherwise the first zone left.
179
+ * the zone nor back to its first tab; otherwise the first zone left. A tab in a folded group is
180
+ * passed over for the nearest one that is not, so closing a tab does not open a group.
174
181
  */
175
- export declare function nextActiveAfterClose(tabs: readonly LayoutTab[], closing: string): string | undefined;
182
+ export declare function nextActiveAfterClose(tabs: readonly LayoutTab[], closing: string, groups?: readonly TabGroup[]): string | undefined;
176
183
  /**
177
184
  * Tear a tab off into window `win`, or (`win` undefined) dock it back. A workspace always keeps
178
185
  * one docked tab: floating its last one leaves a fresh terminal behind, as the main window has
@@ -1,10 +1,13 @@
1
1
  // GENERATED by sdk/gen-types.mjs from Deck's source — do not edit.
2
2
  import { EditorView } from "@codemirror/view";
3
- export declare function MarkdownLive({ value, path, onChange, onSave, onView, flush, fontSize, onWikiLink, resolveWikiLink, wikiLinkOptions, mermaid, resolveEmbed }: {
3
+ export declare function MarkdownLive({ value, path, onChange, onSave, onView, flush, fontSize, onWikiLink, resolveWikiLink, wikiLinkOptions, mermaid, resolveEmbed, onOpenLink }: {
4
4
  value: string;
5
5
  path?: string;
6
6
  onChange: (v: string) => void;
7
7
  onSave?: () => void;
8
+ /** A click on a `[text](url)` link or a bare address, with its address as written. Omit it and a
9
+ * web address opens in Deck's browser, another scheme (mailto:) with the system, a path not at all. */
10
+ onOpenLink?: (href: string) => void;
8
11
  /** Hands the live EditorView out, and null on unmount. For a formatting toolbar, which has to
9
12
  * dispatch into this editor rather than rewrite the string around it. */
10
13
  onView?: (v: EditorView | null) => void;
@@ -0,0 +1,36 @@
1
+ // GENERATED by sdk/gen-types.mjs from Deck's source — do not edit.
2
+ import { type Extension } from "@codemirror/state";
3
+ import { EditorView, WidgetType } from "@codemirror/view";
4
+ /**
5
+ * A rendered mermaid diagram in place of its ```mermaid fence.
6
+ *
7
+ * A StateField rather than part of the ViewPlugin above, because CodeMirror refuses a
8
+ * plugin-supplied decoration that replaces a line break or sets `block: true` — and a fenced
9
+ * block is several lines. A StateField is the documented exception (see decorateTable, which
10
+ * hits the same wall from the other side).
11
+ *
12
+ * Rendering is asynchronous: mermaid parses and lays out, so the widget draws a placeholder of
13
+ * the same width and swaps the SVG in when it resolves, calling requestMeasure so CodeMirror's
14
+ * height map learns the real height rather than staying short by the diagram.
15
+ */
16
+ export declare class MermaidWidget extends WidgetType {
17
+ readonly code: string;
18
+ constructor(code: string);
19
+ eq(o: MermaidWidget): boolean;
20
+ toDOM(view: EditorView): HTMLDivElement;
21
+ destroy(dom: HTMLElement): void;
22
+ ignoreEvent(): boolean;
23
+ get estimatedHeight(): number;
24
+ }
25
+ /** Text from inside a `> ` quote (or a callout) without the quote markers that start each line. */
26
+ export declare const unquote: (s: string) => string;
27
+ /** Load mermaid on first use and render one diagram to SVG. */
28
+ export declare function renderMermaid(id: string, code: string): Promise<string>;
29
+ /**
30
+ * The block-level widgets: a mermaid fence and a `$$maths$$` block.
31
+ *
32
+ * Both live here rather than in the live-preview ViewPlugin because CodeMirror refuses a
33
+ * plugin-supplied decoration that replaces a line break or sets `block: true`, and both span
34
+ * lines. `mermaid` gates only the diagrams — maths is drawn wherever this file is used.
35
+ */
36
+ export declare function blockWidgetField(mermaid: boolean): Extension;
@@ -0,0 +1,9 @@
1
+ // GENERATED by sdk/gen-types.mjs from Deck's source — do not edit.
2
+ import { ViewPlugin, type DecorationSet, type EditorView, type ViewUpdate } from "@codemirror/view";
3
+ /** The code-block colours and copy buttons, as a ViewPlugin beside the live preview's own. */
4
+ export declare function codeBlocksExt(): ViewPlugin<{
5
+ decorations: DecorationSet;
6
+ readonly view: EditorView;
7
+ destroy(): void;
8
+ update(u: ViewUpdate): void;
9
+ }, undefined>;
@@ -0,0 +1,20 @@
1
+ // GENERATED by sdk/gen-types.mjs from Deck's source — do not edit.
2
+ import { Decoration, type DecorationSet, type EditorView } from "@codemirror/view";
3
+ import type { Extension, Range } from "@codemirror/state";
4
+ import type { SyntaxNode } from "@lezer/common";
5
+ export declare const replaceHide: Decoration;
6
+ /**
7
+ * Decorate one GFM Table: hide its syntax and line the columns up.
8
+ *
9
+ * Column widths are applied as `min-width` in `ch` units on the cells, so nothing is written
10
+ * into the document — no padding spaces to undo, and any other editor sees exactly what was typed.
11
+ * That only measures correctly because `.cm-table-l` is monospace.
12
+ *
13
+ * ponytail: assumes leading and trailing pipes (`| a | b |`), which is what the toolbar
14
+ * generates and what Obsidian writes. A borderless `a | b` table still parses, but its first
15
+ * and last columns will not align.
16
+ */
17
+ export declare function decorateTable(view: EditorView, table: SyntaxNode, ranges: Range<Decoration>[]): void;
18
+ /** `trash`: moves a local image's file to the Recycle Bin, for its delete button (MarkdownLive passes bridge.fsTrash). */
19
+ export declare function decorate(view: EditorView, baseDir: string, resolveWiki?: (target: string) => boolean, resolveEmbed?: (name: string) => string | null, trash?: (file: string) => Promise<void>): DecorationSet;
20
+ export declare function livePreviewExt(baseDir: string, resolveWiki?: () => ((target: string) => boolean) | undefined, resolveEmbed?: () => ((name: string) => string | null) | undefined, trash?: (file: string) => Promise<void>): Extension;
@@ -0,0 +1,16 @@
1
+ // GENERATED by sdk/gen-types.mjs from Deck's source — do not edit.
2
+ /** `Pasted image 20261029143005.png`: the time it was pasted, to the second, as Obsidian names them. */
3
+ export declare function pastedImageName(at: Date, mime: string): string;
4
+ /** The link for an image saved beside the note: its name, spaces and all, encoded as a link must be. */
5
+ export declare const imageLink: (savedPath: string) => string;
6
+ export type LinkTarget = {
7
+ url: string;
8
+ } | {
9
+ path: string;
10
+ } | null;
11
+ /**
12
+ * `href` from a note at `notePath`. A web or mail address as it is; a link to a heading in this
13
+ * note (`#part`) is nothing to open; anything else is a file: decoded (`my%20note.md`), its
14
+ * `#heading` dropped, and joined to the note's folder unless it is absolute.
15
+ */
16
+ export declare function linkTarget(href: string, notePath: string): LinkTarget;
@@ -0,0 +1,3 @@
1
+ // GENERATED by sdk/gen-types.mjs from Deck's source — do not edit.
2
+ /** The paste handler, given the note's path (read at the paste, since a new note gets one on its first save). */
3
+ export declare function imagePaste(notePath: () => string | undefined): import("@codemirror/state").Extension;
@@ -0,0 +1,30 @@
1
+ // GENERATED by sdk/gen-types.mjs from Deck's source — do not edit.
2
+ import type { MarkdownConfig } from "@lezer/markdown";
3
+ /**
4
+ * `[[Note]]`, `[[Note|alias]]`, `[[Note#heading]]` as a first-class inline node.
5
+ *
6
+ * A Lezer extension rather than a regex over the text, because CommonMark already claims the
7
+ * brackets: `[[Note]]` parses as a Link whose LinkMark is one bracket per side, and LinkMark is
8
+ * in HIDE_MARKS — so without this a wikilink renders as a literal `[Note]`. Claiming the whole
9
+ * `[[...]]` at PARSE time is what stops that.
10
+ *
11
+ * The alias/heading rule is the one in the Vault plugin's src/vault.ts, which is where it is tested:
12
+ * the alias splits on the LAST pipe, the heading on the FIRST hash of what is left.
13
+ */
14
+ export declare const WikiLinkExt: MarkdownConfig;
15
+ /**
16
+ * `==highlighted==`, Obsidian's marker syntax. Not part of GFM, so it needs its own rule.
17
+ *
18
+ * Two equals signs on each side, no newline between them — the same shape as Strikethrough's
19
+ * `~~`, which is what this is modelled on.
20
+ */
21
+ export declare const HighlightExt: MarkdownConfig;
22
+ /**
23
+ * `$inline$` and `$$block$$` maths, and `#tag`, as Obsidian writes them.
24
+ *
25
+ * Neither is in CommonMark or GFM, so each needs its own inline rule. The dollar rules are
26
+ * deliberately strict about what opens one: a lone `$` in prose ("costs $5") must not start a
27
+ * formula that runs to the end of the paragraph.
28
+ */
29
+ export declare const MathExt: MarkdownConfig;
30
+ export declare const TagExt: MarkdownConfig;
@@ -0,0 +1,20 @@
1
+ // GENERATED by sdk/gen-types.mjs from Deck's source — do not edit.
2
+ /** One table line: its start offset and its text. */
3
+ export interface TableLine {
4
+ from: number;
5
+ text: string;
6
+ }
7
+ /**
8
+ * The edits that add a column at the right of every line, the rule line `---`, the others empty.
9
+ * A line without a closing pipe gets one first, so the new cell is a cell.
10
+ */
11
+ export declare function addColumn(lines: TableLine[], ruleIndex: number): {
12
+ from: number;
13
+ insert: string;
14
+ }[];
15
+ /** The edit that adds an empty row after the last line, as many cells wide as the header; and where its first cell's text starts. */
16
+ export declare function addRow(lines: TableLine[]): {
17
+ from: number;
18
+ insert: string;
19
+ caret: number;
20
+ };
@@ -0,0 +1,110 @@
1
+ // GENERATED by sdk/gen-types.mjs from Deck's source — do not edit.
2
+ import { EditorView, WidgetType } from "@codemirror/view";
3
+ /**
4
+ * Obsidian's callout kinds, folded onto the handful that actually differ in appearance.
5
+ *
6
+ * Obsidian ships around a dozen names, several of which are aliases for the same colour and icon
7
+ * (`error` is `danger`, `tip` is `hint`). Keeping the alias table rather than a class per name
8
+ * means an unknown kind still renders, as a note, instead of falling back to a plain quote.
9
+ */
10
+ export declare const CALLOUT_ALIAS: Record<string, string>;
11
+ /** The glyph for each kind. Text, not an icon font — the editor has no icon set of its own. */
12
+ export declare const CALLOUT_ICON: Record<string, string>;
13
+ /** `[!warning]` with no title shows "Warning". */
14
+ export declare function defaultTitle(raw: string): string;
15
+ /** The icon and, when the callout has no title of its own, the kind's name. */
16
+ export declare class CalloutIcon extends WidgetType {
17
+ readonly kind: string;
18
+ readonly title: string;
19
+ constructor(kind: string, title: string);
20
+ eq(o: CalloutIcon): boolean;
21
+ toDOM(): HTMLSpanElement;
22
+ }
23
+ /** A rendered KaTeX formula in place of its `$...$`. */
24
+ export declare class MathWidget extends WidgetType {
25
+ readonly src: string;
26
+ readonly block: boolean;
27
+ constructor(src: string, block: boolean);
28
+ eq(o: MathWidget): boolean;
29
+ toDOM(view: EditorView): HTMLDivElement | HTMLSpanElement;
30
+ ignoreEvent(): boolean;
31
+ }
32
+ /** Load KaTeX on first use and render one formula. */
33
+ export declare function renderMath(src: string, block: boolean): Promise<string>;
34
+ /** Split `target#heading|alias` the way Obsidian does. See the Vault plugin's src/vault.ts. */
35
+ export declare function splitWikiLink(body: string): {
36
+ target: string;
37
+ heading: string;
38
+ text: string;
39
+ };
40
+ export declare class BulletWidget extends WidgetType {
41
+ readonly ch: string;
42
+ constructor(ch: string);
43
+ eq(o: BulletWidget): boolean;
44
+ toDOM(): HTMLSpanElement;
45
+ }
46
+ export declare class TaskWidget extends WidgetType {
47
+ readonly checked: boolean;
48
+ readonly pos: number;
49
+ constructor(checked: boolean, pos: number);
50
+ eq(o: TaskWidget): boolean;
51
+ toDOM(view: EditorView): HTMLInputElement;
52
+ ignoreEvent(): boolean;
53
+ }
54
+ /**
55
+ * An inline image, with the controls Obsidian puts on one: open it full size, and drag its
56
+ * corner to resize.
57
+ *
58
+ * A resize writes the width back into the link itself (`![[img.png|400]]`), so it travels with
59
+ * the note — Obsidian shows the same width. `from`/`to`
60
+ * are the link's bounds so the widget can rewrite it; `width` is what it currently says.
61
+ */
62
+ export declare class ImageWidget extends WidgetType {
63
+ readonly src: string;
64
+ readonly from: number;
65
+ readonly to: number;
66
+ readonly width: number | null;
67
+ /** Rewrite the link with a new width, or remove the width when null. */
68
+ readonly setWidth: (view: EditorView, from: number, to: number, width: number | null) => void;
69
+ /** Drawn below the revealed link text rather than in place of it. */
70
+ readonly below: boolean;
71
+ /** A file on this PC and how to put it in the Recycle Bin, for the delete button; null for a web image. */
72
+ readonly del: {
73
+ file: string;
74
+ trash: (file: string) => Promise<void>;
75
+ } | null;
76
+ constructor(src: string, from: number, to: number, width: number | null,
77
+ /** Rewrite the link with a new width, or remove the width when null. */
78
+ setWidth: (view: EditorView, from: number, to: number, width: number | null) => void,
79
+ /** Drawn below the revealed link text rather than in place of it. */
80
+ below?: boolean,
81
+ /** A file on this PC and how to put it in the Recycle Bin, for the delete button; null for a web image. */
82
+ del?: {
83
+ file: string;
84
+ trash: (file: string) => Promise<void>;
85
+ } | null);
86
+ eq(o: ImageWidget): boolean;
87
+ toDOM(view: EditorView): HTMLSpanElement;
88
+ }
89
+ /** Show one image full size, over everything in window `win` (the editor's: a floating one too), until it is dismissed. */
90
+ export declare function openLightbox(src: string, win: Window): void;
91
+ /**
92
+ * Rewrite an image link's width in place.
93
+ *
94
+ * Both spellings: `![[file.png|400]]` for an embed and `![alt|400](path)` for a standard link,
95
+ * which is what Obsidian writes for each.
96
+ */
97
+ export declare function writeImageWidth(view: EditorView, from: number, to: number, width: number | null): void;
98
+ /**
99
+ * A table's + : at the right of its header row it adds a column, under its last row a row
100
+ * (tableedit.ts). The table is found from where the button is at the click, so the widget needs no
101
+ * position of its own and is the same widget wherever the table moves.
102
+ */
103
+ export declare class TableAddWidget extends WidgetType {
104
+ readonly kind: "col" | "row";
105
+ readonly edge: boolean;
106
+ /** `edge`: the column + sits on its row's bottom edge, which is the table's middle when it has an even number of rows. */
107
+ constructor(kind: "col" | "row", edge?: boolean);
108
+ eq(o: TableAddWidget): boolean;
109
+ toDOM(view: EditorView): HTMLButtonElement;
110
+ }