@mrclrchtr/supi-prompt-suggestions 6.2.0 → 6.4.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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mrclrchtr/supi-prompt-suggestions",
|
|
3
|
-
"version": "6.
|
|
3
|
+
"version": "6.4.0",
|
|
4
4
|
"description": "Optional model-powered ghost-text prompt suggestions",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
"video": "https://raw.githubusercontent.com/mrclrchtr/supi/main/packages/supi-prompt-suggestions/assets/demo.mp4"
|
|
49
49
|
},
|
|
50
50
|
"dependencies": {
|
|
51
|
-
"@mrclrchtr/supi-core": "6.
|
|
51
|
+
"@mrclrchtr/supi-core": "6.4.0"
|
|
52
52
|
},
|
|
53
53
|
"bundledDependencies": [
|
|
54
54
|
"@mrclrchtr/supi-core"
|
package/src/editor/editor.ts
CHANGED
|
@@ -43,7 +43,11 @@ export class GhostTextEditor extends CustomEditor {
|
|
|
43
43
|
options: GhostTextEditorOptions,
|
|
44
44
|
) {
|
|
45
45
|
const { callbacks, ...editorOptions } = options;
|
|
46
|
-
|
|
46
|
+
const customEditorOptions = {
|
|
47
|
+
...editorOptions,
|
|
48
|
+
embedWorkingStatus: true,
|
|
49
|
+
};
|
|
50
|
+
super(tui, theme, keybindings, customEditorOptions);
|
|
47
51
|
this.callbacks = callbacks;
|
|
48
52
|
}
|
|
49
53
|
|
package/src/extension.ts
CHANGED
|
@@ -20,7 +20,7 @@ export default function (pi: ExtensionAPI): void {
|
|
|
20
20
|
const session = new SessionLifecycle(generator);
|
|
21
21
|
|
|
22
22
|
pi.on("session_start", (_event, ctx) => session.onStart(ctx));
|
|
23
|
-
pi.on("
|
|
23
|
+
pi.on("agent_settled", (_event, ctx) => session.onAgentSettled(ctx));
|
|
24
24
|
pi.on("agent_start", () => session.onAgentStart());
|
|
25
25
|
pi.on("session_shutdown", () => session.onShutdown());
|
|
26
26
|
}
|
package/src/session.ts
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* @module
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
-
import type {
|
|
10
|
+
import type { ExtensionContext } from "@earendil-works/pi-coding-agent";
|
|
11
11
|
import { StatusSpinner } from "@mrclrchtr/supi-core/api";
|
|
12
12
|
import { type GhostTextCallbacks, GhostTextEditor } from "./editor/editor.ts";
|
|
13
13
|
import type { GenerationStatus, SuggestionGenerator } from "./generation/generator.ts";
|
|
@@ -26,6 +26,11 @@ interface SessionMessageEntry {
|
|
|
26
26
|
};
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
+
type SessionBranchEntry = {
|
|
30
|
+
type: string;
|
|
31
|
+
message?: SessionMessageEntry["message"];
|
|
32
|
+
};
|
|
33
|
+
|
|
29
34
|
// ── SessionLifecycle ───────────────────────────────────────────────────────
|
|
30
35
|
|
|
31
36
|
/**
|
|
@@ -55,11 +60,11 @@ export class SessionLifecycle {
|
|
|
55
60
|
this.installEditor(ctx);
|
|
56
61
|
}
|
|
57
62
|
|
|
58
|
-
/** Extract the last assistant message and fire suggestion generation. */
|
|
59
|
-
|
|
63
|
+
/** Extract the last settled assistant message and fire suggestion generation. */
|
|
64
|
+
onAgentSettled(ctx: ExtensionContext): void {
|
|
60
65
|
if (ctx.mode !== "tui") return;
|
|
61
66
|
|
|
62
|
-
const lastAssistant = extractLastAssistantText(
|
|
67
|
+
const lastAssistant = extractLastAssistantText(ctx.sessionManager.getBranch());
|
|
63
68
|
if (!lastAssistant) {
|
|
64
69
|
this.statusSpinner?.stop();
|
|
65
70
|
this.generationInFlight = false;
|
|
@@ -181,10 +186,12 @@ export class SessionLifecycle {
|
|
|
181
186
|
|
|
182
187
|
// ── Free helpers ───────────────────────────────────────────────────────────
|
|
183
188
|
|
|
184
|
-
function extractLastAssistantText(
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
189
|
+
function extractLastAssistantText(entries: readonly SessionBranchEntry[]): string | null {
|
|
190
|
+
for (let i = entries.length - 1; i >= 0; i--) {
|
|
191
|
+
const entry = entries[i];
|
|
192
|
+
if (entry?.type !== "message") continue;
|
|
193
|
+
|
|
194
|
+
const msg = entry.message;
|
|
188
195
|
if (msg?.role === "assistant") {
|
|
189
196
|
if (msg.stopReason !== "stop") return null;
|
|
190
197
|
const textContent = extractTextContent(msg.content).trim();
|