zelari-code 0.7.9 → 0.7.11
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/LICENSE +37 -37
- package/README.md +320 -295
- package/bin/zelari-code.js +62 -62
- package/dist/cli/app.js +33 -3
- package/dist/cli/app.js.map +1 -1
- package/dist/cli/components/LiveRegion.js +7 -3
- package/dist/cli/components/LiveRegion.js.map +1 -1
- package/dist/cli/components/SelectList.js +67 -0
- package/dist/cli/components/SelectList.js.map +1 -0
- package/dist/cli/components/Spinner.js +51 -0
- package/dist/cli/components/Spinner.js.map +1 -0
- package/dist/cli/components/SplashScreen.js +85 -85
- package/dist/cli/components/StatusBar.js +42 -34
- package/dist/cli/components/StatusBar.js.map +1 -1
- package/dist/cli/headless.js +10 -10
- package/dist/cli/hooks/useSlashDispatch.js +11 -1
- package/dist/cli/hooks/useSlashDispatch.js.map +1 -1
- package/dist/cli/keyStore.js +2 -2
- package/dist/cli/keyStore.js.map +1 -1
- package/dist/cli/main.bundled.js +15146 -14919
- package/dist/cli/main.bundled.js.map +4 -4
- package/dist/cli/main.js +1 -1
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/modelDiscovery.js +42 -5
- package/dist/cli/modelDiscovery.js.map +1 -1
- package/dist/cli/provider/openai-compatible.js +4 -2
- package/dist/cli/provider/openai-compatible.js.map +1 -1
- package/dist/cli/slashCommands.js +22 -5
- package/dist/cli/slashCommands.js.map +1 -1
- package/dist/cli/slashHandlers/provider.js +102 -5
- package/dist/cli/slashHandlers/provider.js.map +1 -1
- package/package.json +2 -2
- package/dist/agents/advancedTools.js +0 -115
- package/dist/agents/advancedTools.js.map +0 -1
- package/dist/agents/councilApi.js +0 -375
- package/dist/agents/councilApi.js.map +0 -1
- package/dist/agents/councilDirectives.js +0 -100
- package/dist/agents/councilDirectives.js.map +0 -1
- package/dist/agents/promoteMember.js +0 -210
- package/dist/agents/promoteMember.js.map +0 -1
- package/dist/agents/promptModules.js +0 -139
- package/dist/agents/promptModules.js.map +0 -1
- package/dist/agents/roles.js +0 -299
- package/dist/agents/roles.js.map +0 -1
- package/dist/agents/skills/builtin/debugging.js +0 -248
- package/dist/agents/skills/builtin/debugging.js.map +0 -1
- package/dist/agents/skills/builtin/docs.js +0 -301
- package/dist/agents/skills/builtin/docs.js.map +0 -1
- package/dist/agents/skills/builtin/git-ops.js +0 -301
- package/dist/agents/skills/builtin/git-ops.js.map +0 -1
- package/dist/agents/skills/builtin/planning.js +0 -335
- package/dist/agents/skills/builtin/planning.js.map +0 -1
- package/dist/agents/skills/builtin/refactoring.js +0 -261
- package/dist/agents/skills/builtin/refactoring.js.map +0 -1
- package/dist/agents/skills/builtin/review.js +0 -302
- package/dist/agents/skills/builtin/review.js.map +0 -1
- package/dist/agents/skills/builtin/testing.js +0 -245
- package/dist/agents/skills/builtin/testing.js.map +0 -1
- package/dist/agents/skills.js +0 -272
- package/dist/agents/skills.js.map +0 -1
- package/dist/agents/systemPromptBuilder.js +0 -151
- package/dist/agents/systemPromptBuilder.js.map +0 -1
- package/dist/agents/toolSchemas.js +0 -249
- package/dist/agents/toolSchemas.js.map +0 -1
- package/dist/agents/tools.js +0 -196
- package/dist/agents/tools.js.map +0 -1
- package/dist/agents/vaultTools.js +0 -134
- package/dist/agents/vaultTools.js.map +0 -1
- package/dist/cli/components/CollapsibleToolOutput.js +0 -43
- package/dist/cli/components/CollapsibleToolOutput.js.map +0 -1
- package/dist/cli/components/Header.js +0 -38
- package/dist/cli/components/Header.js.map +0 -1
- package/dist/main/core/AgentHarness.js +0 -467
- package/dist/main/core/AgentHarness.js.map +0 -1
- package/dist/main/core/providerStream.js +0 -99
- package/dist/main/core/providerStream.js.map +0 -1
- package/dist/main/core/sessionJsonl.js +0 -99
- package/dist/main/core/sessionJsonl.js.map +0 -1
- package/dist/main/core/tools/auditLog.js +0 -26
- package/dist/main/core/tools/auditLog.js.map +0 -1
- package/dist/main/core/tools/builtin/filesystem.js +0 -110
- package/dist/main/core/tools/builtin/filesystem.js.map +0 -1
- package/dist/main/core/tools/builtin/listFiles.js +0 -86
- package/dist/main/core/tools/builtin/listFiles.js.map +0 -1
- package/dist/main/core/tools/builtin/search.js +0 -56
- package/dist/main/core/tools/builtin/search.js.map +0 -1
- package/dist/main/core/tools/builtin/shell.js +0 -51
- package/dist/main/core/tools/builtin/shell.js.map +0 -1
- package/dist/main/core/tools/registry.js +0 -71
- package/dist/main/core/tools/registry.js.map +0 -1
- package/dist/main/core/tools/toolTypes.js +0 -8
- package/dist/main/core/tools/toolTypes.js.map +0 -1
- package/dist/main/core/tools/zodBridge.js +0 -56
- package/dist/main/core/tools/zodBridge.js.map +0 -1
- package/dist/shared/eventBus.js +0 -104
- package/dist/shared/eventBus.js.map +0 -1
- package/dist/shared/events.js +0 -73
- package/dist/shared/events.js.map +0 -1
- package/dist/shared/index.js +0 -8
- package/dist/shared/index.js.map +0 -1
- package/dist/types/context.js +0 -3
- package/dist/types/context.js.map +0 -1
- package/dist/types/index.js +0 -2
- package/dist/types/index.js.map +0 -1
- package/dist/types/knowledge.js +0 -2
- package/dist/types/knowledge.js.map +0 -1
- package/dist/types/systemTypes.js +0 -10
- package/dist/types/systemTypes.js.map +0 -1
package/bin/zelari-code.js
CHANGED
|
@@ -1,64 +1,64 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* zelari-code — npm bin entrypoint.
|
|
4
|
-
*
|
|
5
|
-
* Spawned by npm when running `zelari-code` from anywhere after
|
|
6
|
-
* `npm install -g zelari-code`. Resolves to the compiled CLI bundle
|
|
7
|
-
* (tsc + esbuild output) OR falls back to tsx (dev/source workflow).
|
|
8
|
-
*
|
|
9
|
-
* Strategy:
|
|
10
|
-
* 1. If `dist/cli/main.bundled.js` exists (production build), require it.
|
|
11
|
-
* 2. Otherwise (dev/source install), use tsx to run the TS source directly.
|
|
12
|
-
*
|
|
13
|
-
* This means `npm install -g .` from a clone works (dev install), AND
|
|
14
|
-
* `npm install -g zelari-code` from the registry works (production).
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
import { createRequire } from 'node:module';
|
|
18
|
-
import { existsSync } from 'node:fs';
|
|
19
|
-
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
20
|
-
import path from 'node:path';
|
|
21
|
-
|
|
22
|
-
const require = createRequire(import.meta.url);
|
|
23
|
-
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
24
|
-
|
|
25
|
-
// Helper: convert Windows absolute path to file:// URL for dynamic import()
|
|
26
|
-
const toImportURL = (p) => pathToFileURL(p).href;
|
|
27
|
-
|
|
28
|
-
// Resolve the package root (this file lives at <pkg>/bin/zelari-code.js)
|
|
29
|
-
const pkgRoot = path.resolve(__dirname, '..');
|
|
30
|
-
|
|
31
|
-
const compiledBundled = path.join(pkgRoot, 'dist', 'cli', 'main.bundled.js');
|
|
32
|
-
const compiledMain = path.join(pkgRoot, 'dist', 'cli', 'main.js');
|
|
33
|
-
const compiledApp = path.join(pkgRoot, 'dist', 'cli', 'app.js');
|
|
34
|
-
const tsSource = path.join(pkgRoot, 'src', 'cli', 'main.ts');
|
|
35
|
-
|
|
36
|
-
if (existsSync(compiledBundled)) {
|
|
37
|
-
// Production path: esbuild-bundled self-contained ESM (includes .tsx)
|
|
38
|
-
await import(toImportURL(compiledBundled));
|
|
39
|
-
} else if (existsSync(compiledMain) && existsSync(compiledApp)) {
|
|
40
|
-
// Production path (legacy): tsc-only emit (only .ts, requires .tsx to be absent)
|
|
41
|
-
await import(toImportURL(compiledMain));
|
|
42
|
-
} else if (existsSync(tsSource)) {
|
|
43
|
-
// Dev/source install path: use tsx
|
|
44
|
-
try {
|
|
45
|
-
require('tsx/esm/api');
|
|
46
|
-
await import(toImportURL(tsSource));
|
|
47
|
-
} catch {
|
|
48
|
-
console.error(
|
|
49
|
-
'[zelari-code] Neither compiled dist nor tsx runtime found.\n' +
|
|
50
|
-
'Production install: run `npm run build:cli` before installing (requires esbuild + tsx).\n' +
|
|
51
|
-
'Source install: install `tsx` (npm i -g tsx) and run from source.',
|
|
52
|
-
);
|
|
53
|
-
process.exit(1);
|
|
54
|
-
}
|
|
55
|
-
} else {
|
|
56
|
-
console.error(
|
|
57
|
-
'[zelari-code] Cannot locate CLI entrypoint.\n' +
|
|
58
|
-
`Looked for: ${compiledBundled}\n` +
|
|
59
|
-
`Looked for: ${compiledMain}\n` +
|
|
60
|
-
`Looked for: ${tsSource}\n` +
|
|
61
|
-
'Reinstall the package or report an issue.',
|
|
62
|
-
);
|
|
63
|
-
process.exit(1);
|
|
2
|
+
/**
|
|
3
|
+
* zelari-code — npm bin entrypoint.
|
|
4
|
+
*
|
|
5
|
+
* Spawned by npm when running `zelari-code` from anywhere after
|
|
6
|
+
* `npm install -g zelari-code`. Resolves to the compiled CLI bundle
|
|
7
|
+
* (tsc + esbuild output) OR falls back to tsx (dev/source workflow).
|
|
8
|
+
*
|
|
9
|
+
* Strategy:
|
|
10
|
+
* 1. If `dist/cli/main.bundled.js` exists (production build), require it.
|
|
11
|
+
* 2. Otherwise (dev/source install), use tsx to run the TS source directly.
|
|
12
|
+
*
|
|
13
|
+
* This means `npm install -g .` from a clone works (dev install), AND
|
|
14
|
+
* `npm install -g zelari-code` from the registry works (production).
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { createRequire } from 'node:module';
|
|
18
|
+
import { existsSync } from 'node:fs';
|
|
19
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
20
|
+
import path from 'node:path';
|
|
21
|
+
|
|
22
|
+
const require = createRequire(import.meta.url);
|
|
23
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
24
|
+
|
|
25
|
+
// Helper: convert Windows absolute path to file:// URL for dynamic import()
|
|
26
|
+
const toImportURL = (p) => pathToFileURL(p).href;
|
|
27
|
+
|
|
28
|
+
// Resolve the package root (this file lives at <pkg>/bin/zelari-code.js)
|
|
29
|
+
const pkgRoot = path.resolve(__dirname, '..');
|
|
30
|
+
|
|
31
|
+
const compiledBundled = path.join(pkgRoot, 'dist', 'cli', 'main.bundled.js');
|
|
32
|
+
const compiledMain = path.join(pkgRoot, 'dist', 'cli', 'main.js');
|
|
33
|
+
const compiledApp = path.join(pkgRoot, 'dist', 'cli', 'app.js');
|
|
34
|
+
const tsSource = path.join(pkgRoot, 'src', 'cli', 'main.ts');
|
|
35
|
+
|
|
36
|
+
if (existsSync(compiledBundled)) {
|
|
37
|
+
// Production path: esbuild-bundled self-contained ESM (includes .tsx)
|
|
38
|
+
await import(toImportURL(compiledBundled));
|
|
39
|
+
} else if (existsSync(compiledMain) && existsSync(compiledApp)) {
|
|
40
|
+
// Production path (legacy): tsc-only emit (only .ts, requires .tsx to be absent)
|
|
41
|
+
await import(toImportURL(compiledMain));
|
|
42
|
+
} else if (existsSync(tsSource)) {
|
|
43
|
+
// Dev/source install path: use tsx
|
|
44
|
+
try {
|
|
45
|
+
require('tsx/esm/api');
|
|
46
|
+
await import(toImportURL(tsSource));
|
|
47
|
+
} catch {
|
|
48
|
+
console.error(
|
|
49
|
+
'[zelari-code] Neither compiled dist nor tsx runtime found.\n' +
|
|
50
|
+
'Production install: run `npm run build:cli` before installing (requires esbuild + tsx).\n' +
|
|
51
|
+
'Source install: install `tsx` (npm i -g tsx) and run from source.',
|
|
52
|
+
);
|
|
53
|
+
process.exit(1);
|
|
54
|
+
}
|
|
55
|
+
} else {
|
|
56
|
+
console.error(
|
|
57
|
+
'[zelari-code] Cannot locate CLI entrypoint.\n' +
|
|
58
|
+
`Looked for: ${compiledBundled}\n` +
|
|
59
|
+
`Looked for: ${compiledMain}\n` +
|
|
60
|
+
`Looked for: ${tsSource}\n` +
|
|
61
|
+
'Reinstall the package or report an issue.',
|
|
62
|
+
);
|
|
63
|
+
process.exit(1);
|
|
64
64
|
}
|
package/dist/cli/app.js
CHANGED
|
@@ -2,12 +2,14 @@
|
|
|
2
2
|
// the v3-N monolithic app. Behavior is correct; a future pass will tighten the
|
|
3
3
|
// hook signatures and remove this annotation. The split is documented in
|
|
4
4
|
// `docs/plans/2026-07-01-app-split.md`.
|
|
5
|
-
import React, { useState, useMemo, useCallback } from 'react';
|
|
5
|
+
import React, { useState, useMemo, useCallback, useEffect } from 'react';
|
|
6
6
|
import { Box, Static, useInput, useStdin } from 'ink';
|
|
7
7
|
import { InputBar } from './components/InputBar.js';
|
|
8
8
|
import { LiveRegion } from './components/LiveRegion.js';
|
|
9
9
|
import { StatusBar } from './components/StatusBar.js';
|
|
10
|
+
import { SelectList } from './components/SelectList.js';
|
|
10
11
|
import { Sidebar, shouldShowSidebar } from './components/Sidebar.js';
|
|
12
|
+
import { discoverModelsInBackground, isModelsCacheStale } from './modelDiscovery.js';
|
|
11
13
|
import { renderMessage } from './components/ChatStream.js';
|
|
12
14
|
import { listCodingSkills } from '@zelari/core/skills';
|
|
13
15
|
import { useGitChanges } from './hooks/useGitChanges.js';
|
|
@@ -67,6 +69,9 @@ export function App() {
|
|
|
67
69
|
// v0.7.9: dispatch mode for free-form prompts — 'agent' (single harness
|
|
68
70
|
// turn) or 'council' (6-member pipeline). Toggled with shift+tab.
|
|
69
71
|
const [mode, setMode] = useState('agent');
|
|
72
|
+
// v0.7.10: interactive picker (/provider, /model). While open it replaces
|
|
73
|
+
// the InputBar so ink-text-input never competes for arrow keys.
|
|
74
|
+
const [picker, setPicker] = useState(null);
|
|
70
75
|
const activeProviderSpec = getActiveProviderSpec();
|
|
71
76
|
const activeModel = providerConfig.modelByProvider[activeProviderSpec.id];
|
|
72
77
|
const session = useSession();
|
|
@@ -84,6 +89,19 @@ export function App() {
|
|
|
84
89
|
setMode((m) => (m === 'agent' ? 'council' : 'agent'));
|
|
85
90
|
}
|
|
86
91
|
}, { isActive: isRawModeSupported === true });
|
|
92
|
+
// v0.7.10: startup model discovery — refresh the /v1/models cache in the
|
|
93
|
+
// background when it's missing or older than 6h, so the /model picker and
|
|
94
|
+
// tab-completion show current choices without an explicit /discover.
|
|
95
|
+
useEffect(() => {
|
|
96
|
+
const id = activeProviderSpec.id;
|
|
97
|
+
if (!['grok', 'glm', 'minimax', 'openai-compatible'].includes(id))
|
|
98
|
+
return;
|
|
99
|
+
if (!isModelsCacheStale(id))
|
|
100
|
+
return;
|
|
101
|
+
discoverModelsInBackground(id, {});
|
|
102
|
+
// Run once at mount for the provider active at startup.
|
|
103
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
104
|
+
}, []);
|
|
87
105
|
// Throttle layer for the `live` region — coalesces per-token streaming
|
|
88
106
|
// updates (~50-200/sec) into ≤60 renders/sec. The finalized array uses the
|
|
89
107
|
// raw setter (its appends are rare and user-facing).
|
|
@@ -135,10 +153,22 @@ export function App() {
|
|
|
135
153
|
dispatchPrompt: chatTurn.dispatchPrompt,
|
|
136
154
|
dispatchCouncilPrompt: chatTurn.dispatchCouncilPrompt,
|
|
137
155
|
mode,
|
|
156
|
+
openPicker: setPicker,
|
|
138
157
|
onNewSession,
|
|
139
158
|
onExit,
|
|
140
159
|
onClear,
|
|
141
160
|
});
|
|
161
|
+
// Picker selection re-enters the normal slash pipeline ('/provider <id>' /
|
|
162
|
+
// '/model <id>') so persistence, config refresh and the system message all
|
|
163
|
+
// come from the same code path as a typed command.
|
|
164
|
+
const onPickerSelect = useCallback((value) => {
|
|
165
|
+
if (!picker)
|
|
166
|
+
return;
|
|
167
|
+
const cmd = `${picker.commandPrefix} ${value}`;
|
|
168
|
+
setPicker(null);
|
|
169
|
+
void handleSubmit(cmd);
|
|
170
|
+
}, [picker, handleSubmit]);
|
|
171
|
+
const onPickerCancel = useCallback(() => setPicker(null), []);
|
|
142
172
|
// The one-shot banner: printed once as the first Static item. v0.7.9: the
|
|
143
173
|
// skill list is gone (it doubled the banner height and duplicated /help);
|
|
144
174
|
// the banner is now just the wordmark line + cwd + a hint.
|
|
@@ -174,8 +204,8 @@ export function App() {
|
|
|
174
204
|
React.createElement(Static, { key: staticKey, items: staticItems }, (item) => renderMessage(item)),
|
|
175
205
|
React.createElement(Box, { flexDirection: "row" },
|
|
176
206
|
React.createElement(Box, { flexDirection: "column", flexGrow: 1, paddingX: 1 },
|
|
177
|
-
React.createElement(LiveRegion, { live: session.live, busy: busy }),
|
|
178
|
-
React.createElement(InputBar, { value: input, onChange: setInput, onSubmit: handleSubmit, disabled: busy }),
|
|
207
|
+
React.createElement(LiveRegion, { live: session.live, busy: busy, elapsedMs: timer.elapsedMs }),
|
|
208
|
+
picker ? (React.createElement(SelectList, { title: picker.title, items: picker.items, onSelect: onPickerSelect, onCancel: onPickerCancel, maxVisible: Math.max(4, Math.min(10, size.rows - 10)) })) : (React.createElement(InputBar, { value: input, onChange: setInput, onSubmit: handleSubmit, disabled: busy })),
|
|
179
209
|
React.createElement(StatusBar, { model: activeModel, provider: activeProviderSpec.id, sessionId: session.sessionId ? session.sessionId.slice(0, 8) : '...', sessionActive: session.sessionActive, queueCount: chatTurn.queueCount, busy: busy, mode: mode, cwd: cwd, elapsedMs: timer.elapsedMs, lastMs: timer.lastMs })),
|
|
180
210
|
showSidebar && (React.createElement(Sidebar, { version: VERSION, changes: gitChanges, rows: size.rows })))));
|
|
181
211
|
}
|
package/dist/cli/app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/cli/app.tsx"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,+EAA+E;AAC/E,yEAAyE;AACzE,wCAAwC;AACxC,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAU,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/cli/app.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { Box, Text } from 'ink';
|
|
3
3
|
import { renderMessage } from './ChatStream.js';
|
|
4
|
+
import { WorkingIndicator } from './Spinner.js';
|
|
4
5
|
/**
|
|
5
6
|
* Max lines of the streaming bubble kept in the dynamic region. The full
|
|
6
7
|
* text is never lost — it lands complete in `<Static>` at finalize. This
|
|
@@ -21,14 +22,17 @@ const LIVE_STREAM_TAIL_LINES = 10;
|
|
|
21
22
|
* repaint → no flicker, by construction. Finalized messages live in the
|
|
22
23
|
* terminal's native scrollback via `<Static>` (printed exactly once).
|
|
23
24
|
*/
|
|
24
|
-
export function LiveRegion({ live, busy }) {
|
|
25
|
+
export function LiveRegion({ live, busy, elapsedMs = null }) {
|
|
25
26
|
const { streaming, runningTools } = live;
|
|
26
|
-
|
|
27
|
+
// v0.7.10: `busy` keeps the region alive so the animated WorkingIndicator
|
|
28
|
+
// shows between dispatch and the first streamed token / tool call. (The
|
|
29
|
+
// old check dropped `busy`, which made the fallback line dead code.)
|
|
30
|
+
if (!streaming && runningTools.length === 0 && !busy)
|
|
27
31
|
return null;
|
|
28
32
|
return (React.createElement(Box, { flexDirection: "column", paddingX: 1 },
|
|
29
33
|
streaming && streaming.role === 'assistant' && (React.createElement(StreamingTail, { id: streaming.id, content: streaming.content, ts: streaming.ts, memberName: streaming.memberName, memberId: streaming.memberId })),
|
|
30
34
|
runningTools.map((t) => (React.createElement(Box, { key: t.id, flexDirection: "column" }, renderMessage(t, true)))),
|
|
31
|
-
busy && runningTools.length === 0 && !streaming && (React.createElement(
|
|
35
|
+
busy && runningTools.length === 0 && !streaming && (React.createElement(WorkingIndicator, { elapsedMs: elapsedMs }))));
|
|
32
36
|
}
|
|
33
37
|
/**
|
|
34
38
|
* Render the streaming bubble, clamped to the last N content lines. A leading
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LiveRegion.js","sourceRoot":"","sources":["../../../src/cli/components/LiveRegion.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGhD;;;;;GAKG;AACH,MAAM,sBAAsB,GAAG,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"LiveRegion.js","sourceRoot":"","sources":["../../../src/cli/components/LiveRegion.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGhD;;;;;GAKG;AACH,MAAM,sBAAsB,GAAG,EAAE,CAAC;AASlC;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,UAAU,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,GAAG,IAAI,EAAmB;IAC1E,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC;IAEzC,0EAA0E;IAC1E,wEAAwE;IACxE,qEAAqE;IACrE,IAAI,CAAC,SAAS,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAElE,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC;QACpC,SAAS,IAAI,SAAS,CAAC,IAAI,KAAK,WAAW,IAAI,CAC9C,oBAAC,aAAa,IACZ,EAAE,EAAE,SAAS,CAAC,EAAE,EAChB,OAAO,EAAE,SAAS,CAAC,OAAO,EAC1B,EAAE,EAAE,SAAS,CAAC,EAAE,EAChB,UAAU,EAAE,SAAS,CAAC,UAAU,EAChC,QAAQ,EAAE,SAAS,CAAC,QAAQ,GAC5B,CACH;QACA,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CACvB,oBAAC,GAAG,IAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,aAAa,EAAC,QAAQ,IACnC,aAAa,CAAC,CAAC,EAAE,IAAI,CAAC,CACnB,CACP,CAAC;QACD,IAAI,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,CAClD,oBAAC,gBAAgB,IAAC,SAAS,EAAE,SAAS,GAAI,CAC3C,CACG,CACP,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAS,aAAa,CAAC,CAMtB;IACC,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,sBAAsB,CAAC;IACxD,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IACtE,OAAO,CACL,oBAAC,GAAG,IAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,aAAa,EAAC,QAAQ,EAAC,YAAY,EAAE,CAAC;QACpD,oBAAC,IAAI,IAAC,KAAK,EAAC,OAAO,EAAC,IAAI;;YAErB,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,oBAAC,IAAI,IAAC,KAAK,EAAC,SAAS;;gBAAK,CAAC,CAAC,UAAU,CAAQ,CAAC,CAAC,CAAC,IAAI,CAChE;QACP,oBAAC,GAAG,IAAC,UAAU,EAAE,CAAC,EAAE,aAAa,EAAC,QAAQ;YACvC,SAAS,IAAI,oBAAC,IAAI,IAAC,QAAQ,mBAAS;YACrC,oBAAC,IAAI,QAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAQ,CAC1B,CACF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import React, { useState } from 'react';
|
|
2
|
+
import { Box, Text, useInput, useStdin } from 'ink';
|
|
3
|
+
/**
|
|
4
|
+
* Pure windowing helper (exported for tests): index of the first visible
|
|
5
|
+
* item so the cursor stays roughly centered while the list scrolls.
|
|
6
|
+
*/
|
|
7
|
+
export function windowStart(index, count, maxVisible) {
|
|
8
|
+
if (count <= maxVisible)
|
|
9
|
+
return 0;
|
|
10
|
+
const half = Math.floor(maxVisible / 2);
|
|
11
|
+
return Math.max(0, Math.min(index - half, count - maxVisible));
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* SelectList — arrow-key picker rendered in the dynamic region (v0.7.10).
|
|
15
|
+
*
|
|
16
|
+
* Used by `/provider` and `/model` (no args) to make providers and models
|
|
17
|
+
* selectable instead of typed. The App swaps it in for the InputBar while
|
|
18
|
+
* open, so ink-text-input never competes for keystrokes. ↑/↓ move (with
|
|
19
|
+
* wrap-around), enter selects, esc cancels. Long lists scroll inside a
|
|
20
|
+
* `maxVisible` window so the dynamic region stays under a screen.
|
|
21
|
+
*/
|
|
22
|
+
export function SelectList({ title, items, onSelect, onCancel, maxVisible = 8, }) {
|
|
23
|
+
const firstCurrent = items.findIndex((i) => i.current);
|
|
24
|
+
const [index, setIndex] = useState(firstCurrent === -1 ? 0 : firstCurrent);
|
|
25
|
+
const { isRawModeSupported } = useStdin();
|
|
26
|
+
useInput((_input, key) => {
|
|
27
|
+
if (key.upArrow) {
|
|
28
|
+
setIndex((i) => (i - 1 + items.length) % items.length);
|
|
29
|
+
}
|
|
30
|
+
else if (key.downArrow) {
|
|
31
|
+
setIndex((i) => (i + 1) % items.length);
|
|
32
|
+
}
|
|
33
|
+
else if (key.return) {
|
|
34
|
+
const item = items[index];
|
|
35
|
+
if (item)
|
|
36
|
+
onSelect(item.value);
|
|
37
|
+
}
|
|
38
|
+
else if (key.escape) {
|
|
39
|
+
onCancel();
|
|
40
|
+
}
|
|
41
|
+
}, { isActive: isRawModeSupported === true });
|
|
42
|
+
const start = windowStart(index, items.length, maxVisible);
|
|
43
|
+
const visible = items.slice(start, start + maxVisible);
|
|
44
|
+
const below = items.length - (start + visible.length);
|
|
45
|
+
return (React.createElement(Box, { flexDirection: "column", borderStyle: "round", borderColor: "cyan", paddingX: 1 },
|
|
46
|
+
React.createElement(Text, { bold: true, color: "cyan" }, title),
|
|
47
|
+
start > 0 && React.createElement(Text, { dimColor: true },
|
|
48
|
+
" \u2191 ",
|
|
49
|
+
start,
|
|
50
|
+
" more"),
|
|
51
|
+
visible.map((item, i) => {
|
|
52
|
+
const selected = start + i === index;
|
|
53
|
+
return (React.createElement(Text, { key: item.value, wrap: "truncate", color: selected ? 'cyan' : undefined },
|
|
54
|
+
selected ? '❯ ' : ' ',
|
|
55
|
+
React.createElement(Text, { bold: selected }, item.label),
|
|
56
|
+
item.current ? React.createElement(Text, { color: "green" }, " \u2713") : null,
|
|
57
|
+
item.hint ? React.createElement(Text, { dimColor: true },
|
|
58
|
+
" ",
|
|
59
|
+
item.hint) : null));
|
|
60
|
+
}),
|
|
61
|
+
below > 0 && React.createElement(Text, { dimColor: true },
|
|
62
|
+
" \u2193 ",
|
|
63
|
+
below,
|
|
64
|
+
" more"),
|
|
65
|
+
React.createElement(Text, { dimColor: true }, "\u2191/\u2193 move \u00B7 enter select \u00B7 esc cancel")));
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=SelectList.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SelectList.js","sourceRoot":"","sources":["../../../src/cli/components/SelectList.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import React, { useEffect, useState } from 'react';
|
|
2
|
+
import { Text } from 'ink';
|
|
3
|
+
import { formatDuration } from '../utils/duration.js';
|
|
4
|
+
/** Braille spinner frames — one step every FRAME_MS. */
|
|
5
|
+
const FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
|
|
6
|
+
const FRAME_MS = 100;
|
|
7
|
+
/** Rotating activity verbs shown by <WorkingIndicator>, one every VERB_MS. */
|
|
8
|
+
const VERBS = ['thinking', 'working', 'reasoning', 'assembling'];
|
|
9
|
+
const VERB_MS = 2500;
|
|
10
|
+
/** Trailing-dots animation period (…→ . → .. → ...). */
|
|
11
|
+
const DOTS_MS = 400;
|
|
12
|
+
/**
|
|
13
|
+
* Shared ticker hook: increments every FRAME_MS while mounted. Both animated
|
|
14
|
+
* components derive spinner frame / verb / dots from the same counter so a
|
|
15
|
+
* single interval drives everything.
|
|
16
|
+
*/
|
|
17
|
+
function useTick() {
|
|
18
|
+
const [tick, setTick] = useState(0);
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
const id = setInterval(() => setTick((t) => t + 1), FRAME_MS);
|
|
21
|
+
return () => clearInterval(id);
|
|
22
|
+
}, []);
|
|
23
|
+
return tick;
|
|
24
|
+
}
|
|
25
|
+
/** Minimal animated braille spinner (single glyph, no label). */
|
|
26
|
+
export function Spinner({ color = 'yellow' }) {
|
|
27
|
+
const tick = useTick();
|
|
28
|
+
return React.createElement(Text, { color: color }, FRAMES[tick % FRAMES.length]);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* WorkingIndicator — replaces the static `⋯ working…` line (v0.7.10).
|
|
32
|
+
* Animated spinner + a verb that rotates every ~2.5s + trailing dots, plus
|
|
33
|
+
* the elapsed run time when the caller provides it. The motion makes it
|
|
34
|
+
* obvious the run is alive even before the first streamed token arrives.
|
|
35
|
+
*/
|
|
36
|
+
export function WorkingIndicator({ elapsedMs = null, }) {
|
|
37
|
+
const tick = useTick();
|
|
38
|
+
const frame = FRAMES[tick % FRAMES.length];
|
|
39
|
+
const verb = VERBS[Math.floor((tick * FRAME_MS) / VERB_MS) % VERBS.length];
|
|
40
|
+
const dots = '.'.repeat(1 + (Math.floor((tick * FRAME_MS) / DOTS_MS) % 3));
|
|
41
|
+
return (React.createElement(Text, { color: "yellow" },
|
|
42
|
+
frame,
|
|
43
|
+
" ",
|
|
44
|
+
verb,
|
|
45
|
+
dots,
|
|
46
|
+
typeof elapsedMs === 'number' ? (React.createElement(Text, { dimColor: true },
|
|
47
|
+
" (",
|
|
48
|
+
formatDuration(elapsedMs),
|
|
49
|
+
")")) : null));
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=Spinner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Spinner.js","sourceRoot":"","sources":["../../../src/cli/components/Spinner.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAC3B,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,wDAAwD;AACxD,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAU,CAAC;AAC3E,MAAM,QAAQ,GAAG,GAAG,CAAC;AAErB,8EAA8E;AAC9E,MAAM,KAAK,GAAG,CAAC,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,CAAU,CAAC;AAC1E,MAAM,OAAO,GAAG,IAAI,CAAC;AACrB,wDAAwD;AACxD,MAAM,OAAO,GAAG,GAAG,CAAC;AAEpB;;;;GAIG;AACH,SAAS,OAAO;IACd,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACpC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QAC9D,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IACjC,CAAC,EAAE,EAAE,CAAC,CAAC;IACP,OAAO,IAAI,CAAC;AACd,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,OAAO,CAAC,EAAE,KAAK,GAAG,QAAQ,EAAsB;IAC9D,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,OAAO,oBAAC,IAAI,IAAC,KAAK,EAAE,KAAK,IAAG,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAQ,CAAC;AACnE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,EAC/B,SAAS,GAAG,IAAI,GAGjB;IACC,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,QAAQ,CAAC,GAAG,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IAC3E,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,QAAQ,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC3E,OAAO,CACL,oBAAC,IAAI,IAAC,KAAK,EAAC,QAAQ;QACjB,KAAK;;QAAG,IAAI;QAAE,IAAI;QAClB,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,CAC/B,oBAAC,IAAI,IAAC,QAAQ;;YAAI,cAAc,CAAC,SAAS,CAAC;gBAAS,CACrD,CAAC,CAAC,CAAC,IAAI,CACH,CACR,CAAC;AACJ,CAAC"}
|
|
@@ -23,94 +23,94 @@ import { Box, Text, useInput, useStdin } from 'ink';
|
|
|
23
23
|
export const SPLASH_DURATION_MS = 2000;
|
|
24
24
|
// Downscaled from the source emblem (142×79) by block-averaging glyph
|
|
25
25
|
// density — see docs/plans/2026-07-03-cli-splash-screen.md.
|
|
26
|
-
const EMBLEM_LARGE = ` =%@*-
|
|
27
|
-
=%@@@@@#:
|
|
28
|
-
*%%%%%%@@%-
|
|
29
|
-
:#%%%%%%%%%@@*
|
|
30
|
-
:*%%%%%%%%%%%%%@%*.
|
|
31
|
-
=%%%%%%%%%%%%%%%%@@%.
|
|
32
|
-
=%%%%%%%%%%%%%%%%%%%@%-
|
|
33
|
-
*%%%%%%%%%%%%%%%%%%%%%@@=
|
|
34
|
-
.#%%%%%%%%@@@@@@@@%%%%%%@@@+
|
|
35
|
-
:#%%%%%%@@@@@@@@@@@@@@@%%%%@@+
|
|
36
|
-
-%%%%%@@@@@@@@@@@@@@@@@@@@@%%@@#.
|
|
37
|
-
-%%%%%@@@@@@@@@@@@@@@@@@@@@@@%%@@%:
|
|
38
|
-
=%%%%@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@%.
|
|
39
|
-
+%%%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@%:
|
|
40
|
-
=%%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@-
|
|
41
|
-
-%%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%:
|
|
42
|
-
:%%%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%
|
|
43
|
-
#%%%%%@@@@@@@@@@@@@@@%--#%@@@@@@@@@@@@@%%@@@=
|
|
44
|
-
#@@%%%%@@@@@@@@@@@@@@%: -*@@@@@@@@@@@%%@@@@=
|
|
45
|
-
#@@%%%%@@@@@@@@@@@@@%: .. -#@@@@@@@%%%%@@@=
|
|
46
|
-
+@@@%%%@@@@@@@@@@@@%: :#= =%@@@@%%%@@@%-
|
|
47
|
-
=@@@@%%%@@@@@@@@@@%: -%%*: +%@@%%@@@#
|
|
48
|
-
+%@@@@%%@@@@@@@@@%: -%@@%*=.:+#@@@@#:
|
|
49
|
-
.+*@@@@@@@@@%%%@@@@@@%: -%@@@@@#- +@@@@@@*=
|
|
50
|
-
=*%%%%@@@@@@@@@@@%%@@@@%: -#@@@@@@@*: :*@@@@@@%+=
|
|
51
|
-
-*%%%%%%%%%%@@@@@@@@@@@@@@@: -%@@@@@@@@#- -#@@@@@@@@*
|
|
52
|
-
#%%%%%%%%%%%%%@@@@@@@@@@@@@: -#@@@@@%+-::. *@@@@@@@@=
|
|
53
|
-
=%%%%%%%%%%%%%%%@@@@@@@@@@@@: :*+--=%#. :+++++*@@@@@@@@%
|
|
54
|
-
#@%%%%%%%%%%%%%@@@@@@@@@@@@%: .. - -## *@@@@@@@@@@@@@@=
|
|
55
|
-
:@@%%%%%%%%%%%%@@@@@@@@@@@@@%: .**= *%= :%@@@@@@@@@@@@@%
|
|
56
|
-
#@@@%%%%%%%%%%%@@@@@@@@@@@@@@- =#@@%- :**: =%@@@@@@@@@@@@@+
|
|
57
|
-
=@@@@@%%%@@%%%%@@@@@@@@@@@@@@@@@@@@@@%- :: .-#@@@@@@@@@@@@@%.
|
|
58
|
-
:@@@@@@%%@@@%%@@@@@@@@@@@@@@@@@@@@@@@@@%==*%%@@@@@@@@@@@@@@@@#
|
|
59
|
-
*@@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@:
|
|
60
|
-
:@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+
|
|
26
|
+
const EMBLEM_LARGE = ` =%@*-
|
|
27
|
+
=%@@@@@#:
|
|
28
|
+
*%%%%%%@@%-
|
|
29
|
+
:#%%%%%%%%%@@*
|
|
30
|
+
:*%%%%%%%%%%%%%@%*.
|
|
31
|
+
=%%%%%%%%%%%%%%%%@@%.
|
|
32
|
+
=%%%%%%%%%%%%%%%%%%%@%-
|
|
33
|
+
*%%%%%%%%%%%%%%%%%%%%%@@=
|
|
34
|
+
.#%%%%%%%%@@@@@@@@%%%%%%@@@+
|
|
35
|
+
:#%%%%%%@@@@@@@@@@@@@@@%%%%@@+
|
|
36
|
+
-%%%%%@@@@@@@@@@@@@@@@@@@@@%%@@#.
|
|
37
|
+
-%%%%%@@@@@@@@@@@@@@@@@@@@@@@%%@@%:
|
|
38
|
+
=%%%%@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@%.
|
|
39
|
+
+%%%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@%:
|
|
40
|
+
=%%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@-
|
|
41
|
+
-%%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%:
|
|
42
|
+
:%%%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%
|
|
43
|
+
#%%%%%@@@@@@@@@@@@@@@%--#%@@@@@@@@@@@@@%%@@@=
|
|
44
|
+
#@@%%%%@@@@@@@@@@@@@@%: -*@@@@@@@@@@@%%@@@@=
|
|
45
|
+
#@@%%%%@@@@@@@@@@@@@%: .. -#@@@@@@@%%%%@@@=
|
|
46
|
+
+@@@%%%@@@@@@@@@@@@%: :#= =%@@@@%%%@@@%-
|
|
47
|
+
=@@@@%%%@@@@@@@@@@%: -%%*: +%@@%%@@@#
|
|
48
|
+
+%@@@@%%@@@@@@@@@%: -%@@%*=.:+#@@@@#:
|
|
49
|
+
.+*@@@@@@@@@%%%@@@@@@%: -%@@@@@#- +@@@@@@*=
|
|
50
|
+
=*%%%%@@@@@@@@@@@%%@@@@%: -#@@@@@@@*: :*@@@@@@%+=
|
|
51
|
+
-*%%%%%%%%%%@@@@@@@@@@@@@@@: -%@@@@@@@@#- -#@@@@@@@@*
|
|
52
|
+
#%%%%%%%%%%%%%@@@@@@@@@@@@@: -#@@@@@%+-::. *@@@@@@@@=
|
|
53
|
+
=%%%%%%%%%%%%%%%@@@@@@@@@@@@: :*+--=%#. :+++++*@@@@@@@@%
|
|
54
|
+
#@%%%%%%%%%%%%%@@@@@@@@@@@@%: .. - -## *@@@@@@@@@@@@@@=
|
|
55
|
+
:@@%%%%%%%%%%%%@@@@@@@@@@@@@%: .**= *%= :%@@@@@@@@@@@@@%
|
|
56
|
+
#@@@%%%%%%%%%%%@@@@@@@@@@@@@@- =#@@%- :**: =%@@@@@@@@@@@@@+
|
|
57
|
+
=@@@@@%%%@@%%%%@@@@@@@@@@@@@@@@@@@@@@%- :: .-#@@@@@@@@@@@@@%.
|
|
58
|
+
:@@@@@@%%@@@%%@@@@@@@@@@@@@@@@@@@@@@@@@%==*%%@@@@@@@@@@@@@@@@#
|
|
59
|
+
*@@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@:
|
|
60
|
+
:@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+
|
|
61
61
|
=##########*######**##**#*********##**#*#######################*`;
|
|
62
|
-
const EMBLEM_SMALL = ` =%%*:
|
|
63
|
-
:#%%@@@+
|
|
64
|
-
=%%%%%%%@#.
|
|
65
|
-
.*%%%%%%%%%@%-
|
|
66
|
-
=%%%%%%%%%%%%%@*.
|
|
67
|
-
+%%%%%%@@@@@%%%%@%:
|
|
68
|
-
*%%%%@@@@@@@@@@@%%@%:
|
|
69
|
-
*%%%@@@@@@@@@@@@@@@%@%-
|
|
70
|
-
:#%%@@@@@@@@@@@@@@@@@@@@@+
|
|
71
|
-
:%%%@@@@@@@@@@@@@@@@@@@@@@@+
|
|
72
|
-
#%%@@@@@@@@@@@@@@@@@@@@@@@@@-
|
|
73
|
-
+%%@@@@@@@@@@@@#@@@@@@@@@@@@@%:
|
|
74
|
-
%%%%@@@@@@@@@@%::*@@@@@@@@@%@@=
|
|
75
|
-
-%@%%@@@@@@@@@%:.::*@@@@@%%@@*.
|
|
76
|
-
:%@@%%@@@@@@@%.:%#::*@@%@@@-
|
|
77
|
-
:#@@@%@@@@@@%.:%@%+.-#@@@=
|
|
78
|
-
:+#@@@@@@@%@@@@%.:%@@@%=.+@@@%*-
|
|
79
|
-
.*#%%%%%%@@@@@@@@@@.:%@@@@@*:.+%@@@@#-
|
|
80
|
-
+%%%%%%%%%%@@@@@@@@::##*%* :----%@@@@%.
|
|
81
|
-
.@%%%%%%%%%@@@@@@@@@:.-..-#=:%@@@@@@@@@+
|
|
82
|
-
*@@%%%%%%%%@@@@@@@@@: =#+ +#.-@@@@@@@@@@.
|
|
83
|
-
-@@@%%%%%%%@@@@@@@@@@#%@@@- -.:*@@@@@@@@@*
|
|
84
|
-
%@@@@%@@%@@@@@@@@@@@@@@@@@%**%@@@@@@@@@@@@:
|
|
62
|
+
const EMBLEM_SMALL = ` =%%*:
|
|
63
|
+
:#%%@@@+
|
|
64
|
+
=%%%%%%%@#.
|
|
65
|
+
.*%%%%%%%%%@%-
|
|
66
|
+
=%%%%%%%%%%%%%@*.
|
|
67
|
+
+%%%%%%@@@@@%%%%@%:
|
|
68
|
+
*%%%%@@@@@@@@@@@%%@%:
|
|
69
|
+
*%%%@@@@@@@@@@@@@@@%@%-
|
|
70
|
+
:#%%@@@@@@@@@@@@@@@@@@@@@+
|
|
71
|
+
:%%%@@@@@@@@@@@@@@@@@@@@@@@+
|
|
72
|
+
#%%@@@@@@@@@@@@@@@@@@@@@@@@@-
|
|
73
|
+
+%%@@@@@@@@@@@@#@@@@@@@@@@@@@%:
|
|
74
|
+
%%%%@@@@@@@@@@%::*@@@@@@@@@%@@=
|
|
75
|
+
-%@%%@@@@@@@@@%:.::*@@@@@%%@@*.
|
|
76
|
+
:%@@%%@@@@@@@%.:%#::*@@%@@@-
|
|
77
|
+
:#@@@%@@@@@@%.:%@%+.-#@@@=
|
|
78
|
+
:+#@@@@@@@%@@@@%.:%@@@%=.+@@@%*-
|
|
79
|
+
.*#%%%%%%@@@@@@@@@@.:%@@@@@*:.+%@@@@#-
|
|
80
|
+
+%%%%%%%%%%@@@@@@@@::##*%* :----%@@@@%.
|
|
81
|
+
.@%%%%%%%%%@@@@@@@@@:.-..-#=:%@@@@@@@@@+
|
|
82
|
+
*@@%%%%%%%%@@@@@@@@@: =#+ +#.-@@@@@@@@@@.
|
|
83
|
+
-@@@%%%%%%%@@@@@@@@@@#%@@@- -.:*@@@@@@@@@*
|
|
84
|
+
%@@@@%@@%@@@@@@@@@@@@@@@@@%**%@@@@@@@@@@@@:
|
|
85
85
|
=@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*`;
|
|
86
|
-
const EMBLEM_TINY = ` -%%+
|
|
87
|
-
.*%%%@#:
|
|
88
|
-
=%%%%%%%@*
|
|
89
|
-
+%%%%%%%%%%#.
|
|
90
|
-
+%%%@@@@@@@%@#.
|
|
91
|
-
.*%@@@@@@@@@@@@@%-
|
|
92
|
-
.#%@@@@@@@@@@@@@@@@-
|
|
93
|
-
*%@@@@@@@@@@@@@@@@@%.
|
|
94
|
-
:@%%@@@@@@%:+%@@@@@%@=
|
|
95
|
-
=@%%@@@@@%.=-+%@%%@*
|
|
96
|
-
.=@@%@@@@%.*@*-+@@*.
|
|
97
|
-
-*%@@@@@@@@%.*@@@+:#@@#=.
|
|
98
|
-
*%%%%%%@@@@@@.*#%#=-:+@@@%
|
|
99
|
-
:@%%%%%%@@@@@@.:=.*:*@@@@@@=
|
|
100
|
-
*@%%@%%@@@@@@@*%@*:-:%@@@@@%.
|
|
101
|
-
:@@@%@@@@@@@@@@@@@@#%@@@@@@@@=
|
|
86
|
+
const EMBLEM_TINY = ` -%%+
|
|
87
|
+
.*%%%@#:
|
|
88
|
+
=%%%%%%%@*
|
|
89
|
+
+%%%%%%%%%%#.
|
|
90
|
+
+%%%@@@@@@@%@#.
|
|
91
|
+
.*%@@@@@@@@@@@@@%-
|
|
92
|
+
.#%@@@@@@@@@@@@@@@@-
|
|
93
|
+
*%@@@@@@@@@@@@@@@@@%.
|
|
94
|
+
:@%%@@@@@@%:+%@@@@@%@=
|
|
95
|
+
=@%%@@@@@%.=-+%@%%@*
|
|
96
|
+
.=@@%@@@@%.*@*-+@@*.
|
|
97
|
+
-*%@@@@@@@@%.*@@@+:#@@#=.
|
|
98
|
+
*%%%%%%@@@@@@.*#%#=-:+@@@%
|
|
99
|
+
:@%%%%%%@@@@@@.:=.*:*@@@@@@=
|
|
100
|
+
*@%%@%%@@@@@@@*%@*:-:%@@@@@%.
|
|
101
|
+
:@@@%@@@@@@@@@@@@@@#%@@@@@@@@=
|
|
102
102
|
*%%%%%%%%%%%%%%%%%%%%%%%%%%%%#`;
|
|
103
|
-
const EMBLEM_MICRO = ` -#%=
|
|
104
|
-
+%%%%#.
|
|
105
|
-
:#%%%%%%%-
|
|
106
|
-
:%%@@@@@@@@=
|
|
107
|
-
-%@@@@@@@@@@@+
|
|
108
|
-
:%@@@@@@%@@@@@@=
|
|
109
|
-
-%%@@@@@.+%@@%@+
|
|
110
|
-
-@@@@@@:%++%@=
|
|
111
|
-
=*%@@@@@@:@@%=*@#+.
|
|
112
|
-
=%%%%%@@@@:+++-*%@@*
|
|
113
|
-
.%%%%%@@@@@+%+=:%@@@@:
|
|
103
|
+
const EMBLEM_MICRO = ` -#%=
|
|
104
|
+
+%%%%#.
|
|
105
|
+
:#%%%%%%%-
|
|
106
|
+
:%%@@@@@@@@=
|
|
107
|
+
-%@@@@@@@@@@@+
|
|
108
|
+
:%@@@@@@%@@@@@@=
|
|
109
|
+
-%%@@@@@.+%@@%@+
|
|
110
|
+
-@@@@@@:%++%@=
|
|
111
|
+
=*%@@@@@@:@@%=*@#+.
|
|
112
|
+
=%%%%%@@@@:+++-*%@@*
|
|
113
|
+
.%%%%%@@@@@+%+=:%@@@@:
|
|
114
114
|
*@@@@@@@@@@@@@%@@@@@@*`;
|
|
115
115
|
/** Rows the FULL footer (margin + wordmark + version + hint) needs below the art. */
|
|
116
116
|
const FOOTER_ROWS_FULL = 5;
|