@visual-z/xeno 0.8.4 → 0.9.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/CHANGELOG.md +8 -0
- package/README.md +31 -746
- package/bin/xeno.exe +26 -0
- package/install.cjs +88 -0
- package/package.json +18 -48
- package/docs/app-server.md +0 -115
- package/docs/foundations.md +0 -88
- package/docs/install.md +0 -244
- package/docs/providers.md +0 -172
- package/docs/research/foundation-clients-2026-10-09.md +0 -27
- package/docs/research/foundation-editing-2026-10-09.md +0 -56
- package/docs/research/foundation-network-2026-10-09.md +0 -37
- package/docs/research/foundation-workflow-2026-10-09.md +0 -37
- package/src/apps/acp-server.ts +0 -41
- package/src/apps/agent-profiles.ts +0 -19
- package/src/apps/app-server.ts +0 -30
- package/src/apps/approve.ts +0 -49
- package/src/apps/cli.ts +0 -99
- package/src/apps/commands.ts +0 -319
- package/src/apps/completions.ts +0 -87
- package/src/apps/control-transport.ts +0 -90
- package/src/apps/export-cli.ts +0 -24
- package/src/apps/goal-flow.ts +0 -70
- package/src/apps/image-draft.ts +0 -46
- package/src/apps/input.ts +0 -312
- package/src/apps/model-catalog.ts +0 -69
- package/src/apps/preferences.ts +0 -20
- package/src/apps/project-trust.ts +0 -9
- package/src/apps/provider-connect.ts +0 -346
- package/src/apps/question-ui.ts +0 -27
- package/src/apps/render.ts +0 -181
- package/src/apps/resources.ts +0 -66
- package/src/apps/review.ts +0 -109
- package/src/apps/session-hub.ts +0 -96
- package/src/apps/session-lifecycle.ts +0 -64
- package/src/apps/shell.ts +0 -2071
- package/src/apps/startup-input.ts +0 -135
- package/src/apps/startup.ts +0 -1677
- package/src/apps/ui/app.ts +0 -1818
- package/src/apps/ui/control-model.ts +0 -43
- package/src/apps/ui/extension-host.ts +0 -194
- package/src/apps/ui/image-cache.ts +0 -121
- package/src/apps/ui/palette.ts +0 -88
- package/src/apps/ui/project.ts +0 -127
- package/src/apps/ui/standalone.ts +0 -148
- package/src/apps/ui/status-model.ts +0 -68
- package/src/apps/ui/surface.ts +0 -91
- package/src/apps/ui/theme.ts +0 -86
- package/src/apps/update-check.ts +0 -112
- package/src/apps/workflow.ts +0 -58
- package/src/core/acceptance.ts +0 -139
- package/src/core/action-defaults.ts +0 -58
- package/src/core/activity-status.ts +0 -52
- package/src/core/agent-profile.ts +0 -130
- package/src/core/attachment-input.ts +0 -17
- package/src/core/blind-checks.ts +0 -72
- package/src/core/boundary.ts +0 -174
- package/src/core/branch-receipt.ts +0 -26
- package/src/core/catalog-merge.ts +0 -19
- package/src/core/checkpoints.ts +0 -85
- package/src/core/churn.ts +0 -61
- package/src/core/command-artifacts.ts +0 -94
- package/src/core/command-contract.ts +0 -151
- package/src/core/completion-action.ts +0 -20
- package/src/core/completion-review.ts +0 -98
- package/src/core/context-detail.ts +0 -37
- package/src/core/context-policy.ts +0 -133
- package/src/core/context-window.ts +0 -54
- package/src/core/continuation.ts +0 -130
- package/src/core/control-protocol.ts +0 -69
- package/src/core/control-view.ts +0 -39
- package/src/core/cycle.ts +0 -17
- package/src/core/data-query.ts +0 -201
- package/src/core/deadline.ts +0 -40
- package/src/core/derive.ts +0 -516
- package/src/core/draft-images.ts +0 -56
- package/src/core/edit-plan.ts +0 -200
- package/src/core/environment.ts +0 -181
- package/src/core/event-validation.ts +0 -220
- package/src/core/events.ts +0 -670
- package/src/core/evidence-ladder.ts +0 -62
- package/src/core/evidence-links.ts +0 -68
- package/src/core/evidence.ts +0 -240
- package/src/core/execution.ts +0 -18
- package/src/core/exhaustive.ts +0 -18
- package/src/core/export.ts +0 -179
- package/src/core/extension-flags.ts +0 -14
- package/src/core/external-effects.ts +0 -488
- package/src/core/failure-recovery.ts +0 -173
- package/src/core/file-precondition.ts +0 -78
- package/src/core/file-references.ts +0 -35
- package/src/core/frontmatter.ts +0 -213
- package/src/core/git-status.ts +0 -29
- package/src/core/goal-view.ts +0 -64
- package/src/core/goal.ts +0 -200
- package/src/core/handoff.ts +0 -479
- package/src/core/history-query.ts +0 -139
- package/src/core/history.ts +0 -237
- package/src/core/image-limits.ts +0 -72
- package/src/core/images.ts +0 -46
- package/src/core/integration-health.ts +0 -34
- package/src/core/json-event.ts +0 -131
- package/src/core/json-pointer.ts +0 -46
- package/src/core/keymap.ts +0 -153
- package/src/core/lsp-framing.ts +0 -34
- package/src/core/mcp-config.ts +0 -68
- package/src/core/model-picker.ts +0 -64
- package/src/core/model-preferences.ts +0 -28
- package/src/core/model-replay.ts +0 -22
- package/src/core/model-scope.ts +0 -53
- package/src/core/note-guidance.ts +0 -34
- package/src/core/oauth-fields.ts +0 -44
- package/src/core/observation-view.ts +0 -152
- package/src/core/outcome.ts +0 -44
- package/src/core/overflow.ts +0 -59
- package/src/core/packages.ts +0 -47
- package/src/core/patch.ts +0 -130
- package/src/core/path-suggestions.ts +0 -59
- package/src/core/permissions.ts +0 -410
- package/src/core/process-receipt.ts +0 -105
- package/src/core/process-state.ts +0 -37
- package/src/core/program-status.ts +0 -40
- package/src/core/progress.ts +0 -150
- package/src/core/project.ts +0 -431
- package/src/core/prompt-policy.ts +0 -46
- package/src/core/prompts.ts +0 -111
- package/src/core/question.ts +0 -94
- package/src/core/queue.ts +0 -78
- package/src/core/read-bounds.ts +0 -24
- package/src/core/read-observation.ts +0 -106
- package/src/core/recovery-sources.ts +0 -74
- package/src/core/regex-dialect.ts +0 -25
- package/src/core/request-budget.ts +0 -23
- package/src/core/request-progress.ts +0 -87
- package/src/core/request-state.ts +0 -273
- package/src/core/resource-selection.ts +0 -36
- package/src/core/response-recovery.ts +0 -59
- package/src/core/resume.ts +0 -59
- package/src/core/review.ts +0 -68
- package/src/core/ripgrep-release.ts +0 -64
- package/src/core/runtime-target.ts +0 -94
- package/src/core/scheduling.ts +0 -8
- package/src/core/search-observation.ts +0 -97
- package/src/core/secrets.ts +0 -188
- package/src/core/session-archive.ts +0 -4
- package/src/core/session-browser.ts +0 -82
- package/src/core/session-entry.ts +0 -61
- package/src/core/session-exit.ts +0 -42
- package/src/core/session-format.ts +0 -169
- package/src/core/session-position.ts +0 -26
- package/src/core/session-tree.ts +0 -147
- package/src/core/settings.ts +0 -192
- package/src/core/skills.ts +0 -165
- package/src/core/sql-query.ts +0 -211
- package/src/core/stall.ts +0 -128
- package/src/core/stop-report.ts +0 -68
- package/src/core/text-normalize.ts +0 -81
- package/src/core/theme.ts +0 -166
- package/src/core/thinking.ts +0 -26
- package/src/core/tokens.ts +0 -151
- package/src/core/tool-contract.ts +0 -153
- package/src/core/tool-discovery.ts +0 -87
- package/src/core/tool-failure.ts +0 -81
- package/src/core/tool-input.ts +0 -44
- package/src/core/transcript.ts +0 -108
- package/src/core/tui-mode.ts +0 -29
- package/src/core/update-check.ts +0 -157
- package/src/core/version.ts +0 -55
- package/src/core/web-content.ts +0 -80
- package/src/core/work-state.ts +0 -154
- package/src/core/workflow-mode.ts +0 -34
- package/src/core/working-set.ts +0 -119
- package/src/core/yaml.ts +0 -282
- package/src/runtime/acp-agent.ts +0 -289
- package/src/runtime/agent-profiles.ts +0 -21
- package/src/runtime/auth.ts +0 -367
- package/src/runtime/blind-check.ts +0 -36
- package/src/runtime/branch-jobs.ts +0 -36
- package/src/runtime/catalog.ts +0 -285
- package/src/runtime/clipboard.ts +0 -125
- package/src/runtime/command-artifacts.ts +0 -64
- package/src/runtime/connection-reuse.ts +0 -40
- package/src/runtime/control-client.ts +0 -149
- package/src/runtime/control-connection.ts +0 -139
- package/src/runtime/counter-check.ts +0 -74
- package/src/runtime/environment-tools.ts +0 -60
- package/src/runtime/evidence-notes.ts +0 -35
- package/src/runtime/exec-sessions.ts +0 -456
- package/src/runtime/execution-control.ts +0 -40
- package/src/runtime/extension-loader.ts +0 -37
- package/src/runtime/extension-ui.ts +0 -47
- package/src/runtime/extensions.ts +0 -370
- package/src/runtime/formatter-tool.ts +0 -38
- package/src/runtime/formatter.ts +0 -50
- package/src/runtime/foundation.ts +0 -116
- package/src/runtime/history-cache.ts +0 -57
- package/src/runtime/history-tools.ts +0 -168
- package/src/runtime/images.ts +0 -80
- package/src/runtime/integrations.ts +0 -216
- package/src/runtime/loop.ts +0 -3108
- package/src/runtime/lsp-client.ts +0 -201
- package/src/runtime/mcp-client.ts +0 -264
- package/src/runtime/mcp-oauth.ts +0 -168
- package/src/runtime/mcp-schema.ts +0 -51
- package/src/runtime/model-config.ts +0 -232
- package/src/runtime/model-data.LICENSE +0 -27
- package/src/runtime/model-data.ts +0 -21
- package/src/runtime/model-discovery.ts +0 -208
- package/src/runtime/model-replay.ts +0 -10
- package/src/runtime/model-scope.ts +0 -20
- package/src/runtime/model-sources.ts +0 -151
- package/src/runtime/model.ts +0 -686
- package/src/runtime/models-fetch.ts +0 -57
- package/src/runtime/oauth-device.ts +0 -86
- package/src/runtime/oauth.ts +0 -853
- package/src/runtime/open-image.ts +0 -42
- package/src/runtime/openai-responses.ts +0 -304
- package/src/runtime/openai.ts +0 -697
- package/src/runtime/output-schema.ts +0 -26
- package/src/runtime/package-manager.ts +0 -125
- package/src/runtime/patch-tool.ts +0 -38
- package/src/runtime/permission-resources.ts +0 -18
- package/src/runtime/pi-provider.ts +0 -423
- package/src/runtime/program-status.ts +0 -38
- package/src/runtime/progress.ts +0 -26
- package/src/runtime/provider-access.ts +0 -21
- package/src/runtime/provider-connect.ts +0 -109
- package/src/runtime/provider-presets.ts +0 -98
- package/src/runtime/provider-protocols.ts +0 -29
- package/src/runtime/provider-request.ts +0 -87
- package/src/runtime/provider-tool-policy.ts +0 -33
- package/src/runtime/provider.ts +0 -580
- package/src/runtime/question-tool.ts +0 -62
- package/src/runtime/retry.ts +0 -447
- package/src/runtime/review-tool.ts +0 -48
- package/src/runtime/rich-text.ts +0 -36
- package/src/runtime/runtime-target.ts +0 -149
- package/src/runtime/secrets.ts +0 -79
- package/src/runtime/self-update.ts +0 -74
- package/src/runtime/session-control.ts +0 -265
- package/src/runtime/session-hub.ts +0 -85
- package/src/runtime/stream-idle.ts +0 -80
- package/src/runtime/tool-broker.ts +0 -137
- package/src/runtime/tool-discovery.ts +0 -58
- package/src/runtime/tool-queue.ts +0 -77
- package/src/runtime/tools.ts +0 -1820
- package/src/runtime/turn-effects.ts +0 -31
- package/src/runtime/update-check.ts +0 -48
- package/src/runtime/usage.ts +0 -253
- package/src/runtime/version.ts +0 -12
- package/src/runtime/web-http.ts +0 -56
- package/src/runtime/web-tools.ts +0 -88
- package/src/runtime/working-notes.ts +0 -60
- package/src/runtime/workspace-lifecycle.ts +0 -141
- package/src/store/acceptance.ts +0 -15
- package/src/store/agent-profile-files.ts +0 -13
- package/src/store/atomic.ts +0 -31
- package/src/store/auth-store.ts +0 -50
- package/src/store/blind-checks.ts +0 -32
- package/src/store/blobs.ts +0 -143
- package/src/store/checkpoint-history.ts +0 -32
- package/src/store/command-artifacts.ts +0 -96
- package/src/store/command.ts +0 -111
- package/src/store/config.ts +0 -69
- package/src/store/context-files.ts +0 -436
- package/src/store/file-checkpoints.ts +0 -108
- package/src/store/file-index.ts +0 -174
- package/src/store/foundation-config.ts +0 -24
- package/src/store/git-checkpoints.ts +0 -67
- package/src/store/git-status.ts +0 -15
- package/src/store/history-search.ts +0 -19
- package/src/store/log.ts +0 -725
- package/src/store/lsp-document.ts +0 -30
- package/src/store/mcp-credentials.ts +0 -85
- package/src/store/models.ts +0 -60
- package/src/store/observations.ts +0 -224
- package/src/store/packages.ts +0 -98
- package/src/store/patch.ts +0 -92
- package/src/store/permission-paths.ts +0 -34
- package/src/store/process-receipts.ts +0 -34
- package/src/store/query-source.ts +0 -49
- package/src/store/recovery.ts +0 -44
- package/src/store/replay.ts +0 -76
- package/src/store/resource-index.ts +0 -170
- package/src/store/resources.ts +0 -285
- package/src/store/restore.ts +0 -110
- package/src/store/review.ts +0 -109
- package/src/store/runtime-target.ts +0 -64
- package/src/store/search.ts +0 -728
- package/src/store/secrets.ts +0 -44
- package/src/store/serial.ts +0 -13
- package/src/store/session-archive.ts +0 -165
- package/src/store/session-browser.ts +0 -68
- package/src/store/session-position.ts +0 -27
- package/src/store/sessions.ts +0 -525
- package/src/store/source-cancellation.ts +0 -6
- package/src/store/tool-binaries.ts +0 -90
- package/src/store/trust.ts +0 -82
- package/src/store/update-cache.ts +0 -36
- package/src/store/user-settings.ts +0 -30
- package/src/store/workspace-clone.ts +0 -42
- package/src/store/workspace-observation.ts +0 -113
- package/src/store/workspace.ts +0 -115
- package/src/store/worktree.ts +0 -278
- package/src/tui/ansi-spans.ts +0 -126
- package/src/tui/diff.ts +0 -160
- package/src/tui/exhaustive.ts +0 -14
- package/src/tui/fuzzy.ts +0 -75
- package/src/tui/style.ts +0 -208
- package/src/tui/ui/atomic-draft.ts +0 -121
- package/src/tui/ui/branch-panel.ts +0 -47
- package/src/tui/ui/canvas.ts +0 -96
- package/src/tui/ui/colors.ts +0 -70
- package/src/tui/ui/composer.ts +0 -199
- package/src/tui/ui/control-panel.ts +0 -25
- package/src/tui/ui/control-sidebar.ts +0 -49
- package/src/tui/ui/dialog.ts +0 -398
- package/src/tui/ui/draft.ts +0 -23
- package/src/tui/ui/duration.ts +0 -16
- package/src/tui/ui/edge.ts +0 -186
- package/src/tui/ui/image-size.ts +0 -44
- package/src/tui/ui/ink.ts +0 -210
- package/src/tui/ui/items.ts +0 -42
- package/src/tui/ui/keys.ts +0 -40
- package/src/tui/ui/layout.ts +0 -74
- package/src/tui/ui/list-model.ts +0 -86
- package/src/tui/ui/list-view.ts +0 -172
- package/src/tui/ui/mascot.ts +0 -67
- package/src/tui/ui/messages.ts +0 -518
- package/src/tui/ui/motion.ts +0 -28
- package/src/tui/ui/paths.ts +0 -10
- package/src/tui/ui/pictures.ts +0 -108
- package/src/tui/ui/prompt-history.ts +0 -60
- package/src/tui/ui/screen.ts +0 -579
- package/src/tui/ui/status.ts +0 -403
- package/src/tui/ui/styled.ts +0 -85
- package/src/tui/ui/tool-card.ts +0 -150
- package/src/tui/width.ts +0 -567
- package/src/vendor/pi-rich/LICENSE.upstream +0 -21
- package/src/vendor/pi-rich/UPSTREAM.json +0 -17
- package/src/vendor/pi-rich/clipboard-command.ts +0 -44
- package/src/vendor/pi-rich/exif-orientation.ts +0 -182
- package/src/vendor/pi-rich/html.ts +0 -51
- package/src/vendor/pi-rich/image-convert.ts +0 -49
- package/src/vendor/pi-rich/image-resize-core.ts +0 -164
- package/src/vendor/pi-rich/image-resize-worker.ts +0 -42
- package/src/vendor/pi-rich/image-resize.ts +0 -123
- package/src/vendor/pi-rich/mime.ts +0 -116
- package/src/vendor/pi-rich/photon.ts +0 -139
- package/src/vendor/pi-rich/syntax-highlight.ts +0 -214
package/src/tui/ui/pictures.ts
DELETED
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* A row of pictures, or the line that stands for them (docs/tasks/feat-tui-inline-images.md).
|
|
3
|
-
*
|
|
4
|
-
* Pictures are drawn by OpenTUI's ImageRenderable (Kitty graphics, Sixel or
|
|
5
|
-
* block characters). Each picture node retains the shared decoded image
|
|
6
|
-
* from the app's cache and lets go of it when the node is destroyed, so a
|
|
7
|
-
* picture that scrolls out of the mounted window frees itself. Where
|
|
8
|
-
* pictures are off, or the terminal can only draw block characters, the
|
|
9
|
-
* row is a single muted line: `▣ shot.png · 1280×720 +2 more`.
|
|
10
|
-
*
|
|
11
|
-
* A click on a drawn picture asks the source to open its full-size original
|
|
12
|
-
* (docs/tasks/feat-tui-image-full-size.md): a thumbnail cannot show a
|
|
13
|
-
* screenshot's text, the system viewer can.
|
|
14
|
-
*
|
|
15
|
-
* The view never reads a file: the app's source loads and verifies bytes.
|
|
16
|
-
*/
|
|
17
|
-
import { BoxRenderable, ImageRenderable, type CliRenderer, type ImageRenderProtocol, type NativeImage } from "@opentui/core";
|
|
18
|
-
import { Canvas } from "./canvas.ts";
|
|
19
|
-
import type { UiColors } from "./colors.ts";
|
|
20
|
-
import { splitLine, type Seg } from "./edge.ts";
|
|
21
|
-
import { imageCells, IMAGES_PER_ITEM } from "./image-size.ts";
|
|
22
|
-
import type { ImageView } from "./items.ts";
|
|
23
|
-
|
|
24
|
-
export interface PictureSource {
|
|
25
|
-
/** Draw pictures, or only the line that names them. */
|
|
26
|
-
readonly mode: "picture" | "chip";
|
|
27
|
-
readonly protocol: ImageRenderProtocol;
|
|
28
|
-
/** Pixels per terminal cell. */
|
|
29
|
-
readonly cell: { readonly width: number; readonly height: number };
|
|
30
|
-
/** The widest a picture may be, in cells (`terminal.imageWidthCells`). */
|
|
31
|
-
readonly widthCells: number;
|
|
32
|
-
readonly reason?: string;
|
|
33
|
-
/** The decoded picture for a blob, shared by every node that shows it, or its preparation failure. */
|
|
34
|
-
load(sha256: string): Promise<PictureLoad>;
|
|
35
|
-
/** Show a blob at full size outside the terminal; absent where nothing can (tests, print mode). */
|
|
36
|
-
open?(sha256: string): void;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
export type PictureLoad = { readonly kind: "ready"; readonly image: NativeImage } |
|
|
40
|
-
{ readonly kind: "error"; readonly reason: "missing" | "corrupt" | "decode" | "limit" | "busy" | "closed" };
|
|
41
|
-
|
|
42
|
-
let serial = 0;
|
|
43
|
-
|
|
44
|
-
export function chipLine(images: readonly ImageView[], limit: number): Seg[] {
|
|
45
|
-
const shown = images.slice(0, limit);
|
|
46
|
-
const segs: Seg[] = [];
|
|
47
|
-
shown.forEach((image, i) => {
|
|
48
|
-
if (i) segs.push({ text: " ", role: "muted" });
|
|
49
|
-
segs.push({ text: "▣ ", role: "muted" }, { text: image.name, role: "text" }, { text: ` · ${image.width}×${image.height}`, role: "muted" });
|
|
50
|
-
});
|
|
51
|
-
if (images.length > shown.length) segs.push({ text: ` +${images.length - shown.length} more`, role: "muted" });
|
|
52
|
-
return segs;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
export class Pictures extends BoxRenderable {
|
|
56
|
-
readonly pictures: readonly ImageRenderable[];
|
|
57
|
-
|
|
58
|
-
constructor(ctx: CliRenderer, colors: UiColors, images: readonly ImageView[], source: PictureSource,
|
|
59
|
-
options: { maxCols: number; maxRows: number; limit?: number; marginTop?: number; marginLeft?: number }) {
|
|
60
|
-
const id = `pictures-${serial++}`;
|
|
61
|
-
super(ctx, { id, flexDirection: "column", flexShrink: 0, marginTop: options.marginTop ?? 0, marginLeft: options.marginLeft ?? 0 });
|
|
62
|
-
const limit = options.limit ?? IMAGES_PER_ITEM;
|
|
63
|
-
const shown = images.slice(0, limit);
|
|
64
|
-
const pictures: ImageRenderable[] = [];
|
|
65
|
-
const states = shown.map(() => source.mode === "picture" ? "preparing" : source.reason ?? "preview unavailable");
|
|
66
|
-
const caption = new Canvas(ctx, { id: `${id}-caption`, height: Math.max(1, shown.length), flexShrink: 0, colors });
|
|
67
|
-
// A long filename must not hide the preparation state or the reason a preview failed.
|
|
68
|
-
const paintCaption = () => caption.setRows(shown.length ? shown.map((image, i) => splitLine(options.maxCols, [
|
|
69
|
-
{ segs: [{ text: "▣ ", role: "muted" }, { text: image.name, role: "text" }], priority: 0, min: 4, shrinkPriority: 5 },
|
|
70
|
-
{ segs: [{ text: `${image.width}×${image.height}`, role: "muted" }], priority: 3 },
|
|
71
|
-
...(i === shown.length - 1 && images.length > shown.length ? [{ segs: [{ text: `+${images.length - shown.length} more`, role: "muted" as const }], priority: 4 }] : []),
|
|
72
|
-
], [{ segs: [{ text: states[i]!, role: states[i]?.startsWith("preview failed") ? "warning" : "muted" }], priority: 0 }], 1, [{ text: " · ", role: "muted" }])) : [chipLine(images, limit)]);
|
|
73
|
-
if (source.mode === "picture" && shown.length) {
|
|
74
|
-
const row = new BoxRenderable(ctx, { id: `${id}-row`, flexDirection: "row", flexShrink: 0, columnGap: 1 });
|
|
75
|
-
// Pictures share the width; each keeps its own proportions.
|
|
76
|
-
const each = Math.max(1, Math.floor((Math.min(options.maxCols, source.widthCells * shown.length) - (shown.length - 1)) / shown.length));
|
|
77
|
-
for (const [index, image] of shown.entries()) {
|
|
78
|
-
const size = imageCells(image, Math.min(each, source.widthCells), options.maxRows, source.cell);
|
|
79
|
-
const picture = new ImageRenderable(ctx, { id: `${id}-${image.sha256.slice(0, 8)}-${serial++}`, width: size.cols, height: size.rows,
|
|
80
|
-
fit: "fit", protocol: source.protocol, flexShrink: 0,
|
|
81
|
-
onLoad: () => { states[index] = source.open ? "click to open" : "decoded"; if (!caption.isDestroyed) paintCaption(); },
|
|
82
|
-
onError: () => { states[index] = "preview failed: decode"; picture.visible = false; if (!caption.isDestroyed) paintCaption(); } });
|
|
83
|
-
void source.load(image.sha256).then(result => {
|
|
84
|
-
if (picture.isDestroyed) return;
|
|
85
|
-
if (result.kind === "ready") picture.source = result.image;
|
|
86
|
-
else { picture.visible = false; states[index] = `preview failed: ${result.reason}`; paintCaption(); }
|
|
87
|
-
}).catch(() => {
|
|
88
|
-
if (picture.isDestroyed) return;
|
|
89
|
-
picture.visible = false; states[index] = "preview failed: decode"; paintCaption();
|
|
90
|
-
});
|
|
91
|
-
const open = source.open;
|
|
92
|
-
if (open) {
|
|
93
|
-
// Same rule as a tool card's head: press and release on one cell is a click; anything else is a selection.
|
|
94
|
-
let down: { x: number; y: number } | undefined;
|
|
95
|
-
picture.onMouseDown = event => { down = { x: event.x, y: event.y }; };
|
|
96
|
-
picture.onMouseUp = event => { if (down && down.x === event.x && down.y === event.y && picture.image) open(image.full ?? image.sha256); down = undefined; };
|
|
97
|
-
}
|
|
98
|
-
pictures.push(picture);
|
|
99
|
-
row.add(picture);
|
|
100
|
-
}
|
|
101
|
-
this.add(row);
|
|
102
|
-
}
|
|
103
|
-
this.pictures = pictures;
|
|
104
|
-
// The names stay visible beside the pictures (and stand in for them in chip mode).
|
|
105
|
-
paintCaption();
|
|
106
|
-
this.add(caption);
|
|
107
|
-
}
|
|
108
|
-
}
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Up/Down prompt recall as a pure value, so its one promise -- navigating
|
|
3
|
-
* never loses text -- is a property test rather than a hope.
|
|
4
|
-
*
|
|
5
|
-
* Readline's precedent: an edit to a recalled line is kept for that line
|
|
6
|
-
* while the user walks elsewhere, and dropped only when something is
|
|
7
|
-
* submitted. Without it, walking Down from an edited entry restores the
|
|
8
|
-
* stashed draft and the edit is gone (docs/tasks/fix-composer-history.md).
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Entries kept, newest first. Assumed, not measured: the composer kept 200
|
|
13
|
-
* before this module existed and nothing has asked for more. Raising it
|
|
14
|
-
* only costs memory; lowering it drops the oldest prompts from recall.
|
|
15
|
-
*/
|
|
16
|
-
export const HISTORY_LIMIT = 200;
|
|
17
|
-
|
|
18
|
-
export type PromptHistory = {
|
|
19
|
-
/** Submitted prompts, newest first. Navigation never changes them. */
|
|
20
|
-
readonly entries: readonly string[];
|
|
21
|
-
/** -1 is the draft; 0.. index entries. */
|
|
22
|
-
readonly at: number;
|
|
23
|
-
/** Unsubmitted text per position (-1 included), so leaving a position keeps what was typed there. */
|
|
24
|
-
readonly edits: ReadonlyMap<number, string>;
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
export const emptyHistory: PromptHistory = { entries: [], at: -1, edits: new Map() };
|
|
28
|
-
|
|
29
|
-
/** A submit ends the walk: edits are discarded and the draft starts empty. */
|
|
30
|
-
export function rememberPrompt(history: PromptHistory, entry: string, limit = HISTORY_LIMIT): PromptHistory {
|
|
31
|
-
if (!entry.trim()) return { ...history, at: -1, edits: new Map() };
|
|
32
|
-
// A repeat of the newest entry records once, so Up reaches the previous distinct prompt.
|
|
33
|
-
const entries = history.entries[0] === entry ? history.entries : [entry, ...history.entries].slice(0, limit);
|
|
34
|
-
return { entries, at: -1, edits: new Map() };
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Older (-1) or newer (+1). `current` is the text at the present position.
|
|
39
|
-
* Null means there is nowhere to go; the caller decides whether that
|
|
40
|
-
* consumes the key.
|
|
41
|
-
*/
|
|
42
|
-
export function stepHistory(history: PromptHistory, direction: -1 | 1, current: string): { history: PromptHistory; text: string } | null {
|
|
43
|
-
const at = history.at - direction;
|
|
44
|
-
if (at < -1 || at >= history.entries.length) return null;
|
|
45
|
-
const edits = new Map(history.edits);
|
|
46
|
-
// An unchanged entry needs no edit; the draft is always kept, even when empty.
|
|
47
|
-
if (history.at === -1 || current !== history.entries[history.at]) edits.set(history.at, current);
|
|
48
|
-
else edits.delete(history.at);
|
|
49
|
-
return { history: { entries: history.entries, at, edits }, text: edits.get(at) ?? history.entries[at] ?? "" };
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
/** 1-based position for the box edge, or undefined while editing the draft. */
|
|
53
|
-
export function historyPosition(history: PromptHistory): { index: number; total: number } | undefined {
|
|
54
|
-
return history.at < 0 ? undefined : { index: history.at + 1, total: history.entries.length };
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/** Rewrites entries (session change: labels that no longer resolve) and starts a fresh walk. */
|
|
58
|
-
export function projectHistory(history: PromptHistory, project: (text: string) => string): PromptHistory {
|
|
59
|
-
return { entries: history.entries.map(project).filter(Boolean), at: -1, edits: new Map() };
|
|
60
|
-
}
|