chatroom-cli 1.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/dist/api.d.ts +86 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +29 -0
- package/dist/api.js.map +1 -0
- package/dist/commands/auth-login.d.ts +10 -0
- package/dist/commands/auth-login.d.ts.map +1 -0
- package/dist/commands/auth-login.js +165 -0
- package/dist/commands/auth-login.js.map +1 -0
- package/dist/commands/auth-logout.d.ts +6 -0
- package/dist/commands/auth-logout.d.ts.map +1 -0
- package/dist/commands/auth-logout.js +21 -0
- package/dist/commands/auth-logout.js.map +1 -0
- package/dist/commands/auth-status.d.ts +6 -0
- package/dist/commands/auth-status.d.ts.map +1 -0
- package/dist/commands/auth-status.js +50 -0
- package/dist/commands/auth-status.js.map +1 -0
- package/dist/commands/complete.d.ts +5 -0
- package/dist/commands/complete.d.ts.map +1 -0
- package/dist/commands/complete.js +36 -0
- package/dist/commands/complete.js.map +1 -0
- package/dist/commands/create.d.ts +9 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +58 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/init.d.ts +9 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +45 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/list.d.ts +5 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +22 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/send.d.ts +11 -0
- package/dist/commands/send.d.ts.map +1 -0
- package/dist/commands/send.js +55 -0
- package/dist/commands/send.js.map +1 -0
- package/dist/commands/task-complete.d.ts +12 -0
- package/dist/commands/task-complete.d.ts.map +1 -0
- package/dist/commands/task-complete.js +58 -0
- package/dist/commands/task-complete.js.map +1 -0
- package/dist/commands/wait-for-message.d.ts +11 -0
- package/dist/commands/wait-for-message.d.ts.map +1 -0
- package/dist/commands/wait-for-message.js +249 -0
- package/dist/commands/wait-for-message.js.map +1 -0
- package/dist/config/defaults.d.ts +16 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +78 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/loader.d.ts +52 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +204 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/schema.d.ts +56 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +106 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/config.d.ts +18 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +18 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +132 -0
- package/dist/index.js.map +1 -0
- package/dist/infrastructure/auth/middleware.d.ts +20 -0
- package/dist/infrastructure/auth/middleware.d.ts.map +1 -0
- package/dist/infrastructure/auth/middleware.js +86 -0
- package/dist/infrastructure/auth/middleware.js.map +1 -0
- package/dist/infrastructure/auth/storage.d.ts +44 -0
- package/dist/infrastructure/auth/storage.d.ts.map +1 -0
- package/dist/infrastructure/auth/storage.js +113 -0
- package/dist/infrastructure/auth/storage.js.map +1 -0
- package/dist/infrastructure/convex/client.d.ts +16 -0
- package/dist/infrastructure/convex/client.d.ts.map +1 -0
- package/dist/infrastructure/convex/client.js +52 -0
- package/dist/infrastructure/convex/client.js.map +1 -0
- package/dist/infrastructure/history/storage.d.ts +21 -0
- package/dist/infrastructure/history/storage.d.ts.map +1 -0
- package/dist/infrastructure/history/storage.js +56 -0
- package/dist/infrastructure/history/storage.js.map +1 -0
- package/package.json +40 -0
package/dist/api.d.ts
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convex API access following proper conventions
|
|
3
|
+
* See: https://docs.convex.dev/client/react
|
|
4
|
+
*
|
|
5
|
+
* We use typed function references to maintain type safety
|
|
6
|
+
*/
|
|
7
|
+
import type { FunctionReference } from 'convex/server';
|
|
8
|
+
export type Id<TableName extends string> = string & {
|
|
9
|
+
__tableName: TableName;
|
|
10
|
+
};
|
|
11
|
+
export interface Chatroom {
|
|
12
|
+
_id: Id<'chatroom_rooms'>;
|
|
13
|
+
status: 'active' | 'interrupted' | 'completed';
|
|
14
|
+
ownerId: Id<'users'>;
|
|
15
|
+
teamId?: string;
|
|
16
|
+
teamName?: string;
|
|
17
|
+
teamRoles?: string[];
|
|
18
|
+
teamEntryPoint?: string;
|
|
19
|
+
_creationTime?: number;
|
|
20
|
+
}
|
|
21
|
+
export interface Message {
|
|
22
|
+
_id: Id<'chatroom_messages'>;
|
|
23
|
+
chatroomId: Id<'chatroom_rooms'>;
|
|
24
|
+
senderRole: string;
|
|
25
|
+
content: string;
|
|
26
|
+
type: 'message' | 'handoff' | 'interrupt' | 'join';
|
|
27
|
+
targetRole?: string;
|
|
28
|
+
claimedByRole?: string;
|
|
29
|
+
_creationTime?: number;
|
|
30
|
+
}
|
|
31
|
+
export interface Participant {
|
|
32
|
+
_id: Id<'chatroom_participants'>;
|
|
33
|
+
chatroomId: Id<'chatroom_rooms'>;
|
|
34
|
+
role: string;
|
|
35
|
+
status: 'active' | 'waiting' | 'idle';
|
|
36
|
+
_creationTime?: number;
|
|
37
|
+
}
|
|
38
|
+
export interface TeamReadinessInfo {
|
|
39
|
+
isReady: boolean;
|
|
40
|
+
teamName: string;
|
|
41
|
+
expectedRoles: string[];
|
|
42
|
+
presentRoles: string[];
|
|
43
|
+
missingRoles: string[];
|
|
44
|
+
}
|
|
45
|
+
export declare const api: {
|
|
46
|
+
chatrooms: {
|
|
47
|
+
get: FunctionReference<"query", "public">;
|
|
48
|
+
create: FunctionReference<"mutation", "public">;
|
|
49
|
+
updateStatus: FunctionReference<"mutation", "public">;
|
|
50
|
+
interrupt: FunctionReference<"mutation", "public">;
|
|
51
|
+
getTeamReadiness: FunctionReference<"query", "public">;
|
|
52
|
+
};
|
|
53
|
+
messages: {
|
|
54
|
+
send: FunctionReference<"mutation", "public">;
|
|
55
|
+
list: FunctionReference<"query", "public">;
|
|
56
|
+
getLatestForRole: FunctionReference<"query", "public">;
|
|
57
|
+
claimMessage: FunctionReference<"mutation", "public">;
|
|
58
|
+
};
|
|
59
|
+
participants: {
|
|
60
|
+
join: FunctionReference<"mutation", "public">;
|
|
61
|
+
updateStatus: FunctionReference<"mutation", "public">;
|
|
62
|
+
list: FunctionReference<"query", "public">;
|
|
63
|
+
};
|
|
64
|
+
cliAuth: {
|
|
65
|
+
createAuthRequest: FunctionReference<"mutation", "public">;
|
|
66
|
+
getAuthRequestStatus: FunctionReference<"query", "public">;
|
|
67
|
+
validateSession: FunctionReference<"query", "public">;
|
|
68
|
+
touchSession: FunctionReference<"mutation", "public">;
|
|
69
|
+
};
|
|
70
|
+
};
|
|
71
|
+
export interface AuthRequestResult {
|
|
72
|
+
requestId: string;
|
|
73
|
+
expiresAt: number;
|
|
74
|
+
}
|
|
75
|
+
export interface AuthRequestStatus {
|
|
76
|
+
status: 'pending' | 'approved' | 'denied' | 'expired' | 'not_found';
|
|
77
|
+
sessionId?: string;
|
|
78
|
+
expiresAt?: number;
|
|
79
|
+
}
|
|
80
|
+
export interface SessionValidation {
|
|
81
|
+
valid: boolean;
|
|
82
|
+
userId?: string;
|
|
83
|
+
userName?: string;
|
|
84
|
+
reason?: string;
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAGvD,MAAM,MAAM,EAAE,CAAC,SAAS,SAAS,MAAM,IAAI,MAAM,GAAG;IAAE,WAAW,EAAE,SAAS,CAAA;CAAE,CAAC;AAG/E,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC;IAC1B,MAAM,EAAE,QAAQ,GAAG,aAAa,GAAG,WAAW,CAAC;IAC/C,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE,EAAE,CAAC,mBAAmB,CAAC,CAAC;IAC7B,UAAU,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,MAAM,CAAC;IACnD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,EAAE,CAAC,uBAAuB,CAAC,CAAC;IACjC,UAAU,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;IACtC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAID,eAAO,MAAM,GAAG;;aAEuB,iBAAiB,CAAC,OAAO,EAAE,QAAQ,CAAC;gBAC9B,iBAAiB,CAAC,UAAU,EAAE,QAAQ,CAAC;sBAC3B,iBAAiB,CAAC,UAAU,EAAE,QAAQ,CAAC;mBAC7C,iBAAiB,CAAC,UAAU,EAAE,QAAQ,CAAC;0BACzB,iBAAiB,CAC5E,OAAO,EACP,QAAQ,CACT;;;cAGmC,iBAAiB,CAAC,UAAU,EAAE,QAAQ,CAAC;cACvC,iBAAiB,CAAC,OAAO,EAAE,QAAQ,CAAC;0BACZ,iBAAiB,CAC3E,OAAO,EACP,QAAQ,CACT;sBACmD,iBAAiB,CAAC,UAAU,EAAE,QAAQ,CAAC;;;cAGnD,iBAAiB,CAAC,UAAU,EAAE,QAAQ,CAAC;sBACvB,iBAAiB,CAAC,UAAU,EAAE,QAAQ,CAAC;cACvD,iBAAiB,CAAC,OAAO,EAAE,QAAQ,CAAC;;;2BAGf,iBAAiB,CAC5E,UAAU,EACV,QAAQ,CACT;8BACkE,iBAAiB,CAClF,OAAO,EACP,QAAQ,CACT;yBACwD,iBAAiB,CAAC,OAAO,EAAE,QAAQ,CAAC;sBAC1C,iBAAiB,CAAC,UAAU,EAAE,QAAQ,CAAC;;CAE7F,CAAC;AAGF,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,CAAC;IACpE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB"}
|
package/dist/api.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// Create typed function references for the chatroom-related APIs
|
|
2
|
+
// This follows Convex conventions while avoiding backend dependency issues
|
|
3
|
+
export const api = {
|
|
4
|
+
chatrooms: {
|
|
5
|
+
get: 'chatrooms:get',
|
|
6
|
+
create: 'chatrooms:create',
|
|
7
|
+
updateStatus: 'chatrooms:updateStatus',
|
|
8
|
+
interrupt: 'chatrooms:interrupt',
|
|
9
|
+
getTeamReadiness: 'chatrooms:getTeamReadiness',
|
|
10
|
+
},
|
|
11
|
+
messages: {
|
|
12
|
+
send: 'messages:send',
|
|
13
|
+
list: 'messages:list',
|
|
14
|
+
getLatestForRole: 'messages:getLatestForRole',
|
|
15
|
+
claimMessage: 'messages:claimMessage',
|
|
16
|
+
},
|
|
17
|
+
participants: {
|
|
18
|
+
join: 'participants:join',
|
|
19
|
+
updateStatus: 'participants:updateStatus',
|
|
20
|
+
list: 'participants:list',
|
|
21
|
+
},
|
|
22
|
+
cliAuth: {
|
|
23
|
+
createAuthRequest: 'cliAuth:createAuthRequest',
|
|
24
|
+
getAuthRequestStatus: 'cliAuth:getAuthRequestStatus',
|
|
25
|
+
validateSession: 'cliAuth:validateSession',
|
|
26
|
+
touchSession: 'cliAuth:touchSession',
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=api.js.map
|
package/dist/api.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAkDA,iEAAiE;AACjE,2EAA2E;AAC3E,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,SAAS,EAAE;QACT,GAAG,EAAE,eAAkE;QACvE,MAAM,EAAE,kBAAwE;QAChF,YAAY,EAAE,wBAA8E;QAC5F,SAAS,EAAE,qBAA2E;QACtF,gBAAgB,EAAE,4BAGjB;KACF;IACD,QAAQ,EAAE;QACR,IAAI,EAAE,eAAqE;QAC3E,IAAI,EAAE,eAAkE;QACxE,gBAAgB,EAAE,2BAGjB;QACD,YAAY,EAAE,uBAA6E;KAC5F;IACD,YAAY,EAAE;QACZ,IAAI,EAAE,mBAAyE;QAC/E,YAAY,EAAE,2BAAiF;QAC/F,IAAI,EAAE,mBAAsE;KAC7E;IACD,OAAO,EAAE;QACP,iBAAiB,EAAE,2BAGlB;QACD,oBAAoB,EAAE,8BAGrB;QACD,eAAe,EAAE,yBAA4E;QAC7F,YAAY,EAAE,sBAA4E;KAC3F;CACF,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auth login command
|
|
3
|
+
* Implements device authorization flow for CLI authentication
|
|
4
|
+
*/
|
|
5
|
+
interface AuthLoginOptions {
|
|
6
|
+
force?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare function authLogin(options: AuthLoginOptions): Promise<void>;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=auth-login.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-login.d.ts","sourceRoot":"","sources":["../../src/commands/auth-login.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAgBH,UAAU,gBAAgB;IACxB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAwDD,wBAAsB,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0HxE"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auth login command
|
|
3
|
+
* Implements device authorization flow for CLI authentication
|
|
4
|
+
*/
|
|
5
|
+
import { api } from '../api.js';
|
|
6
|
+
import { loadConfig } from '../config/loader.js';
|
|
7
|
+
import { saveAuthData, getDeviceName, getCliVersion, isAuthenticated, getAuthFilePath, } from '../infrastructure/auth/storage.js';
|
|
8
|
+
import { getConvexClient } from '../infrastructure/convex/client.js';
|
|
9
|
+
// Poll interval for checking auth status
|
|
10
|
+
const AUTH_POLL_INTERVAL_MS = 2000;
|
|
11
|
+
/**
|
|
12
|
+
* Get the webapp URL for the auth page
|
|
13
|
+
* Priority order:
|
|
14
|
+
* 1. CHATROOM_WEB_URL environment variable (highest priority)
|
|
15
|
+
* 2. webappUrl from ~/.chatroom/chatroom.jsonc config
|
|
16
|
+
* 3. Falls back to http://localhost:3000
|
|
17
|
+
*/
|
|
18
|
+
function getWebAppUrl() {
|
|
19
|
+
// 1. Check environment variable override
|
|
20
|
+
const webAppUrlOverride = process.env.CHATROOM_WEB_URL;
|
|
21
|
+
if (webAppUrlOverride) {
|
|
22
|
+
return webAppUrlOverride;
|
|
23
|
+
}
|
|
24
|
+
// 2. Check config file
|
|
25
|
+
try {
|
|
26
|
+
const config = loadConfig();
|
|
27
|
+
if (config?.config?.webappUrl) {
|
|
28
|
+
return config.config.webappUrl;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
// Config not found or invalid, continue to default
|
|
33
|
+
}
|
|
34
|
+
// 3. Default to standard Next.js dev port
|
|
35
|
+
return 'http://localhost:3000';
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Open URL in the default browser
|
|
39
|
+
*/
|
|
40
|
+
async function openBrowser(url) {
|
|
41
|
+
const { exec } = await import('node:child_process');
|
|
42
|
+
const { promisify } = await import('node:util');
|
|
43
|
+
const execAsync = promisify(exec);
|
|
44
|
+
const platform = process.platform;
|
|
45
|
+
try {
|
|
46
|
+
if (platform === 'darwin') {
|
|
47
|
+
await execAsync(`open "${url}"`);
|
|
48
|
+
}
|
|
49
|
+
else if (platform === 'win32') {
|
|
50
|
+
await execAsync(`start "" "${url}"`);
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
// Linux and others
|
|
54
|
+
await execAsync(`xdg-open "${url}"`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
// If opening browser fails, user can manually visit the URL
|
|
59
|
+
console.log(`\nā ļø Could not open browser automatically.`);
|
|
60
|
+
console.log(` Please visit the URL manually.`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
export async function authLogin(options) {
|
|
64
|
+
// Check if already authenticated
|
|
65
|
+
if (isAuthenticated() && !options.force) {
|
|
66
|
+
console.log(`ā
Already authenticated.`);
|
|
67
|
+
console.log(` Auth file: ${getAuthFilePath()}`);
|
|
68
|
+
console.log(`\n Use --force to re-authenticate.`);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
const client = await getConvexClient();
|
|
72
|
+
// Get device info
|
|
73
|
+
const deviceName = getDeviceName();
|
|
74
|
+
const cliVersion = getCliVersion();
|
|
75
|
+
console.log(`\n${'ā'.repeat(50)}`);
|
|
76
|
+
console.log(`š CHATROOM CLI AUTHENTICATION`);
|
|
77
|
+
console.log(`${'ā'.repeat(50)}`);
|
|
78
|
+
console.log(`\nDevice: ${deviceName}`);
|
|
79
|
+
console.log(`CLI Version: ${cliVersion}`);
|
|
80
|
+
// Create auth request
|
|
81
|
+
console.log(`\nā³ Creating authentication request...`);
|
|
82
|
+
const result = (await client.mutation(api.cliAuth.createAuthRequest, {
|
|
83
|
+
deviceName,
|
|
84
|
+
cliVersion,
|
|
85
|
+
}));
|
|
86
|
+
const { requestId, expiresAt } = result;
|
|
87
|
+
const expiresInSeconds = Math.round((expiresAt - Date.now()) / 1000);
|
|
88
|
+
console.log(`\nā
Auth request created`);
|
|
89
|
+
console.log(` Request ID: ${requestId.substring(0, 8)}...`);
|
|
90
|
+
console.log(` Expires in: ${expiresInSeconds} seconds`);
|
|
91
|
+
// Get the webapp URL (reads from .env.local PORT or uses defaults)
|
|
92
|
+
const webAppUrl = getWebAppUrl();
|
|
93
|
+
// The auth page should be at /cli-auth
|
|
94
|
+
const authUrl = `${webAppUrl}/cli-auth?request=${requestId}`;
|
|
95
|
+
console.log(`\n${'ā'.repeat(50)}`);
|
|
96
|
+
console.log(`š± AUTHORIZATION REQUIRED`);
|
|
97
|
+
console.log(`${'ā'.repeat(50)}`);
|
|
98
|
+
console.log(`\nOpening browser for authorization...`);
|
|
99
|
+
console.log(`\nIf the browser doesn't open, visit this URL:`);
|
|
100
|
+
console.log(`\n ${authUrl}`);
|
|
101
|
+
console.log(`\n${'ā'.repeat(50)}`);
|
|
102
|
+
// Open browser
|
|
103
|
+
await openBrowser(authUrl);
|
|
104
|
+
// Poll for approval
|
|
105
|
+
console.log(`\nā³ Waiting for authorization...`);
|
|
106
|
+
console.log(` (Press Ctrl+C to cancel)\n`);
|
|
107
|
+
let pollCount = 0;
|
|
108
|
+
const maxPolls = Math.ceil((expiresAt - Date.now()) / AUTH_POLL_INTERVAL_MS);
|
|
109
|
+
const poll = async () => {
|
|
110
|
+
pollCount++;
|
|
111
|
+
try {
|
|
112
|
+
const status = (await client.query(api.cliAuth.getAuthRequestStatus, {
|
|
113
|
+
requestId,
|
|
114
|
+
}));
|
|
115
|
+
if (status.status === 'approved' && status.sessionId) {
|
|
116
|
+
// Success! Save the session
|
|
117
|
+
saveAuthData({
|
|
118
|
+
sessionId: status.sessionId,
|
|
119
|
+
createdAt: new Date().toISOString(),
|
|
120
|
+
deviceName,
|
|
121
|
+
cliVersion,
|
|
122
|
+
});
|
|
123
|
+
console.log(`\n${'ā'.repeat(50)}`);
|
|
124
|
+
console.log(`ā
AUTHENTICATION SUCCESSFUL`);
|
|
125
|
+
console.log(`${'ā'.repeat(50)}`);
|
|
126
|
+
console.log(`\nSession stored at: ${getAuthFilePath()}`);
|
|
127
|
+
console.log(`\nYou can now use chatroom commands.`);
|
|
128
|
+
return true;
|
|
129
|
+
}
|
|
130
|
+
if (status.status === 'denied') {
|
|
131
|
+
console.log(`\nā Authorization denied by user.`);
|
|
132
|
+
process.exit(1);
|
|
133
|
+
}
|
|
134
|
+
if (status.status === 'expired' || status.status === 'not_found') {
|
|
135
|
+
console.log(`\nā Authorization request expired.`);
|
|
136
|
+
console.log(` Please try again: chatroom auth login`);
|
|
137
|
+
process.exit(1);
|
|
138
|
+
}
|
|
139
|
+
// Still pending
|
|
140
|
+
if (pollCount % 5 === 0) {
|
|
141
|
+
const remainingSeconds = Math.round((expiresAt - Date.now()) / 1000);
|
|
142
|
+
process.stdout.write(`\r Waiting... (${remainingSeconds}s remaining) `);
|
|
143
|
+
}
|
|
144
|
+
if (pollCount >= maxPolls) {
|
|
145
|
+
console.log(`\nā Authorization request expired.`);
|
|
146
|
+
console.log(` Please try again: chatroom auth login`);
|
|
147
|
+
process.exit(1);
|
|
148
|
+
}
|
|
149
|
+
return false;
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
const err = error;
|
|
153
|
+
console.error(`\nā ļø Error polling for authorization: ${err.message}`);
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
// Start polling loop
|
|
158
|
+
while (true) {
|
|
159
|
+
const success = await poll();
|
|
160
|
+
if (success)
|
|
161
|
+
break;
|
|
162
|
+
await new Promise((resolve) => setTimeout(resolve, AUTH_POLL_INTERVAL_MS));
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=auth-login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-login.js","sourceRoot":"","sources":["../../src/commands/auth-login.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-logout.d.ts","sourceRoot":"","sources":["../../src/commands/auth-logout.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAehD"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auth logout command
|
|
3
|
+
* Clears CLI authentication
|
|
4
|
+
*/
|
|
5
|
+
import { clearAuthData, getAuthFilePath, isAuthenticated } from '../infrastructure/auth/storage.js';
|
|
6
|
+
export async function authLogout() {
|
|
7
|
+
if (!isAuthenticated()) {
|
|
8
|
+
console.log(`ā¹ļø Not currently authenticated.`);
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
const cleared = clearAuthData();
|
|
12
|
+
if (cleared) {
|
|
13
|
+
console.log(`ā
Logged out successfully.`);
|
|
14
|
+
console.log(` Removed: ${getAuthFilePath()}`);
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
console.error(`ā Failed to clear authentication data.`);
|
|
18
|
+
process.exit(1);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=auth-logout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-logout.js","sourceRoot":"","sources":["../../src/commands/auth-logout.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAEpG,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;QAChD,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;IAEhC,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,eAAe,eAAe,EAAE,EAAE,CAAC,CAAC;IAClD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;QACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-status.d.ts","sourceRoot":"","sources":["../../src/commands/auth-status.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CA6ChD"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auth status command
|
|
3
|
+
* Shows current authentication status
|
|
4
|
+
*/
|
|
5
|
+
import { api } from '../api.js';
|
|
6
|
+
import { loadAuthData, getAuthFilePath, isAuthenticated } from '../infrastructure/auth/storage.js';
|
|
7
|
+
import { getConvexClient } from '../infrastructure/convex/client.js';
|
|
8
|
+
export async function authStatus() {
|
|
9
|
+
console.log(`\n${'ā'.repeat(50)}`);
|
|
10
|
+
console.log(`š AUTHENTICATION STATUS`);
|
|
11
|
+
console.log(`${'ā'.repeat(50)}`);
|
|
12
|
+
const authData = loadAuthData();
|
|
13
|
+
if (!isAuthenticated() || !authData) {
|
|
14
|
+
console.log(`\nā Not authenticated`);
|
|
15
|
+
console.log(`\n Run: chatroom auth login`);
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
console.log(`\nš Auth file: ${getAuthFilePath()}`);
|
|
19
|
+
console.log(`š
Created: ${authData.createdAt}`);
|
|
20
|
+
if (authData.deviceName) {
|
|
21
|
+
console.log(`š» Device: ${authData.deviceName}`);
|
|
22
|
+
}
|
|
23
|
+
if (authData.cliVersion) {
|
|
24
|
+
console.log(`š¦ CLI Version: ${authData.cliVersion}`);
|
|
25
|
+
}
|
|
26
|
+
// Validate session with backend
|
|
27
|
+
console.log(`\nā³ Validating session...`);
|
|
28
|
+
try {
|
|
29
|
+
const client = await getConvexClient();
|
|
30
|
+
const validation = (await client.query(api.cliAuth.validateSession, {
|
|
31
|
+
sessionId: authData.sessionId,
|
|
32
|
+
}));
|
|
33
|
+
if (validation.valid) {
|
|
34
|
+
console.log(`\nā
Session is valid`);
|
|
35
|
+
if (validation.userName) {
|
|
36
|
+
console.log(`š¤ User: ${validation.userName}`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
console.log(`\nā Session is invalid: ${validation.reason}`);
|
|
41
|
+
console.log(`\n Run: chatroom auth login`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
const err = error;
|
|
46
|
+
console.log(`\nā ļø Could not validate session: ${err.message}`);
|
|
47
|
+
console.log(` Session may still be valid. Try running a command.`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=auth-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-status.js","sourceRoot":"","sources":["../../src/commands/auth-status.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,GAAG,EAA0B,MAAM,WAAW,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACnG,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAErE,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAEjC,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAEhC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,mBAAmB,eAAe,EAAE,EAAE,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,eAAe,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC;IACjD,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,cAAc,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IACnD,CAAC;IACD,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,mBAAmB,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,gCAAgC;IAChC,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IAEzC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,eAAe,EAAE,CAAC;QACvC,MAAM,UAAU,GAAG,CAAC,MAAM,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,eAAe,EAAE;YAClE,SAAS,EAAE,QAAQ,CAAC,SAAS;SAC9B,CAAC,CAAsB,CAAC;QAEzB,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;YACpC,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;gBACxB,OAAO,CAAC,GAAG,CAAC,YAAY,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;YACjD,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,2BAA2B,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;YAC5D,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,KAAc,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,qCAAqC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;IACvE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"complete.d.ts","sourceRoot":"","sources":["../../src/commands/complete.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,wBAAsB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmCxE"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Complete a chatroom
|
|
3
|
+
*/
|
|
4
|
+
import { api } from '../api.js';
|
|
5
|
+
import { getSessionId } from '../infrastructure/auth/storage.js';
|
|
6
|
+
import { getConvexClient } from '../infrastructure/convex/client.js';
|
|
7
|
+
export async function completeChatroom(chatroomId) {
|
|
8
|
+
const client = await getConvexClient();
|
|
9
|
+
// Get session ID for authentication
|
|
10
|
+
const sessionId = getSessionId();
|
|
11
|
+
if (!sessionId) {
|
|
12
|
+
console.error(`ā Not authenticated. Please run: chatroom auth login`);
|
|
13
|
+
process.exit(1);
|
|
14
|
+
}
|
|
15
|
+
// Validate chatroom ID format
|
|
16
|
+
if (!chatroomId ||
|
|
17
|
+
typeof chatroomId !== 'string' ||
|
|
18
|
+
chatroomId.length < 20 ||
|
|
19
|
+
chatroomId.length > 40) {
|
|
20
|
+
console.error(`ā Invalid chatroom ID format: ID must be 20-40 characters (got ${chatroomId?.length || 0})`);
|
|
21
|
+
process.exit(1);
|
|
22
|
+
}
|
|
23
|
+
try {
|
|
24
|
+
await client.mutation(api.chatrooms.updateStatus, {
|
|
25
|
+
sessionId,
|
|
26
|
+
chatroomId: chatroomId,
|
|
27
|
+
status: 'completed',
|
|
28
|
+
});
|
|
29
|
+
console.log(`ā
Chatroom ${chatroomId} marked as completed`);
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
console.error(`ā Failed to complete chatroom: ${error.message}`);
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=complete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"complete.js","sourceRoot":"","sources":["../../src/commands/complete.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,GAAG,EAAW,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAErE,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,UAAkB;IACvD,MAAM,MAAM,GAAG,MAAM,eAAe,EAAE,CAAC;IAEvC,oCAAoC;IACpC,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IACjC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;QACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,8BAA8B;IAC9B,IACE,CAAC,UAAU;QACX,OAAO,UAAU,KAAK,QAAQ;QAC9B,UAAU,CAAC,MAAM,GAAG,EAAE;QACtB,UAAU,CAAC,MAAM,GAAG,EAAE,EACtB,CAAC;QACD,OAAO,CAAC,KAAK,CACX,kEAAkE,UAAU,EAAE,MAAM,IAAI,CAAC,GAAG,CAC7F,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,EAAE;YAChD,SAAS;YACT,UAAU,EAAE,UAAkC;YAC9C,MAAM,EAAE,WAAW;SACpB,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,cAAc,UAAU,sBAAsB,CAAC,CAAC;IAC9D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,kCAAmC,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,UAAU,aAAa;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,cAAc,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwD/E"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Create a new chatroom
|
|
3
|
+
*/
|
|
4
|
+
import { api } from '../api.js';
|
|
5
|
+
import { loadConfig, getTeam, getDefaultTeam, getTeamIds } from '../config/loader.js';
|
|
6
|
+
import { getSessionId } from '../infrastructure/auth/storage.js';
|
|
7
|
+
import { getConvexClient } from '../infrastructure/convex/client.js';
|
|
8
|
+
export async function createChatroom(options = {}) {
|
|
9
|
+
const client = await getConvexClient();
|
|
10
|
+
// Get session ID for authentication
|
|
11
|
+
const sessionId = getSessionId();
|
|
12
|
+
if (!sessionId) {
|
|
13
|
+
console.error(`ā Not authenticated. Please run: chatroom auth login`);
|
|
14
|
+
process.exit(1);
|
|
15
|
+
}
|
|
16
|
+
// Load configuration
|
|
17
|
+
const { config, configPath } = loadConfig();
|
|
18
|
+
// Determine which team to use
|
|
19
|
+
let teamId;
|
|
20
|
+
let team;
|
|
21
|
+
if (options.team) {
|
|
22
|
+
team = getTeam(config, options.team);
|
|
23
|
+
if (!team) {
|
|
24
|
+
console.error(`ā Team '${options.team}' not found`);
|
|
25
|
+
console.error(` Available teams: ${getTeamIds(config).join(', ')}`);
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
teamId = options.team;
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
teamId = config.defaultTeam;
|
|
32
|
+
team = getDefaultTeam(config);
|
|
33
|
+
}
|
|
34
|
+
// Determine entry point (defaults to first role)
|
|
35
|
+
const entryPoint = team.entryPoint ?? team.roles[0];
|
|
36
|
+
// Create the chatroom with team info
|
|
37
|
+
const chatroomId = await client.mutation(api.chatrooms.create, {
|
|
38
|
+
sessionId,
|
|
39
|
+
teamId,
|
|
40
|
+
teamName: team.name,
|
|
41
|
+
teamRoles: team.roles,
|
|
42
|
+
teamEntryPoint: entryPoint,
|
|
43
|
+
});
|
|
44
|
+
console.log(`\nā
Chatroom created!`);
|
|
45
|
+
console.log(`š Chatroom ID: ${chatroomId}`);
|
|
46
|
+
console.log(`š„ Team: ${team.name} (${team.roles.join(', ')})`);
|
|
47
|
+
if (configPath) {
|
|
48
|
+
console.log(`š Config: ${configPath}`);
|
|
49
|
+
}
|
|
50
|
+
console.log(`\nš Next steps:`);
|
|
51
|
+
console.log(` 1. Start agents for each role:`);
|
|
52
|
+
for (const role of team.roles) {
|
|
53
|
+
console.log(` chatroom wait-for-message ${chatroomId} --role=${role}`);
|
|
54
|
+
}
|
|
55
|
+
console.log(`\n 2. Send a message to get started:`);
|
|
56
|
+
console.log(` chatroom send ${chatroomId} --message="Your task here"`);
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtF,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAMrE,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,UAAyB,EAAE;IAC9D,MAAM,MAAM,GAAG,MAAM,eAAe,EAAE,CAAC;IAEvC,oCAAoC;IACpC,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IACjC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;QACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,qBAAqB;IACrB,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,UAAU,EAAE,CAAC;IAE5C,8BAA8B;IAC9B,IAAI,MAAc,CAAC;IACnB,IAAI,IAAI,CAAC;IAET,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,CAAC,KAAK,CAAC,WAAW,OAAO,CAAC,IAAI,aAAa,CAAC,CAAC;YACpD,OAAO,CAAC,KAAK,CAAC,uBAAuB,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IACxB,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC;QAC5B,IAAI,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IAED,iDAAiD;IACjD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEpD,qCAAqC;IACrC,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE;QAC7D,SAAS;QACT,MAAM;QACN,QAAQ,EAAE,IAAI,CAAC,IAAI;QACnB,SAAS,EAAE,IAAI,CAAC,KAAK;QACrB,cAAc,EAAE,UAAU;KAC3B,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,mBAAmB,UAAU,EAAE,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChE,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,cAAc,UAAU,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAChC,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;IACjD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,mCAAmC,UAAU,WAAW,IAAI,EAAE,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,uBAAuB,UAAU,6BAA6B,CAAC,CAAC;AAC9E,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,UAAU,WAAW;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAmBD,wBAAsB,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA8BpE"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Initialize chatroom configuration
|
|
3
|
+
*/
|
|
4
|
+
import * as readline from 'readline';
|
|
5
|
+
import { DEFAULT_CONVEX_URL } from '../config/defaults.js';
|
|
6
|
+
import { findConfigPath, createGlobalConfig } from '../config/loader.js';
|
|
7
|
+
/**
|
|
8
|
+
* Prompt user for input
|
|
9
|
+
*/
|
|
10
|
+
function prompt(question) {
|
|
11
|
+
const rl = readline.createInterface({
|
|
12
|
+
input: process.stdin,
|
|
13
|
+
output: process.stdout,
|
|
14
|
+
});
|
|
15
|
+
return new Promise((resolve) => {
|
|
16
|
+
rl.question(question, (answer) => {
|
|
17
|
+
rl.close();
|
|
18
|
+
resolve(answer.trim());
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
export async function initConfig(options) {
|
|
23
|
+
// Check if config already exists
|
|
24
|
+
const existingConfigPath = findConfigPath();
|
|
25
|
+
if (existingConfigPath && !options.force) {
|
|
26
|
+
console.log(`ā
Configuration already exists at: ${existingConfigPath}`);
|
|
27
|
+
console.log(' Use --force to overwrite');
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
console.log('\nāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā');
|
|
31
|
+
console.log('ā š Welcome to Chatroom CLI Setup! š ā');
|
|
32
|
+
console.log('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n');
|
|
33
|
+
console.log('Chatroom CLI needs a Convex backend to store messages.');
|
|
34
|
+
console.log('You can use your own deployment or a shared instance.\n');
|
|
35
|
+
console.log(`Default Convex URL: ${DEFAULT_CONVEX_URL}`);
|
|
36
|
+
console.log('(Press Enter to use the default, or enter your own URL)\n');
|
|
37
|
+
const userInput = await prompt('Convex URL: ');
|
|
38
|
+
const convexUrl = userInput || DEFAULT_CONVEX_URL;
|
|
39
|
+
console.log(`\nā
Using Convex URL: ${convexUrl}`);
|
|
40
|
+
// Create the global config
|
|
41
|
+
const configPath = createGlobalConfig(convexUrl);
|
|
42
|
+
console.log(`\nš Configuration saved to: ${configPath}`);
|
|
43
|
+
console.log('\nYou can edit this file later to customize teams and prompts.');
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAC;AAErC,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAMzE;;GAEG;AACH,SAAS,MAAM,CAAC,QAAgB;IAC9B,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAc,EAAE,EAAE;YACvC,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAoB;IACnD,iCAAiC;IACjC,MAAM,kBAAkB,GAAG,cAAc,EAAE,CAAC;IAE5C,IAAI,kBAAkB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,sCAAsC,kBAAkB,EAAE,CAAC,CAAC;QACxE,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAC3C,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;IAC9E,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;IAC3E,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;IAE9E,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;IACtE,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;IAEvE,OAAO,CAAC,GAAG,CAAC,uBAAuB,kBAAkB,EAAE,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;IAEzE,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,SAAS,IAAI,kBAAkB,CAAC;IAElD,OAAO,CAAC,GAAG,CAAC,yBAAyB,SAAS,EAAE,CAAC,CAAC;IAElD,2BAA2B;IAC3B,MAAM,UAAU,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAEjD,OAAO,CAAC,GAAG,CAAC,gCAAgC,UAAU,EAAE,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;AAChF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAoBnD"}
|