@code-yeongyu/senpi-codemode 2026.8.22-2 → 2026.8.23

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/CHANGELOG.md CHANGED
@@ -12,6 +12,20 @@
12
12
 
13
13
  ### Removed
14
14
 
15
+ ## [2026.8.23] - 2026-08-23
16
+
17
+ ### Breaking Changes
18
+
19
+ ### Added
20
+
21
+ ### Changed
22
+
23
+ ### Fixed
24
+
25
+ - Detached eval cell completion notices no longer enter the user-input steering queue. They were delivered via `sendUserMessage`, so hosts projecting that queue (e.g. the OmO desktop composer) rendered the raw `<system-reminder>Detached eval cell …</system-reminder>` notice under the STEERING heading as if the user had typed and queued it. Notices now deliver via `sendMessage` with `customType: "senpi-codemode:notification"` and `display: false` — model-visible, never painted as user input — matching the terminal and monitor notification contract.
26
+
27
+ ### Removed
28
+
15
29
  ## [2026.8.22-2] - 2026-08-22
16
30
 
17
31
  ### Breaking Changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/senpi-codemode",
3
- "version": "2026.8.22-2",
3
+ "version": "2026.8.23",
4
4
  "description": "Source-only senpi extension package for codemode evaluation tools",
5
5
  "type": "module",
6
6
  "main": "./src/index.ts",
@@ -30,14 +30,14 @@
30
30
  },
31
31
  "dependencies": {
32
32
  "@babel/parser": "8.0.4",
33
- "@earendil-works/pi-ai": "npm:@code-yeongyu/senpi-ai@2026.8.22-2",
33
+ "@earendil-works/pi-ai": "npm:@code-yeongyu/senpi-ai@2026.8.23",
34
34
  "typebox": "1.3.16"
35
35
  },
36
36
  "peerDependencies": {
37
- "@code-yeongyu/senpi": "2026.8.22-2"
37
+ "@code-yeongyu/senpi": "2026.8.23"
38
38
  },
39
39
  "devDependencies": {
40
- "@code-yeongyu/senpi": "2026.8.22-2"
40
+ "@code-yeongyu/senpi": "2026.8.23"
41
41
  },
42
42
  "keywords": [
43
43
  "senpi",
@@ -3,10 +3,17 @@ import type { EvalDetachedCellNotification, EvalDetachedCellNotifier } from "../
3
3
 
4
4
  const NON_INTERACTIVE_MODES = new Set(["print", "json"]);
5
5
 
6
+ /** Provenance marker for agent-internal detached-cell notices. */
7
+ export const EVAL_NOTIFICATION_CUSTOM_TYPE = "senpi-codemode:notification";
8
+
6
9
  export type EvalNotifyMode = "wake" | "next-turn" | "off";
7
10
 
8
11
  export interface EvalNotifierDeps {
9
- readonly sendUserMessage: (content: string, options?: { deliverAs?: "steer" | "followUp" }) => void;
12
+ /** Deliver a model-visible notification without rendering synthetic user input. */
13
+ readonly sendMessage: (
14
+ message: { customType: string; content: string; display: boolean },
15
+ options: { triggerTurn: boolean; deliverAs: "steer" | "followUp" },
16
+ ) => void;
10
17
  readonly getContext: () => ExtensionContext | undefined;
11
18
  readonly getMode: () => EvalNotifyMode;
12
19
  }
@@ -33,8 +40,13 @@ export class EvalNotifier implements EvalDetachedCellNotifier {
33
40
  const pending = cells.filter((cell) => !this.#notified.has(cell.cellId));
34
41
  if (pending.length === 0) return;
35
42
  for (const cell of pending) this.#notified.add(cell.cellId);
36
- this.#deps.sendUserMessage(pending.map((cell) => cell.content).join("\n\n"), {
37
- deliverAs: mode === "wake" ? "steer" : "followUp",
38
- });
43
+ this.#deps.sendMessage(
44
+ {
45
+ customType: EVAL_NOTIFICATION_CUSTOM_TYPE,
46
+ content: pending.map((cell) => cell.content).join("\n\n"),
47
+ display: false,
48
+ },
49
+ { triggerTurn: true, deliverAs: mode === "wake" ? "steer" : "followUp" },
50
+ );
39
51
  }
40
52
  }
package/src/index.ts CHANGED
@@ -44,7 +44,10 @@ export interface CodemodeExtensionAPI {
44
44
  executeTool: AgentExecuteTool;
45
45
  getActiveTools(): string[];
46
46
  getAllTools(): readonly EvalSchemaToolInfo[];
47
- sendUserMessage(content: string, options?: { deliverAs?: "steer" | "followUp" }): void;
47
+ sendMessage(
48
+ message: { customType: string; content: string; display: boolean },
49
+ options?: { triggerTurn?: boolean; deliverAs?: "steer" | "followUp" | "nextTurn" },
50
+ ): void;
48
51
  /** Optional host event bus; a host without one turns extension event emission into a harmless no-op. */
49
52
  events?: { emit(name: string, data: unknown): void };
50
53
  /** Optional host RPC surface for forwarding extension-owned events to connected clients. */
@@ -69,7 +72,7 @@ export default function senpiCodemode(pi: CodemodeExtensionAPI, options: SenpiCo
69
72
  let activeContext: ExtensionContext | undefined;
70
73
  let activeCells: EvalDetachedCellManager | undefined;
71
74
  const notifier = new EvalNotifier({
72
- sendUserMessage: (content, notifyOptions) => pi.sendUserMessage(content, notifyOptions),
75
+ sendMessage: (message, notifyOptions) => pi.sendMessage(message, notifyOptions),
73
76
  getContext: () => activeContext,
74
77
  getMode: () => "wake",
75
78
  });