mindweave 2.5.0 → 3.0.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/README.md +81 -145
- package/dist/cli/App.js +579 -304
- package/dist/cli/App.js.map +1 -1
- package/dist/cli/analytics.js +27 -18
- package/dist/cli/analytics.js.map +1 -1
- package/dist/cli/attachments.js +34 -0
- package/dist/cli/attachments.js.map +1 -1
- package/dist/cli/bannerFit.js +70 -0
- package/dist/cli/bannerFit.js.map +1 -0
- package/dist/cli/bootstrap.js +41 -3
- package/dist/cli/bootstrap.js.map +1 -1
- package/dist/cli/commands.js +4 -1
- package/dist/cli/commands.js.map +1 -1
- package/dist/cli/components/ApprovalBox.js +3 -2
- package/dist/cli/components/ApprovalBox.js.map +1 -1
- package/dist/cli/components/BlockView.js +27 -6
- package/dist/cli/components/BlockView.js.map +1 -1
- package/dist/cli/components/FirstRunFrame.js +2 -1
- package/dist/cli/components/FirstRunFrame.js.map +1 -1
- package/dist/cli/components/KeyManager.js +5 -4
- package/dist/cli/components/KeyManager.js.map +1 -1
- package/dist/cli/components/KeySetup.js +29 -13
- package/dist/cli/components/KeySetup.js.map +1 -1
- package/dist/cli/components/MarathonBox.js +64 -0
- package/dist/cli/components/MarathonBox.js.map +1 -0
- package/dist/cli/components/McpMinitabs.js +8 -7
- package/dist/cli/components/McpMinitabs.js.map +1 -1
- package/dist/cli/components/Picker.js +4 -3
- package/dist/cli/components/Picker.js.map +1 -1
- package/dist/cli/components/PromptInput.js +47 -8
- package/dist/cli/components/PromptInput.js.map +1 -1
- package/dist/cli/components/PulseDot.js +42 -0
- package/dist/cli/components/PulseDot.js.map +1 -0
- package/dist/cli/components/SubagentView.js +9 -6
- package/dist/cli/components/SubagentView.js.map +1 -1
- package/dist/cli/components/TipLine.js +2 -1
- package/dist/cli/components/TipLine.js.map +1 -1
- package/dist/cli/components/ToolGroup.js +65 -49
- package/dist/cli/components/ToolGroup.js.map +1 -1
- package/dist/cli/components/ToolLine.js +20 -19
- package/dist/cli/components/ToolLine.js.map +1 -1
- package/dist/cli/components/TrustGate.js +2 -1
- package/dist/cli/components/TrustGate.js.map +1 -1
- package/dist/cli/components/minitabs.js +3 -2
- package/dist/cli/components/minitabs.js.map +1 -1
- package/dist/cli/desktopApp.js +45 -0
- package/dist/cli/desktopApp.js.map +1 -0
- package/dist/cli/help.js +1 -0
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/inkOutputPatch.js +285 -0
- package/dist/cli/inkOutputPatch.js.map +1 -0
- package/dist/cli/inkSpeed.js +29 -0
- package/dist/cli/inkSpeed.js.map +1 -0
- package/dist/cli/inkSpeedLoader.js +47 -0
- package/dist/cli/inkSpeedLoader.js.map +1 -0
- package/dist/cli/inputText.js +30 -0
- package/dist/cli/inputText.js.map +1 -0
- package/dist/cli/keyManager.js +2 -1
- package/dist/cli/keyManager.js.map +1 -1
- package/dist/cli/keyPrefs.js +90 -0
- package/dist/cli/keyPrefs.js.map +1 -0
- package/dist/cli/keySetup.js +5 -2
- package/dist/cli/keySetup.js.map +1 -1
- package/dist/cli/marathonUi.js +113 -0
- package/dist/cli/marathonUi.js.map +1 -0
- package/dist/cli/markdown.js +63 -11
- package/dist/cli/markdown.js.map +1 -1
- package/dist/cli/modes.js +3 -3
- package/dist/cli/modes.js.map +1 -1
- package/dist/cli/prodEnv.js +43 -0
- package/dist/cli/prodEnv.js.map +1 -0
- package/dist/cli/revealPace.js +5 -5
- package/dist/cli/revealPace.js.map +1 -1
- package/dist/cli/revealQueue.js +120 -0
- package/dist/cli/revealQueue.js.map +1 -0
- package/dist/cli/theme.js +47 -0
- package/dist/cli/theme.js.map +1 -0
- package/dist/cli/toolDisplay.js +112 -18
- package/dist/cli/toolDisplay.js.map +1 -1
- package/dist/cli/transcript.js +1 -1
- package/dist/cli/transcript.js.map +1 -1
- package/dist/cli/virtualWindow.js +14 -2
- package/dist/cli/virtualWindow.js.map +1 -1
- package/dist/cli/wheelAccel.js +73 -0
- package/dist/cli/wheelAccel.js.map +1 -0
- package/dist/cli/widestLinePatch.js +48 -0
- package/dist/cli/widestLinePatch.js.map +1 -0
- package/dist/cli/workingVerb.js +88 -28
- package/dist/cli/workingVerb.js.map +1 -1
- package/dist/cli/wrap.js +1 -1
- package/dist/cli/wrap.js.map +1 -1
- package/dist/core/contextSettings.js +84 -0
- package/dist/core/contextSettings.js.map +1 -0
- package/dist/core/limitsView.js +40 -0
- package/dist/core/limitsView.js.map +1 -0
- package/dist/core/mcpServers.js +164 -0
- package/dist/core/mcpServers.js.map +1 -0
- package/dist/core/permissions.js +209 -0
- package/dist/core/permissions.js.map +1 -0
- package/dist/core/providerKeys.js +187 -0
- package/dist/core/providerKeys.js.map +1 -0
- package/dist/core/rulesSkills.js +142 -0
- package/dist/core/rulesSkills.js.map +1 -0
- package/dist/core/spendView.js +90 -0
- package/dist/core/spendView.js.map +1 -0
- package/dist/core/turnRunner.js +759 -0
- package/dist/core/turnRunner.js.map +1 -0
- package/dist/drivers/anthropic/client.js +101 -26
- package/dist/drivers/anthropic/client.js.map +1 -1
- package/dist/drivers/anthropic/manifest.js +43 -13
- package/dist/drivers/anthropic/manifest.js.map +1 -1
- package/dist/drivers/cerebras/manifest.js +13 -3
- package/dist/drivers/cerebras/manifest.js.map +1 -1
- package/dist/drivers/deepseek/manifest.js +24 -34
- package/dist/drivers/deepseek/manifest.js.map +1 -1
- package/dist/drivers/glm/manifest.js +21 -6
- package/dist/drivers/glm/manifest.js.map +1 -1
- package/dist/drivers/groq/manifest.js +5 -2
- package/dist/drivers/groq/manifest.js.map +1 -1
- package/dist/drivers/kimi/manifest.js +13 -10
- package/dist/drivers/kimi/manifest.js.map +1 -1
- package/dist/drivers/meta/manifest.js +21 -16
- package/dist/drivers/meta/manifest.js.map +1 -1
- package/dist/drivers/minimax/manifest.js +15 -12
- package/dist/drivers/minimax/manifest.js.map +1 -1
- package/dist/drivers/ollama/catalog.js +71 -0
- package/dist/drivers/ollama/catalog.js.map +1 -0
- package/dist/drivers/ollama/client.js +164 -0
- package/dist/drivers/ollama/client.js.map +1 -0
- package/dist/drivers/ollama/endpoint.js +42 -0
- package/dist/drivers/ollama/endpoint.js.map +1 -0
- package/dist/drivers/ollama/index.js +5 -0
- package/dist/drivers/ollama/index.js.map +1 -0
- package/dist/drivers/ollama/manifest.js +64 -0
- package/dist/drivers/ollama/manifest.js.map +1 -0
- package/dist/drivers/openai/client.js +10 -4
- package/dist/drivers/openai/client.js.map +1 -1
- package/dist/drivers/openai/manifest.js +69 -18
- package/dist/drivers/openai/manifest.js.map +1 -1
- package/dist/drivers/qwen/manifest.js +19 -6
- package/dist/drivers/qwen/manifest.js.map +1 -1
- package/dist/drivers/registry.js +11 -0
- package/dist/drivers/registry.js.map +1 -1
- package/dist/drivers/retryPolicy.js +26 -1
- package/dist/drivers/retryPolicy.js.map +1 -1
- package/dist/drivers/xai/client.js +12 -10
- package/dist/drivers/xai/client.js.map +1 -1
- package/dist/drivers/xai/manifest.js +62 -25
- package/dist/drivers/xai/manifest.js.map +1 -1
- package/dist/dynamo/auxModel.js +54 -0
- package/dist/dynamo/auxModel.js.map +1 -0
- package/dist/dynamo/engine.js +407 -99
- package/dist/dynamo/engine.js.map +1 -1
- package/dist/dynamo/guard.js +10 -0
- package/dist/dynamo/guard.js.map +1 -1
- package/dist/dynamo/liveMeter.js +25 -6
- package/dist/dynamo/liveMeter.js.map +1 -1
- package/dist/dynamo/marathon.js +409 -0
- package/dist/dynamo/marathon.js.map +1 -0
- package/dist/dynamo/marathonPrompt.js +45 -0
- package/dist/dynamo/marathonPrompt.js.map +1 -0
- package/dist/dynamo/model.js +6 -2
- package/dist/dynamo/model.js.map +1 -1
- package/dist/dynamo/toolBatches.js +58 -0
- package/dist/dynamo/toolBatches.js.map +1 -0
- package/dist/dynamo/usageLimits.js +446 -0
- package/dist/dynamo/usageLimits.js.map +1 -0
- package/dist/governor/freshness.js +10 -7
- package/dist/governor/freshness.js.map +1 -1
- package/dist/governor/index.js +76 -9
- package/dist/governor/index.js.map +1 -1
- package/dist/governor/write.js +43 -14
- package/dist/governor/write.js.map +1 -1
- package/dist/index.js +18 -151
- package/dist/index.js.map +1 -1
- package/dist/main.js +162 -0
- package/dist/main.js.map +1 -0
- package/dist/mcp/manager.js +18 -0
- package/dist/mcp/manager.js.map +1 -1
- package/dist/memory/allMetas.js +69 -0
- package/dist/memory/allMetas.js.map +1 -0
- package/dist/memory/compaction.js +70 -15
- package/dist/memory/compaction.js.map +1 -1
- package/dist/memory/earlier.js +15 -0
- package/dist/memory/earlier.js.map +1 -0
- package/dist/memory/profile.js +93 -0
- package/dist/memory/profile.js.map +1 -0
- package/dist/memory/rewind.js +262 -0
- package/dist/memory/rewind.js.map +1 -0
- package/dist/memory/session.js +42 -10
- package/dist/memory/session.js.map +1 -1
- package/dist/memory/sessionMemory.js +48 -13
- package/dist/memory/sessionMemory.js.map +1 -1
- package/dist/memory/sessionMemoryCompact.js +1 -1
- package/dist/memory/sessionMemoryCompact.js.map +1 -1
- package/dist/memory/sessionTitle.js +50 -0
- package/dist/memory/sessionTitle.js.map +1 -0
- package/dist/memory/store.js +42 -1
- package/dist/memory/store.js.map +1 -1
- package/dist/memory/types.js.map +1 -1
- package/dist/tools/askUser.js +14 -0
- package/dist/tools/askUser.js.map +1 -1
- package/dist/tools/backgroundShells.js +208 -5
- package/dist/tools/backgroundShells.js.map +1 -1
- package/dist/tools/browser.js +176 -0
- package/dist/tools/browser.js.map +1 -0
- package/dist/tools/cdp.js +165 -0
- package/dist/tools/cdp.js.map +1 -0
- package/dist/tools/checkpoints.js +208 -5
- package/dist/tools/checkpoints.js.map +1 -1
- package/dist/tools/deferredNative.js +2 -0
- package/dist/tools/deferredNative.js.map +1 -1
- package/dist/tools/detail.js +9 -6
- package/dist/tools/detail.js.map +1 -1
- package/dist/tools/edit.js +2 -1
- package/dist/tools/edit.js.map +1 -1
- package/dist/tools/exitPlan.js +4 -0
- package/dist/tools/exitPlan.js.map +1 -1
- package/dist/tools/hiddenDesktop.js +273 -0
- package/dist/tools/hiddenDesktop.js.map +1 -0
- package/dist/tools/listeningPorts.js +134 -0
- package/dist/tools/listeningPorts.js.map +1 -0
- package/dist/tools/mcpSearch.js +8 -0
- package/dist/tools/mcpSearch.js.map +1 -1
- package/dist/tools/mindweaveStatus.js +1 -1
- package/dist/tools/mindweaveStatus.js.map +1 -1
- package/dist/tools/registry.js +3 -0
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/replaceSymbol.js +2 -1
- package/dist/tools/replaceSymbol.js.map +1 -1
- package/dist/tools/runCommand.js +113 -9
- package/dist/tools/runCommand.js.map +1 -1
- package/dist/tools/screenshot.js +4 -6
- package/dist/tools/screenshot.js.map +1 -1
- package/dist/tools/screenshotWin.js +26 -9
- package/dist/tools/screenshotWin.js.map +1 -1
- package/dist/tools/stateCheckpoint.js +128 -0
- package/dist/tools/stateCheckpoint.js.map +1 -0
- package/dist/tools/todo.js +6 -0
- package/dist/tools/todo.js.map +1 -1
- package/dist/tools/ui.js +1295 -0
- package/dist/tools/ui.js.map +1 -0
- package/dist/tools/uiHide.js +356 -0
- package/dist/tools/uiHide.js.map +1 -0
- package/dist/tools/uiPage.js +861 -0
- package/dist/tools/uiPage.js.map +1 -0
- package/dist/tools/uiWin.js +506 -0
- package/dist/tools/uiWin.js.map +1 -0
- package/dist/tools/webFetch.js +32 -25
- package/dist/tools/webFetch.js.map +1 -1
- package/dist/tools/webSearch.js +12 -0
- package/dist/tools/webSearch.js.map +1 -1
- package/dist/tools/writeFile.js +2 -1
- package/dist/tools/writeFile.js.map +1 -1
- package/package.json +78 -75
|
@@ -6,18 +6,19 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
6
6
|
* ⎿ - <a href="#" class="btn">
|
|
7
7
|
* + <a href="catalog.html" class="btn">
|
|
8
8
|
*
|
|
9
|
-
* The
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* output) or a one-line summary.
|
|
13
|
-
*
|
|
14
|
-
*
|
|
9
|
+
* The row appears while its tool is still working: the dot pulses and the verb is in the
|
|
10
|
+
* present tense ("Reading views.py"). When the result comes the dot goes still and the verb
|
|
11
|
+
* settles ("Read views.py"), with an indented `⎿` branch beneath holding the rich detail (an
|
|
12
|
+
* edit diff, a file preview, command output) or a one-line summary. A command shows the tail
|
|
13
|
+
* of its output while it runs. The dot is white, always: the pulse says working, stillness
|
|
14
|
+
* says done, and a failure says so in words.
|
|
15
15
|
*/
|
|
16
16
|
import { useEffect, useState } from "react";
|
|
17
17
|
import { Box, Text } from "ink";
|
|
18
|
-
import {
|
|
18
|
+
import { PulseDot } from "./PulseDot.js";
|
|
19
19
|
import { activeForm } from "../toolItems.js";
|
|
20
20
|
import { commandLabel } from "../commandLabel.js";
|
|
21
|
+
import { BAD, CODE, GOOD } from "../theme.js";
|
|
21
22
|
const DOT = "●";
|
|
22
23
|
const BRANCH = "⎿";
|
|
23
24
|
// The rail beside quoted machine output (a command's stdout). Distinct from BRANCH:
|
|
@@ -48,13 +49,13 @@ function lastOutcome(lines) {
|
|
|
48
49
|
}
|
|
49
50
|
export function ToolLine({ name, arg, status, action, summary, detail, detailKind, meta, columns, live, tightTop, since, waited, startedAt }) {
|
|
50
51
|
const errored = status === "error";
|
|
51
|
-
// "Updating(home.html)" while the
|
|
52
|
-
//
|
|
53
|
-
//
|
|
54
|
-
|
|
55
|
-
//
|
|
56
|
-
|
|
57
|
-
const
|
|
52
|
+
// "Updating(home.html)" while the tool works, "Update(home.html)" the moment it is done.
|
|
53
|
+
// `live` is false for a row from a turn that has ended (or a resumed session), which is
|
|
54
|
+
// done whatever its status says: an interrupted call never sent a result.
|
|
55
|
+
// An image handed to the model is still being worked on after the tool returns: the model is
|
|
56
|
+
// looking at it (`since` set, no total yet), so the row keeps its present tense and its pulse.
|
|
57
|
+
const working = !!live && (status === "running" || (since !== undefined && waited === undefined));
|
|
58
|
+
const verb = activeForm(name, working);
|
|
58
59
|
const metaRoom = meta ? meta.length + 1 : 0;
|
|
59
60
|
// The branch content: rich detail lines if present, else the one-line summary.
|
|
60
61
|
const rawLines = detail ? detail.split("\n") : summary ? [summary] : [];
|
|
@@ -101,7 +102,7 @@ export function ToolLine({ name, arg, status, action, summary, detail, detailKin
|
|
|
101
102
|
: arg.length > headerRoom
|
|
102
103
|
? "…" + arg.slice(-(headerRoom - 1))
|
|
103
104
|
: arg;
|
|
104
|
-
return (_jsxs(Box, { marginTop: tightTop ? 0 : 1, flexDirection: "column", children: [_jsxs(Box, { flexDirection: "row", width: columns, children: [_jsx(Box, { minWidth: 2, flexShrink: 0, children: _jsx(
|
|
105
|
+
return (_jsxs(Box, { marginTop: tightTop ? 0 : 1, flexDirection: "column", children: [_jsxs(Box, { flexDirection: "row", width: columns, children: [_jsx(Box, { minWidth: 2, flexShrink: 0, children: working ? _jsx(PulseDot, { glyph: DOT }) : _jsx(Text, { children: DOT }) }), _jsx(Box, { flexShrink: 0, children: _jsx(Text, { bold: true, children: verb }) }), shownArg ? (_jsx(Box, { flexShrink: 0, children: _jsxs(Text, { wrap: "truncate-end", children: ["(", shownArg, ")"] }) })) : null, meta ? (_jsx(Box, { flexShrink: 0, children: _jsxs(Text, { dimColor: true, wrap: "truncate-end", children: [" ", meta] }) })) : null, status === "running" && action === "run" && startedAt !== undefined ? (_jsx(Box, { flexShrink: 0, children: _jsx(Elapsed, { since: startedAt }) })) : null, live && since !== undefined ? (_jsx(Box, { flexShrink: 0, children: _jsx(Elapsed, { since: since }) })) : null, outcome ? (_jsx(Box, { flexShrink: 0, children: _jsxs(Text, { color: errored ? BAD : GOOD, bold: true, wrap: "truncate-end", children: [" ", outcome] }) })) : null] }), (status !== "running" || (working && detailKind === "shell")) && branchLines.length > 0 ? (detailKind === "shell" ? (_jsx(ShellLines, { lines: branchLines, columns: columns, errored: errored, headerHasCommand: !!arg })) : (_jsx(BranchLines, { lines: branchLines, columns: columns, errored: errored, diff: detailKind === "diff" }))) : null] }));
|
|
105
106
|
}
|
|
106
107
|
/** The indented `⎿` result block, one source line per row, diff-colored when the
|
|
107
108
|
* content is a real diff (`+ ` green, `- ` red; everything else dim).
|
|
@@ -113,7 +114,7 @@ export function ToolLine({ name, arg, status, action, summary, detail, detailKin
|
|
|
113
114
|
function BranchLines({ lines, columns, errored, diff, }) {
|
|
114
115
|
const content = Math.max(8, columns - BRANCH_INDENT - 1);
|
|
115
116
|
return (_jsx(Box, { flexDirection: "column", children: lines.map((line, i) => {
|
|
116
|
-
const style = errored ? { color:
|
|
117
|
+
const style = errored ? { color: BAD } : diff ? diffStyle(line) : undefined;
|
|
117
118
|
const dim = !errored && style === undefined;
|
|
118
119
|
// Padded to the full content width so the tint is a continuous band rather than
|
|
119
120
|
// stopping wherever the code happens to end, which reads as a ragged smear.
|
|
@@ -158,7 +159,7 @@ function ShellLines({ lines, columns, errored, headerHasCommand, }) {
|
|
|
158
159
|
// a block of output. It is the one line here the user WROTE, in effect,
|
|
159
160
|
// and it was previously distinguished only by being bold, which loses
|
|
160
161
|
// against a screenful of equally plain machine text.
|
|
161
|
-
_jsxs(Text, { wrap: "truncate-end", children: [_jsx(Text, {
|
|
162
|
+
_jsxs(Text, { wrap: "truncate-end", children: [_jsx(Text, { dimColor: true, children: "$ " }), _jsx(Text, { bold: true, color: CODE, children: line.slice(2) })] })) : (_jsx(Text, { color: outcome ? (line.startsWith("✓") ? GOOD : BAD) : errored ? BAD : undefined, dimColor: railed && !errored, bold: outcome, wrap: "truncate-end", children: line })) })] }, i));
|
|
162
163
|
}) }));
|
|
163
164
|
}
|
|
164
165
|
/**
|
|
@@ -177,9 +178,9 @@ const ADDED_BG = "#0d2818";
|
|
|
177
178
|
const REMOVED_BG = "#2d1113";
|
|
178
179
|
function diffStyle(line) {
|
|
179
180
|
if (line.startsWith("+"))
|
|
180
|
-
return { color:
|
|
181
|
+
return { color: GOOD, backgroundColor: ADDED_BG };
|
|
181
182
|
if (line.startsWith("-"))
|
|
182
|
-
return { color:
|
|
183
|
+
return { color: BAD, backgroundColor: REMOVED_BG };
|
|
183
184
|
return undefined;
|
|
184
185
|
}
|
|
185
186
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToolLine.js","sourceRoot":"","sources":["../../../src/cli/components/ToolLine.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"ToolLine.js","sourceRoot":"","sources":["../../../src/cli/components/ToolLine.tsx"],"names":[],"mappings":"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"}
|
|
@@ -15,6 +15,7 @@ import { Box, Text } from "ink";
|
|
|
15
15
|
import { useInput } from "ink";
|
|
16
16
|
import { useState } from "react";
|
|
17
17
|
import { FirstRunFrame } from "./FirstRunFrame.js";
|
|
18
|
+
import { ACCENT, WARN } from "../theme.js";
|
|
18
19
|
const CHOICES = ["Yes, work in this folder", "No, quit"];
|
|
19
20
|
export function TrustGate({ cwd, rows, breadth, warning, persists, version, docsUrl, onTrust, onQuit, active = true }) {
|
|
20
21
|
const [sel, setSel] = useState(0);
|
|
@@ -30,7 +31,7 @@ export function TrustGate({ cwd, rows, breadth, warning, persists, version, docs
|
|
|
30
31
|
else if (input === "2")
|
|
31
32
|
onQuit();
|
|
32
33
|
}, { isActive: active });
|
|
33
|
-
return (_jsxs(FirstRunFrame, { rows: rows, version: version, subtitle: "Work in this folder?", children: [_jsx(Box, { marginTop: 1, children: _jsx(Text, { bold: true, color:
|
|
34
|
+
return (_jsxs(FirstRunFrame, { rows: rows, version: version, subtitle: "Work in this folder?", children: [_jsx(Box, { marginTop: 1, children: _jsx(Text, { bold: true, color: ACCENT, children: cwd }) }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { children: "Mindweave will be able to read, change and run files here." }), _jsx(Text, { dimColor: true, children: "Open it somewhere you trust \u2014 your own project, your team's, or open source you know. If you are not sure what is in this folder, look before you say yes." })] }), warning ? (_jsx(Box, { marginTop: 1, children: _jsx(Text, { color: WARN, children: warning }) })) : null, _jsx(Box, { marginTop: 1, flexDirection: "column", children: CHOICES.map((label, i) => (_jsx(Box, { children: _jsxs(Text, { color: i === sel ? ACCENT : undefined, bold: i === sel, children: [i === sel ? " › " : " ", `[${i + 1}] ${label}`] }) }, label))) }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { dimColor: true, children: persists
|
|
34
35
|
? "Remembered for this folder — you won't be asked again."
|
|
35
36
|
: `Just for this session${breadth === "root" ? " (a whole drive is never remembered)" : " (your home directory is never remembered)"}.` }), _jsxs(Text, { dimColor: true, children: ["\u2191/\u2193 or 1-2 \u00B7 Enter to choose \u00B7 Esc to quit \u00B7 ", docsUrl] })] })] }));
|
|
36
37
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TrustGate.js","sourceRoot":"","sources":["../../../src/cli/components/TrustGate.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC/B,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"TrustGate.js","sourceRoot":"","sources":["../../../src/cli/components/TrustGate.tsx"],"names":[],"mappings":"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"}
|
|
@@ -16,6 +16,7 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
|
|
|
16
16
|
* "edit a key" and "disable a server."
|
|
17
17
|
*/
|
|
18
18
|
import { Box, Text } from "ink";
|
|
19
|
+
import { ACCENT } from "../theme.js";
|
|
19
20
|
/** Rows visible at once, for a caller with no real budget to pass. Every real caller gets
|
|
20
21
|
* its budget from the shared footer box instead — see `maxRows` on `MiniTabPanel`. */
|
|
21
22
|
export const MINITAB_WINDOW = 7;
|
|
@@ -65,7 +66,7 @@ export function MiniTabRow({ on, n, numWidth = 1, showNumber = true, left, leftC
|
|
|
65
66
|
// its usual share first, so a two-column row (a label plus a status) is unchanged.
|
|
66
67
|
const leftWidth = right === undefined ? Math.max(4, inner - prefixWidth - midWidth) : mid === undefined ? 24 : 10;
|
|
67
68
|
const rightWidth = Math.max(4, inner - prefixWidth - leftWidth - midWidth);
|
|
68
|
-
const labelColor = leftColor ?? (on ?
|
|
69
|
-
return (_jsxs(Box, { flexShrink: 0, width: inner, children: [_jsxs(Text, { color: on ?
|
|
69
|
+
const labelColor = leftColor ?? (on ? ACCENT : undefined);
|
|
70
|
+
return (_jsxs(Box, { flexShrink: 0, width: inner, children: [_jsxs(Text, { color: on ? ACCENT : undefined, bold: on, children: [on ? " › " : " ", showNumber ? `${String(n).padStart(numWidth)} ` : ""] }), _jsx(Box, { width: leftWidth, children: _jsx(Text, { color: labelColor, dimColor: leftDim === true && !on, bold: on, wrap: "truncate-end", children: left }) }), mid === undefined ? null : (_jsx(Box, { width: midWidth, children: _jsx(Text, { dimColor: true, wrap: "truncate-end", children: mid }) })), right ? (_jsx(Box, { width: rightWidth, flexShrink: 0, children: _jsx(Text, { color: rightColor, dimColor: !rightColor, wrap: "truncate-end", children: right }) })) : null] }));
|
|
70
71
|
}
|
|
71
72
|
//# sourceMappingURL=minitabs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"minitabs.js","sourceRoot":"","sources":["../../../src/cli/components/minitabs.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"minitabs.js","sourceRoot":"","sources":["../../../src/cli/components/minitabs.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* desktopApp.ts — the pointer from the terminal to the desktop app.
|
|
3
|
+
*
|
|
4
|
+
* The line shown when a session starts, the text of the /app screen, and the one thing that screen
|
|
5
|
+
* does: open the download page in the user's own browser. The browser is the right place for it, because
|
|
6
|
+
* that page says which file to take and what each system will ask before it opens the app, and a
|
|
7
|
+
* terminal cannot download an installer for them.
|
|
8
|
+
*/
|
|
9
|
+
import { spawn } from "node:child_process";
|
|
10
|
+
/** The home page, where the download buttons are. */
|
|
11
|
+
export const APP_PAGE_URL = "https://mindweavedev.netlify.app/";
|
|
12
|
+
/** The one line shown at the start of every session. */
|
|
13
|
+
export function appAnnouncement() {
|
|
14
|
+
return "The Mindweave desktop app is out for Windows, macOS and Linux. Run /app to get it. It is free and open source.";
|
|
15
|
+
}
|
|
16
|
+
/** What the /app screen says above its single choice. */
|
|
17
|
+
export const APP_EXPLANATION = "The desktop app is out for Windows, macOS and Linux. It is free and open source, and it includes " +
|
|
18
|
+
"this command line, so one download gives you both. Enter opens the download page in your browser.";
|
|
19
|
+
/** The command that opens a link in the default browser, for each system. */
|
|
20
|
+
export function browserCommand(platform, url) {
|
|
21
|
+
if (platform === "win32")
|
|
22
|
+
return { cmd: "cmd", args: ["/c", "start", "", url] };
|
|
23
|
+
if (platform === "darwin")
|
|
24
|
+
return { cmd: "open", args: [url] };
|
|
25
|
+
return { cmd: "xdg-open", args: [url] };
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Open a link in the default browser. Never throws: a machine with no browser (a server over SSH)
|
|
29
|
+
* gets `false` and the caller prints the address instead. Only https links are ever opened.
|
|
30
|
+
*/
|
|
31
|
+
export function openInBrowser(url, platform = process.platform, spawnFn = spawn) {
|
|
32
|
+
if (!/^https:\/\//.test(url))
|
|
33
|
+
return false;
|
|
34
|
+
try {
|
|
35
|
+
const { cmd, args } = browserCommand(platform, url);
|
|
36
|
+
const child = spawnFn(cmd, args, { detached: true, stdio: "ignore", windowsHide: true });
|
|
37
|
+
child.on("error", () => { });
|
|
38
|
+
child.unref();
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=desktopApp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"desktopApp.js","sourceRoot":"","sources":["../../src/cli/desktopApp.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,qDAAqD;AACrD,MAAM,CAAC,MAAM,YAAY,GAAG,mCAAmC,CAAC;AAEhE,wDAAwD;AACxD,MAAM,UAAU,eAAe;IAC7B,OAAO,gHAAgH,CAAC;AAC1H,CAAC;AAED,yDAAyD;AACzD,MAAM,CAAC,MAAM,eAAe,GAC1B,mGAAmG;IACnG,mGAAmG,CAAC;AAItG,6EAA6E;AAC7E,MAAM,UAAU,cAAc,CAAC,QAAyB,EAAE,GAAW;IACnE,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC;IAChF,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;IAC/D,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;AAC1C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,GAAW,EAAE,WAA4B,OAAO,CAAC,QAAQ,EAAE,UAAiB,KAAK;IAC7G,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3C,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,cAAc,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACpD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QACzF,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC5B,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
package/dist/cli/help.js
CHANGED
|
@@ -34,6 +34,7 @@ export function formatHelp(sections) {
|
|
|
34
34
|
"Also\n" +
|
|
35
35
|
" @path attach a file to your message (Tab completes the path)\n" +
|
|
36
36
|
" Esc stop what's running\n" +
|
|
37
|
+
" Esc Esc on an empty box, rewind to an earlier message\n" +
|
|
37
38
|
// The input stays live while a turn runs and the placeholder says so, so
|
|
38
39
|
// QUEUEING is discoverable. Getting back OUT of the queue is not: nothing on
|
|
39
40
|
// screen mentions it until something is already queued, and by then a user who
|
package/dist/cli/help.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/cli/help.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAaH,wEAAwE;AACxE,SAAS,MAAM,CAAC,QAAgC;IAC9C,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;AAClE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,QAAgC;IACzD,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC3D,0EAA0E;IAC1E,mDAAmD;IACnD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAE3D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC5B,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QAClF,OAAO,GAAG,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,GAAG,MAAM;QACT,8EAA8E;QAC9E,oEAAoE;QACpE,QAAQ;YACN,8EAA8E;YAC9E,2CAA2C;YAC3C,yEAAyE;YACzE,6EAA6E;YAC7E,+EAA+E;YAC/E,2EAA2E;YAC3E,yEAAyE;QAC3E,8EAA8E;QAC9E,gFAAgF;QAChF,iFAAiF;QACjF,qEAAqE;QACrE,oBAAoB;YAClB,+EAA+E;YAC/E,oFAAoF;YACpF,mFAAmF;YACnF,mFAAmF;YACnF,oFAAoF;YACpF,4EAA4E;KAC/E,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACjB,CAAC"}
|
|
1
|
+
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/cli/help.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAaH,wEAAwE;AACxE,SAAS,MAAM,CAAC,QAAgC;IAC9C,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;AAClE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,QAAgC;IACzD,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC3D,0EAA0E;IAC1E,mDAAmD;IACnD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAE3D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC5B,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QAClF,OAAO,GAAG,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,GAAG,MAAM;QACT,8EAA8E;QAC9E,oEAAoE;QACpE,QAAQ;YACN,8EAA8E;YAC9E,2CAA2C;YAC3C,qEAAqE;YACrE,yEAAyE;YACzE,6EAA6E;YAC7E,+EAA+E;YAC/E,2EAA2E;YAC3E,yEAAyE;QAC3E,8EAA8E;QAC9E,gFAAgF;QAChF,iFAAiF;QACjF,qEAAqE;QACrE,oBAAoB;YAClB,+EAA+E;YAC/E,oFAAoF;YACpF,mFAAmF;YACnF,mFAAmF;YACnF,oFAAoF;YACpF,4EAA4E;KAC/E,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* inkOutputPatch.ts — a faster `Output` for Ink, applied to the stock one only when it is
|
|
3
|
+
* exactly the one this was written against.
|
|
4
|
+
*
|
|
5
|
+
* ## What was slow
|
|
6
|
+
*
|
|
7
|
+
* Every frame, Ink turns its layout tree into text in `ink/build/output.js`. That class is built
|
|
8
|
+
* fresh for each frame, so its caches (widths, tokenised lines) lived for one frame and were
|
|
9
|
+
* thrown away, and it then painted EVERY cell of the screen as an object, built each row's string
|
|
10
|
+
* from those cells, and let the garbage collector clean up ten thousand objects. On a 200x50
|
|
11
|
+
* window with a long transcript, profiled in a real terminal, that was about 60% of all the CPU
|
|
12
|
+
* the app used while scrolling, and the garbage collector alone took more than the whole of our
|
|
13
|
+
* own code. Scrolling reached about 80 frames a second.
|
|
14
|
+
*
|
|
15
|
+
* ## What this does instead
|
|
16
|
+
*
|
|
17
|
+
* Rows do not influence one another: a row is a pure function of the lines written into it, in
|
|
18
|
+
* order. So the patched `get()` collects what each row was written, and looks the row up by that
|
|
19
|
+
* list in a cache that survives between frames. A row that has been drawn before (which is nearly
|
|
20
|
+
* every row of a scroll, since the same lines just move) costs one lookup instead of a paint, and
|
|
21
|
+
* the cells are only built for rows never seen. The width, tokenising and slicing caches also
|
|
22
|
+
* outlive the frame. Measured in the same terminal: scroll at 100 frames a second, with 3.6x less
|
|
23
|
+
* CPU and the garbage collector's share down from 2s to 0.2s.
|
|
24
|
+
*
|
|
25
|
+
* ## Why it is applied this way, and why it can be trusted
|
|
26
|
+
*
|
|
27
|
+
* It is a replacement for the text of one internal module, installed by a loader hook (see
|
|
28
|
+
* inkSpeedLoader.ts) at load time, and only when the stock file's hash is one of
|
|
29
|
+
* `KNOWN_ORIGINALS`. A different Ink changes nothing: the stock renderer runs, a little slower.
|
|
30
|
+
* `inkOutputPatch.test.ts` renders random write sequences through both the stock class and this
|
|
31
|
+
* one and requires byte-identical output, so a new Ink version is caught there rather than on
|
|
32
|
+
* a screen.
|
|
33
|
+
*
|
|
34
|
+
* Set `MINDWEAVE_NO_INK_PATCH=1` to run the stock renderer.
|
|
35
|
+
*/
|
|
36
|
+
import { createHash } from "node:crypto";
|
|
37
|
+
/** SHA-256 of the `ink/build/output.js` this replaces (Ink 7.1.1). */
|
|
38
|
+
export const KNOWN_ORIGINALS = ["54d62805875cc0644787f19038ac6adbd3a01aca367c048ec94f8822485fd2cf"];
|
|
39
|
+
/** The replacement module text. Plain JavaScript, resolved from Ink's own folder, so its imports find the same packages the stock file does. */
|
|
40
|
+
export const PATCHED_OUTPUT = String.raw `import sliceAnsi from 'slice-ansi';
|
|
41
|
+
import stringWidth from 'string-width';
|
|
42
|
+
import { styledCharsFromTokens, styledCharsToString, tokenize, } from '@alcalzone/ansi-tokenize';
|
|
43
|
+
// MINDWEAVE-PATCHED: caches live across frames, and each finished row is remembered by what was
|
|
44
|
+
// written into it, so a frame that only moves or repeats rows reuses their strings.
|
|
45
|
+
const CAP = 6000;
|
|
46
|
+
function remember(map, key, value) {
|
|
47
|
+
if (map.size >= CAP) {
|
|
48
|
+
map.clear();
|
|
49
|
+
}
|
|
50
|
+
map.set(key, value);
|
|
51
|
+
return value;
|
|
52
|
+
}
|
|
53
|
+
class OutputCaches {
|
|
54
|
+
widths = new Map();
|
|
55
|
+
blockWidths = new Map();
|
|
56
|
+
styledChars = new Map();
|
|
57
|
+
slices = new Map();
|
|
58
|
+
getStyledChars(line) {
|
|
59
|
+
let cached = this.styledChars.get(line);
|
|
60
|
+
if (cached === undefined) {
|
|
61
|
+
cached = remember(this.styledChars, line, styledCharsFromTokens(tokenize(line)));
|
|
62
|
+
}
|
|
63
|
+
return cached;
|
|
64
|
+
}
|
|
65
|
+
getStringWidth(text) {
|
|
66
|
+
let cached = this.widths.get(text);
|
|
67
|
+
if (cached === undefined) {
|
|
68
|
+
cached = remember(this.widths, text, stringWidth(text));
|
|
69
|
+
}
|
|
70
|
+
return cached;
|
|
71
|
+
}
|
|
72
|
+
getWidestLine(text) {
|
|
73
|
+
let cached = this.blockWidths.get(text);
|
|
74
|
+
if (cached === undefined) {
|
|
75
|
+
let lineWidth = 0;
|
|
76
|
+
for (const line of text.split('\n')) {
|
|
77
|
+
lineWidth = Math.max(lineWidth, this.getStringWidth(line));
|
|
78
|
+
}
|
|
79
|
+
cached = remember(this.blockWidths, text, lineWidth);
|
|
80
|
+
}
|
|
81
|
+
return cached;
|
|
82
|
+
}
|
|
83
|
+
getSlice(line, from, to) {
|
|
84
|
+
const key = from + '\u0001' + to + '\u0001' + line;
|
|
85
|
+
let cached = this.slices.get(key);
|
|
86
|
+
if (cached === undefined) {
|
|
87
|
+
cached = remember(this.slices, key, sliceAnsi(line, from, to));
|
|
88
|
+
}
|
|
89
|
+
return cached;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
const SHARED_CACHES = new OutputCaches();
|
|
93
|
+
const ROWS = new Map();
|
|
94
|
+
export default class Output {
|
|
95
|
+
width;
|
|
96
|
+
height;
|
|
97
|
+
operations = [];
|
|
98
|
+
caches = SHARED_CACHES;
|
|
99
|
+
constructor(options) {
|
|
100
|
+
const { width, height } = options;
|
|
101
|
+
this.width = width;
|
|
102
|
+
this.height = height;
|
|
103
|
+
}
|
|
104
|
+
write(x, y, text, options) {
|
|
105
|
+
const { transformers } = options;
|
|
106
|
+
if (!text) {
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
this.operations.push({
|
|
110
|
+
type: 'write',
|
|
111
|
+
x,
|
|
112
|
+
y,
|
|
113
|
+
text,
|
|
114
|
+
transformers,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
clip(clip) {
|
|
118
|
+
this.operations.push({
|
|
119
|
+
type: 'clip',
|
|
120
|
+
clip,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
unclip() {
|
|
124
|
+
this.operations.push({
|
|
125
|
+
type: 'unclip',
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
// One finished row from what was written into it: [x, line, x, line, ...] in write order.
|
|
129
|
+
paintRow(records) {
|
|
130
|
+
const width = this.width;
|
|
131
|
+
const spaceCell = {
|
|
132
|
+
type: 'char',
|
|
133
|
+
value: ' ',
|
|
134
|
+
fullWidth: false,
|
|
135
|
+
styles: [],
|
|
136
|
+
};
|
|
137
|
+
const currentLine = new Array(width);
|
|
138
|
+
for (let x = 0; x < width; x++) {
|
|
139
|
+
currentLine[x] = spaceCell;
|
|
140
|
+
}
|
|
141
|
+
for (let r = 0; r < records.length; r += 2) {
|
|
142
|
+
const x = records[r];
|
|
143
|
+
const line = records[r + 1];
|
|
144
|
+
const characters = this.caches.getStyledChars(line);
|
|
145
|
+
let offsetX = x;
|
|
146
|
+
// Nothing to write (e.g. line was clipped away).
|
|
147
|
+
if (characters.length === 0) {
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
// Wide characters (e.g. CJK) occupy two cells: a leading
|
|
151
|
+
// cell with the character and a trailing placeholder with
|
|
152
|
+
// value ''. When an overlapping write lands in the middle
|
|
153
|
+
// of a wide character, the boundary cells need cleanup so
|
|
154
|
+
// the terminal never renders a half-visible wide character.
|
|
155
|
+
if (currentLine[offsetX]?.value === '' &&
|
|
156
|
+
offsetX > 0 &&
|
|
157
|
+
this.caches.getStringWidth(currentLine[offsetX - 1]?.value ?? '') >
|
|
158
|
+
1) {
|
|
159
|
+
currentLine[offsetX - 1] = spaceCell;
|
|
160
|
+
}
|
|
161
|
+
for (const character of characters) {
|
|
162
|
+
currentLine[offsetX] = character;
|
|
163
|
+
// Determine printed width using string-width to align with measurement
|
|
164
|
+
const characterWidth = Math.max(1, this.caches.getStringWidth(character.value));
|
|
165
|
+
// For multi-column characters, clear following cells to avoid stray spaces/artifacts
|
|
166
|
+
if (characterWidth > 1) {
|
|
167
|
+
for (let index = 1; index < characterWidth; index++) {
|
|
168
|
+
currentLine[offsetX + index] = {
|
|
169
|
+
type: 'char',
|
|
170
|
+
value: '',
|
|
171
|
+
fullWidth: false,
|
|
172
|
+
styles: character.styles,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
offsetX += characterWidth;
|
|
177
|
+
}
|
|
178
|
+
if (currentLine[offsetX]?.value === '') {
|
|
179
|
+
currentLine[offsetX] = spaceCell;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
// See https://github.com/vadimdemedes/ink/pull/564#issuecomment-1637022742
|
|
183
|
+
const lineWithoutEmptyItems = currentLine.filter(item => item !== undefined);
|
|
184
|
+
return styledCharsToString(lineWithoutEmptyItems).trimEnd();
|
|
185
|
+
}
|
|
186
|
+
get() {
|
|
187
|
+
// Every row's writes, in order. Rows do not influence one another, so a row is a pure
|
|
188
|
+
// function of its own list.
|
|
189
|
+
const rows = new Array(this.height);
|
|
190
|
+
const clips = [];
|
|
191
|
+
for (const operation of this.operations) {
|
|
192
|
+
if (operation.type === 'clip') {
|
|
193
|
+
clips.push(operation.clip);
|
|
194
|
+
}
|
|
195
|
+
if (operation.type === 'unclip') {
|
|
196
|
+
clips.pop();
|
|
197
|
+
}
|
|
198
|
+
if (operation.type === 'write') {
|
|
199
|
+
const { text, transformers } = operation;
|
|
200
|
+
let { x, y } = operation;
|
|
201
|
+
let lines = text.split('\n');
|
|
202
|
+
const clip = clips.at(-1);
|
|
203
|
+
if (clip) {
|
|
204
|
+
const clipHorizontally = typeof clip?.x1 === 'number' && typeof clip?.x2 === 'number';
|
|
205
|
+
const clipVertically = typeof clip?.y1 === 'number' && typeof clip?.y2 === 'number';
|
|
206
|
+
// If text is positioned outside of clipping area altogether,
|
|
207
|
+
// skip to the next operation to avoid unnecessary calculations
|
|
208
|
+
if (clipHorizontally) {
|
|
209
|
+
const width = this.caches.getWidestLine(text);
|
|
210
|
+
if (x + width < clip.x1 || x > clip.x2) {
|
|
211
|
+
continue;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
if (clipVertically) {
|
|
215
|
+
const height = lines.length;
|
|
216
|
+
if (y + height < clip.y1 || y > clip.y2) {
|
|
217
|
+
continue;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
if (clipHorizontally) {
|
|
221
|
+
lines = lines.map(line => {
|
|
222
|
+
const from = x < clip.x1 ? clip.x1 - x : 0;
|
|
223
|
+
const width = this.caches.getStringWidth(line);
|
|
224
|
+
const to = x + width > clip.x2 ? clip.x2 - x : width;
|
|
225
|
+
return this.caches.getSlice(line, from, to);
|
|
226
|
+
});
|
|
227
|
+
if (x < clip.x1) {
|
|
228
|
+
x = clip.x1;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
if (clipVertically) {
|
|
232
|
+
const from = y < clip.y1 ? clip.y1 - y : 0;
|
|
233
|
+
const height = lines.length;
|
|
234
|
+
const to = y + height > clip.y2 ? clip.y2 - y : height;
|
|
235
|
+
lines = lines.slice(from, to);
|
|
236
|
+
if (y < clip.y1) {
|
|
237
|
+
y = clip.y1;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
let offsetY = 0;
|
|
242
|
+
for (let [index, line] of lines.entries()) {
|
|
243
|
+
const row = y + offsetY;
|
|
244
|
+
// Line can be missing if the text is taller than height of pre-initialized rows
|
|
245
|
+
if (row < 0 || row >= this.height) {
|
|
246
|
+
continue;
|
|
247
|
+
}
|
|
248
|
+
for (const transformer of transformers) {
|
|
249
|
+
line = transformer(line, index);
|
|
250
|
+
}
|
|
251
|
+
(rows[row] ??= []).push(x, line);
|
|
252
|
+
offsetY++;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
const out = new Array(this.height);
|
|
257
|
+
const w = this.width;
|
|
258
|
+
for (let y = 0; y < this.height; y++) {
|
|
259
|
+
const records = rows[y];
|
|
260
|
+
if (records === undefined) {
|
|
261
|
+
out[y] = '';
|
|
262
|
+
continue;
|
|
263
|
+
}
|
|
264
|
+
const key = w + '\u0002' + records.join('\u0001');
|
|
265
|
+
let line = ROWS.get(key);
|
|
266
|
+
if (line === undefined) {
|
|
267
|
+
line = remember(ROWS, key, this.paintRow(records));
|
|
268
|
+
}
|
|
269
|
+
out[y] = line;
|
|
270
|
+
}
|
|
271
|
+
return {
|
|
272
|
+
output: out.join('\n'),
|
|
273
|
+
height: out.length,
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
`;
|
|
278
|
+
/** The patched text when `source` is a stock file this knows how to replace, else null. */
|
|
279
|
+
export function patchInkOutput(source) {
|
|
280
|
+
if (process.env["MINDWEAVE_NO_INK_PATCH"] === "1")
|
|
281
|
+
return null;
|
|
282
|
+
const hash = createHash("sha256").update(source).digest("hex");
|
|
283
|
+
return KNOWN_ORIGINALS.includes(hash) ? PATCHED_OUTPUT : null;
|
|
284
|
+
}
|
|
285
|
+
//# sourceMappingURL=inkOutputPatch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inkOutputPatch.js","sourceRoot":"","sources":["../../src/cli/inkOutputPatch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,sEAAsE;AACtE,MAAM,CAAC,MAAM,eAAe,GAAsB,CAAC,kEAAkE,CAAC,CAAC;AAEvH,gJAAgJ;AAChJ,MAAM,CAAC,MAAM,cAAc,GAAW,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6O/C,CAAC;AAEF,2FAA2F;AAC3F,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,IAAI,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IAC/D,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/D,OAAO,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC;AAChE,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* inkSpeed.ts — install the faster Ink renderer before Ink is loaded.
|
|
3
|
+
*
|
|
4
|
+
* A load hook only sees modules loaded AFTER it is registered, and ES imports are all loaded
|
|
5
|
+
* before any module runs. So the entry point (index.ts) registers this first and only then
|
|
6
|
+
* imports the application with `await import()`. If registering fails for any reason the app
|
|
7
|
+
* simply runs on the stock renderer.
|
|
8
|
+
*
|
|
9
|
+
* `module.registerHooks` runs the hook in the main thread, synchronously. The older
|
|
10
|
+
* `module.register` runs it on a separate thread, and every module load then waits on a round
|
|
11
|
+
* trip to that thread: about 700ms of startup, measured. `register` is only the fallback.
|
|
12
|
+
*/
|
|
13
|
+
import * as nodeModule from "node:module";
|
|
14
|
+
import { load, loadSync } from "./inkSpeedLoader.js";
|
|
15
|
+
export function registerInkSpeedups() {
|
|
16
|
+
try {
|
|
17
|
+
const registerHooks = nodeModule.registerHooks;
|
|
18
|
+
if (typeof registerHooks === "function") {
|
|
19
|
+
registerHooks({ load: loadSync });
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
void load; // the fallback below loads the same file as a loader-thread module
|
|
23
|
+
nodeModule.register("./inkSpeedLoader.js", import.meta.url);
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
// Not available here: the stock renderer is fine.
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=inkSpeed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inkSpeed.js","sourceRoot":"","sources":["../../src/cli/inkSpeed.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,UAAU,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAIrD,MAAM,UAAU,mBAAmB;IACjC,IAAI,CAAC;QACH,MAAM,aAAa,GAAI,UAA2D,CAAC,aAAa,CAAC;QACjG,IAAI,OAAO,aAAa,KAAK,UAAU,EAAE,CAAC;YACxC,aAAa,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;YAClC,OAAO;QACT,CAAC;QACD,KAAK,IAAI,CAAC,CAAC,mEAAmE;QAC9E,UAAU,CAAC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9D,CAAC;IAAC,MAAM,CAAC;QACP,kDAAkD;IACpD,CAAC;AACH,CAAC"}
|