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.
- package/README.md +21 -6
- package/package.json +1 -1
- package/src/cli/README.md +9 -7
- package/src/cli/mcp.ts +3 -3
- package/src/cli/retrieval.ts +22 -0
- package/src/cli.ts +213 -13
- package/src/core/context-utils.ts +0 -1
- package/src/core/orchestrators/ceremony.ts +48 -17
- package/src/core/processor.ts +92 -3
- package/src/core/prompt-context-builder.ts +2 -0
- package/src/core/tools/builtin/persona-notes.ts +81 -0
- package/src/core/tools/index.ts +56 -0
- package/src/core/types/data-items.ts +1 -1
- package/src/core/types/entities.ts +2 -0
- package/src/core/types/llm.ts +1 -1
- package/src/core/utils/message-id.ts +16 -0
- package/src/integrations/codex/importer.ts +258 -0
- package/src/integrations/codex/index.ts +11 -0
- package/src/integrations/codex/reader.ts +241 -0
- package/src/integrations/codex/types.ts +117 -0
- package/src/integrations/opencode/reader-factory.ts +4 -4
- package/src/integrations/slack/importer.ts +0 -1
- package/src/prompts/response/index.ts +5 -2
- package/src/prompts/response/sections.ts +10 -0
- package/src/prompts/response/types.ts +1 -0
- package/src/prompts/room/index.ts +3 -0
- package/src/prompts/room/types.ts +1 -0
- package/tui/README.md +4 -3
- package/tui/src/util/yaml-settings.ts +28 -0
|
@@ -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,
|
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
|
|
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
|
|
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
|
};
|