@fluxra-ai/fluxra-cli 0.1.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/LICENSE +201 -0
- package/README.md +274 -0
- package/bin/fluxra +6 -0
- package/dist/cli/command-context.d.ts +17 -0
- package/dist/cli/command-context.d.ts.map +1 -0
- package/dist/cli/command-context.js +26 -0
- package/dist/cli/command-context.js.map +1 -0
- package/dist/cli/commands/auth/index.d.ts +3 -0
- package/dist/cli/commands/auth/index.d.ts.map +1 -0
- package/dist/cli/commands/auth/index.js +165 -0
- package/dist/cli/commands/auth/index.js.map +1 -0
- package/dist/cli/commands/chat/index.d.ts +3 -0
- package/dist/cli/commands/chat/index.d.ts.map +1 -0
- package/dist/cli/commands/chat/index.js +1201 -0
- package/dist/cli/commands/chat/index.js.map +1 -0
- package/dist/cli/commands/config/index.d.ts +3 -0
- package/dist/cli/commands/config/index.d.ts.map +1 -0
- package/dist/cli/commands/config/index.js +66 -0
- package/dist/cli/commands/config/index.js.map +1 -0
- package/dist/cli/commands/help.d.ts +7 -0
- package/dist/cli/commands/help.d.ts.map +1 -0
- package/dist/cli/commands/help.js +106 -0
- package/dist/cli/commands/help.js.map +1 -0
- package/dist/cli/commands/local/doctor.d.ts +26 -0
- package/dist/cli/commands/local/doctor.d.ts.map +1 -0
- package/dist/cli/commands/local/doctor.js +265 -0
- package/dist/cli/commands/local/doctor.js.map +1 -0
- package/dist/cli/commands/local/export.d.ts +41 -0
- package/dist/cli/commands/local/export.d.ts.map +1 -0
- package/dist/cli/commands/local/export.js +83 -0
- package/dist/cli/commands/local/export.js.map +1 -0
- package/dist/cli/commands/local/index.d.ts +6 -0
- package/dist/cli/commands/local/index.d.ts.map +1 -0
- package/dist/cli/commands/local/index.js +116 -0
- package/dist/cli/commands/local/index.js.map +1 -0
- package/dist/cli/commands/local/inspect.d.ts +42 -0
- package/dist/cli/commands/local/inspect.d.ts.map +1 -0
- package/dist/cli/commands/local/inspect.js +125 -0
- package/dist/cli/commands/local/inspect.js.map +1 -0
- package/dist/cli/commands/mcp.d.ts +8 -0
- package/dist/cli/commands/mcp.d.ts.map +1 -0
- package/dist/cli/commands/mcp.js +253 -0
- package/dist/cli/commands/mcp.js.map +1 -0
- package/dist/cli/commands/profile/index.d.ts +3 -0
- package/dist/cli/commands/profile/index.d.ts.map +1 -0
- package/dist/cli/commands/profile/index.js +114 -0
- package/dist/cli/commands/profile/index.js.map +1 -0
- package/dist/cli/commands/schema.d.ts +7 -0
- package/dist/cli/commands/schema.d.ts.map +1 -0
- package/dist/cli/commands/schema.js +33 -0
- package/dist/cli/commands/schema.js.map +1 -0
- package/dist/cli/errors.d.ts +16 -0
- package/dist/cli/errors.d.ts.map +1 -0
- package/dist/cli/errors.js +15 -0
- package/dist/cli/errors.js.map +1 -0
- package/dist/cli/fluxra.d.ts +9 -0
- package/dist/cli/fluxra.d.ts.map +1 -0
- package/dist/cli/fluxra.js +55 -0
- package/dist/cli/fluxra.js.map +1 -0
- package/dist/cli/helpers.d.ts +13 -0
- package/dist/cli/helpers.d.ts.map +1 -0
- package/dist/cli/helpers.js +32 -0
- package/dist/cli/helpers.js.map +1 -0
- package/dist/cli/output.d.ts +14 -0
- package/dist/cli/output.d.ts.map +1 -0
- package/dist/cli/output.js +55 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/cli/version.d.ts +6 -0
- package/dist/cli/version.d.ts.map +1 -0
- package/dist/cli/version.js +8 -0
- package/dist/cli/version.js.map +1 -0
- package/dist/core/auth/auth-service.d.ts +35 -0
- package/dist/core/auth/auth-service.d.ts.map +1 -0
- package/dist/core/auth/auth-service.js +116 -0
- package/dist/core/auth/auth-service.js.map +1 -0
- package/dist/core/config/global-config.d.ts +38 -0
- package/dist/core/config/global-config.d.ts.map +1 -0
- package/dist/core/config/global-config.js +75 -0
- package/dist/core/config/global-config.js.map +1 -0
- package/dist/core/errors/error-model.d.ts +48 -0
- package/dist/core/errors/error-model.d.ts.map +1 -0
- package/dist/core/errors/error-model.js +152 -0
- package/dist/core/errors/error-model.js.map +1 -0
- package/dist/core/filesystem/paths.d.ts +45 -0
- package/dist/core/filesystem/paths.d.ts.map +1 -0
- package/dist/core/filesystem/paths.js +77 -0
- package/dist/core/filesystem/paths.js.map +1 -0
- package/dist/core/http/auth-api.d.ts +71 -0
- package/dist/core/http/auth-api.d.ts.map +1 -0
- package/dist/core/http/auth-api.js +91 -0
- package/dist/core/http/auth-api.js.map +1 -0
- package/dist/core/http/block-api.d.ts +37 -0
- package/dist/core/http/block-api.d.ts.map +1 -0
- package/dist/core/http/block-api.js +36 -0
- package/dist/core/http/block-api.js.map +1 -0
- package/dist/core/http/chat-api.d.ts +41 -0
- package/dist/core/http/chat-api.d.ts.map +1 -0
- package/dist/core/http/chat-api.js +88 -0
- package/dist/core/http/chat-api.js.map +1 -0
- package/dist/core/http/conversation-management-api.d.ts +65 -0
- package/dist/core/http/conversation-management-api.d.ts.map +1 -0
- package/dist/core/http/conversation-management-api.js +59 -0
- package/dist/core/http/conversation-management-api.js.map +1 -0
- package/dist/core/http/directory-api.d.ts +32 -0
- package/dist/core/http/directory-api.d.ts.map +1 -0
- package/dist/core/http/directory-api.js +36 -0
- package/dist/core/http/directory-api.js.map +1 -0
- package/dist/core/http/directory-profile-api.d.ts +32 -0
- package/dist/core/http/directory-profile-api.d.ts.map +1 -0
- package/dist/core/http/directory-profile-api.js +39 -0
- package/dist/core/http/directory-profile-api.js.map +1 -0
- package/dist/core/http/http-client.d.ts +41 -0
- package/dist/core/http/http-client.d.ts.map +1 -0
- package/dist/core/http/http-client.js +127 -0
- package/dist/core/http/http-client.js.map +1 -0
- package/dist/core/http/message-api.d.ts +55 -0
- package/dist/core/http/message-api.d.ts.map +1 -0
- package/dist/core/http/message-api.js +64 -0
- package/dist/core/http/message-api.js.map +1 -0
- package/dist/core/http/rate-limit.d.ts +22 -0
- package/dist/core/http/rate-limit.d.ts.map +1 -0
- package/dist/core/http/rate-limit.js +66 -0
- package/dist/core/http/rate-limit.js.map +1 -0
- package/dist/core/http/token-lifecycle.d.ts +18 -0
- package/dist/core/http/token-lifecycle.d.ts.map +1 -0
- package/dist/core/http/token-lifecycle.js +73 -0
- package/dist/core/http/token-lifecycle.js.map +1 -0
- package/dist/core/locking/profile-lock.d.ts +32 -0
- package/dist/core/locking/profile-lock.d.ts.map +1 -0
- package/dist/core/locking/profile-lock.js +104 -0
- package/dist/core/locking/profile-lock.js.map +1 -0
- package/dist/core/profiles/profile-service.d.ts +35 -0
- package/dist/core/profiles/profile-service.d.ts.map +1 -0
- package/dist/core/profiles/profile-service.js +119 -0
- package/dist/core/profiles/profile-service.js.map +1 -0
- package/dist/core/profiles/profile-types.d.ts +28 -0
- package/dist/core/profiles/profile-types.d.ts.map +1 -0
- package/dist/core/profiles/profile-types.js +13 -0
- package/dist/core/profiles/profile-types.js.map +1 -0
- package/dist/core/secrets/secrets-service.d.ts +25 -0
- package/dist/core/secrets/secrets-service.d.ts.map +1 -0
- package/dist/core/secrets/secrets-service.js +67 -0
- package/dist/core/secrets/secrets-service.js.map +1 -0
- package/dist/core/secrets/secrets-types.d.ts +29 -0
- package/dist/core/secrets/secrets-types.d.ts.map +1 -0
- package/dist/core/secrets/secrets-types.js +33 -0
- package/dist/core/secrets/secrets-types.js.map +1 -0
- package/dist/core/sqlite/chat-schema.d.ts +14 -0
- package/dist/core/sqlite/chat-schema.d.ts.map +1 -0
- package/dist/core/sqlite/chat-schema.js +172 -0
- package/dist/core/sqlite/chat-schema.js.map +1 -0
- package/dist/core/sqlite/core-schema.d.ts +14 -0
- package/dist/core/sqlite/core-schema.d.ts.map +1 -0
- package/dist/core/sqlite/core-schema.js +54 -0
- package/dist/core/sqlite/core-schema.js.map +1 -0
- package/dist/core/sqlite/database.d.ts +40 -0
- package/dist/core/sqlite/database.d.ts.map +1 -0
- package/dist/core/sqlite/database.js +68 -0
- package/dist/core/sqlite/database.js.map +1 -0
- package/dist/core/sqlite/migrations.d.ts +22 -0
- package/dist/core/sqlite/migrations.d.ts.map +1 -0
- package/dist/core/sqlite/migrations.js +64 -0
- package/dist/core/sqlite/migrations.js.map +1 -0
- package/dist/modules/chat/inbox/conversation-service.d.ts +35 -0
- package/dist/modules/chat/inbox/conversation-service.d.ts.map +1 -0
- package/dist/modules/chat/inbox/conversation-service.js +54 -0
- package/dist/modules/chat/inbox/conversation-service.js.map +1 -0
- package/dist/modules/chat/inbox/history-service.d.ts +25 -0
- package/dist/modules/chat/inbox/history-service.d.ts.map +1 -0
- package/dist/modules/chat/inbox/history-service.js +57 -0
- package/dist/modules/chat/inbox/history-service.js.map +1 -0
- package/dist/modules/chat/inbox/index.d.ts +9 -0
- package/dist/modules/chat/inbox/index.d.ts.map +1 -0
- package/dist/modules/chat/inbox/index.js +9 -0
- package/dist/modules/chat/inbox/index.js.map +1 -0
- package/dist/modules/chat/inbox/read-service.d.ts +36 -0
- package/dist/modules/chat/inbox/read-service.d.ts.map +1 -0
- package/dist/modules/chat/inbox/read-service.js +91 -0
- package/dist/modules/chat/inbox/read-service.js.map +1 -0
- package/dist/modules/chat/inbox/search-service.d.ts +20 -0
- package/dist/modules/chat/inbox/search-service.d.ts.map +1 -0
- package/dist/modules/chat/inbox/search-service.js +23 -0
- package/dist/modules/chat/inbox/search-service.js.map +1 -0
- package/dist/modules/chat/inbox/unread-service.d.ts +38 -0
- package/dist/modules/chat/inbox/unread-service.d.ts.map +1 -0
- package/dist/modules/chat/inbox/unread-service.js +65 -0
- package/dist/modules/chat/inbox/unread-service.js.map +1 -0
- package/dist/modules/chat/render/message-render.d.ts +35 -0
- package/dist/modules/chat/render/message-render.d.ts.map +1 -0
- package/dist/modules/chat/render/message-render.js +129 -0
- package/dist/modules/chat/render/message-render.js.map +1 -0
- package/dist/modules/chat/send/conversation-service.d.ts +53 -0
- package/dist/modules/chat/send/conversation-service.d.ts.map +1 -0
- package/dist/modules/chat/send/conversation-service.js +110 -0
- package/dist/modules/chat/send/conversation-service.js.map +1 -0
- package/dist/modules/chat/send/directory-cache-service.d.ts +37 -0
- package/dist/modules/chat/send/directory-cache-service.d.ts.map +1 -0
- package/dist/modules/chat/send/directory-cache-service.js +49 -0
- package/dist/modules/chat/send/directory-cache-service.js.map +1 -0
- package/dist/modules/chat/send/send-service.d.ts +36 -0
- package/dist/modules/chat/send/send-service.d.ts.map +1 -0
- package/dist/modules/chat/send/send-service.js +113 -0
- package/dist/modules/chat/send/send-service.js.map +1 -0
- package/dist/modules/chat/store/conversation-repo.d.ts +53 -0
- package/dist/modules/chat/store/conversation-repo.d.ts.map +1 -0
- package/dist/modules/chat/store/conversation-repo.js +75 -0
- package/dist/modules/chat/store/conversation-repo.js.map +1 -0
- package/dist/modules/chat/store/directory-cache-repo.d.ts +41 -0
- package/dist/modules/chat/store/directory-cache-repo.d.ts.map +1 -0
- package/dist/modules/chat/store/directory-cache-repo.js +64 -0
- package/dist/modules/chat/store/directory-cache-repo.js.map +1 -0
- package/dist/modules/chat/store/job-repo.d.ts +72 -0
- package/dist/modules/chat/store/job-repo.d.ts.map +1 -0
- package/dist/modules/chat/store/job-repo.js +140 -0
- package/dist/modules/chat/store/job-repo.js.map +1 -0
- package/dist/modules/chat/store/message-repo.d.ts +98 -0
- package/dist/modules/chat/store/message-repo.d.ts.map +1 -0
- package/dist/modules/chat/store/message-repo.js +231 -0
- package/dist/modules/chat/store/message-repo.js.map +1 -0
- package/dist/modules/chat/store/outbox-repo.d.ts +73 -0
- package/dist/modules/chat/store/outbox-repo.d.ts.map +1 -0
- package/dist/modules/chat/store/outbox-repo.js +112 -0
- package/dist/modules/chat/store/outbox-repo.js.map +1 -0
- package/dist/modules/chat/store/read-state-repo.d.ts +83 -0
- package/dist/modules/chat/store/read-state-repo.d.ts.map +1 -0
- package/dist/modules/chat/store/read-state-repo.js +210 -0
- package/dist/modules/chat/store/read-state-repo.js.map +1 -0
- package/dist/modules/chat/store/sync-state-repo.d.ts +45 -0
- package/dist/modules/chat/store/sync-state-repo.d.ts.map +1 -0
- package/dist/modules/chat/store/sync-state-repo.js +67 -0
- package/dist/modules/chat/store/sync-state-repo.js.map +1 -0
- package/dist/modules/chat/sync/backfill.d.ts +13 -0
- package/dist/modules/chat/sync/backfill.d.ts.map +1 -0
- package/dist/modules/chat/sync/backfill.js +37 -0
- package/dist/modules/chat/sync/backfill.js.map +1 -0
- package/dist/modules/chat/sync/cron-manager.d.ts +50 -0
- package/dist/modules/chat/sync/cron-manager.d.ts.map +1 -0
- package/dist/modules/chat/sync/cron-manager.js +164 -0
- package/dist/modules/chat/sync/cron-manager.js.map +1 -0
- package/dist/modules/chat/sync/index.d.ts +8 -0
- package/dist/modules/chat/sync/index.d.ts.map +1 -0
- package/dist/modules/chat/sync/index.js +7 -0
- package/dist/modules/chat/sync/index.js.map +1 -0
- package/dist/modules/chat/sync/job-logger.d.ts +44 -0
- package/dist/modules/chat/sync/job-logger.d.ts.map +1 -0
- package/dist/modules/chat/sync/job-logger.js +139 -0
- package/dist/modules/chat/sync/job-logger.js.map +1 -0
- package/dist/modules/chat/sync/sync-service.d.ts +14 -0
- package/dist/modules/chat/sync/sync-service.d.ts.map +1 -0
- package/dist/modules/chat/sync/sync-service.js +174 -0
- package/dist/modules/chat/sync/sync-service.js.map +1 -0
- package/dist/modules/chat/sync/sync-status.d.ts +14 -0
- package/dist/modules/chat/sync/sync-status.d.ts.map +1 -0
- package/dist/modules/chat/sync/sync-status.js +77 -0
- package/dist/modules/chat/sync/sync-status.js.map +1 -0
- package/dist/modules/chat/sync/sync-types.d.ts +80 -0
- package/dist/modules/chat/sync/sync-types.d.ts.map +1 -0
- package/dist/modules/chat/sync/sync-types.js +5 -0
- package/dist/modules/chat/sync/sync-types.js.map +1 -0
- package/dist/modules/chat/sync/watch-mode.d.ts +45 -0
- package/dist/modules/chat/sync/watch-mode.d.ts.map +1 -0
- package/dist/modules/chat/sync/watch-mode.js +161 -0
- package/dist/modules/chat/sync/watch-mode.js.map +1 -0
- package/package.json +67 -0
- package/tool-schema.json +1039 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Job repository - manage scheduler_jobs table for background sync
|
|
3
|
+
*/
|
|
4
|
+
import Database from 'better-sqlite3';
|
|
5
|
+
export interface SchedulerJob {
|
|
6
|
+
id: string;
|
|
7
|
+
job_type: string;
|
|
8
|
+
payload: string | null;
|
|
9
|
+
status: 'pending' | 'running' | 'completed' | 'failed';
|
|
10
|
+
scheduled_at: string;
|
|
11
|
+
executed_at: string | null;
|
|
12
|
+
last_error: string | null;
|
|
13
|
+
retry_count: number;
|
|
14
|
+
created_at: string;
|
|
15
|
+
}
|
|
16
|
+
export interface JobStats {
|
|
17
|
+
total: number;
|
|
18
|
+
pending: number;
|
|
19
|
+
running: number;
|
|
20
|
+
completed: number;
|
|
21
|
+
failed: number;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Upsert a job (insert or update)
|
|
25
|
+
*/
|
|
26
|
+
export declare function upsertJob(db: Database.Database, job: {
|
|
27
|
+
id: string;
|
|
28
|
+
jobType: string;
|
|
29
|
+
payload?: Record<string, any>;
|
|
30
|
+
scheduledAt?: string;
|
|
31
|
+
}): void;
|
|
32
|
+
/**
|
|
33
|
+
* Get a job by ID
|
|
34
|
+
*/
|
|
35
|
+
export declare function getJob(db: Database.Database, jobId: string): SchedulerJob | undefined;
|
|
36
|
+
/**
|
|
37
|
+
* Get jobs by type
|
|
38
|
+
*/
|
|
39
|
+
export declare function getJobsByType(db: Database.Database, jobType: string, status?: string): SchedulerJob[];
|
|
40
|
+
/**
|
|
41
|
+
* List all jobs, optionally filter by status
|
|
42
|
+
*/
|
|
43
|
+
export declare function listJobs(db: Database.Database, status?: string): SchedulerJob[];
|
|
44
|
+
/**
|
|
45
|
+
* Update job status
|
|
46
|
+
*/
|
|
47
|
+
export declare function updateJobStatus(db: Database.Database, jobId: string, status: 'pending' | 'running' | 'completed' | 'failed', error?: string): void;
|
|
48
|
+
/**
|
|
49
|
+
* Record job success
|
|
50
|
+
*/
|
|
51
|
+
export declare function recordJobSuccess(db: Database.Database, jobId: string): void;
|
|
52
|
+
/**
|
|
53
|
+
* Record job failure
|
|
54
|
+
*/
|
|
55
|
+
export declare function recordJobFailure(db: Database.Database, jobId: string, error: string): void;
|
|
56
|
+
/**
|
|
57
|
+
* Delete a job
|
|
58
|
+
*/
|
|
59
|
+
export declare function deleteJob(db: Database.Database, jobId: string): void;
|
|
60
|
+
/**
|
|
61
|
+
* Get job statistics
|
|
62
|
+
*/
|
|
63
|
+
export declare function getJobStats(db: Database.Database): JobStats;
|
|
64
|
+
/**
|
|
65
|
+
* Get latest job by type
|
|
66
|
+
*/
|
|
67
|
+
export declare function getLatestJobByType(db: Database.Database, jobType: string): SchedulerJob | undefined;
|
|
68
|
+
/**
|
|
69
|
+
* Clean up old completed jobs (older than specified days)
|
|
70
|
+
*/
|
|
71
|
+
export declare function cleanupOldJobs(db: Database.Database, olderThanDays?: number): number;
|
|
72
|
+
//# sourceMappingURL=job-repo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"job-repo.d.ts","sourceRoot":"","sources":["../../../../src/modules/chat/store/job-repo.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;IACvD,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,SAAS,CACvB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,GAAG,EAAE;IACH,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GACA,IAAI,CAeN;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAIrF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,MAAM,GACd,YAAY,EAAE,CAShB;AAED;;GAEG;AACH,wBAAgB,QAAQ,CACtB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,MAAM,CAAC,EAAE,MAAM,GACd,YAAY,EAAE,CAShB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,EACtD,KAAK,CAAC,EAAE,MAAM,GACb,IAAI,CAiBN;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,MAAM,GACZ,IAAI,CAKN;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACZ,IAAI,CAKN;AAED;;GAEG;AACH,wBAAgB,SAAS,CACvB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,MAAM,GACZ,IAAI,CAIN;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAkB3D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,OAAO,EAAE,MAAM,GACd,YAAY,GAAG,SAAS,CAI1B;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,aAAa,GAAE,MAAU,GACxB,MAAM,CAOR"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Job repository - manage scheduler_jobs table for background sync
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Upsert a job (insert or update)
|
|
6
|
+
*/
|
|
7
|
+
export function upsertJob(db, job) {
|
|
8
|
+
db.prepare(`
|
|
9
|
+
INSERT INTO scheduler_jobs (id, job_type, payload, status, scheduled_at)
|
|
10
|
+
VALUES (?, ?, ?, 'pending', ?)
|
|
11
|
+
ON CONFLICT(id) DO UPDATE SET
|
|
12
|
+
job_type = excluded.job_type,
|
|
13
|
+
payload = excluded.payload,
|
|
14
|
+
scheduled_at = excluded.scheduled_at,
|
|
15
|
+
status = CASE WHEN status = 'failed' THEN 'pending' ELSE status END
|
|
16
|
+
`).run(job.id, job.jobType, job.payload ? JSON.stringify(job.payload) : null, job.scheduledAt || new Date().toISOString());
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Get a job by ID
|
|
20
|
+
*/
|
|
21
|
+
export function getJob(db, jobId) {
|
|
22
|
+
return db.prepare(`
|
|
23
|
+
SELECT * FROM scheduler_jobs WHERE id = ?
|
|
24
|
+
`).get(jobId);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Get jobs by type
|
|
28
|
+
*/
|
|
29
|
+
export function getJobsByType(db, jobType, status) {
|
|
30
|
+
if (status) {
|
|
31
|
+
return db.prepare(`
|
|
32
|
+
SELECT * FROM scheduler_jobs WHERE job_type = ? AND status = ? ORDER BY created_at DESC
|
|
33
|
+
`).all(jobType, status);
|
|
34
|
+
}
|
|
35
|
+
return db.prepare(`
|
|
36
|
+
SELECT * FROM scheduler_jobs WHERE job_type = ? ORDER BY created_at DESC
|
|
37
|
+
`).all(jobType);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* List all jobs, optionally filter by status
|
|
41
|
+
*/
|
|
42
|
+
export function listJobs(db, status) {
|
|
43
|
+
if (status) {
|
|
44
|
+
return db.prepare(`
|
|
45
|
+
SELECT * FROM scheduler_jobs WHERE status = ? ORDER BY created_at DESC
|
|
46
|
+
`).all(status);
|
|
47
|
+
}
|
|
48
|
+
return db.prepare(`
|
|
49
|
+
SELECT * FROM scheduler_jobs ORDER BY created_at DESC
|
|
50
|
+
`).all();
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Update job status
|
|
54
|
+
*/
|
|
55
|
+
export function updateJobStatus(db, jobId, status, error) {
|
|
56
|
+
if (status === 'running') {
|
|
57
|
+
db.prepare(`
|
|
58
|
+
UPDATE scheduler_jobs SET status = ?, executed_at = datetime('now'), last_error = NULL
|
|
59
|
+
WHERE id = ?
|
|
60
|
+
`).run(status, jobId);
|
|
61
|
+
}
|
|
62
|
+
else if (status === 'failed' && error) {
|
|
63
|
+
db.prepare(`
|
|
64
|
+
UPDATE scheduler_jobs SET status = ?, last_error = ?, retry_count = retry_count + 1
|
|
65
|
+
WHERE id = ?
|
|
66
|
+
`).run(status, error, jobId);
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
db.prepare(`
|
|
70
|
+
UPDATE scheduler_jobs SET status = ?
|
|
71
|
+
WHERE id = ?
|
|
72
|
+
`).run(status, jobId);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Record job success
|
|
77
|
+
*/
|
|
78
|
+
export function recordJobSuccess(db, jobId) {
|
|
79
|
+
db.prepare(`
|
|
80
|
+
UPDATE scheduler_jobs SET status = 'completed', last_error = NULL
|
|
81
|
+
WHERE id = ?
|
|
82
|
+
`).run(jobId);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Record job failure
|
|
86
|
+
*/
|
|
87
|
+
export function recordJobFailure(db, jobId, error) {
|
|
88
|
+
db.prepare(`
|
|
89
|
+
UPDATE scheduler_jobs SET status = 'failed', last_error = ?, retry_count = retry_count + 1
|
|
90
|
+
WHERE id = ?
|
|
91
|
+
`).run(error, jobId);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Delete a job
|
|
95
|
+
*/
|
|
96
|
+
export function deleteJob(db, jobId) {
|
|
97
|
+
db.prepare(`
|
|
98
|
+
DELETE FROM scheduler_jobs WHERE id = ?
|
|
99
|
+
`).run(jobId);
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Get job statistics
|
|
103
|
+
*/
|
|
104
|
+
export function getJobStats(db) {
|
|
105
|
+
const row = db.prepare(`
|
|
106
|
+
SELECT
|
|
107
|
+
COUNT(*) as total,
|
|
108
|
+
SUM(CASE WHEN status = 'pending' THEN 1 ELSE 0 END) as pending,
|
|
109
|
+
SUM(CASE WHEN status = 'running' THEN 1 ELSE 0 END) as running,
|
|
110
|
+
SUM(CASE WHEN status = 'completed' THEN 1 ELSE 0 END) as completed,
|
|
111
|
+
SUM(CASE WHEN status = 'failed' THEN 1 ELSE 0 END) as failed
|
|
112
|
+
FROM scheduler_jobs
|
|
113
|
+
`).get();
|
|
114
|
+
return {
|
|
115
|
+
total: row.total || 0,
|
|
116
|
+
pending: row.pending || 0,
|
|
117
|
+
running: row.running || 0,
|
|
118
|
+
completed: row.completed || 0,
|
|
119
|
+
failed: row.failed || 0,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Get latest job by type
|
|
124
|
+
*/
|
|
125
|
+
export function getLatestJobByType(db, jobType) {
|
|
126
|
+
return db.prepare(`
|
|
127
|
+
SELECT * FROM scheduler_jobs WHERE job_type = ? ORDER BY created_at DESC LIMIT 1
|
|
128
|
+
`).get(jobType);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Clean up old completed jobs (older than specified days)
|
|
132
|
+
*/
|
|
133
|
+
export function cleanupOldJobs(db, olderThanDays = 7) {
|
|
134
|
+
const result = db.prepare(`
|
|
135
|
+
DELETE FROM scheduler_jobs
|
|
136
|
+
WHERE status = 'completed' AND created_at < datetime('now', ?)
|
|
137
|
+
`).run(`-${olderThanDays} days`);
|
|
138
|
+
return result.changes;
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=job-repo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"job-repo.js","sourceRoot":"","sources":["../../../../src/modules/chat/store/job-repo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Message repository - data access for messages
|
|
3
|
+
*/
|
|
4
|
+
import Database from 'better-sqlite3';
|
|
5
|
+
export interface MessageRecord {
|
|
6
|
+
message_id: string;
|
|
7
|
+
conversation_id: string;
|
|
8
|
+
sender_id: string;
|
|
9
|
+
content: string | null;
|
|
10
|
+
type: 'text' | 'system' | 'command';
|
|
11
|
+
status: 'sent' | 'edited' | 'withdrawn' | 'deleted';
|
|
12
|
+
in_reply_to: string | null;
|
|
13
|
+
mentions: string | null;
|
|
14
|
+
edit_history: string | null;
|
|
15
|
+
remote_created_at: string;
|
|
16
|
+
remote_updated_at: string | null;
|
|
17
|
+
local_created_at: string;
|
|
18
|
+
local_updated_at: string;
|
|
19
|
+
}
|
|
20
|
+
export interface MessageLocalState {
|
|
21
|
+
message_id: string;
|
|
22
|
+
is_read: number;
|
|
23
|
+
read_at: string | null;
|
|
24
|
+
is_mentioned: number;
|
|
25
|
+
note: string | null;
|
|
26
|
+
updated_at: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Upsert a message (insert or update)
|
|
30
|
+
* Returns true if inserted, false if updated
|
|
31
|
+
*/
|
|
32
|
+
export declare function upsertMessage(db: Database.Database, message: Partial<MessageRecord> & {
|
|
33
|
+
message_id: string;
|
|
34
|
+
conversation_id: string;
|
|
35
|
+
sender_id: string;
|
|
36
|
+
}): {
|
|
37
|
+
inserted: boolean;
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Mark a message as read
|
|
41
|
+
*/
|
|
42
|
+
export declare function markMessageRead(db: Database.Database, messageId: string): void;
|
|
43
|
+
/**
|
|
44
|
+
* Update message status (e.g., edited, withdrawn)
|
|
45
|
+
*/
|
|
46
|
+
export declare function updateMessageStatus(db: Database.Database, messageId: string, status: 'edited' | 'withdrawn' | 'deleted', editHistory?: string): void;
|
|
47
|
+
/**
|
|
48
|
+
* Get messages for a conversation
|
|
49
|
+
*/
|
|
50
|
+
export declare function getConversationMessages(db: Database.Database, conversationId: string, options?: {
|
|
51
|
+
limit?: number;
|
|
52
|
+
before?: string;
|
|
53
|
+
}): Array<MessageRecord & MessageLocalState>;
|
|
54
|
+
/**
|
|
55
|
+
* Get unread messages count
|
|
56
|
+
*/
|
|
57
|
+
export declare function getUnreadCount(db: Database.Database, conversationId?: string): number;
|
|
58
|
+
/**
|
|
59
|
+
* Get unread messages with conversation context
|
|
60
|
+
*/
|
|
61
|
+
export declare function getUnreadMessages(db: Database.Database, options?: {
|
|
62
|
+
limit?: number;
|
|
63
|
+
conversationId?: string;
|
|
64
|
+
}): Array<MessageRecord & MessageLocalState & {
|
|
65
|
+
conversation_type: string;
|
|
66
|
+
conversation_name: string | null;
|
|
67
|
+
}>;
|
|
68
|
+
/**
|
|
69
|
+
* Search messages by query string
|
|
70
|
+
* Searches in content and sender_id
|
|
71
|
+
*/
|
|
72
|
+
export declare function searchMessages(db: Database.Database, query: string, options?: {
|
|
73
|
+
conversationId?: string;
|
|
74
|
+
unreadOnly?: boolean;
|
|
75
|
+
limit?: number;
|
|
76
|
+
dateFrom?: string;
|
|
77
|
+
dateTo?: string;
|
|
78
|
+
}): Array<MessageRecord & MessageLocalState & {
|
|
79
|
+
conversation_type: string;
|
|
80
|
+
conversation_name: string | null;
|
|
81
|
+
}>;
|
|
82
|
+
/**
|
|
83
|
+
* Get N messages before a specific message (history context)
|
|
84
|
+
*/
|
|
85
|
+
export declare function getHistoryBefore(db: Database.Database, conversationId: string, beforeTimestamp: string, limit?: number): Array<MessageRecord & MessageLocalState>;
|
|
86
|
+
/**
|
|
87
|
+
* Get paginated messages for a specific conversation
|
|
88
|
+
*/
|
|
89
|
+
export declare function getMessagesByConversation(db: Database.Database, conversationId: string, options?: {
|
|
90
|
+
limit?: number;
|
|
91
|
+
before?: string;
|
|
92
|
+
after?: string;
|
|
93
|
+
}): Array<MessageRecord & MessageLocalState>;
|
|
94
|
+
/**
|
|
95
|
+
* Update mention flag for a message
|
|
96
|
+
*/
|
|
97
|
+
export declare function updateMentionFlag(db: Database.Database, messageId: string, isMentioned: number): void;
|
|
98
|
+
//# sourceMappingURL=message-repo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-repo.d.ts","sourceRoot":"","sources":["../../../../src/modules/chat/store/message-repo.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;IACpC,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,WAAW,GAAG,SAAS,CAAC;IACpD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACnG;IAAE,QAAQ,EAAE,OAAO,CAAA;CAAE,CA8DvB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,SAAS,EAAE,MAAM,GAChB,IAAI,CAMN;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,QAAQ,GAAG,WAAW,GAAG,SAAS,EAC1C,WAAW,CAAC,EAAE,MAAM,GACnB,IAAI,CASN;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,cAAc,EAAE,MAAM,EACtB,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GAChD,KAAK,CAAC,aAAa,GAAG,iBAAiB,CAAC,CAqB1C;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,cAAc,CAAC,EAAE,MAAM,GACtB,MAAM,CAiBR;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAO,GACxD,KAAK,CAAC,aAAa,GAAG,iBAAiB,GAAG;IAAE,iBAAiB,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAyB5G;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE;IACP,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACZ,GACL,KAAK,CAAC,aAAa,GAAG,iBAAiB,GAAG;IAAE,iBAAiB,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAwC5G;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,cAAc,EAAE,MAAM,EACtB,eAAe,EAAE,MAAM,EACvB,KAAK,GAAE,MAAW,GACjB,KAAK,CAAC,aAAa,GAAG,iBAAiB,CAAC,CAS1C;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,cAAc,EAAE,MAAM,EACtB,OAAO,GAAE;IACP,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CACX,GACL,KAAK,CAAC,aAAa,GAAG,iBAAiB,CAAC,CA0B1C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB,IAAI,CAMN"}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Message repository - data access for messages
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Upsert a message (insert or update)
|
|
6
|
+
* Returns true if inserted, false if updated
|
|
7
|
+
*/
|
|
8
|
+
export function upsertMessage(db, message) {
|
|
9
|
+
const existing = db.prepare('SELECT message_id FROM messages WHERE message_id = ?').get(message.message_id);
|
|
10
|
+
if (existing) {
|
|
11
|
+
// Update existing message
|
|
12
|
+
db.prepare(`
|
|
13
|
+
UPDATE messages SET
|
|
14
|
+
content = @content,
|
|
15
|
+
type = @type,
|
|
16
|
+
status = @status,
|
|
17
|
+
in_reply_to = @in_reply_to,
|
|
18
|
+
mentions = @mentions,
|
|
19
|
+
edit_history = @edit_history,
|
|
20
|
+
remote_updated_at = @remote_updated_at,
|
|
21
|
+
local_updated_at = datetime('now')
|
|
22
|
+
WHERE message_id = @message_id
|
|
23
|
+
`).run({
|
|
24
|
+
message_id: message.message_id,
|
|
25
|
+
content: message.content ?? null,
|
|
26
|
+
type: message.type || 'text',
|
|
27
|
+
status: message.status || 'sent',
|
|
28
|
+
in_reply_to: message.in_reply_to ?? null,
|
|
29
|
+
mentions: message.mentions ?? null,
|
|
30
|
+
edit_history: message.edit_history ?? null,
|
|
31
|
+
remote_updated_at: message.remote_updated_at ?? null,
|
|
32
|
+
});
|
|
33
|
+
return { inserted: false };
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
// Insert new message
|
|
37
|
+
db.prepare(`
|
|
38
|
+
INSERT INTO messages (
|
|
39
|
+
message_id, conversation_id, sender_id, content, type, status,
|
|
40
|
+
in_reply_to, mentions, edit_history, remote_created_at, remote_updated_at
|
|
41
|
+
) VALUES (
|
|
42
|
+
@message_id, @conversation_id, @sender_id, @content, @type, @status,
|
|
43
|
+
@in_reply_to, @mentions, @edit_history, @remote_created_at, @remote_updated_at
|
|
44
|
+
)
|
|
45
|
+
`).run({
|
|
46
|
+
message_id: message.message_id,
|
|
47
|
+
conversation_id: message.conversation_id,
|
|
48
|
+
sender_id: message.sender_id,
|
|
49
|
+
content: message.content ?? null,
|
|
50
|
+
type: message.type || 'text',
|
|
51
|
+
status: message.status || 'sent',
|
|
52
|
+
in_reply_to: message.in_reply_to ?? null,
|
|
53
|
+
mentions: message.mentions ?? null,
|
|
54
|
+
edit_history: message.edit_history ?? null,
|
|
55
|
+
remote_created_at: message.remote_created_at || new Date().toISOString(),
|
|
56
|
+
remote_updated_at: message.remote_updated_at ?? null,
|
|
57
|
+
});
|
|
58
|
+
// Initialize local state
|
|
59
|
+
db.prepare(`
|
|
60
|
+
INSERT INTO message_local_state (message_id, is_read, is_mentioned)
|
|
61
|
+
VALUES (?, 0, 0)
|
|
62
|
+
`).run(message.message_id);
|
|
63
|
+
return { inserted: true };
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Mark a message as read
|
|
68
|
+
*/
|
|
69
|
+
export function markMessageRead(db, messageId) {
|
|
70
|
+
db.prepare(`
|
|
71
|
+
UPDATE message_local_state
|
|
72
|
+
SET is_read = 1, read_at = datetime('now'), updated_at = datetime('now')
|
|
73
|
+
WHERE message_id = ?
|
|
74
|
+
`).run(messageId);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Update message status (e.g., edited, withdrawn)
|
|
78
|
+
*/
|
|
79
|
+
export function updateMessageStatus(db, messageId, status, editHistory) {
|
|
80
|
+
db.prepare(`
|
|
81
|
+
UPDATE messages SET
|
|
82
|
+
status = ?,
|
|
83
|
+
edit_history = COALESCE(?, edit_history),
|
|
84
|
+
remote_updated_at = datetime('now'),
|
|
85
|
+
local_updated_at = datetime('now')
|
|
86
|
+
WHERE message_id = ?
|
|
87
|
+
`).run(status, editHistory ?? null, messageId);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Get messages for a conversation
|
|
91
|
+
*/
|
|
92
|
+
export function getConversationMessages(db, conversationId, options = {}) {
|
|
93
|
+
const limit = options.limit || 50;
|
|
94
|
+
let query = `
|
|
95
|
+
SELECT m.*, ml.is_read, ml.read_at, ml.is_mentioned, ml.note
|
|
96
|
+
FROM messages m
|
|
97
|
+
JOIN message_local_state ml ON m.message_id = ml.message_id
|
|
98
|
+
WHERE m.conversation_id = ?
|
|
99
|
+
`;
|
|
100
|
+
const params = [conversationId];
|
|
101
|
+
if (options.before) {
|
|
102
|
+
query += ` AND m.remote_created_at < ?`;
|
|
103
|
+
params.push(options.before);
|
|
104
|
+
}
|
|
105
|
+
query += ` ORDER BY m.remote_created_at DESC LIMIT ?`;
|
|
106
|
+
params.push(limit);
|
|
107
|
+
return db.prepare(query).all(...params);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Get unread messages count
|
|
111
|
+
*/
|
|
112
|
+
export function getUnreadCount(db, conversationId) {
|
|
113
|
+
let query = `
|
|
114
|
+
SELECT COUNT(*) as count
|
|
115
|
+
FROM message_local_state ml
|
|
116
|
+
JOIN messages m ON m.message_id = ml.message_id
|
|
117
|
+
WHERE ml.is_read = 0 AND m.sender_id != ?
|
|
118
|
+
`;
|
|
119
|
+
const params = ['me']; // TODO: Replace with actual agent ID
|
|
120
|
+
if (conversationId) {
|
|
121
|
+
query += ` AND m.conversation_id = ?`;
|
|
122
|
+
params.push(conversationId);
|
|
123
|
+
}
|
|
124
|
+
const row = db.prepare(query).get(...params);
|
|
125
|
+
return row.count;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Get unread messages with conversation context
|
|
129
|
+
*/
|
|
130
|
+
export function getUnreadMessages(db, options = {}) {
|
|
131
|
+
const limit = options.limit || 50;
|
|
132
|
+
let query = `
|
|
133
|
+
SELECT m.*, ml.is_read, ml.read_at, ml.is_mentioned, ml.note,
|
|
134
|
+
c.type as conversation_type, c.name as conversation_name
|
|
135
|
+
FROM messages m
|
|
136
|
+
JOIN message_local_state ml ON m.message_id = ml.message_id
|
|
137
|
+
JOIN conversations c ON c.conversation_id = m.conversation_id
|
|
138
|
+
WHERE ml.is_read = 0 AND m.sender_id != ?
|
|
139
|
+
`;
|
|
140
|
+
const params = ['me']; // TODO: Replace with actual agent ID
|
|
141
|
+
if (options.conversationId) {
|
|
142
|
+
query += ` AND m.conversation_id = ?`;
|
|
143
|
+
params.push(options.conversationId);
|
|
144
|
+
}
|
|
145
|
+
query += ` ORDER BY m.remote_created_at DESC LIMIT ?`;
|
|
146
|
+
params.push(limit);
|
|
147
|
+
return db.prepare(query).all(...params);
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Search messages by query string
|
|
151
|
+
* Searches in content and sender_id
|
|
152
|
+
*/
|
|
153
|
+
export function searchMessages(db, query, options = {}) {
|
|
154
|
+
const limit = options.limit || 50;
|
|
155
|
+
const searchPattern = `%${query}%`;
|
|
156
|
+
let sql = `
|
|
157
|
+
SELECT m.*, ml.is_read, ml.read_at, ml.is_mentioned, ml.note,
|
|
158
|
+
c.type as conversation_type, c.name as conversation_name
|
|
159
|
+
FROM messages m
|
|
160
|
+
JOIN message_local_state ml ON m.message_id = ml.message_id
|
|
161
|
+
JOIN conversations c ON c.conversation_id = m.conversation_id
|
|
162
|
+
WHERE (m.content LIKE ? OR m.sender_id LIKE ?)
|
|
163
|
+
`;
|
|
164
|
+
const params = [searchPattern, searchPattern];
|
|
165
|
+
if (options.conversationId) {
|
|
166
|
+
sql += ` AND m.conversation_id = ?`;
|
|
167
|
+
params.push(options.conversationId);
|
|
168
|
+
}
|
|
169
|
+
if (options.unreadOnly) {
|
|
170
|
+
sql += ` AND ml.is_read = 0`;
|
|
171
|
+
}
|
|
172
|
+
if (options.dateFrom) {
|
|
173
|
+
sql += ` AND m.remote_created_at >= ?`;
|
|
174
|
+
params.push(options.dateFrom);
|
|
175
|
+
}
|
|
176
|
+
if (options.dateTo) {
|
|
177
|
+
sql += ` AND m.remote_created_at <= ?`;
|
|
178
|
+
params.push(options.dateTo);
|
|
179
|
+
}
|
|
180
|
+
sql += ` ORDER BY m.remote_created_at DESC LIMIT ?`;
|
|
181
|
+
params.push(limit);
|
|
182
|
+
return db.prepare(sql).all(...params);
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Get N messages before a specific message (history context)
|
|
186
|
+
*/
|
|
187
|
+
export function getHistoryBefore(db, conversationId, beforeTimestamp, limit = 10) {
|
|
188
|
+
return db.prepare(`
|
|
189
|
+
SELECT m.*, ml.is_read, ml.read_at, ml.is_mentioned, ml.note
|
|
190
|
+
FROM messages m
|
|
191
|
+
JOIN message_local_state ml ON m.message_id = ml.message_id
|
|
192
|
+
WHERE m.conversation_id = ? AND m.remote_created_at < ?
|
|
193
|
+
ORDER BY m.remote_created_at DESC
|
|
194
|
+
LIMIT ?
|
|
195
|
+
`).all(conversationId, beforeTimestamp, limit);
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Get paginated messages for a specific conversation
|
|
199
|
+
*/
|
|
200
|
+
export function getMessagesByConversation(db, conversationId, options = {}) {
|
|
201
|
+
const limit = options.limit || 50;
|
|
202
|
+
let query = `
|
|
203
|
+
SELECT m.*, ml.is_read, ml.read_at, ml.is_mentioned, ml.note
|
|
204
|
+
FROM messages m
|
|
205
|
+
JOIN message_local_state ml ON m.message_id = ml.message_id
|
|
206
|
+
WHERE m.conversation_id = ?
|
|
207
|
+
`;
|
|
208
|
+
const params = [conversationId];
|
|
209
|
+
if (options.before) {
|
|
210
|
+
query += ` AND m.remote_created_at < ?`;
|
|
211
|
+
params.push(options.before);
|
|
212
|
+
}
|
|
213
|
+
if (options.after) {
|
|
214
|
+
query += ` AND m.remote_created_at > ?`;
|
|
215
|
+
params.push(options.after);
|
|
216
|
+
}
|
|
217
|
+
query += ` ORDER BY m.remote_created_at DESC LIMIT ?`;
|
|
218
|
+
params.push(limit);
|
|
219
|
+
return db.prepare(query).all(...params);
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Update mention flag for a message
|
|
223
|
+
*/
|
|
224
|
+
export function updateMentionFlag(db, messageId, isMentioned) {
|
|
225
|
+
db.prepare(`
|
|
226
|
+
UPDATE message_local_state
|
|
227
|
+
SET is_mentioned = ?, updated_at = datetime('now')
|
|
228
|
+
WHERE message_id = ?
|
|
229
|
+
`).run(isMentioned, messageId);
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=message-repo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-repo.js","sourceRoot":"","sources":["../../../../src/modules/chat/store/message-repo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Outbox repository - manage failed/pending message sends
|
|
3
|
+
*/
|
|
4
|
+
import Database from 'better-sqlite3';
|
|
5
|
+
export interface OutboxEntry {
|
|
6
|
+
id: string;
|
|
7
|
+
conversation_id: string | null;
|
|
8
|
+
recipient_agent_id: string | null;
|
|
9
|
+
content: string;
|
|
10
|
+
type: string;
|
|
11
|
+
in_reply_to: string | null;
|
|
12
|
+
mentions: string | null;
|
|
13
|
+
status: 'pending' | 'sent' | 'failed';
|
|
14
|
+
retry_count: number;
|
|
15
|
+
last_error: string | null;
|
|
16
|
+
created_at: string;
|
|
17
|
+
sent_at: string | null;
|
|
18
|
+
remote_message_id: string | null;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Enqueue a message to outbox
|
|
22
|
+
*/
|
|
23
|
+
export declare function enqueueMessage(db: Database.Database, message: {
|
|
24
|
+
id: string;
|
|
25
|
+
conversationId?: string;
|
|
26
|
+
recipientAgentId?: string;
|
|
27
|
+
content: string;
|
|
28
|
+
type?: string;
|
|
29
|
+
inReplyTo?: string;
|
|
30
|
+
mentions?: string[];
|
|
31
|
+
}): void;
|
|
32
|
+
/**
|
|
33
|
+
* Get pending messages from outbox
|
|
34
|
+
*/
|
|
35
|
+
export declare function getPendingMessages(db: Database.Database): OutboxEntry[];
|
|
36
|
+
/**
|
|
37
|
+
* Get all outbox entries
|
|
38
|
+
*/
|
|
39
|
+
export declare function getAllOutboxEntries(db: Database.Database): OutboxEntry[];
|
|
40
|
+
/**
|
|
41
|
+
* Mark an outbox entry as sent
|
|
42
|
+
*/
|
|
43
|
+
export declare function markMessageSent(db: Database.Database, outboxId: string, remoteMessageId: string): void;
|
|
44
|
+
/**
|
|
45
|
+
* Mark an outbox entry as failed
|
|
46
|
+
*/
|
|
47
|
+
export declare function markMessageFailed(db: Database.Database, outboxId: string, error: string): void;
|
|
48
|
+
/**
|
|
49
|
+
* Get retryable messages (retry_count < maxRetries)
|
|
50
|
+
*/
|
|
51
|
+
export declare function getRetryableMessages(db: Database.Database, maxRetries: number): OutboxEntry[];
|
|
52
|
+
/**
|
|
53
|
+
* Reset a failed message to pending for retry
|
|
54
|
+
*/
|
|
55
|
+
export declare function resetMessageForRetry(db: Database.Database, outboxId: string): void;
|
|
56
|
+
/**
|
|
57
|
+
* Delete an outbox entry
|
|
58
|
+
*/
|
|
59
|
+
export declare function deleteOutboxEntry(db: Database.Database, outboxId: string): void;
|
|
60
|
+
/**
|
|
61
|
+
* Get outbox statistics
|
|
62
|
+
*/
|
|
63
|
+
export declare function getOutboxStats(db: Database.Database): {
|
|
64
|
+
pending: number;
|
|
65
|
+
failed: number;
|
|
66
|
+
sent: number;
|
|
67
|
+
totalRetries: number;
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* Clean up old sent entries (older than specified hours)
|
|
71
|
+
*/
|
|
72
|
+
export declare function cleanupOldOutboxEntries(db: Database.Database, olderThanHours?: number): number;
|
|
73
|
+
//# sourceMappingURL=outbox-repo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outbox-repo.d.ts","sourceRoot":"","sources":["../../../../src/modules/chat/store/outbox-repo.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,OAAO,EAAE;IACP,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB,GACA,IAAI,CAeN;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,WAAW,EAAE,CAIvE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,WAAW,EAAE,CAIxE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,MAAM,GACtB,IAAI,CASN;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACZ,IAAI,CAQN;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,UAAU,EAAE,MAAM,GACjB,WAAW,EAAE,CAMf;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,QAAQ,EAAE,MAAM,GACf,IAAI,CAON;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAE/E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;CACtB,CAgBA;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,cAAc,GAAE,MAAW,GAC1B,MAAM,CAOR"}
|