chatroom-cli 1.0.54 ā 1.0.64
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 +35 -27
- package/dist/index.js +12728 -339
- package/package.json +11 -10
- package/dist/api.d.ts +0 -11
- package/dist/api.d.ts.map +0 -1
- package/dist/api.js +0 -12
- package/dist/api.js.map +0 -1
- package/dist/commands/auth-login.d.ts +0 -10
- package/dist/commands/auth-login.d.ts.map +0 -1
- package/dist/commands/auth-login.js +0 -179
- package/dist/commands/auth-login.js.map +0 -1
- package/dist/commands/auth-logout.d.ts +0 -6
- package/dist/commands/auth-logout.d.ts.map +0 -1
- package/dist/commands/auth-logout.js +0 -21
- package/dist/commands/auth-logout.js.map +0 -1
- package/dist/commands/auth-status.d.ts +0 -6
- package/dist/commands/auth-status.d.ts.map +0 -1
- package/dist/commands/auth-status.js +0 -50
- package/dist/commands/auth-status.js.map +0 -1
- package/dist/commands/backlog.d.ts +0 -36
- package/dist/commands/backlog.d.ts.map +0 -1
- package/dist/commands/backlog.js +0 -310
- package/dist/commands/backlog.js.map +0 -1
- package/dist/commands/feature.d.ts +0 -14
- package/dist/commands/feature.d.ts.map +0 -1
- package/dist/commands/feature.js +0 -172
- package/dist/commands/feature.js.map +0 -1
- package/dist/commands/guidelines.d.ts +0 -17
- package/dist/commands/guidelines.d.ts.map +0 -1
- package/dist/commands/guidelines.js +0 -71
- package/dist/commands/guidelines.js.map +0 -1
- package/dist/commands/handoff.d.ts +0 -20
- package/dist/commands/handoff.d.ts.map +0 -1
- package/dist/commands/handoff.js +0 -83
- package/dist/commands/handoff.js.map +0 -1
- package/dist/commands/init.d.ts +0 -9
- package/dist/commands/init.d.ts.map +0 -1
- package/dist/commands/init.js +0 -23
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/messages.d.ts +0 -24
- package/dist/commands/messages.d.ts.map +0 -1
- package/dist/commands/messages.js +0 -149
- package/dist/commands/messages.js.map +0 -1
- package/dist/commands/opencode-install.d.ts +0 -29
- package/dist/commands/opencode-install.d.ts.map +0 -1
- package/dist/commands/opencode-install.js +0 -416
- package/dist/commands/opencode-install.js.map +0 -1
- package/dist/commands/task-started.d.ts +0 -13
- package/dist/commands/task-started.d.ts.map +0 -1
- package/dist/commands/task-started.js +0 -107
- package/dist/commands/task-started.js.map +0 -1
- package/dist/commands/update.d.ts +0 -6
- package/dist/commands/update.d.ts.map +0 -1
- package/dist/commands/update.js +0 -78
- package/dist/commands/update.js.map +0 -1
- package/dist/commands/wait-for-task.d.ts +0 -18
- package/dist/commands/wait-for-task.d.ts.map +0 -1
- package/dist/commands/wait-for-task.js +0 -306
- package/dist/commands/wait-for-task.js.map +0 -1
- package/dist/config/defaults.d.ts +0 -12
- package/dist/config/defaults.d.ts.map +0 -1
- package/dist/config/defaults.js +0 -70
- package/dist/config/defaults.js.map +0 -1
- package/dist/config/loader.d.ts +0 -52
- package/dist/config/loader.d.ts.map +0 -1
- package/dist/config/loader.js +0 -202
- package/dist/config/loader.js.map +0 -1
- package/dist/config/schema.d.ts +0 -52
- package/dist/config/schema.d.ts.map +0 -1
- package/dist/config/schema.js +0 -99
- package/dist/config/schema.js.map +0 -1
- package/dist/config.d.ts +0 -20
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js +0 -20
- package/dist/config.js.map +0 -1
- package/dist/convex-api/api.d.ts +0 -137
- package/dist/convex-api/api.js +0 -23
- package/dist/convex-api/index.d.ts +0 -102
- package/dist/convex-api/index.d.ts.map +0 -1
- package/dist/convex-api/index.js +0 -11
- package/dist/convex-api/index.js.map +0 -1
- package/dist/index.d.ts +0 -9
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/infrastructure/auth/middleware.d.ts +0 -20
- package/dist/infrastructure/auth/middleware.d.ts.map +0 -1
- package/dist/infrastructure/auth/middleware.js +0 -96
- package/dist/infrastructure/auth/middleware.js.map +0 -1
- package/dist/infrastructure/auth/storage.d.ts +0 -58
- package/dist/infrastructure/auth/storage.d.ts.map +0 -1
- package/dist/infrastructure/auth/storage.js +0 -242
- package/dist/infrastructure/auth/storage.js.map +0 -1
- package/dist/infrastructure/convex/client.d.ts +0 -16
- package/dist/infrastructure/convex/client.d.ts.map +0 -1
- package/dist/infrastructure/convex/client.js +0 -40
- package/dist/infrastructure/convex/client.js.map +0 -1
- package/dist/infrastructure/history/storage.d.ts +0 -21
- package/dist/infrastructure/history/storage.d.ts.map +0 -1
- package/dist/infrastructure/history/storage.js +0 -56
- package/dist/infrastructure/history/storage.js.map +0 -1
- package/dist/utils/file-content.d.ts +0 -29
- package/dist/utils/file-content.d.ts.map +0 -1
- package/dist/utils/file-content.js +0 -51
- package/dist/utils/file-content.js.map +0 -1
- package/dist/version.d.ts +0 -14
- package/dist/version.d.ts.map +0 -1
- package/dist/version.js +0 -43
- package/dist/version.js.map +0 -1
package/dist/commands/handoff.js
DELETED
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Complete a task and hand off to the next role
|
|
3
|
-
*
|
|
4
|
-
* This command uses the atomic handoff mutation which performs all of
|
|
5
|
-
* these operations in a single transaction:
|
|
6
|
-
* 1. Validates the handoff is allowed (classification rules)
|
|
7
|
-
* 2. Completes all in_progress tasks in the chatroom
|
|
8
|
-
* 3. Sends the handoff message
|
|
9
|
-
* 4. Creates a task for the target agent (if not handing to user)
|
|
10
|
-
* 5. Updates the sender's participant status to waiting
|
|
11
|
-
* 6. Promotes the next queued task to pending
|
|
12
|
-
*/
|
|
13
|
-
import { api } from '../api.js';
|
|
14
|
-
import { getSessionId, getOtherSessionUrls } from '../infrastructure/auth/storage.js';
|
|
15
|
-
import { getConvexClient, getConvexUrl } from '../infrastructure/convex/client.js';
|
|
16
|
-
export async function handoff(chatroomId, options) {
|
|
17
|
-
const client = await getConvexClient();
|
|
18
|
-
const { role, message, nextRole } = options;
|
|
19
|
-
// Get session ID for authentication
|
|
20
|
-
const sessionId = getSessionId();
|
|
21
|
-
if (!sessionId) {
|
|
22
|
-
const otherUrls = getOtherSessionUrls();
|
|
23
|
-
const currentUrl = getConvexUrl();
|
|
24
|
-
console.error(`ā Not authenticated for: ${currentUrl}`);
|
|
25
|
-
if (otherUrls.length > 0) {
|
|
26
|
-
console.error(`\nš” You have sessions for other environments:`);
|
|
27
|
-
for (const url of otherUrls) {
|
|
28
|
-
console.error(` ⢠${url}`);
|
|
29
|
-
}
|
|
30
|
-
console.error(`\n To use a different environment, set CHATROOM_CONVEX_URL:`);
|
|
31
|
-
console.error(` CHATROOM_CONVEX_URL=${otherUrls[0]} chatroom handoff ...`);
|
|
32
|
-
console.error(`\n Or to authenticate for the current environment:`);
|
|
33
|
-
}
|
|
34
|
-
console.error(` chatroom auth login`);
|
|
35
|
-
process.exit(1);
|
|
36
|
-
}
|
|
37
|
-
// Validate chatroom ID format
|
|
38
|
-
if (!chatroomId ||
|
|
39
|
-
typeof chatroomId !== 'string' ||
|
|
40
|
-
chatroomId.length < 20 ||
|
|
41
|
-
chatroomId.length > 40) {
|
|
42
|
-
console.error(`ā Invalid chatroom ID format: ID must be 20-40 characters (got ${chatroomId?.length || 0})`);
|
|
43
|
-
process.exit(1);
|
|
44
|
-
}
|
|
45
|
-
// Use atomic handoff mutation - performs all operations in one transaction:
|
|
46
|
-
// - Validates handoff is allowed (classification rules for user handoff)
|
|
47
|
-
// - Completes all in_progress tasks
|
|
48
|
-
// - Sends the handoff message
|
|
49
|
-
// - Creates a task for target agent (if not user)
|
|
50
|
-
// - Updates sender's participant status to waiting
|
|
51
|
-
// - Promotes next queued task to pending
|
|
52
|
-
//
|
|
53
|
-
// Note: We use sendHandoff here for backward compatibility with deployed backend.
|
|
54
|
-
// Once backend is deployed with the new 'handoff' mutation, this can be changed to api.messages.handoff
|
|
55
|
-
const result = (await client.mutation(api.messages.sendHandoff, {
|
|
56
|
-
sessionId,
|
|
57
|
-
chatroomId: chatroomId,
|
|
58
|
-
senderRole: role,
|
|
59
|
-
content: message,
|
|
60
|
-
targetRole: nextRole,
|
|
61
|
-
}));
|
|
62
|
-
// Check for handoff restriction errors
|
|
63
|
-
if (!result.success && result.error) {
|
|
64
|
-
console.error(`\nā ERROR: ${result.error.message}`);
|
|
65
|
-
if (result.error.suggestedTarget) {
|
|
66
|
-
console.error(`\nš” Try this instead:`);
|
|
67
|
-
console.error('```');
|
|
68
|
-
console.error(`chatroom handoff ${chatroomId} --role=${role} --message="<summary>" --next-role=${result.error.suggestedTarget}`);
|
|
69
|
-
console.error('```');
|
|
70
|
-
}
|
|
71
|
-
process.exit(1);
|
|
72
|
-
}
|
|
73
|
-
console.log(`ā
Task completed and handed off to ${nextRole}`);
|
|
74
|
-
console.log(`š Summary: ${message.substring(0, 100)}${message.length > 100 ? '...' : ''}`);
|
|
75
|
-
// Check if handing off to user (workflow completion)
|
|
76
|
-
if (nextRole.toLowerCase() === 'user') {
|
|
77
|
-
console.log(`\nš Workflow complete! Control returned to user.`);
|
|
78
|
-
}
|
|
79
|
-
// Remind agent to run wait-for-task manually
|
|
80
|
-
console.log(`\nā³ Now run wait-for-task to wait for your next assignment:`);
|
|
81
|
-
console.log(` chatroom wait-for-task ${chatroomId} --role=${role} --session=1`);
|
|
82
|
-
}
|
|
83
|
-
//# sourceMappingURL=handoff.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"handoff.js","sourceRoot":"","sources":["../../src/commands/handoff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAEhC,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACtF,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAQnF,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,UAAkB,EAAE,OAAuB;IACvE,MAAM,MAAM,GAAG,MAAM,eAAe,EAAE,CAAC;IACvC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAE5C,oCAAoC;IACpC,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IACjC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,SAAS,GAAG,mBAAmB,EAAE,CAAC;QACxC,MAAM,UAAU,GAAG,YAAY,EAAE,CAAC;QAElC,OAAO,CAAC,KAAK,CAAC,4BAA4B,UAAU,EAAE,CAAC,CAAC;QAExD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;YAChE,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;gBAC5B,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC;YAC/B,CAAC;YACD,OAAO,CAAC,KAAK,CAAC,+DAA+D,CAAC,CAAC;YAC/E,OAAO,CAAC,KAAK,CAAC,0BAA0B,SAAS,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC;YAC7E,OAAO,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;QACxE,CAAC;QAED,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;QACxC,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,4EAA4E;IAC5E,yEAAyE;IACzE,oCAAoC;IACpC,8BAA8B;IAC9B,kDAAkD;IAClD,mDAAmD;IACnD,yCAAyC;IACzC,EAAE;IACF,kFAAkF;IAClF,wGAAwG;IACxG,MAAM,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE;QAC9D,SAAS;QACT,UAAU,EAAE,UAAkC;QAC9C,UAAU,EAAE,IAAI;QAChB,OAAO,EAAE,OAAO;QAChB,UAAU,EAAE,QAAQ;KACrB,CAAC,CAWD,CAAC;IAEF,uCAAuC;IACvC,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACpC,OAAO,CAAC,KAAK,CAAC,cAAc,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACpD,IAAI,MAAM,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC;YACjC,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;YACxC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACrB,OAAO,CAAC,KAAK,CACX,oBAAoB,UAAU,WAAW,IAAI,sCAAsC,MAAM,CAAC,KAAK,CAAC,eAAe,EAAE,CAClH,CAAC;YACF,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,sCAAsC,QAAQ,EAAE,CAAC,CAAC;IAC9D,OAAO,CAAC,GAAG,CAAC,eAAe,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAE5F,qDAAqD;IACrD,IAAI,QAAQ,CAAC,WAAW,EAAE,KAAK,MAAM,EAAE,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;IACnE,CAAC;IAED,6CAA6C;IAC7C,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;IAC3E,OAAO,CAAC,GAAG,CAAC,6BAA6B,UAAU,WAAW,IAAI,cAAc,CAAC,CAAC;AACpF,CAAC"}
|
package/dist/commands/init.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,UAAU,WAAW;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBpE"}
|
package/dist/commands/init.js
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Initialize chatroom configuration
|
|
3
|
-
*/
|
|
4
|
-
import { findConfigPath, createGlobalConfig } from '../config/loader.js';
|
|
5
|
-
import { CONVEX_URL } from '../infrastructure/convex/client.js';
|
|
6
|
-
export async function initConfig(options) {
|
|
7
|
-
// Check if config already exists
|
|
8
|
-
const existingConfigPath = findConfigPath();
|
|
9
|
-
if (existingConfigPath && !options.force) {
|
|
10
|
-
console.log(`ā
Configuration already exists at: ${existingConfigPath}`);
|
|
11
|
-
console.log(' Use --force to overwrite');
|
|
12
|
-
return;
|
|
13
|
-
}
|
|
14
|
-
console.log('\nāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā');
|
|
15
|
-
console.log('ā š Welcome to Chatroom CLI Setup! š ā');
|
|
16
|
-
console.log('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n');
|
|
17
|
-
console.log(`Chatroom CLI connects to: ${CONVEX_URL}\n`);
|
|
18
|
-
// Create the global config
|
|
19
|
-
const configPath = createGlobalConfig();
|
|
20
|
-
console.log(`š Configuration saved to: ${configPath}`);
|
|
21
|
-
console.log('\nYou can edit this file to customize teams and prompts.');
|
|
22
|
-
}
|
|
23
|
-
//# sourceMappingURL=init.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAMhE,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,6BAA6B,UAAU,IAAI,CAAC,CAAC;IAEzD,2BAA2B;IAC3B,MAAM,UAAU,GAAG,kBAAkB,EAAE,CAAC;IAExC,OAAO,CAAC,GAAG,CAAC,8BAA8B,UAAU,EAAE,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;AAC1E,CAAC"}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Messages commands for listing and filtering chatroom messages
|
|
3
|
-
*/
|
|
4
|
-
/**
|
|
5
|
-
* List messages filtered by sender role
|
|
6
|
-
* Uses the composite index for efficient filtering
|
|
7
|
-
*/
|
|
8
|
-
export declare function listBySenderRole(chatroomId: string, options: {
|
|
9
|
-
role: string;
|
|
10
|
-
senderRole: string;
|
|
11
|
-
limit?: number;
|
|
12
|
-
full?: boolean;
|
|
13
|
-
}): Promise<void>;
|
|
14
|
-
/**
|
|
15
|
-
* List all messages since a given message ID (inclusive)
|
|
16
|
-
* Returns messages in ascending order (oldest first)
|
|
17
|
-
*/
|
|
18
|
-
export declare function listSinceMessage(chatroomId: string, options: {
|
|
19
|
-
role: string;
|
|
20
|
-
sinceMessageId: string;
|
|
21
|
-
limit?: number;
|
|
22
|
-
full?: boolean;
|
|
23
|
-
}): Promise<void>;
|
|
24
|
-
//# sourceMappingURL=messages.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/commands/messages.ts"],"names":[],"mappings":"AAAA;;GAEG;AAkBH;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE;IACP,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,GACA,OAAO,CAAC,IAAI,CAAC,CAgFf;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE;IACP,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,GACA,OAAO,CAAC,IAAI,CAAC,CAgFf"}
|
|
@@ -1,149 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Messages commands for listing and filtering chatroom messages
|
|
3
|
-
*/
|
|
4
|
-
import { api } from '../api.js';
|
|
5
|
-
import { getSessionId } from '../infrastructure/auth/storage.js';
|
|
6
|
-
import { getConvexClient } from '../infrastructure/convex/client.js';
|
|
7
|
-
/**
|
|
8
|
-
* List messages filtered by sender role
|
|
9
|
-
* Uses the composite index for efficient filtering
|
|
10
|
-
*/
|
|
11
|
-
export async function listBySenderRole(chatroomId, options) {
|
|
12
|
-
const client = await getConvexClient();
|
|
13
|
-
// Get session ID for authentication
|
|
14
|
-
const sessionId = getSessionId();
|
|
15
|
-
if (!sessionId) {
|
|
16
|
-
console.error(`ā Not authenticated. Please run: chatroom auth login`);
|
|
17
|
-
process.exit(1);
|
|
18
|
-
}
|
|
19
|
-
// Validate chatroom ID format
|
|
20
|
-
if (!chatroomId ||
|
|
21
|
-
typeof chatroomId !== 'string' ||
|
|
22
|
-
chatroomId.length < 20 ||
|
|
23
|
-
chatroomId.length > 40) {
|
|
24
|
-
console.error(`ā Invalid chatroom ID format: ID must be 20-40 characters (got ${chatroomId?.length || 0})`);
|
|
25
|
-
process.exit(1);
|
|
26
|
-
}
|
|
27
|
-
try {
|
|
28
|
-
const messages = (await client.query(api.messages.listBySenderRole, {
|
|
29
|
-
sessionId,
|
|
30
|
-
chatroomId: chatroomId,
|
|
31
|
-
senderRole: options.senderRole,
|
|
32
|
-
limit: options.limit || 10,
|
|
33
|
-
}));
|
|
34
|
-
if (messages.length === 0) {
|
|
35
|
-
console.log(`\nš No messages found for sender role: ${options.senderRole}`);
|
|
36
|
-
return;
|
|
37
|
-
}
|
|
38
|
-
console.log(`\nšØ Messages from ${options.senderRole} (${messages.length} found):`);
|
|
39
|
-
console.log('ā'.repeat(60));
|
|
40
|
-
for (const message of messages) {
|
|
41
|
-
const timestamp = new Date(message._creationTime).toLocaleString();
|
|
42
|
-
const classificationBadge = message.classification
|
|
43
|
-
? ` [${message.classification.toUpperCase()}]`
|
|
44
|
-
: '';
|
|
45
|
-
const statusBadge = message.taskStatus ? ` (${message.taskStatus})` : '';
|
|
46
|
-
console.log(`\nš¹ ID: ${message._id}`);
|
|
47
|
-
console.log(` Time: ${timestamp}`);
|
|
48
|
-
console.log(` Type: ${message.type}${classificationBadge}${statusBadge}`);
|
|
49
|
-
if (message.targetRole) {
|
|
50
|
-
console.log(` Target: ${message.targetRole}`);
|
|
51
|
-
}
|
|
52
|
-
if (message.featureTitle) {
|
|
53
|
-
console.log(` Title: ${message.featureTitle}`);
|
|
54
|
-
}
|
|
55
|
-
// Show content (truncated unless --full)
|
|
56
|
-
const content = message.content;
|
|
57
|
-
if (options.full) {
|
|
58
|
-
console.log(` Content:\n${content
|
|
59
|
-
.split('\n')
|
|
60
|
-
.map((l) => ` ${l}`)
|
|
61
|
-
.join('\n')}`);
|
|
62
|
-
}
|
|
63
|
-
else {
|
|
64
|
-
const firstLine = content.split('\n')[0];
|
|
65
|
-
const truncated = firstLine.length > 100 ? firstLine.substring(0, 100) + '...' : firstLine;
|
|
66
|
-
console.log(` Content: ${truncated}`);
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
console.log('\n' + 'ā'.repeat(60));
|
|
70
|
-
console.log(`š” Use --full to see complete message content`);
|
|
71
|
-
console.log(`š” Use --since-message-id=<id> to get all messages since a specific message`);
|
|
72
|
-
}
|
|
73
|
-
catch (error) {
|
|
74
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
75
|
-
console.error(`\nā Error fetching messages: ${errorMessage}`);
|
|
76
|
-
process.exit(1);
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* List all messages since a given message ID (inclusive)
|
|
81
|
-
* Returns messages in ascending order (oldest first)
|
|
82
|
-
*/
|
|
83
|
-
export async function listSinceMessage(chatroomId, options) {
|
|
84
|
-
const client = await getConvexClient();
|
|
85
|
-
// Get session ID for authentication
|
|
86
|
-
const sessionId = getSessionId();
|
|
87
|
-
if (!sessionId) {
|
|
88
|
-
console.error(`ā Not authenticated. Please run: chatroom auth login`);
|
|
89
|
-
process.exit(1);
|
|
90
|
-
}
|
|
91
|
-
// Validate chatroom ID format
|
|
92
|
-
if (!chatroomId ||
|
|
93
|
-
typeof chatroomId !== 'string' ||
|
|
94
|
-
chatroomId.length < 20 ||
|
|
95
|
-
chatroomId.length > 40) {
|
|
96
|
-
console.error(`ā Invalid chatroom ID format: ID must be 20-40 characters (got ${chatroomId?.length || 0})`);
|
|
97
|
-
process.exit(1);
|
|
98
|
-
}
|
|
99
|
-
try {
|
|
100
|
-
const messages = (await client.query(api.messages.listSinceMessage, {
|
|
101
|
-
sessionId,
|
|
102
|
-
chatroomId: chatroomId,
|
|
103
|
-
sinceMessageId: options.sinceMessageId,
|
|
104
|
-
limit: options.limit || 100,
|
|
105
|
-
}));
|
|
106
|
-
if (messages.length === 0) {
|
|
107
|
-
console.log(`\nš No messages found since message: ${options.sinceMessageId}`);
|
|
108
|
-
return;
|
|
109
|
-
}
|
|
110
|
-
console.log(`\nšØ Messages since ${options.sinceMessageId} (${messages.length} found):`);
|
|
111
|
-
console.log('ā'.repeat(60));
|
|
112
|
-
for (const message of messages) {
|
|
113
|
-
const timestamp = new Date(message._creationTime).toLocaleString();
|
|
114
|
-
const roleIndicator = message.senderRole.toLowerCase() === 'user' ? 'š¤' : 'š¤';
|
|
115
|
-
const classificationBadge = message.classification
|
|
116
|
-
? ` [${message.classification.toUpperCase()}]`
|
|
117
|
-
: '';
|
|
118
|
-
const statusBadge = message.taskStatus ? ` (${message.taskStatus})` : '';
|
|
119
|
-
console.log(`\n${roleIndicator} ${message.senderRole}${message.targetRole ? ` ā ${message.targetRole}` : ''}`);
|
|
120
|
-
console.log(` ID: ${message._id}`);
|
|
121
|
-
console.log(` Time: ${timestamp}`);
|
|
122
|
-
console.log(` Type: ${message.type}${classificationBadge}${statusBadge}`);
|
|
123
|
-
if (message.featureTitle) {
|
|
124
|
-
console.log(` Title: ${message.featureTitle}`);
|
|
125
|
-
}
|
|
126
|
-
// Show content (truncated unless --full)
|
|
127
|
-
const content = message.content;
|
|
128
|
-
if (options.full) {
|
|
129
|
-
console.log(` Content:\n${content
|
|
130
|
-
.split('\n')
|
|
131
|
-
.map((l) => ` ${l}`)
|
|
132
|
-
.join('\n')}`);
|
|
133
|
-
}
|
|
134
|
-
else {
|
|
135
|
-
const firstLine = content.split('\n')[0];
|
|
136
|
-
const truncated = firstLine.length > 100 ? firstLine.substring(0, 100) + '...' : firstLine;
|
|
137
|
-
console.log(` Content: ${truncated}`);
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
console.log('\n' + 'ā'.repeat(60));
|
|
141
|
-
console.log(`š” Use --full to see complete message content`);
|
|
142
|
-
}
|
|
143
|
-
catch (error) {
|
|
144
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
145
|
-
console.error(`\nā Error fetching messages: ${errorMessage}`);
|
|
146
|
-
process.exit(1);
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
//# sourceMappingURL=messages.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/commands/messages.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* OpenCode Tool Installation
|
|
3
|
-
*
|
|
4
|
-
* This module installs the chatroom CLI as an OpenCode tool, providing structured
|
|
5
|
-
* command interfaces that avoid timeout issues with long-running bash commands.
|
|
6
|
-
*
|
|
7
|
-
* The tool is installed to ~/.config/opencode/tool/chatroom.ts
|
|
8
|
-
*
|
|
9
|
-
* IMPORTANT: All tools in this file should include the following optional parameters
|
|
10
|
-
* to support local development:
|
|
11
|
-
* - webUrl: Override the web URL (CHATROOM_WEB_URL)
|
|
12
|
-
* - convexUrl: Override the Convex backend URL (CHATROOM_CONVEX_URL)
|
|
13
|
-
*
|
|
14
|
-
* These parameters allow agents to connect to local development servers instead of
|
|
15
|
-
* production when testing or developing.
|
|
16
|
-
*/
|
|
17
|
-
export interface ToolInstallOptions {
|
|
18
|
-
checkExisting?: boolean;
|
|
19
|
-
}
|
|
20
|
-
export interface ToolInstallResult {
|
|
21
|
-
success: boolean;
|
|
22
|
-
toolPath?: string;
|
|
23
|
-
message: string;
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Install chatroom as an OpenCode tool
|
|
27
|
-
*/
|
|
28
|
-
export declare function installTool(options?: ToolInstallOptions): Promise<ToolInstallResult>;
|
|
29
|
-
//# sourceMappingURL=opencode-install.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"opencode-install.d.ts","sourceRoot":"","sources":["../../src/commands/opencode-install.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,WAAW,kBAAkB;IACjC,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAeD;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAuY9F"}
|