opencode-flema-engram-sidebar 0.3.0 → 0.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/README.md CHANGED
@@ -5,7 +5,7 @@
5
5
  [![Node.js](https://img.shields.io/badge/Node.js-%3E%3D22-339933?logo=nodedotjs&logoColor=white)](https://nodejs.org/)
6
6
  [![License: MIT](https://img.shields.io/github/license/oniricosistemas/flema-engram)](https://github.com/oniricosistemas/flema-engram/blob/main/LICENSE)
7
7
 
8
- Una integración local y de solo lectura que mantiene visible el contexto reciente de
8
+ Una integración local-first y de solo lectura que mantiene visible el contexto reciente de
9
9
  [Engram](https://github.com/Gentleman-Programming/engram) mientras trabajás dentro de OpenCode o Pi/Gentle Shell.
10
10
 
11
11
  La canción **“Y aún yo te recuerdo”** inspiró artísticamente la idea central: que la
@@ -18,15 +18,18 @@ sobre la obra.
18
18
  > blockers, and ODD task progress by default. An MCP stdio adapter is included only as an optional
19
19
  > integration path.
20
20
 
21
- ## Inicio rápido
21
+ ## Inicio rápido — 0.4.0
22
+
23
+ Elegí el registro en `tui.json` para OpenCode o la [instalación Pi / Gentle Shell](#viewer-para-pi--gentle-shell).
24
+ No hace falta una instalación global npm para ninguno de los viewers.
22
25
 
23
26
  ### Requisitos
24
27
 
25
28
  | Componente | Requisito |
26
29
  | --- | --- |
27
30
  | Node.js | 22 o posterior |
28
- | OpenCode | 1.18.25 o posterior |
29
- | Engram | Servicio HTTP local activo en `http://127.0.0.1:7437` (o accesible vía red en `<host>:7437` cuando se usa `opencode attach`) |
31
+ | Host visual | OpenCode 1.18.25+ **o** Pi con API de extensiones/UI compatible; Gentle Shell fullscreen para el rail lateral |
32
+ | Engram | Servicio HTTP accesible desde el proceso del viewer; por defecto `http://127.0.0.1:7437` |
30
33
  | Proyecto | Alguna observación o sesión reciente que permita validar el nombre |
31
34
 
32
35
  ### 1. Registrá el sidebar en `tui.json`
@@ -36,7 +39,7 @@ Configuración mínima:
36
39
  ```json
37
40
  {
38
41
  "$schema": "https://opencode.ai/tui.json",
39
- "plugin": ["opencode-flema-engram-sidebar@0.3.0"]
42
+ "plugin": ["opencode-flema-engram-sidebar@0.4.0"]
40
43
  }
41
44
  ```
42
45
 
@@ -85,11 +88,17 @@ OpenCode 2 dispone además de `opencode plugin check` y `opencode plugin update`
85
88
  CLI usa la sintaxis nativa correspondiente a la versión detectada.
86
89
 
87
90
  #### Usando `opencode attach`
88
- Si vas a conectarte a una instancia remota de OpenCode mediante `opencode attach <url>`, el plugin funcionará siempre que:
89
- - El servicio Engram en la máquina remota sea accesible en el puerto 7437 (por defecto solo escucha en 127.0.0.1; se recomienda crear un puente TCP como se describe en los documentos internos o usar `engram-bridge.service`).
90
- - Usá una versión exacta del plugin y actualizala explícitamente; `opencode attach` puede reutilizar una copia npm ya resuelta en la caché local.
91
- - La detección automática usa el host recibido por `opencode attach`; si el puente de Engram usa otra URL, configurá `baseUrl` explícitamente en `tui.json`.
92
- - Verás en el sidebar la línea `🔌 Target: Local=<host>:7437 | Cloud=<URL>` para confirmar a qué endpoints se está conectando.
91
+ La configuración incluye detección del host de `opencode attach <url>` para intentar
92
+ consultar Engram en el puerto 7437, pero no crea túneles ni expone el servicio remoto.
93
+ La conectividad debe existir desde el proceso que carga el viewer; el loopback remoto
94
+ no es accesible automáticamente desde otra máquina. Configurá `baseUrl` explícitamente
95
+ si la detección no representa tu endpoint y comprobá su `/health` desde ese proceso.
96
+ No se garantiza compatibilidad con todas las topologías attach, proxies o URLs.
97
+
98
+ Usá una versión exacta: attach también puede reutilizar paquetes en caché. La línea
99
+ `🔌 Target: Local=… | Cloud=…` informa los destinos configurados; no prueba una
100
+ sincronización ni garantiza que ambos respondan. No expongas el puerto de Engram sin
101
+ controles de acceso.
93
102
 
94
103
  ### 2. Iniciá Engram y abrí OpenCode en tu proyecto
95
104
 
@@ -98,28 +107,50 @@ predeterminada y permite refrescar manualmente con <kbd>Alt</kbd>+<kbd>R</kbd>.
98
107
 
99
108
  ## Viewer para Pi / Gentle Shell
100
109
 
101
- El mismo paquete incluye una extensión Pi de solo lectura. Instalá una versión exacta
102
- compatible con esta documentación:
110
+ El mismo paquete incluye una extensión Pi de solo lectura. Para Pi convencional,
111
+ instalá la versión exacta compatible con esta documentación:
112
+
113
+ ```sh
114
+ pi install npm:opencode-flema-engram-sidebar@0.4.0
115
+ ```
116
+
117
+ Gentle Shell usa un home de paquetes aislado. Instalá allí la misma versión:
103
118
 
104
119
  ```sh
105
- pi install npm:opencode-flema-engram-sidebar@0.3.0
120
+ PI_CODING_AGENT_DIR="$HOME/.gentle-shell/agent" \
121
+ pi install npm:opencode-flema-engram-sidebar@0.4.0
106
122
  ```
107
123
 
108
- La extensión publica un status breve y un widget compacto debajo del editor. Refresca
109
- al iniciar, reanudar o recargar una sesión, después de que `mem_save` (o el alias
110
- `save_memory`) termina correctamente y mediante el comando:
124
+ En Gentle Shell fullscreen, la extensión participa del rail lateral sin reemplazar
125
+ el status existente. El panel empieza visible y expandido, con marco redondeado:
126
+ el borde usa el color semántico `border` y el título `accent` del theme activo.
127
+ Un clic izquierdo en el título colapsa o expande el panel, igual que el comando.
128
+ Muestra proyecto, salud, progreso ODD, bloqueos y actividad reciente. En Pi sin el
129
+ rail de Gentle Shell usa un overlay pasivo a la derecha cuando el terminal tiene
130
+ ancho suficiente. Los comandos de presentación son independientes:
111
131
 
112
132
  ```text
113
- /engram-refresh
133
+ /engram-refresh # Refrescar datos y status; notificar el resultado
134
+ /engram-sidebar # Mostrar u ocultar el sidebar
135
+ /engram-sidebar-collapse # Colapsar o expandir el sidebar
136
+ /engram-widget # Mostrar u ocultar el widget debajo del editor
114
137
  ```
115
138
 
116
- No usa polling periódico y no agrega herramientas para escribir memorias. En modos
117
- sin UI no consulta Engram ni intenta renderizar componentes terminales. En RPC usa
118
- solamente status y widgets de líneas de texto, sin iniciar una segunda TUI.
139
+ El widget compacto empieza oculto en cada sesión y su visibilidad no se persiste.
140
+ El sidebar y el widget refrescan al iniciar, reanudar o recargar una sesión y después
141
+ de que `mem_save` (o el alias `save_memory`) termina correctamente. Ocultar cualquiera
142
+ de las dos vistas no detiene el controller ni desactiva `/engram-refresh`.
119
143
 
120
- La resolución del endpoint usa `ENGRAM_URL`, luego `ENGRAM_BASE_URL` y finalmente
121
- `http://127.0.0.1:7437`. `ENGRAM_PROJECT` puede fijar el candidato de proyecto; de lo
122
- contrario se valida el nombre del directorio actual contra Engram. Los fallos de
144
+ No usa polling periódico y no agrega herramientas para escribir memorias. En modos
145
+ sin UI no consulta Engram ni intenta renderizar componentes terminales. En RPC no
146
+ monta el rail ni el overlay terminal.
147
+
148
+ Para el endpoint principal, definí `ENGRAM_URL` o `ENGRAM_BASE_URL`; sin configuración
149
+ se usa `http://127.0.0.1:7437` (el factory compartido también reconoce argumentos attach).
150
+ La configuración cloud compartida se describe en
151
+ [Seguridad y enfoque local-first](#seguridad-privacidad-y-enfoque-local-first).
152
+ `ENGRAM_PROJECT` puede fijar el candidato de proyecto; de lo contrario se valida el
153
+ nombre del directorio actual contra Engram. Los fallos de
123
154
  inicialización se contienen en un estado `Engram unavailable` sin mostrar URLs,
124
155
  tokens ni diagnósticos con credenciales.
125
156
 
@@ -135,9 +166,9 @@ pi --extension ./dist/pi.js
135
166
  | Sí es | No es |
136
167
  | --- | --- |
137
168
  | Un plugin para `sidebar_content` de OpenCode y una extensión Pi | Una TUI independiente |
138
- | Una vista local y de solo lectura sobre Engram | Un reemplazo de Engram |
139
- | Project context, activity, and ODD task progress | A memory editor or manager |
140
- | Un cliente del HTTP local de Engram | Un servicio cloud o de sincronización |
169
+ | Una vista local-first y de solo lectura sobre Engram | Un reemplazo de Engram |
170
+ | Contexto de proyecto, actividad y progreso ODD | Un editor o administrador de memorias |
171
+ | Un cliente HTTP de Engram | Un servicio cloud o de sincronización |
141
172
  | Un paquete con un adaptador MCP stdio opcional | Un producto centrado en MCP |
142
173
 
143
174
  Los viewers de OpenCode y Pi son las integraciones visuales principales. El comando
@@ -150,13 +181,13 @@ de los viewers.
150
181
  2. El plugin resuelve un candidato de proyecto, lo prueba primero con una consulta
151
182
  acotada por proyecto y conserva la enumeración reciente como fallback.
152
183
  3. Consulta en paralelo salud, proyectos y observaciones del proyecto.
153
- 4. Derives ODD task state from canonical `odd/<feature>/tasks` mirrors, orders
154
- recent activity by update time, and recognizes explicit blockers.
184
+ 4. Deriva tareas ODD desde espejos canónicos `odd/<feature>/tasks`, ordena la
185
+ actividad por actualización y reconoce bloqueos explícitos.
155
186
  5. Renderiza texto dentro del sidebar de la sesión visible y conserva datos útiles
156
187
  como `STALE` si una actualización posterior queda incompleta.
157
188
 
158
- Las llamadas usan exclusivamente `GET` contra el Engram local. El plugin no guarda,
159
- edita ni elimina memorias.
189
+ Las llamadas usan exclusivamente `GET` contra los endpoints Engram configurados.
190
+ Los viewers no guardan, editan ni eliminan memorias.
160
191
 
161
192
  ### Endpoints utilizados
162
193
 
@@ -183,7 +214,7 @@ Usá la forma `[plugin, options]` solamente cuando necesites opciones:
183
214
  "$schema": "https://opencode.ai/tui.json",
184
215
  "plugin": [
185
216
  [
186
- "opencode-flema-engram-sidebar@0.3.0",
217
+ "opencode-flema-engram-sidebar@0.4.0",
187
218
  {
188
219
  "enabled": true,
189
220
  "project": "mi-proyecto",
@@ -201,7 +232,7 @@ Usá la forma `[plugin, options]` solamente cuando necesites opciones:
201
232
  | `enabled` | `boolean` | `false` evita que el plugin registre el sidebar. Por defecto está habilitado. |
202
233
  | `project` | `string` | Nombre exacto de proyecto Engram. Tiene la prioridad más alta. |
203
234
  | `pollInterval` | `number` | Intervalo automático en milisegundos; debe ser mayor que cero. Por defecto: `30000`. |
204
- | `baseUrl` | `string` | Endpoint HTTP(S) de Engram local. Gana sobre variables de entorno y detección por `opencode attach`. Por defecto: `http://127.0.0.1:7437`. |
235
+ | `baseUrl` | `string` | Endpoint HTTP(S) principal de Engram. Gana sobre variables de entorno y detección por `opencode attach`. Por defecto: `http://127.0.0.1:7437`. |
205
236
  | `timeoutMs` | `number` | Presupuesto común para requests locales y guards de etapas; debe ser finito y mayor que cero. Por defecto: `5000`. |
206
237
 
207
238
  La precedencia del endpoint local es `baseUrl` explícito, `ENGRAM_URL`,
@@ -267,8 +298,9 @@ vacío explícito.
267
298
  The sidebar derives ODD state from full feature-document mirrors whose `topic_key`
268
299
  is `odd/<feature>/tasks`. Each feature shows explicit task counts: done out of total,
269
300
  cancelled, in progress, blocked, and pending. Cancelled tasks are reported separately,
270
- not counted as done. See [the ODD state contract](docs/odd-state-contract.md) for the
271
- canonical checklist format and newest-valid-document selection.
301
+ not counted as done. See [the ODD state contract](https://github.com/oniricosistemas/flema-engram/blob/main/docs/odd-state-contract.md) for the
302
+ canonical checklist format and newest-valid-document selection. This shared ODD
303
+ contract also applies to Pi; the legacy workflow commands below are OpenCode-only.
272
304
 
273
305
  This is a bounded recent-observation view (up to 20 canonical project observations),
274
306
  not a complete project inventory. ODD derivation uses that entire window, not just
@@ -293,9 +325,12 @@ legacy opt-in described below.
293
325
 
294
326
  ### Bloqueos
295
327
 
296
- Lista títulos de observaciones reconocidas como bloqueos por tipo, título o frases
297
- explícitas como `status: blocked`, `blocker:`, `blocked by`, `depends on` o
298
- `waiting for`. No infiere bloqueos a partir de sentimiento o contexto ambiguo.
328
+ Lista títulos de observaciones de tipo `blocker`, o de otras observaciones con
329
+ `blocked` en el título o frases explícitas como `status: blocked`, `blocker:`,
330
+ `blocked by`, `depends on` o `waiting for`. Las observaciones `session_summary`
331
+ se excluyen de esas heurísticas de título y contenido: un resumen histórico no es
332
+ un bloqueo activo. Los registros de tipo `blocker` siguen contando. No infiere
333
+ bloqueos a partir de sentimiento o contexto ambiguo.
299
334
 
300
335
  ### Actividad reciente
301
336
 
@@ -309,7 +344,11 @@ reciente ocupa el primer lugar de **Recent Activity**. La vista muestra su títu
309
344
  el contenido completo. Así mantiene presente la referencia más nueva sin convertir
310
345
  el sidebar en un explorador de memorias.
311
346
 
312
- ### Refresh, carga y errores
347
+ ### Refresh, carga y errores — OpenCode
348
+
349
+ Pi no usa este polling ni estos atajos: refresca por eventos y con
350
+ `/engram-refresh`, que actualiza el status y notifica `Engram refreshed` o
351
+ `Engram refresh incomplete`. Las reglas de vista acotada y datos `STALE` son compartidas.
313
352
 
314
353
  - La primera carga se agenda una sola vez para el sidebar de la sesión visible.
315
354
  - El polling automático usa `pollInterval` o 30 segundos.
@@ -338,7 +377,7 @@ Si Engram conoce `mi-proyecto`, el sidebar valida ese nombre y carga sus memoria
338
377
  {
339
378
  "$schema": "https://opencode.ai/tui.json",
340
379
  "plugin": [
341
- ["opencode-flema-engram-sidebar@0.3.0", { "project": "backend-api" }]
380
+ ["opencode-flema-engram-sidebar@0.4.0", { "project": "backend-api" }]
342
381
  ]
343
382
  }
344
383
  ```
@@ -352,7 +391,7 @@ Engram. El valor debe coincidir; una configuración incorrecta queda como `unres
352
391
  {
353
392
  "$schema": "https://opencode.ai/tui.json",
354
393
  "plugin": [
355
- ["opencode-flema-engram-sidebar@0.3.0", { "pollInterval": 60000 }]
394
+ ["opencode-flema-engram-sidebar@0.4.0", { "pollInterval": 60000 }]
356
395
  ]
357
396
  }
358
397
  ```
@@ -402,9 +441,9 @@ Preservá el resto de tus plugins y opciones al fusionar la configuración.
402
441
  ### Engram aparece offline
403
442
 
404
443
  - Confirmá que Engram escuche en `127.0.0.1:7437` o en el endpoint declarado por `baseUrl`.
405
- - Probá `<baseUrl>/health` desde la misma máquina donde corre OpenCode.
406
- - Revisá firewalls o proxies locales; el plugin no intenta conectarse a un servicio
407
- cloud como alternativa.
444
+ - Probá `<baseUrl>/health` desde el proceso o máquina que carga el viewer.
445
+ - Revisá firewalls, proxies y los destinos de `Target`. El cloud solo se consulta
446
+ si está configurado; no es una alternativa automática garantizada al endpoint local.
408
447
  - Si una red o puente responde lentamente, aumentá `timeoutMs`; el mismo valor limita
409
448
  requests HTTP y etapas del refresh.
410
449
  - Una URL que no use `http:` o `https:` se rechaza dentro del sidebar con un diagnóstico
@@ -423,7 +462,8 @@ Preservá el resto de tus plugins y opciones al fusionar la configuración.
423
462
  ### Los datos parecen viejos
424
463
 
425
464
  - Mirá si Health dice `STALE` y leé el detalle de etapa/endpoint.
426
- - Esperá el próximo polling o usá <kbd>Alt</kbd>+<kbd>R</kbd>.
465
+ - En OpenCode esperá el próximo polling o usá <kbd>Alt</kbd>+<kbd>R</kbd>;
466
+ en Pi usá `/engram-refresh` (no hay polling).
427
467
  - Confirmá que la memoria pertenece exactamente al proyecto resuelto.
428
468
  - El feed solo muestra cinco títulos y la consulta del sidebar está acotada a 20
429
469
  observaciones.
@@ -544,9 +584,16 @@ La lista `files` permite publicar `dist`, `README.md` y `LICENSE`; npm agrega ad
544
584
  la metadata obligatoria. El verificador exige, como mínimo:
545
585
 
546
586
  - API raíz: `dist/index.js` y `dist/index.d.ts`;
547
- - plugin: `dist/sidebar/plugin.js` y `dist/sidebar/plugin.d.ts`;
548
- - CLI opcional: `dist/stdio.js`;
549
- - README, licencia y `package.json`.
587
+ - plugin OpenCode (`./tui`): `dist/sidebar/plugin.js` y `dist/sidebar/plugin.d.ts`;
588
+ - controller compartido (`./core`): `dist/core.js` y `dist/core.d.ts`;
589
+ - extensión Pi (`./pi`): `dist/pi.js` y `dist/pi.d.ts`, registrada en `pi.extensions`;
590
+ - panel Pi: `dist/pi/sidebar.js` y `dist/pi/sidebar.d.ts`;
591
+ - CLI de mantenimiento `flema-engram`: `dist/maintenance.js`;
592
+ - MCP opcional `mcp-flema-engram`: `dist/stdio.js`;
593
+ - `README.md`, `LICENSE` y `package.json`.
594
+
595
+ `docs/` y `site/` no se incluyen en npm; las referencias de documentación apuntan al
596
+ repositorio público.
550
597
 
551
598
  `prepublishOnly` ejecuta automáticamente:
552
599
 
@@ -592,7 +639,7 @@ Ejemplo de configuración local de OpenCode, equivalente a `opencode.example.jso
592
639
 
593
640
  The server offers read-only MCP tools and resources for health, projects,
594
641
  observations, sessions, ODD state, and explicit legacy SDD access. It uses the same
595
- local Engram HTTP service, without adding persistence or cloud synchronization.
642
+ Engram HTTP configuration (loopback by default), without adding persistence or cloud synchronization.
596
643
 
597
644
  ### ODD-first project state and explicit legacy access
598
645
 
@@ -608,7 +655,7 @@ loaded exact-project observation window. Existing project metadata, observation
608
655
  counts, explicit blockers, and recent activity remain available. Invalid mirrors
609
656
  stay visible as diagnostics and never cause SDD fallback. Counts and derived
610
657
  workflow state describe bounded recent observations, not an exhaustive inventory
611
- or historical total. See [the ODD state contract](docs/odd-state-contract.md).
658
+ or historical total. See [the ODD state contract](https://github.com/oniricosistemas/flema-engram/blob/main/docs/odd-state-contract.md).
612
659
 
613
660
  `includeLegacySdd` is an optional boolean, defaulting to `false`. By default the
614
661
  tool does not derive legacy SDD or expose `changes`. To add legacy SDD changes to
@@ -628,24 +675,31 @@ behavior is unchanged.
628
675
 
629
676
  ## Seguridad, privacidad y enfoque local-first
630
677
 
631
- - Los datos de Engram permanecen en la máquina y el runtime consulta loopback.
632
- - El sidebar no requiere credenciales, telemetría ni servicios cloud.
678
+ - Por defecto el viewer consulta loopback; no requiere un servicio cloud ni telemetría.
679
+ - Un endpoint remoto explícito o detectado por attach implica tráfico de red: los
680
+ datos no están necesariamente limitados a esta máquina.
681
+ - El factory compartido puede agregar lecturas cloud si encuentra `ENGRAM_CLOUD_URL`
682
+ o configuración en `~/.engram/cloud.json`. Puede usar `ENGRAM_CLOUD_TOKEN` o
683
+ `ENGRAM_TOKEN` como Bearer token; revisá esa configuración antes de asumir un
684
+ runtime exclusivamente local.
633
685
  - No ejecuta operaciones de escritura sobre memorias.
634
686
  - No crea logs propios con contenido de observaciones.
635
687
  - El contenido de memorias puede ser sensible: protegé el acceso al proceso y puerto
636
688
  local de Engram como protegerías cualquier herramienta de desarrollo.
637
- - Las conexiones externas solo son necesarias para tareas ajenas al runtime local,
638
- como instalar desde npm o abrir enlaces de documentación.
689
+ - Instalar desde npm y abrir documentación también puede requerir conexiones externas.
639
690
 
640
- El repositorio contiene una clase experimental de adaptador cloud con operaciones no
641
- implementadas. No forma parte del flujo del plugin ni constituye soporte cloud.
691
+ El adaptador cloud implementa lecturas HTTP y puede combinarse con el local; no es
692
+ un servicio alojado ni un mecanismo de sincronización. No se promete seguridad de
693
+ transporte para despliegues arbitrarios: el adaptador cloud permite certificados TLS
694
+ no verificados por defecto. Preferí loopback o una red controlada y no envíes tokens
695
+ a destinos no confiables.
642
696
 
643
697
  ## Roadmap y alcance diferido
644
698
 
645
699
  Están explícitamente fuera del MVP actual:
646
700
 
647
701
  - dashboard visual y acciones/atajos para abrirlo;
648
- - conexión remota mediante `opencode attach`;
702
+ - túneles automáticos y compatibilidad garantizada con cualquier despliegue attach;
649
703
  - selector manual de proyecto, navegación `j`/`k` y más atajos globales;
650
704
  - sincronización cloud y edición de memorias.
651
705
 
@@ -0,0 +1,49 @@
1
+ import type { SidebarViewModel } from "../viewer/core.js";
2
+ export interface PiSidebarTheme {
3
+ fg: (token: string, text: string) => string;
4
+ bold?: (text: string) => string;
5
+ }
6
+ export interface PiSidebarRenderHost {
7
+ requestRender: () => void;
8
+ }
9
+ export interface PiSidebarMouseEvent {
10
+ type: string;
11
+ button: string;
12
+ x: number;
13
+ y: number;
14
+ width: number;
15
+ height: number;
16
+ [key: string]: unknown;
17
+ }
18
+ export interface PiSidebarMouseResult {
19
+ handled?: boolean;
20
+ render?: boolean;
21
+ [key: string]: unknown;
22
+ }
23
+ export interface PiSidebarPanel {
24
+ render: (width: number) => string[];
25
+ invalidate: () => void;
26
+ digest: () => string;
27
+ handleMouse?: (event: PiSidebarMouseEvent) => PiSidebarMouseResult | undefined;
28
+ setState: (state: SidebarViewModel) => void;
29
+ setCollapsed: (collapsed: boolean) => void;
30
+ isCollapsed: () => boolean;
31
+ }
32
+ export interface PiSidebarTui extends PiSidebarRenderHost {
33
+ mode?: string;
34
+ terminal?: Record<symbol, unknown>;
35
+ }
36
+ export interface GentleShellRailAttachment {
37
+ isMounted: () => boolean;
38
+ isActive: () => boolean;
39
+ setVisible: (visible: boolean) => void;
40
+ invalidate: () => void;
41
+ dispose: () => void;
42
+ }
43
+ export declare const GENTLE_SHELL_SIDEBAR_STATE: unique symbol;
44
+ type RailComponent = Pick<PiSidebarPanel, "render" | "invalidate" | "digest" | "handleMouse">;
45
+ export declare function visibleTextWidth(value: string): number;
46
+ export declare function attachGentleShellRailPanel(tui: PiSidebarTui, component: RailComponent): GentleShellRailAttachment | undefined;
47
+ export declare function createPiSidebarPanel(tui: PiSidebarRenderHost, theme: PiSidebarTheme, initialState: SidebarViewModel, onCollapsedChange?: (collapsed: boolean) => void): PiSidebarPanel;
48
+ export {};
49
+ //# sourceMappingURL=sidebar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sidebar.d.ts","sourceRoot":"","sources":["../../src/pi/sidebar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE1D,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAC5C,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,MAAM,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;IACpC,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,MAAM,EAAE,MAAM,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,oBAAoB,GAAG,SAAS,CAAC;IAC/E,QAAQ,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC5C,YAAY,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3C,WAAW,EAAE,MAAM,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,YAAa,SAAQ,mBAAmB;IACvD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,yBAAyB;IACxC,SAAS,EAAE,MAAM,OAAO,CAAC;IACzB,QAAQ,EAAE,MAAM,OAAO,CAAC;IACxB,UAAU,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,eAAO,MAAM,0BAA0B,eAAqD,CAAC;AAG7F,KAAK,aAAa,GAAG,IAAI,CAAC,cAAc,EAAE,QAAQ,GAAG,YAAY,GAAG,QAAQ,GAAG,aAAa,CAAC,CAAC;AAoB9F,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAStD;AAgLD,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,YAAY,EACjB,SAAS,EAAE,aAAa,GACvB,yBAAyB,GAAG,SAAS,CAuDvC;AAED,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,mBAAmB,EACxB,KAAK,EAAE,cAAc,EACrB,YAAY,EAAE,gBAAgB,EAC9B,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,GAC/C,cAAc,CAyFhB"}
@@ -0,0 +1,335 @@
1
+ export const GENTLE_SHELL_SIDEBAR_STATE = Symbol.for("gentle-pi.experimental-sidebar.state");
2
+ const SHARED_RAIL_STACK = Symbol.for("mcp-sidebar.gentle-shell-rail-stack");
3
+ const ANSI_PATTERN = /\u001B(?:\[[0-?]*[ -/]*[@-~]|\][^\u0007]*(?:\u0007|\u001B\\))/g;
4
+ const COMBINING_MARK_PATTERN = /\p{Mark}/u;
5
+ export function visibleTextWidth(value) {
6
+ let width = 0;
7
+ for (const character of value.replace(ANSI_PATTERN, "")) {
8
+ const codePoint = character.codePointAt(0) ?? 0;
9
+ if (codePoint === 0 || codePoint < 32 || (codePoint >= 0x7f && codePoint < 0xa0))
10
+ continue;
11
+ if (COMBINING_MARK_PATTERN.test(character) || codePoint === 0xfe0f || codePoint === 0x200d)
12
+ continue;
13
+ width += isWideCodePoint(codePoint) ? 2 : 1;
14
+ }
15
+ return width;
16
+ }
17
+ function isWideCodePoint(codePoint) {
18
+ return codePoint >= 0x1100 && (codePoint <= 0x115f ||
19
+ codePoint === 0x2329 ||
20
+ codePoint === 0x232a ||
21
+ (codePoint >= 0x2e80 && codePoint <= 0xa4cf && codePoint !== 0x303f) ||
22
+ (codePoint >= 0xac00 && codePoint <= 0xd7a3) ||
23
+ (codePoint >= 0xf900 && codePoint <= 0xfaff) ||
24
+ (codePoint >= 0xfe10 && codePoint <= 0xfe19) ||
25
+ (codePoint >= 0xfe30 && codePoint <= 0xfe6f) ||
26
+ (codePoint >= 0xff00 && codePoint <= 0xff60) ||
27
+ (codePoint >= 0xffe0 && codePoint <= 0xffe6) ||
28
+ (codePoint >= 0x1f300 && codePoint <= 0x1faff) ||
29
+ (codePoint >= 0x20000 && codePoint <= 0x3fffd));
30
+ }
31
+ function truncateText(value, width) {
32
+ if (width <= 0)
33
+ return "";
34
+ if (visibleTextWidth(value) <= width)
35
+ return value;
36
+ if (width === 1)
37
+ return "…";
38
+ let result = "";
39
+ let used = 0;
40
+ for (const character of value) {
41
+ const characterWidth = visibleTextWidth(character);
42
+ if (used + characterWidth > width - 1)
43
+ break;
44
+ result += character;
45
+ used += characterWidth;
46
+ }
47
+ return `${result}…`;
48
+ }
49
+ function aggregateOddProgress(state) {
50
+ return (state.odd?.features ?? []).reduce((total, feature) => ({
51
+ total: total.total + feature.progress.total,
52
+ done: total.done + feature.progress.done,
53
+ inProgress: total.inProgress + feature.progress.in_progress,
54
+ blocked: total.blocked + feature.progress.blocked,
55
+ }), { total: 0, done: 0, inProgress: 0, blocked: 0 });
56
+ }
57
+ function healthToken(state) {
58
+ if (state.health === "ok")
59
+ return "success";
60
+ if (state.health === "loading" || state.health === "stale")
61
+ return "warning";
62
+ return "error";
63
+ }
64
+ function panelDigest(state, collapsed) {
65
+ const progress = aggregateOddProgress(state);
66
+ return JSON.stringify({
67
+ collapsed,
68
+ projectName: state.projectName,
69
+ health: state.health,
70
+ loading: state.loading,
71
+ progress,
72
+ blockers: state.blockers.map((item) => [item.id, item.title, item.updated_at]),
73
+ recent: state.recentActivity.map((item) => [item.id, item.title, item.updated_at]),
74
+ error: state.error,
75
+ terminal: state.terminal,
76
+ });
77
+ }
78
+ function isRailComponent(value) {
79
+ return typeof value === "object" && value !== null
80
+ && typeof value.render === "function"
81
+ && typeof value.invalidate === "function";
82
+ }
83
+ function readRailHost(terminal) {
84
+ const candidate = terminal[GENTLE_SHELL_SIDEBAR_STATE];
85
+ if (typeof candidate !== "object" || candidate === null)
86
+ return undefined;
87
+ const parts = candidate.parts;
88
+ return parts instanceof Map ? candidate : undefined;
89
+ }
90
+ function hostOwnsRail(host) {
91
+ if (typeof host.ownsHost !== "function")
92
+ return host.active !== false;
93
+ try {
94
+ return host.ownsHost() === true;
95
+ }
96
+ catch {
97
+ return false;
98
+ }
99
+ }
100
+ function isSharedRailStack(value, host) {
101
+ if (typeof value !== "object" || value === null)
102
+ return false;
103
+ const stack = value;
104
+ return stack.host === host
105
+ && isRailComponent(stack.original)
106
+ && isRailComponent(stack.wrapper)
107
+ && stack.participants instanceof Map
108
+ && Array.isArray(stack.segments)
109
+ && typeof stack.revision === "number";
110
+ }
111
+ function createSharedRailStack(host, original) {
112
+ let stack;
113
+ const wrapper = {
114
+ render(width) {
115
+ const lines = [];
116
+ const segments = [];
117
+ const append = (component) => {
118
+ const rendered = [...component.render(width)];
119
+ if (rendered.length === 0)
120
+ return;
121
+ segments.push({ component, startY: lines.length, height: rendered.length });
122
+ lines.push(...rendered);
123
+ };
124
+ append(original);
125
+ for (const participant of stack.participants.values()) {
126
+ if (participant.visible)
127
+ append(participant.component);
128
+ }
129
+ stack.segments = segments;
130
+ return lines;
131
+ },
132
+ invalidate() {
133
+ stack.revision++;
134
+ stack.segments = [];
135
+ original.invalidate();
136
+ for (const participant of stack.participants.values())
137
+ participant.component.invalidate();
138
+ },
139
+ digest() {
140
+ let originalDigest = "";
141
+ try {
142
+ originalDigest = original.digest?.() ?? "";
143
+ }
144
+ catch {
145
+ // Explicit invalidation remains the fallback when a digest cannot be read.
146
+ }
147
+ const participants = [...stack.participants.values()]
148
+ .filter((participant) => participant.visible)
149
+ .map((participant) => {
150
+ try {
151
+ return participant.component.digest?.() ?? "";
152
+ }
153
+ catch {
154
+ return "";
155
+ }
156
+ });
157
+ return JSON.stringify([originalDigest, stack.revision, participants]);
158
+ },
159
+ handleMouse(event) {
160
+ if (event.y < 0 || event.y >= event.height)
161
+ return undefined;
162
+ const segment = stack.segments.find((candidate) => event.y >= candidate.startY
163
+ && event.y < candidate.startY + candidate.height);
164
+ if (!segment)
165
+ return undefined;
166
+ const result = segment.component.handleMouse?.({
167
+ ...event,
168
+ y: event.y - segment.startY,
169
+ height: segment.height,
170
+ });
171
+ if (result?.render)
172
+ stack.revision++;
173
+ return result;
174
+ },
175
+ };
176
+ stack = {
177
+ host,
178
+ original,
179
+ wrapper,
180
+ participants: new Map(),
181
+ revision: 0,
182
+ segments: [],
183
+ };
184
+ return stack;
185
+ }
186
+ export function attachGentleShellRailPanel(tui, component) {
187
+ if (tui.mode !== "fullscreen" || !tui.terminal)
188
+ return undefined;
189
+ const terminal = tui.terminal;
190
+ const host = readRailHost(terminal);
191
+ if (!host)
192
+ return undefined;
193
+ const existing = terminal[SHARED_RAIL_STACK];
194
+ let stack;
195
+ if (isSharedRailStack(existing, host) && host.parts.get("footer") === existing.wrapper) {
196
+ stack = existing;
197
+ }
198
+ else {
199
+ const original = host.parts.get("footer");
200
+ if (!isRailComponent(original))
201
+ return undefined;
202
+ stack = createSharedRailStack(host, original);
203
+ terminal[SHARED_RAIL_STACK] = stack;
204
+ host.parts.set("footer", stack.wrapper);
205
+ }
206
+ const participantId = Symbol("flema-engram-rail-participant");
207
+ const participant = { component, visible: true };
208
+ stack.participants.set(participantId, participant);
209
+ stack.revision++;
210
+ tui.requestRender();
211
+ let disposed = false;
212
+ const isMounted = () => !disposed && host.parts.get("footer") === stack.wrapper;
213
+ const invalidate = () => {
214
+ if (disposed)
215
+ return;
216
+ stack.revision++;
217
+ stack.segments = [];
218
+ tui.requestRender();
219
+ };
220
+ return {
221
+ isMounted,
222
+ isActive: () => isMounted() && hostOwnsRail(host),
223
+ setVisible(visible) {
224
+ if (disposed || participant.visible === visible)
225
+ return;
226
+ participant.visible = visible;
227
+ invalidate();
228
+ },
229
+ invalidate,
230
+ dispose() {
231
+ if (disposed)
232
+ return;
233
+ disposed = true;
234
+ stack.participants.delete(participantId);
235
+ stack.revision++;
236
+ stack.segments = [];
237
+ if (stack.participants.size === 0) {
238
+ if (host.parts.get("footer") === stack.wrapper)
239
+ host.parts.set("footer", stack.original);
240
+ if (terminal[SHARED_RAIL_STACK] === stack)
241
+ delete terminal[SHARED_RAIL_STACK];
242
+ }
243
+ tui.requestRender();
244
+ },
245
+ };
246
+ }
247
+ export function createPiSidebarPanel(tui, theme, initialState, onCollapsedChange) {
248
+ let state = initialState;
249
+ let collapsed = false;
250
+ const paint = (token, text, bold = false) => {
251
+ const emphasized = bold && theme.bold ? theme.bold(text) : text;
252
+ return theme.fg(token, emphasized);
253
+ };
254
+ const render = (width) => {
255
+ const boundedWidth = Math.max(0, Math.floor(width));
256
+ if (boundedWidth === 0)
257
+ return [];
258
+ if (boundedWidth === 1)
259
+ return [paint("dim", "…")];
260
+ const border = (text) => paint("border", text);
261
+ const title = truncateText(`${collapsed ? "▶" : "▼"} 🧠 Engram`, boundedWidth - 6);
262
+ const top = title
263
+ ? border("╭─ ") + paint("accent", title, true)
264
+ + border(` ${"─".repeat(boundedWidth - visibleTextWidth(title) - 5)}╮`)
265
+ : border(`╭${"─".repeat(boundedWidth - 2)}╮`);
266
+ const bottom = border(`╰${"─".repeat(boundedWidth - 2)}╯`);
267
+ const padding = boundedWidth >= 4 ? " " : "";
268
+ const contentWidth = boundedWidth - 2 - padding.length * 2;
269
+ const row = (token, text, bold = false) => {
270
+ const bounded = truncateText(text, contentWidth);
271
+ const padded = bounded + " ".repeat(contentWidth - visibleTextWidth(bounded));
272
+ return border(`│${padding}`) + paint(token, padded, bold) + border(`${padding}│`);
273
+ };
274
+ const project = state.projectName ?? "unresolved project";
275
+ const health = state.health.toUpperCase();
276
+ const lines = [top, row(healthToken(state), `${project} · ${health}`)];
277
+ if (collapsed)
278
+ return [...lines, bottom];
279
+ const progress = aggregateOddProgress(state);
280
+ lines.push(row("text", progress.total > 0
281
+ ? `ODD ${progress.done}/${progress.total} done · ${progress.inProgress} active · ${progress.blocked} blocked`
282
+ : "ODD no tracked feature"));
283
+ if (state.error)
284
+ lines.push(row("error", state.error));
285
+ lines.push(row("warning", `Blockers · ${state.blockers.length}`, true));
286
+ if (state.blockers.length === 0) {
287
+ lines.push(row("muted", "No blockers"));
288
+ }
289
+ else {
290
+ for (const item of state.blockers.slice(0, 3)) {
291
+ lines.push(row("muted", `• ${item.title}`));
292
+ }
293
+ }
294
+ lines.push(row("accent", "Recent", true));
295
+ if (state.recentActivity.length === 0) {
296
+ lines.push(row("muted", "No recent activity"));
297
+ }
298
+ else {
299
+ for (const item of state.recentActivity.slice(0, 3)) {
300
+ lines.push(row("muted", `• ${item.title}`));
301
+ }
302
+ }
303
+ return [...lines, bottom];
304
+ };
305
+ const setCollapsed = (nextCollapsed) => {
306
+ if (collapsed === nextCollapsed)
307
+ return;
308
+ collapsed = nextCollapsed;
309
+ tui.requestRender();
310
+ };
311
+ return {
312
+ render,
313
+ handleMouse(event) {
314
+ if (event.button !== "left" || event.y !== 0 || event.height <= 0
315
+ || event.x < 0 || event.x >= event.width)
316
+ return undefined;
317
+ if (event.type === "press")
318
+ return { handled: true, render: false };
319
+ if (event.type !== "click")
320
+ return undefined;
321
+ setCollapsed(!collapsed);
322
+ onCollapsedChange?.(collapsed);
323
+ return { handled: true, render: true };
324
+ },
325
+ invalidate: () => tui.requestRender(),
326
+ digest: () => panelDigest(state, collapsed),
327
+ setState: (nextState) => {
328
+ state = nextState;
329
+ tui.requestRender();
330
+ },
331
+ setCollapsed,
332
+ isCollapsed: () => collapsed,
333
+ };
334
+ }
335
+ //# sourceMappingURL=sidebar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sidebar.js","sourceRoot":"","sources":["../../src/pi/sidebar.ts"],"names":[],"mappings":"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"}
package/dist/pi.d.ts CHANGED
@@ -1,15 +1,37 @@
1
1
  import type { EngramAdapter } from "./adapters/types.js";
2
2
  import { type ProjectResolution } from "./utils/project-resolver.js";
3
+ import { type PiSidebarPanel, type PiSidebarTheme, type PiSidebarTui } from "./pi/sidebar.js";
4
+ export interface PiExtensionOverlayHandle {
5
+ setHidden: (hidden: boolean) => void;
6
+ isHidden?: () => boolean;
7
+ }
3
8
  export interface PiExtensionUi {
4
9
  setStatus: (key: string, value: string | undefined) => void;
5
10
  setWidget: (key: string, value: string[] | undefined, options?: {
6
11
  placement?: "aboveEditor" | "belowEditor";
7
12
  }) => void;
8
13
  notify: (message: string, level?: "info" | "warning" | "error") => void;
14
+ custom?: (factory: (tui: PiSidebarTui, theme: PiSidebarTheme, keybindings: unknown, done: (value: unknown) => void) => PiSidebarPanel | Promise<PiSidebarPanel>, options: {
15
+ overlay: true;
16
+ overlayOptions: {
17
+ anchor: "bottom-right";
18
+ width: number;
19
+ minWidth: number;
20
+ maxHeight: string;
21
+ margin: {
22
+ right: number;
23
+ bottom: number;
24
+ };
25
+ nonCapturing: true;
26
+ visible: (terminalWidth: number, terminalHeight: number) => boolean;
27
+ };
28
+ onHandle: (handle: PiExtensionOverlayHandle) => void;
29
+ }) => Promise<unknown>;
9
30
  }
10
31
  export interface PiExtensionContext {
11
32
  cwd: string;
12
33
  hasUI: boolean;
34
+ mode?: "tui" | "rpc" | "json" | "print";
13
35
  ui: PiExtensionUi;
14
36
  }
15
37
  export interface PiToolResultEvent {
package/dist/pi.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"pi.d.ts","sourceRoot":"","sources":["../src/pi.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAQzD,OAAO,EAEL,KAAK,iBAAiB,EACvB,MAAM,6BAA6B,CAAC;AAMrC,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;IAC5D,SAAS,EAAE,CACT,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EAAE,GAAG,SAAS,EAC3B,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,aAAa,GAAG,aAAa,CAAA;KAAE,KACpD,IAAI,CAAC;IACV,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,KAAK,IAAI,CAAC;CACzE;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,OAAO,CAAC;IACf,EAAE,EAAE,aAAa,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,aAAa,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,CACF,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,kBAAkB,KAAK,OAAO,KAC9E,MAAM,IAAI,CAAC;IAChB,eAAe,EAAE,CACf,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;QACP,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,KAAK,OAAO,CAAC;KACjE,KACE,IAAI,CAAC;CACX;AAED,MAAM,WAAW,6BAA6B;IAC5C,aAAa,CAAC,EAAE,MAAM,aAAa,CAAC;IACpC,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC;CACtF;AAQD,wBAAgB,uBAAuB,CACrC,YAAY,GAAE,6BAAkC,GAC/C,CAAC,EAAE,EAAE,cAAc,KAAK,IAAI,CAoF9B;6BApFO,cAAc,KAAK,IAAI;AA8H/B,wBAAyC"}
1
+ {"version":3,"file":"pi.d.ts","sourceRoot":"","sources":["../src/pi.ts"],"names":[],"mappings":"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"}
package/dist/pi.js CHANGED
@@ -1,8 +1,12 @@
1
1
  import { createConfiguredAdapter } from "./adapters/factory.js";
2
2
  import { createEngramReadController, } from "./viewer/core.js";
3
3
  import { resolveProject as resolveValidatedProject, } from "./utils/project-resolver.js";
4
+ import { attachGentleShellRailPanel, createPiSidebarPanel, } from "./pi/sidebar.js";
4
5
  const UI_KEY = "flema-engram";
5
6
  const REFRESH_COMMAND = "engram-refresh";
7
+ const SIDEBAR_COMMAND = "engram-sidebar";
8
+ const SIDEBAR_COLLAPSE_COMMAND = "engram-sidebar-collapse";
9
+ const WIDGET_COMMAND = "engram-widget";
6
10
  const MEMORY_SAVE_TOOLS = new Set(["mem_save", "save_memory"]);
7
11
  export function createPiEngramExtension(dependencies = {}) {
8
12
  const createAdapter = dependencies.createAdapter ?? (() => createConfiguredAdapter());
@@ -10,6 +14,7 @@ export function createPiEngramExtension(dependencies = {}) {
10
14
  ?? ((adapter, cwd) => resolveValidatedProject(adapter, cwd));
11
15
  return (pi) => {
12
16
  let active;
17
+ let presentation;
13
18
  let sessionToken;
14
19
  const clearUi = (context) => {
15
20
  if (!context.hasUI)
@@ -17,16 +22,88 @@ export function createPiEngramExtension(dependencies = {}) {
17
22
  context.ui.setStatus(UI_KEY, undefined);
18
23
  context.ui.setWidget(UI_KEY, undefined);
19
24
  };
25
+ const syncPresentation = (current) => {
26
+ current.rail?.setVisible(current.visible);
27
+ current.rail?.invalidate();
28
+ current.handle?.setHidden(!current.visible || current.rail?.isActive() === true);
29
+ };
30
+ const setPresentationCollapsed = (current, collapsed) => {
31
+ if (presentation !== current)
32
+ return;
33
+ current.collapsed = collapsed;
34
+ current.panel?.setCollapsed(collapsed);
35
+ current.rail?.invalidate();
36
+ };
37
+ const stopPresentation = () => {
38
+ const current = presentation;
39
+ presentation = undefined;
40
+ if (!current)
41
+ return;
42
+ current.rail?.dispose();
43
+ current.finish?.();
44
+ };
20
45
  const stopActive = () => {
46
+ stopPresentation();
21
47
  if (!active)
22
48
  return;
23
49
  active.controller.dispose();
24
50
  clearUi(active.context);
25
51
  active = undefined;
26
52
  };
53
+ const mountSidebar = (context, token, getState) => {
54
+ if (context.mode !== "tui" || !context.ui.custom)
55
+ return;
56
+ const current = {
57
+ token,
58
+ visible: true,
59
+ collapsed: false,
60
+ };
61
+ presentation = current;
62
+ void context.ui.custom((tui, theme, _keybindings, done) => {
63
+ const panel = createPiSidebarPanel(tui, theme, getState(), (collapsed) => {
64
+ if (current.panel !== panel)
65
+ return;
66
+ setPresentationCollapsed(current, collapsed);
67
+ });
68
+ panel.setCollapsed(current.collapsed);
69
+ if (presentation?.token !== token) {
70
+ done(undefined);
71
+ return panel;
72
+ }
73
+ current.rail?.dispose();
74
+ current.finish = () => done(undefined);
75
+ current.panel = panel;
76
+ current.rail = attachGentleShellRailPanel(tui, panel);
77
+ syncPresentation(current);
78
+ return panel;
79
+ }, {
80
+ overlay: true,
81
+ overlayOptions: {
82
+ anchor: "bottom-right",
83
+ width: 48,
84
+ minWidth: 29,
85
+ maxHeight: "70%",
86
+ margin: { right: 2, bottom: 1 },
87
+ nonCapturing: true,
88
+ visible: (terminalWidth) => current.visible && current.rail?.isActive() !== true && terminalWidth >= 100,
89
+ },
90
+ onHandle: (handle) => {
91
+ current.handle = handle;
92
+ syncPresentation(current);
93
+ },
94
+ }).catch(() => {
95
+ if (presentation?.token === token) {
96
+ context.ui.notify("Engram sidebar unavailable", "warning");
97
+ }
98
+ }).finally(() => {
99
+ current.rail?.dispose();
100
+ if (presentation?.token === token)
101
+ presentation = undefined;
102
+ });
103
+ };
27
104
  const renderUnavailable = (context) => {
28
105
  context.ui.setStatus(UI_KEY, "Engram unavailable");
29
- context.ui.setWidget(UI_KEY, ["Engram unavailable"], { placement: "belowEditor" });
106
+ context.ui.setWidget(UI_KEY, undefined);
30
107
  };
31
108
  const refreshActive = async () => {
32
109
  const current = active;
@@ -48,10 +125,15 @@ export function createPiEngramExtension(dependencies = {}) {
48
125
  onState: (state) => {
49
126
  if (active?.token !== token)
50
127
  return;
51
- renderState(context, state);
128
+ renderState(active.context, state, active.widgetVisible);
129
+ if (presentation?.token === token) {
130
+ presentation.panel?.setState(state);
131
+ presentation.rail?.invalidate();
132
+ }
52
133
  },
53
134
  });
54
- active = { controller, context, token };
135
+ active = { controller, context, token, widgetVisible: false };
136
+ mountSidebar(context, token, controller.getState);
55
137
  await refreshActive();
56
138
  }
57
139
  catch {
@@ -77,8 +159,13 @@ export function createPiEngramExtension(dependencies = {}) {
77
159
  context.ui.notify("Engram viewer is not active", "warning");
78
160
  return;
79
161
  }
162
+ const current = active;
163
+ current.context = context;
80
164
  const outcome = await refreshActive();
81
- if (outcome?.status === "success") {
165
+ if (active !== current || !outcome)
166
+ return;
167
+ renderState(context, current.controller.getState(), current.widgetVisible);
168
+ if (outcome.status === "success") {
82
169
  context.ui.notify("Engram refreshed", "info");
83
170
  }
84
171
  else {
@@ -86,12 +173,47 @@ export function createPiEngramExtension(dependencies = {}) {
86
173
  }
87
174
  },
88
175
  });
176
+ pi.registerCommand(SIDEBAR_COMMAND, {
177
+ description: "Show or hide the Flema Engram sidebar",
178
+ handler: async (_args, context) => {
179
+ if (!active || !presentation) {
180
+ context.ui.notify("Engram sidebar is not active", "warning");
181
+ return;
182
+ }
183
+ presentation.visible = !presentation.visible;
184
+ syncPresentation(presentation);
185
+ context.ui.notify(`Engram sidebar ${presentation.visible ? "shown" : "hidden"}`, "info");
186
+ },
187
+ });
188
+ pi.registerCommand(SIDEBAR_COLLAPSE_COMMAND, {
189
+ description: "Collapse or expand the Flema Engram sidebar",
190
+ handler: async (_args, context) => {
191
+ if (!active || !presentation) {
192
+ context.ui.notify("Engram sidebar is not active", "warning");
193
+ return;
194
+ }
195
+ setPresentationCollapsed(presentation, !presentation.collapsed);
196
+ context.ui.notify(`Engram sidebar ${presentation.collapsed ? "collapsed" : "expanded"}`, "info");
197
+ },
198
+ });
199
+ pi.registerCommand(WIDGET_COMMAND, {
200
+ description: "Show or hide the compact Flema Engram widget for this session",
201
+ handler: async (_args, context) => {
202
+ if (!active) {
203
+ context.ui.notify("Engram viewer is not active", "warning");
204
+ return;
205
+ }
206
+ active.widgetVisible = !active.widgetVisible;
207
+ renderState(active.context, active.controller.getState(), active.widgetVisible);
208
+ context.ui.notify(`Engram widget ${active.widgetVisible ? "shown" : "hidden"}`, "info");
209
+ },
210
+ });
89
211
  };
90
212
  }
91
213
  function isPiToolResultEvent(event) {
92
214
  return typeof event.toolName === "string" && typeof event.isError === "boolean";
93
215
  }
94
- function renderState(context, state) {
216
+ function renderState(context, state, widgetVisible = false) {
95
217
  const health = state.health.toUpperCase();
96
218
  const project = state.projectName ?? "unresolved project";
97
219
  const progress = aggregateOddProgress(state);
@@ -102,6 +224,10 @@ function renderState(context, state) {
102
224
  if (blockerCount > 0)
103
225
  statusParts.push(`${blockerCount} blocked`);
104
226
  context.ui.setStatus(UI_KEY, statusParts.join(" · "));
227
+ if (!widgetVisible) {
228
+ context.ui.setWidget(UI_KEY, undefined);
229
+ return;
230
+ }
105
231
  const lines = [`Engram · ${project} [${health}]`];
106
232
  lines.push(progress.total > 0
107
233
  ? `ODD ${progress.done}/${progress.total} done · ${progress.inProgress} active · ${blockerCount} blocked`
package/dist/pi.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"pi.js","sourceRoot":"","sources":["../src/pi.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pi.js","sourceRoot":"","sources":["../src/pi.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"sdd-detector.d.ts","sourceRoot":"","sources":["../../src/utils/sdd-detector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,eAAO,MAAM,UAAU,mGAUb,CAAC;AAEX,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;AACvD,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,aAAa,GAAG,WAAW,GAAG,UAAU,CAAC;AAE/E,MAAM,WAAW,WAAW;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,YAAY,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,YAAY,CAAC;IACpB,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,MAAM,CAAC;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,cAAc,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,SAAS,EAAE,WAAW,EAAE,CAAC;IACzB,QAAQ,EAAE,WAAW,EAAE,CAAC;CACzB;AAUD,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAMzE;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG;IAClD,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,YAAY,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,IAAI,CAOP;AASD,wBAAgB,eAAe,CAAC,YAAY,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE,CAS1E;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,GAAG,cAAc,CAMjF;AAMD,wBAAgB,aAAa,CAAC,YAAY,EAAE,WAAW,EAAE,GAAG,SAAS,EAAE,CA8DtE"}
1
+ {"version":3,"file":"sdd-detector.d.ts","sourceRoot":"","sources":["../../src/utils/sdd-detector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,eAAO,MAAM,UAAU,mGAUb,CAAC;AAEX,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;AACvD,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,aAAa,GAAG,WAAW,GAAG,UAAU,CAAC;AAE/E,MAAM,WAAW,WAAW;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,YAAY,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,YAAY,CAAC;IACpB,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,MAAM,CAAC;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,cAAc,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,SAAS,EAAE,WAAW,EAAE,CAAC;IACzB,QAAQ,EAAE,WAAW,EAAE,CAAC;CACzB;AAUD,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAMzE;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG;IAClD,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,YAAY,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,IAAI,CAOP;AASD,wBAAgB,eAAe,CAAC,YAAY,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE,CAW1E;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,GAAG,cAAc,CAMjF;AAMD,wBAAgB,aAAa,CAAC,YAAY,EAAE,WAAW,EAAE,GAAG,SAAS,EAAE,CA8DtE"}
@@ -40,9 +40,12 @@ const BLOCKER_CONTENT = [
40
40
  ];
41
41
  export function collectBlockers(observations) {
42
42
  return observations
43
- .filter((observation) => observation.type.toLowerCase() === "blocker" ||
44
- /\bblocked\b/i.test(observation.title) ||
45
- BLOCKER_CONTENT.some((pattern) => pattern.test(observation.content)))
43
+ .filter((observation) => {
44
+ const type = observation.type.toLowerCase();
45
+ return type === "blocker" ||
46
+ type !== "session_summary" && (/\bblocked\b/i.test(observation.title) ||
47
+ BLOCKER_CONTENT.some((pattern) => pattern.test(observation.content)));
48
+ })
46
49
  .sort(compareNewestObservation);
47
50
  }
48
51
  export function deriveChangeState(phases) {
@@ -1 +1 @@
1
- {"version":3,"file":"sdd-detector.js","sourceRoot":"","sources":["../../src/utils/sdd-detector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sdd-detector.js","sourceRoot":"","sources":["../../src/utils/sdd-detector.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "opencode-flema-engram-sidebar",
3
- "version": "0.3.0",
4
- "description": "Local-first OpenCode plugin/sidebar for Engram memory and SDD context, with an optional MCP stdio adapter",
3
+ "version": "0.4.0",
4
+ "description": "Read-only Engram viewers for OpenCode and Pi/Gentle Shell with ODD-first project context and an optional MCP stdio adapter",
5
5
  "type": "module",
6
6
  "exports": {
7
7
  ".": {
@@ -54,7 +54,9 @@
54
54
  "engram",
55
55
  "local-first",
56
56
  "developer-tools",
57
- "sdd",
57
+ "odd",
58
+ "pi",
59
+ "gentle-shell",
58
60
  "memory",
59
61
  "mcp",
60
62
  "pi-package"