desic-okx-agent 0.2.0 → 0.3.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.en.md +353 -0
- package/README.md +194 -190
- package/dist/account/private-websocket.js +4 -4
- package/dist/account/private-websocket.js.map +1 -1
- package/dist/account/service.d.ts +12 -1
- package/dist/account/service.js +18 -0
- package/dist/account/service.js.map +1 -1
- package/dist/bars/rate-limiter.d.ts +18 -0
- package/dist/bars/rate-limiter.js +84 -0
- package/dist/bars/rate-limiter.js.map +1 -0
- package/dist/bars/schema.d.ts +36 -0
- package/dist/bars/schema.js +134 -0
- package/dist/bars/schema.js.map +1 -0
- package/dist/bars/service.d.ts +60 -0
- package/dist/bars/service.js +120 -0
- package/dist/bars/service.js.map +1 -0
- package/dist/bars/store.d.ts +105 -0
- package/dist/bars/store.js +415 -0
- package/dist/bars/store.js.map +1 -0
- package/dist/bars/timeframe.d.ts +40 -0
- package/dist/bars/timeframe.js +146 -0
- package/dist/bars/timeframe.js.map +1 -0
- package/dist/bars/types.d.ts +68 -0
- package/dist/bars/types.js +13 -0
- package/dist/bars/types.js.map +1 -0
- package/dist/cli/data-render.d.ts +37 -0
- package/dist/cli/data-render.js +143 -0
- package/dist/cli/data-render.js.map +1 -0
- package/dist/cli/doctor.js +7 -3
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/index.js +758 -27
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/live-render.d.ts +24 -0
- package/dist/cli/live-render.js +85 -0
- package/dist/cli/live-render.js.map +1 -0
- package/dist/cli/range.d.ts +28 -0
- package/dist/cli/range.js +63 -0
- package/dist/cli/range.js.map +1 -0
- package/dist/cli/render.js +3 -0
- package/dist/cli/render.js.map +1 -1
- package/dist/cli/strategy-render.d.ts +36 -0
- package/dist/cli/strategy-render.js +391 -0
- package/dist/cli/strategy-render.js.map +1 -0
- package/dist/cli/width.d.ts +18 -0
- package/dist/cli/width.js +71 -0
- package/dist/cli/width.js.map +1 -0
- package/dist/config/loader.js +1 -1
- package/dist/config/schema.d.ts +7 -0
- package/dist/config/schema.js +24 -0
- package/dist/config/schema.js.map +1 -1
- package/dist/core/okx-client.d.ts +9 -1
- package/dist/core/okx-client.js +14 -5
- package/dist/core/okx-client.js.map +1 -1
- package/dist/i18n/locale.d.ts +24 -0
- package/dist/i18n/locale.js +65 -0
- package/dist/i18n/locale.js.map +1 -0
- package/dist/i18n/messages.d.ts +333 -0
- package/dist/i18n/messages.js +660 -0
- package/dist/i18n/messages.js.map +1 -0
- package/dist/live/account-snapshot.d.ts +30 -0
- package/dist/live/account-snapshot.js +130 -0
- package/dist/live/account-snapshot.js.map +1 -0
- package/dist/live/cutoff-queue.d.ts +42 -0
- package/dist/live/cutoff-queue.js +69 -0
- package/dist/live/cutoff-queue.js.map +1 -0
- package/dist/live/execution-key.d.ts +23 -0
- package/dist/live/execution-key.js +31 -0
- package/dist/live/execution-key.js.map +1 -0
- package/dist/live/failures.d.ts +37 -0
- package/dist/live/failures.js +57 -0
- package/dist/live/failures.js.map +1 -0
- package/dist/live/gates.d.ts +65 -0
- package/dist/live/gates.js +136 -0
- package/dist/live/gates.js.map +1 -0
- package/dist/live/loop.d.ts +56 -0
- package/dist/live/loop.js +197 -0
- package/dist/live/loop.js.map +1 -0
- package/dist/live/preconditions.d.ts +48 -0
- package/dist/live/preconditions.js +69 -0
- package/dist/live/preconditions.js.map +1 -0
- package/dist/live/reconcile.d.ts +46 -0
- package/dist/live/reconcile.js +104 -0
- package/dist/live/reconcile.js.map +1 -0
- package/dist/live/runner.d.ts +57 -0
- package/dist/live/runner.js +160 -0
- package/dist/live/runner.js.map +1 -0
- package/dist/live/schema.d.ts +18 -0
- package/dist/live/schema.js +91 -0
- package/dist/live/schema.js.map +1 -0
- package/dist/live/service.d.ts +144 -0
- package/dist/live/service.js +303 -0
- package/dist/live/service.js.map +1 -0
- package/dist/live/session.d.ts +85 -0
- package/dist/live/session.js +234 -0
- package/dist/live/session.js.map +1 -0
- package/dist/live/sizing.d.ts +62 -0
- package/dist/live/sizing.js +79 -0
- package/dist/live/sizing.js.map +1 -0
- package/dist/live/store.d.ts +123 -0
- package/dist/live/store.js +350 -0
- package/dist/live/store.js.map +1 -0
- package/dist/live/types.d.ts +82 -0
- package/dist/live/types.js +2 -0
- package/dist/live/types.js.map +1 -0
- package/dist/market/websocket.d.ts +16 -1
- package/dist/market/websocket.js +60 -5
- package/dist/market/websocket.js.map +1 -1
- package/dist/mcp/server.d.ts +1 -0
- package/dist/mcp/server.js +15 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/network/connectivity.d.ts +9 -1
- package/dist/network/connectivity.js +28 -1
- package/dist/network/connectivity.js.map +1 -1
- package/dist/report/chart-script.d.ts +12 -0
- package/dist/report/chart-script.js +146 -0
- package/dist/report/chart-script.js.map +1 -0
- package/dist/report/compare-html.d.ts +8 -0
- package/dist/report/compare-html.js +254 -0
- package/dist/report/compare-html.js.map +1 -0
- package/dist/report/compare-script.d.ts +12 -0
- package/dist/report/compare-script.js +109 -0
- package/dist/report/compare-script.js.map +1 -0
- package/dist/report/compare.d.ts +61 -0
- package/dist/report/compare.js +205 -0
- package/dist/report/compare.js.map +1 -0
- package/dist/report/fetch.d.ts +20 -0
- package/dist/report/fetch.js +56 -0
- package/dist/report/fetch.js.map +1 -0
- package/dist/report/html.d.ts +54 -0
- package/dist/report/html.js +641 -0
- package/dist/report/html.js.map +1 -0
- package/dist/report/open.d.ts +42 -0
- package/dist/report/open.js +114 -0
- package/dist/report/open.js.map +1 -0
- package/dist/runtime/server.d.ts +16 -1
- package/dist/runtime/server.js +112 -9
- package/dist/runtime/server.js.map +1 -1
- package/dist/setup/installer.d.ts +1 -0
- package/dist/setup/installer.js +8 -0
- package/dist/setup/installer.js.map +1 -1
- package/dist/setup/wizard.d.ts +3 -0
- package/dist/setup/wizard.js +131 -6
- package/dist/setup/wizard.js.map +1 -1
- package/dist/strategy/constants.d.ts +23 -0
- package/dist/strategy/constants.js +24 -0
- package/dist/strategy/constants.js.map +1 -0
- package/dist/strategy/environment.d.ts +52 -0
- package/dist/strategy/environment.js +187 -0
- package/dist/strategy/environment.js.map +1 -0
- package/dist/strategy/instrument.d.ts +29 -0
- package/dist/strategy/instrument.js +39 -0
- package/dist/strategy/instrument.js.map +1 -0
- package/dist/strategy/optimize.d.ts +73 -0
- package/dist/strategy/optimize.js +113 -0
- package/dist/strategy/optimize.js.map +1 -0
- package/dist/strategy/parameter-space.d.ts +59 -0
- package/dist/strategy/parameter-space.js +221 -0
- package/dist/strategy/parameter-space.js.map +1 -0
- package/dist/strategy/python-bridge.d.ts +24 -0
- package/dist/strategy/python-bridge.js +114 -0
- package/dist/strategy/python-bridge.js.map +1 -0
- package/dist/strategy/schema.d.ts +9 -0
- package/dist/strategy/schema.js +91 -0
- package/dist/strategy/schema.js.map +1 -0
- package/dist/strategy/service.d.ts +138 -0
- package/dist/strategy/service.js +745 -0
- package/dist/strategy/service.js.map +1 -0
- package/dist/strategy/settings.d.ts +162 -0
- package/dist/strategy/settings.js +243 -0
- package/dist/strategy/settings.js.map +1 -0
- package/dist/strategy/store.d.ts +96 -0
- package/dist/strategy/store.js +367 -0
- package/dist/strategy/store.js.map +1 -0
- package/dist/strategy/templates.d.ts +11 -0
- package/dist/strategy/templates.js +134 -0
- package/dist/strategy/templates.js.map +1 -0
- package/dist/strategy/types.d.ts +111 -0
- package/dist/strategy/types.js +2 -0
- package/dist/strategy/types.js.map +1 -0
- package/dist/tools/catalog.d.ts +16 -0
- package/dist/tools/catalog.js +118 -17
- package/dist/tools/catalog.js.map +1 -1
- package/dist/trade/service.d.ts +12 -0
- package/dist/trade/service.js +24 -7
- package/dist/trade/service.js.map +1 -1
- package/dist/tui/app.d.ts +23 -0
- package/dist/tui/app.js +322 -0
- package/dist/tui/app.js.map +1 -0
- package/dist/tui/commands.d.ts +70 -0
- package/dist/tui/commands.js +313 -0
- package/dist/tui/commands.js.map +1 -0
- package/dist/tui/entries.d.ts +17 -0
- package/dist/tui/entries.js +24 -0
- package/dist/tui/entries.js.map +1 -0
- package/dist/tui/execute.d.ts +26 -0
- package/dist/tui/execute.js +664 -0
- package/dist/tui/execute.js.map +1 -0
- package/dist/tui/history.d.ts +17 -0
- package/dist/tui/history.js +48 -0
- package/dist/tui/history.js.map +1 -0
- package/dist/tui/index.d.ts +8 -0
- package/dist/tui/index.js +48 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/tui/line-editor.d.ts +44 -0
- package/dist/tui/line-editor.js +98 -0
- package/dist/tui/line-editor.js.map +1 -0
- package/dist/tui/progress.d.ts +23 -0
- package/dist/tui/progress.js +46 -0
- package/dist/tui/progress.js.map +1 -0
- package/dist/tui/settings-editor.d.ts +18 -0
- package/dist/tui/settings-editor.js +115 -0
- package/dist/tui/settings-editor.js.map +1 -0
- package/docs/live-trading.md +455 -0
- package/docs/strategy-research.md +597 -0
- package/package.json +11 -1
- package/python/desic_strategy/__init__.py +34 -0
- package/python/desic_strategy/actions.py +158 -0
- package/python/desic_strategy/context.py +164 -0
- package/python/desic_strategy/engine.py +614 -0
- package/python/desic_strategy/indicators.py +159 -0
- package/python/desic_strategy/live.py +253 -0
- package/python/desic_strategy/policy.py +193 -0
- package/python/desic_strategy/portfolio.py +152 -0
- package/python/desic_strategy/report.py +319 -0
- package/python/desic_strategy/runner.py +574 -0
- package/python/desic_strategy/timeframe.py +150 -0
- package/python/main.py +18 -0
- package/skills/okx-live-trading/SKILL.md +117 -0
- package/skills/okx-live-trading/agents/openai.yaml +9 -0
- package/skills/okx-live-trading/references/lifecycle.md +128 -0
- package/skills/okx-strategy-research/SKILL.md +113 -0
- package/skills/okx-strategy-research/agents/openai.yaml +9 -0
- package/skills/okx-strategy-research/references/execution-semantics.md +107 -0
- package/skills/okx-strategy-research/references/field-traps.md +142 -0
- package/skills/okx-strategy-research/references/python-api.md +121 -0
- package/skills/okx-strategy-research/references/tools-and-data.md +192 -0
- package/skills/okx-trading/SKILL.md +11 -10
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Slash command surface for the interactive shell.
|
|
3
|
+
*
|
|
4
|
+
* Commands are data, not React: the parser, the completion list, and the
|
|
5
|
+
* argument handling are all testable without rendering a terminal.
|
|
6
|
+
*
|
|
7
|
+
* Every piece of prose here is a message-bundle key rather than English text, so
|
|
8
|
+
* `/help` follows the chosen language like the rest of the shell. Command names,
|
|
9
|
+
* argument placeholders, and usage strings stay literal: they are what the user
|
|
10
|
+
* types, and translating those would make a copied line stop working.
|
|
11
|
+
*/
|
|
12
|
+
import { activeMessages } from "../i18n/locale.js";
|
|
13
|
+
import { displayWidth, padEndDisplay } from "../cli/width.js";
|
|
14
|
+
/**
|
|
15
|
+
* Reads one bundle key as text.
|
|
16
|
+
*
|
|
17
|
+
* The bundle mixes plain strings with functions; only the plain ones are used for
|
|
18
|
+
* command help, so a key pointing at a function is a wiring mistake and shows as
|
|
19
|
+
* the key itself rather than crashing the shell.
|
|
20
|
+
*/
|
|
21
|
+
function phrase(key) {
|
|
22
|
+
const value = activeMessages()[key];
|
|
23
|
+
return typeof value === "string" ? value : String(key);
|
|
24
|
+
}
|
|
25
|
+
/** One command's summary in the active language. */
|
|
26
|
+
export function commandSummary(spec) {
|
|
27
|
+
return phrase(spec.summary);
|
|
28
|
+
}
|
|
29
|
+
/** One command's long help in the active language, when it has any. */
|
|
30
|
+
export function commandDetail(spec) {
|
|
31
|
+
return spec.detail === undefined ? undefined : phrase(spec.detail);
|
|
32
|
+
}
|
|
33
|
+
/** One argument's description in the active language. */
|
|
34
|
+
export function argumentDescription(argument) {
|
|
35
|
+
return phrase(argument.description);
|
|
36
|
+
}
|
|
37
|
+
export const COMMANDS = [
|
|
38
|
+
{
|
|
39
|
+
name: "help",
|
|
40
|
+
summary: "cmdHelp",
|
|
41
|
+
usage: "/help [command]",
|
|
42
|
+
args: [{ name: "command", description: "argHelpCommand", required: false }]
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
name: "data",
|
|
46
|
+
summary: "cmdData",
|
|
47
|
+
usage: "/data",
|
|
48
|
+
detail: "cmdDataDetail"
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
name: "download",
|
|
52
|
+
summary: "cmdDownload",
|
|
53
|
+
usage: "/download <instrument> [days | range]",
|
|
54
|
+
detail: "cmdDownloadDetail",
|
|
55
|
+
args: [
|
|
56
|
+
{ name: "instrument", description: "argInstrument", default: "BTC-USDT-SWAP" },
|
|
57
|
+
{ name: "days | range", description: "argWindow30", default: "30" }
|
|
58
|
+
]
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
name: "new",
|
|
62
|
+
summary: "cmdNew",
|
|
63
|
+
usage: "/new <file.py> [template]",
|
|
64
|
+
detail: "cmdNewDetail",
|
|
65
|
+
args: [
|
|
66
|
+
{ name: "file.py", description: "argDestinationFile", required: true },
|
|
67
|
+
{ name: "template", description: "argTemplate", default: "ema-trend" }
|
|
68
|
+
]
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
name: "validate",
|
|
72
|
+
summary: "cmdValidate",
|
|
73
|
+
usage: "/validate <file.py>",
|
|
74
|
+
detail: "cmdValidateDetail",
|
|
75
|
+
args: [{ name: "file.py", description: "argStrategyToCheck", required: true }]
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
name: "backtest",
|
|
79
|
+
summary: "cmdBacktest",
|
|
80
|
+
usage: "/backtest <file.py | setting> [instrument] [days | range]",
|
|
81
|
+
detail: "cmdBacktestDetail",
|
|
82
|
+
args: [
|
|
83
|
+
{ name: "file.py | setting", description: "argStrategyOrSetting", required: true },
|
|
84
|
+
{ name: "instrument", description: "argInstrument", default: "BTC-USDT-SWAP" },
|
|
85
|
+
{ name: "days | range", description: "argWindow30", default: "30" }
|
|
86
|
+
]
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
name: "optimize",
|
|
90
|
+
summary: "cmdOptimize",
|
|
91
|
+
usage: "/optimize <file.py | report> [instrument] [days | range] [space.json] [budget]",
|
|
92
|
+
detail: "cmdOptimizeDetail",
|
|
93
|
+
args: [
|
|
94
|
+
{ name: "file.py | report", description: "argStrategyOrReport", required: true },
|
|
95
|
+
{ name: "instrument", description: "argInstrument", default: "BTC-USDT-SWAP" },
|
|
96
|
+
{ name: "days | range", description: "argWindow90", default: "90" },
|
|
97
|
+
{ name: "space.json", description: "argSpaceFile", default: "space.json" },
|
|
98
|
+
{ name: "budget", description: "argBudget", default: "100" }
|
|
99
|
+
]
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
name: "compare",
|
|
103
|
+
summary: "cmdCompare",
|
|
104
|
+
usage: "/compare <runId> <runId> [runId...] [--no-open]",
|
|
105
|
+
detail: "cmdCompareDetail",
|
|
106
|
+
args: [
|
|
107
|
+
{ name: "runId runId ...", description: "argRunsToCompare", required: true },
|
|
108
|
+
{ name: "--no-open", description: "argNoOpen", required: false }
|
|
109
|
+
]
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
name: "live",
|
|
113
|
+
summary: "cmdLive",
|
|
114
|
+
usage: "/live [signals <id> | stop <id>]",
|
|
115
|
+
detail: "cmdLiveDetail",
|
|
116
|
+
args: [
|
|
117
|
+
{ name: "signals | stop", description: "argLiveAction", required: false },
|
|
118
|
+
{ name: "id", description: "argLiveProfileId", required: false }
|
|
119
|
+
]
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
name: "market",
|
|
123
|
+
summary: "cmdMarket",
|
|
124
|
+
usage: "/market [demo|live]",
|
|
125
|
+
detail: "cmdMarketDetail",
|
|
126
|
+
args: [{ name: "demo | live", description: "argMarketEnv", required: false }]
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
name: "settings",
|
|
130
|
+
summary: "cmdSettings",
|
|
131
|
+
usage: "/settings",
|
|
132
|
+
detail: "cmdSettingsDetail"
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
name: "coverage",
|
|
136
|
+
summary: "cmdCoverage",
|
|
137
|
+
usage: "/coverage <instrument>",
|
|
138
|
+
args: [{ name: "instrument", description: "argInstrument", default: "BTC-USDT-SWAP" }],
|
|
139
|
+
detail: "cmdCoverageDetail"
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
name: "delete",
|
|
143
|
+
summary: "cmdDelete",
|
|
144
|
+
usage: "/delete <runId>",
|
|
145
|
+
args: [{ name: "runId", description: "argRunToDelete", required: true }],
|
|
146
|
+
detail: "cmdDeleteDetail"
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
name: "runs",
|
|
150
|
+
summary: "cmdRuns",
|
|
151
|
+
usage: "/runs [limit]",
|
|
152
|
+
args: [{ name: "limit", description: "argRowLimit", default: "10" }]
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
name: "report",
|
|
156
|
+
summary: "cmdReport",
|
|
157
|
+
usage: "/report <runId>",
|
|
158
|
+
args: [
|
|
159
|
+
{ name: "runId", description: "argRunToOpen", required: true },
|
|
160
|
+
{ name: "--no-open", description: "argNoOpen", required: false }
|
|
161
|
+
]
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
name: "cancel",
|
|
165
|
+
summary: "cmdCancel",
|
|
166
|
+
usage: "/cancel <runId>",
|
|
167
|
+
args: [{ name: "runId", description: "argRunToCancel", required: true }]
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
name: "env",
|
|
171
|
+
summary: "cmdEnv",
|
|
172
|
+
usage: "/env [setup]",
|
|
173
|
+
args: [{ name: "setup", description: "argEnvSetup", required: false }]
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
name: "status",
|
|
177
|
+
summary: "cmdStatus",
|
|
178
|
+
usage: "/status"
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
name: "lang",
|
|
182
|
+
summary: "cmdLang",
|
|
183
|
+
usage: "/lang [en|zh]",
|
|
184
|
+
detail: "cmdLangDetail",
|
|
185
|
+
args: [{ name: "locale", description: "argLocale", required: false }]
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
name: "clear",
|
|
189
|
+
summary: "cmdClear",
|
|
190
|
+
usage: "/clear",
|
|
191
|
+
detail: "cmdClearDetail"
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
name: "exit",
|
|
195
|
+
summary: "cmdExit",
|
|
196
|
+
usage: "/exit"
|
|
197
|
+
}
|
|
198
|
+
];
|
|
199
|
+
/**
|
|
200
|
+
* Parses one input line.
|
|
201
|
+
*
|
|
202
|
+
* A bare word with no slash is treated as a command too: typing `data` is a
|
|
203
|
+
* natural mistake and refusing it teaches nothing.
|
|
204
|
+
*/
|
|
205
|
+
export function parseCommand(input) {
|
|
206
|
+
const trimmed = input.trim();
|
|
207
|
+
if (!trimmed)
|
|
208
|
+
return null;
|
|
209
|
+
const body = trimmed.startsWith("/") ? trimmed.slice(1) : trimmed;
|
|
210
|
+
const parts = body.split(/\s+/).filter(Boolean);
|
|
211
|
+
const name = (parts.shift() ?? "").toLowerCase();
|
|
212
|
+
if (!name)
|
|
213
|
+
return null;
|
|
214
|
+
return { name, args: parts, known: COMMANDS.some((command) => command.name === name) };
|
|
215
|
+
}
|
|
216
|
+
/** Commands whose name starts with the partial token after `/`. */
|
|
217
|
+
export function completions(input) {
|
|
218
|
+
const trimmed = input.trimStart();
|
|
219
|
+
if (!trimmed.startsWith("/"))
|
|
220
|
+
return [];
|
|
221
|
+
const body = trimmed.slice(1);
|
|
222
|
+
// Once an argument is being typed, the command itself is settled.
|
|
223
|
+
if (/\s/.test(body))
|
|
224
|
+
return [];
|
|
225
|
+
const lower = body.toLowerCase();
|
|
226
|
+
return COMMANDS.filter((command) => command.name.startsWith(lower));
|
|
227
|
+
}
|
|
228
|
+
export function commandByName(name) {
|
|
229
|
+
return COMMANDS.find((command) => command.name === name.toLowerCase());
|
|
230
|
+
}
|
|
231
|
+
export function formatCommandList() {
|
|
232
|
+
const width = Math.max(...COMMANDS.map((command) => command.usage.length));
|
|
233
|
+
return COMMANDS.map((command) => ` ${command.usage.padEnd(width)} ${commandSummary(command)}`).join("\n");
|
|
234
|
+
}
|
|
235
|
+
export function formatCommandDetail(spec) {
|
|
236
|
+
const lines = [` ${spec.usage}`, ` ${commandSummary(spec)}`];
|
|
237
|
+
if (spec.args?.length) {
|
|
238
|
+
lines.push("");
|
|
239
|
+
// Padded by display width, not length: a Chinese description is twice as wide
|
|
240
|
+
// per character and would push the notes out of column.
|
|
241
|
+
const width = Math.max(...spec.args.map((argument) => displayWidth(argument.name)));
|
|
242
|
+
for (const argument of spec.args) {
|
|
243
|
+
lines.push(` ${padEndDisplay(argument.name, width)} ${argumentDescription(argument)} (${note(argument)})`);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
const detail = commandDetail(spec);
|
|
247
|
+
if (detail)
|
|
248
|
+
lines.push("", ` ${detail}`);
|
|
249
|
+
return lines.join("\n");
|
|
250
|
+
}
|
|
251
|
+
function note(argument) {
|
|
252
|
+
const text = activeMessages();
|
|
253
|
+
if (argument.required)
|
|
254
|
+
return text.argRequired;
|
|
255
|
+
return argument.default ? text.argDefault(argument.default) : text.argOptional;
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Which positional argument the caret is currently on.
|
|
259
|
+
*
|
|
260
|
+
* Counts the words after the command name; a trailing space means the next
|
|
261
|
+
* argument has been started.
|
|
262
|
+
*/
|
|
263
|
+
export function argumentIndex(input) {
|
|
264
|
+
const body = input.trimStart().replace(/^\//, "");
|
|
265
|
+
const parts = body.split(/\s+/).filter(Boolean);
|
|
266
|
+
if (parts.length === 0)
|
|
267
|
+
return -1;
|
|
268
|
+
return /\s$/.test(input) ? parts.length - 1 : parts.length - 2;
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Inline hint for a recognized command.
|
|
272
|
+
*
|
|
273
|
+
* Shown as soon as the command name is settled, so a multi-argument command does
|
|
274
|
+
* not require reading `/help` first. The active argument is marked, which is the
|
|
275
|
+
* part a usage string alone cannot convey.
|
|
276
|
+
*/
|
|
277
|
+
export function argumentHint(input) {
|
|
278
|
+
const parsed = parseCommand(input);
|
|
279
|
+
if (!parsed?.known)
|
|
280
|
+
return null;
|
|
281
|
+
const spec = commandByName(parsed.name);
|
|
282
|
+
if (!spec?.args?.length)
|
|
283
|
+
return null;
|
|
284
|
+
// Wait for a space: before that the user may still be choosing a command.
|
|
285
|
+
if (!/\s/.test(input))
|
|
286
|
+
return null;
|
|
287
|
+
const active = argumentIndex(input);
|
|
288
|
+
const lines = spec.args.map((argument, index) => {
|
|
289
|
+
const marker = index === active ? "\u25b8" : " ";
|
|
290
|
+
return `${marker} ${argument.name} ${argumentDescription(argument)} (${note(argument)})`;
|
|
291
|
+
});
|
|
292
|
+
return { usage: spec.usage, lines };
|
|
293
|
+
}
|
|
294
|
+
/** Suggests the closest command for an unrecognized name. */
|
|
295
|
+
export function suggest(name) {
|
|
296
|
+
const scored = COMMANDS.map((command) => ({ name: command.name, distance: distance(name, command.name) }))
|
|
297
|
+
.filter((entry) => entry.distance <= 2)
|
|
298
|
+
.sort((left, right) => left.distance - right.distance);
|
|
299
|
+
return scored[0]?.name;
|
|
300
|
+
}
|
|
301
|
+
function distance(left, right) {
|
|
302
|
+
const rows = left.length + 1;
|
|
303
|
+
const columns = right.length + 1;
|
|
304
|
+
const matrix = Array.from({ length: rows }, (_, row) => Array.from({ length: columns }, (_, column) => (row === 0 ? column : column === 0 ? row : 0)));
|
|
305
|
+
for (let row = 1; row < rows; row += 1) {
|
|
306
|
+
for (let column = 1; column < columns; column += 1) {
|
|
307
|
+
const cost = left[row - 1] === right[column - 1] ? 0 : 1;
|
|
308
|
+
matrix[row][column] = Math.min(matrix[row - 1][column] + 1, matrix[row][column - 1] + 1, matrix[row - 1][column - 1] + cost);
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
return matrix[rows - 1][columns - 1];
|
|
312
|
+
}
|
|
313
|
+
//# sourceMappingURL=commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/tui/commands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AA4B9D;;;;;;GAMG;AACH,SAAS,MAAM,CAAC,GAAmB;IACjC,MAAM,KAAK,GAAI,cAAc,EAAyC,CAAC,GAAG,CAAC,CAAC;IAC5E,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AACzD,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,cAAc,CAAC,IAAiB;IAC9C,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC9B,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,aAAa,CAAC,IAAiB;IAC7C,OAAO,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACrE,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,mBAAmB,CAAC,QAAyB;IAC3D,OAAO,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,CAAC,MAAM,QAAQ,GAAkB;IACrC;QACE,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,SAAS;QAClB,KAAK,EAAE,iBAAiB;QACxB,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,gBAAgB,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;KAC5E;IACD;QACE,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,SAAS;QAClB,KAAK,EAAE,OAAO;QACd,MAAM,EAAE,eAAe;KACxB;IACD;QACE,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,aAAa;QACtB,KAAK,EAAE,uCAAuC;QAC9C,MAAM,EAAE,mBAAmB;QAC3B,IAAI,EAAE;YACJ,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,OAAO,EAAE,eAAe,EAAE;YAC9E,EAAE,IAAI,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE;SACpE;KACF;IACD;QACE,IAAI,EAAE,KAAK;QACX,OAAO,EAAE,QAAQ;QACjB,KAAK,EAAE,2BAA2B;QAClC,MAAM,EAAE,cAAc;QACtB,IAAI,EAAE;YACJ,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,oBAAoB,EAAE,QAAQ,EAAE,IAAI,EAAE;YACtE,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,OAAO,EAAE,WAAW,EAAE;SACvE;KACF;IACD;QACE,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,aAAa;QACtB,KAAK,EAAE,qBAAqB;QAC5B,MAAM,EAAE,mBAAmB;QAC3B,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,oBAAoB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;KAC/E;IACD;QACE,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,aAAa;QACtB,KAAK,EAAE,2DAA2D;QAClE,MAAM,EAAE,mBAAmB;QAC3B,IAAI,EAAE;YACJ,EAAE,IAAI,EAAE,mBAAmB,EAAE,WAAW,EAAE,sBAAsB,EAAE,QAAQ,EAAE,IAAI,EAAE;YAClF,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,OAAO,EAAE,eAAe,EAAE;YAC9E,EAAE,IAAI,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE;SACpE;KACF;IACD;QACE,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,aAAa;QACtB,KAAK,EAAE,gFAAgF;QACvF,MAAM,EAAE,mBAAmB;QAC3B,IAAI,EAAE;YACJ,EAAE,IAAI,EAAE,kBAAkB,EAAE,WAAW,EAAE,qBAAqB,EAAE,QAAQ,EAAE,IAAI,EAAE;YAChF,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,OAAO,EAAE,eAAe,EAAE;YAC9E,EAAE,IAAI,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE;YACnE,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,OAAO,EAAE,YAAY,EAAE;YAC1E,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE;SAC7D;KACF;IACD;QACE,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,YAAY;QACrB,KAAK,EAAE,iDAAiD;QACxD,MAAM,EAAE,kBAAkB;QAC1B,IAAI,EAAE;YACJ,EAAE,IAAI,EAAE,iBAAiB,EAAE,WAAW,EAAE,kBAAkB,EAAE,QAAQ,EAAE,IAAI,EAAE;YAC5E,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE;SACjE;KACF;IACD;QACE,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,SAAS;QAClB,KAAK,EAAE,kCAAkC;QACzC,MAAM,EAAE,eAAe;QACvB,IAAI,EAAE;YACJ,EAAE,IAAI,EAAE,gBAAgB,EAAE,WAAW,EAAE,eAAe,EAAE,QAAQ,EAAE,KAAK,EAAE;YACzE,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,kBAAkB,EAAE,QAAQ,EAAE,KAAK,EAAE;SACjE;KACF;IACD;QACE,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,WAAW;QACpB,KAAK,EAAE,qBAAqB;QAC5B,MAAM,EAAE,iBAAiB;QACzB,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;KAC9E;IACD;QACE,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,aAAa;QACtB,KAAK,EAAE,WAAW;QAClB,MAAM,EAAE,mBAAmB;KAC5B;IACD;QACE,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,aAAa;QACtB,KAAK,EAAE,wBAAwB;QAC/B,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC;QACtF,MAAM,EAAE,mBAAmB;KAC5B;IACD;QACE,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,WAAW;QACpB,KAAK,EAAE,iBAAiB;QACxB,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QACxE,MAAM,EAAE,iBAAiB;KAC1B;IACD;QACE,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,SAAS;QAClB,KAAK,EAAE,eAAe;QACtB,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;KACrE;IACD;QACE,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,WAAW;QACpB,KAAK,EAAE,iBAAiB;QACxB,IAAI,EAAE;YACJ,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE;YAC9D,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE;SACjE;KACF;IACD;QACE,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,WAAW;QACpB,KAAK,EAAE,iBAAiB;QACxB,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;KACzE;IACD;QACE,IAAI,EAAE,KAAK;QACX,OAAO,EAAE,QAAQ;QACjB,KAAK,EAAE,cAAc;QACrB,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;KACvE;IACD;QACE,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,WAAW;QACpB,KAAK,EAAE,SAAS;KACjB;IACD;QACE,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,SAAS;QAClB,KAAK,EAAE,eAAe;QACtB,MAAM,EAAE,eAAe;QACvB,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;KACtE;IACD;QACE,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,UAAU;QACnB,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,gBAAgB;KACzB;IACD;QACE,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,SAAS;QAClB,KAAK,EAAE,OAAO;KACf;CACF,CAAC;AAQF;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAClE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACjD,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;AACzF,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;IAClC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IACxC,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC9B,kEAAkE;IAClE,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACjC,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;AACzE,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3E,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC9G,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAiB;IACnD,MAAM,KAAK,GAAG,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE,EAAE,KAAK,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/D,IAAI,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,8EAA8E;QAC9E,wDAAwD;QACxD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpF,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACjC,KAAK,CAAC,IAAI,CACR,KAAK,aAAa,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,mBAAmB,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAClG,CAAC;QACJ,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,MAAM,EAAE,CAAC,CAAC;IAC1C,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,IAAI,CAAC,QAAyB;IACrC,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC;IAC9B,IAAI,QAAQ,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC,WAAW,CAAC;IAC/C,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC;AACjF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAChD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC,CAAC;IAClC,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;AACjE,CAAC;AAOD;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACnC,IAAI,CAAC,MAAM,EAAE,KAAK;QAAE,OAAO,IAAI,CAAC;IAChC,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM;QAAE,OAAO,IAAI,CAAC;IACrC,0EAA0E;IAC1E,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEnC,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACpC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE;QAC9C,MAAM,MAAM,GAAG,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC;QACjD,OAAO,GAAG,MAAM,IAAI,QAAQ,CAAC,IAAI,KAAK,mBAAmB,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;IAC7F,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC;AACtC,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;SACvG,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,CAAC;SACtC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;IACzD,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;AACzB,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY,EAAE,KAAa;IAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IAC7B,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IACjC,MAAM,MAAM,GAAe,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CACjE,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAC9F,CAAC;IACF,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QACvC,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,CAAC,EAAE,CAAC;YACnD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACzD,MAAM,CAAC,GAAG,CAAE,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAC7B,MAAM,CAAC,GAAG,GAAG,CAAC,CAAE,CAAC,MAAM,CAAE,GAAG,CAAC,EAC7B,MAAM,CAAC,GAAG,CAAE,CAAC,MAAM,GAAG,CAAC,CAAE,GAAG,CAAC,EAC7B,MAAM,CAAC,GAAG,GAAG,CAAC,CAAE,CAAC,MAAM,GAAG,CAAC,CAAE,GAAG,IAAI,CACrC,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,GAAG,CAAC,CAAE,CAAC,OAAO,GAAG,CAAC,CAAE,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transcript entries.
|
|
3
|
+
*
|
|
4
|
+
* Once written, an entry never changes: the shell renders history through Ink's
|
|
5
|
+
* `<Static>`, which writes each line to stdout exactly once so output scrolls
|
|
6
|
+
* like ordinary command output and survives in the terminal's scrollback.
|
|
7
|
+
*/
|
|
8
|
+
export type EntryKind = "input" | "output" | "success" | "error" | "note";
|
|
9
|
+
export interface Entry {
|
|
10
|
+
id: number;
|
|
11
|
+
kind: EntryKind;
|
|
12
|
+
text: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function entry(kind: EntryKind, text: string): Entry;
|
|
15
|
+
export declare function resetEntryIds(): void;
|
|
16
|
+
/** Colour per entry kind, matching Ink's colour names. */
|
|
17
|
+
export declare function entryColor(kind: EntryKind): string | undefined;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
let sequence = 0;
|
|
2
|
+
export function entry(kind, text) {
|
|
3
|
+
sequence += 1;
|
|
4
|
+
return { id: sequence, kind, text };
|
|
5
|
+
}
|
|
6
|
+
export function resetEntryIds() {
|
|
7
|
+
sequence = 0;
|
|
8
|
+
}
|
|
9
|
+
/** Colour per entry kind, matching Ink's colour names. */
|
|
10
|
+
export function entryColor(kind) {
|
|
11
|
+
switch (kind) {
|
|
12
|
+
case "input":
|
|
13
|
+
return "cyan";
|
|
14
|
+
case "success":
|
|
15
|
+
return "green";
|
|
16
|
+
case "error":
|
|
17
|
+
return "red";
|
|
18
|
+
case "note":
|
|
19
|
+
return "gray";
|
|
20
|
+
default:
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=entries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entries.js","sourceRoot":"","sources":["../../src/tui/entries.ts"],"names":[],"mappings":"AAeA,IAAI,QAAQ,GAAG,CAAC,CAAC;AAEjB,MAAM,UAAU,KAAK,CAAC,IAAe,EAAE,IAAY;IACjD,QAAQ,IAAI,CAAC,CAAC;IACd,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,QAAQ,GAAG,CAAC,CAAC;AACf,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,UAAU,CAAC,IAAe;IACxC,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,OAAO;YACV,OAAO,MAAM,CAAC;QAChB,KAAK,SAAS;YACZ,OAAO,OAAO,CAAC;QACjB,KAAK,OAAO;YACV,OAAO,KAAK,CAAC;QACf,KAAK,MAAM;YACT,OAAO,MAAM,CAAC;QAChB;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { RuntimeClient } from "../runtime/client.js";
|
|
2
|
+
import { type Entry } from "./entries.js";
|
|
3
|
+
import type { ProgressState } from "./progress.js";
|
|
4
|
+
export interface ExecuteContext {
|
|
5
|
+
client: RuntimeClient;
|
|
6
|
+
/** Test seam: which config file `/market` reads and writes. */
|
|
7
|
+
configPath?: string;
|
|
8
|
+
/** Reports a line to display in the live activity area while working. */
|
|
9
|
+
onActivity: (line: string | null) => void;
|
|
10
|
+
/** Reports measurable progress, which is drawn as a bar instead of a spinner. */
|
|
11
|
+
onProgress?: (progress: ProgressState | null) => void;
|
|
12
|
+
/** Resolves when the run should stop waiting, used for cancellation. */
|
|
13
|
+
signal?: AbortSignal;
|
|
14
|
+
}
|
|
15
|
+
export interface ExecuteResult {
|
|
16
|
+
entries: Entry[];
|
|
17
|
+
/** Set when the command asks the shell to do something beyond printing. */
|
|
18
|
+
effect?: "clear" | "exit";
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Runs one parsed command and returns the entries to append.
|
|
22
|
+
*
|
|
23
|
+
* Every command returns text rather than rendering: the shell owns presentation,
|
|
24
|
+
* and this stays testable without a terminal.
|
|
25
|
+
*/
|
|
26
|
+
export declare function execute(name: string, args: string[], context: ExecuteContext): Promise<ExecuteResult>;
|