cohvu 2.21.1 → 3.0.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.
Files changed (102) hide show
  1. package/README.md +37 -0
  2. package/cli.js +15501 -0
  3. package/package.json +15 -26
  4. package/dist/__tests__/instruction-file.unit.test.d.ts +0 -1
  5. package/dist/__tests__/instruction-file.unit.test.js +0 -296
  6. package/dist/__tests__/instruction-file.unit.test.js.map +0 -1
  7. package/dist/__tests__/teardown.unit.test.d.ts +0 -1
  8. package/dist/__tests__/teardown.unit.test.js +0 -196
  9. package/dist/__tests__/teardown.unit.test.js.map +0 -1
  10. package/dist/api.d.ts +0 -292
  11. package/dist/api.js +0 -337
  12. package/dist/api.js.map +0 -1
  13. package/dist/auth.d.ts +0 -4
  14. package/dist/auth.js +0 -96
  15. package/dist/auth.js.map +0 -1
  16. package/dist/constants.d.ts +0 -2
  17. package/dist/constants.js +0 -10
  18. package/dist/constants.js.map +0 -1
  19. package/dist/index.d.ts +0 -2
  20. package/dist/index.js +0 -259
  21. package/dist/index.js.map +0 -1
  22. package/dist/instructions.d.ts +0 -33
  23. package/dist/instructions.js +0 -238
  24. package/dist/instructions.js.map +0 -1
  25. package/dist/log.d.ts +0 -6
  26. package/dist/log.js +0 -51
  27. package/dist/log.js.map +0 -1
  28. package/dist/pause.d.ts +0 -3
  29. package/dist/pause.js +0 -24
  30. package/dist/pause.js.map +0 -1
  31. package/dist/platforms.d.ts +0 -22
  32. package/dist/platforms.js +0 -79
  33. package/dist/platforms.js.map +0 -1
  34. package/dist/postinstall.d.ts +0 -2
  35. package/dist/postinstall.js +0 -11
  36. package/dist/postinstall.js.map +0 -1
  37. package/dist/proxy.d.ts +0 -1
  38. package/dist/proxy.js +0 -371
  39. package/dist/proxy.js.map +0 -1
  40. package/dist/setup.d.ts +0 -15
  41. package/dist/setup.js +0 -295
  42. package/dist/setup.js.map +0 -1
  43. package/dist/teardown.d.ts +0 -15
  44. package/dist/teardown.js +0 -235
  45. package/dist/teardown.js.map +0 -1
  46. package/dist/tui/App.d.ts +0 -1
  47. package/dist/tui/App.js +0 -2245
  48. package/dist/tui/App.js.map +0 -1
  49. package/dist/tui/components/Banner.d.ts +0 -4
  50. package/dist/tui/components/Banner.js +0 -71
  51. package/dist/tui/components/Banner.js.map +0 -1
  52. package/dist/tui/components/Divider.d.ts +0 -1
  53. package/dist/tui/components/Divider.js +0 -8
  54. package/dist/tui/components/Divider.js.map +0 -1
  55. package/dist/tui/components/Footer.d.ts +0 -4
  56. package/dist/tui/components/Footer.js +0 -214
  57. package/dist/tui/components/Footer.js.map +0 -1
  58. package/dist/tui/components/Header.d.ts +0 -4
  59. package/dist/tui/components/Header.js +0 -126
  60. package/dist/tui/components/Header.js.map +0 -1
  61. package/dist/tui/components/LockCard.d.ts +0 -17
  62. package/dist/tui/components/LockCard.js +0 -37
  63. package/dist/tui/components/LockCard.js.map +0 -1
  64. package/dist/tui/components/Modal.d.ts +0 -5
  65. package/dist/tui/components/Modal.js +0 -195
  66. package/dist/tui/components/Modal.js.map +0 -1
  67. package/dist/tui/components/TabBar.d.ts +0 -4
  68. package/dist/tui/components/TabBar.js +0 -17
  69. package/dist/tui/components/TabBar.js.map +0 -1
  70. package/dist/tui/components/Toast.d.ts +0 -4
  71. package/dist/tui/components/Toast.js +0 -9
  72. package/dist/tui/components/Toast.js.map +0 -1
  73. package/dist/tui/index.d.ts +0 -1
  74. package/dist/tui/index.js +0 -20
  75. package/dist/tui/index.js.map +0 -1
  76. package/dist/tui/platform-detect.d.ts +0 -2
  77. package/dist/tui/platform-detect.js +0 -79
  78. package/dist/tui/platform-detect.js.map +0 -1
  79. package/dist/tui/state.d.ts +0 -414
  80. package/dist/tui/state.js +0 -397
  81. package/dist/tui/state.js.map +0 -1
  82. package/dist/tui/tabs/BillingTab.d.ts +0 -5
  83. package/dist/tui/tabs/BillingTab.js +0 -72
  84. package/dist/tui/tabs/BillingTab.js.map +0 -1
  85. package/dist/tui/tabs/KeysTab.d.ts +0 -5
  86. package/dist/tui/tabs/KeysTab.js +0 -87
  87. package/dist/tui/tabs/KeysTab.js.map +0 -1
  88. package/dist/tui/tabs/KnowledgeTab.d.ts +0 -5
  89. package/dist/tui/tabs/KnowledgeTab.js +0 -143
  90. package/dist/tui/tabs/KnowledgeTab.js.map +0 -1
  91. package/dist/tui/tabs/ProjectTab.d.ts +0 -5
  92. package/dist/tui/tabs/ProjectTab.js +0 -34
  93. package/dist/tui/tabs/ProjectTab.js.map +0 -1
  94. package/dist/tui/tabs/TeamTab.d.ts +0 -5
  95. package/dist/tui/tabs/TeamTab.js +0 -57
  96. package/dist/tui/tabs/TeamTab.js.map +0 -1
  97. package/dist/tui/tabs/YouTab.d.ts +0 -5
  98. package/dist/tui/tabs/YouTab.js +0 -25
  99. package/dist/tui/tabs/YouTab.js.map +0 -1
  100. package/dist/tui/utils.d.ts +0 -6
  101. package/dist/tui/utils.js +0 -58
  102. package/dist/tui/utils.js.map +0 -1
@@ -1,5 +0,0 @@
1
- import type { AppState } from '../state.js';
2
- export declare function KnowledgeTab({ state, height }: {
3
- state: AppState;
4
- height: number;
5
- }): import("react/jsx-runtime").JSX.Element;
@@ -1,143 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
- import { Box, Text, useStdout } from 'ink';
3
- import { isTeamLocked, getActiveProject } from '../state.js';
4
- import { LockCard } from '../components/LockCard.js';
5
- import { truncate, timeAgo, wrapText } from '../utils.js';
6
- export function KnowledgeTab({ state, height }) {
7
- if (isTeamLocked(state)) {
8
- return (_jsx(LockCard, { variant: "team", overview: state.teamOverview, isAdmin: state.userRole === 'admin', height: height }));
9
- }
10
- const active = getActiveProject(state);
11
- if (active?.owner.kind === 'personal' && active.locked) {
12
- const others = state.projects.filter(p => p.owner.kind === 'personal' && p.locked && p.project_id !== active.project_id).length;
13
- return (_jsx(LockCard, { variant: "downgrade", projectName: active.name, otherLockedCount: others, height: height }));
14
- }
15
- // Empty-project state — user skipped first-project creation at first-touch,
16
- // or deleted every project they had. Invite them to create one directly
17
- // from the dashboard. The Project tab is where the creation action lives;
18
- // point them there.
19
- if (!state.activeProjectId && state.projects.length === 0) {
20
- return _jsx(EmptyProjectCard, { height: height });
21
- }
22
- switch (state.knowledgeMode) {
23
- case 'browse': return _jsx(BrowseMode, { state: state, height: height });
24
- case 'search': return _jsx(SearchMode, { state: state, height: height });
25
- case 'remove': return _jsx(RemoveMode, { state: state, height: height });
26
- case 'detail': return _jsx(DetailMode, { state: state, height: height });
27
- }
28
- }
29
- function EmptyProjectCard({ height }) {
30
- return (_jsx(Box, { flexDirection: "column", alignItems: "center", justifyContent: "center", height: height, children: _jsx(Text, { color: "gray", dimColor: true, children: "nothing here yet" }) }));
31
- }
32
- function StatsLine({ state }) {
33
- const total = state.contributionTotal;
34
- if (total === 0)
35
- return null;
36
- // Derive contributor count from loaded contributions
37
- const contributors = new Set();
38
- for (const m of state.contributions) {
39
- const name = m.contributed_by?.user_name ??
40
- m.contributed_by?.agent_name;
41
- if (name)
42
- contributors.add(String(name));
43
- }
44
- const parts = [];
45
- parts.push(`${total} contribution${total !== 1 ? 's' : ''}`);
46
- if (contributors.size > 0)
47
- parts.push(`${contributors.size} contributor${contributors.size !== 1 ? 's' : ''}`);
48
- // Last activity from the first contribution (sorted newest first)
49
- if (state.contributions.length > 0) {
50
- parts.push(`last active ${timeAgo(state.contributions[0].updated_at)}`);
51
- }
52
- return _jsxs(Text, { color: "gray", dimColor: true, children: [" ", parts.join(' · ')] });
53
- }
54
- function BrowseMode({ state, height }) {
55
- const { stdout } = useStdout();
56
- const width = stdout.columns - 1;
57
- if (state.contributions.length === 0 && !state.contributionLoading) {
58
- if (state.offline || state.error) {
59
- return (_jsxs(Box, { flexDirection: "column", alignItems: "center", justifyContent: "center", height: height, children: [_jsx(Text, { color: "red", children: state.error ?? "can't reach cohvu" }), _jsx(Text, { color: "gray", dimColor: true, children: "check your connection and restart" })] }));
60
- }
61
- return (_jsxs(Box, { flexDirection: "column", alignItems: "center", justifyContent: "center", height: height, children: [_jsx(Text, { color: "gray", children: "your agents will start contributing automatically" }), _jsx(Text, { color: "gray", dimColor: true, children: "open any agent and start working" })] }));
62
- }
63
- const hasStats = state.contributionTotal > 0;
64
- const maxLines = height - (hasStats ? 4 : 3);
65
- const visible = state.contributions.slice(state.contributionScroll, state.contributionScroll + maxLines);
66
- const rows = [];
67
- let linesUsed = 0;
68
- for (let i = 0; i < visible.length && linesUsed < maxLines; i++) {
69
- const mem = visible[i];
70
- const globalIdx = state.contributionScroll + i;
71
- const isSelected = globalIdx === state.contributionSelected;
72
- const isLive = mem.id === state.liveDotId && Date.now() < state.liveDotExpiry;
73
- const bodyWidth = width - 12;
74
- if (isSelected) {
75
- rows.push(_jsxs(Box, { width: width, children: [_jsx(Text, { children: '> ' }), _jsx(Text, { color: isLive ? 'green' : 'gray', dimColor: !isLive, children: "\u00B7 " }), _jsx(Text, { children: truncate(mem.body, bodyWidth) }), _jsx(Box, { flexGrow: 1 }), mem.contribution_type && _jsxs(Text, { color: "gray", dimColor: true, children: [mem.contribution_type, " "] }), _jsx(Text, { color: "gray", children: timeAgo(mem.updated_at) })] }, mem.id));
76
- linesUsed++;
77
- const bodyLines = wrapText(mem.body, width - 6);
78
- if (bodyLines.length > 1 && linesUsed < maxLines) {
79
- rows.push(_jsx(Box, { children: _jsxs(Text, { color: "gray", children: [" ", truncate(bodyLines[1], width - 6)] }) }, `${mem.id}-1`));
80
- linesUsed++;
81
- }
82
- if (bodyLines.length > 2 && linesUsed < maxLines) {
83
- rows.push(_jsx(Box, { children: _jsxs(Text, { color: "gray", children: [" ", truncate(bodyLines[2], width - 6), bodyLines.length > 3 ? '…' : ''] }) }, `${mem.id}-2`));
84
- linesUsed++;
85
- }
86
- }
87
- else {
88
- rows.push(_jsxs(Box, { width: width, children: [_jsx(Text, { children: ' ' }), _jsx(Text, { color: isLive ? 'green' : 'gray', dimColor: !isLive, children: "\u00B7 " }), _jsx(Text, { dimColor: true, children: truncate(mem.body, bodyWidth) }), _jsx(Box, { flexGrow: 1 }), mem.contribution_type && _jsxs(Text, { color: "gray", dimColor: true, children: [mem.contribution_type, " "] }), _jsx(Text, { color: "gray", children: timeAgo(mem.updated_at) })] }, mem.id));
89
- linesUsed++;
90
- }
91
- }
92
- // Pagination
93
- let pagination = '';
94
- if (state.contributions.length > 0) {
95
- const start = state.contributionScroll + 1;
96
- const end = Math.min(state.contributionScroll + maxLines, state.contributions.length);
97
- pagination = `${start}\u2013${end} of ${state.contributionTotal}`;
98
- if (state.contributionHasMore)
99
- pagination += ' · space for more';
100
- }
101
- return (_jsxs(Box, { flexDirection: "column", children: [hasStats && _jsx(StatsLine, { state: state }), _jsx(Box, { height: 1 }), rows, _jsx(Box, { height: 1 }), _jsxs(Text, { color: "gray", children: [" ", pagination] })] }));
102
- }
103
- function DetailMode({ state, height }) {
104
- const { stdout } = useStdout();
105
- const width = stdout.columns - 1;
106
- const mem = state.contributions.find(m => m.id === state.detailContributionId);
107
- if (!mem) {
108
- return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { height: 1 }), _jsx(Text, { color: "gray", children: " contribution not found" })] }));
109
- }
110
- const bodyLines = wrapText(mem.body, width - 4);
111
- const contributor = mem.contributed_by?.user_name ??
112
- mem.contributed_by?.agent_name ??
113
- 'unknown';
114
- return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { height: 1 }), bodyLines.map((line, i) => (_jsx(Box, { children: _jsxs(Text, { children: [" ", line] }) }, i))), _jsx(Box, { height: 1 }), _jsxs(Text, { color: "gray", dimColor: true, children: [" ", String(contributor), " \u00B7 ", timeAgo(mem.updated_at)] }), mem.contribution_type && _jsxs(Text, { color: "gray", dimColor: true, children: [" type: ", mem.contribution_type] })] }));
115
- }
116
- function SearchMode({ state, height }) {
117
- const { stdout } = useStdout();
118
- const width = stdout.columns - 1;
119
- return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { height: 1 }), _jsxs(Box, { children: [_jsx(Text, { color: "gray", children: " / " }), _jsxs(Text, { children: [state.searchQuery, "_"] })] }), _jsx(Box, { height: 1 }), _jsx(Box, { children: _jsxs(Text, { color: "gray", dimColor: true, children: [" ", '─'.repeat(width - 4)] }) }), _jsx(Box, { height: 1 }), state.searching ? (_jsx(Text, { color: "gray", dimColor: true, children: " searching\u2026" })) : state.searchResults === null ? null : state.searchResults.length === 0 ? (_jsx(Text, { color: "gray", children: " no results" })) : (_jsxs(_Fragment, { children: [state.searchResults.map((mem, i) => {
120
- const isSelected = i === state.contributionSelected;
121
- const isLive = mem.id === state.liveDotId && Date.now() < state.liveDotExpiry;
122
- const bodyWidth = width - 12;
123
- return (_jsxs(Box, { width: width, children: [_jsx(Text, { children: isSelected ? '> ' : ' ' }), _jsx(Text, { color: isLive ? 'green' : 'gray', dimColor: !isLive, children: "\u00B7 " }), _jsx(Text, { ...(isSelected ? {} : { dimColor: true }), children: truncate(mem.body, bodyWidth) }), _jsx(Box, { flexGrow: 1 }), _jsx(Text, { color: "gray", children: timeAgo(mem.updated_at) })] }, mem.id));
124
- }), _jsx(Box, { height: 1 }), _jsxs(Text, { color: "gray", children: [" ", state.searchResults.length, " result", state.searchResults.length !== 1 ? 's' : ''] })] }))] }));
125
- }
126
- function RemoveMode({ state, height }) {
127
- const { stdout } = useStdout();
128
- const width = stdout.columns - 1;
129
- const list = state.searchResults ?? state.contributions;
130
- const filtered = state.userRole === 'admin'
131
- ? list
132
- : list.filter(m => m.contributed_by?.user_id === state.user?.id);
133
- return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { height: 1 }), _jsx(Text, { color: "gray", children: " select contributions to remove \u00B7 space to toggle" }), _jsx(Box, { height: 1 }), filtered.length === 0 && state.userRole !== 'admin' ? (_jsx(Text, { color: "gray", children: " you can only remove contributions your agents made" })) : (filtered.map((mem, i) => {
134
- const isCursor = i === state.contributionSelected;
135
- const isToggled = state.removeSelected.has(mem.id);
136
- return (_jsxs(Box, { children: [_jsx(Text, { children: isCursor ? '> ' : ' ' }), isToggled
137
- ? _jsxs(_Fragment, { children: [_jsx(Text, { color: "red", children: "[x] " }), _jsx(Text, { dimColor: true, children: truncate(mem.body, width - 8) })] })
138
- : _jsxs(_Fragment, { children: [_jsx(Text, { color: "gray", dimColor: true, children: "[ ] " }), _jsx(Text, { color: "gray", children: truncate(mem.body, width - 8) })] })] }, mem.id));
139
- })), _jsx(Box, { height: 1 }), state.removeSelected.size > 0
140
- ? _jsxs(Text, { color: "yellow", dimColor: true, children: [" ", state.removeSelected.size, " selected"] })
141
- : _jsx(Text, { color: "gray", children: " 0 selected" })] }));
142
- }
143
- //# sourceMappingURL=KnowledgeTab.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"KnowledgeTab.js","sourceRoot":"","sources":["../../../src/tui/tabs/KnowledgeTab.tsx"],"names":[],"mappings":"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"}
@@ -1,5 +0,0 @@
1
- import type { AppState } from '../state.js';
2
- export declare function ProjectTab({ state, height }: {
3
- state: AppState;
4
- height?: number;
5
- }): import("react/jsx-runtime").JSX.Element;
@@ -1,34 +0,0 @@
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, height }) {
7
- const { stdout } = useStdout();
8
- const width = stdout.columns - 1;
9
- const project = getActiveProject(state);
10
- if (!project) {
11
- // Landing without an active project — either skipped at first-touch
12
- // or deleted the only one. Keep it minimal; the user figures out
13
- // where they're going, we just give them the action.
14
- return (_jsxs(Box, { flexDirection: "column", alignItems: "center", justifyContent: "center", height: height, children: [_jsx(Text, { color: "gray", dimColor: true, children: "no project yet" }), _jsx(Box, { height: 1 }), _jsxs(Box, { children: [_jsx(Text, { color: "gray", children: " n " }), _jsx(Text, { dimColor: true, children: "new project" })] })] }));
15
- }
16
- return (_jsxs(Box, { flexDirection: "column", height: height, overflowY: "hidden", 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'
17
- ? _jsxs(Field, { label: "owner", children: [_jsx(Text, { color: "gray", children: "team: " }), _jsx(Text, { dimColor: true, children: project.owner.teamName })] })
18
- : _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)] }))] }));
19
- }
20
- function Field({ label, children }) {
21
- return (_jsxs(Box, { children: [_jsx(Box, { width: 12, children: _jsxs(Text, { color: "gray", dimColor: true, children: [" ", label] }) }), children] }));
22
- }
23
- function renderDestructive(state) {
24
- const pendingApproval = state.pendingApprovals.find(a => a.action === 'delete_project' || a.action === 'clear_memories');
25
- if (pendingApproval) {
26
- const actionLabel = pendingApproval.action === 'delete_project' ? 'delete project' : 'clear contributions';
27
- const approved = pendingApproval.approved_by.length;
28
- const required = pendingApproval.required_count;
29
- const expires = timeUntil(pendingApproval.expires_at);
30
- 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" })] })] }));
31
- }
32
- return (_jsxs(_Fragment, { children: [_jsxs(Box, { children: [_jsx(Text, { color: "red", children: " c " }), _jsx(Text, { color: "gray", children: "clear all contributions" })] }), _jsxs(Box, { children: [_jsx(Text, { color: "red", children: " d " }), _jsx(Text, { color: "gray", children: "delete project" })] })] }));
33
- }
34
- //# sourceMappingURL=ProjectTab.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ProjectTab.js","sourceRoot":"","sources":["../../../src/tui/tabs/ProjectTab.tsx"],"names":[],"mappings":"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"}
@@ -1,5 +0,0 @@
1
- import type { AppState } from '../state.js';
2
- export declare function TeamTab({ state, height }: {
3
- state: AppState;
4
- height?: number;
5
- }): import("react/jsx-runtime").JSX.Element;
@@ -1,57 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
- import React from 'react';
3
- import { Box, Text, useStdout } from 'ink';
4
- import { getActiveProject, getActiveTeam, isTeamLocked } from '../state.js';
5
- import { timeUntil, truncate } from '../utils.js';
6
- import { Divider } from '../components/Divider.js';
7
- import { LockCard } from '../components/LockCard.js';
8
- export function TeamTab({ state, height }) {
9
- const { stdout } = useStdout();
10
- const width = stdout.columns - 1;
11
- const project = getActiveProject(state);
12
- const team = getActiveTeam(state);
13
- if (isTeamLocked(state)) {
14
- return (_jsx(LockCard, { variant: "team", overview: state.teamOverview, isAdmin: state.userRole === 'admin', height: height, label: "Members, invite links, and SSO are hidden until an admin resubscribes." }));
15
- }
16
- if (!project || project.owner.kind === 'personal' || !team) {
17
- return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { height: 1 }), _jsx(Text, { color: "gray", children: " personal project \u2014 no team members to manage" })] }));
18
- }
19
- const userId = state.user?.id;
20
- const isAdmin = state.userRole === 'admin';
21
- const memberCount = state.members.length;
22
- return (_jsxs(Box, { flexDirection: "column", height: height, overflowY: "hidden", 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) => {
23
- const isYou = m.user_id === userId;
24
- const email = m.email ?? m.name ?? m.user_id;
25
- const memberRole = m.role ?? 'member';
26
- const roleLabel = isYou ? `${memberRole} · you` : memberRole;
27
- const selected = isAdmin && state.teamSelected === i;
28
- const demoteApproval = state.pendingApprovals.find(a => a.action === 'demote_admin' && a.target_user_id === m.user_id);
29
- 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 }) })] }), 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
- }), memberCount <= 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 }), _jsx(Text, { color: "gray", children: " settings" }), _jsx(Box, { height: 1 }), (() => {
31
- const sel = state.teamSelected === memberCount + 0;
32
- return (_jsxs(Box, { children: [_jsx(Text, { children: sel ? '> ' : ' ' }), _jsx(Box, { width: 12, children: _jsx(Text, { color: "gray", dimColor: true, children: "name" }) }), _jsx(Text, { ...(sel ? {} : { dimColor: true }), children: team?.name ?? '' })] }));
33
- })(), (() => {
34
- const sel = state.teamSelected === memberCount + 1;
35
- return (_jsxs(Box, { children: [_jsx(Text, { children: sel ? '> ' : ' ' }), _jsx(Box, { width: 12, children: _jsx(Text, { color: "gray", dimColor: true, children: "consensus" }) }), _jsx(Text, { ...(sel ? {} : { dimColor: true }), children: state.requireConsensus ? 'on' : 'off' })] }));
36
- })(), (() => {
37
- const sel = state.teamSelected === memberCount + 2;
38
- const ssoLabel = state.ssoConfig?.issuer
39
- ? state.ssoConfig.issuer.replace(/^https?:\/\//, '')
40
- : 'not configured';
41
- return (_jsxs(Box, { children: [_jsx(Text, { children: sel ? '> ' : ' ' }), _jsx(Box, { width: 12, children: _jsx(Text, { color: "gray", dimColor: true, children: "sso" }) }), _jsx(Text, { ...(sel ? {} : { dimColor: true }), children: ssoLabel })] }));
42
- })(), _jsx(Box, { height: 1 }), _jsx(Text, { color: "gray", children: " invite links" }), _jsxs(Text, { color: "gray", dimColor: true, children: [" ", memberCount, " seat", memberCount !== 1 ? 's' : '', " \u00B7 $", memberCount * 29, "/mo \u00B7 each join adds $29/mo"] }), ['admin', 'member', 'viewer'].map((role, li) => {
43
- const linkIdx = memberCount + 3 + li;
44
- const selected = state.teamSelected === linkIdx;
45
- if (role === 'admin') {
46
- return (_jsxs(Box, { children: [_jsx(Text, { children: selected ? '> ' : ' ' }), _jsx(Box, { width: 9, children: _jsx(Text, { color: "gray", dimColor: true, children: "admin" }) }), _jsx(Text, { ...(selected ? {} : { dimColor: true }), children: "mint a fresh single-use invite (30 min)" }), selected && _jsx(Text, { color: "gray", dimColor: true, children: " enter to mint" })] }, role));
47
- }
48
- const link = state.inviteLinks.find(l => l.role === role);
49
- if (!link)
50
- return null;
51
- const linkWidth = selected ? width - 24 : width - 12;
52
- 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
53
- ? _jsx(Text, { color: "green", children: " copied!" })
54
- : _jsx(Text, { color: "gray", dimColor: true, children: " c copy r regen" }))] }, role));
55
- })] }))] }));
56
- }
57
- //# sourceMappingURL=TeamTab.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TeamTab.js","sourceRoot":"","sources":["../../../src/tui/tabs/TeamTab.tsx"],"names":[],"mappings":"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"}
@@ -1,5 +0,0 @@
1
- import type { AppState } from '../state.js';
2
- export declare function YouTab({ state, height }: {
3
- state: AppState;
4
- height?: number;
5
- }): import("react/jsx-runtime").JSX.Element;
@@ -1,25 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
- import { Box, Text } from 'ink';
3
- import { Divider } from '../components/Divider.js';
4
- function formatDeletionCountdown(scheduledAt) {
5
- const graceMs = 3 * 24 * 60 * 60 * 1000;
6
- const purgeAt = new Date(scheduledAt).getTime() + graceMs;
7
- const remaining = purgeAt - Date.now();
8
- if (remaining <= 0)
9
- return 'now';
10
- const days = Math.floor(remaining / (24 * 60 * 60 * 1000));
11
- const hours = Math.floor((remaining % (24 * 60 * 60 * 1000)) / (60 * 60 * 1000));
12
- if (days > 0)
13
- return `${days}d ${hours}h`;
14
- const minutes = Math.floor((remaining % (60 * 60 * 1000)) / (60 * 1000));
15
- return `${hours}h ${minutes}m`;
16
- }
17
- export function YouTab({ state, height }) {
18
- const deletionScheduledAt = state.user?.deletion_scheduled_at ?? null;
19
- return (_jsxs(Box, { flexDirection: "column", height: height, overflowY: "hidden", 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: " editors" }), _jsx(Box, { height: 1 }), state.platforms.map(p => (p.state === 'configured'
20
- ? (_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: "connected" })] }, p.name))
21
- : (_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(Box, { children: [_jsx(Box, { width: 15, children: _jsx(Text, { color: "gray", children: " status" }) }), state.paused
22
- ? _jsx(Text, { color: "yellow", children: "paused" })
23
- : _jsx(Text, { color: "green", children: "active" })] }), _jsx(Box, { height: 1 }), _jsx(Divider, {}), _jsx(Box, { height: 1 }), _jsx(Text, { color: "gray", children: " account" }), _jsx(Box, { height: 1 }), deletionScheduledAt ? (_jsxs(_Fragment, { children: [_jsxs(Box, { children: [_jsx(Text, { color: "red", children: " scheduled for deletion in " }), _jsx(Text, { color: "red", children: formatDeletionCountdown(deletionScheduledAt) })] }), _jsx(Box, { height: 1 }), _jsxs(Text, { color: "gray", dimColor: true, children: [" press ", _jsx(Text, { color: "gray", children: "c" }), " to cancel and restore"] })] })) : (_jsxs(Text, { color: "gray", dimColor: true, children: [" press ", _jsx(Text, { color: "gray", children: "d" }), " to delete account"] })), _jsx(Box, { height: 1 }), _jsx(Divider, {}), _jsx(Box, { height: 1 }), _jsxs(Text, { color: "gray", dimColor: true, children: [" to disconnect: ", _jsx(Text, { color: "gray", children: "cohvu disconnect" })] })] }));
24
- }
25
- //# sourceMappingURL=YouTab.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"YouTab.js","sourceRoot":"","sources":["../../../src/tui/tabs/YouTab.tsx"],"names":[],"mappings":"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"}
@@ -1,6 +0,0 @@
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[];
package/dist/tui/utils.js DELETED
@@ -1,58 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/tui/utils.ts"],"names":[],"mappings":"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"}