cohvu 2.21.0 → 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 -183
  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 -92
  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
package/dist/tui/state.js DELETED
@@ -1,397 +0,0 @@
1
- // TUI state machine — single source of truth for the dashboard.
2
- // Reducer pattern: keypresses → actions → new state → render.
3
- export const ALL_KEY_ACTIONS = ['understand', 'contribute', 'search', 'get', 'history', 'update', 'delete', 'restore'];
4
- export const TABS = ['knowledge', 'team', 'billing', 'project', 'keys', 'you'];
5
- export function initialState() {
6
- return {
7
- user: null,
8
- projects: [],
9
- activeProjectId: null,
10
- userRole: 'member',
11
- teams: [],
12
- individualSubscription: null,
13
- usage: null,
14
- tab: 'knowledge',
15
- knowledgeMode: 'browse',
16
- contributions: [],
17
- contributionTotal: 0,
18
- projectStats: null,
19
- detailContributionId: null,
20
- contributionScroll: 0,
21
- contributionSelected: 0,
22
- contributionLoading: false,
23
- contributionHasMore: false,
24
- searchQuery: '',
25
- searchResults: null,
26
- searching: false,
27
- removeSelected: new Set(),
28
- removeConfirming: false,
29
- liveDotId: null,
30
- liveDotExpiry: 0,
31
- members: [],
32
- inviteLinks: [],
33
- teamSelected: 0,
34
- inlineError: null,
35
- billing: null,
36
- platforms: [],
37
- paused: false,
38
- modal: null,
39
- firstLogin: false,
40
- joinedProjectName: null,
41
- ssoConfig: null,
42
- requireConsensus: false,
43
- pendingApprovals: [],
44
- notifications: [],
45
- copiedFeedback: false,
46
- toast: null,
47
- operationPending: null,
48
- showHelp: false,
49
- error: null,
50
- offline: false,
51
- sseConnected: false,
52
- sseEverConnected: false,
53
- apiKeys: [],
54
- apiKeysLoading: false,
55
- apiKeysSelected: 0,
56
- teamOverview: null,
57
- };
58
- }
59
- export function reduce(state, action) {
60
- switch (action.type) {
61
- case 'SET_USER_DATA': {
62
- const me = action.me;
63
- const flatProjects = deriveFlatProjects(me);
64
- const activeId = me.user.active_project_id;
65
- const activeProject = flatProjects.find(p => p.project_id === activeId) ?? flatProjects[0] ?? null;
66
- // Derive role: personal projects → admin; team projects → team role
67
- let role = 'admin';
68
- if (activeProject && activeProject.owner.kind === 'team') {
69
- const ownerTeamId = activeProject.owner.teamId;
70
- const team = me.teams.find(t => t.team_id === ownerTeamId);
71
- role = (team?.role ?? 'member');
72
- }
73
- // Clear all knowledge state when project changes to prevent stale data
74
- const projectChanged = activeProject?.project_id !== state.activeProjectId;
75
- return {
76
- ...state,
77
- user: me.user,
78
- projects: flatProjects,
79
- activeProjectId: activeProject?.project_id ?? null,
80
- userRole: role,
81
- teams: me.teams,
82
- individualSubscription: me.individual_subscription,
83
- usage: me.usage ?? null,
84
- ...(projectChanged ? {
85
- contributions: [], contributionTotal: 0, contributionHasMore: false, contributionLoading: false,
86
- contributionSelected: 0, contributionScroll: 0,
87
- searchResults: null, searchQuery: '', searching: false,
88
- knowledgeMode: 'browse',
89
- removeSelected: new Set(), removeConfirming: false,
90
- members: [], inviteLinks: [], billing: null, teamSelected: 0,
91
- pendingApprovals: [], ssoConfig: null,
92
- } : {}),
93
- };
94
- }
95
- case 'SWITCH_TAB':
96
- return { ...state, tab: action.tab, modal: null, teamSelected: 0 };
97
- case 'NEXT_TAB': {
98
- const idx = TABS.indexOf(state.tab);
99
- return { ...state, tab: TABS[(idx + 1) % TABS.length], modal: null, teamSelected: 0 };
100
- }
101
- case 'SCROLL_UP': {
102
- const newSelected = Math.max(0, state.contributionSelected - 1);
103
- const newScroll = newSelected < state.contributionScroll ? newSelected : state.contributionScroll;
104
- return { ...state, contributionSelected: newSelected, contributionScroll: newScroll };
105
- }
106
- case 'SCROLL_DOWN': {
107
- const list = currentList(state);
108
- if (list.length === 0)
109
- return state;
110
- const newSelected = Math.min(list.length - 1, state.contributionSelected + 1);
111
- // Adjust scroll if selection moves past visible area (assume ~15 visible rows)
112
- const visibleRows = 15;
113
- const newScroll = newSelected >= state.contributionScroll + visibleRows
114
- ? newSelected - visibleRows + 1
115
- : state.contributionScroll;
116
- return { ...state, contributionSelected: newSelected, contributionScroll: newScroll };
117
- }
118
- case 'ENTER_SEARCH':
119
- return { ...state, knowledgeMode: 'search', searchQuery: '', searchResults: null, contributionSelected: 0 };
120
- case 'EXIT_SEARCH':
121
- return { ...state, knowledgeMode: 'browse', searchQuery: '', searchResults: null, contributionSelected: 0 };
122
- case 'SEARCH_INPUT':
123
- return { ...state, searchQuery: state.searchQuery + action.char };
124
- case 'SEARCH_BACKSPACE':
125
- return { ...state, searchQuery: state.searchQuery.slice(0, -1) };
126
- case 'ENTER_REMOVE':
127
- return { ...state, knowledgeMode: 'remove', removeSelected: new Set(), removeConfirming: false, contributionSelected: 0, contributionScroll: 0 };
128
- case 'EXIT_REMOVE':
129
- return { ...state, knowledgeMode: 'browse', removeSelected: new Set(), removeConfirming: false };
130
- case 'TOGGLE_REMOVE': {
131
- const next = new Set(state.removeSelected);
132
- if (next.has(action.contributionId))
133
- next.delete(action.contributionId);
134
- else
135
- next.add(action.contributionId);
136
- return { ...state, removeSelected: next };
137
- }
138
- case 'SET_CONTRIBUTIONS': {
139
- const contributions = action.append
140
- ? [...state.contributions, ...action.contributions]
141
- : action.contributions;
142
- // Reset selection to bounds when replacing (not appending)
143
- const resetSelection = !action.append;
144
- const selected = resetSelection ? 0 : Math.min(state.contributionSelected, Math.max(0, contributions.length - 1));
145
- const scroll = resetSelection ? 0 : Math.min(state.contributionScroll, Math.max(0, contributions.length - 1));
146
- return {
147
- ...state,
148
- contributions,
149
- contributionTotal: action.total,
150
- contributionHasMore: contributions.length < action.total,
151
- contributionLoading: false,
152
- contributionSelected: selected,
153
- contributionScroll: scroll,
154
- };
155
- }
156
- case 'SET_SEARCH_RESULTS':
157
- return { ...state, searchResults: action.results, contributionSelected: 0 };
158
- case 'ADD_CONTRIBUTION':
159
- return {
160
- ...state,
161
- contributions: [action.contribution, ...state.contributions],
162
- contributionTotal: state.contributionTotal + 1,
163
- };
164
- case 'REMOVE_CONTRIBUTION': {
165
- const filtered = state.contributions.filter(m => m.id !== action.id);
166
- return {
167
- ...state,
168
- contributions: filtered,
169
- contributionTotal: Math.max(0, state.contributionTotal - 1),
170
- contributionSelected: Math.min(state.contributionSelected, Math.max(0, filtered.length - 1)),
171
- searchResults: state.searchResults?.filter(m => m.id !== action.id) ?? null,
172
- };
173
- }
174
- case 'SET_MEMBERS':
175
- return { ...state, members: action.members };
176
- case 'SET_BILLING':
177
- return { ...state, billing: action.billing };
178
- case 'SET_PLATFORMS':
179
- return { ...state, platforms: action.platforms };
180
- case 'OPEN_MODAL':
181
- return { ...state, modal: action.modal };
182
- case 'CLOSE_MODAL':
183
- return { ...state, modal: null };
184
- case 'MODAL_INPUT': {
185
- if (!state.modal)
186
- return state;
187
- if ('input' in state.modal) {
188
- return { ...state, modal: { ...state.modal, input: state.modal.input + action.char } };
189
- }
190
- return state;
191
- }
192
- case 'MODAL_BACKSPACE': {
193
- if (!state.modal)
194
- return state;
195
- if ('input' in state.modal) {
196
- return { ...state, modal: { ...state.modal, input: state.modal.input.slice(0, -1) } };
197
- }
198
- return state;
199
- }
200
- case 'SET_COPIED_FEEDBACK':
201
- return { ...state, copiedFeedback: action.active };
202
- case 'SET_ERROR':
203
- return { ...state, error: action.error };
204
- case 'SET_OFFLINE':
205
- return { ...state, offline: action.offline };
206
- case 'SET_SSE_CONNECTED':
207
- return {
208
- ...state,
209
- sseConnected: action.connected,
210
- sseEverConnected: state.sseEverConnected || action.connected,
211
- };
212
- case 'SET_LIVE_DOT':
213
- return { ...state, liveDotId: action.contributionId, liveDotExpiry: Date.now() + 10000 };
214
- case 'CLEAR_LIVE_DOT':
215
- return { ...state, liveDotId: null, liveDotExpiry: 0 };
216
- case 'SET_LOADING':
217
- return { ...state, contributionLoading: action.loading };
218
- case 'SET_SEARCHING':
219
- return { ...state, searching: action.searching };
220
- case 'SET_INVITE_LINKS':
221
- return { ...state, inviteLinks: action.links };
222
- case 'SET_PENDING_APPROVALS':
223
- return { ...state, pendingApprovals: action.approvals };
224
- case 'SET_NOTIFICATIONS':
225
- return { ...state, notifications: action.notifications };
226
- case 'SET_USER_ROLE':
227
- return { ...state, userRole: action.role };
228
- case 'SET_TEAM_SELECTED':
229
- return { ...state, teamSelected: action.index };
230
- case 'SET_INLINE_ERROR':
231
- return { ...state, inlineError: action.message };
232
- case 'SET_TOAST':
233
- return { ...state, toast: action.toast };
234
- case 'SET_OPERATION':
235
- return { ...state, operationPending: action.operation };
236
- case 'SET_REMOVE_CONFIRMING':
237
- return { ...state, removeConfirming: action.confirming };
238
- case 'UPDATE_CONTRIBUTION': {
239
- const updated = action.contribution;
240
- return {
241
- ...state,
242
- contributions: state.contributions.map(m => m.id === updated.id ? updated : m),
243
- searchResults: state.searchResults?.map(m => m.id === updated.id ? updated : m) ?? null,
244
- };
245
- }
246
- case 'SET_FIRST_LOGIN':
247
- return { ...state, firstLogin: action.firstLogin };
248
- case 'SET_SSO_CONFIG':
249
- return { ...state, ssoConfig: action.config };
250
- case 'SET_REQUIRE_CONSENSUS':
251
- return { ...state, requireConsensus: action.value };
252
- case 'SET_PAUSED':
253
- return { ...state, paused: action.paused };
254
- case 'SET_PROJECT_STATS':
255
- return { ...state, projectStats: action.stats };
256
- case 'SET_DETAIL_CONTRIBUTION':
257
- return {
258
- ...state,
259
- detailContributionId: action.contributionId,
260
- knowledgeMode: action.contributionId ? 'detail' : 'browse',
261
- };
262
- case 'SET_SHOW_HELP':
263
- return { ...state, showHelp: action.show };
264
- case 'DISMISS_NOTIFICATION_BANNERS':
265
- return { ...state, notifications: state.notifications.map(n => ({ ...n, seen: true })) };
266
- case 'SET_JOINED_PROJECT':
267
- return { ...state, joinedProjectName: action.name };
268
- case 'SET_API_KEYS':
269
- return {
270
- ...state,
271
- apiKeys: action.keys,
272
- apiKeysLoading: false,
273
- apiKeysSelected: Math.min(state.apiKeysSelected, Math.max(0, action.keys.length - 1)),
274
- };
275
- case 'SET_API_KEYS_LOADING':
276
- return { ...state, apiKeysLoading: action.loading };
277
- case 'SET_API_KEYS_SELECTED':
278
- return { ...state, apiKeysSelected: action.index };
279
- case 'REMOVE_API_KEY': {
280
- const filtered = state.apiKeys.filter(k => k.id !== action.id);
281
- return {
282
- ...state,
283
- apiKeys: filtered,
284
- apiKeysSelected: Math.min(state.apiKeysSelected, Math.max(0, filtered.length - 1)),
285
- };
286
- }
287
- case 'SET_USAGE': {
288
- const project = getActiveProject(state);
289
- if (!project)
290
- return state;
291
- if (project.owner.kind === 'team') {
292
- const teamId = project.owner.teamId;
293
- return {
294
- ...state,
295
- teams: state.teams.map(t => t.team_id === teamId && t.usage
296
- ? { ...t, usage: { ...t.usage, ops_used: action.ops_used, ops_limit: action.ops_limit } }
297
- : t),
298
- };
299
- }
300
- return {
301
- ...state,
302
- usage: state.usage
303
- ? { ...state.usage, ops_used: action.ops_used, ops_limit: action.ops_limit }
304
- : { tier: 'free', ops_used: action.ops_used, ops_limit: action.ops_limit },
305
- };
306
- }
307
- case 'SET_TEAM_OVERVIEW':
308
- return { ...state, teamOverview: action.overview };
309
- default:
310
- return state;
311
- }
312
- }
313
- /** True when the active project belongs to a team whose subscription has been canceled. */
314
- export function isTeamLocked(state) {
315
- const project = getActiveProject(state);
316
- if (!project || project.owner.kind !== 'team')
317
- return false;
318
- const team = getActiveTeam(state);
319
- return team?.subscription?.status === 'canceled';
320
- }
321
- /** Stable identifier for a project's billing entity — used by the silo rule
322
- * on integration key creation. Two projects share an entity iff this string
323
- * matches. Personal projects are keyed to the user; team projects to the
324
- * team. Cross-entity scopes on a single key aren't allowed. */
325
- export function projectEntityKey(project, userId) {
326
- if (project.owner.kind === 'personal')
327
- return `personal:${userId ?? ''}`;
328
- return `team:${project.owner.teamId}`;
329
- }
330
- /** When the integration-key wizard has at least one project selected, every
331
- * subsequent pick must share that same billing entity. Hide the non-matching
332
- * projects from the picker so the user can't even attempt a cross-entity
333
- * scope the server would reject anyway. */
334
- export function filterToSameEntity(projects, selectedIds, userId) {
335
- if (selectedIds.size === 0)
336
- return projects;
337
- const firstId = selectedIds.values().next().value;
338
- const first = projects.find((p) => p.project_id === firstId);
339
- if (!first)
340
- return projects;
341
- const key = projectEntityKey(first, userId);
342
- return projects.filter((p) => projectEntityKey(p, userId) === key);
343
- }
344
- function currentList(state) {
345
- if (state.knowledgeMode === 'search' && state.searchResults)
346
- return state.searchResults;
347
- return state.contributions;
348
- }
349
- export function getActiveProject(state) {
350
- return state.projects.find(p => p.project_id === state.activeProjectId) ?? null;
351
- }
352
- /** Get the team info for the active project, or null if personal. */
353
- export function getActiveTeam(state) {
354
- const project = getActiveProject(state);
355
- if (project && project.owner.kind === 'team') {
356
- const teamId = project.owner.teamId;
357
- return state.teams.find(t => t.team_id === teamId) ?? null;
358
- }
359
- return null;
360
- }
361
- /** Flatten personal_projects + team projects into a single navigable list. */
362
- function deriveFlatProjects(me) {
363
- const list = [];
364
- for (const p of me.personal_projects) {
365
- list.push({
366
- project_id: p.project_id,
367
- slug: p.slug,
368
- name: p.name,
369
- created_at: p.created_at,
370
- locked: p.locked ?? false,
371
- owner: { kind: 'personal' },
372
- });
373
- }
374
- for (const team of me.teams) {
375
- const teamCanceled = team.subscription?.status === 'canceled';
376
- for (const p of team.projects) {
377
- list.push({
378
- project_id: p.project_id,
379
- slug: p.slug,
380
- name: p.name,
381
- created_at: p.created_at,
382
- // Team projects derive their lock from the team's sub status. A
383
- // canceled team locks every project inside it until resubscribe.
384
- locked: teamCanceled,
385
- owner: { kind: 'team', teamId: team.team_id, teamName: team.name, teamSlug: team.slug },
386
- });
387
- }
388
- }
389
- return list;
390
- }
391
- /** True when the active project is locked — either a personal project
392
- * locked_by_downgrade, or a team project whose team sub is canceled. */
393
- export function isActiveProjectLocked(state) {
394
- const project = getActiveProject(state);
395
- return !!project?.locked;
396
- }
397
- //# sourceMappingURL=state.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/tui/state.ts"],"names":[],"mappings":"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"}
@@ -1,5 +0,0 @@
1
- import type { AppState } from '../state.js';
2
- export declare function BillingTab({ state, height }: {
3
- state: AppState;
4
- height?: number;
5
- }): import("react/jsx-runtime").JSX.Element;
@@ -1,72 +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 { getActiveProject, getActiveTeam } from '../state.js';
4
- import { formatDate } from '../utils.js';
5
- export function BillingTab({ state, height }) {
6
- const project = getActiveProject(state);
7
- if (!project) {
8
- return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { height: 1 }), _jsx(Text, { color: "gray", children: " no active project" })] }));
9
- }
10
- if (project.owner.kind === 'team')
11
- return _jsx(TeamBilling, { state: state });
12
- return _jsx(IndividualBilling, { state: state });
13
- }
14
- function Field({ label, children }) {
15
- return (_jsxs(Box, { children: [_jsx(Box, { width: 12, children: _jsxs(Text, { color: "gray", dimColor: true, children: [" ", label] }) }), children] }));
16
- }
17
- function UsageBar({ used, limit }) {
18
- const width = 20;
19
- const ratio = Math.min(1, used / limit);
20
- const filled = Math.round(ratio * width);
21
- const empty = width - filled;
22
- const color = ratio >= 1 ? 'yellow' : ratio >= 0.8 ? 'yellow' : 'green';
23
- const overflow = Math.max(0, used - limit);
24
- return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Field, { label: "usage", children: [_jsx(Text, { color: color, children: '█'.repeat(filled) }), _jsx(Text, { color: "gray", dimColor: true, children: '░'.repeat(empty) }), _jsxs(Text, { color: "gray", children: [" ", formatOps(used), "/", formatOps(limit), " ops"] })] }), overflow > 0 && (_jsx(Field, { label: "overflow", children: _jsxs(Text, { color: "yellow", children: [formatOps(overflow), " ops"] }) }))] }));
25
- }
26
- function formatOps(n) {
27
- if (n >= 1000)
28
- return `${(n / 1000).toFixed(1).replace(/\.0$/, '')}k`;
29
- return String(n);
30
- }
31
- function IndividualBilling({ state }) {
32
- const sub = state.individualSubscription;
33
- const usage = state.usage;
34
- // Free tier — no subscription
35
- if (!sub || (sub.status !== 'active' && sub.status !== 'past_due')) {
36
- return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { height: 1 }), _jsx(Field, { label: "plan", children: _jsx(Text, { dimColor: true, children: "free \u00B7 250 ops/mo" }) }), usage && _jsx(UsageBar, { used: usage.ops_used, limit: usage.ops_limit })] }));
37
- }
38
- // Payment failed
39
- if (sub.status === 'past_due') {
40
- return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { height: 1 }), _jsx(Text, { color: "red", children: " ! payment failed" }), _jsx(Text, { color: "gray", children: " update your payment method to continue" }), _jsx(Box, { height: 1 }), _jsx(Field, { label: "plan", children: _jsx(Text, { dimColor: true, children: "pro \u00B7 $19/month" }) }), usage && _jsx(UsageBar, { used: usage.ops_used, limit: usage.ops_limit })] }));
41
- }
42
- // Canceled
43
- if (sub.cancel_at_period_end) {
44
- return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { height: 1 }), _jsx(Text, { color: "red", children: " subscription canceled" }), sub.current_period_end && (_jsxs(Text, { color: "gray", children: [" reverts to free tier ", formatDate(sub.current_period_end)] })), _jsx(Box, { height: 1 }), _jsx(Field, { label: "plan", children: _jsx(Text, { dimColor: true, children: "pro \u00B7 $19/month" }) }), usage && _jsx(UsageBar, { used: usage.ops_used, limit: usage.ops_limit })] }));
45
- }
46
- // Active Pro
47
- return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { height: 1 }), _jsx(Field, { label: "plan", children: _jsx(Text, { dimColor: true, children: "pro \u00B7 $19/month" }) }), usage && _jsx(UsageBar, { used: usage.ops_used, limit: usage.ops_limit }), sub.current_period_end && (_jsx(Field, { label: "renews", children: _jsx(Text, { dimColor: true, children: formatDate(sub.current_period_end) }) }))] }));
48
- }
49
- function TeamBilling({ state }) {
50
- const team = getActiveTeam(state);
51
- if (!team) {
52
- return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { height: 1 }), _jsx(Text, { color: "gray", children: " no team context" })] }));
53
- }
54
- const sub = team.subscription;
55
- const usage = team.usage;
56
- const isAdmin = state.userRole === 'admin';
57
- // No subscription — free tier
58
- if (!sub || (sub.status !== 'active' && sub.status !== 'past_due')) {
59
- return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { height: 1 }), _jsx(Field, { label: "team", children: _jsx(Text, { dimColor: true, children: team.name }) }), _jsx(Field, { label: "plan", children: _jsx(Text, { dimColor: true, children: "free \u00B7 250 ops/mo" }) }), usage && _jsx(UsageBar, { used: usage.ops_used, limit: usage.ops_limit })] }));
60
- }
61
- // Payment failed
62
- if (sub.status === 'past_due') {
63
- return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { height: 1 }), _jsx(Field, { label: "team", children: _jsx(Text, { dimColor: true, children: team.name }) }), isAdmin ? (_jsxs(_Fragment, { children: [_jsx(Text, { color: "red", children: " ! payment failed" }), _jsx(Text, { color: "gray", children: " update your payment method to continue" }), _jsx(Box, { height: 1 }), _jsxs(Field, { label: "seats", children: [_jsx(Text, { dimColor: true, children: String(sub.seat_count) }), _jsxs(Text, { color: "gray", children: [" ($", sub.seat_count * 29, "/month)"] })] }), usage && _jsx(UsageBar, { used: usage.ops_used, limit: usage.ops_limit })] })) : (_jsxs(_Fragment, { children: [_jsx(Field, { label: "status", children: _jsx(Text, { color: "red", children: "past due" }) }), _jsx(Field, { label: "seats", children: _jsx(Text, { dimColor: true, children: String(sub.seat_count) }) })] }))] }));
64
- }
65
- // Canceled
66
- if (sub.cancel_at_period_end) {
67
- return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { height: 1 }), _jsx(Field, { label: "team", children: _jsx(Text, { dimColor: true, children: team.name }) }), _jsx(Text, { color: "red", children: " subscription canceled" }), sub.current_period_end && (_jsxs(Text, { color: "gray", children: [" reverts to free tier ", formatDate(sub.current_period_end)] })), _jsx(Box, { height: 1 }), _jsxs(Field, { label: "seats", children: [_jsx(Text, { dimColor: true, children: String(sub.seat_count) }), _jsxs(Text, { color: "gray", children: [" ($", sub.seat_count * 29, "/month)"] })] }), usage && _jsx(UsageBar, { used: usage.ops_used, limit: usage.ops_limit })] }));
68
- }
69
- // Active Team
70
- return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { height: 1 }), _jsx(Field, { label: "team", children: _jsx(Text, { dimColor: true, children: team.name }) }), isAdmin ? (_jsxs(_Fragment, { children: [_jsx(Field, { label: "plan", children: _jsxs(Text, { dimColor: true, children: ["team \u00B7 $", sub.seat_count * 29, "/month"] }) }), _jsx(Field, { label: "seats", children: _jsx(Text, { dimColor: true, children: String(sub.seat_count) }) }), usage && _jsx(UsageBar, { used: usage.ops_used, limit: usage.ops_limit }), sub.current_period_end && (_jsx(Field, { label: "renews", children: _jsx(Text, { dimColor: true, children: formatDate(sub.current_period_end) }) }))] })) : (_jsxs(_Fragment, { children: [_jsx(Field, { label: "plan", children: _jsx(Text, { dimColor: true, children: "team" }) }), _jsx(Field, { label: "seats", children: _jsx(Text, { dimColor: true, children: String(sub.seat_count) }) }), usage && _jsx(UsageBar, { used: usage.ops_used, limit: usage.ops_limit })] }))] }));
71
- }
72
- //# sourceMappingURL=BillingTab.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"BillingTab.js","sourceRoot":"","sources":["../../../src/tui/tabs/BillingTab.tsx"],"names":[],"mappings":"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"}
@@ -1,5 +0,0 @@
1
- import type { AppState } from '../state.js';
2
- export declare function KeysTab({ state, height }: {
3
- state: AppState;
4
- height?: number;
5
- }): import("react/jsx-runtime").JSX.Element;
@@ -1,92 +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 { getActiveProject, getActiveTeam, isTeamLocked } from '../state.js';
4
- import { Divider } from '../components/Divider.js';
5
- import { LockCard } from '../components/LockCard.js';
6
- import { timeAgo } from '../utils.js';
7
- function isPaid(state) {
8
- const project = getActiveProject(state);
9
- if (!project)
10
- return false;
11
- if (project.owner.kind === 'team') {
12
- const team = getActiveTeam(state);
13
- const sub = team?.subscription;
14
- return !!sub && (sub.status === 'active' || sub.status === 'past_due');
15
- }
16
- const sub = state.individualSubscription;
17
- return !!sub && (sub.status === 'active' || sub.status === 'past_due');
18
- }
19
- /** Short action labels for compact display. */
20
- const ACTION_SHORT = {
21
- understand: 'und',
22
- contribute: 'con',
23
- search: 'src',
24
- get: 'get',
25
- history: 'his',
26
- update: 'upd',
27
- delete: 'del',
28
- restore: 'rst',
29
- };
30
- export function KeysTab({ state, height }) {
31
- const isAdmin = state.userRole === 'admin';
32
- const paid = isPaid(state);
33
- const keys = state.apiKeys;
34
- if (isTeamLocked(state)) {
35
- return (_jsx(LockCard, { variant: "team", overview: state.teamOverview, isAdmin: isAdmin, height: height, label: "Integration keys are hidden until an admin resubscribes." }));
36
- }
37
- const activeProject = getActiveProject(state);
38
- if (activeProject?.owner.kind === 'personal' && activeProject.locked) {
39
- const others = state.projects.filter(p => p.owner.kind === 'personal' && p.locked && p.project_id !== activeProject.project_id).length;
40
- return (_jsx(LockCard, { variant: "downgrade", projectName: activeProject.name, otherLockedCount: others, height: height, label: "Integration keys were disabled on cancellation. Upgrade to Pro, then restore each key with a fresh secret from the Keys tab." }));
41
- }
42
- if (state.apiKeysLoading && keys.length === 0) {
43
- return (_jsxs(Box, { flexDirection: "column", height: height, overflowY: "hidden", children: [_jsx(Box, { height: 1 }), _jsx(Text, { color: "gray", dimColor: true, children: " loading keys..." })] }));
44
- }
45
- if (!isAdmin) {
46
- return (_jsxs(Box, { flexDirection: "column", height: height, overflowY: "hidden", children: [_jsx(Box, { height: 1 }), _jsx(Text, { color: "gray", dimColor: true, children: " only admins can manage keys" })] }));
47
- }
48
- if (!paid) {
49
- return (_jsxs(Box, { flexDirection: "column", height: height, overflowY: "hidden", children: [_jsx(Box, { height: 1 }), _jsx(Text, { color: "gray", children: " keys require a paid plan" }), _jsx(Box, { height: 1 }), _jsx(Text, { color: "gray", dimColor: true, children: " keys give bots, pipelines, and external tools scoped" }), _jsx(Text, { color: "gray", dimColor: true, children: " access to the substrate \u2014 each with its own permissions." }), _jsx(Box, { height: 1 }), _jsx(Divider, {}), _jsx(Box, { height: 1 }), _jsxs(Box, { children: [_jsx(Text, { color: "gray", children: " q " }), _jsx(Text, { dimColor: true, children: "quit" })] })] }));
50
- }
51
- if (keys.length === 0) {
52
- return (_jsxs(Box, { flexDirection: "column", height: height, overflowY: "hidden", children: [_jsx(Box, { height: 1 }), _jsx(Text, { color: "gray", children: " no keys yet" }), _jsx(Box, { height: 1 }), _jsx(Text, { color: "gray", dimColor: true, children: " keys give bots, pipelines, and external tools scoped" }), _jsx(Text, { color: "gray", dimColor: true, children: " access to the substrate \u2014 each with its own permissions." }), _jsx(Box, { height: 1 }), _jsx(Divider, {}), _jsx(Box, { height: 1 }), _jsxs(Box, { children: [_jsx(Text, { color: "gray", children: " n " }), _jsx(Text, { dimColor: true, children: "create new key" })] }), _jsxs(Box, { children: [_jsx(Text, { color: "gray", children: " q " }), _jsx(Text, { dimColor: true, children: "quit" })] })] }));
53
- }
54
- const project = getActiveProject(state);
55
- // Active keys vs. disabled. The list order in state preserves the
56
- // apiKeysSelected index semantics — active section first, disabled
57
- // second. Cursor cycles through both.
58
- const activeKeys = keys.filter(k => !k.disabled_at);
59
- const disabled = keys.filter(k => !!k.disabled_at);
60
- const selectedKey = keys[state.apiKeysSelected];
61
- const selectedIsDisabled = !!selectedKey?.disabled_at;
62
- return (_jsxs(Box, { flexDirection: "column", height: height, overflowY: "hidden", children: [_jsx(Box, { height: 1 }), activeKeys.map((key) => {
63
- const idx = keys.indexOf(key);
64
- return (_jsx(KeyRow, { keyData: key, selected: state.apiKeysSelected === idx, project: project }, key.id));
65
- }), disabled.length > 0 && (_jsxs(_Fragment, { children: [_jsx(Box, { height: 1 }), _jsxs(Text, { color: "gray", dimColor: true, children: [" disabled (", disabled.length, ") \u2014 restore with a fresh secret or delete"] }), _jsx(Box, { height: 1 }), disabled.map((key) => {
66
- const idx = keys.indexOf(key);
67
- return (_jsx(KeyRow, { keyData: key, selected: state.apiKeysSelected === idx, project: project }, key.id));
68
- })] })), _jsx(Box, { height: 1 }), _jsx(Divider, {}), _jsx(Box, { height: 1 }), _jsxs(Box, { children: [_jsx(Text, { color: "gray", children: " n " }), _jsx(Text, { dimColor: true, children: "new key" })] }), selectedIsDisabled
69
- ? _jsxs(Box, { children: [_jsx(Text, { color: "gray", children: " r " }), _jsx(Text, { dimColor: true, children: "restore selected \u2014 new secret" })] })
70
- : null, _jsxs(Box, { children: [_jsx(Text, { color: "gray", children: " x " }), _jsx(Text, { dimColor: true, children: selectedIsDisabled ? 'delete selected' : 'revoke selected' })] }), _jsxs(Box, { children: [_jsx(Text, { color: "gray", children: " q " }), _jsx(Text, { dimColor: true, children: "quit" })] })] }));
71
- }
72
- function KeyRow({ keyData, selected, project, }) {
73
- const lastUsed = keyData.last_used_at ? timeAgo(keyData.last_used_at) : 'never';
74
- const expired = keyData.expires_at && new Date(keyData.expires_at) < new Date();
75
- const disabled = !!keyData.disabled_at;
76
- // Compact actions display for the scopes. Scope "all" gets explicit
77
- // labeling so admins can see which keys have cross-contributor authority
78
- // at a glance — that's the one piece of key config with real blast radius.
79
- const scopeLabels = (keyData.scopes ?? []).map(s => {
80
- const pLabel = shortenProjectId(s.project_id, project);
81
- const acts = (s.allowed_actions ?? []).map(a => ACTION_SHORT[a] ?? a).join(' ');
82
- const scopeLabel = s.scope === 'all' ? ' [all]' : '';
83
- return `${pLabel}${scopeLabel}: ${acts}`;
84
- });
85
- return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { children: [_jsx(Text, { children: selected ? '> ' : ' ' }), _jsx(Text, { ...(selected ? {} : { color: 'gray' }), children: keyData.name }), _jsxs(Text, { color: "gray", dimColor: true, children: [" ", keyData.key_prefix, "..."] }), keyData.default_agent_name && (_jsxs(Text, { color: "gray", dimColor: true, children: [" agent: ", keyData.default_agent_name] })), _jsxs(Text, { color: "gray", dimColor: true, children: [" used ", lastUsed] }), keyData.ops_limit != null && (_jsxs(Text, { color: "gray", dimColor: true, children: [" ops ", keyData.ops_used, "/", keyData.ops_limit] })), expired && _jsx(Text, { color: "red", dimColor: true, children: " expired" }), disabled && !expired && _jsx(Text, { color: "yellow", dimColor: true, children: " disabled" })] }), scopeLabels.length > 0 && (_jsxs(Box, { children: [_jsx(Text, { children: " " }), _jsx(Text, { color: "gray", dimColor: true, children: scopeLabels.join(' | ') })] }))] }));
86
- }
87
- function shortenProjectId(id, active) {
88
- if (active && active.project_id === id)
89
- return active.slug;
90
- return id.slice(0, 8);
91
- }
92
- //# sourceMappingURL=KeysTab.js.map