spacehub

surshar / claude-code

Claude Code is an agentic coding tool that lives in your terminal, understands your codebase, and helps you code faster by executing routine tasks, explaining complex code, and handling git workflows - all through natural language commands.

Built by Anthropic · github.com/anthropics

mods: hook JSDoc is a two-line summary and one short paragraph, naming no file pathBrowse files
poteat authored on Sep 11, 2026 parent 4d63891 · commit 652580d35fea
34 changed files+131 -131compared with 4d63891
Mmods/diff/hooks/backend/backend-of.ts
Mmods/diff/hooks/backend/installed-backend-probes.ts
Mmods/diff/hooks/backend/types/backend/backend.ts
Mmods/diff/hooks/backend/types/backend-host/backend-host.ts
Mmods/diff/hooks/backend/types/backend-probe/backend-probe.ts
Mmods/diff/hooks/backend/types/backend-words/backend-words.ts
Mmods/diff/hooks/git/git-backend-of.ts
Mmods/diff/hooks/git/git-words/git-words.ts
Mmods/diff/hooks/git/parse/is-whole-listing/is-whole-listing.ts
Mmods/diff/hooks/git/tiers/with-untracked/merged-with-untracked/merged-with-untracked.ts
Mmods/diff/hooks/git/types/diff-data/diff-data.ts
Mmods/diff/hooks/git/types/diff-source/diff-source.ts
Mmods/diff/hooks/host/host.ts
Mmods/diff/hooks/limits/columns/open-min-columns.ts
Mmods/diff/hooks/names/texts/resize-terminal-text.ts
Mmods/diff/hooks/pane-state/mode-label-of/mode-label-of.ts
Mmods/diff/hooks/pane-state/pane-model/pane-model.ts
Mmods/diff/hooks/pane-toggle/pane-belief/pane-belief.ts
Mmods/diff/hooks/pane-toggle/pane-toggle-of.ts
Mmods/diff/hooks/record/recorder-of.ts
Mmods/diff/hooks/register.ts
Mmods/diff/hooks/views/current-pane/current-pane.tsx
Mmods/diff/hooks/views/current-pane/message-pane-of/message-pane-of.tsx
Mmods/diff/hooks/views/detail/detail-model/detail-model.ts
Mmods/diff/hooks/views/detail/detail-view.tsx
Mmods/diff/hooks/views/detail/placeholder-of/safe-pathspec-pattern/safe-pathspec-pattern.ts
Mmods/diff/hooks/views/kit/kit.ts
Mmods/diff/hooks/views/layout/wrapped-lines/wrapped-lines.ts
Mmods/diff/hooks/views/pane-view.tsx
Mmods/diff/hooks/views/sections/controls-view.tsx
Mmods/diff/hooks/views/sections/header-view.tsx
Mmods/telemetry/hooks/entries/choice-token/choice-token.ts
Mmods/telemetry/hooks/entries/event-prefix/event-prefix.ts
Mmods/telemetry/hooks/telemetry-types/telemetry.ts
@@ -2,10 +2,11 @@
22 import type { Backend, BackendHost, BackendProbe } from './types'
33
44 /**
5- * The backend holding the session's directory: the first of `probes` that
6- * answers one, else git when a git working tree holds it, else none. The
7- * probes go first so a probe may claim a working copy by its own rule
8- * (the nearer of two markers, say); a probe answers null wherever git
5+ * The backend holding the session's directory: another system's when its
6+ * probe answers first, else git when a git working tree holds it, else none.
7+ *
8+ * Other systems are asked first so one may claim a working copy by its own
9+ * rule (the nearer of two markers, say); each answers null wherever git
910 * should govern.
1011 *
1112 * @param host the bound host's runner and probes
@@ -1,15 +1,12 @@
11 import type { BackendProbe } from './types'
22
33 /**
4- * Where a host adds backends to the plugin: probes for version-control systems
5- * other than git, consulted in insertion order before git (backendOf); a
6- * probe answers null wherever git should govern. Empty as shipped, so the
7- * plugin reads git alone. A host
8- * that compiles the module in may add a probe once, before the plugin
9- * registers; the module runs natively, so that probe is what
10- * `session.start` sees. The module contract offers no other channel: the
11- * options `register` receives are the manifest's userConfig, and the
12- * shipped scan requires `register` itself to be a plain exported function.
4+ * Where a host adds backends: probes for version-control systems other than
5+ * git, asked in insertion order before git (backendOf). Empty as shipped.
6+ *
7+ * A host compiling the module in adds a probe once, before the plugin
8+ * registers: the module runs natively, and there is no other channel (the
9+ * options are the manifest's userConfig; the scan wants a plain function).
1310 */
1411 // module-state-allow: module-evaluation code wiring — a compiling host adds its probe functions (code references, not runtime input) once before registration and never removes or rebinds them; tests pass probes to backendOf directly; a per-Host copy would hold the same functions
1512 export const INSTALLED_BACKEND_PROBES = new Set<BackendProbe>()
@@ -2,9 +2,8 @@
22 import type { BackendWords } from '../backend-words'
33
44 /**
5- * The version-control system behind the pane, pinned once per session:
6- * where its working tree is, which comparisons it offers, how it words
7- * them, and the three reads the pane makes of it.
5+ * The version-control system behind the pane, pinned once per session: its
6+ * working tree, what it compares, how it words them, and the pane's reads.
87 *
98 * Git is the plugin's own backend; a host may install probes for others,
109 * consulted where no git working tree holds the directory (backendOf).
@@ -16,7 +15,7 @@
1615 repository: Pick<Git.Repository, 'toplevel'>
1716
1817 /**
19- * The base modes the picker offers, in picker order.
18+ * What the picker offers to compare against, in its order.
2019 */
2120 baseModes: readonly Git.BaseMode[]
2221
@@ -2,11 +2,12 @@
22 import type Host from '../../../host'
33
44 /**
5- * What pinning a backend takes from the bound host: the raw process
6- * runner (each backend names its own program, argv lead, environment and
7- * timeout), the file probes, the engine's clock, the session's start as it
8- * stands at each fetch (a later `session.start` moves it), and the
9- * branch-base listener.
5+ * What pinning a backend takes from the bound host: its raw process runner,
6+ * file probes, clock, session start and branch-base listener.
7+ *
8+ * Each backend names its own program, argv lead, environment and timeout
9+ * to the runner; the session's start is read as it stands at each fetch
10+ * (a later `session.start` moves it).
1011 */
1112 export type BackendHost = Pick<Host.Host, 'run' | 'readFile'> &
1213 Pick<Git.GitDeps, 'mtimeOf' | 'entryKindsOf' | 'onBranchBase'> & {
@@ -3,7 +3,8 @@
33
44 /**
55 * Probes the session's directory for one backend's working tree: the
6- * backend when it holds the directory, null when it does not or when git
7- * should govern it instead (Git.gitBackendOf is git's).
6+ * backend when it holds the directory, else null.
7+ *
8+ * Null too where git should govern it instead (Git.gitBackendOf is git's).
89 */
910 export type BackendProbe = (host: BackendHost) => Promise<Backend | null>
@@ -1,7 +1,9 @@
11 /**
2- * The words the pane draws that name the backend: what uncommitted mode
3- * compares against, the command whose failure the empty state names, the
4- * tool that lists untracked files, and the note under an untracked row.
2+ * The words the pane draws that name the backend.
3+ *
4+ * What uncommitted mode compares against, the command whose failure the
5+ * empty state names, the tool that lists untracked files, and the note
6+ * under an untracked row.
57 */
68 export type BackendWords = {
79 /**
@@ -11,10 +11,11 @@
1111
1212 /**
1313 * The git backend over the session's directory: the repository read with
14- * one `rev-parse` in that directory, then every child pinned to it
15- * (`--git-dir`, `--work-tree`, cwd the top) under the C locale and the
16- * fetch's timeout (gitDiff.ts execPinnedGit).
14+ * one `rev-parse` in that directory, then every child pinned to it.
1715 *
16+ * Each child runs with `--git-dir`, `--work-tree` and cwd the top, under
17+ * the C locale and the fetch's timeout (the built-in's execPinnedGit).
18+ *
1819 * @param host the bound host's runner and probes
1920 * @returns the backend, or null outside a git working tree
2021 */
@@ -1,9 +1,10 @@
11 import type Backend from '../../backend'
22
33 /**
4- * The pane's git words: compared with HEAD, read by `git diff`, untracked
5- * files listed by git and staged with `git add :/…`, unquoted as
6- * DiffDetailView words it.
4+ * The pane's git words, unquoted as DiffDetailView words them.
5+ *
6+ * Compared with HEAD, read by `git diff`, untracked files listed by git and
7+ * staged with `git add :/…`.
78 */
89 export const GIT_WORDS: Backend.BackendWords = Object.freeze({
910 base: 'HEAD',
@@ -3,12 +3,11 @@
33 import { MOST_UTF8_BYTES } from './most-utf8-bytes'
44
55 /**
6- * Whether a listing arrived whole: every record terminated (NUL for git's
7- * `-z` listings, a newline for line records) and the text short of the
8- * host's output cap, so no record was cut or lost.
6+ * Whether a listing arrived whole, so no record was cut or lost.
97 *
10- * A cut inside a multi-byte character costs the decoded text up to
11- * MOST_UTF8_BYTES, hence the margin under the cap.
8+ * Every record is terminated (NUL for `-z` listings, a newline for line
9+ * records) and the text is short of the host's output cap by MOST_UTF8_BYTES,
10+ * what a cut inside a multi-byte character can cost the decoded text.
1211 *
1312 * @param stdout the listing as `$.process.run` returned it
1413 * @param terminator what ends every record; NUL when absent
@@ -3,10 +3,10 @@
33
44 /**
55 * A tier's tracked rows and totals with a listed set of untracked rows
6- * after them (gitDiff.ts mergeSessionUntrackedFiles), or flagged withheld
7- * when the lister gave no whole listing.
6+ * after them, or flagged withheld when the lister gave no whole listing.
87 *
9- * A path a tracked row already holds keeps that row and counts once.
8+ * As the built-in's mergeSessionUntrackedFiles merges them, a path a
9+ * tracked row already holds keeps that row and counts once.
1010 *
1111 * @param result the tier's tracked rows and totals
1212 * @param untracked the untracked rows, or null when their listing was withheld
@@ -6,8 +6,7 @@
66
77 /**
88 * One settled fetch: the rows, the totals, what they compare, and what a
9- * file's hunks must be read against so both agree, over the working tree's
10- * top (every backend has one; git's other directories stay its own).
9+ * file's hunks are read against so both agree, over the working tree's top.
1110 *
1211 * `isUnborn`: a repository before its first commit (rows are the staged
1312 * and new files, `baseRef` is `--cached`); `stalePaths`: files whose staged
@@ -1,8 +1,9 @@
11 /**
22 * What a fetched diff compares: the working tree against its checked-out
3- * commit (`base` names it as the pane should: `HEAD`, or a short sha where
4- * the backend has no such word), or against the merge-base with the default
5- * branch (`baseRef` the ref git was handed).
3+ * commit, or against the merge-base with the default branch.
4+ *
5+ * `base` names the commit as the pane should (`HEAD`, or a short sha where
6+ * the backend has no such word); `baseRef` is the ref git was handed.
67 */
78 export type DiffSource =
89 | { kind: 'working-tree'; base: string }
@@ -105,7 +105,7 @@
105105 registerCommand: (spec: CommandSpec) => Promise<unknown>
106106
107107 /**
108- * `$.session.id`: the session the pane-shown row is latched to.
108+ * Which session the pane-shown row is latched to, as `$.session.id` says.
109109 */
110110 sessionId: () => Promise<string>
111111
@@ -1,6 +1,8 @@
11 /**
2- * The terminal width from which `/diff` opens the pane, and the first edit
3- * opens it when the person kept it open before (the built-in sidebar's own
4- * minimum).
2+ * The terminal width from which `/diff` opens the pane (the built-in
3+ * sidebar's own minimum).
4+ *
5+ * The first edit opens it from this width too, when the person kept it
6+ * open before.
57 */
68 export const OPEN_MIN_COLUMNS = 110
@@ -1,7 +1,9 @@
11 /**
2- * `/diff`'s answer on a terminal narrower than the built-in panel shows on,
3- * worded as the built-in words it; also the pane's one line where the
4- * surface seats it inline (no room beside the transcript).
2+ * `/diff`'s answer on a terminal narrower than the built-in panel shows
3+ * on, worded as the built-in words it.
4+ *
5+ * Also the pane's one line where the surface seats it inline (no room
6+ * beside the transcript).
57 */
68 export const RESIZE_TERMINAL_TEXT =
79 'Resize your terminal to at least 110 columns to show the diff panel'
@@ -2,11 +2,12 @@
22 import type Git from '../../git'
33
44 /**
5- * A requested mode's name for the base line; branch mode names its base
6- * branch from the data, or says what stands in while none is known. A
7- * working-tree diff names its own base (`HEAD`, a short sha); anything
8- * else falls back to the backend's word for it.
5+ * A requested mode's name for the base line.
96 *
7+ * Branch mode names its base branch from the data, or says what stands in
8+ * while none is known. A working-tree diff names its own base (`HEAD`, a
9+ * short sha); anything else falls back to the backend's word for it.
10+ *
1011 * @param requested the mode the person picked
1112 * @param source what the data on screen compares
1213 * @param phase `pending` while the requested mode's fetch has not landed
@@ -6,9 +6,11 @@
66 import type { Source } from '../source'
77
88 /**
9- * Everything one drawing of the pane reads: the last good fetch, what the
10- * person picked, the selected file's body, the transcript's turns and todos,
11- * and the pinned backend's words and base modes (git's until one is pinned).
9+ * Everything one drawing of the pane reads.
10+ *
11+ * The last good fetch, what the person picked, the selected file's body,
12+ * the transcript's turns and todos, and the pinned backend's words and
13+ * base modes (git's until one is pinned).
1214 */
1315 export type PaneModel = {
1416 words: Backend.BackendWords
@@ -1,7 +1,8 @@
11 /**
2- * What the plugin knows of its pane when `/diff` runs: whether it opened
3- * it and never closed it, whether it drew when a redraw was asked, and the
4- * terminal's width as last drawn (null before any draw).
2+ * What the plugin knows of its pane when `/diff` runs.
3+ *
4+ * Whether it opened it and never closed it, whether it drew when a redraw
5+ * was asked, and the terminal's width as last drawn (null before any draw).
56 */
67 export type PaneBelief = {
78 isBelievedOpen: boolean
@@ -3,12 +3,11 @@
33
44 /**
55 * What `/diff` does, the one place its toggle is decided: close only when
6- * the plugin opened the pane and it still draws; otherwise open, focused,
7- * unless the terminal is narrower than the built-in panel shows on, where
8- * `/diff` answers the built-in's resize line instead (`too-narrow`).
6+ * the plugin opened the pane and it still draws; otherwise open, focused.
97 *
10- * The person's close raises nothing this plugin hooks, so a pane believed
11- * open is probed with a redraw first. A width not drawn yet opens.
8+ * Narrower than the built-in panel shows on, it answers the resize line
9+ * (`too-narrow`). The person's close raises nothing it hooks, so a pane
10+ * believed open is probed with a redraw first; a width not drawn yet opens.
1211 *
1312 * @param pane the plugin's belief, the probe's answer and the width
1413 * @returns `close`, `open` or `too-narrow`
@@ -7,9 +7,10 @@
77
88 /**
99 * The plugin's Recorder over the host: each row goes through the telemetry
10- * built-in's `$.telemetry`, named and shaped as the built-in panel's own;
11- * a missing noun or a refused row is dropped.
10+ * built-in's `$.telemetry`, named and shaped as the built-in panel's own.
1211 *
12+ * A missing noun or a refused row is dropped.
13+ *
1314 * @param host the engine as session.start bound it
1415 * @returns the recorder
1516 */
@@ -21,11 +21,9 @@
2121 * Registers the diff pane: `/diff` once the built-in stands down, the
2222 * pane's drawing and refresh, its opening on Claude's first edit, the ask.
2323 *
24- * `session.start` registers `/diff` (refused while the built-in holds it),
25- * binds the host every pinned backend reads through, and pins the backend
26- * (backendOf): one probe in flight, asked again on `/diff` until git answers.
27- * On a terminal narrower than the built-in panel shows on, `/diff` answers
28- * the built-in's resize line and opens nothing (paneToggleOf).
24+ * `session.start` registers `/diff`, binds the host every pinned backend
25+ * reads through (currentOf: the latest start's, the engine only before
26+ * bind()), and pins the backend (backendOf), asked again on `/diff`.
2927 *
3028 * @param on the engine's registrar
3129 */
@@ -50,9 +48,6 @@
5048 const timers = new Map<'refresh' | 'redraw' | 'poll', Timer>()
5149 const loggedBaseKinds = new Set<'ok' | 'sad'>()
5250
53- // The bound host once bind() has run (it sets `host` before pinning), so a
54- // backend pinned under one session.start keeps reading through whatever
55- // host a later session.start bound; `engine` only before that.
5651 const currentOf = (engine: Host): Host => host ?? engine
5752
5853 const backendHostOf = (engine: Host): Backend.BackendHost => ({
@@ -18,12 +18,9 @@
1818 * The pane over the repository's diff now (ReplDiffSidebarBody, one file's
1919 * body at a time): header, base line, todo bar, pickers, rows, detail.
2020 *
21- * The tests-and-generated toggle sits above the rows; the elision count, the
22- * withheld-untracked note, the pre-session line and rows below them, a blank
23- * row above that line and above its rows as the built-in leaves; the
24- * selected file last. With no rows to list, the loading line, the empty
25- * state or the too-many and only-hidden lines take the body instead
26- * (messagePaneOf), the header keeping only the close.
21+ * The toggle sits above the rows; the elision count, withheld-untracked
22+ * note and pre-session line below, with blank rows as the built-in leaves.
23+ * With nothing to list, messagePaneOf draws the body, the header a close.
2724 *
2825 * @param kit the elements, the handlers, the width, the rows
2926 * @param model the pane's state
@@ -8,16 +8,11 @@
88
99 /**
1010 * The pane while a message stands in for the list (ReplDiffSidebar's
11- * centered body: the first fetch, the empty state, the too-many and
12- * only-hidden states): the header block, the built-in's blank row under it,
13- * the message with the pickers under it, the pre-session line.
11+ * centered body): the header, a blank row, the message, the pickers.
1412 *
15- * With nothing listed below and the rows to hold it, the message's lines
16- * sit where the built-in centers them (half the spare rows above, rounded
17- * down; each wrapped line centered on its own), the pickers right under
18- * them and the pre-session line at the foot; otherwise it all stacks from
19- * the top, the pickers on the blank row the built-in leaves above the
20- * pre-session line (that blank row itself when there are none).
13+ * With nothing listed below and room, the lines sit where the built-in
14+ * centers them (half the spare rows above), the pickers under them;
15+ * otherwise all stacks from the top, the pickers over the pre-session line.
2116 *
2217 * @param kit the elements, the width, the body's rows
2318 * @param pane the header block, the message's lines, the pickers, the
@@ -3,9 +3,10 @@
33 import type PaneState from '../../../pane-state'
44
55 /**
6- * The selected file as its body draws it: the path, what kind of row it is,
7- * its hunks once read, whether it is armed for the next prompt, and the
8- * backend's words for an untracked row's note.
6+ * The selected file as its body draws it.
7+ *
8+ * The path, what kind of row it is, its hunks once read, whether it is armed
9+ * for the next prompt, and the backend's words for an untracked row's note.
910 */
1011 export type DetailModel = {
1112 words: Pick<Backend.BackendWords, 'untrackedNoteOf'>
@@ -13,13 +13,12 @@
1313 import { placeholderOf } from './placeholder-of'
1414
1515 /**
16- * The selected file under the list: its bold path and asides, each name
17- * cut from its start to the width, the ask Button, the built-in's dim rule
18- * under them, the body.
16+ * The selected file under the list: its bold path and asides, the ask
17+ * Button, the built-in's dim rule under them, the body.
1918 *
20- * The body is a placeholder, or the hunks as the engine's diff `Code` blocks
21- * (codeBlocksOf) named by the path, a dim divider where two meet at a hunk;
22- * then the footer when anything was cut.
19+ * Each name is cut from its start to the width. The body is a placeholder,
20+ * or the hunks as the engine's diff `Code` blocks (codeBlocksOf), a dim
21+ * divider where two meet, then the footer when anything was cut.
2322 *
2423 * @param kit the elements and the width
2524 * @param detail the selected file
@@ -1,8 +1,8 @@
11 /**
22 * A file name safe to paste, unquoted, into a stage command in any shell
3- * (POSIX, PowerShell, cmd): letters and digits of any script and `._/@+-`
4- * only.
3+ * (POSIX, PowerShell, cmd).
54 *
6- * No quote of any kind, no separator and no substitution can ride in it.
5+ * Letters and digits of any script and `._/@+-` only: no quote of any
6+ * kind, no separator and no substitution can ride in it.
77 */
88 export const SAFE_PATHSPEC_PATTERN = /^[\p{L}\p{N}._/@+-]+$/u
@@ -2,9 +2,10 @@
22 import type { Ui } from './ui'
33
44 /**
5- * What every part of one drawing is handed: the surface's elements, the
6- * controls' handlers, the body's width (`props.bodyColumns`) and its rows
7- * (`props.scroll.bodyRows`).
5+ * What every part of one drawing is handed.
6+ *
7+ * The surface's elements, the controls' handlers, the body's width
8+ * (`props.bodyColumns`) and its rows (`props.scroll.bodyRows`).
89 */
910 export type Kit = {
1011 ui: Ui
@@ -1,12 +1,14 @@
11 import { cellWidth } from '../cell-width'
22
33 /**
4- * A line cut into rows of at most `columns` cells as Ink's `wrap` cuts the
5- * built-in's empty state before it centers each row: at spaces, the space a
6- * row breaks on kept at its end, a word wider than a row cut across rows.
4+ * A line cut into rows as Ink's `wrap` cuts the built-in's empty state
5+ * before it centers each row.
76 *
7+ * It cuts at spaces, keeping the space a row breaks on at its end; a word
8+ * wider than a row is cut across rows.
9+ *
810 * @param text one sanitized line
9- * @param columns the width, at least one cell
11+ * @param columns the width, at least one cell; no row holds more
1012 * @returns the rows, at least one
1113 */
1214 export function wrappedLines(text: string, columns: number): string[] {
@@ -15,10 +15,9 @@
1515 * The diff pane's body for one `ui.render`: the repository's diff now, or
1616 * the picked turn's edits while that turn still exists (a rewind drops it).
1717 *
18- * Seated inline (no room beside the transcript), only the built-in's line
19- * asking for a wider terminal, as the built-in shows no panel there. Docked,
20- * the body keeps the built-in's blank row above the header and blank last
21- * column, so its rows sit and wrap where the built-in's do.
18+ * Seated inline, only the built-in's wider-terminal line, as it shows no
19+ * panel there; docked, the built-in's blank row above the header and blank
20+ * last column, so rows sit and wrap where the built-in's do.
2221 *
2322 * @param kit the elements, the handlers, the width
2423 * @param model the pane's state
@@ -12,9 +12,8 @@
1212 * turn with edits, newest first) and, for the current source, the base.
1313 *
1414 * The source picker draws only when a turn exists, as DiffDialog hides its
15- * tabs; the base picker is the built-in's ctrl+x b cycle as a Select over
16- * the modes the backend offers, uncommitted mode naming the base as the
17- * base line does (modeLabelOf).
15+ * tabs; the base picker is ctrl+x b's cycle as a Select over the backend's
16+ * modes, uncommitted naming the base as the base line does (modeLabelOf).
1817 *
1918 * @param kit the elements and the handlers
2019 * @param model what is picked now and the turns to pick from
@@ -11,9 +11,10 @@
1111
1212 /**
1313 * The pane's first line (ReplDiffSidebar's header row): `N files changed
14- * +A -R`, or nothing over an empty state, and the close `✕` at the right
15- * edge either way.
14+ * +A -R`, or nothing over an empty state.
1615 *
16+ * The close `✕` sits at the right edge either way.
17+ *
1718 * @param kit the drawing's kit; its elements draw the line
1819 * @param totals the header's counts, or null when there is nothing to count
1920 * @returns the line
@@ -1,6 +1,8 @@
11 /**
2- * The shape of a Choice member: a snake_case token of at most 64 characters,
3- * which may start with a digit (a bucket such as `110_to_143`), unlike a name
4- * or a key (TOKEN).
2+ * The shape of a Choice member: a snake_case token of at most 64
3+ * characters.
4+ *
5+ * Unlike a name or a key (TOKEN), it may start with a digit (a bucket such
6+ * as `110_to_143`).
57 */
68 export const CHOICE_TOKEN = /^[a-z0-9][a-z0-9_]{0,63}$/
@@ -1,6 +1,7 @@
11 /**
22 * What an event's name starts with unless the caller named it as the CLI's
3- * own (CORE_EVENT_PREFIX): the plugin-event convention. The calling
4- * built-in's own name is already in the event it passes.
3+ * own (CORE_EVENT_PREFIX): the plugin-event convention.
4+ *
5+ * The calling built-in's own name is already in the event it passes.
56 */
67 export const EVENT_PREFIX = 'tengu_plugin_'
@@ -13,11 +13,9 @@
1313 * Sends one event, `tengu_plugin_<event>`, as one first-party row;
1414 * resolves once the ingest accepted it.
1515 *
16- * The noun cannot see its caller, so the calling built-in names itself in
17- * `event` and this adds the prefix; an event already named `tengu_…`, a
18- * built-in port's own row, is sent under that name. A value is a finite
19- * number, a boolean or a Choice; free text is refused. One input, as every
20- * op on `$` takes.
16+ * The calling built-in names itself in `event`; one already named `tengu_…`
17+ * is sent as named. A value is a finite number, a boolean or a Choice; free
18+ * text is refused. One input, as every op on `$` takes.
2119 *
2220 * @param entry the event's name, a snake_case token, and its properties by
2321 * snake_case key