cohvu 2.1.1 → 2.2.1

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.
Files changed (102) hide show
  1. package/dist/api.d.ts +42 -26
  2. package/dist/api.js +43 -59
  3. package/dist/api.js.map +1 -1
  4. package/dist/auth.d.ts +2 -13
  5. package/dist/auth.js +41 -105
  6. package/dist/auth.js.map +1 -1
  7. package/dist/constants.d.ts +1 -0
  8. package/dist/constants.js +2 -0
  9. package/dist/constants.js.map +1 -0
  10. package/dist/index.js +59 -103
  11. package/dist/index.js.map +1 -1
  12. package/dist/instructions.d.ts +2 -2
  13. package/dist/instructions.js +22 -26
  14. package/dist/instructions.js.map +1 -1
  15. package/dist/platforms.js +22 -25
  16. package/dist/platforms.js.map +1 -1
  17. package/dist/proxy.js +26 -14
  18. package/dist/proxy.js.map +1 -1
  19. package/dist/setup.d.ts +0 -1
  20. package/dist/setup.js +43 -75
  21. package/dist/setup.js.map +1 -1
  22. package/dist/tui/App.d.ts +1 -0
  23. package/dist/tui/App.js +1090 -0
  24. package/dist/tui/App.js.map +1 -0
  25. package/dist/tui/components/Banner.d.ts +4 -0
  26. package/dist/tui/components/Banner.js +78 -0
  27. package/dist/tui/components/Banner.js.map +1 -0
  28. package/dist/tui/components/Divider.d.ts +1 -0
  29. package/dist/tui/components/Divider.js +7 -0
  30. package/dist/tui/components/Divider.js.map +1 -0
  31. package/dist/tui/components/Footer.d.ts +4 -0
  32. package/dist/tui/components/Footer.js +143 -0
  33. package/dist/tui/components/Footer.js.map +1 -0
  34. package/dist/tui/components/Header.d.ts +4 -0
  35. package/dist/tui/components/Header.js +53 -0
  36. package/dist/tui/components/Header.js.map +1 -0
  37. package/dist/tui/components/Modal.d.ts +5 -0
  38. package/dist/tui/components/Modal.js +99 -0
  39. package/dist/tui/components/Modal.js.map +1 -0
  40. package/dist/tui/components/TabBar.d.ts +4 -0
  41. package/dist/tui/components/TabBar.js +16 -0
  42. package/dist/tui/components/TabBar.js.map +1 -0
  43. package/dist/tui/components/Toast.d.ts +4 -0
  44. package/dist/tui/components/Toast.js +9 -0
  45. package/dist/tui/components/Toast.js.map +1 -0
  46. package/dist/tui/index.js +20 -0
  47. package/dist/tui/index.js.map +1 -0
  48. package/dist/tui/platform-detect.d.ts +1 -1
  49. package/dist/tui/platform-detect.js +19 -22
  50. package/dist/tui/platform-detect.js.map +1 -1
  51. package/dist/tui/state.d.ts +33 -6
  52. package/dist/tui/state.js +65 -17
  53. package/dist/tui/state.js.map +1 -1
  54. package/dist/tui/tabs/BillingTab.d.ts +4 -0
  55. package/dist/tui/tabs/BillingTab.js +68 -0
  56. package/dist/tui/tabs/BillingTab.js.map +1 -0
  57. package/dist/tui/tabs/KnowledgeTab.d.ts +5 -0
  58. package/dist/tui/tabs/KnowledgeTab.js +83 -0
  59. package/dist/tui/tabs/KnowledgeTab.js.map +1 -0
  60. package/dist/tui/tabs/ProjectTab.d.ts +4 -0
  61. package/dist/tui/tabs/ProjectTab.js +31 -0
  62. package/dist/tui/tabs/ProjectTab.js.map +1 -0
  63. package/dist/tui/tabs/TeamTab.d.ts +4 -0
  64. package/dist/tui/tabs/TeamTab.js +42 -0
  65. package/dist/tui/tabs/TeamTab.js.map +1 -0
  66. package/dist/tui/tabs/YouTab.d.ts +4 -0
  67. package/dist/tui/tabs/YouTab.js +9 -0
  68. package/dist/tui/tabs/YouTab.js.map +1 -0
  69. package/dist/tui/utils.d.ts +6 -0
  70. package/dist/tui/utils.js +58 -0
  71. package/dist/tui/utils.js.map +1 -0
  72. package/package.json +9 -2
  73. package/dist/tui/ansi.d.ts +0 -41
  74. package/dist/tui/ansi.js +0 -117
  75. package/dist/tui/ansi.js.map +0 -1
  76. package/dist/tui/dashboard.js +0 -1250
  77. package/dist/tui/dashboard.js.map +0 -1
  78. package/dist/tui/keys.d.ts +0 -31
  79. package/dist/tui/keys.js +0 -56
  80. package/dist/tui/keys.js.map +0 -1
  81. package/dist/tui/render.d.ts +0 -5
  82. package/dist/tui/render.js +0 -158
  83. package/dist/tui/render.js.map +0 -1
  84. package/dist/tui/views/billing.d.ts +0 -3
  85. package/dist/tui/views/billing.js +0 -127
  86. package/dist/tui/views/billing.js.map +0 -1
  87. package/dist/tui/views/knowledge.d.ts +0 -3
  88. package/dist/tui/views/knowledge.js +0 -203
  89. package/dist/tui/views/knowledge.js.map +0 -1
  90. package/dist/tui/views/modals.d.ts +0 -3
  91. package/dist/tui/views/modals.js +0 -198
  92. package/dist/tui/views/modals.js.map +0 -1
  93. package/dist/tui/views/project.d.ts +0 -3
  94. package/dist/tui/views/project.js +0 -76
  95. package/dist/tui/views/project.js.map +0 -1
  96. package/dist/tui/views/team.d.ts +0 -3
  97. package/dist/tui/views/team.js +0 -106
  98. package/dist/tui/views/team.js.map +0 -1
  99. package/dist/tui/views/you.d.ts +0 -3
  100. package/dist/tui/views/you.js +0 -40
  101. package/dist/tui/views/you.js.map +0 -1
  102. /package/dist/tui/{dashboard.d.ts → index.d.ts} +0 -0
@@ -0,0 +1,4 @@
1
+ import type { AppState } from '../state.js';
2
+ export declare function ProjectTab({ state }: {
3
+ state: AppState;
4
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,31 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { Box, Text, useStdout } from 'ink';
3
+ import { getActiveProject } from '../state.js';
4
+ import { formatDate, timeUntil } from '../utils.js';
5
+ import { Divider } from '../components/Divider.js';
6
+ export function ProjectTab({ state }) {
7
+ const { stdout } = useStdout();
8
+ const width = stdout.columns;
9
+ const project = getActiveProject(state);
10
+ if (!project) {
11
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { height: 1 }), _jsx(Text, { color: "gray", children: " no active project" })] }));
12
+ }
13
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { height: 1 }), _jsx(Field, { label: "name", children: _jsx(Text, { dimColor: true, children: project.name }) }), _jsx(Field, { label: "slug", children: _jsx(Text, { color: "gray", children: project.slug }) }), project.owner.kind === 'team'
14
+ ? _jsxs(Field, { label: "owner", children: [_jsx(Text, { color: "gray", children: "team: " }), _jsx(Text, { dimColor: true, children: project.owner.teamName })] })
15
+ : _jsx(Field, { label: "owner", children: _jsx(Text, { color: "gray", children: "personal" }) }), project.created_at && (_jsx(Field, { label: "created", children: _jsx(Text, { color: "gray", children: formatDate(project.created_at) }) })), _jsx(Box, { height: 1 }), _jsx(Divider, {}), _jsx(Box, { height: 1 }), state.userRole === 'admin' && (_jsxs(Box, { children: [_jsx(Text, { color: "gray", children: " r " }), _jsx(Text, { dimColor: true, children: "rename project" })] })), _jsxs(Box, { children: [_jsx(Text, { color: "gray", children: " n " }), _jsx(Text, { dimColor: true, children: "new project" })] }), state.projects.length > 1 && (_jsxs(Box, { children: [_jsx(Text, { color: "gray", children: " w " }), _jsx(Text, { dimColor: true, children: "switch project" })] })), state.userRole === 'admin' && (_jsxs(_Fragment, { children: [_jsx(Box, { height: 1 }), _jsx(Divider, {}), _jsx(Box, { height: 1 }), renderDestructive(state)] }))] }));
16
+ }
17
+ function Field({ label, children }) {
18
+ return (_jsxs(Box, { children: [_jsx(Box, { width: 12, children: _jsxs(Text, { color: "gray", dimColor: true, children: [" ", label] }) }), children] }));
19
+ }
20
+ function renderDestructive(state) {
21
+ const pendingApproval = state.pendingApprovals.find(a => a.action === 'delete_project' || a.action === 'clear_memories');
22
+ if (pendingApproval) {
23
+ const actionLabel = pendingApproval.action === 'delete_project' ? 'delete project' : 'clear memories';
24
+ const approved = pendingApproval.approved_by.length;
25
+ const required = pendingApproval.required_count;
26
+ const expires = timeUntil(pendingApproval.expires_at);
27
+ return (_jsxs(_Fragment, { children: [_jsxs(Box, { children: [_jsx(Text, { color: "yellow", children: " ! " }), _jsxs(Text, { dimColor: true, children: ["pending: ", actionLabel] }), _jsxs(Text, { color: "gray", children: [" ", approved, "/", required, " approved expires ", expires] })] }), _jsxs(Box, { children: [_jsx(Text, { color: "gray", children: " a " }), _jsx(Text, { dimColor: true, children: "approve" }), _jsx(Text, { children: " " }), _jsx(Text, { color: "gray", children: " x " }), _jsx(Text, { dimColor: true, children: "cancel" })] })] }));
28
+ }
29
+ return (_jsxs(_Fragment, { children: [_jsxs(Box, { children: [_jsx(Text, { color: "red", children: " c " }), _jsx(Text, { color: "gray", children: "clear all memories" })] }), _jsxs(Box, { children: [_jsx(Text, { color: "red", children: " d " }), _jsx(Text, { color: "gray", children: "delete project" })] })] }));
30
+ }
31
+ //# sourceMappingURL=ProjectTab.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProjectTab.js","sourceRoot":"","sources":["../../../src/tui/tabs/ProjectTab.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { AppState } from '../state.js';
2
+ export declare function TeamTab({ state }: {
3
+ state: AppState;
4
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,42 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import React from 'react';
3
+ import { Box, Text, Spacer, useStdout } from 'ink';
4
+ import { getActiveProject, getActiveTeam } from '../state.js';
5
+ import { timeAgo, timeUntil, truncate } from '../utils.js';
6
+ import { Divider } from '../components/Divider.js';
7
+ export function TeamTab({ state }) {
8
+ const { stdout } = useStdout();
9
+ const width = stdout.columns;
10
+ const project = getActiveProject(state);
11
+ if (!project) {
12
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { height: 1 }), _jsx(Text, { color: "gray", children: " no active project" })] }));
13
+ }
14
+ if (project.owner.kind === 'personal') {
15
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { height: 1 }), _jsx(Text, { color: "gray", children: " personal project \u2014 no team members to manage" })] }));
16
+ }
17
+ const team = getActiveTeam(state);
18
+ const userId = state.user?.id;
19
+ const isAdmin = state.userRole === 'admin';
20
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { height: 1 }), team && (_jsxs(_Fragment, { children: [_jsxs(Box, { children: [_jsx(Box, { width: 12, children: _jsx(Text, { color: "gray", dimColor: true, children: " team" }) }), _jsx(Text, { dimColor: true, children: team.name })] }), _jsx(Box, { height: 1 })] })), state.members.map((m, i) => {
21
+ const isYou = m.user_id === userId;
22
+ const email = m.email ?? m.name ?? m.user_id;
23
+ const memberRole = m.role ?? 'member';
24
+ const roleLabel = isYou ? `${memberRole} · you` : memberRole;
25
+ const selected = isAdmin && state.teamSelected === i;
26
+ const demoteApproval = state.pendingApprovals.find(a => a.action === 'demote_admin' && a.target_user_id === m.user_id);
27
+ return (_jsxs(React.Fragment, { children: [_jsxs(Box, { children: [_jsx(Text, { children: selected ? '> ' : ' ' }), _jsx(Box, { width: 38, children: _jsx(Text, { ...(isYou || selected ? {} : { dimColor: true }), children: email }) }), _jsx(Box, { width: 16, children: _jsx(Text, { color: "gray", children: roleLabel }) }), m.last_active_at
28
+ ? _jsxs(Text, { color: "gray", dimColor: true, children: ["last active ", _jsx(Text, { color: "gray", children: timeAgo(m.last_active_at) })] })
29
+ : _jsx(Text, { color: "gray", dimColor: true, children: "never active" })] }), demoteApproval && (_jsxs(Box, { children: [_jsx(Text, { children: " " }), _jsx(Text, { color: "yellow", children: "! " }), _jsxs(Text, { color: "gray", children: ["pending demotion ", demoteApproval.approved_by.length, "/", demoteApproval.required_count, " approved expires ", timeUntil(demoteApproval.expires_at)] })] }))] }, m.user_id));
30
+ }), state.members.length <= 1 && (_jsxs(_Fragment, { children: [_jsx(Box, { height: 1 }), _jsx(Text, { color: "gray", dimColor: true, children: " just you so far." })] })), state.inlineError && (_jsxs(_Fragment, { children: [_jsx(Box, { height: 1 }), _jsxs(Text, { color: "red", children: [" ", state.inlineError] })] })), isAdmin && (_jsxs(_Fragment, { children: [_jsx(Box, { height: 1 }), _jsx(Divider, {}), _jsx(Box, { height: 1 }), _jsxs(Box, { width: width, children: [_jsx(Text, { color: "gray", children: " invite links" }), _jsx(Spacer, {}), _jsx(Text, { color: "gray", dimColor: true, children: "\u2191\u2193 select c copy r regen" })] }), ['admin', 'member', 'viewer'].map((role, li) => {
31
+ const link = state.inviteLinks.find(l => l.role === role);
32
+ if (!link)
33
+ return null;
34
+ const linkIdx = state.members.length + li;
35
+ const selected = state.teamSelected === linkIdx;
36
+ const linkWidth = selected ? width - 24 : width - 12;
37
+ return (_jsxs(Box, { children: [_jsx(Text, { children: selected ? '> ' : ' ' }), _jsx(Box, { width: 9, children: _jsx(Text, { color: "gray", dimColor: true, children: role }) }), _jsx(Text, { ...(selected ? {} : { dimColor: true }), children: truncate(link.url, linkWidth) }), selected && (state.copiedFeedback
38
+ ? _jsx(Text, { color: "green", children: " copied!" })
39
+ : _jsx(Text, { color: "gray", dimColor: true, children: " c copy r regen" }))] }, role));
40
+ })] }))] }));
41
+ }
42
+ //# sourceMappingURL=TeamTab.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TeamTab.js","sourceRoot":"","sources":["../../../src/tui/tabs/TeamTab.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { AppState } from '../state.js';
2
+ export declare function YouTab({ state }: {
3
+ state: AppState;
4
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,9 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from 'ink';
3
+ import { Divider } from '../components/Divider.js';
4
+ export function YouTab({ state }) {
5
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { height: 1 }), _jsxs(Box, { children: [_jsxs(Text, { dimColor: true, children: [" ", state.user?.email ?? ''] }), _jsx(Text, { color: "gray", dimColor: true, children: " \u00B7 " }), _jsx(Text, { color: "gray", children: state.userRole })] }), _jsx(Box, { height: 1 }), _jsx(Divider, {}), _jsx(Box, { height: 1 }), _jsx(Text, { color: "gray", children: " tools" }), _jsx(Box, { height: 1 }), state.platforms.map(p => (p.state === 'configured'
6
+ ? (_jsxs(Box, { children: [_jsx(Box, { width: 15, children: _jsxs(Text, { color: "gray", children: [" ", p.name] }) }), _jsx(Text, { color: "green", children: "\u2713 " }), _jsx(Text, { color: "gray", children: "configured" })] }, p.name))
7
+ : (_jsxs(Box, { children: [_jsx(Box, { width: 15, children: _jsxs(Text, { color: "gray", dimColor: true, children: [" ", p.name] }) }), _jsx(Text, { color: "gray", children: "\u2014 not detected" })] }, p.name)))), _jsx(Box, { height: 1 }), _jsx(Divider, {}), _jsx(Box, { height: 1 }), _jsxs(Text, { color: "gray", dimColor: true, children: [" for setup help visit ", _jsx(Text, { color: "gray", children: "github.com/cohvu/cohvu" })] })] }));
8
+ }
9
+ //# sourceMappingURL=YouTab.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"YouTab.js","sourceRoot":"","sources":["../../../src/tui/tabs/YouTab.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAa,MAAM,KAAK,CAAC;AAE3C,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAEnD,MAAM,UAAU,MAAM,CAAC,EAAE,KAAK,EAAuB;IACnD,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,KAAC,GAAG,IAAC,MAAM,EAAE,CAAC,GAAI,EAClB,MAAC,GAAG,eACF,MAAC,IAAI,IAAC,QAAQ,yBAAI,KAAK,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,IAAQ,EACjD,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,EAAC,QAAQ,iCAAa,EACxC,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAAE,KAAK,CAAC,QAAQ,GAAQ,IACtC,EACN,KAAC,GAAG,IAAC,MAAM,EAAE,CAAC,GAAI,EAClB,KAAC,OAAO,KAAG,EACX,KAAC,GAAG,IAAC,MAAM,EAAE,CAAC,GAAI,EAGlB,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,wBAAe,EACjC,KAAC,GAAG,IAAC,MAAM,EAAE,CAAC,GAAI,EACjB,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CACxB,CAAC,CAAC,KAAK,KAAK,YAAY;gBACtB,CAAC,CAAC,CACA,MAAC,GAAG,eACF,KAAC,GAAG,IAAC,KAAK,EAAE,EAAE,YAAE,MAAC,IAAI,IAAC,KAAK,EAAC,MAAM,mBAAI,CAAC,CAAC,IAAI,IAAQ,GAAM,EAC1D,KAAC,IAAI,IAAC,KAAK,EAAC,OAAO,yBAAW,EAC9B,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,2BAAkB,KAH5B,CAAC,CAAC,IAAI,CAIV,CACP;gBACD,CAAC,CAAC,CACA,MAAC,GAAG,eACF,KAAC,GAAG,IAAC,KAAK,EAAE,EAAE,YAAE,MAAC,IAAI,IAAC,KAAK,EAAC,MAAM,EAAC,QAAQ,yBAAI,CAAC,CAAC,IAAI,IAAQ,GAAM,EACnE,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,qCAAuB,KAFjC,CAAC,CAAC,IAAI,CAGV,CACP,CACJ,CAAC,EAEF,KAAC,GAAG,IAAC,MAAM,EAAE,CAAC,GAAI,EAClB,KAAC,OAAO,KAAG,EACX,KAAC,GAAG,IAAC,MAAM,EAAE,CAAC,GAAI,EAClB,MAAC,IAAI,IAAC,KAAK,EAAC,MAAM,EAAC,QAAQ,8CAAwB,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,uCAA8B,IAAO,IACtG,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare function timeAgo(dateStr: string): string;
2
+ export declare function formatDate(dateStr: string): string;
3
+ export declare function timeUntil(dateStr: string): string;
4
+ export declare function daysUntil(dateStr: string): number;
5
+ export declare function truncate(s: string, maxLen: number): string;
6
+ export declare function wrapText(text: string, maxWidth: number): string[];
@@ -0,0 +1,58 @@
1
+ // Pure utility functions for the TUI — no ANSI codes, no framework dependencies.
2
+ export function timeAgo(dateStr) {
3
+ const diff = Date.now() - new Date(dateStr).getTime();
4
+ const mins = Math.floor(diff / 60000);
5
+ if (mins < 1)
6
+ return 'just now';
7
+ if (mins < 60)
8
+ return `${mins}m ago`;
9
+ const hrs = Math.floor(mins / 60);
10
+ if (hrs < 24)
11
+ return `${hrs}h ago`;
12
+ const days = Math.floor(hrs / 24);
13
+ return `${days}d ago`;
14
+ }
15
+ export function formatDate(dateStr) {
16
+ const d = new Date(dateStr);
17
+ const months = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'];
18
+ return `${months[d.getMonth()]} ${d.getDate()}, ${d.getFullYear()}`;
19
+ }
20
+ export function timeUntil(dateStr) {
21
+ const diff = new Date(dateStr).getTime() - Date.now();
22
+ const hrs = Math.ceil(diff / 3600000);
23
+ if (hrs <= 0)
24
+ return 'expired';
25
+ if (hrs === 1)
26
+ return '1h';
27
+ return `${hrs}h`;
28
+ }
29
+ export function daysUntil(dateStr) {
30
+ const diff = new Date(dateStr).getTime() - Date.now();
31
+ return Math.ceil(diff / (1000 * 60 * 60 * 24));
32
+ }
33
+ export function truncate(s, maxLen) {
34
+ if (maxLen <= 0)
35
+ return '';
36
+ if (s.length <= maxLen)
37
+ return s;
38
+ return s.slice(0, maxLen - 1) + '\u2026';
39
+ }
40
+ export function wrapText(text, maxWidth) {
41
+ const words = text.split(/\s+/);
42
+ const lines = [];
43
+ let current = '';
44
+ for (const word of words) {
45
+ if (current.length + word.length + 1 > maxWidth) {
46
+ if (current)
47
+ lines.push(current);
48
+ current = word;
49
+ }
50
+ else {
51
+ current = current ? current + ' ' + word : word;
52
+ }
53
+ }
54
+ if (current)
55
+ lines.push(current);
56
+ return lines;
57
+ }
58
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/tui/utils.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cohvu",
3
- "version": "2.1.1",
3
+ "version": "2.2.1",
4
4
  "description": "Cohvu — continuous memory for AI-native development",
5
5
  "bin": {
6
6
  "cohvu": "dist/index.js"
@@ -13,9 +13,15 @@
13
13
  "node": ">=20.0.0"
14
14
  },
15
15
  "dependencies": {
16
- "@modelcontextprotocol/sdk": "^1.27.1"
16
+ "@modelcontextprotocol/sdk": "^1.27.1",
17
+ "chalk": "^5.6.2",
18
+ "figures": "^6.1.0",
19
+ "ink": "^6.8.0",
20
+ "ora": "^9.3.0",
21
+ "react": "^19.2.4"
17
22
  },
18
23
  "devDependencies": {
24
+ "@types/react": "^19.2.14",
19
25
  "typescript": "^5.9.3"
20
26
  },
21
27
  "files": [
@@ -27,5 +33,6 @@
27
33
  "agents",
28
34
  "knowledge"
29
35
  ],
36
+ "type": "module",
30
37
  "license": "MIT"
31
38
  }
@@ -1,41 +0,0 @@
1
- export declare const C: {
2
- primary: string;
3
- secondary: string;
4
- muted: string;
5
- dim: string;
6
- ghost: string;
7
- green: string;
8
- red: string;
9
- yellow: string;
10
- blue: string;
11
- cursor: string;
12
- tabActive: string;
13
- tabInact: string;
14
- reset: string;
15
- bold: string;
16
- dim_attr: string;
17
- };
18
- export declare const screen: {
19
- clear: string;
20
- home: string;
21
- altOn: string;
22
- altOff: string;
23
- bgDark: string;
24
- clearAll: string;
25
- cursorHide: string;
26
- cursorShow: string;
27
- clearLine: string;
28
- resetAttrs: string;
29
- };
30
- export declare function moveTo(row: number, col: number): string;
31
- export declare function stripAnsi(s: string): string;
32
- export declare function truncate(s: string, maxLen: number): string;
33
- export declare function padEnd(s: string, len: number): string;
34
- export declare function rightAlign(text: string, totalWidth: number, prefix: string): string;
35
- export declare function divider(width: number): string;
36
- export declare function timeAgo(dateStr: string): string;
37
- export declare function formatDate(dateStr: string): string;
38
- export declare function timeUntil(dateStr: string): string;
39
- export declare function daysUntil(dateStr: string): number;
40
- export declare function enterScreen(): void;
41
- export declare function exitScreen(): void;
package/dist/tui/ansi.js DELETED
@@ -1,117 +0,0 @@
1
- "use strict";
2
- // ANSI escape code helpers — standard colors that adapt to any terminal theme.
3
- // Uses 16-color ANSI + dim/bold attributes for universal compatibility.
4
- Object.defineProperty(exports, "__esModule", { value: true });
5
- exports.screen = exports.C = void 0;
6
- exports.moveTo = moveTo;
7
- exports.stripAnsi = stripAnsi;
8
- exports.truncate = truncate;
9
- exports.padEnd = padEnd;
10
- exports.rightAlign = rightAlign;
11
- exports.divider = divider;
12
- exports.timeAgo = timeAgo;
13
- exports.formatDate = formatDate;
14
- exports.timeUntil = timeUntil;
15
- exports.daysUntil = daysUntil;
16
- exports.enterScreen = enterScreen;
17
- exports.exitScreen = exitScreen;
18
- exports.C = {
19
- // Text roles — relative to terminal's color scheme
20
- primary: '\x1b[0m', // terminal default foreground
21
- secondary: '\x1b[2m', // dim — slightly muted
22
- muted: '\x1b[90m', // bright black (dark gray)
23
- dim: '\x1b[90m\x1b[2m', // bright black + dim attribute
24
- ghost: '\x1b[90m\x1b[2m', // same as dim (barely visible)
25
- // Semantic
26
- green: '\x1b[32m', // standard green
27
- red: '\x1b[31m', // standard red
28
- yellow: '\x1b[33m\x1b[2m', // yellow dimmed slightly
29
- blue: '\x1b[34m', // standard blue
30
- // UI
31
- cursor: '\x1b[0m', // default foreground (bright)
32
- tabActive: '\x1b[0m\x1b[1m', // bold default
33
- tabInact: '\x1b[90m', // bright black
34
- reset: '\x1b[0m',
35
- bold: '\x1b[1m',
36
- dim_attr: '\x1b[2m',
37
- };
38
- exports.screen = {
39
- clear: '\x1b[2J',
40
- home: '\x1b[H',
41
- altOn: '\x1b[?1049h',
42
- altOff: '\x1b[?1049l',
43
- bgDark: '\x1b[48;2;10;10;10m',
44
- clearAll: '\x1b[2J',
45
- cursorHide: '\x1b[?25l',
46
- cursorShow: '\x1b[?25h',
47
- clearLine: '\x1b[2K\r',
48
- resetAttrs: '\x1b[0m',
49
- };
50
- function moveTo(row, col) {
51
- return `\x1b[${row};${col}H`;
52
- }
53
- function stripAnsi(s) {
54
- return s.replace(/\x1b\[[0-9;]*m/g, '');
55
- }
56
- function truncate(s, maxLen) {
57
- if (maxLen <= 0)
58
- return '';
59
- if (s.length <= maxLen)
60
- return s;
61
- return s.slice(0, maxLen - 1) + '\u2026';
62
- }
63
- function padEnd(s, len) {
64
- return s.length >= len ? s : s + ' '.repeat(len - s.length);
65
- }
66
- function rightAlign(text, totalWidth, prefix) {
67
- const visiblePrefixLen = stripAnsi(prefix).length;
68
- const visibleTextLen = stripAnsi(text).length;
69
- const spaces = totalWidth - visiblePrefixLen - visibleTextLen;
70
- return ' '.repeat(Math.max(0, spaces)) + text;
71
- }
72
- function divider(width) {
73
- return exports.C.dim + '\u2500'.repeat(width) + exports.C.reset;
74
- }
75
- function timeAgo(dateStr) {
76
- const diff = Date.now() - new Date(dateStr).getTime();
77
- const mins = Math.floor(diff / 60000);
78
- if (mins < 1)
79
- return 'just now';
80
- if (mins < 60)
81
- return `${mins}m ago`;
82
- const hrs = Math.floor(mins / 60);
83
- if (hrs < 24)
84
- return `${hrs}h ago`;
85
- const days = Math.floor(hrs / 24);
86
- return `${days}d ago`;
87
- }
88
- function formatDate(dateStr) {
89
- const d = new Date(dateStr);
90
- const months = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'];
91
- return `${months[d.getMonth()]} ${d.getDate()}, ${d.getFullYear()}`;
92
- }
93
- function timeUntil(dateStr) {
94
- const diff = new Date(dateStr).getTime() - Date.now();
95
- const hrs = Math.ceil(diff / 3600000);
96
- if (hrs <= 0)
97
- return 'expired';
98
- if (hrs === 1)
99
- return '1h';
100
- return `${hrs}h`;
101
- }
102
- function daysUntil(dateStr) {
103
- const diff = new Date(dateStr).getTime() - Date.now();
104
- return Math.ceil(diff / (1000 * 60 * 60 * 24));
105
- }
106
- // Enter TUI — exact sequence matters
107
- function enterScreen() {
108
- process.stdout.write(exports.screen.altOn +
109
- exports.screen.cursorHide);
110
- }
111
- // Exit TUI — exact sequence matters
112
- function exitScreen() {
113
- process.stdout.write(exports.screen.cursorShow +
114
- exports.screen.resetAttrs +
115
- exports.screen.altOff);
116
- }
117
- //# sourceMappingURL=ansi.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ansi.js","sourceRoot":"","sources":["../../src/tui/ansi.ts"],"names":[],"mappings":"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"}