@felan-ai/ext-prompt-history 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Felan contributors
4
+ Copyright (c) 2026 Milko Slavov
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ of this software and associated documentation files (the "Software"), to deal
8
+ in the Software without restriction, including without limitation the rights
9
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ copies of the Software, and to permit persons to whom the Software is
11
+ furnished to do so, subject to the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be included in all
14
+ copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ SOFTWARE.
package/NOTICE ADDED
@@ -0,0 +1,11 @@
1
+ @felan-ai/ext-prompt-history
2
+
3
+ Includes code adapted from packages/pi-prompt-history in
4
+ https://github.com/mslavov/pi-extensions at source commit
5
+ 7e72e509fe45a5a87c4c2e176cb711de994a8c1d.
6
+
7
+ Copyright (c) 2026 Milko Slavov
8
+ Licensed under the MIT License included in this package.
9
+
10
+ This package uses @earendil-works/pi-tui 0.84.3 (Pi-TUI 0.84.3), licensed under
11
+ the MIT License.
package/README.md ADDED
@@ -0,0 +1,46 @@
1
+ # @felan-ai/ext-prompt-history
2
+
3
+ TUI-only prompt-history picker for Felan hosts.
4
+
5
+ The extension registers `Ctrl+R` and `Cmd+R`. It opens with prompts from the
6
+ current session, then cycles through current-project and all-project history
7
+ with `Ctrl+R`, `Cmd+R`, or `Ctrl+S`. Search is fuzzy and incremental, duplicate
8
+ prompt text is suppressed, and selecting a result replaces the editor text.
9
+
10
+ The picker renders inline by default with two full-width horizontal separators. Set
11
+ `extensionConfig.promptHistory.displayMode` to `overlay` for a centered popup.
12
+ Overlay mode uses a complete four-edge frame.
13
+ It does not open in print, JSON, or RPC modes.
14
+
15
+ ## Composition
16
+
17
+ The package owns the search workflow and TUI. A host owns session discovery and
18
+ read-only parsing through `PromptHistoryHost`:
19
+
20
+ ```ts
21
+ import { createPromptHistoryExtension } from '@felan-ai/ext-prompt-history';
22
+
23
+ const extension = createPromptHistoryExtension(host);
24
+ ```
25
+
26
+ The package does not access the filesystem, network, credentials, or ambient Pi
27
+ configuration directly. Historical prompts can contain private source, paths,
28
+ commands, or credentials supplied in earlier user messages. Hosts should keep
29
+ session discovery local, bounded, and explicit about which projects are
30
+ visible.
31
+
32
+ The local Felan TUI enables the extension as the `promptHistory` built-in. Set
33
+ `builtinExtensions.promptHistory` to `false` to disable it.
34
+
35
+ ## Development
36
+
37
+ ```sh
38
+ pnpm --filter @felan-ai/ext-prompt-history build
39
+ pnpm --filter @felan-ai/ext-prompt-history type-check
40
+ pnpm --filter @felan-ai/ext-prompt-history test
41
+ ```
42
+
43
+ ## Attribution
44
+
45
+ This package adapts the MIT-licensed `pi-prompt-history` implementation. See
46
+ [NOTICE](NOTICE) and [LICENSE](LICENSE).
@@ -0,0 +1,7 @@
1
+ export declare const PROMPT_HISTORY_DISPLAY_MODES: readonly ["inline", "overlay"];
2
+ export type PromptHistoryDisplayMode = (typeof PROMPT_HISTORY_DISPLAY_MODES)[number];
3
+ export declare const DEFAULT_PROMPT_HISTORY_DISPLAY_MODE: PromptHistoryDisplayMode;
4
+ export declare const PROMPT_HISTORY_CONFIG: import("@felan-ai/agent-core").ExtensionConfigDefinition<{
5
+ readonly displayMode: import("@felan-ai/agent-core").ExtensionConfigField<"inline" | "overlay">;
6
+ }>;
7
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,4BAA4B,gCAAiC,CAAC;AAC3E,MAAM,MAAM,wBAAwB,GAAG,CAAC,OAAO,4BAA4B,CAAC,CAAC,MAAM,CAAC,CAAC;AAErF,eAAO,MAAM,mCAAmC,EAAE,wBAAmC,CAAC;AAEtF,eAAO,MAAM,qBAAqB;;EAUhC,CAAC"}
package/dist/config.js ADDED
@@ -0,0 +1,15 @@
1
+ import { configField, defineExtensionConfig } from "@felan-ai/agent-core";
2
+ export const PROMPT_HISTORY_DISPLAY_MODES = ["inline", "overlay"];
3
+ export const DEFAULT_PROMPT_HISTORY_DISPLAY_MODE = "inline";
4
+ export const PROMPT_HISTORY_CONFIG = defineExtensionConfig({
5
+ id: "promptHistory",
6
+ title: "Prompt History",
7
+ fields: {
8
+ displayMode: configField.enum(PROMPT_HISTORY_DISPLAY_MODES, {
9
+ default: DEFAULT_PROMPT_HISTORY_DISPLAY_MODE,
10
+ label: "Display mode",
11
+ description: "Render prompt history inline or in a centered overlay",
12
+ }),
13
+ },
14
+ });
15
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE1E,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAU,CAAC;AAG3E,MAAM,CAAC,MAAM,mCAAmC,GAA6B,QAAQ,CAAC;AAEtF,MAAM,CAAC,MAAM,qBAAqB,GAAG,qBAAqB,CAAC;IAC1D,EAAE,EAAE,eAAe;IACnB,KAAK,EAAE,gBAAgB;IACvB,MAAM,EAAE;QACP,WAAW,EAAE,WAAW,CAAC,IAAI,CAAC,4BAA4B,EAAE;YAC3D,OAAO,EAAE,mCAAmC;YAC5C,KAAK,EAAE,cAAc;YACrB,WAAW,EAAE,uDAAuD;SACpE,CAAC;KACF;CACD,CAAC,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { SessionEntry } from "@felan-ai/agent-core";
2
+ export interface PromptHistorySessionReference {
3
+ /** Opaque host identifier passed back to readSession. */
4
+ readonly id: string;
5
+ /** Safe display label, normally the session filename. */
6
+ readonly label: string;
7
+ /** Best available session timestamp in epoch milliseconds. */
8
+ readonly timestamp: number;
9
+ }
10
+ export interface PromptHistorySession {
11
+ readonly cwd: string;
12
+ readonly name?: string;
13
+ readonly entries: readonly SessionEntry[];
14
+ }
15
+ export interface PromptHistoryHost {
16
+ /** List sessions visible from the current host-owned session directory. */
17
+ listSessions(sessionDirectory: string): Promise<readonly PromptHistorySessionReference[]>;
18
+ /** Read one listed session without mutating it. Invalid sessions return undefined. */
19
+ readSession(reference: PromptHistorySessionReference): Promise<PromptHistorySession | undefined>;
20
+ }
21
+ //# sourceMappingURL=contracts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../src/contracts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,MAAM,WAAW,6BAA6B;IAC7C,yDAAyD;IACzD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,yDAAyD;IACzD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,8DAA8D;IAC9D,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,CAAC;CAC1C;AAED,MAAM,WAAW,iBAAiB;IACjC,2EAA2E;IAC3E,YAAY,CAAC,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,6BAA6B,EAAE,CAAC,CAAC;IAC1F,sFAAsF;IACtF,WAAW,CAAC,SAAS,EAAE,6BAA6B,GAAG,OAAO,CAAC,oBAAoB,GAAG,SAAS,CAAC,CAAC;CACjG"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=contracts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contracts.js","sourceRoot":"","sources":["../src/contracts.ts"],"names":[],"mappings":""}
@@ -0,0 +1,41 @@
1
+ import type { ExtensionContext, SessionEntry } from "@felan-ai/agent-core";
2
+ import type { PromptHistoryHost } from "./contracts.js";
3
+ export declare const MAX_PROMPT_HISTORY_RESULTS = 50;
4
+ export declare const PROMPT_HISTORY_SEARCH_BATCH_SIZE = 4;
5
+ export declare const PROMPT_HISTORY_SCOPES: readonly ["session", "project", "all"];
6
+ export type PromptHistoryScope = (typeof PROMPT_HISTORY_SCOPES)[number];
7
+ export interface PromptHistoryItem {
8
+ readonly id: string;
9
+ readonly text: string;
10
+ readonly cwd: string;
11
+ readonly sessionLabel: string;
12
+ readonly sessionName?: string | undefined;
13
+ readonly timestamp: number;
14
+ }
15
+ export interface PromptHistorySearchState {
16
+ readonly items: readonly PromptHistoryItem[];
17
+ readonly loading: boolean;
18
+ readonly scanned: number;
19
+ readonly total?: number;
20
+ readonly complete: boolean;
21
+ }
22
+ export interface PromptHistorySource {
23
+ readonly cwd: string;
24
+ readonly sessionDirectory: string;
25
+ readonly host: PromptHistoryHost;
26
+ readonly getCurrentItems: () => readonly PromptHistoryItem[];
27
+ }
28
+ interface PromptMetadata {
29
+ readonly identity: string;
30
+ readonly cwd: string;
31
+ readonly sessionLabel: string;
32
+ readonly sessionName?: string | undefined;
33
+ readonly timestampFallback: number;
34
+ }
35
+ export declare function createPromptHistorySource(ctx: ExtensionContext, host: PromptHistoryHost): PromptHistorySource;
36
+ export declare function collectPrompts(entries: readonly SessionEntry[], metadata: PromptMetadata): PromptHistoryItem[];
37
+ export declare function searchPromptHistory(source: PromptHistorySource, scope: PromptHistoryScope, query: string, onProgress: (state: PromptHistorySearchState) => void, shouldContinue: () => boolean): Promise<PromptHistorySearchState>;
38
+ export declare function limitedPrompts(items: readonly PromptHistoryItem[], query: string): PromptHistoryItem[];
39
+ export declare function normalizeCwd(cwd: string): string;
40
+ export {};
41
+ //# sourceMappingURL=history.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../src/history.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAG3E,OAAO,KAAK,EACX,iBAAiB,EAGjB,MAAM,gBAAgB,CAAC;AAExB,eAAO,MAAM,0BAA0B,KAAK,CAAC;AAC7C,eAAO,MAAM,gCAAgC,IAAI,CAAC;AAElD,eAAO,MAAM,qBAAqB,wCAAyC,CAAC;AAC5E,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,qBAAqB,CAAC,CAAC,MAAM,CAAC,CAAC;AAExE,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,wBAAwB;IACxC,QAAQ,CAAC,KAAK,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAC7C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAmB;IACnC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC,QAAQ,CAAC,eAAe,EAAE,MAAM,SAAS,iBAAiB,EAAE,CAAC;CAC7D;AAED,UAAU,cAAc;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;CACnC;AAED,wBAAgB,yBAAyB,CACxC,GAAG,EAAE,gBAAgB,EACrB,IAAI,EAAE,iBAAiB,GACrB,mBAAmB,CAerB;AAED,wBAAgB,cAAc,CAC7B,OAAO,EAAE,SAAS,YAAY,EAAE,EAChC,QAAQ,EAAE,cAAc,GACtB,iBAAiB,EAAE,CAoBrB;AAED,wBAAsB,mBAAmB,CACxC,MAAM,EAAE,mBAAmB,EAC3B,KAAK,EAAE,kBAAkB,EACzB,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,CAAC,KAAK,EAAE,wBAAwB,KAAK,IAAI,EACrD,cAAc,EAAE,MAAM,OAAO,GAC3B,OAAO,CAAC,wBAAwB,CAAC,CAmCnC;AAED,wBAAgB,cAAc,CAC7B,KAAK,EAAE,SAAS,iBAAiB,EAAE,EACnC,KAAK,EAAE,MAAM,GACX,iBAAiB,EAAE,CAQrB;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAIhD"}
@@ -0,0 +1,135 @@
1
+ import { fuzzyFilter } from "@earendil-works/pi-tui";
2
+ import { basename, normalize, resolve } from "node:path";
3
+ export const MAX_PROMPT_HISTORY_RESULTS = 50;
4
+ export const PROMPT_HISTORY_SEARCH_BATCH_SIZE = 4;
5
+ export const PROMPT_HISTORY_SCOPES = ["session", "project", "all"];
6
+ export function createPromptHistorySource(ctx, host) {
7
+ const sessionManager = ctx.sessionManager;
8
+ const currentIdentity = sessionManager.getSessionFile() ?? sessionManager.getSessionId();
9
+ return {
10
+ cwd: normalizeCwd(ctx.cwd),
11
+ sessionDirectory: sessionManager.getSessionDir(),
12
+ host,
13
+ getCurrentItems: () => collectPrompts(sessionManager.getEntries(), {
14
+ identity: currentIdentity || "current",
15
+ cwd: sessionManager.getCwd() || ctx.cwd,
16
+ sessionLabel: currentIdentity ? basename(currentIdentity) : "current session",
17
+ ...(sessionManager.getSessionName() === undefined ? {} : { sessionName: sessionManager.getSessionName() }),
18
+ timestampFallback: Date.now(),
19
+ }),
20
+ };
21
+ }
22
+ export function collectPrompts(entries, metadata) {
23
+ const items = [];
24
+ const cwd = normalizeCwd(metadata.cwd);
25
+ for (const entry of entries) {
26
+ if (entry.type !== "message" || entry.message.role !== "user")
27
+ continue;
28
+ const text = extractUserText(entry.message.content).trim();
29
+ if (!text)
30
+ continue;
31
+ items.push({
32
+ id: `${metadata.identity}:${entry.id}`,
33
+ text,
34
+ cwd,
35
+ sessionLabel: metadata.sessionLabel,
36
+ ...(metadata.sessionName === undefined ? {} : { sessionName: metadata.sessionName }),
37
+ timestamp: parseTimestamp(entry.timestamp, metadata.timestampFallback),
38
+ });
39
+ }
40
+ return items;
41
+ }
42
+ export async function searchPromptHistory(source, scope, query, onProgress, shouldContinue) {
43
+ if (scope === "session") {
44
+ const state = searchState(limitedPrompts(source.getCurrentItems(), query), false, 0, undefined, true);
45
+ onProgress(state);
46
+ return state;
47
+ }
48
+ let sessions;
49
+ try {
50
+ sessions = [...await source.host.listSessions(source.sessionDirectory)]
51
+ .sort((left, right) => right.timestamp - left.timestamp);
52
+ }
53
+ catch {
54
+ sessions = [];
55
+ }
56
+ let scanned = 0;
57
+ let matches = [];
58
+ for (let index = 0; index < sessions.length && shouldContinue(); index += PROMPT_HISTORY_SEARCH_BATCH_SIZE) {
59
+ const batch = sessions.slice(index, index + PROMPT_HISTORY_SEARCH_BATCH_SIZE);
60
+ const loaded = await Promise.all(batch.map(async (reference) => {
61
+ try {
62
+ const session = await source.host.readSession(reference);
63
+ if (!session || !matchesScope(source.cwd, session, scope))
64
+ return [];
65
+ return promptsFromSession(reference, session);
66
+ }
67
+ catch {
68
+ return [];
69
+ }
70
+ }));
71
+ scanned += batch.length;
72
+ matches = limitedPrompts([...matches, ...loaded.flat()], query);
73
+ onProgress(searchState(matches, true, scanned, sessions.length, false));
74
+ if (matches.length >= MAX_PROMPT_HISTORY_RESULTS)
75
+ break;
76
+ }
77
+ return searchState(matches, false, scanned, sessions.length, scanned >= sessions.length);
78
+ }
79
+ export function limitedPrompts(items, query) {
80
+ const sorted = dedupeAndSort(items);
81
+ if (!query.trim())
82
+ return sorted.slice(0, MAX_PROMPT_HISTORY_RESULTS);
83
+ return fuzzyFilter(sorted, query, (item) => `${item.text} ${item.cwd} ${item.sessionName ?? ""}`).slice(0, MAX_PROMPT_HISTORY_RESULTS);
84
+ }
85
+ export function normalizeCwd(cwd) {
86
+ if (!cwd)
87
+ return "";
88
+ const normalized = normalize(resolve(cwd));
89
+ return process.platform === "win32" ? normalized.toLocaleLowerCase() : normalized;
90
+ }
91
+ function promptsFromSession(reference, session) {
92
+ return collectPrompts(session.entries, {
93
+ identity: reference.id,
94
+ cwd: session.cwd,
95
+ sessionLabel: reference.label,
96
+ ...(session.name === undefined ? {} : { sessionName: session.name }),
97
+ timestampFallback: reference.timestamp,
98
+ });
99
+ }
100
+ function matchesScope(currentCwd, session, scope) {
101
+ return scope === "all" || normalizeCwd(session.cwd) === currentCwd;
102
+ }
103
+ function dedupeAndSort(items) {
104
+ const seen = new Set();
105
+ const result = [];
106
+ for (const item of [...items].sort((left, right) => right.timestamp - left.timestamp)) {
107
+ if (seen.has(item.text))
108
+ continue;
109
+ seen.add(item.text);
110
+ result.push(item);
111
+ }
112
+ return result;
113
+ }
114
+ function extractUserText(content) {
115
+ if (typeof content === "string")
116
+ return content;
117
+ if (!Array.isArray(content))
118
+ return "";
119
+ return content.map((part) => {
120
+ if (!part || typeof part !== "object")
121
+ return "";
122
+ const maybeText = part;
123
+ return maybeText.type === "text" && typeof maybeText.text === "string"
124
+ ? maybeText.text
125
+ : "";
126
+ }).join("");
127
+ }
128
+ function parseTimestamp(value, fallback) {
129
+ const timestamp = new Date(value).getTime();
130
+ return Number.isFinite(timestamp) ? timestamp : fallback;
131
+ }
132
+ function searchState(items, loading, scanned, total, complete) {
133
+ return { items, loading, scanned, ...(total === undefined ? {} : { total }), complete };
134
+ }
135
+ //# sourceMappingURL=history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.js","sourceRoot":"","sources":["../src/history.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { type FelanExtension } from "@felan-ai/agent-core";
2
+ import type { PromptHistoryHost } from "./contracts.js";
3
+ export { DEFAULT_PROMPT_HISTORY_DISPLAY_MODE, PROMPT_HISTORY_CONFIG, PROMPT_HISTORY_DISPLAY_MODES, } from "./config.js";
4
+ export type { PromptHistoryDisplayMode } from "./config.js";
5
+ export type { PromptHistoryHost, PromptHistorySession, PromptHistorySessionReference, } from "./contracts.js";
6
+ export declare function createPromptHistoryExtension(host: PromptHistoryHost): FelanExtension;
7
+ export default createPromptHistoryExtension;
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAGN,KAAK,cAAc,EACnB,MAAM,sBAAsB,CAAC;AAM9B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AASxD,OAAO,EACN,mCAAmC,EACnC,qBAAqB,EACrB,4BAA4B,GAC5B,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAC5D,YAAY,EACX,iBAAiB,EACjB,oBAAoB,EACpB,6BAA6B,GAC7B,MAAM,gBAAgB,CAAC;AAExB,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,iBAAiB,GAAG,cAAc,CAwCpF;AAGD,eAAe,4BAA4B,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,44 @@
1
+ import { associateExtensionConfig, } from "@felan-ai/agent-core";
2
+ import { DEFAULT_PROMPT_HISTORY_DISPLAY_MODE, PROMPT_HISTORY_CONFIG, } from "./config.js";
3
+ import { createPromptHistorySource } from "./history.js";
4
+ import { PROMPT_HISTORY_COMMAND_SHORTCUT, PromptHistoryPicker, PROMPT_HISTORY_SHORTCUT, } from "./picker.js";
5
+ export { DEFAULT_PROMPT_HISTORY_DISPLAY_MODE, PROMPT_HISTORY_CONFIG, PROMPT_HISTORY_DISPLAY_MODES, } from "./config.js";
6
+ export function createPromptHistoryExtension(host) {
7
+ const extension = (pi) => {
8
+ const displayMode = resolveDisplayMode(pi.config.displayMode);
9
+ const open = async (ctx) => {
10
+ if (ctx.mode !== "tui")
11
+ return;
12
+ const source = createPromptHistorySource(ctx, host);
13
+ const result = await ctx.ui.custom((tui, theme, _keybindings, done) => new PromptHistoryPicker(source, theme, () => tui.requestRender(), done, displayMode), displayMode === "overlay"
14
+ ? {
15
+ overlay: true,
16
+ overlayOptions: {
17
+ width: "80%",
18
+ minWidth: 64,
19
+ maxHeight: "90%",
20
+ margin: 2,
21
+ },
22
+ }
23
+ : undefined);
24
+ if (result)
25
+ ctx.ui.setEditorText(result.text);
26
+ };
27
+ pi.registerShortcut(PROMPT_HISTORY_SHORTCUT, {
28
+ description: "Search prompt history",
29
+ handler: open,
30
+ });
31
+ pi.registerShortcut(PROMPT_HISTORY_COMMAND_SHORTCUT, {
32
+ description: "Search prompt history",
33
+ handler: open,
34
+ });
35
+ };
36
+ associateExtensionConfig(extension, PROMPT_HISTORY_CONFIG);
37
+ return extension;
38
+ }
39
+ associateExtensionConfig(createPromptHistoryExtension, PROMPT_HISTORY_CONFIG);
40
+ export default createPromptHistoryExtension;
41
+ function resolveDisplayMode(value) {
42
+ return value === "overlay" ? "overlay" : DEFAULT_PROMPT_HISTORY_DISPLAY_MODE;
43
+ }
44
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,wBAAwB,GAGxB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACN,mCAAmC,EACnC,qBAAqB,GAErB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EACN,+BAA+B,EAC/B,mBAAmB,EACnB,uBAAuB,GAEvB,MAAM,aAAa,CAAC;AAErB,OAAO,EACN,mCAAmC,EACnC,qBAAqB,EACrB,4BAA4B,GAC5B,MAAM,aAAa,CAAC;AAQrB,MAAM,UAAU,4BAA4B,CAAC,IAAuB;IACnE,MAAM,SAAS,GAAmB,CAAC,EAAE,EAAE,EAAE;QACxC,MAAM,WAAW,GAAG,kBAAkB,CAAC,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAC9D,MAAM,IAAI,GAAG,KAAK,EAAE,GAAqB,EAAiB,EAAE;YAC3D,IAAI,GAAG,CAAC,IAAI,KAAK,KAAK;gBAAE,OAAO;YAC/B,MAAM,MAAM,GAAG,yBAAyB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACpD,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CACjC,CAAC,GAAG,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,mBAAmB,CAC1D,MAAM,EACN,KAAK,EACL,GAAG,EAAE,CAAC,GAAG,CAAC,aAAa,EAAE,EACzB,IAAI,EACJ,WAAW,CACX,EACD,WAAW,KAAK,SAAS;gBACxB,CAAC,CAAC;oBACD,OAAO,EAAE,IAAI;oBACb,cAAc,EAAE;wBACf,KAAK,EAAE,KAAK;wBACZ,QAAQ,EAAE,EAAE;wBACZ,SAAS,EAAE,KAAK;wBAChB,MAAM,EAAE,CAAC;qBACT;iBACD;gBACD,CAAC,CAAC,SAAS,CACZ,CAAC;YACF,IAAI,MAAM;gBAAE,GAAG,CAAC,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC/C,CAAC,CAAC;QAEF,EAAE,CAAC,gBAAgB,CAAC,uBAAuB,EAAE;YAC5C,WAAW,EAAE,uBAAuB;YACpC,OAAO,EAAE,IAAI;SACb,CAAC,CAAC;QACH,EAAE,CAAC,gBAAgB,CAAC,+BAA+B,EAAE;YACpD,WAAW,EAAE,uBAAuB;YACpC,OAAO,EAAE,IAAI;SACb,CAAC,CAAC;IACJ,CAAC,CAAC;IACF,wBAAwB,CAAC,SAAS,EAAE,qBAAqB,CAAC,CAAC;IAC3D,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,wBAAwB,CAAC,4BAA4B,EAAE,qBAAqB,CAAC,CAAC;AAC9E,eAAe,4BAA4B,CAAC;AAE5C,SAAS,kBAAkB,CAAC,KAAc;IACzC,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,mCAAmC,CAAC;AAC9E,CAAC"}
@@ -0,0 +1,45 @@
1
+ import type { Theme } from "@felan-ai/agent-core";
2
+ import { type Component, type Focusable } from "@earendil-works/pi-tui";
3
+ import type { PromptHistoryDisplayMode } from "./config.js";
4
+ import { type PromptHistorySource } from "./history.js";
5
+ export declare const PROMPT_HISTORY_SHORTCUT: "ctrl+r";
6
+ export declare const PROMPT_HISTORY_COMMAND_SHORTCUT: "super+r";
7
+ export declare const PROMPT_HISTORY_SCOPE_SHORTCUT: "ctrl+s";
8
+ export declare const MAX_VISIBLE_PROMPT_HISTORY_ITEMS = 12;
9
+ export declare const PROMPT_HISTORY_SEARCH_DEBOUNCE_MS = 120;
10
+ export interface PromptHistoryResult {
11
+ readonly text: string;
12
+ }
13
+ export declare class PromptHistoryPicker implements Component, Focusable {
14
+ private readonly source;
15
+ private readonly theme;
16
+ private readonly requestRender;
17
+ private readonly done;
18
+ private readonly displayMode;
19
+ focused: boolean;
20
+ private scope;
21
+ private query;
22
+ private selectedIndex;
23
+ private cachedWidth;
24
+ private cachedLines;
25
+ private searchToken;
26
+ private searchTimer;
27
+ private closed;
28
+ private readonly states;
29
+ constructor(source: PromptHistorySource, theme: Theme, requestRender: () => void, done: (value: PromptHistoryResult | undefined) => void, displayMode?: PromptHistoryDisplayMode);
30
+ handleInput(data: string): void;
31
+ render(width: number): string[];
32
+ invalidate(): void;
33
+ dispose(): void;
34
+ private filteredItems;
35
+ private cycleScope;
36
+ private moveSelection;
37
+ private resetSelectionAndSearch;
38
+ private scheduleSearch;
39
+ private runSearch;
40
+ private clampSelection;
41
+ private finish;
42
+ private close;
43
+ private visibleStart;
44
+ }
45
+ //# sourceMappingURL=picker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"picker.d.ts","sourceRoot":"","sources":["../src/picker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAKN,KAAK,SAAS,EACd,KAAK,SAAS,EACd,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAMN,KAAK,mBAAmB,EACxB,MAAM,cAAc,CAAC;AAEtB,eAAO,MAAM,uBAAuB,UAAgB,CAAC;AACrD,eAAO,MAAM,+BAA+B,WAAiB,CAAC;AAC9D,eAAO,MAAM,6BAA6B,UAAgB,CAAC;AAC3D,eAAO,MAAM,gCAAgC,KAAK,CAAC;AACnD,eAAO,MAAM,iCAAiC,MAAM,CAAC;AAQrD,MAAM,WAAW,mBAAmB;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,mBAAoB,YAAW,SAAS,EAAE,SAAS;IAa9D,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAhB7B,OAAO,UAAS;IAChB,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,KAAK,CAAM;IACnB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,WAAW,CAA4C;IAC/D,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuD;gBAG5D,MAAM,EAAE,mBAAmB,EAC3B,KAAK,EAAE,KAAK,EACZ,aAAa,EAAE,MAAM,IAAI,EACzB,IAAI,EAAE,CAAC,KAAK,EAAE,mBAAmB,GAAG,SAAS,KAAK,IAAI,EACtD,WAAW,GAAE,wBAAmC;IAalE,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAoD/B,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAwD/B,UAAU,IAAI,IAAI;IAKlB,OAAO,IAAI,IAAI;IAIf,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,uBAAuB;IAK/B,OAAO,CAAC,cAAc;YAsBR,SAAS;IAwBvB,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,MAAM;IAMd,OAAO,CAAC,KAAK;IAOb,OAAO,CAAC,YAAY;CASpB"}
package/dist/picker.js ADDED
@@ -0,0 +1,321 @@
1
+ import { CURSOR_MARKER, Key, matchesKey, truncateToWidth, } from "@earendil-works/pi-tui";
2
+ import { PROMPT_HISTORY_SCOPES, searchPromptHistory, } from "./history.js";
3
+ export const PROMPT_HISTORY_SHORTCUT = Key.ctrl("r");
4
+ export const PROMPT_HISTORY_COMMAND_SHORTCUT = Key.super("r");
5
+ export const PROMPT_HISTORY_SCOPE_SHORTCUT = Key.ctrl("s");
6
+ export const MAX_VISIBLE_PROMPT_HISTORY_ITEMS = 12;
7
+ export const PROMPT_HISTORY_SEARCH_DEBOUNCE_MS = 120;
8
+ const SCOPE_LABELS = {
9
+ all: "All projects",
10
+ project: "Current project",
11
+ session: "Current session",
12
+ };
13
+ export class PromptHistoryPicker {
14
+ source;
15
+ theme;
16
+ requestRender;
17
+ done;
18
+ displayMode;
19
+ focused = false;
20
+ scope = "session";
21
+ query = "";
22
+ selectedIndex = 0;
23
+ cachedWidth;
24
+ cachedLines;
25
+ searchToken = 0;
26
+ searchTimer;
27
+ closed = false;
28
+ states;
29
+ constructor(source, theme, requestRender, done, displayMode = "inline") {
30
+ this.source = source;
31
+ this.theme = theme;
32
+ this.requestRender = requestRender;
33
+ this.done = done;
34
+ this.displayMode = displayMode;
35
+ this.states = {
36
+ session: emptySearchState(true),
37
+ project: emptySearchState(false),
38
+ all: emptySearchState(false),
39
+ };
40
+ this.searchTimer = setTimeout(() => {
41
+ this.searchTimer = undefined;
42
+ if (!this.closed && this.searchToken === 0)
43
+ this.scheduleSearch(0);
44
+ }, 0);
45
+ }
46
+ handleInput(data) {
47
+ if (matchesKey(data, Key.escape) || matchesKey(data, Key.ctrl("c"))) {
48
+ this.finish(undefined);
49
+ return;
50
+ }
51
+ if (matchesKey(data, PROMPT_HISTORY_SHORTCUT)
52
+ || matchesKey(data, PROMPT_HISTORY_COMMAND_SHORTCUT)
53
+ || matchesKey(data, PROMPT_HISTORY_SCOPE_SHORTCUT)) {
54
+ this.cycleScope();
55
+ return;
56
+ }
57
+ if (matchesKey(data, Key.enter) || matchesKey(data, Key.return)) {
58
+ const selected = this.filteredItems()[this.selectedIndex];
59
+ if (selected)
60
+ this.finish({ text: selected.text });
61
+ return;
62
+ }
63
+ if (matchesKey(data, Key.up) || matchesKey(data, Key.ctrl("p"))) {
64
+ this.moveSelection(-1);
65
+ return;
66
+ }
67
+ if (matchesKey(data, Key.down) || matchesKey(data, Key.ctrl("n"))) {
68
+ this.moveSelection(1);
69
+ return;
70
+ }
71
+ if (matchesKey(data, Key.pageUp)) {
72
+ this.moveSelection(-MAX_VISIBLE_PROMPT_HISTORY_ITEMS);
73
+ return;
74
+ }
75
+ if (matchesKey(data, Key.pageDown)) {
76
+ this.moveSelection(MAX_VISIBLE_PROMPT_HISTORY_ITEMS);
77
+ return;
78
+ }
79
+ if (matchesKey(data, Key.backspace)) {
80
+ if (this.query.length > 0) {
81
+ this.query = Array.from(this.query).slice(0, -1).join("");
82
+ this.resetSelectionAndSearch();
83
+ }
84
+ return;
85
+ }
86
+ if (matchesKey(data, Key.delete)) {
87
+ this.query = "";
88
+ this.resetSelectionAndSearch();
89
+ return;
90
+ }
91
+ if (Array.from(data).length === 1 && (data.codePointAt(0) ?? 0) >= 32) {
92
+ this.query += data;
93
+ this.resetSelectionAndSearch();
94
+ }
95
+ }
96
+ render(width) {
97
+ const renderWidth = Math.max(1, Math.floor(width));
98
+ if (this.cachedLines && this.cachedWidth === renderWidth)
99
+ return this.cachedLines;
100
+ const th = this.theme;
101
+ const filtered = this.filteredItems();
102
+ const state = this.states[this.scope];
103
+ const lines = [];
104
+ const frameContentWidth = this.displayMode === "overlay"
105
+ ? Math.max(1, renderWidth - 2)
106
+ : renderWidth;
107
+ const itemContentWidth = Math.max(1, frameContentWidth - 4);
108
+ const cursor = this.focused ? CURSOR_MARKER + th.fg("accent", "▌") : "";
109
+ lines.push(truncateToWidth(` ${th.fg("accent", th.bold("Prompt History"))} ${th.fg("muted", "·")} ${SCOPE_LABELS[this.scope]} ${th.fg("dim", formatCount(state))}`, frameContentWidth));
110
+ lines.push(truncateToWidth(` ${th.fg("muted", "Search:")} ${this.query}${cursor}`, frameContentWidth));
111
+ lines.push("");
112
+ const start = this.visibleStart(filtered.length);
113
+ const visible = filtered.slice(start, start + MAX_VISIBLE_PROMPT_HISTORY_ITEMS);
114
+ const emptyMessage = state.loading
115
+ ? th.fg("muted", "Searching prompt history…")
116
+ : th.fg("warning", "No matching prompts");
117
+ for (let index = 0; index < MAX_VISIBLE_PROMPT_HISTORY_ITEMS; index++) {
118
+ const item = visible[index];
119
+ if (item) {
120
+ const selected = start + index === this.selectedIndex;
121
+ const marker = selected ? th.fg("accent", "›") : " ";
122
+ const preview = highlightMatches(formatPreview(item.text), this.query, th);
123
+ const promptLine = selected && !this.query.trim() ? th.bold(preview) : preview;
124
+ lines.push(truncateToWidth(` ${marker} ${promptLine}`, frameContentWidth));
125
+ lines.push(truncateToWidth(` ${th.fg("dim", formatMetadata(item))}`, itemContentWidth));
126
+ }
127
+ else if (index === 0) {
128
+ lines.push(truncateToWidth(` ${emptyMessage}`, frameContentWidth));
129
+ lines.push("");
130
+ }
131
+ else {
132
+ lines.push("", "");
133
+ }
134
+ }
135
+ lines.push(truncateToWidth(` ${th.fg("dim", formatStatus(state, filtered.length, start))}`, frameContentWidth));
136
+ lines.push("");
137
+ lines.push(truncateToWidth(` ${th.fg("dim", "↑/↓ move · Enter select · Cmd/Ctrl+R scope · Esc cancel")}`, frameContentWidth));
138
+ this.cachedWidth = renderWidth;
139
+ this.cachedLines = frameLines(lines, renderWidth, this.displayMode, th);
140
+ return this.cachedLines;
141
+ }
142
+ invalidate() {
143
+ this.cachedWidth = undefined;
144
+ this.cachedLines = undefined;
145
+ }
146
+ dispose() {
147
+ this.close();
148
+ }
149
+ filteredItems() {
150
+ return this.states[this.scope].items;
151
+ }
152
+ cycleScope() {
153
+ const currentIndex = PROMPT_HISTORY_SCOPES.indexOf(this.scope);
154
+ this.scope = PROMPT_HISTORY_SCOPES[(currentIndex + 1) % PROMPT_HISTORY_SCOPES.length] ?? "session";
155
+ this.resetSelectionAndSearch(0);
156
+ }
157
+ moveSelection(delta) {
158
+ const count = this.filteredItems().length;
159
+ if (count === 0)
160
+ return;
161
+ this.selectedIndex = Math.max(0, Math.min(count - 1, this.selectedIndex + delta));
162
+ this.invalidate();
163
+ this.requestRender();
164
+ }
165
+ resetSelectionAndSearch(delayMs = PROMPT_HISTORY_SEARCH_DEBOUNCE_MS) {
166
+ this.selectedIndex = 0;
167
+ this.scheduleSearch(delayMs);
168
+ }
169
+ scheduleSearch(delayMs) {
170
+ this.invalidate();
171
+ this.requestRender();
172
+ if (this.searchTimer)
173
+ clearTimeout(this.searchTimer);
174
+ this.searchTimer = undefined;
175
+ if (this.scope === "session") {
176
+ this.searchToken++;
177
+ this.states.session = emptySearchState(true);
178
+ void this.runSearch(this.searchToken, "session", this.query);
179
+ return;
180
+ }
181
+ const token = ++this.searchToken;
182
+ const scope = this.scope;
183
+ const query = this.query;
184
+ this.states[scope] = emptySearchState(true);
185
+ this.searchTimer = setTimeout(() => {
186
+ this.searchTimer = undefined;
187
+ void this.runSearch(token, scope, query);
188
+ }, delayMs);
189
+ }
190
+ async runSearch(token, scope, query) {
191
+ const current = () => !this.closed
192
+ && token === this.searchToken
193
+ && scope === this.scope
194
+ && query === this.query;
195
+ const apply = (state) => {
196
+ if (!current())
197
+ return;
198
+ this.states[scope] = state;
199
+ this.clampSelection();
200
+ this.invalidate();
201
+ this.requestRender();
202
+ };
203
+ try {
204
+ apply(await searchPromptHistory(this.source, scope, query, apply, current));
205
+ }
206
+ catch {
207
+ apply(emptySearchState(false, true));
208
+ }
209
+ }
210
+ clampSelection() {
211
+ const count = this.filteredItems().length;
212
+ this.selectedIndex = Math.max(0, Math.min(this.selectedIndex, Math.max(0, count - 1)));
213
+ }
214
+ finish(value) {
215
+ if (this.closed)
216
+ return;
217
+ this.close();
218
+ this.done(value);
219
+ }
220
+ close() {
221
+ this.closed = true;
222
+ this.searchToken++;
223
+ if (this.searchTimer)
224
+ clearTimeout(this.searchTimer);
225
+ this.searchTimer = undefined;
226
+ }
227
+ visibleStart(count) {
228
+ return Math.max(0, Math.min(this.selectedIndex - Math.floor(MAX_VISIBLE_PROMPT_HISTORY_ITEMS / 2), count - MAX_VISIBLE_PROMPT_HISTORY_ITEMS));
229
+ }
230
+ }
231
+ function frameLines(lines, width, displayMode, theme) {
232
+ const border = (text) => theme.fg("borderMuted", text);
233
+ if (displayMode === "inline") {
234
+ return [border("─".repeat(width)), ...lines, border("─".repeat(width))];
235
+ }
236
+ const innerWidth = Math.max(1, width - 2);
237
+ const fit = (line) => truncateToWidth(line, innerWidth, "", true);
238
+ return [
239
+ border(`╭${"─".repeat(innerWidth)}╮`),
240
+ ...lines.map((line) => `${border("│")}${fit(line)}${border("│")}`),
241
+ border(`╰${"─".repeat(innerWidth)}╯`),
242
+ ];
243
+ }
244
+ function emptySearchState(loading, complete = false) {
245
+ return { items: [], loading, scanned: 0, complete };
246
+ }
247
+ function formatPreview(text) {
248
+ return text.replace(/[\r\n]+/g, " ").replace(/\s+/g, " ").trim();
249
+ }
250
+ function formatCount(state) {
251
+ if (state.total === undefined)
252
+ return `(${state.items.length})`;
253
+ return `(${state.items.length}${state.complete ? "" : "+"}, scanned ${state.scanned}/${state.total})`;
254
+ }
255
+ function formatStatus(state, count, start) {
256
+ if (count === 0)
257
+ return state.loading ? "Searching…" : "No matches";
258
+ const range = `Showing ${start + 1}-${Math.min(start + MAX_VISIBLE_PROMPT_HISTORY_ITEMS, count)} of ${count}`;
259
+ return state.loading ? `${range} · searching more…` : range;
260
+ }
261
+ function highlightMatches(text, query, theme) {
262
+ const tokens = query.trim().toLocaleLowerCase().split(/\s+/).filter(Boolean);
263
+ if (tokens.length === 0)
264
+ return text;
265
+ const chars = Array.from(text);
266
+ const lowerChars = chars.map((char) => char.toLocaleLowerCase());
267
+ const highlighted = new Set();
268
+ for (const token of tokens)
269
+ markTokenMatches(lowerChars, Array.from(token), highlighted);
270
+ let result = "";
271
+ let run = "";
272
+ let runHighlighted = highlighted.has(0);
273
+ for (let index = 0; index < chars.length; index++) {
274
+ const currentHighlighted = highlighted.has(index);
275
+ if (currentHighlighted !== runHighlighted) {
276
+ result += styleHighlightRun(run, runHighlighted, theme);
277
+ run = "";
278
+ runHighlighted = currentHighlighted;
279
+ }
280
+ run += chars[index];
281
+ }
282
+ return result + styleHighlightRun(run, runHighlighted, theme);
283
+ }
284
+ function markTokenMatches(lowerChars, token, highlighted) {
285
+ if (token.length === 0)
286
+ return;
287
+ for (let start = 0; start <= lowerChars.length - token.length; start++) {
288
+ let matches = true;
289
+ for (let offset = 0; offset < token.length; offset++) {
290
+ if (lowerChars[start + offset] !== token[offset]) {
291
+ matches = false;
292
+ break;
293
+ }
294
+ }
295
+ if (!matches)
296
+ continue;
297
+ for (let offset = 0; offset < token.length; offset++)
298
+ highlighted.add(start + offset);
299
+ return;
300
+ }
301
+ const positions = [];
302
+ let searchFrom = 0;
303
+ for (const char of token) {
304
+ const index = lowerChars.findIndex((candidate, candidateIndex) => (candidateIndex >= searchFrom && candidate === char));
305
+ if (index === -1)
306
+ return;
307
+ positions.push(index);
308
+ searchFrom = index + 1;
309
+ }
310
+ for (const position of positions)
311
+ highlighted.add(position);
312
+ }
313
+ function styleHighlightRun(text, highlighted, theme) {
314
+ return highlighted ? theme.fg("accent", theme.bold(text)) : text;
315
+ }
316
+ function formatMetadata(item) {
317
+ const project = item.cwd ? item.cwd.split(/[\\/]/u).filter(Boolean).at(-1) ?? item.cwd : "unknown project";
318
+ const session = item.sessionName?.trim() || item.sessionLabel;
319
+ return `${project} · ${session} · ${new Date(item.timestamp).toLocaleString()}`;
320
+ }
321
+ //# sourceMappingURL=picker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"picker.js","sourceRoot":"","sources":["../src/picker.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "@felan-ai/ext-prompt-history",
3
+ "version": "0.0.0",
4
+ "description": "TUI prompt-history picker for Felan",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/felan-ai/felan.git",
10
+ "directory": "packages/ext-prompt-history"
11
+ },
12
+ "engines": {
13
+ "node": ">=22.19.0"
14
+ },
15
+ "files": [
16
+ "dist",
17
+ "LICENSE",
18
+ "NOTICE",
19
+ "README.md"
20
+ ],
21
+ "exports": {
22
+ ".": {
23
+ "types": "./dist/index.d.ts",
24
+ "import": "./dist/index.js"
25
+ }
26
+ },
27
+ "dependencies": {
28
+ "@earendil-works/pi-tui": "0.84.3"
29
+ },
30
+ "peerDependencies": {
31
+ "@felan-ai/agent-core": "^0.5.5"
32
+ },
33
+ "devDependencies": {
34
+ "@felan-ai/agent-core": "0.5.5"
35
+ },
36
+ "publishConfig": {
37
+ "access": "public",
38
+ "provenance": true
39
+ },
40
+ "scripts": {
41
+ "build": "rm -rf dist && tsc -p tsconfig.build.json",
42
+ "type-check": "tsc -p tsconfig.json --noEmit",
43
+ "test": "vitest run"
44
+ }
45
+ }