bkper 5.1.0 → 5.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.md +16 -0
- package/lib/agent/extensions/bkper-ai-provider.d.ts.map +1 -1
- package/lib/agent/extensions/bkper-ai-provider.js +46 -17
- package/lib/agent/extensions/bkper-ai-provider.js.map +1 -1
- package/lib/agent/extensions/builtins.d.ts +2 -2
- package/lib/agent/extensions/builtins.d.ts.map +1 -1
- package/lib/agent/extensions/builtins.js +10 -2
- package/lib/agent/extensions/builtins.js.map +1 -1
- package/lib/agent/extensions/core-concepts-preload.d.ts +16 -4
- package/lib/agent/extensions/core-concepts-preload.d.ts.map +1 -1
- package/lib/agent/extensions/core-concepts-preload.js +77 -47
- package/lib/agent/extensions/core-concepts-preload.js.map +1 -1
- package/lib/agent/extensions/startup-logo.d.ts +12 -0
- package/lib/agent/extensions/startup-logo.d.ts.map +1 -0
- package/lib/agent/extensions/startup-logo.js +101 -0
- package/lib/agent/extensions/startup-logo.js.map +1 -0
- package/lib/agent/extensions/startup.d.ts +2 -2
- package/lib/agent/extensions/startup.d.ts.map +1 -1
- package/lib/agent/extensions/startup.js +82 -35
- package/lib/agent/extensions/startup.js.map +1 -1
- package/lib/agent/interactive/logo-3d.d.ts +125 -0
- package/lib/agent/interactive/logo-3d.d.ts.map +1 -0
- package/lib/agent/interactive/logo-3d.js +1187 -0
- package/lib/agent/interactive/logo-3d.js.map +1 -0
- package/lib/agent/interactive/prompt-history-store.d.ts +1 -0
- package/lib/agent/interactive/prompt-history-store.d.ts.map +1 -1
- package/lib/agent/interactive/prompt-history-store.js +19 -5
- package/lib/agent/interactive/prompt-history-store.js.map +1 -1
- package/lib/agent/interactive/run-agent-mode.d.ts.map +1 -1
- package/lib/agent/interactive/run-agent-mode.js +5 -2
- package/lib/agent/interactive/run-agent-mode.js.map +1 -1
- package/lib/agent/interactive/settings.d.ts +26 -4
- package/lib/agent/interactive/settings.d.ts.map +1 -1
- package/lib/agent/interactive/settings.js +106 -16
- package/lib/agent/interactive/settings.js.map +1 -1
- package/lib/agent/interactive/themes.d.ts +13 -0
- package/lib/agent/interactive/themes.d.ts.map +1 -0
- package/lib/agent/interactive/themes.js +36 -0
- package/lib/agent/interactive/themes.js.map +1 -0
- package/lib/agent/system-prompt.d.ts.map +1 -1
- package/lib/agent/system-prompt.js +42 -8
- package/lib/agent/system-prompt.js.map +1 -1
- package/lib/agent/themes/bkper-dark.json +80 -0
- package/lib/agent/themes/bkper-light.json +80 -0
- package/lib/cli.js +1 -1
- package/lib/cli.js.map +1 -1
- package/lib/commands/agent-command.d.ts.map +1 -1
- package/lib/commands/agent-command.js +2 -1
- package/lib/commands/agent-command.js.map +1 -1
- package/lib/docs/ai/decision-models.md +316 -0
- package/lib/docs/apps/ai.md +120 -88
- package/lib/docs/apps/overview.md +1 -1
- package/lib/docs/index.md +2 -1
- package/package.json +7 -5
|
@@ -7,13 +7,16 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
7
7
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
8
|
});
|
|
9
9
|
};
|
|
10
|
-
import { getKeybindings } from '@earendil-works/pi-tui';
|
|
10
|
+
import { getKeybindings, truncateToWidth, visibleWidth, } from '@earendil-works/pi-tui';
|
|
11
11
|
import { getShellConfig, keyText, VERSION as PI_VERSION, } from '@earendil-works/pi-coding-agent';
|
|
12
12
|
import { PROMPT_HISTORY_SHORTCUT } from '../interactive/prompt-history-shortcut.js';
|
|
13
13
|
import { formatBkperSessionCommandShortcut, isShortcutClaimedByUserBinding, } from '../interactive/session-keybindings.js';
|
|
14
14
|
import { runStartupMaintenance } from '../startup-maintenance.js';
|
|
15
15
|
import { getBkperHandoffShortcut } from './handoff.js';
|
|
16
|
+
import { playLogo3d } from '../interactive/logo-3d.js';
|
|
17
|
+
import { BKPER_MARK_LOGO, getBkperLogoLines } from './startup-logo.js';
|
|
16
18
|
const STARTUP_LEFT_PADDING = ' ';
|
|
19
|
+
const HINT_COLUMN_GAP = ' ';
|
|
17
20
|
const NO_MODELS_STARTUP_HINT = 'No AI model provider configured. Use /login for Bkper AI or /connect for another ' +
|
|
18
21
|
'model provider.';
|
|
19
22
|
function wrapStartupHeaderLine(line, width) {
|
|
@@ -55,16 +58,29 @@ function wrapStartupHeaderLine(line, width) {
|
|
|
55
58
|
}
|
|
56
59
|
return wrappedLines;
|
|
57
60
|
}
|
|
58
|
-
|
|
59
|
-
'
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
61
|
+
function formatStartupHint(theme, hint) {
|
|
62
|
+
return theme.fg('accent', hint.key) + theme.fg('muted', ` ${hint.description}`);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Lays hints out in two columns when both fit in the width, filling the left column first so
|
|
66
|
+
* related hints stay together; otherwise one column.
|
|
67
|
+
*/
|
|
68
|
+
function layoutStartupHints(theme, hints, width) {
|
|
69
|
+
const cells = hints.map(hint => formatStartupHint(theme, hint));
|
|
70
|
+
const leftCount = Math.ceil(cells.length / 2);
|
|
71
|
+
const left = cells.slice(0, leftCount);
|
|
72
|
+
const right = cells.slice(leftCount);
|
|
73
|
+
const leftWidth = Math.max(0, ...left.map(visibleWidth));
|
|
74
|
+
const rightWidth = Math.max(0, ...right.map(visibleWidth));
|
|
75
|
+
if (leftWidth + HINT_COLUMN_GAP.length + rightWidth > width) {
|
|
76
|
+
return cells;
|
|
77
|
+
}
|
|
78
|
+
return left.map((cell, index) => {
|
|
79
|
+
const rightCell = right[index];
|
|
80
|
+
return rightCell === undefined
|
|
81
|
+
? cell
|
|
82
|
+
: cell + ' '.repeat(leftWidth - visibleWidth(cell)) + HINT_COLUMN_GAP + rightCell;
|
|
83
|
+
});
|
|
68
84
|
}
|
|
69
85
|
function isBashAvailable(shellPath) {
|
|
70
86
|
try {
|
|
@@ -79,46 +95,77 @@ function formatHandoffStartupCommand() {
|
|
|
79
95
|
const shortcut = getBkperHandoffShortcut(getKeybindings().getResolvedBindings());
|
|
80
96
|
return shortcut ? `/handoff (${shortcut})` : '/handoff';
|
|
81
97
|
}
|
|
98
|
+
function getStartupHints(showBashShortcut) {
|
|
99
|
+
const showPromptHistory = !isShortcutClaimedByUserBinding(getKeybindings().getUserBindings(), undefined, PROMPT_HISTORY_SHORTCUT);
|
|
100
|
+
return [
|
|
101
|
+
{ key: keyText('app.interrupt'), description: 'to interrupt' },
|
|
102
|
+
{ key: keyText('app.clear'), description: 'to clear' },
|
|
103
|
+
{ key: `${keyText('app.clear')} twice`, description: 'to exit' },
|
|
104
|
+
...(showPromptHistory
|
|
105
|
+
? [{ key: PROMPT_HISTORY_SHORTCUT, description: 'to search prompt history' }]
|
|
106
|
+
: []),
|
|
107
|
+
{ key: '/', description: 'for commands' },
|
|
108
|
+
...(showBashShortcut ? [{ key: '!', description: 'to run bash' }] : []),
|
|
109
|
+
{ key: '/new', description: 'to start new session' },
|
|
110
|
+
{
|
|
111
|
+
key: formatBkperSessionCommandShortcut('/resume', 'app.session.resume'),
|
|
112
|
+
description: 'to resume a session',
|
|
113
|
+
},
|
|
114
|
+
{ key: '/clone', description: 'to duplicate session' },
|
|
115
|
+
{
|
|
116
|
+
key: formatBkperSessionCommandShortcut('/fork', 'app.session.fork'),
|
|
117
|
+
description: 'to branch from a message',
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
key: formatBkperSessionCommandShortcut('/tree', 'app.session.tree'),
|
|
121
|
+
description: 'for session tree',
|
|
122
|
+
},
|
|
123
|
+
{ key: formatHandoffStartupCommand(), description: 'to continue in a focused session' },
|
|
124
|
+
];
|
|
125
|
+
}
|
|
82
126
|
function buildStartupHeaderLines(theme, modelRegistry, width, showBashShortcut) {
|
|
127
|
+
const contentWidth = Math.max(1, width - STARTUP_LEFT_PADDING.length);
|
|
128
|
+
const logo = getBkperLogoLines(contentWidth, theme.getColorMode());
|
|
83
129
|
const lines = [
|
|
84
|
-
...
|
|
85
|
-
|
|
130
|
+
...logo,
|
|
131
|
+
...(logo.length > 0 ? [''] : []),
|
|
132
|
+
theme.fg('muted', 'powered by ') + theme.fg('dim', `pi v${PI_VERSION}`),
|
|
86
133
|
'',
|
|
87
|
-
|
|
88
|
-
formatStartupHint(theme, keyText('app.clear'), 'to clear'),
|
|
89
|
-
formatStartupHint(theme, `${keyText('app.clear')} twice`, 'to exit'),
|
|
90
|
-
...(!isShortcutClaimedByUserBinding(getKeybindings().getUserBindings(), undefined, PROMPT_HISTORY_SHORTCUT)
|
|
91
|
-
? [
|
|
92
|
-
formatStartupHint(theme, PROMPT_HISTORY_SHORTCUT, 'to search prompt history'),
|
|
93
|
-
]
|
|
94
|
-
: []),
|
|
95
|
-
formatStartupHint(theme, '/', 'for commands'),
|
|
96
|
-
formatStartupHint(theme, '/new', 'to start new session'),
|
|
97
|
-
formatStartupHint(theme, formatBkperSessionCommandShortcut('/resume', 'app.session.resume'), 'to resume a session'),
|
|
98
|
-
formatStartupHint(theme, '/clone', 'to duplicate session'),
|
|
99
|
-
formatStartupHint(theme, formatBkperSessionCommandShortcut('/fork', 'app.session.fork'), 'to branch from a message'),
|
|
100
|
-
formatStartupHint(theme, formatBkperSessionCommandShortcut('/tree', 'app.session.tree'), 'for session tree'),
|
|
101
|
-
formatStartupHint(theme, formatHandoffStartupCommand(), 'to continue in a focused session'),
|
|
134
|
+
...layoutStartupHints(theme, getStartupHints(showBashShortcut), contentWidth),
|
|
102
135
|
];
|
|
103
|
-
if (showBashShortcut) {
|
|
104
|
-
lines.push(formatStartupHint(theme, '!', 'to run bash'));
|
|
105
|
-
}
|
|
106
136
|
if (modelRegistry.getAvailable().length === 0) {
|
|
107
|
-
lines.push('', ...wrapStartupHeaderLine(NO_MODELS_STARTUP_HINT,
|
|
137
|
+
lines.push('', ...wrapStartupHeaderLine(NO_MODELS_STARTUP_HINT, contentWidth).map(line => theme.fg('warning', line)));
|
|
108
138
|
}
|
|
109
|
-
|
|
139
|
+
// The TUI rejects lines wider than the terminal, so narrow terminals truncate hints.
|
|
140
|
+
return lines.map(line => line.length > 0 ? STARTUP_LEFT_PADDING + truncateToWidth(line, contentWidth) : line);
|
|
110
141
|
}
|
|
111
142
|
function createStartupHeaderFactory(modelRegistry, showBashShortcut) {
|
|
112
|
-
return (
|
|
143
|
+
return (tui, theme) => ({
|
|
113
144
|
render: (width) => buildStartupHeaderLines(theme, modelRegistry, width, showBashShortcut),
|
|
114
145
|
invalidate: () => { },
|
|
146
|
+
// Clicking anywhere on the header plays the 3D logo easter egg in fullscreen mode. Nothing in the
|
|
147
|
+
// header is clickable otherwise, and drag-selecting its text does not produce a click.
|
|
148
|
+
handleMouse: (event) => {
|
|
149
|
+
const contentWidth = event.width - STARTUP_LEFT_PADDING.length;
|
|
150
|
+
if (event.type !== 'click' || event.button !== 'left')
|
|
151
|
+
return undefined;
|
|
152
|
+
if (getBkperLogoLines(contentWidth, theme.getColorMode()).length === 0)
|
|
153
|
+
return undefined;
|
|
154
|
+
// The logo is the header's first line, after the left padding.
|
|
155
|
+
const origin = {
|
|
156
|
+
column: event.screenX - event.x + STARTUP_LEFT_PADDING.length,
|
|
157
|
+
row: event.screenY - event.y,
|
|
158
|
+
};
|
|
159
|
+
return playLogo3d(tui, theme, BKPER_MARK_LOGO, origin) ? { handled: true } : undefined;
|
|
160
|
+
},
|
|
115
161
|
});
|
|
116
162
|
}
|
|
117
163
|
export function registerBkperAgentStartupExtension(pi, startupMaintenance = runStartupMaintenance, settingsManager, bkperAiBaseUrlOverride, bashAvailable) {
|
|
118
164
|
let startupMaintenanceTriggered = false;
|
|
119
165
|
pi.on('session_start', (_event, ctx) => __awaiter(this, void 0, void 0, function* () {
|
|
120
166
|
var _a, _b, _c, _d;
|
|
121
|
-
|
|
167
|
+
// quietStartup "header" keeps the header (logo, version, key hints); only true hides it.
|
|
168
|
+
if ((settingsManager === null || settingsManager === void 0 ? void 0 : settingsManager.getQuietStartup()) !== true) {
|
|
122
169
|
const showBashShortcut = bashAvailable !== null && bashAvailable !== void 0 ? bashAvailable : (((_c = (_b = (_a = settingsManager === null || settingsManager === void 0 ? void 0 : settingsManager.getDefaultTools) === null || _a === void 0 ? void 0 : _a.call(settingsManager)) === null || _b === void 0 ? void 0 : _b.includes('bash')) !== null && _c !== void 0 ? _c : true) &&
|
|
123
170
|
isBashAvailable((_d = settingsManager === null || settingsManager === void 0 ? void 0 : settingsManager.getShellPath) === null || _d === void 0 ? void 0 : _d.call(settingsManager)));
|
|
124
171
|
ctx.ui.setHeader(createStartupHeaderFactory(ctx.modelRegistry, showBashShortcut));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"startup.js","sourceRoot":"","sources":["../../../src/agent/extensions/startup.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"startup.js","sourceRoot":"","sources":["../../../src/agent/extensions/startup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import type { Theme } from '@earendil-works/pi-coding-agent';
|
|
2
|
+
import { type Color, type Component, type TerminalColorMode, type TUI, type TuiMouseEvent, type TuiMouseEventResult } from '@earendil-works/pi-tui';
|
|
3
|
+
/**
|
|
4
|
+
* Fullscreen 3D logo easter egg, played by clicking the header logo. The logo bitmap is built from one block per
|
|
5
|
+
* pixel. The current screen dissolves into braille dust while the model spins in the center and its blocks play a
|
|
6
|
+
* sliding puzzle. Leaving plays the same timeline backwards, so the screen reassembles.
|
|
7
|
+
*
|
|
8
|
+
* The logo lifts off the header, flies to the center, and grows; the dust spreads out from the header logo.
|
|
9
|
+
*
|
|
10
|
+
* The blocks are ray cast per braille dot. A braille cell holds 2x4 roughly square dots, so one pixel of a
|
|
11
|
+
* half-block bitmap is exactly 2x2 dots, and the header logo is drawn at its exact size when it lifts off.
|
|
12
|
+
*
|
|
13
|
+
* Adapted from Pi's 3D logo easter egg (MIT License, Copyright (c) Mario Zechner), from
|
|
14
|
+
* packages/coding-agent/src/modes/interactive/components/easter-egg-3d.ts at pi commit c450f2c0f8. Pi does not
|
|
15
|
+
* export it; if it ever does, replace this copy with the export. Changes from upstream: the model is built from any
|
|
16
|
+
* half-block pixel logo instead of the pi logo or Armin, and theme colors are resolved once into a palette because
|
|
17
|
+
* Pi's theme singleton is internal.
|
|
18
|
+
*/
|
|
19
|
+
export type Rgb = readonly [number, number, number];
|
|
20
|
+
/** Grid position of a block: column and row in the bitmap, and layer (-1, 0, 1) in depth. */
|
|
21
|
+
type Cell3 = readonly [number, number, number];
|
|
22
|
+
/** A bitmap built from one block per foreground pixel. Each is a block that the puzzle slides around. */
|
|
23
|
+
export interface Model {
|
|
24
|
+
/** Bitmap size in pixels. */
|
|
25
|
+
columns: number;
|
|
26
|
+
rows: number;
|
|
27
|
+
blocks: Array<{
|
|
28
|
+
home: Cell3;
|
|
29
|
+
color: Rgb;
|
|
30
|
+
}>;
|
|
31
|
+
/** Camera distance from the model's center, in pixels. */
|
|
32
|
+
cameraDistance: number;
|
|
33
|
+
/** Farthest distance of any block corner from the center, with blocks on the outer depth layers. */
|
|
34
|
+
radius: number;
|
|
35
|
+
/** Largest share of the screen width the spinning model covers. */
|
|
36
|
+
widthShare: number;
|
|
37
|
+
/** Number of blocks the puzzle moves per step, given a random number from 0 to 1. */
|
|
38
|
+
puzzleMoves: (random: number) => number;
|
|
39
|
+
/**
|
|
40
|
+
* Top-left cell of the model's half-block rendering on screen. The model lifts off from there and replaces it.
|
|
41
|
+
* Undefined to grow out of the center.
|
|
42
|
+
*/
|
|
43
|
+
origin: {
|
|
44
|
+
column: number;
|
|
45
|
+
row: number;
|
|
46
|
+
} | undefined;
|
|
47
|
+
}
|
|
48
|
+
/** A logo as square pixels, one character per pixel and '.' for transparent, rendered with half blocks. */
|
|
49
|
+
export interface PixelLogo {
|
|
50
|
+
pixels: readonly string[];
|
|
51
|
+
colors: Readonly<Record<string, Color>>;
|
|
52
|
+
}
|
|
53
|
+
/** Top-left cell of a logo's half-block rendering on screen. */
|
|
54
|
+
export interface LogoOrigin {
|
|
55
|
+
column: number;
|
|
56
|
+
row: number;
|
|
57
|
+
}
|
|
58
|
+
/** The 3D model of a pixel logo that lifts off its half-block rendering at `origin`. */
|
|
59
|
+
export declare function createLogoModel(logo: PixelLogo, origin: LogoOrigin): Model;
|
|
60
|
+
/** Colors the animation fades between, resolved from the terminal and theme when it starts. */
|
|
61
|
+
export interface Logo3dPalette {
|
|
62
|
+
foreground: Rgb;
|
|
63
|
+
background: Rgb;
|
|
64
|
+
/** The key and the text of the "escape to return" hint. */
|
|
65
|
+
hintKey: Rgb;
|
|
66
|
+
hintText: Rgb;
|
|
67
|
+
colorMode: TerminalColorMode;
|
|
68
|
+
}
|
|
69
|
+
/** The part of the TUI the animation drives. */
|
|
70
|
+
export type Logo3dHost = Pick<TUI, 'requestRender'> & {
|
|
71
|
+
readonly terminal: {
|
|
72
|
+
readonly rows: number;
|
|
73
|
+
};
|
|
74
|
+
};
|
|
75
|
+
/**
|
|
76
|
+
* Plays the logo lifting off its half-block rendering at `origin`. Only fullscreen mode can show it, because it
|
|
77
|
+
* dissolves the rendered screen, which is captured right away. Returns false when it cannot play.
|
|
78
|
+
*/
|
|
79
|
+
export declare function playLogo3d(tui: unknown, theme: Theme, logo: PixelLogo, origin: LogoOrigin): boolean;
|
|
80
|
+
export declare class Logo3dAnimation implements Component {
|
|
81
|
+
private readonly tui;
|
|
82
|
+
/** The screen to dissolve, as rendered lines. */
|
|
83
|
+
private readonly screen;
|
|
84
|
+
private readonly model;
|
|
85
|
+
private readonly foreground;
|
|
86
|
+
private readonly background;
|
|
87
|
+
private readonly palette;
|
|
88
|
+
private readonly onDone;
|
|
89
|
+
private readonly startTime;
|
|
90
|
+
private lastRender;
|
|
91
|
+
private timer;
|
|
92
|
+
private exit;
|
|
93
|
+
private shuffle;
|
|
94
|
+
private screenWidth;
|
|
95
|
+
private screenHeight;
|
|
96
|
+
/** Star per cell index, or undefined. */
|
|
97
|
+
private stars;
|
|
98
|
+
private cells;
|
|
99
|
+
private readonly ansiCache;
|
|
100
|
+
private readonly raster;
|
|
101
|
+
constructor(tui: Logo3dHost, screen: readonly string[], model: Model, palette: Logo3dPalette, onDone: () => void);
|
|
102
|
+
/** Play the exit animation. A second call skips it. */
|
|
103
|
+
close(): void;
|
|
104
|
+
handleInput(data: string): void;
|
|
105
|
+
handleMouse(event: TuiMouseEvent): TuiMouseEventResult;
|
|
106
|
+
invalidate(): void;
|
|
107
|
+
render(width: number): string[];
|
|
108
|
+
private elapsed;
|
|
109
|
+
private exitProgress;
|
|
110
|
+
private finish;
|
|
111
|
+
/** Each block's displacement from its place in the model at `time`, in grid units. */
|
|
112
|
+
private blockOffsets;
|
|
113
|
+
private flyProgress;
|
|
114
|
+
private starAlpha;
|
|
115
|
+
private hintAlpha;
|
|
116
|
+
private pose;
|
|
117
|
+
private hint;
|
|
118
|
+
/** A sparse, deterministic starfield: one braille dot in about STAR_DENSITY of all cells. */
|
|
119
|
+
private prepareStars;
|
|
120
|
+
private prepareCells;
|
|
121
|
+
private pack;
|
|
122
|
+
private ansi;
|
|
123
|
+
}
|
|
124
|
+
export {};
|
|
125
|
+
//# sourceMappingURL=logo-3d.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logo-3d.d.ts","sourceRoot":"","sources":["../../../src/agent/interactive/logo-3d.ts"],"names":[],"mappings":"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"}
|