@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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mrclrchtr/supi-core",
3
- "version": "6.2.0",
3
+ "version": "6.4.0",
4
4
  "description": "Shared settings, configuration, reporting, and session infrastructure",
5
5
  "license": "MIT",
6
6
  "repository": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mrclrchtr/supi-prompt-suggestions",
3
- "version": "6.2.0",
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.2.0"
51
+ "@mrclrchtr/supi-core": "6.4.0"
52
52
  },
53
53
  "bundledDependencies": [
54
54
  "@mrclrchtr/supi-core"
@@ -43,7 +43,11 @@ export class GhostTextEditor extends CustomEditor {
43
43
  options: GhostTextEditorOptions,
44
44
  ) {
45
45
  const { callbacks, ...editorOptions } = options;
46
- super(tui, theme, keybindings, editorOptions);
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("agent_end", (event, ctx) => session.onAgentEnd(event, ctx));
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 { AgentEndEvent, ExtensionContext } from "@earendil-works/pi-coding-agent";
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
- onAgentEnd(event: AgentEndEvent, ctx: ExtensionContext): void {
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(event);
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(event: AgentEndEvent): string | null {
185
- const messages = event.messages;
186
- for (let i = messages.length - 1; i >= 0; i--) {
187
- const msg = messages[i];
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();