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.
- package/README.md +37 -0
- package/cli.js +15501 -0
- package/package.json +15 -26
- package/dist/__tests__/instruction-file.unit.test.d.ts +0 -1
- package/dist/__tests__/instruction-file.unit.test.js +0 -296
- package/dist/__tests__/instruction-file.unit.test.js.map +0 -1
- package/dist/__tests__/teardown.unit.test.d.ts +0 -1
- package/dist/__tests__/teardown.unit.test.js +0 -196
- package/dist/__tests__/teardown.unit.test.js.map +0 -1
- package/dist/api.d.ts +0 -292
- package/dist/api.js +0 -337
- package/dist/api.js.map +0 -1
- package/dist/auth.d.ts +0 -4
- package/dist/auth.js +0 -96
- package/dist/auth.js.map +0 -1
- package/dist/constants.d.ts +0 -2
- package/dist/constants.js +0 -10
- package/dist/constants.js.map +0 -1
- package/dist/index.d.ts +0 -2
- package/dist/index.js +0 -259
- package/dist/index.js.map +0 -1
- package/dist/instructions.d.ts +0 -33
- package/dist/instructions.js +0 -238
- package/dist/instructions.js.map +0 -1
- package/dist/log.d.ts +0 -6
- package/dist/log.js +0 -51
- package/dist/log.js.map +0 -1
- package/dist/pause.d.ts +0 -3
- package/dist/pause.js +0 -24
- package/dist/pause.js.map +0 -1
- package/dist/platforms.d.ts +0 -22
- package/dist/platforms.js +0 -79
- package/dist/platforms.js.map +0 -1
- package/dist/postinstall.d.ts +0 -2
- package/dist/postinstall.js +0 -11
- package/dist/postinstall.js.map +0 -1
- package/dist/proxy.d.ts +0 -1
- package/dist/proxy.js +0 -371
- package/dist/proxy.js.map +0 -1
- package/dist/setup.d.ts +0 -15
- package/dist/setup.js +0 -295
- package/dist/setup.js.map +0 -1
- package/dist/teardown.d.ts +0 -15
- package/dist/teardown.js +0 -235
- package/dist/teardown.js.map +0 -1
- package/dist/tui/App.d.ts +0 -1
- package/dist/tui/App.js +0 -2245
- package/dist/tui/App.js.map +0 -1
- package/dist/tui/components/Banner.d.ts +0 -4
- package/dist/tui/components/Banner.js +0 -71
- package/dist/tui/components/Banner.js.map +0 -1
- package/dist/tui/components/Divider.d.ts +0 -1
- package/dist/tui/components/Divider.js +0 -8
- package/dist/tui/components/Divider.js.map +0 -1
- package/dist/tui/components/Footer.d.ts +0 -4
- package/dist/tui/components/Footer.js +0 -183
- package/dist/tui/components/Footer.js.map +0 -1
- package/dist/tui/components/Header.d.ts +0 -4
- package/dist/tui/components/Header.js +0 -126
- package/dist/tui/components/Header.js.map +0 -1
- package/dist/tui/components/LockCard.d.ts +0 -17
- package/dist/tui/components/LockCard.js +0 -37
- package/dist/tui/components/LockCard.js.map +0 -1
- package/dist/tui/components/Modal.d.ts +0 -5
- package/dist/tui/components/Modal.js +0 -195
- package/dist/tui/components/Modal.js.map +0 -1
- package/dist/tui/components/TabBar.d.ts +0 -4
- package/dist/tui/components/TabBar.js +0 -17
- package/dist/tui/components/TabBar.js.map +0 -1
- package/dist/tui/components/Toast.d.ts +0 -4
- package/dist/tui/components/Toast.js +0 -9
- package/dist/tui/components/Toast.js.map +0 -1
- package/dist/tui/index.d.ts +0 -1
- package/dist/tui/index.js +0 -20
- package/dist/tui/index.js.map +0 -1
- package/dist/tui/platform-detect.d.ts +0 -2
- package/dist/tui/platform-detect.js +0 -79
- package/dist/tui/platform-detect.js.map +0 -1
- package/dist/tui/state.d.ts +0 -414
- package/dist/tui/state.js +0 -397
- package/dist/tui/state.js.map +0 -1
- package/dist/tui/tabs/BillingTab.d.ts +0 -5
- package/dist/tui/tabs/BillingTab.js +0 -72
- package/dist/tui/tabs/BillingTab.js.map +0 -1
- package/dist/tui/tabs/KeysTab.d.ts +0 -5
- package/dist/tui/tabs/KeysTab.js +0 -92
- package/dist/tui/tabs/KeysTab.js.map +0 -1
- package/dist/tui/tabs/KnowledgeTab.d.ts +0 -5
- package/dist/tui/tabs/KnowledgeTab.js +0 -143
- package/dist/tui/tabs/KnowledgeTab.js.map +0 -1
- package/dist/tui/tabs/ProjectTab.d.ts +0 -5
- package/dist/tui/tabs/ProjectTab.js +0 -34
- package/dist/tui/tabs/ProjectTab.js.map +0 -1
- package/dist/tui/tabs/TeamTab.d.ts +0 -5
- package/dist/tui/tabs/TeamTab.js +0 -57
- package/dist/tui/tabs/TeamTab.js.map +0 -1
- package/dist/tui/tabs/YouTab.d.ts +0 -5
- package/dist/tui/tabs/YouTab.js +0 -25
- package/dist/tui/tabs/YouTab.js.map +0 -1
- package/dist/tui/utils.d.ts +0 -6
- package/dist/tui/utils.js +0 -58
- 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
|
package/dist/tui/state.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/tui/state.ts"],"names":[],"mappings":"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"}
|
|
@@ -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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"}
|
package/dist/tui/tabs/KeysTab.js
DELETED
|
@@ -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
|