memorix 1.1.7 → 1.1.8
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 +13 -0
- package/CLAUDE.md +6 -1
- package/README.md +21 -0
- package/README.zh-CN.md +21 -0
- package/TEAM.md +86 -86
- package/dist/cli/index.js +730 -150
- package/dist/cli/index.js.map +1 -1
- package/dist/dashboard/static/index.html +201 -201
- package/dist/dashboard/static/style.css +3584 -3584
- package/dist/index.js +15 -8
- package/dist/index.js.map +1 -1
- package/dist/memcode-runtime/CHANGELOG.md +13 -0
- package/dist/memcode-runtime/package.json +4 -4
- package/dist/sdk.js +15 -8
- package/dist/sdk.js.map +1 -1
- package/docs/AGENT_OPERATOR_PLAYBOOK.md +18 -0
- package/docs/DESIGN_DECISIONS.md +357 -357
- package/docs/SETUP.md +10 -0
- package/docs/dev-log/progress.txt +35 -26
- package/package.json +1 -1
- package/src/audit/index.ts +156 -156
- package/src/cli/commands/agent-integrations.ts +623 -0
- package/src/cli/commands/audit-list.ts +89 -89
- package/src/cli/commands/background.ts +659 -659
- package/src/cli/commands/cleanup.ts +255 -255
- package/src/cli/commands/doctor.ts +23 -0
- package/src/cli/commands/formation.ts +48 -48
- package/src/cli/commands/git-hook-install.ts +111 -111
- package/src/cli/commands/handoff.ts +66 -66
- package/src/cli/commands/hooks-status.ts +63 -63
- package/src/cli/commands/ingest-commit.ts +153 -153
- package/src/cli/commands/ingest-image.ts +73 -73
- package/src/cli/commands/ingest-log.ts +180 -180
- package/src/cli/commands/ingest.ts +44 -44
- package/src/cli/commands/integrate-shared.ts +15 -15
- package/src/cli/commands/lock.ts +96 -96
- package/src/cli/commands/message.ts +121 -121
- package/src/cli/commands/poll.ts +70 -70
- package/src/cli/commands/purge-all-memory.ts +85 -85
- package/src/cli/commands/purge-project-memory.ts +83 -83
- package/src/cli/commands/reasoning.ts +132 -132
- package/src/cli/commands/repair.ts +60 -0
- package/src/cli/commands/retention.ts +108 -108
- package/src/cli/commands/serve-shared.ts +118 -118
- package/src/cli/commands/setup.ts +3 -3
- package/src/cli/commands/skills.ts +123 -123
- package/src/cli/commands/task.ts +192 -192
- package/src/cli/commands/transfer.ts +73 -73
- package/src/cli/commands/uninstall-project-artifacts.ts +85 -85
- package/src/cli/index.ts +3 -1
- package/src/cli/tui/ChatView.tsx +234 -234
- package/src/cli/tui/CommandBar.tsx +312 -312
- package/src/cli/tui/ContextRail.tsx +118 -118
- package/src/cli/tui/HeaderBar.tsx +72 -72
- package/src/cli/tui/LogoBanner.tsx +51 -51
- package/src/cli/tui/Panels.tsx +632 -632
- package/src/cli/tui/Sidebar.tsx +179 -179
- package/src/cli/tui/chat-service.ts +742 -742
- package/src/cli/tui/data.ts +547 -547
- package/src/cli/tui/index.ts +41 -41
- package/src/cli/tui/markdown-render.tsx +371 -371
- package/src/cli/tui/theme.ts +178 -178
- package/src/cli/tui/use-mouse.ts +157 -157
- package/src/cli/tui/useNavigation.ts +56 -56
- package/src/cli/update-checker.ts +211 -211
- package/src/cli/version.ts +7 -7
- package/src/cli/workbench.ts +1 -1
- package/src/codegraph/context-pack.ts +5 -1
- package/src/codegraph/lite-provider.ts +5 -1
- package/src/codegraph/project-context.ts +5 -1
- package/src/compact/token-budget.ts +74 -74
- package/src/config/behavior.ts +59 -59
- package/src/dashboard/project-classification.ts +64 -64
- package/src/dashboard/static/index.html +201 -201
- package/src/dashboard/static/style.css +3584 -3584
- package/src/embedding/fastembed-provider.ts +142 -142
- package/src/embedding/transformers-provider.ts +111 -111
- package/src/git/extractor.ts +209 -209
- package/src/git/hooks-path.ts +85 -85
- package/src/git/noise-filter.ts +210 -210
- package/src/hooks/installers/index.ts +4 -4
- package/src/hooks/official-skills.ts +1 -1
- package/src/hooks/pattern-detector.ts +173 -173
- package/src/hooks/rules/memorix-agent-rules.md +2 -2
- package/src/hooks/significance-filter.ts +250 -250
- package/src/llm/memory-manager.ts +328 -328
- package/src/llm/provider.ts +885 -885
- package/src/llm/quality.ts +248 -248
- package/src/memory/attribution-guard.ts +249 -249
- package/src/memory/auto-relations.ts +107 -107
- package/src/memory/consolidation.ts +302 -302
- package/src/memory/disclosure-policy.ts +141 -141
- package/src/memory/entity-extractor.ts +197 -197
- package/src/memory/formation/evaluate.ts +217 -217
- package/src/memory/formation/extract.ts +361 -361
- package/src/memory/formation/index.ts +417 -417
- package/src/memory/formation/resolve.ts +344 -344
- package/src/memory/formation/types.ts +315 -315
- package/src/memory/freshness.ts +122 -122
- package/src/memory/graph.ts +197 -197
- package/src/memory/refs.ts +94 -94
- package/src/memory/retention.ts +433 -433
- package/src/memory/secret-filter.ts +79 -79
- package/src/memory/session.ts +523 -523
- package/src/multimodal/image-loader.ts +143 -143
- package/src/orchestrate/adapters/claude-stream.ts +192 -192
- package/src/orchestrate/adapters/claude.ts +111 -111
- package/src/orchestrate/adapters/codex-stream.ts +134 -134
- package/src/orchestrate/adapters/codex.ts +41 -41
- package/src/orchestrate/adapters/gemini-stream.ts +166 -166
- package/src/orchestrate/adapters/gemini.ts +42 -42
- package/src/orchestrate/adapters/index.ts +73 -73
- package/src/orchestrate/adapters/opencode-stream.ts +143 -143
- package/src/orchestrate/adapters/opencode.ts +47 -47
- package/src/orchestrate/adapters/spawn-helper.ts +286 -286
- package/src/orchestrate/adapters/types.ts +77 -77
- package/src/orchestrate/capability-router.ts +284 -284
- package/src/orchestrate/context-compact.ts +188 -188
- package/src/orchestrate/cost-tracker.ts +219 -219
- package/src/orchestrate/error-recovery.ts +191 -191
- package/src/orchestrate/evidence.ts +140 -140
- package/src/orchestrate/ledger.ts +110 -110
- package/src/orchestrate/memorix-bridge.ts +380 -380
- package/src/orchestrate/output-budget.ts +80 -80
- package/src/orchestrate/permission.ts +152 -152
- package/src/orchestrate/pipeline-trace.ts +131 -131
- package/src/orchestrate/prompt-builder.ts +155 -155
- package/src/orchestrate/ring-buffer.ts +37 -37
- package/src/orchestrate/task-graph.ts +389 -389
- package/src/orchestrate/verify-gate.ts +219 -219
- package/src/orchestrate/worktree.ts +232 -232
- package/src/project/aliases.ts +374 -374
- package/src/project/detector.ts +268 -268
- package/src/rules/adapters/claude-code.ts +99 -99
- package/src/rules/adapters/codex.ts +97 -97
- package/src/rules/adapters/copilot.ts +124 -124
- package/src/rules/adapters/cursor.ts +114 -114
- package/src/rules/adapters/kiro.ts +126 -126
- package/src/rules/adapters/trae.ts +56 -56
- package/src/rules/adapters/windsurf.ts +83 -83
- package/src/rules/syncer.ts +235 -235
- package/src/sdk.ts +327 -327
- package/src/search/intent-detector.ts +289 -289
- package/src/search/query-expansion.ts +52 -52
- package/src/server/formation-timeout.ts +27 -27
- package/src/skills/mini-skills.ts +386 -386
- package/src/store/chat-store.ts +119 -119
- package/src/store/file-lock.ts +100 -100
- package/src/store/graph-store.ts +249 -249
- package/src/store/mini-skill-store.ts +349 -349
- package/src/store/obs-store.ts +255 -255
- package/src/store/persistence-json.ts +212 -212
- package/src/store/persistence.ts +291 -291
- package/src/store/project-affinity.ts +195 -195
- package/src/store/session-store.ts +259 -259
- package/src/store/sqlite-store.ts +339 -339
- package/src/team/event-bus.ts +76 -76
- package/src/team/file-locks.ts +173 -173
- package/src/team/handoff.ts +167 -167
- package/src/team/messages.ts +203 -203
- package/src/team/poll.ts +132 -132
- package/src/team/tasks.ts +211 -211
- package/src/wiki/generator.ts +237 -237
- package/src/wiki/knowledge-graph.ts +334 -334
- package/src/wiki/types.ts +85 -85
- package/src/workspace/mcp-adapters/codex.ts +191 -191
- package/src/workspace/mcp-adapters/copilot.ts +105 -105
- package/src/workspace/mcp-adapters/cursor.ts +53 -53
- package/src/workspace/mcp-adapters/kiro.ts +64 -64
- package/src/workspace/mcp-adapters/opencode.ts +123 -123
- package/src/workspace/mcp-adapters/trae.ts +134 -134
- package/src/workspace/mcp-adapters/windsurf.ts +91 -91
- package/src/workspace/sanitizer.ts +60 -60
- package/src/workspace/workflow-sync.ts +131 -131
package/src/cli/tui/theme.ts
CHANGED
|
@@ -1,178 +1,178 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Memorix TUI theme constants and slash commands.
|
|
3
|
-
*
|
|
4
|
-
* Modern design system: blue brand gradient, Unicode box-drawing,
|
|
5
|
-
* status dots, and upgraded type icons.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
export interface SlashCommand {
|
|
9
|
-
name: string;
|
|
10
|
-
description: string;
|
|
11
|
-
alias?: string;
|
|
12
|
-
/** If true, this command exits Ink and runs an external interactive flow. */
|
|
13
|
-
interactive?: boolean;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export const SLASH_COMMANDS: SlashCommand[] = [
|
|
17
|
-
{ name: '/chat', description: 'Chat with project memory', alias: '/ask' },
|
|
18
|
-
{ name: '/clear', description: 'Clear chat history', alias: '/cc' },
|
|
19
|
-
{ name: '/resume', description: 'Explicitly resume a saved chat thread', alias: '/cr' },
|
|
20
|
-
{ name: '/new', description: 'Start new chat thread', alias: '/cn' },
|
|
21
|
-
{ name: '/search', description: 'Search memories', alias: '/s' },
|
|
22
|
-
{ name: '/remember', description: 'Store a quick memory', alias: '/r' },
|
|
23
|
-
{ name: '/recent', description: 'Recent memory activity', alias: '/v' },
|
|
24
|
-
{ name: '/doctor', description: 'Run diagnostics', alias: '/d' },
|
|
25
|
-
{ name: '/project', description: 'Current project info', alias: '/p' },
|
|
26
|
-
{ name: '/background', description: 'Control plane service', alias: '/bg' },
|
|
27
|
-
{ name: '/dashboard', description: 'Open web dashboard', alias: '/dash' },
|
|
28
|
-
{ name: '/home', description: 'Back to home', alias: '/h' },
|
|
29
|
-
{ name: '/help', description: 'Show commands', alias: '/?' },
|
|
30
|
-
{ name: '/configure', description: 'Settings', alias: '/config' },
|
|
31
|
-
{ name: '/integrate', description: 'Set up an IDE', alias: '/setup' },
|
|
32
|
-
{ name: '/cleanup', description: 'Cleanup and purge' },
|
|
33
|
-
{ name: '/ingest', description: 'Git to Memory' },
|
|
34
|
-
{ name: '/wiki', description: 'Knowledge Base', alias: '/knowledge' },
|
|
35
|
-
{ name: '/exit', description: 'Exit workbench', alias: '/q' },
|
|
36
|
-
];
|
|
37
|
-
|
|
38
|
-
export const COMMAND_BAR_ROWS = 2;
|
|
39
|
-
export const COMMAND_PALETTE_CHROME_ROWS = 5;
|
|
40
|
-
|
|
41
|
-
export function getCommandPaletteHeight(itemCount: number): number {
|
|
42
|
-
return itemCount > 0 ? COMMAND_PALETTE_CHROME_ROWS + itemCount : 0;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
export function getCommandPaletteTop(termHeight: number, itemCount: number): number {
|
|
46
|
-
const paletteHeight = getCommandPaletteHeight(itemCount);
|
|
47
|
-
return paletteHeight > 0 ? Math.max(0, termHeight - COMMAND_BAR_ROWS - paletteHeight) : 0;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
export function getHomeSeparatorWidth(contentWidth: number): number {
|
|
51
|
-
return Math.max(0, Math.min(50, contentWidth - 8));
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
export function getStatusMessageRows(message: string): number {
|
|
55
|
-
return Math.max(1, message.split('\n').length);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
// ── Type icons: ASCII-safe symbols for observation types ───────────
|
|
59
|
-
export const TYPE_ICONS: Record<string, string> = {
|
|
60
|
-
gotcha: '!',
|
|
61
|
-
decision: 'D',
|
|
62
|
-
'problem-solution': 'S',
|
|
63
|
-
discovery: '?',
|
|
64
|
-
'how-it-works': 'i',
|
|
65
|
-
'what-changed': '~',
|
|
66
|
-
'trade-off': 'T',
|
|
67
|
-
reasoning: 'R',
|
|
68
|
-
'session-request': '>',
|
|
69
|
-
'why-it-exists': '+',
|
|
70
|
-
};
|
|
71
|
-
|
|
72
|
-
// ── Color palette: blue brand gradient + Tailwind Slate dark theme ──
|
|
73
|
-
export const COLORS = {
|
|
74
|
-
// Brand gradient (matches Memorix-Bridge logo blue tones)
|
|
75
|
-
brand: '#5EADF2',
|
|
76
|
-
brandDim: '#3B7AB8',
|
|
77
|
-
brandBright:'#8ECBFF',
|
|
78
|
-
|
|
79
|
-
// Accent
|
|
80
|
-
accent: '#7DD3FC',
|
|
81
|
-
accentDim: '#38BDF8',
|
|
82
|
-
|
|
83
|
-
// Assistant identity (bright orange — stands out from blue brand)
|
|
84
|
-
assistant: '#FF9F43',
|
|
85
|
-
|
|
86
|
-
// Semantic
|
|
87
|
-
success: '#4ADE80',
|
|
88
|
-
warning: '#FBBF24',
|
|
89
|
-
error: '#F87171',
|
|
90
|
-
info: '#94A3B8',
|
|
91
|
-
|
|
92
|
-
// Text hierarchy (Tailwind Slate)
|
|
93
|
-
text: '#E2E8F0',
|
|
94
|
-
textDim: '#94A3B8',
|
|
95
|
-
muted: '#64748B',
|
|
96
|
-
textBright: '#FFFFFF',
|
|
97
|
-
|
|
98
|
-
// Surface & chrome
|
|
99
|
-
border: '#334155',
|
|
100
|
-
surface: '#1E293B',
|
|
101
|
-
highlight: '#475569',
|
|
102
|
-
bg: '#0F172A',
|
|
103
|
-
} as const;
|
|
104
|
-
|
|
105
|
-
// ── Status dots ─────────────────────────────────────────────────────
|
|
106
|
-
export const STATUS_DOTS: Record<string, string> = {
|
|
107
|
-
ok: '*',
|
|
108
|
-
warn: '~',
|
|
109
|
-
error: '!',
|
|
110
|
-
off: '-',
|
|
111
|
-
running: '*',
|
|
112
|
-
stopped: '-',
|
|
113
|
-
};
|
|
114
|
-
|
|
115
|
-
// ── Box-drawing characters (ASCII-safe) ─────────────────────────────
|
|
116
|
-
export const BOX = {
|
|
117
|
-
tl: '+', tr: '+', bl: '+', br: '+',
|
|
118
|
-
h: '-', v: '|',
|
|
119
|
-
hBold: '=', vBold: '|',
|
|
120
|
-
lt: '|', rt: '|', tt: '|', bt: '|',
|
|
121
|
-
cross: '+',
|
|
122
|
-
} as const;
|
|
123
|
-
|
|
124
|
-
// ── Separator characters ────────────────────────────────────────────
|
|
125
|
-
export const SEP = {
|
|
126
|
-
thin: '-',
|
|
127
|
-
thick: '=',
|
|
128
|
-
dot: '.',
|
|
129
|
-
dash: '-',
|
|
130
|
-
} as const;
|
|
131
|
-
|
|
132
|
-
// ── Misc symbols ────────────────────────────────────────────────────
|
|
133
|
-
export const SYMBOLS = {
|
|
134
|
-
bullet: '-',
|
|
135
|
-
arrow: '>',
|
|
136
|
-
check: '[OK]',
|
|
137
|
-
cross: '[ERROR]',
|
|
138
|
-
info: '[i]',
|
|
139
|
-
pill: (text: string) => `[${text}]`,
|
|
140
|
-
} as const;
|
|
141
|
-
|
|
142
|
-
// ── Graph edge symbols ─────────────────────────────────────────────
|
|
143
|
-
export const EDGE_SYMBOLS: Record<string, string> = {
|
|
144
|
-
supports: '->',
|
|
145
|
-
relates_to: '<->',
|
|
146
|
-
mentions: '~>',
|
|
147
|
-
derived_from: '=>',
|
|
148
|
-
} as const;
|
|
149
|
-
|
|
150
|
-
export type ViewType =
|
|
151
|
-
| 'home'
|
|
152
|
-
| 'knowledge'
|
|
153
|
-
| 'memory'
|
|
154
|
-
| 'workbench'
|
|
155
|
-
| 'graph'
|
|
156
|
-
| 'commands'
|
|
157
|
-
| 'chat'
|
|
158
|
-
| 'search'
|
|
159
|
-
| 'doctor'
|
|
160
|
-
| 'project'
|
|
161
|
-
| 'background'
|
|
162
|
-
| 'dashboard'
|
|
163
|
-
| 'recent'
|
|
164
|
-
| 'cleanup'
|
|
165
|
-
| 'ingest'
|
|
166
|
-
| 'integrate'
|
|
167
|
-
| 'configure'
|
|
168
|
-
| 'wiki';
|
|
169
|
-
|
|
170
|
-
/** Compute responsive sidebar and content widths from terminal width.
|
|
171
|
-
* Shared between App.tsx and ChatView.tsx to avoid DRY drift. */
|
|
172
|
-
export function computeLayoutWidths(termWidth: number): { sidebarWidth: number; contentWidth: number; narrow: boolean; veryNarrow: boolean } {
|
|
173
|
-
const narrow = termWidth < 80;
|
|
174
|
-
const veryNarrow = termWidth < 60;
|
|
175
|
-
const sidebarWidth = narrow ? (veryNarrow ? 0 : 24) : Math.min(40, Math.max(26, Math.floor(termWidth * 0.28)));
|
|
176
|
-
const contentWidth = Math.max(0, narrow ? termWidth - 4 : termWidth - sidebarWidth - 4);
|
|
177
|
-
return { sidebarWidth, contentWidth, narrow, veryNarrow };
|
|
178
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Memorix TUI theme constants and slash commands.
|
|
3
|
+
*
|
|
4
|
+
* Modern design system: blue brand gradient, Unicode box-drawing,
|
|
5
|
+
* status dots, and upgraded type icons.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export interface SlashCommand {
|
|
9
|
+
name: string;
|
|
10
|
+
description: string;
|
|
11
|
+
alias?: string;
|
|
12
|
+
/** If true, this command exits Ink and runs an external interactive flow. */
|
|
13
|
+
interactive?: boolean;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export const SLASH_COMMANDS: SlashCommand[] = [
|
|
17
|
+
{ name: '/chat', description: 'Chat with project memory', alias: '/ask' },
|
|
18
|
+
{ name: '/clear', description: 'Clear chat history', alias: '/cc' },
|
|
19
|
+
{ name: '/resume', description: 'Explicitly resume a saved chat thread', alias: '/cr' },
|
|
20
|
+
{ name: '/new', description: 'Start new chat thread', alias: '/cn' },
|
|
21
|
+
{ name: '/search', description: 'Search memories', alias: '/s' },
|
|
22
|
+
{ name: '/remember', description: 'Store a quick memory', alias: '/r' },
|
|
23
|
+
{ name: '/recent', description: 'Recent memory activity', alias: '/v' },
|
|
24
|
+
{ name: '/doctor', description: 'Run diagnostics', alias: '/d' },
|
|
25
|
+
{ name: '/project', description: 'Current project info', alias: '/p' },
|
|
26
|
+
{ name: '/background', description: 'Control plane service', alias: '/bg' },
|
|
27
|
+
{ name: '/dashboard', description: 'Open web dashboard', alias: '/dash' },
|
|
28
|
+
{ name: '/home', description: 'Back to home', alias: '/h' },
|
|
29
|
+
{ name: '/help', description: 'Show commands', alias: '/?' },
|
|
30
|
+
{ name: '/configure', description: 'Settings', alias: '/config' },
|
|
31
|
+
{ name: '/integrate', description: 'Set up an IDE', alias: '/setup' },
|
|
32
|
+
{ name: '/cleanup', description: 'Cleanup and purge' },
|
|
33
|
+
{ name: '/ingest', description: 'Git to Memory' },
|
|
34
|
+
{ name: '/wiki', description: 'Knowledge Base', alias: '/knowledge' },
|
|
35
|
+
{ name: '/exit', description: 'Exit workbench', alias: '/q' },
|
|
36
|
+
];
|
|
37
|
+
|
|
38
|
+
export const COMMAND_BAR_ROWS = 2;
|
|
39
|
+
export const COMMAND_PALETTE_CHROME_ROWS = 5;
|
|
40
|
+
|
|
41
|
+
export function getCommandPaletteHeight(itemCount: number): number {
|
|
42
|
+
return itemCount > 0 ? COMMAND_PALETTE_CHROME_ROWS + itemCount : 0;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export function getCommandPaletteTop(termHeight: number, itemCount: number): number {
|
|
46
|
+
const paletteHeight = getCommandPaletteHeight(itemCount);
|
|
47
|
+
return paletteHeight > 0 ? Math.max(0, termHeight - COMMAND_BAR_ROWS - paletteHeight) : 0;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export function getHomeSeparatorWidth(contentWidth: number): number {
|
|
51
|
+
return Math.max(0, Math.min(50, contentWidth - 8));
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export function getStatusMessageRows(message: string): number {
|
|
55
|
+
return Math.max(1, message.split('\n').length);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// ── Type icons: ASCII-safe symbols for observation types ───────────
|
|
59
|
+
export const TYPE_ICONS: Record<string, string> = {
|
|
60
|
+
gotcha: '!',
|
|
61
|
+
decision: 'D',
|
|
62
|
+
'problem-solution': 'S',
|
|
63
|
+
discovery: '?',
|
|
64
|
+
'how-it-works': 'i',
|
|
65
|
+
'what-changed': '~',
|
|
66
|
+
'trade-off': 'T',
|
|
67
|
+
reasoning: 'R',
|
|
68
|
+
'session-request': '>',
|
|
69
|
+
'why-it-exists': '+',
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
// ── Color palette: blue brand gradient + Tailwind Slate dark theme ──
|
|
73
|
+
export const COLORS = {
|
|
74
|
+
// Brand gradient (matches Memorix-Bridge logo blue tones)
|
|
75
|
+
brand: '#5EADF2',
|
|
76
|
+
brandDim: '#3B7AB8',
|
|
77
|
+
brandBright:'#8ECBFF',
|
|
78
|
+
|
|
79
|
+
// Accent
|
|
80
|
+
accent: '#7DD3FC',
|
|
81
|
+
accentDim: '#38BDF8',
|
|
82
|
+
|
|
83
|
+
// Assistant identity (bright orange — stands out from blue brand)
|
|
84
|
+
assistant: '#FF9F43',
|
|
85
|
+
|
|
86
|
+
// Semantic
|
|
87
|
+
success: '#4ADE80',
|
|
88
|
+
warning: '#FBBF24',
|
|
89
|
+
error: '#F87171',
|
|
90
|
+
info: '#94A3B8',
|
|
91
|
+
|
|
92
|
+
// Text hierarchy (Tailwind Slate)
|
|
93
|
+
text: '#E2E8F0',
|
|
94
|
+
textDim: '#94A3B8',
|
|
95
|
+
muted: '#64748B',
|
|
96
|
+
textBright: '#FFFFFF',
|
|
97
|
+
|
|
98
|
+
// Surface & chrome
|
|
99
|
+
border: '#334155',
|
|
100
|
+
surface: '#1E293B',
|
|
101
|
+
highlight: '#475569',
|
|
102
|
+
bg: '#0F172A',
|
|
103
|
+
} as const;
|
|
104
|
+
|
|
105
|
+
// ── Status dots ─────────────────────────────────────────────────────
|
|
106
|
+
export const STATUS_DOTS: Record<string, string> = {
|
|
107
|
+
ok: '*',
|
|
108
|
+
warn: '~',
|
|
109
|
+
error: '!',
|
|
110
|
+
off: '-',
|
|
111
|
+
running: '*',
|
|
112
|
+
stopped: '-',
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
// ── Box-drawing characters (ASCII-safe) ─────────────────────────────
|
|
116
|
+
export const BOX = {
|
|
117
|
+
tl: '+', tr: '+', bl: '+', br: '+',
|
|
118
|
+
h: '-', v: '|',
|
|
119
|
+
hBold: '=', vBold: '|',
|
|
120
|
+
lt: '|', rt: '|', tt: '|', bt: '|',
|
|
121
|
+
cross: '+',
|
|
122
|
+
} as const;
|
|
123
|
+
|
|
124
|
+
// ── Separator characters ────────────────────────────────────────────
|
|
125
|
+
export const SEP = {
|
|
126
|
+
thin: '-',
|
|
127
|
+
thick: '=',
|
|
128
|
+
dot: '.',
|
|
129
|
+
dash: '-',
|
|
130
|
+
} as const;
|
|
131
|
+
|
|
132
|
+
// ── Misc symbols ────────────────────────────────────────────────────
|
|
133
|
+
export const SYMBOLS = {
|
|
134
|
+
bullet: '-',
|
|
135
|
+
arrow: '>',
|
|
136
|
+
check: '[OK]',
|
|
137
|
+
cross: '[ERROR]',
|
|
138
|
+
info: '[i]',
|
|
139
|
+
pill: (text: string) => `[${text}]`,
|
|
140
|
+
} as const;
|
|
141
|
+
|
|
142
|
+
// ── Graph edge symbols ─────────────────────────────────────────────
|
|
143
|
+
export const EDGE_SYMBOLS: Record<string, string> = {
|
|
144
|
+
supports: '->',
|
|
145
|
+
relates_to: '<->',
|
|
146
|
+
mentions: '~>',
|
|
147
|
+
derived_from: '=>',
|
|
148
|
+
} as const;
|
|
149
|
+
|
|
150
|
+
export type ViewType =
|
|
151
|
+
| 'home'
|
|
152
|
+
| 'knowledge'
|
|
153
|
+
| 'memory'
|
|
154
|
+
| 'workbench'
|
|
155
|
+
| 'graph'
|
|
156
|
+
| 'commands'
|
|
157
|
+
| 'chat'
|
|
158
|
+
| 'search'
|
|
159
|
+
| 'doctor'
|
|
160
|
+
| 'project'
|
|
161
|
+
| 'background'
|
|
162
|
+
| 'dashboard'
|
|
163
|
+
| 'recent'
|
|
164
|
+
| 'cleanup'
|
|
165
|
+
| 'ingest'
|
|
166
|
+
| 'integrate'
|
|
167
|
+
| 'configure'
|
|
168
|
+
| 'wiki';
|
|
169
|
+
|
|
170
|
+
/** Compute responsive sidebar and content widths from terminal width.
|
|
171
|
+
* Shared between App.tsx and ChatView.tsx to avoid DRY drift. */
|
|
172
|
+
export function computeLayoutWidths(termWidth: number): { sidebarWidth: number; contentWidth: number; narrow: boolean; veryNarrow: boolean } {
|
|
173
|
+
const narrow = termWidth < 80;
|
|
174
|
+
const veryNarrow = termWidth < 60;
|
|
175
|
+
const sidebarWidth = narrow ? (veryNarrow ? 0 : 24) : Math.min(40, Math.max(26, Math.floor(termWidth * 0.28)));
|
|
176
|
+
const contentWidth = Math.max(0, narrow ? termWidth - 4 : termWidth - sidebarWidth - 4);
|
|
177
|
+
return { sidebarWidth, contentWidth, narrow, veryNarrow };
|
|
178
|
+
}
|