@leemour/cli-messaging 0.56.0 → 0.58.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.
Files changed (134) hide show
  1. package/README.md +1 -1
  2. package/dist/cli/index.d.ts +1 -2
  3. package/dist/cli/index.d.ts.map +1 -1
  4. package/dist/cli/index.js +1 -2
  5. package/dist/cli/index.js.map +1 -1
  6. package/dist/cli/messenger/archive-commands.d.ts +2 -10
  7. package/dist/cli/messenger/archive-commands.d.ts.map +1 -1
  8. package/dist/cli/messenger/archive-commands.js +14 -17
  9. package/dist/cli/messenger/archive-commands.js.map +1 -1
  10. package/dist/cli/messenger/backfill-command.d.ts +6 -3
  11. package/dist/cli/messenger/backfill-command.d.ts.map +1 -1
  12. package/dist/cli/messenger/backfill-command.js +86 -141
  13. package/dist/cli/messenger/backfill-command.js.map +1 -1
  14. package/dist/cli/messenger/backfill-estimate.js +1 -1
  15. package/dist/cli/messenger/backfill-estimate.js.map +1 -1
  16. package/dist/cli/messenger/chats-command.d.ts +1 -30
  17. package/dist/cli/messenger/chats-command.d.ts.map +1 -1
  18. package/dist/cli/messenger/chats-command.js +11 -48
  19. package/dist/cli/messenger/chats-command.js.map +1 -1
  20. package/dist/cli/messenger/chats-members-command.d.ts.map +1 -1
  21. package/dist/cli/messenger/chats-members-command.js +1 -2
  22. package/dist/cli/messenger/chats-members-command.js.map +1 -1
  23. package/dist/cli/messenger/chats-read-command.d.ts +1 -14
  24. package/dist/cli/messenger/chats-read-command.d.ts.map +1 -1
  25. package/dist/cli/messenger/chats-read-command.js +2 -11
  26. package/dist/cli/messenger/chats-read-command.js.map +1 -1
  27. package/dist/cli/messenger/contacts-command.d.ts +1 -21
  28. package/dist/cli/messenger/contacts-command.d.ts.map +1 -1
  29. package/dist/cli/messenger/contacts-command.js +7 -58
  30. package/dist/cli/messenger/contacts-command.js.map +1 -1
  31. package/dist/cli/messenger/context.d.ts +3 -1
  32. package/dist/cli/messenger/context.d.ts.map +1 -1
  33. package/dist/cli/messenger/context.js.map +1 -1
  34. package/dist/cli/messenger/download-command.js +3 -3
  35. package/dist/cli/messenger/download-command.js.map +1 -1
  36. package/dist/cli/messenger/guard-commands.d.ts +1 -1
  37. package/dist/cli/messenger/guard-commands.js +3 -3
  38. package/dist/cli/messenger/guard-commands.js.map +1 -1
  39. package/dist/cli/messenger/hearing-command.js +1 -1
  40. package/dist/cli/messenger/hearing-command.js.map +1 -1
  41. package/dist/cli/messenger/inbox.d.ts.map +1 -1
  42. package/dist/cli/messenger/inbox.js +5 -6
  43. package/dist/cli/messenger/inbox.js.map +1 -1
  44. package/dist/cli/messenger/messages-command.d.ts.map +1 -1
  45. package/dist/cli/messenger/messages-command.js +9 -16
  46. package/dist/cli/messenger/messages-command.js.map +1 -1
  47. package/dist/cli/messenger/patience.d.ts +1 -1
  48. package/dist/cli/messenger/patience.d.ts.map +1 -1
  49. package/dist/cli/messenger/patience.js +1 -1
  50. package/dist/cli/messenger/patience.js.map +1 -1
  51. package/dist/cli/messenger/review.d.ts.map +1 -1
  52. package/dist/cli/messenger/review.js +1 -4
  53. package/dist/cli/messenger/review.js.map +1 -1
  54. package/dist/cli/messenger/transcribe-command.js +2 -2
  55. package/dist/cli/messenger/transcribe-command.js.map +1 -1
  56. package/dist/conversations/link.d.ts +30 -0
  57. package/dist/conversations/link.d.ts.map +1 -0
  58. package/dist/conversations/link.js +93 -0
  59. package/dist/conversations/link.js.map +1 -0
  60. package/dist/domain/models.d.ts +2 -0
  61. package/dist/domain/models.d.ts.map +1 -1
  62. package/dist/mcp/instructions.js +1 -1
  63. package/dist/mcp/instructions.js.map +1 -1
  64. package/dist/mcp/tools/chats-read.d.ts.map +1 -1
  65. package/dist/mcp/tools/chats-read.js +6 -3
  66. package/dist/mcp/tools/chats-read.js.map +1 -1
  67. package/dist/mcp/tools/chats.d.ts.map +1 -1
  68. package/dist/mcp/tools/chats.js +12 -10
  69. package/dist/mcp/tools/chats.js.map +1 -1
  70. package/dist/mcp/tools/contacts.d.ts +1 -1
  71. package/dist/mcp/tools/contacts.d.ts.map +1 -1
  72. package/dist/mcp/tools/contacts.js +10 -7
  73. package/dist/mcp/tools/contacts.js.map +1 -1
  74. package/dist/mcp/tools/inbox.d.ts.map +1 -1
  75. package/dist/mcp/tools/inbox.js +7 -4
  76. package/dist/mcp/tools/inbox.js.map +1 -1
  77. package/dist/mcp/tools/messages-actions.js +2 -2
  78. package/dist/mcp/tools/messages-actions.js.map +1 -1
  79. package/dist/mcp/tools/messages-delete.js +2 -2
  80. package/dist/mcp/tools/messages-delete.js.map +1 -1
  81. package/dist/mcp/tools/messages-send.js +2 -2
  82. package/dist/mcp/tools/messages-send.js.map +1 -1
  83. package/dist/mcp/tools/messages.d.ts.map +1 -1
  84. package/dist/mcp/tools/messages.js +4 -4
  85. package/dist/mcp/tools/messages.js.map +1 -1
  86. package/dist/mcp/tools/reactions.js +2 -2
  87. package/dist/mcp/tools/reactions.js.map +1 -1
  88. package/dist/mcp/tools/review.d.ts.map +1 -1
  89. package/dist/mcp/tools/review.js +3 -2
  90. package/dist/mcp/tools/review.js.map +1 -1
  91. package/dist/sends/recipients.js +1 -1
  92. package/dist/sends/recipients.js.map +1 -1
  93. package/dist/services/archive.d.ts +55 -0
  94. package/dist/services/archive.d.ts.map +1 -0
  95. package/dist/services/archive.js +100 -0
  96. package/dist/services/archive.js.map +1 -0
  97. package/dist/services/chats.d.ts +47 -0
  98. package/dist/services/chats.d.ts.map +1 -0
  99. package/dist/services/chats.js +57 -0
  100. package/dist/services/chats.js.map +1 -0
  101. package/dist/services/inbox.d.ts +15 -0
  102. package/dist/services/inbox.d.ts.map +1 -0
  103. package/dist/services/inbox.js +19 -0
  104. package/dist/services/inbox.js.map +1 -0
  105. package/dist/services/index.d.ts +22 -0
  106. package/dist/services/index.d.ts.map +1 -1
  107. package/dist/services/index.js +19 -1
  108. package/dist/services/index.js.map +1 -1
  109. package/dist/services/people.d.ts +27 -0
  110. package/dist/services/people.d.ts.map +1 -0
  111. package/dist/services/people.js +60 -0
  112. package/dist/services/people.js.map +1 -0
  113. package/dist/speech/hearing.d.ts +6 -6
  114. package/dist/speech/hearing.d.ts.map +1 -1
  115. package/dist/speech/hearing.js +14 -40
  116. package/dist/speech/hearing.js.map +1 -1
  117. package/dist/store/index.d.ts +1 -1
  118. package/dist/store/index.d.ts.map +1 -1
  119. package/dist/store/index.js.map +1 -1
  120. package/dist/store/sqlite/manifest.d.ts.map +1 -1
  121. package/dist/store/sqlite/manifest.js +2 -0
  122. package/dist/store/sqlite/manifest.js.map +1 -1
  123. package/dist/store/sqlite/migrations.generated.d.ts.map +1 -1
  124. package/dist/store/sqlite/migrations.generated.js +13 -0
  125. package/dist/store/sqlite/migrations.generated.js.map +1 -1
  126. package/dist/store/sqlite/schema.d.ts +123 -0
  127. package/dist/store/sqlite/schema.d.ts.map +1 -1
  128. package/dist/store/sqlite/schema.js +18 -0
  129. package/dist/store/sqlite/schema.js.map +1 -1
  130. package/dist/store/store.d.ts +69 -3
  131. package/dist/store/store.d.ts.map +1 -1
  132. package/dist/store/store.js +208 -28
  133. package/dist/store/store.js.map +1 -1
  134. package/package.json +5 -1
@@ -0,0 +1,100 @@
1
+ import { setTimeout as sleep } from "node:timers/promises";
2
+ import { CliError } from "@leemour/cli-core";
3
+ import { estimateBackfill } from "../cli/messenger/backfill-estimate.js";
4
+ import { patiently } from "../cli/messenger/patience.js";
5
+ import { storedChatId } from "./messages.js";
6
+ /** The most messages a provider hands out per history request — Telegram's cap. */
7
+ const PAGE = 100;
8
+ export const archiveService = (deps) => {
9
+ const found = async (chat) => {
10
+ const store = await deps.store();
11
+ const account = await deps.account();
12
+ return { store, account, chatId: await storedChatId(deps.messenger, chat, store, account) };
13
+ };
14
+ return {
15
+ status: async (chat) => {
16
+ const store = await deps.store();
17
+ const account = await deps.account();
18
+ const only = chat === undefined ? undefined : await storedChatId(deps.messenger, chat, store, account);
19
+ const stats = await store.chatStats(account, only);
20
+ return Promise.all(stats.map(async (one) => ({ ...one, held: await store.ranges(account, one.chatId) })));
21
+ },
22
+ held: async (chatId) => (await deps.store()).ranges(await deps.account(), chatId),
23
+ export: async (chat) => {
24
+ const { store, account, chatId } = await found(chat);
25
+ return {
26
+ title: (await store.chatStats(account, chatId))[0]?.title ?? chatId,
27
+ messages: (await store.messages(account, chatId, { limit: Number.MAX_SAFE_INTEGER })).items,
28
+ };
29
+ },
30
+ estimate: async (chat, { max, pauseMs }) => {
31
+ const { store, account, chatId } = await found(chat);
32
+ const newest = Number((await store.messages(account, chatId, { limit: 1 })).items[0]?.id);
33
+ return {
34
+ chat: chatId,
35
+ ...estimateBackfill({
36
+ ranges: await store.ranges(account, chatId),
37
+ held: (await store.chatStats(account, chatId))[0]?.messages ?? 0,
38
+ newest: Number.isSafeInteger(newest) ? newest : undefined,
39
+ page: PAGE,
40
+ max,
41
+ pauseMs,
42
+ }),
43
+ };
44
+ },
45
+ fetch: async (chat, { max, pauseMs, sinceMs, note, stop, onPage }) => {
46
+ const connection = await deps.connection();
47
+ const self = connection.self();
48
+ if (self === null)
49
+ throw new CliError("authentication_error", "not logged in — nothing to fetch for");
50
+ const account = { provider: deps.messenger.provider, account: self };
51
+ const store = await deps.store();
52
+ let before;
53
+ let chatId;
54
+ let top;
55
+ let fetched = 0;
56
+ let reachedStart = false;
57
+ let reachedSince = false;
58
+ while (fetched < max && !stop.aborted) {
59
+ const page = await patiently(() => connection.history(chat, { limit: PAGE, ...(before ? { before } : {}) }), note, stop);
60
+ const first = page.items[0];
61
+ if (!first) {
62
+ reachedStart = true;
63
+ break;
64
+ }
65
+ chatId ??= first.chatId;
66
+ const keys = page.items.map((message) => Number(message.id));
67
+ if (keys.some((key) => !Number.isSafeInteger(key))) {
68
+ throw new CliError("validation_error", "this messenger's message ids do not order a chat, so it cannot fetch its history");
69
+ }
70
+ const low = Math.min(...keys);
71
+ top ??= Math.max(...keys);
72
+ fetched += page.items.length;
73
+ // This run's pages are contiguous, so everything from `low` to its first message is held.
74
+ const held = await store.markRange(account, chatId, low, top);
75
+ onPage({ fetched, chatId, oldest: held.from });
76
+ if (!page.hasMore) {
77
+ reachedStart = true;
78
+ break;
79
+ }
80
+ if (sinceMs !== undefined && page.items.some((message) => Date.parse(message.timestamp) < sinceMs)) {
81
+ reachedSince = true;
82
+ break;
83
+ }
84
+ before = String(held.from);
85
+ note(`${fetched} messages so far, back to ${held.from}`);
86
+ await sleep(pauseMs, undefined, { signal: stop }).catch(() => { });
87
+ }
88
+ const ranges = chatId === undefined ? [] : await store.ranges(account, chatId);
89
+ return {
90
+ chat: chatId ?? null,
91
+ fetched,
92
+ complete: reachedStart && ranges.length === 1,
93
+ ranges,
94
+ ...(reachedSince ? { reachedSince: true } : {}),
95
+ ...(stop.aborted ? { stopped: true } : {}),
96
+ };
97
+ },
98
+ };
99
+ };
100
+ //# sourceMappingURL=archive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive.js","sourceRoot":"","sources":["../../src/services/archive.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import type { Chat, ChatCard, ChatEvents, GroupMember, Id, LinkTarget, Page } from "../domain/models.js";
2
+ import type { ServiceDeps } from "./deps.js";
3
+ /** How far back `events` looks without `since`, as in max-cli. */
4
+ export declare const EVENTS_DAYS = 7;
5
+ /** A filtered list searches the newest this many: paging through every dialog hit FLOOD_WAIT (tg handoff §4.14). */
6
+ export declare const CHAT_SCAN = 200;
7
+ /** Checked by the caller, in its own words (`checkedFilter`). */
8
+ export interface ChatFilter {
9
+ search?: string;
10
+ kind?: string;
11
+ unread?: boolean;
12
+ }
13
+ export interface PageWindow {
14
+ limit?: number;
15
+ offset: number;
16
+ }
17
+ export interface MarkedRead {
18
+ chatId: Id;
19
+ /** `null`: up to the newest message. */
20
+ until: Id | null;
21
+ }
22
+ export interface ChatsService {
23
+ /**
24
+ * Newest first. A filtered list is cut from the newest `CHAT_SCAN` — or from every stored chat
25
+ * offline — and `partial` says there were older chats that were not searched.
26
+ */
27
+ list(filter: ChatFilter, window: PageWindow): Promise<Page<Chat> & {
28
+ partial: boolean;
29
+ }>;
30
+ show(chat: string): Promise<ChatCard>;
31
+ members(chat: string, window: PageWindow): Promise<Page<GroupMember> & {
32
+ chatId: Id;
33
+ }>;
34
+ /** `since` in ms, parsed by the caller; `only` keeps the events named, comma-separated as typed. */
35
+ events(chat: string, options: {
36
+ since?: number;
37
+ only?: string;
38
+ }): Promise<ChatEvents>;
39
+ inspect(link: string): Promise<LinkTarget>;
40
+ /** Through the guard; never counts toward the hourly limit. */
41
+ markRead(request: {
42
+ chat: string;
43
+ until?: string;
44
+ }): Promise<MarkedRead>;
45
+ }
46
+ export declare const chatsService: (deps: ServiceDeps) => ChatsService;
47
+ //# sourceMappingURL=chats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chats.d.ts","sourceRoot":"","sources":["../../src/services/chats.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAExG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAE5C,kEAAkE;AAClE,eAAO,MAAM,WAAW,IAAI,CAAA;AAE5B,oHAAoH;AACpH,eAAO,MAAM,SAAS,MAAM,CAAA;AAE5B,iEAAiE;AACjE,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,EAAE,CAAA;IACV,wCAAwC;IACxC,KAAK,EAAE,EAAE,GAAG,IAAI,CAAA;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B;;;OAGG;IACH,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAAA;IACxF,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IACrC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG;QAAE,MAAM,EAAE,EAAE,CAAA;KAAE,CAAC,CAAA;IACtF,oGAAoG;IACpG,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;IACrF,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;IAC1C,+DAA+D;IAC/D,QAAQ,CAAC,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;CACzE;AAED,eAAO,MAAM,YAAY,SAAU,WAAW,KAAG,YAsD/C,CAAA"}
@@ -0,0 +1,57 @@
1
+ import { CliError } from "@leemour/cli-core";
2
+ import { capability } from "../cli/messenger/port.js";
3
+ import { guardedWrite } from "../sends/guarded.js";
4
+ /** How far back `events` looks without `since`, as in max-cli. */
5
+ export const EVENTS_DAYS = 7;
6
+ /** A filtered list searches the newest this many: paging through every dialog hit FLOOD_WAIT (tg handoff §4.14). */
7
+ export const CHAT_SCAN = 200;
8
+ export const chatsService = (deps) => ({
9
+ list: async (filter, window) => {
10
+ const filtering = filter.search !== undefined || filter.kind !== undefined || filter.unread === true;
11
+ if (!filtering) {
12
+ const page = deps.offline
13
+ ? await (await deps.store()).chats(await deps.account(), window)
14
+ : await (await deps.connection()).chats(window);
15
+ return { ...page, partial: false };
16
+ }
17
+ const scanned = deps.offline
18
+ ? await (await deps.store()).chats(await deps.account(), { offset: 0 })
19
+ : await (await deps.connection()).chats({ limit: CHAT_SCAN, offset: 0 });
20
+ const found = scanned.items.filter(matches(filter));
21
+ const end = window.limit === undefined ? found.length : window.offset + window.limit;
22
+ return { items: found.slice(window.offset, end), hasMore: found.length > end, partial: scanned.hasMore };
23
+ },
24
+ show: async (chat) => (await deps.connection()).chat(chat),
25
+ members: async (chat, window) => capability(await deps.connection(), "members", "list a group's members")(chat, window),
26
+ events: async (chat, { since, only }) => {
27
+ if (deps.offline) {
28
+ throw new CliError("validation_error", "`chats events` reads the chat's history; with `--offline` there is none");
29
+ }
30
+ const from = since ?? Date.now() - EVENTS_DAYS * 86_400_000;
31
+ const found = await capability(await deps.connection(), "chatEvents", "read who joined or left")(chat, {
32
+ since: from,
33
+ });
34
+ const wanted = only === undefined ? undefined : new Set(only.split(",").map((name) => name.trim()));
35
+ return wanted ? { ...found, events: found.events.filter((one) => wanted.has(one.event)) } : found;
36
+ },
37
+ inspect: async (link) => {
38
+ if (deps.offline) {
39
+ throw new CliError("validation_error", "`chats inspect` asks the messenger about the link; not with --offline");
40
+ }
41
+ return capability(await deps.connection(), "inspect", "read a link")(link);
42
+ },
43
+ markRead: async ({ chat, until }) => {
44
+ const connection = await deps.connection();
45
+ const markRead = capability(connection, "markRead", "mark a chat read");
46
+ const { id: chatId } = await connection.resolve(chat);
47
+ await guardedWrite(deps.guard, { chatId, kind: "read", ...(until === undefined ? {} : { messageId: until }) }, () => markRead(chatId, until));
48
+ return { chatId, until: until ?? null };
49
+ },
50
+ });
51
+ const matches = ({ search, kind, unread }) => {
52
+ const needle = search?.toLocaleLowerCase();
53
+ return (chat) => (needle === undefined || (chat.title ?? "").toLocaleLowerCase().includes(needle)) &&
54
+ (kind === undefined || chat.kind === kind) &&
55
+ (!unread || (chat.unreadCount ?? 0) > 0);
56
+ };
57
+ //# sourceMappingURL=chats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chats.js","sourceRoot":"","sources":["../../src/services/chats.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { type ReviewOptions } from "../cli/messenger/review.js";
2
+ import type { Inbox, Review } from "../domain/models.js";
3
+ import type { ServiceDeps } from "./deps.js";
4
+ export interface InboxService {
5
+ /** Other people's unread messages; with `since` (ms, parsed by the caller), what arrived after it instead. */
6
+ read(options: {
7
+ since?: number;
8
+ limit: number;
9
+ all?: boolean;
10
+ }): Promise<Inbox>;
11
+ /** Every message, both sides, in each chat that changed since a point. */
12
+ review(options: ReviewOptions): Promise<Review>;
13
+ }
14
+ export declare const inboxService: (deps: ServiceDeps) => InboxService;
15
+ //# sourceMappingURL=inbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inbox.d.ts","sourceRoot":"","sources":["../../src/services/inbox.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,aAAa,EAAY,MAAM,4BAA4B,CAAA;AACzE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAE5C,MAAM,WAAW,YAAY;IAC3B,8GAA8G;IAC9G,IAAI,CAAC,OAAO,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAA;IAC/E,0EAA0E;IAC1E,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;CAChD;AAED,eAAO,MAAM,YAAY,SAAU,WAAW,KAAG,YAkB/C,CAAA"}
@@ -0,0 +1,19 @@
1
+ import { CliError } from "@leemour/cli-core";
2
+ import { newIn, unreadIn } from "../cli/messenger/inbox.js";
3
+ import { reviewIn } from "../cli/messenger/review.js";
4
+ export const inboxService = (deps) => ({
5
+ read: async ({ since, limit, all = false }) => {
6
+ if (deps.offline) {
7
+ throw new CliError("validation_error", "`inbox` asks the messenger what is new; with `--offline` there is nothing new");
8
+ }
9
+ const connection = await deps.connection();
10
+ return since === undefined ? unreadIn(connection, { limit, all }) : newIn(connection, { since, limit, all });
11
+ },
12
+ review: async (options) => {
13
+ if (deps.offline) {
14
+ throw new CliError("validation_error", "`review` asks the messenger what changed; with `--offline` nothing did");
15
+ }
16
+ return reviewIn(await deps.connection(), options);
17
+ },
18
+ });
19
+ //# sourceMappingURL=inbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inbox.js","sourceRoot":"","sources":["../../src/services/inbox.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAA;AAC3D,OAAO,EAAsB,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AAWzE,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAAiB,EAAgB,EAAE,CAAC,CAAC;IAChE,IAAI,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,GAAG,KAAK,EAAE,EAAE,EAAE;QAC5C,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,IAAI,QAAQ,CAChB,kBAAkB,EAClB,+EAA+E,CAChF,CAAA;QACH,CAAC;QACD,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;QAC1C,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;IAC9G,CAAC;IAED,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,wEAAwE,CAAC,CAAA;QAClH,CAAC;QACD,OAAO,QAAQ,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,EAAE,OAAO,CAAC,CAAA;IACnD,CAAC;CACF,CAAC,CAAA"}
@@ -1,11 +1,33 @@
1
+ import { type ArchiveService } from "./archive.js";
2
+ import { type ChatsService } from "./chats.js";
1
3
  import type { ServiceDeps } from "./deps.js";
4
+ import { type InboxService } from "./inbox.js";
2
5
  import { type MessagesService } from "./messages.js";
6
+ import { type PeopleService } from "./people.js";
7
+ export type { ArchiveService, Fetched, FetchOptions } from "./archive.js";
8
+ export { archiveService } from "./archive.js";
9
+ export type { ChatFilter, ChatsService, MarkedRead, PageWindow } from "./chats.js";
10
+ export { CHAT_SCAN, chatsService, EVENTS_DAYS } from "./chats.js";
3
11
  export type { ServiceDeps } from "./deps.js";
4
12
  export { OFFLINE, onlineDeps, storedDeps } from "./deps.js";
13
+ export type { InboxService } from "./inbox.js";
14
+ export { inboxService } from "./inbox.js";
5
15
  export type { AroundWindow, ListWindow, MessagesService, MessageTarget, Pinned, Reacted, SearchQuery, SendRequest, } from "./messages.js";
6
16
  export { DELETE_AT_ONCE, messagesService, storedChatId } from "./messages.js";
17
+ export type { ContactSync, PeopleService } from "./people.js";
18
+ export { peopleService, phoneOf } from "./people.js";
7
19
  export interface Services {
8
20
  messages: MessagesService;
21
+ chats: ChatsService;
22
+ people: PeopleService;
23
+ inbox: InboxService;
24
+ archive: ArchiveService;
9
25
  }
26
+ /**
27
+ * How a CLI replaces a use case: it returns the services it changes, whole, and can call the shared
28
+ * method inside its own — `messages: { ...base.messages, list: (chat, window) => … base.messages.list … }`.
29
+ */
30
+ export type Override = (base: Services, deps: ServiceDeps) => Partial<Services>;
31
+ /** The shared services, with the messenger's `services` override applied — commands and MCP tools alike. */
10
32
  export declare const servicesFor: (deps: ServiceDeps) => Services;
11
33
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,KAAK,eAAe,EAAmB,MAAM,eAAe,CAAA;AAErE,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAC3D,YAAY,EACV,YAAY,EACZ,UAAU,EACV,eAAe,EACf,aAAa,EACb,MAAM,EACN,OAAO,EACP,WAAW,EACX,WAAW,GACZ,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAE7E,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,eAAe,CAAA;CAC1B;AAED,eAAO,MAAM,WAAW,SAAU,WAAW,KAAG,QAAiD,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAkB,MAAM,cAAc,CAAA;AAClE,OAAO,EAAE,KAAK,YAAY,EAAgB,MAAM,YAAY,CAAA;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,KAAK,YAAY,EAAgB,MAAM,YAAY,CAAA;AAC5D,OAAO,EAAE,KAAK,eAAe,EAAmB,MAAM,eAAe,CAAA;AACrE,OAAO,EAAE,KAAK,aAAa,EAAiB,MAAM,aAAa,CAAA;AAE/D,YAAY,EAAE,cAAc,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC7C,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAClF,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACjE,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAC3D,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AACzC,YAAY,EACV,YAAY,EACZ,UAAU,EACV,eAAe,EACf,aAAa,EACb,MAAM,EACN,OAAO,EACP,WAAW,EACX,WAAW,GACZ,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAC7E,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC7D,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAEpD,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,eAAe,CAAA;IACzB,KAAK,EAAE,YAAY,CAAA;IACnB,MAAM,EAAE,aAAa,CAAA;IACrB,KAAK,EAAE,YAAY,CAAA;IACnB,OAAO,EAAE,cAAc,CAAA;CACxB;AAED;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;AAE/E,4GAA4G;AAC5G,eAAO,MAAM,WAAW,SAAU,WAAW,KAAG,QAS/C,CAAA"}
@@ -1,5 +1,23 @@
1
+ import { archiveService } from "./archive.js";
2
+ import { chatsService } from "./chats.js";
3
+ import { inboxService } from "./inbox.js";
1
4
  import { messagesService } from "./messages.js";
5
+ import { peopleService } from "./people.js";
6
+ export { archiveService } from "./archive.js";
7
+ export { CHAT_SCAN, chatsService, EVENTS_DAYS } from "./chats.js";
2
8
  export { OFFLINE, onlineDeps, storedDeps } from "./deps.js";
9
+ export { inboxService } from "./inbox.js";
3
10
  export { DELETE_AT_ONCE, messagesService, storedChatId } from "./messages.js";
4
- export const servicesFor = (deps) => ({ messages: messagesService(deps) });
11
+ export { peopleService, phoneOf } from "./people.js";
12
+ /** The shared services, with the messenger's `services` override applied — commands and MCP tools alike. */
13
+ export const servicesFor = (deps) => {
14
+ const base = {
15
+ messages: messagesService(deps),
16
+ chats: chatsService(deps),
17
+ people: peopleService(deps),
18
+ inbox: inboxService(deps),
19
+ archive: archiveService(deps),
20
+ };
21
+ return deps.messenger.services ? { ...base, ...deps.messenger.services(base, deps) } : base;
22
+ };
5
23
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAwB,eAAe,EAAE,MAAM,eAAe,CAAA;AAGrE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAW3D,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAM7E,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,IAAiB,EAAY,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,cAAc,EAAE,MAAM,cAAc,CAAA;AAClE,OAAO,EAAqB,YAAY,EAAE,MAAM,YAAY,CAAA;AAE5D,OAAO,EAAqB,YAAY,EAAE,MAAM,YAAY,CAAA;AAC5D,OAAO,EAAwB,eAAe,EAAE,MAAM,eAAe,CAAA;AACrE,OAAO,EAAsB,aAAa,EAAE,MAAM,aAAa,CAAA;AAG/D,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAE7C,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAEjE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAE3D,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAWzC,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAE7E,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAgBpD,4GAA4G;AAC5G,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,IAAiB,EAAY,EAAE;IACzD,MAAM,IAAI,GAAa;QACrB,QAAQ,EAAE,eAAe,CAAC,IAAI,CAAC;QAC/B,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC;QACzB,MAAM,EAAE,aAAa,CAAC,IAAI,CAAC;QAC3B,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC;QACzB,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC;KAC9B,CAAA;IACD,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;AAC7F,CAAC,CAAA"}
@@ -0,0 +1,27 @@
1
+ import type { Contact, Member, Page, PersonCard } from "../domain/models.js";
2
+ import type { PageWindow } from "./chats.js";
3
+ import type { ServiceDeps } from "./deps.js";
4
+ export interface ContactSync {
5
+ added: number;
6
+ changed: number;
7
+ known: number;
8
+ }
9
+ /**
10
+ * A contact is somebody this account has a one-to-one chat with — a query over the chat list, never
11
+ * a flag somebody maintains (max-cli `NEED-105`). So the list works offline from the stored chats.
12
+ */
13
+ export interface PeopleService {
14
+ list(options: {
15
+ order: "recent" | "name";
16
+ search?: string;
17
+ } & PageWindow): Promise<Page<Contact>>;
18
+ show(person: string): Promise<PersonCard>;
19
+ /** `phone` as digits, parsed by the caller (`phoneOf`). */
20
+ lookup(phone: string): Promise<Member>;
21
+ /** The whole contact list from the messenger into the store: what was new, what changed. */
22
+ sync(): Promise<ContactSync>;
23
+ }
24
+ export declare const peopleService: (deps: ServiceDeps) => PeopleService;
25
+ /** Digits, with the `+` and the spaces, dashes and brackets people type dropped. */
26
+ export declare const phoneOf: (typed: string) => string;
27
+ //# sourceMappingURL=people.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"people.d.ts","sourceRoot":"","sources":["../../src/services/people.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAQ,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAClF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAC5C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAE5C,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;CACd;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,OAAO,EAAE;QAAE,KAAK,EAAE,QAAQ,GAAG,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAA;IACjG,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;IACzC,2DAA2D;IAC3D,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IACtC,4FAA4F;IAC5F,IAAI,IAAI,OAAO,CAAC,WAAW,CAAC,CAAA;CAC7B;AAED,eAAO,MAAM,aAAa,SAAU,WAAW,KAAG,aA8BhD,CAAA;AAEF,oFAAoF;AACpF,eAAO,MAAM,OAAO,UAAW,MAAM,KAAG,MAMvC,CAAA"}
@@ -0,0 +1,60 @@
1
+ import { CliError } from "@leemour/cli-core";
2
+ import { capability } from "../cli/messenger/port.js";
3
+ export const peopleService = (deps) => ({
4
+ list: async (options) => {
5
+ const chats = deps.offline
6
+ ? (await (await deps.store()).chats(await deps.account(), {})).items
7
+ : (await (await deps.connection()).chats({ offset: 0 })).items;
8
+ return contactsIn(chats, options);
9
+ },
10
+ show: async (person) => (await deps.connection()).contact(person),
11
+ lookup: async (phone) => capability(await deps.connection(), "lookup", "find a person by phone")(phone),
12
+ sync: async () => {
13
+ if (deps.offline) {
14
+ throw new CliError("validation_error", "`contacts sync` takes the list from the messenger; not with --offline");
15
+ }
16
+ const people = await capability(await deps.connection(), "addressBook", "list its contacts")();
17
+ const store = await deps.store();
18
+ const account = await deps.account();
19
+ const before = await store.people(account.provider, { account: account.account });
20
+ let added = 0;
21
+ let changed = 0;
22
+ for (const person of people) {
23
+ const known = before.get(person.id);
24
+ if (!known)
25
+ added += 1;
26
+ else if (known.name !== person.name || known.username !== person.username)
27
+ changed += 1;
28
+ }
29
+ await store.savePeople(account, people);
30
+ return { added, changed, known: (await store.people(account.provider, { account: account.account })).all().length };
31
+ },
32
+ });
33
+ /** Digits, with the `+` and the spaces, dashes and brackets people type dropped. */
34
+ export const phoneOf = (typed) => {
35
+ const digits = typed.replace(/[\s()+-]/g, "");
36
+ if (!/^\d{6,15}$/.test(digits)) {
37
+ throw new CliError("validation_error", "that is not a phone number — digits, with a country code");
38
+ }
39
+ return digits;
40
+ };
41
+ const contactsIn = (chats, { order, search, limit, offset }) => {
42
+ const wanted = search?.trim().toLowerCase();
43
+ const people = chats
44
+ .filter((chat) => chat.kind === "dialog")
45
+ .map(toContact)
46
+ .filter((person) => !wanted || [person.name, person.username].some((field) => field?.toLowerCase().includes(wanted)))
47
+ .sort(order === "name" ? byName : byRecency);
48
+ const end = limit === undefined ? people.length : offset + limit;
49
+ return { items: people.slice(offset, end), hasMore: people.length > end };
50
+ };
51
+ const toContact = (chat) => ({
52
+ id: chat.id,
53
+ name: chat.title,
54
+ username: typeof chat.providerMetadata?.username === "string" ? chat.providerMetadata.username : null,
55
+ description: null,
56
+ lastMessagedAt: chat.lastMessageAt,
57
+ });
58
+ const byRecency = (a, b) => (b.lastMessagedAt ?? "").localeCompare(a.lastMessagedAt ?? "");
59
+ const byName = (a, b) => (a.name ?? "").localeCompare(b.name ?? "");
60
+ //# sourceMappingURL=people.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"people.js","sourceRoot":"","sources":["../../src/services/people.ts"],"names":[],"mappings":"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"}
@@ -21,14 +21,14 @@ export declare const keyOf: ({ chatId, messageId }: Voice) => string;
21
21
  /** Telegram says `voice`; MAX says `audio` with Ogg in it. */
22
22
  export declare const isVoice: (message: Message) => boolean;
23
23
  export interface Kept {
24
- get(voice: Voice): string | undefined;
25
- keep(voice: Voice, text: string, source: string): void;
26
- close(): void;
24
+ get(voice: Voice): Promise<string | undefined>;
25
+ keep(voice: Voice, text: string, source: string): Promise<void>;
26
+ close(): Promise<void>;
27
27
  }
28
28
  /**
29
- * Transcripts already heard, per profile, in the CLI's own cache — not the store: a transcript is
30
- * derived and can be heard again, and a development build's `<PREFIX>_CACHE_DIR` keeps it off the
31
- * owner's files. One profile is one account, so a chat and a message id are the key.
29
+ * Transcripts already heard, in the shared store, for the account this profile last logged in as
30
+ * (owner, NEED-418 B). A profile that has never been online has no account yet: nothing is kept for
31
+ * it, and a voice message is heard again next time.
32
32
  */
33
33
  export declare const openKept: (messenger: Messenger, profile: string, env: NodeJS.ProcessEnv) => Promise<Kept>;
34
34
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"hearing.d.ts","sourceRoot":"","sources":["../../src/speech/hearing.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAA;AAC5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAChE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAGlD,OAAO,EAAE,KAAK,MAAM,EAAmC,MAAM,iBAAiB,CAAA;AAE9E,iHAAiH;AACjH,eAAO,MAAM,iBAAiB,SAAU,CAAA;AAExC,MAAM,WAAW,KAAK;IACpB,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,OAAO;IACtB,iFAAiF;IACjF,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,gGAAgG;IAChG,OAAO,EAAE,KAAK,EAAE,CAAA;IAChB,wFAAwF;IACxF,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,eAAO,MAAM,KAAK,0BAA2B,KAAK,KAAG,MAAkC,CAAA;AAEvF,8DAA8D;AAC9D,eAAO,MAAM,OAAO,YAAa,OAAO,KAAG,OAC6C,CAAA;AAExF,MAAM,WAAW,IAAI;IACnB,GAAG,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,SAAS,CAAA;IACrC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACtD,KAAK,IAAI,IAAI,CAAA;CACd;AAED;;;;GAIG;AACH,eAAO,MAAM,QAAQ,cAAqB,SAAS,WAAW,MAAM,OAAO,MAAM,CAAC,UAAU,KAAG,OAAO,CAAC,IAAI,CAkC1G,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,UAAU,cACV,SAAS,YACV,SAAS,OAAO,EAAE,QACtB,IAAI,eACG;IACX,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAA;IAC3E,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,KACA,OAAO,CAAC,OAAO,CAsCjB,CAAA;AAED,uFAAuF;AACvF,eAAO,MAAM,cAAc,GAAI,CAAC,SAAS,OAAO,WAAW,CAAC,WAAW,OAAO,KAAG,CAAC,GAAG;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAGzG,CAAA;AAED,8EAA8E;AAC9E,eAAO,MAAM,MAAM,GAAI,CAAC,SAAS,OAAO,GAAG;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,8BAA8B,CAAC,KAAG,OAGX,CAAA;AAEzF,4EAA4E;AAC5E,eAAO,MAAM,WAAW,cACX,SAAS,WACX,gBAAgB,YACf,SAAS,OAAO,EAAE,cAChB,OAAO,qBACA;IAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,YAAY,GAAG,QAAQ,GAAG,SAAS,CAAC,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAA;CAAE,KAC3G,OAAO,CAAC,OAAO,GAAG,SAAS,CAa7B,CAAA;AAED,4FAA4F;AAC5F,eAAO,MAAM,KAAK,GAAI,CAAC,SAAS,OAAO,YAAY,SAAS,CAAC,EAAE,WAAW,OAAO,GAAG,SAAS,KAAG,CAAC,EACV,CAAA"}
1
+ {"version":3,"file":"hearing.d.ts","sourceRoot":"","sources":["../../src/speech/hearing.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAA;AAC5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAChE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAElD,OAAO,EAAE,KAAK,MAAM,EAAmC,MAAM,iBAAiB,CAAA;AAE9E,iHAAiH;AACjH,eAAO,MAAM,iBAAiB,SAAU,CAAA;AAExC,MAAM,WAAW,KAAK;IACpB,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,OAAO;IACtB,iFAAiF;IACjF,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,gGAAgG;IAChG,OAAO,EAAE,KAAK,EAAE,CAAA;IAChB,wFAAwF;IACxF,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,eAAO,MAAM,KAAK,0BAA2B,KAAK,KAAG,MAAkC,CAAA;AAEvF,8DAA8D;AAC9D,eAAO,MAAM,OAAO,YAAa,OAAO,KAAG,OAC6C,CAAA;AAExF,MAAM,WAAW,IAAI;IACnB,GAAG,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;IAC9C,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC/D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACvB;AAED;;;;GAIG;AACH,eAAO,MAAM,QAAQ,cAAqB,SAAS,WAAW,MAAM,OAAO,MAAM,CAAC,UAAU,KAAG,OAAO,CAAC,IAAI,CAS1G,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,UAAU,cACV,SAAS,YACV,SAAS,OAAO,EAAE,QACtB,IAAI,eACG;IACX,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAA;IAC3E,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,KACA,OAAO,CAAC,OAAO,CAsCjB,CAAA;AAED,uFAAuF;AACvF,eAAO,MAAM,cAAc,GAAI,CAAC,SAAS,OAAO,WAAW,CAAC,WAAW,OAAO,KAAG,CAAC,GAAG;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAGzG,CAAA;AAED,8EAA8E;AAC9E,eAAO,MAAM,MAAM,GAAI,CAAC,SAAS,OAAO,GAAG;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,8BAA8B,CAAC,KAAG,OAGX,CAAA;AAEzF,4EAA4E;AAC5E,eAAO,MAAM,WAAW,cACX,SAAS,WACX,gBAAgB,YACf,SAAS,OAAO,EAAE,cAChB,OAAO,qBACA;IAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,YAAY,GAAG,QAAQ,GAAG,SAAS,CAAC,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAA;CAAE,KAC3G,OAAO,CAAC,OAAO,GAAG,SAAS,CAa7B,CAAA;AAED,4FAA4F;AAC5F,eAAO,MAAM,KAAK,GAAI,CAAC,SAAS,OAAO,YAAY,SAAS,CAAC,EAAE,WAAW,OAAO,GAAG,SAAS,KAAG,CAAC,EACV,CAAA"}
@@ -1,8 +1,5 @@
1
- import { chmodSync, mkdirSync } from "node:fs";
2
- import { join } from "node:path";
3
- import { resolvePaths } from "@leemour/cli-core";
4
- import { openCache } from "../store/open.js";
5
- import { MODELS } from "./models.js";
1
+ import { recalledAccount } from "../cli/messenger/accounts.js";
2
+ import { openStore } from "../store/store.js";
6
3
  import { choose, hearLocally, hearOnline } from "./transcribe.js";
7
4
  /** Telegram polls each voice message for up to a minute; a whole list gets this long, then says what is left. */
8
5
  export const HEARING_BUDGET_MS = 120_000;
@@ -10,42 +7,19 @@ export const keyOf = ({ chatId, messageId }) => `${chatId}/${messageId}`;
10
7
  /** Telegram says `voice`; MAX says `audio` with Ogg in it. */
11
8
  export const isVoice = (message) => message.attachments.some(({ kind, mime }) => kind === "voice" || mime === "audio/ogg");
12
9
  /**
13
- * Transcripts already heard, per profile, in the CLI's own cache — not the store: a transcript is
14
- * derived and can be heard again, and a development build's `<PREFIX>_CACHE_DIR` keeps it off the
15
- * owner's files. One profile is one account, so a chat and a message id are the key.
10
+ * Transcripts already heard, in the shared store, for the account this profile last logged in as
11
+ * (owner, NEED-418 B). A profile that has never been online has no account yet: nothing is kept for
12
+ * it, and a voice message is heard again next time.
16
13
  */
17
14
  export const openKept = async (messenger, profile, env) => {
18
- const directory = resolvePaths({ appName: messenger.app.appName, prefix: messenger.app.envPrefix, env }).cache;
19
- mkdirSync(directory, { recursive: true, mode: 0o700 });
20
- const path = join(directory, `transcripts-${profile}.db`);
21
- const database = await openCache(path);
22
- chmodSync(path, 0o600);
23
- database.exec(`CREATE TABLE IF NOT EXISTS transcripts (
24
- chat_id TEXT NOT NULL,
25
- message_id TEXT NOT NULL,
26
- text TEXT NOT NULL,
27
- source TEXT NOT NULL,
28
- heard_at TEXT NOT NULL,
29
- PRIMARY KEY (chat_id, message_id)
30
- )`);
31
- const { user_version: version } = database.prepare("PRAGMA user_version").get();
32
- if (version < 1) {
33
- // Local models heard these with a voice detector that dropped quiet speech; hear them again.
34
- database
35
- .prepare(`DELETE FROM transcripts WHERE source IN (${MODELS.map(() => "?").join(", ")})`)
36
- .run(...MODELS.map(({ id }) => id));
37
- database.exec("PRAGMA user_version = 1");
38
- }
39
- const read = database.prepare("SELECT text FROM transcripts WHERE chat_id = ? AND message_id = ?");
40
- const write = database.prepare("INSERT OR REPLACE INTO transcripts (chat_id, message_id, text, source, heard_at) VALUES (?, ?, ?, ?, ?)");
15
+ const account = recalledAccount(messenger.app, messenger.provider, profile, env);
16
+ if (!account)
17
+ return { get: async () => undefined, keep: async () => { }, close: async () => { } };
18
+ const store = await openStore({ env });
41
19
  return {
42
- get: ({ chatId, messageId }) => read.get(chatId, messageId)?.text,
43
- keep: ({ chatId, messageId }, text, source) => {
44
- // A pending or empty answer would stick for good; only a finished text is kept.
45
- if (text.trim() !== "")
46
- write.run(chatId, messageId, text, source, new Date().toISOString());
47
- },
48
- close: () => database.close(),
20
+ get: async ({ chatId, messageId }) => (await store.transcript(account, chatId, messageId))?.text,
21
+ keep: ({ chatId, messageId }, text, source) => store.keepTranscript(account, chatId, messageId, text, source),
22
+ close: () => store.close(),
49
23
  };
50
24
  };
51
25
  /**
@@ -58,7 +32,7 @@ export const hearVoices = async (messenger, messages, kept, transcribe) => {
58
32
  const missing = [];
59
33
  for (const message of messages.filter(isVoice)) {
60
34
  const voice = { chatId: message.chatId, messageId: message.id };
61
- const text = kept.get(voice);
35
+ const text = await kept.get(voice);
62
36
  if (text === undefined)
63
37
  missing.push(voice);
64
38
  else
@@ -89,7 +63,7 @@ export const hearVoices = async (messenger, messages, kept, transcribe) => {
89
63
  if (heard.pending || heard.text.trim() === "")
90
64
  continue;
91
65
  transcripts.set(keyOf(voice), heard.text);
92
- kept.keep(voice, heard.text, heard.model ?? heard.via);
66
+ await kept.keep(voice, heard.text, heard.model ?? heard.via);
93
67
  }
94
68
  catch (error) {
95
69
  problem ??= error instanceof Error ? error.message : String(error);
@@ -1 +1 @@
1
- {"version":3,"file":"hearing.js","sourceRoot":"","sources":["../../src/speech/hearing.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hearing.js","sourceRoot":"","sources":["../../src/speech/hearing.ts"],"names":[],"mappings":"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"}
@@ -3,5 +3,5 @@ export { PRAGMAS } from "./driver.js";
3
3
  export { MIGRATIONS, type Migration, migrate } from "./migrations.js";
4
4
  export { openCache } from "./open.js";
5
5
  export { storePath } from "./path.js";
6
- export { type AccountKey, type ChatStats, type IngestedVia, type MessageFilter, type MessageStore, openStore, type PersonFacts, type Range, type StoredHit, type StoreOptions, } from "./store.js";
6
+ export { type AccountKey, type ChatStats, type Delta, type IngestedVia, type MessageFilter, type MessageStore, openStore, type PersonFacts, type Range, type StoredChatFilter, type StoredHit, type StoreOptions, } from "./store.js";
7
7
  //# sourceMappingURL=index.d.ts.map