cohvu 2.15.0 → 2.16.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/api.d.ts CHANGED
@@ -9,8 +9,6 @@ export interface MeResponse {
9
9
  email: string;
10
10
  name: string;
11
11
  active_project_id: string | null;
12
- has_used_trial: boolean;
13
- trial_ends_at: string | null;
14
12
  created_at: string;
15
13
  };
16
14
  individual_subscription: {
@@ -30,7 +28,6 @@ export interface MeResponse {
30
28
  name: string;
31
29
  slug: string;
32
30
  role: string;
33
- trial_ends_at: string | null;
34
31
  require_consensus: boolean;
35
32
  subscription: {
36
33
  status: string;
@@ -78,7 +75,6 @@ export interface ProjectInfo {
78
75
  id: string;
79
76
  name: string;
80
77
  slug: string;
81
- trial_ends_at: string | null;
82
78
  }
83
79
  export interface InviteLink {
84
80
  role: string;
@@ -103,9 +99,11 @@ export interface Notification {
103
99
  created_at: string;
104
100
  seen: boolean;
105
101
  }
102
+ export type KeyAction = 'understand' | 'contribute' | 'search' | 'get' | 'history' | 'update' | 'delete' | 'restore';
106
103
  export interface ApiKeyScope {
107
104
  project_id: string;
108
- role: 'admin' | 'member' | 'viewer';
105
+ role: string;
106
+ allowed_actions: KeyAction[];
109
107
  }
110
108
  export interface ApiKeySummary {
111
109
  id: string;
@@ -114,9 +112,10 @@ export interface ApiKeySummary {
114
112
  key_prefix: string;
115
113
  permissions?: unknown;
116
114
  default_agent_name: string | null;
117
- allowed_tools: string[] | null;
118
115
  last_used_at: string | null;
119
116
  expires_at: string | null;
117
+ ops_limit: number | null;
118
+ ops_used: number;
120
119
  created_at: string;
121
120
  scopes?: ApiKeyScope[];
122
121
  }
@@ -128,10 +127,13 @@ export interface CreateSessionKeyInput {
128
127
  export interface CreateIntegrationKeyInput {
129
128
  kind: 'integration';
130
129
  name: string;
131
- projects: ApiKeyScope[];
132
- allowed_tools?: string[];
130
+ projects: Array<{
131
+ project_id: string;
132
+ allowed_actions: KeyAction[];
133
+ }>;
133
134
  default_agent_name?: string;
134
135
  expires_in_days?: number;
136
+ ops_limit?: number;
135
137
  }
136
138
  export declare class ApiClient {
137
139
  private baseUrl;
@@ -184,7 +186,6 @@ export declare class ApiClient {
184
186
  id: string;
185
187
  name: string;
186
188
  slug: string;
187
- trial_ends_at: string | null;
188
189
  }>;
189
190
  renameTeam(teamId: string, name: string, slug: string): Promise<void>;
190
191
  updateTeamSettings(teamId: string, settings: {
package/dist/index.js CHANGED
@@ -162,11 +162,7 @@ async function enterDashboard() {
162
162
  const slug = deriveSlug(name);
163
163
  try {
164
164
  await api.createProject(name, slug, me.user.id);
165
- // Trial is set server-side during project creation (7 days)
166
- const trialDate = new Date(Date.now() + 7 * 24 * 60 * 60 * 1000);
167
- const months = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'];
168
- const formatted = `${months[trialDate.getMonth()]} ${trialDate.getDate()}`;
169
- console.log(' created ' + slug + chalk.dim(' \u00b7 trial ends ' + formatted));
165
+ console.log(' created ' + slug);
170
166
  }
171
167
  catch {
172
168
  console.log(chalk.dim(" couldn't create project \u2014 try again from the dashboard"));
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/tui/App.js CHANGED
@@ -20,8 +20,8 @@ import { BillingTab } from './tabs/BillingTab.js';
20
20
  import { ProjectTab } from './tabs/ProjectTab.js';
21
21
  import { KeysTab } from './tabs/KeysTab.js';
22
22
  import { YouTab } from './tabs/YouTab.js';
23
- import { KNOWN_TOOL_NAMES } from './state.js';
24
- import { daysUntil, timeUntil } from './utils.js';
23
+ import { ALL_KEY_ACTIONS } from './state.js';
24
+ import { timeUntil } from './utils.js';
25
25
  import { exec, execFile } from 'child_process';
26
26
  import { existsSync, readFileSync, writeFileSync, mkdirSync, unlinkSync, watch } from 'fs';
27
27
  import { join } from 'path';
@@ -139,6 +139,10 @@ export default function App() {
139
139
  }
140
140
  });
141
141
  }
142
+ else if (eventType === 'usage') {
143
+ const usage = data;
144
+ dispatch({ type: 'SET_USAGE', ops_used: usage.ops_used, ops_limit: usage.ops_limit });
145
+ }
142
146
  else if (eventType === 'approval') {
143
147
  const team = getActiveTeam(stateRef.current);
144
148
  if (team) {
@@ -523,7 +527,7 @@ export default function App() {
523
527
  return;
524
528
  }
525
529
  // Global 'b' shortcut — subscribe/billing portal from banner
526
- if (input === 'b' && s.userRole === 'admin' && s.tab !== 'billing') {
530
+ if (input === 'b' && s.userRole === 'admin' && s.tab !== 'billing' && !(s.tab === 'knowledge' && s.knowledgeMode !== 'browse')) {
527
531
  await handleBillingShortcut();
528
532
  return;
529
533
  }
@@ -562,18 +566,23 @@ export default function App() {
562
566
  return;
563
567
  }
564
568
  if (input === 'n' && s.userRole === 'admin') {
565
- const adminProjects = adminScopableProjects(s);
569
+ if (!hasPaidPlan(s)) {
570
+ showToast('Keys require a paid plan', 'error');
571
+ return;
572
+ }
566
573
  dispatch({ type: 'OPEN_MODAL', modal: {
567
574
  kind: 'create-integration-key',
568
575
  step: 'name',
569
576
  input: '',
570
- projectId: adminProjects[0]?.project_id ?? '',
571
- projectSelectedIdx: 0,
572
- role: 'member',
573
- roleSelectedIdx: 1,
574
- allowedTools: [],
575
- toolsSelectedIdx: 0,
576
577
  agentName: '',
578
+ projectSelectedIdx: 0,
579
+ selectedProjectIds: new Set(),
580
+ projectScopes: new Map(),
581
+ permProjectIdx: 0,
582
+ permActionIdx: 0,
583
+ limitsField: 'expiry',
584
+ expiresInDays: '',
585
+ opsLimit: '',
577
586
  } });
578
587
  return;
579
588
  }
@@ -1027,11 +1036,7 @@ export default function App() {
1027
1036
  const adminProjects = adminScopableProjects(s);
1028
1037
  if (modal.step === 'name') {
1029
1038
  if (key.return && modal.input.trim().length > 0) {
1030
- if (adminProjects.length === 0) {
1031
- showInlineError('no projects you can scope an integration key to', 3000);
1032
- return;
1033
- }
1034
- dispatch({ type: 'OPEN_MODAL', modal: { ...modal, step: 'project' } });
1039
+ dispatch({ type: 'OPEN_MODAL', modal: { ...modal, step: 'agent' } });
1035
1040
  }
1036
1041
  else if (key.backspace || key.delete) {
1037
1042
  dispatch({ type: 'OPEN_MODAL', modal: { ...modal, input: modal.input.slice(0, -1) } });
@@ -1044,75 +1049,131 @@ export default function App() {
1044
1049
  }
1045
1050
  return;
1046
1051
  }
1047
- if (modal.step === 'project') {
1048
- if (adminProjects.length === 0)
1049
- return;
1050
- if (key.upArrow) {
1051
- const i = Math.max(0, modal.projectSelectedIdx - 1);
1052
- dispatch({ type: 'OPEN_MODAL', modal: { ...modal, projectSelectedIdx: i, projectId: adminProjects[i].project_id } });
1052
+ if (modal.step === 'agent') {
1053
+ if (key.return) {
1054
+ if (adminProjects.length === 0) {
1055
+ showInlineError('no projects you can scope a key to', 3000);
1056
+ return;
1057
+ }
1058
+ dispatch({ type: 'OPEN_MODAL', modal: { ...modal, step: 'projects' } });
1053
1059
  }
1054
- else if (key.downArrow) {
1055
- const i = Math.min(adminProjects.length - 1, modal.projectSelectedIdx + 1);
1056
- dispatch({ type: 'OPEN_MODAL', modal: { ...modal, projectSelectedIdx: i, projectId: adminProjects[i].project_id } });
1060
+ else if (key.backspace || key.delete) {
1061
+ dispatch({ type: 'OPEN_MODAL', modal: { ...modal, agentName: modal.agentName.slice(0, -1) } });
1057
1062
  }
1058
- else if (key.return && modal.projectId) {
1059
- dispatch({ type: 'OPEN_MODAL', modal: { ...modal, step: 'role' } });
1063
+ else if (input === ' ') {
1064
+ dispatch({ type: 'OPEN_MODAL', modal: { ...modal, agentName: modal.agentName + ' ' } });
1065
+ }
1066
+ else if (input.length === 1 && !key.ctrl && !key.meta) {
1067
+ dispatch({ type: 'OPEN_MODAL', modal: { ...modal, agentName: modal.agentName + input } });
1060
1068
  }
1061
1069
  return;
1062
1070
  }
1063
- if (modal.step === 'role') {
1064
- const roles = ['admin', 'member', 'viewer'];
1071
+ if (modal.step === 'projects') {
1072
+ if (adminProjects.length === 0)
1073
+ return;
1065
1074
  if (key.upArrow) {
1066
- const i = Math.max(0, modal.roleSelectedIdx - 1);
1067
- dispatch({ type: 'OPEN_MODAL', modal: { ...modal, roleSelectedIdx: i, role: roles[i] } });
1075
+ dispatch({ type: 'OPEN_MODAL', modal: { ...modal, projectSelectedIdx: Math.max(0, modal.projectSelectedIdx - 1) } });
1068
1076
  }
1069
1077
  else if (key.downArrow) {
1070
- const i = Math.min(2, modal.roleSelectedIdx + 1);
1071
- dispatch({ type: 'OPEN_MODAL', modal: { ...modal, roleSelectedIdx: i, role: roles[i] } });
1078
+ dispatch({ type: 'OPEN_MODAL', modal: { ...modal, projectSelectedIdx: Math.min(adminProjects.length - 1, modal.projectSelectedIdx + 1) } });
1072
1079
  }
1073
- else if (key.return) {
1074
- dispatch({ type: 'OPEN_MODAL', modal: { ...modal, step: 'tools' } });
1080
+ else if (input === ' ') {
1081
+ const p = adminProjects[modal.projectSelectedIdx];
1082
+ if (p) {
1083
+ const next = new Set(modal.selectedProjectIds);
1084
+ if (next.has(p.project_id))
1085
+ next.delete(p.project_id);
1086
+ else
1087
+ next.add(p.project_id);
1088
+ dispatch({ type: 'OPEN_MODAL', modal: { ...modal, selectedProjectIds: next } });
1089
+ }
1090
+ }
1091
+ else if (key.return && modal.selectedProjectIds.size > 0) {
1092
+ // Initialize default scopes for new projects (all actions on)
1093
+ const scopes = new Map(modal.projectScopes);
1094
+ for (const pid of modal.selectedProjectIds) {
1095
+ if (!scopes.has(pid)) {
1096
+ scopes.set(pid, new Set([...ALL_KEY_ACTIONS]));
1097
+ }
1098
+ }
1099
+ // Remove scopes for deselected projects
1100
+ for (const pid of scopes.keys()) {
1101
+ if (!modal.selectedProjectIds.has(pid))
1102
+ scopes.delete(pid);
1103
+ }
1104
+ dispatch({ type: 'OPEN_MODAL', modal: { ...modal, step: 'permissions', projectScopes: scopes, permProjectIdx: 0, permActionIdx: 0 } });
1075
1105
  }
1076
1106
  return;
1077
1107
  }
1078
- if (modal.step === 'tools') {
1079
- if (key.upArrow) {
1080
- dispatch({ type: 'OPEN_MODAL', modal: { ...modal, toolsSelectedIdx: Math.max(0, modal.toolsSelectedIdx - 1) } });
1108
+ if (modal.step === 'permissions') {
1109
+ const selectedProjects = adminProjects.filter(p => modal.selectedProjectIds.has(p.project_id));
1110
+ const projectCount = selectedProjects.length;
1111
+ if (projectCount === 0)
1112
+ return;
1113
+ if (key.tab) {
1114
+ // tab cycles through projects
1115
+ const next = (modal.permProjectIdx + 1) % projectCount;
1116
+ dispatch({ type: 'OPEN_MODAL', modal: { ...modal, permProjectIdx: next, permActionIdx: 0 } });
1117
+ }
1118
+ else if (key.upArrow) {
1119
+ dispatch({ type: 'OPEN_MODAL', modal: { ...modal, permProjectIdx: Math.max(0, modal.permProjectIdx - 1), permActionIdx: 0 } });
1081
1120
  }
1082
1121
  else if (key.downArrow) {
1083
- dispatch({ type: 'OPEN_MODAL', modal: { ...modal, toolsSelectedIdx: Math.min(KNOWN_TOOL_NAMES.length - 1, modal.toolsSelectedIdx + 1) } });
1122
+ dispatch({ type: 'OPEN_MODAL', modal: { ...modal, permProjectIdx: Math.min(projectCount - 1, modal.permProjectIdx + 1), permActionIdx: 0 } });
1123
+ }
1124
+ else if (key.leftArrow) {
1125
+ dispatch({ type: 'OPEN_MODAL', modal: { ...modal, permActionIdx: Math.max(0, modal.permActionIdx - 1) } });
1126
+ }
1127
+ else if (key.rightArrow) {
1128
+ dispatch({ type: 'OPEN_MODAL', modal: { ...modal, permActionIdx: Math.min(ALL_KEY_ACTIONS.length - 1, modal.permActionIdx + 1) } });
1084
1129
  }
1085
1130
  else if (input === ' ') {
1086
- const t = KNOWN_TOOL_NAMES[modal.toolsSelectedIdx];
1087
- const next = modal.allowedTools.includes(t)
1088
- ? modal.allowedTools.filter(x => x !== t)
1089
- : [...modal.allowedTools, t];
1090
- dispatch({ type: 'OPEN_MODAL', modal: { ...modal, allowedTools: next } });
1131
+ const p = selectedProjects[modal.permProjectIdx];
1132
+ if (p) {
1133
+ const action = ALL_KEY_ACTIONS[modal.permActionIdx];
1134
+ const scopes = new Map(modal.projectScopes);
1135
+ const actions = new Set(scopes.get(p.project_id) ?? []);
1136
+ if (actions.has(action))
1137
+ actions.delete(action);
1138
+ else
1139
+ actions.add(action);
1140
+ scopes.set(p.project_id, actions);
1141
+ dispatch({ type: 'OPEN_MODAL', modal: { ...modal, projectScopes: scopes } });
1142
+ }
1091
1143
  }
1092
1144
  else if (key.return) {
1093
- dispatch({ type: 'OPEN_MODAL', modal: { ...modal, step: 'agent' } });
1145
+ dispatch({ type: 'OPEN_MODAL', modal: { ...modal, step: 'limits' } });
1094
1146
  }
1095
1147
  return;
1096
1148
  }
1097
- if (modal.step === 'agent') {
1149
+ if (modal.step === 'limits') {
1098
1150
  if (key.return) {
1099
1151
  dispatch({ type: 'OPEN_MODAL', modal: { ...modal, step: 'confirm' } });
1100
1152
  }
1101
- else if (key.backspace || key.delete) {
1102
- dispatch({ type: 'OPEN_MODAL', modal: { ...modal, agentName: modal.agentName.slice(0, -1) } });
1153
+ else if (key.tab) {
1154
+ dispatch({ type: 'OPEN_MODAL', modal: { ...modal, limitsField: modal.limitsField === 'expiry' ? 'ops' : 'expiry' } });
1103
1155
  }
1104
- else if (input === ' ') {
1105
- dispatch({ type: 'OPEN_MODAL', modal: { ...modal, agentName: modal.agentName + ' ' } });
1156
+ else if (key.backspace || key.delete) {
1157
+ if (modal.limitsField === 'expiry') {
1158
+ dispatch({ type: 'OPEN_MODAL', modal: { ...modal, expiresInDays: modal.expiresInDays.slice(0, -1) } });
1159
+ }
1160
+ else {
1161
+ dispatch({ type: 'OPEN_MODAL', modal: { ...modal, opsLimit: modal.opsLimit.slice(0, -1) } });
1162
+ }
1106
1163
  }
1107
- else if (input.length === 1 && !key.ctrl && !key.meta) {
1108
- dispatch({ type: 'OPEN_MODAL', modal: { ...modal, agentName: modal.agentName + input } });
1164
+ else if (/^[0-9]$/.test(input)) {
1165
+ if (modal.limitsField === 'expiry') {
1166
+ dispatch({ type: 'OPEN_MODAL', modal: { ...modal, expiresInDays: modal.expiresInDays + input } });
1167
+ }
1168
+ else {
1169
+ dispatch({ type: 'OPEN_MODAL', modal: { ...modal, opsLimit: modal.opsLimit + input } });
1170
+ }
1109
1171
  }
1110
1172
  return;
1111
1173
  }
1112
1174
  if (modal.step === 'confirm') {
1113
1175
  if (input === 'y') {
1114
1176
  await confirmModal(modal);
1115
- // confirmModal handles the modal transition (closes on error, opens key-created on success)
1116
1177
  }
1117
1178
  else if (input === 'n') {
1118
1179
  dispatch({ type: 'CLOSE_MODAL' });
@@ -1504,19 +1565,23 @@ export default function App() {
1504
1565
  return false;
1505
1566
  }
1506
1567
  if (modal.kind === 'create-integration-key') {
1507
- // Only the confirm step submits — earlier steps just advance via OPEN_MODAL.
1508
1568
  if (modal.step !== 'confirm')
1509
1569
  return false;
1510
- if (!modal.input.trim() || !modal.projectId)
1570
+ if (!modal.input.trim() || modal.selectedProjectIds.size === 0)
1511
1571
  return false;
1512
1572
  try {
1513
1573
  dispatch({ type: 'SET_OPERATION', operation: 'Creating key' });
1574
+ const projects = [...modal.selectedProjectIds].map(pid => ({
1575
+ project_id: pid,
1576
+ allowed_actions: [...(modal.projectScopes.get(pid) ?? [])],
1577
+ }));
1514
1578
  const result = await api.createApiKey({
1515
1579
  kind: 'integration',
1516
1580
  name: modal.input.trim(),
1517
- projects: [{ project_id: modal.projectId, role: modal.role }],
1518
- ...(modal.allowedTools.length > 0 ? { allowed_tools: modal.allowedTools } : {}),
1581
+ projects,
1519
1582
  ...(modal.agentName.trim() ? { default_agent_name: modal.agentName.trim() } : {}),
1583
+ ...(modal.expiresInDays ? { expires_in_days: parseInt(modal.expiresInDays, 10) } : {}),
1584
+ ...(modal.opsLimit ? { ops_limit: parseInt(modal.opsLimit, 10) } : {}),
1520
1585
  });
1521
1586
  dispatch({ type: 'SET_OPERATION', operation: null });
1522
1587
  const integrationKeys = stateRef.current.userRole === 'admin' && stateRef.current.activeProjectId
@@ -1899,6 +1964,18 @@ function HelpOverlay({ state }) {
1899
1964
  }
1900
1965
  return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { height: 1 }), _jsxs(Text, { color: "gray", children: [" keybindings \u00B7 ", state.tab] }), _jsx(Box, { height: 1 }), lines.map(([key, desc], i) => key === '' ? _jsx(Box, { height: 1 }, i) : (_jsxs(Box, { children: [_jsx(Box, { width: 16, children: _jsxs(Text, { color: "gray", children: [" ", key] }) }), _jsx(Text, { dimColor: true, children: desc })] }, i))), _jsx(Box, { height: 1 }), _jsx(Text, { color: "gray", dimColor: true, children: " press ? or esc to close" })] }));
1901
1966
  }
1967
+ function hasPaidPlan(state) {
1968
+ const project = getActiveProject(state);
1969
+ if (!project)
1970
+ return false;
1971
+ if (project.owner.kind === 'team') {
1972
+ const team = getActiveTeam(state);
1973
+ const sub = team?.subscription;
1974
+ return !!sub && (sub.status === 'active' || sub.status === 'past_due');
1975
+ }
1976
+ const sub = state.individualSubscription;
1977
+ return !!sub && (sub.status === 'active' || sub.status === 'past_due');
1978
+ }
1902
1979
  function hasBillingBanner(state) {
1903
1980
  const project = getActiveProject(state);
1904
1981
  if (!project)
@@ -1906,20 +1983,11 @@ function hasBillingBanner(state) {
1906
1983
  if (project.owner.kind === 'team') {
1907
1984
  const team = getActiveTeam(state);
1908
1985
  const sub = team?.subscription;
1909
- if (!sub) {
1910
- const teamData = state.teams.find(t => t.team_id === team?.team_id);
1911
- const days = teamData?.trial_ends_at ? daysUntil(teamData.trial_ends_at) : null;
1912
- return days !== null && days <= 0;
1913
- }
1914
- if (sub.status === 'past_due')
1986
+ if (sub?.status === 'past_due')
1915
1987
  return true;
1916
1988
  return false;
1917
1989
  }
1918
- const user = state.user;
1919
- const trialDays = user?.trial_ends_at ? daysUntil(user.trial_ends_at) : null;
1920
1990
  const sub = state.individualSubscription;
1921
- if (trialDays !== null && trialDays <= 0 && sub?.status !== 'active')
1922
- return true;
1923
1991
  if (sub?.status === 'past_due')
1924
1992
  return true;
1925
1993
  return false;