ei-tui 1.6.0 → 1.6.2

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.
@@ -33,6 +33,16 @@ export function buildIdentitySection(persona: ResponsePromptData["persona"]): st
33
33
  ${description}`;
34
34
  }
35
35
 
36
+ // =============================================================================
37
+ // NOTES SECTION
38
+ // =============================================================================
39
+
40
+ export function buildNotesSection(notes: string[] | undefined): string {
41
+ if (!notes || notes.length === 0) return "";
42
+ const list = notes.map((n, i) => `${i + 1}. ${n}`).join("\n");
43
+ return `## Your Notes\n\nThings you've chosen to remember. Use \`clear_note\` once you've addressed something.\n\n${list}`;
44
+ }
45
+
36
46
  // =============================================================================
37
47
  // GUIDELINES SECTION
38
48
  // =============================================================================
@@ -33,6 +33,7 @@ export interface ResponsePromptData {
33
33
  include_message_timestamps?: boolean;
34
34
  /** Proposed identity revision pending human review. Persona carries this as ambient self-awareness — no critique, just the proposed changes. */
35
35
  pending_update?: PersonaEntity["pending_update"];
36
+ notes?: string[];
36
37
  };
37
38
  human: {
38
39
  name: string;
@@ -21,6 +21,7 @@ import {
21
21
  buildHumanSection,
22
22
  buildQuotesSection,
23
23
  buildToolsSection,
24
+ buildNotesSection,
24
25
  } from "../response/sections.js";
25
26
 
26
27
  export type {
@@ -42,6 +43,7 @@ export function buildRoomResponsePrompt(data: RoomResponsePromptData): PromptOut
42
43
  const aliasText = persona.aliases.length > 0 ? ` (also known as: ${persona.aliases.join(", ")})` : "";
43
44
 
44
45
  const identity = `You are ${name}${aliasText}.\n\n${desc}`;
46
+ const notesSection = buildNotesSection(persona.notes);
45
47
  const traits = buildRoomTraitsSection(persona.traits);
46
48
  const topics = buildRoomTopicsSection(persona.topics);
47
49
  const humanSection = buildHumanSection(human);
@@ -57,6 +59,7 @@ export function buildRoomResponsePrompt(data: RoomResponsePromptData): PromptOut
57
59
 
58
60
  const system = [
59
61
  identity,
62
+ notesSection,
60
63
  traits,
61
64
  topics,
62
65
  humanSection,
@@ -35,6 +35,7 @@ export interface RoomResponsePromptData {
35
35
  traits: PersonaTrait[];
36
36
  topics: PersonaTopic[];
37
37
  include_message_timestamps?: boolean;
38
+ notes?: string[];
38
39
  };
39
40
  other_participants: RoomParticipantIdentity[];
40
41
  human: {
package/tui/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Ei TUI is built with OpenTUI and SolidJS.
4
4
 
5
- Coding tool integrations (OpenCode, Claude Code, Cursor): enable via `/settings` · export data via [CLI](../src/cli/README.md)
5
+ Coding tool integrations (OpenCode, Claude Code, Cursor, Codex): enable via `/settings` · export data via [CLI](../src/cli/README.md)
6
6
 
7
7
  ## How Ei Handles Configuration
8
8
 
@@ -29,17 +29,18 @@ The one exception is `EI_DATA_PATH` (and `EI_SYNC_USERNAME` / `EI_SYNC_PASSWORD`
29
29
 
30
30
  ## Coding Tool Integrations
31
31
 
32
- Enable any or all three in `/settings`. They work independently and feed into the same knowledge base.
32
+ Enable any or all four in `/settings`. They work independently and feed into the same knowledge base.
33
33
 
34
34
  | Tool | Settings key | Session data location |
35
35
  |------|-------------|----------------------|
36
36
  | OpenCode | `opencode.integration: true` | OpenCode's local SQLite / JSON session store |
37
37
  | Claude Code | `claudeCode.integration: true` | `~/.claude/projects/` (JSONL files) |
38
38
  | Cursor | `cursor.integration: true` | `~/Library/Application Support/Cursor/User/` (macOS)<br>`%APPDATA%\Cursor\User\` (Windows)<br>`~/.config/Cursor/User/` (Linux) |
39
+ | Codex | `codex.integration: true` | `~/.codex/state_*.sqlite` + `~/.codex/sessions/` rollout JSONL files |
39
40
 
40
41
  Sessions are processed oldest-first, one per queue cycle. On first run Ei works through your backlog gradually — it won't flood your LLM provider.
41
42
 
42
- All three tools also support reading Ei's knowledge back out via the [CLI tool](../src/cli/README.md) run `ei --install` to wire up automatic context injection (hooks + persona plugin) so your coding agents receive relevant Ei memory before every message without any manual tool calls.
43
+ All four tools also support reading Ei's knowledge back out via the [CLI tool](../src/cli/README.md). Run `ei --install` to wire up MCP everywhere it is detected, plus automatic context injection where hooks/plugins are available.
43
44
 
44
45
  ## Slack Integration
45
46
 
@@ -7,6 +7,7 @@ import type {
7
7
  } from "../../../src/core/types.js";
8
8
  import type { ClaudeCodeSettings } from "../../../src/integrations/claude-code/types.js";
9
9
  import type { CursorSettings } from "../../../src/integrations/cursor/types.js";
10
+ import type { CodexSettings } from "../../../src/integrations/codex/types.js";
10
11
  import type { SlackSettings, SlackAuth } from "../../../src/integrations/slack/types.js";
11
12
  import { modelGuidToDisplay, displayToModelGuid } from "./yaml-shared.js";
12
13
  import { parseDuration, formatDuration } from "./duration.js";
@@ -47,6 +48,13 @@ interface EditableSettingsData {
47
48
  last_sync?: string | null;
48
49
  extraction_point?: string | null;
49
50
  };
51
+ codex?: {
52
+ integration?: boolean | null;
53
+ polling_interval_ms?: string | null;
54
+ last_sync?: string | null;
55
+ extraction_point?: string | null;
56
+ extraction_model?: string | null;
57
+ };
50
58
  slack?: {
51
59
  polling_interval_ms?: string | null;
52
60
  workspaces?: Record<string, {
@@ -112,6 +120,13 @@ export function settingsToYAML(settings: HumanSettings | undefined, accounts: Pr
112
120
  last_sync: settings?.cursor?.last_sync ?? null,
113
121
  extraction_point: settings?.cursor?.extraction_point ?? null,
114
122
  },
123
+ codex: {
124
+ integration: settings?.codex?.integration ?? false,
125
+ polling_interval_ms: formatDuration(settings?.codex?.polling_interval_ms ?? 60000),
126
+ extraction_model: guidToDisplay(settings?.codex?.extraction_model) ?? 'default',
127
+ last_sync: settings?.codex?.last_sync ?? null,
128
+ extraction_point: settings?.codex?.extraction_point ?? null,
129
+ },
115
130
  slack: {
116
131
  polling_interval_ms: formatDuration(settings?.slack?.polling_interval_ms ?? 60000),
117
132
  workspaces: Object.fromEntries(
@@ -204,6 +219,18 @@ export function settingsFromYAML(yamlContent: string, original: HumanSettings |
204
219
  };
205
220
  }
206
221
 
222
+ let codex: CodexSettings | undefined;
223
+ if (data.codex) {
224
+ codex = {
225
+ integration: nullToUndefined(data.codex.integration),
226
+ polling_interval_ms: parseMsDuration(data.codex.polling_interval_ms, 60000),
227
+ last_sync: original?.codex?.last_sync,
228
+ extraction_point: original?.codex?.extraction_point,
229
+ processed_sessions: original?.codex?.processed_sessions,
230
+ extraction_model: displayToGuid(data.codex.extraction_model),
231
+ };
232
+ }
233
+
207
234
  let slack: SlackSettings | undefined;
208
235
  if (data.slack) {
209
236
  const parsedWorkspaces: SlackSettings["workspaces"] = {};
@@ -249,6 +276,7 @@ export function settingsFromYAML(yamlContent: string, original: HumanSettings |
249
276
  opencode,
250
277
  claudeCode,
251
278
  cursor,
279
+ codex,
252
280
  slack,
253
281
  backup,
254
282
  };