@leemour/cli-messaging 0.85.0 → 0.86.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 (67) hide show
  1. package/dist/cli/index.d.ts +1 -1
  2. package/dist/cli/index.d.ts.map +1 -1
  3. package/dist/cli/index.js +1 -1
  4. package/dist/cli/index.js.map +1 -1
  5. package/dist/cli/messenger/account-sessions-command.d.ts.map +1 -1
  6. package/dist/cli/messenger/account-sessions-command.js +2 -1
  7. package/dist/cli/messenger/account-sessions-command.js.map +1 -1
  8. package/dist/cli/messenger/admin-contacts-command.d.ts +8 -0
  9. package/dist/cli/messenger/admin-contacts-command.d.ts.map +1 -0
  10. package/dist/cli/messenger/admin-contacts-command.js +60 -0
  11. package/dist/cli/messenger/admin-contacts-command.js.map +1 -0
  12. package/dist/cli/messenger/archive-commands.d.ts.map +1 -1
  13. package/dist/cli/messenger/archive-commands.js +2 -1
  14. package/dist/cli/messenger/archive-commands.js.map +1 -1
  15. package/dist/cli/messenger/backfill-command.d.ts.map +1 -1
  16. package/dist/cli/messenger/backfill-command.js +2 -1
  17. package/dist/cli/messenger/backfill-command.js.map +1 -1
  18. package/dist/cli/messenger/chats-command.d.ts.map +1 -1
  19. package/dist/cli/messenger/chats-command.js +5 -3
  20. package/dist/cli/messenger/chats-command.js.map +1 -1
  21. package/dist/cli/messenger/contacts-command.d.ts.map +1 -1
  22. package/dist/cli/messenger/contacts-command.js +3 -0
  23. package/dist/cli/messenger/contacts-command.js.map +1 -1
  24. package/dist/cli/messenger/messages-command.d.ts.map +1 -1
  25. package/dist/cli/messenger/messages-command.js +8 -7
  26. package/dist/cli/messenger/messages-command.js.map +1 -1
  27. package/dist/cli/messenger/messages-edit-command.js +2 -2
  28. package/dist/cli/messenger/messages-edit-command.js.map +1 -1
  29. package/dist/cli/messenger/messages-scheduled-command.d.ts.map +1 -1
  30. package/dist/cli/messenger/messages-scheduled-command.js +2 -1
  31. package/dist/cli/messenger/messages-scheduled-command.js.map +1 -1
  32. package/dist/cli/messenger/models-command.d.ts.map +1 -1
  33. package/dist/cli/messenger/models-command.js +2 -1
  34. package/dist/cli/messenger/models-command.js.map +1 -1
  35. package/dist/cli/messenger/port.d.ts +16 -2
  36. package/dist/cli/messenger/port.d.ts.map +1 -1
  37. package/dist/cli/messenger/port.js.map +1 -1
  38. package/dist/cli/messenger/review.d.ts +1 -1
  39. package/dist/cli/messenger/review.d.ts.map +1 -1
  40. package/dist/cli/messenger/review.js +4 -12
  41. package/dist/cli/messenger/review.js.map +1 -1
  42. package/dist/cli/messenger/server-command.d.ts.map +1 -1
  43. package/dist/cli/messenger/server-command.js +2 -1
  44. package/dist/cli/messenger/server-command.js.map +1 -1
  45. package/dist/cli/paging.d.ts +11 -0
  46. package/dist/cli/paging.d.ts.map +1 -1
  47. package/dist/cli/paging.js +11 -0
  48. package/dist/cli/paging.js.map +1 -1
  49. package/dist/cli/settings.d.ts.map +1 -1
  50. package/dist/cli/settings.js +3 -3
  51. package/dist/cli/settings.js.map +1 -1
  52. package/dist/domain/models.d.ts +5 -0
  53. package/dist/domain/models.d.ts.map +1 -1
  54. package/dist/domain/models.js.map +1 -1
  55. package/dist/mcp/tools/contacts-write.d.ts +5 -0
  56. package/dist/mcp/tools/contacts-write.d.ts.map +1 -0
  57. package/dist/mcp/tools/contacts-write.js +37 -0
  58. package/dist/mcp/tools/contacts-write.js.map +1 -0
  59. package/dist/mcp/tools.d.ts.map +1 -1
  60. package/dist/mcp/tools.js +2 -0
  61. package/dist/mcp/tools.js.map +1 -1
  62. package/dist/services/people.d.ts +22 -1
  63. package/dist/services/people.d.ts.map +1 -1
  64. package/dist/services/people.js +93 -42
  65. package/dist/services/people.js.map +1 -1
  66. package/package.json +1 -1
  67. package/parity.json +41 -60
@@ -0,0 +1,37 @@
1
+ import * as v from "valibot";
2
+ import { onlineDeps, servicesFor } from "../../services/index.js";
3
+ import { APPROVE, tool, WRITE } from "../tool.js";
4
+ const person = v.pipe(v.string(), v.minLength(1), v.description("person id, or part of a known name"));
5
+ /** The address book's writes. `contacts import` has no tool: it takes phone numbers, from a file the owner names. */
6
+ export const contactWriteTools = (messenger) => {
7
+ const people = (adapter, guard) => servicesFor(onlineDeps(messenger, adapter, guard)).people;
8
+ const simple = (name, title, description) => tool({
9
+ title,
10
+ description: `${description} Only when the owner asked, for this person.`,
11
+ input: v.object({ person }),
12
+ annotations: WRITE,
13
+ _meta: APPROVE,
14
+ permission: "contacts",
15
+ online: (adapter, args, { guard }) => people(adapter, guard)[name](args.person),
16
+ });
17
+ return {
18
+ contacts_add: simple("add", "Add a contact", "Add a person to the owner's contacts."),
19
+ contacts_remove: simple("remove", "Remove a contact", "Remove a person from the owner's contacts; the chat stays."),
20
+ contacts_block: simple("block", "Block a person", "Stop a person from writing to the owner."),
21
+ contacts_unblock: simple("unblock", "Unblock a person", "Let a blocked person write to the owner again."),
22
+ contacts_rename: tool({
23
+ title: "Rename a contact",
24
+ description: "Give a person a name only the owner sees. Only when the owner asked for this name.",
25
+ input: v.object({
26
+ person,
27
+ first_name: v.pipe(v.string(), v.minLength(1)),
28
+ last_name: v.optional(v.string()),
29
+ }),
30
+ annotations: WRITE,
31
+ _meta: APPROVE,
32
+ permission: "contacts",
33
+ online: (adapter, args, { guard }) => people(adapter, guard).rename(args.person, args.first_name, args.last_name),
34
+ }),
35
+ };
36
+ };
37
+ //# sourceMappingURL=contacts-write.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contacts-write.js","sourceRoot":"","sources":["../../../src/mcp/tools/contacts-write.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAI5B,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AACjE,OAAO,EAAgB,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAE/D,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,oCAAoC,CAAC,CAAC,CAAA;AAEtG,qHAAqH;AACrH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,SAAoB,EAA2B,EAAE;IACjF,MAAM,MAAM,GAAG,CAAC,OAAyB,EAAE,KAAgB,EAAE,EAAE,CAC7D,WAAW,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAA;IAC3D,MAAM,MAAM,GAAG,CAAC,IAA4C,EAAE,KAAa,EAAE,WAAmB,EAAW,EAAE,CAC3G,IAAI,CAAC;QACH,KAAK;QACL,WAAW,EAAE,GAAG,WAAW,8CAA8C;QACzE,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAC3B,WAAW,EAAE,KAAK;QAClB,KAAK,EAAE,OAAO;QACd,UAAU,EAAE,UAAU;QACtB,MAAM,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;KAChF,CAAC,CAAA;IACJ,OAAO;QACL,YAAY,EAAE,MAAM,CAAC,KAAK,EAAE,eAAe,EAAE,uCAAuC,CAAC;QACrF,eAAe,EAAE,MAAM,CAAC,QAAQ,EAAE,kBAAkB,EAAE,4DAA4D,CAAC;QACnH,cAAc,EAAE,MAAM,CAAC,OAAO,EAAE,gBAAgB,EAAE,0CAA0C,CAAC;QAC7F,gBAAgB,EAAE,MAAM,CAAC,SAAS,EAAE,kBAAkB,EAAE,gDAAgD,CAAC;QACzG,eAAe,EAAE,IAAI,CAAC;YACpB,KAAK,EAAE,kBAAkB;YACzB,WAAW,EAAE,oFAAoF;YACjG,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;gBACd,MAAM;gBACN,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;gBAC9C,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;aAClC,CAAC;YACF,WAAW,EAAE,KAAK;YAClB,KAAK,EAAE,OAAO;YACd,UAAU,EAAE,UAAU;YACtB,MAAM,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC;SAClH,CAAC;KACH,CAAA;AACH,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAA;AAC5D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAmBxC;;;GAGG;AACH,eAAO,MAAM,SAAS,cAAe,SAAS,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAWrE,CAAA;AAEF,0GAA0G;AAC1G,eAAO,MAAM,aAAa,cAAe,SAAS,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAA8B,CAAA;AAEzG,kHAAkH;AAClH,eAAO,MAAM,WAAW,cAAe,SAAS,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAkC,CAAA;AAE3G,oFAAoF;AACpF,eAAO,MAAM,SAAS,cAAe,SAAS,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAOrE,CAAA"}
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAA;AAC5D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAoBxC;;;GAGG;AACH,eAAO,MAAM,SAAS,cAAe,SAAS,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAWrE,CAAA;AAEF,0GAA0G;AAC1G,eAAO,MAAM,aAAa,cAAe,SAAS,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAA8B,CAAA;AAEzG,kHAAkH;AAClH,eAAO,MAAM,WAAW,cAAe,SAAS,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAkC,CAAA;AAE3G,oFAAoF;AACpF,eAAO,MAAM,SAAS,cAAe,SAAS,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAQrE,CAAA"}
package/dist/mcp/tools.js CHANGED
@@ -3,6 +3,7 @@ import { adminTools } from "./tools/admin.js";
3
3
  import { chatsTools } from "./tools/chats.js";
4
4
  import { chatsReadTools } from "./tools/chats-read.js";
5
5
  import { contactsTools } from "./tools/contacts.js";
6
+ import { contactWriteTools } from "./tools/contacts-write.js";
6
7
  import { folderTools } from "./tools/folders.js";
7
8
  import { inboxTools } from "./tools/inbox.js";
8
9
  import { messagesTools } from "./tools/messages.js";
@@ -39,6 +40,7 @@ export const deleteTools = (messenger) => messageDeleteTools(messenger);
39
40
  export const sendTools = (messenger) => ({
40
41
  ...adminTools(messenger),
41
42
  ...folderTools(messenger),
43
+ ...contactWriteTools(messenger),
42
44
  ...messageSendTools(messenger),
43
45
  ...messageActionTools(messenger),
44
46
  ...reactionTools(messenger),
@@ -1 +1 @@
1
- {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAA;AACxE,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAE/C;;;GAGG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,SAAoB,EAA2B,EAAE,CAAC,CAAC;IAC3E,GAAG,UAAU,CAAC,SAAS,CAAC;IACxB,GAAG,WAAW,CAAC,SAAS,CAAC;IACzB,GAAG,WAAW,CAAC,SAAS,CAAC;IACzB,GAAG,YAAY,CAAC,SAAS,CAAC;IAC1B,GAAG,UAAU,CAAC,SAAS,CAAC;IACxB,GAAG,aAAa,CAAC,SAAS,CAAC;IAC3B,GAAG,aAAa,CAAC,SAAS,CAAC;IAC3B,GAAG,aAAa,CAAC,SAAS,CAAC;IAC3B,GAAG,kBAAkB,CAAC,SAAS,CAAC;IAChC,GAAG,uBAAuB,CAAC,SAAS,CAAC;CACtC,CAAC,CAAA;AAEF,0GAA0G;AAC1G,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,SAAoB,EAA2B,EAAE,CAAC,cAAc,CAAC,SAAS,CAAC,CAAA;AAEzG,kHAAkH;AAClH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,SAAoB,EAA2B,EAAE,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAA;AAE3G,oFAAoF;AACpF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,SAAoB,EAA2B,EAAE,CAAC,CAAC;IAC3E,GAAG,UAAU,CAAC,SAAS,CAAC;IACxB,GAAG,WAAW,CAAC,SAAS,CAAC;IACzB,GAAG,gBAAgB,CAAC,SAAS,CAAC;IAC9B,GAAG,kBAAkB,CAAC,SAAS,CAAC;IAChC,GAAG,aAAa,CAAC,SAAS,CAAC;IAC3B,GAAG,cAAc,CAAC,SAAS,CAAC;CAC7B,CAAC,CAAA"}
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAA;AACxE,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAE/C;;;GAGG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,SAAoB,EAA2B,EAAE,CAAC,CAAC;IAC3E,GAAG,UAAU,CAAC,SAAS,CAAC;IACxB,GAAG,WAAW,CAAC,SAAS,CAAC;IACzB,GAAG,WAAW,CAAC,SAAS,CAAC;IACzB,GAAG,YAAY,CAAC,SAAS,CAAC;IAC1B,GAAG,UAAU,CAAC,SAAS,CAAC;IACxB,GAAG,aAAa,CAAC,SAAS,CAAC;IAC3B,GAAG,aAAa,CAAC,SAAS,CAAC;IAC3B,GAAG,aAAa,CAAC,SAAS,CAAC;IAC3B,GAAG,kBAAkB,CAAC,SAAS,CAAC;IAChC,GAAG,uBAAuB,CAAC,SAAS,CAAC;CACtC,CAAC,CAAA;AAEF,0GAA0G;AAC1G,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,SAAoB,EAA2B,EAAE,CAAC,cAAc,CAAC,SAAS,CAAC,CAAA;AAEzG,kHAAkH;AAClH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,SAAoB,EAA2B,EAAE,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAA;AAE3G,oFAAoF;AACpF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,SAAoB,EAA2B,EAAE,CAAC,CAAC;IAC3E,GAAG,UAAU,CAAC,SAAS,CAAC;IACxB,GAAG,WAAW,CAAC,SAAS,CAAC;IACzB,GAAG,iBAAiB,CAAC,SAAS,CAAC;IAC/B,GAAG,gBAAgB,CAAC,SAAS,CAAC;IAC9B,GAAG,kBAAkB,CAAC,SAAS,CAAC;IAChC,GAAG,aAAa,CAAC,SAAS,CAAC;IAC3B,GAAG,cAAc,CAAC,SAAS,CAAC;CAC7B,CAAC,CAAA"}
@@ -1,4 +1,5 @@
1
- import type { Contact, Member, Page, PersonCard } from "../domain/models.js";
1
+ import type { Contact, Id, Member, Page, PersonCard, PhoneBookEntry } from "../domain/models.js";
2
+ import { type Operated } from "../sends/guarded.js";
2
3
  import type { PageWindow } from "./chats.js";
3
4
  import { type ServiceDeps } from "./deps.js";
4
5
  export interface ContactSync {
@@ -21,6 +22,26 @@ export interface PeopleService {
21
22
  lookup(phone: string): Promise<Member>;
22
23
  /** The whole contact list from the messenger into the store: what was new, what changed. */
23
24
  sync(): Promise<ContactSync>;
25
+ add(person: string): Promise<Operated<{
26
+ person: Member;
27
+ }>>;
28
+ remove(person: string): Promise<Operated<{
29
+ personId: Id;
30
+ }>>;
31
+ block(person: string): Promise<Operated<{
32
+ personId: Id;
33
+ }>>;
34
+ unblock(person: string): Promise<Operated<{
35
+ personId: Id;
36
+ }>>;
37
+ rename(person: string, firstName: string, lastName?: string): Promise<Operated<{
38
+ person: Member;
39
+ }>>;
40
+ /** Only counts and the people recognised: never a number. */
41
+ import(entries: PhoneBookEntry[]): Promise<Operated<{
42
+ sent: number;
43
+ recognised: Member[];
44
+ }>>;
24
45
  }
25
46
  export declare const peopleService: (deps: ServiceDeps) => PeopleService;
26
47
  /** Digits, with the `+` and the spaces, dashes and brackets people type dropped. */
@@ -1 +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;AAGlF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAC5C,OAAO,EAAE,KAAK,WAAW,EAAe,MAAM,WAAW,CAAA;AAEzD,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;CACd;AAED;;;;GAIG;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,aA2ChD,CAAA;AAEF,oFAAoF;AACpF,eAAO,MAAM,OAAO,UAAW,MAAM,KAAG,MAMvC,CAAA"}
1
+ {"version":3,"file":"people.d.ts","sourceRoot":"","sources":["../../src/services/people.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAQ,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAEtG,OAAO,EAAgB,KAAK,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAGjE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAC5C,OAAO,EAAE,KAAK,WAAW,EAAe,MAAM,WAAW,CAAA;AAEzD,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;CACd;AAED;;;;GAIG;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;IAC5B,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAA;IAC1D,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;QAAE,QAAQ,EAAE,EAAE,CAAA;KAAE,CAAC,CAAC,CAAA;IAC3D,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;QAAE,QAAQ,EAAE,EAAE,CAAA;KAAE,CAAC,CAAC,CAAA;IAC1D,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;QAAE,QAAQ,EAAE,EAAE,CAAA;KAAE,CAAC,CAAC,CAAA;IAC5D,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAA;IACnG,6DAA6D;IAC7D,MAAM,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC,CAAA;CAC7F;AAID,eAAO,MAAM,aAAa,SAAU,WAAW,KAAG,aAqHjD,CAAA;AAED,oFAAoF;AACpF,eAAO,MAAM,OAAO,UAAW,MAAM,KAAG,MAMvC,CAAA"}
@@ -1,51 +1,102 @@
1
1
  import { CliError } from "@leemour/cli-core";
2
2
  import { capability } from "../cli/messenger/port.js";
3
3
  import { pickPerson } from "../resolve.js";
4
+ import { guardedWrite } from "../sends/guarded.js";
5
+ import { newOperationId } from "../sends/send-id.js";
4
6
  import { storeIfOpen } from "./deps.js";
5
- export const peopleService = (deps) => ({
6
- list: async (options) => {
7
- // The chats first: a messenger whose login brings its people writes them before the store is asked.
8
- const chats = deps.offline ? undefined : (await (await deps.connection()).chats({ offset: 0 })).items;
9
- const held = deps.offline ? { store: await deps.store(), account: await deps.account() } : await storeIfOpen(deps);
10
- if (held && (await held.store.countContacts(held.account)) > 0)
11
- return storedContacts(held.store, held.account, options);
12
- return contactsIn(chats ?? (await (await deps.store()).chats(await deps.account(), {})).items, options);
13
- },
14
- show: async (person) => {
15
- if (deps.offline) {
7
+ export const peopleService = (deps) => {
8
+ const online = async (command) => {
9
+ if (deps.offline)
10
+ throw new CliError("validation_error", `\`${command}\` changes the address book; not with --offline`);
11
+ return deps.connection();
12
+ };
13
+ const change = async (action, person, act) => {
14
+ const connection = await online(`contacts ${action.slice("contact-".length)}`);
15
+ const [personId] = await capability(connection, "people", "find people")([person]);
16
+ const operationId = newOperationId();
17
+ const done = await guardedWrite(deps.guard, { operationId, chatId: null, kind: "account", action }, () => act(connection, personId));
18
+ return { operationId, personId: personId, done };
19
+ };
20
+ return {
21
+ list: async (options) => {
22
+ // The chats first: a messenger whose login brings its people writes them before the store is asked.
23
+ const chats = deps.offline ? undefined : (await (await deps.connection()).chats({ offset: 0 })).items;
24
+ const held = deps.offline ? { store: await deps.store(), account: await deps.account() } : await storeIfOpen(deps);
25
+ if (held && (await held.store.countContacts(held.account)) > 0)
26
+ return storedContacts(held.store, held.account, options);
27
+ return contactsIn(chats ?? (await (await deps.store()).chats(await deps.account(), {})).items, options);
28
+ },
29
+ show: async (person) => {
30
+ if (deps.offline) {
31
+ const store = await deps.store();
32
+ const account = await deps.account();
33
+ const found = pickPerson(person, await store.people(account.provider, { account: account.account }));
34
+ return { ...found, chats: await sharedChats(store, account, found.id) };
35
+ }
36
+ const card = await (await deps.connection()).contact(person);
37
+ if (card.chats.length > 0)
38
+ return card;
39
+ const held = await storeIfOpen(deps);
40
+ return held ? { ...card, chats: await sharedChats(held.store, held.account, card.id) } : card;
41
+ },
42
+ lookup: async (phone) => capability(await deps.connection(), "lookup", "find a person by phone")(phone),
43
+ sync: async () => {
44
+ if (deps.offline) {
45
+ throw new CliError("validation_error", "`contacts sync` takes the list from the messenger; not with --offline");
46
+ }
47
+ const people = await capability(await deps.connection(), "addressBook", "list its contacts")();
16
48
  const store = await deps.store();
17
49
  const account = await deps.account();
18
- const found = pickPerson(person, await store.people(account.provider, { account: account.account }));
19
- return { ...found, chats: await sharedChats(store, account, found.id) };
20
- }
21
- const card = await (await deps.connection()).contact(person);
22
- if (card.chats.length > 0)
23
- return card;
24
- const held = await storeIfOpen(deps);
25
- return held ? { ...card, chats: await sharedChats(held.store, held.account, card.id) } : card;
26
- },
27
- lookup: async (phone) => capability(await deps.connection(), "lookup", "find a person by phone")(phone),
28
- sync: async () => {
29
- if (deps.offline) {
30
- throw new CliError("validation_error", "`contacts sync` takes the list from the messenger; not with --offline");
31
- }
32
- const people = await capability(await deps.connection(), "addressBook", "list its contacts")();
33
- const store = await deps.store();
34
- const account = await deps.account();
35
- const before = await store.people(account.provider, { account: account.account });
36
- let added = 0;
37
- let changed = 0;
38
- for (const person of people) {
39
- const known = before.get(person.id);
40
- if (!known)
41
- added += 1;
42
- else if (known.name !== person.name || known.username !== person.username)
43
- changed += 1;
44
- }
45
- await store.savePeople(account, people);
46
- return { added, changed, known: (await store.people(account.provider, { account: account.account })).all().length };
47
- },
48
- });
50
+ const before = await store.people(account.provider, { account: account.account });
51
+ let added = 0;
52
+ let changed = 0;
53
+ for (const person of people) {
54
+ const known = before.get(person.id);
55
+ if (!known)
56
+ added += 1;
57
+ else if (known.name !== person.name || known.username !== person.username)
58
+ changed += 1;
59
+ }
60
+ await store.savePeople(account, people);
61
+ return {
62
+ added,
63
+ changed,
64
+ known: (await store.people(account.provider, { account: account.account })).all().length,
65
+ };
66
+ },
67
+ add: async (person) => {
68
+ const { operationId, done } = await change("contact-add", person, (connection, id) => capability(connection, "addContact", "add a contact")(id));
69
+ return { operationId, person: done };
70
+ },
71
+ remove: async (person) => {
72
+ const { operationId, personId } = await change("contact-remove", person, (connection, id) => capability(connection, "removeContact", "remove a contact")(id));
73
+ return { operationId, personId };
74
+ },
75
+ block: async (person) => {
76
+ const { operationId, personId } = await change("contact-block", person, (connection, id) => capability(connection, "block", "block a person")(id));
77
+ return { operationId, personId };
78
+ },
79
+ unblock: async (person) => {
80
+ const { operationId, personId } = await change("contact-unblock", person, (connection, id) => capability(connection, "unblock", "unblock a person")(id));
81
+ return { operationId, personId };
82
+ },
83
+ rename: async (person, firstName, lastName) => {
84
+ if (firstName.trim() === "")
85
+ throw new CliError("validation_error", "a name cannot be empty");
86
+ const { operationId, done } = await change("contact-rename", person, (connection, id) => capability(connection, "renameContact", "rename a contact")(id, firstName.trim(), lastName?.trim()));
87
+ return { operationId, person: done };
88
+ },
89
+ import: async (entries) => {
90
+ if (entries.length === 0)
91
+ throw new CliError("validation_error", "the file names nobody");
92
+ const connection = await online("contacts import");
93
+ const importing = capability(connection, "importContacts", "import contacts");
94
+ const operationId = newOperationId();
95
+ const recognised = await guardedWrite(deps.guard, { operationId, chatId: null, kind: "account", action: "contact-import", count: entries.length }, () => importing(entries));
96
+ return { operationId, sent: entries.length, recognised };
97
+ },
98
+ };
99
+ };
49
100
  /** Digits, with the `+` and the spaces, dashes and brackets people type dropped. */
50
101
  export const phoneOf = (typed) => {
51
102
  const digits = typed.replace(/[\s()+-]/g, "");
@@ -1 +1 @@
1
- {"version":3,"file":"people.js","sourceRoot":"","sources":["../../src/services/people.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"people.js","sourceRoot":"","sources":["../../src/services/people.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@leemour/cli-messaging",
3
- "version": "0.85.0",
3
+ "version": "0.86.0",
4
4
  "description": "The messenger-neutral half of a messaging CLI: domain model, message locators, rendering, name resolution, the SQLite seam, the command skeleton and shared read commands, the send guard, run records and the message store",
5
5
  "license": "MIT",
6
6
  "author": "Viacheslav Ptsarev",
package/parity.json CHANGED
@@ -6,7 +6,8 @@
6
6
  },
7
7
  "--after": {
8
8
  "value": "<id-or-time>",
9
- "meaning": "read what came after this message id, this ISO 8601 time, or 2h / 1d ago; not with --before"
9
+ "meaning": "read what came after this message id, this ISO 8601 time, or 2h / 1d ago; not with --before",
10
+ "note": "`messages context --after <n>` is a count, not a position (e1)"
10
11
  },
11
12
  "--all": {
12
13
  "meaning": "every row, no paging"
@@ -55,7 +56,7 @@
55
56
  "--before": {
56
57
  "value": "<id-or-time>",
57
58
  "meaning": "read what came before this message id, this ISO 8601 time, or 2h / 1d ago",
58
- "note": "tg's `messages list` spells the value `<id>`"
59
+ "note": "`messages context --before <n>` is a count, not a position (e1); tg's `messages list` takes `<id>` only (e7)"
59
60
  },
60
61
  "--bot": {
61
62
  "meaning": "the bot section of the profile's settings, rather than the personal account's"
@@ -70,7 +71,7 @@
70
71
  "--chat": {
71
72
  "value": "<chat>",
72
73
  "meaning": "a chat, by id or name; repeat it for more",
73
- "note": "tg's `messages search` spells the value `<id>`; rule 6 says `<chat>`"
74
+ "note": "max's `messages search` takes `<id>` only, since searching never connects to resolve a name; rule 6 says `<chat>` (e8)"
74
75
  },
75
76
  "--check": {
76
77
  "meaning": "say whether a newer version exists, and install nothing"
@@ -96,13 +97,15 @@
96
97
  },
97
98
  "--event": {
98
99
  "value": "<names>",
99
- "meaning": "only these events, comma-separated, as the messenger names them"
100
+ "meaning": "only these events, comma-separated, as the messenger names them",
101
+ "note": "differs by one letter from `watch --events`, a switch with an unrelated meaning (e12)"
100
102
  },
101
103
  "--events": {
102
- "meaning": "also print edits, deletions and reactions; every line then names its event"
104
+ "meaning": "also print edits, deletions and reactions; every line then names its event",
105
+ "note": "differs by one letter from `chats events --event`, a filter with an unrelated meaning (e12)"
103
106
  },
104
107
  "--file": {
105
- "value": "<path>",
108
+ "value": "<file>",
106
109
  "meaning": "attach a file; images go as a photo, videos as a video. Repeat it for more"
107
110
  },
108
111
  "--first-name": {
@@ -114,14 +117,15 @@
114
117
  },
115
118
  "--format": {
116
119
  "value": "<format>",
117
- "meaning": "jsonl or md"
120
+ "meaning": "jsonl, one message per line, or a markdown transcript",
121
+ "note": "the shared `store export` takes `jsonl` or `markdown`, max's own takes `jsonl` or `md` (e4)"
118
122
  },
119
123
  "--history": {
120
124
  "meaning": "the people added also see the messages from before they came"
121
125
  },
122
126
  "--idle": {
123
127
  "value": "<duration>",
124
- "meaning": "stop after this long with nobody using it — 15m, 1h is 60m"
128
+ "meaning": "stop after this long with nobody using it — 15m, 1h"
125
129
  },
126
130
  "--json": {
127
131
  "meaning": "machine-readable output: one JSON value on stdout, nothing else"
@@ -131,8 +135,7 @@
131
135
  },
132
136
  "--kind": {
133
137
  "value": "<kind>",
134
- "meaning": "only chats of this kind: dialog, group or channel",
135
- "note": "max spells the value `<dialog|group|channel>`; the choices belong in the description"
138
+ "meaning": "only chats of this kind: dialog, group, channel or saved"
136
139
  },
137
140
  "--last": {
138
141
  "value": "<n>",
@@ -164,8 +167,8 @@
164
167
  },
165
168
  "--max-pages": {
166
169
  "value": "<n>",
167
- "meaning": "at most this many pages of 100 messages in one run",
168
- "default": "10"
170
+ "meaning": "at most this many pages in one run; a page is one request, and each messenger sets the default",
171
+ "note": "a page is 100 messages in tg and 30 in max — the same number fetches a different amount (e3)"
169
172
  },
170
173
  "--md": {
171
174
  "meaning": "read **bold**, _italic_, ~~struck~~ and `code` in the text; \\ keeps a mark literal"
@@ -224,7 +227,7 @@
224
227
  "--output": {
225
228
  "meaning": "where to write: a directory for `messages download`, a file for `store export`",
226
229
  "default": ".",
227
- "note": "clash: `<dir>` in one command, `<file>` in another"
230
+ "note": "`<dir>` in `messages download`, `<file>` in `store export` (e10)"
228
231
  },
229
232
  "--page": {
230
233
  "value": "<n>",
@@ -240,8 +243,7 @@
240
243
  },
241
244
  "--photo": {
242
245
  "value": "<file>",
243
- "meaning": "an image file — a profile photo in `account update`, a photo to send in `messages send`",
244
- "note": "tg's `messages send --photo` takes `<path>`; rule 6 says `<file>`"
246
+ "meaning": "an image file — a profile photo in `account update`, a photo to send in `messages send`"
245
247
  },
246
248
  "--qr-file": {
247
249
  "value": "<png>",
@@ -280,8 +282,7 @@
280
282
  },
281
283
  "--send-id": {
282
284
  "value": "<id>",
283
- "meaning": "reuse the id of an earlier send whose outcome is unknown; the messenger drops the duplicate",
284
- "note": "max spells the value `<n>`"
285
+ "meaning": "reuse the id of an earlier send whose outcome is unknown; the messenger drops the duplicate"
285
286
  },
286
287
  "--serve": {
287
288
  "meaning": "start `serve` in the background if it is not running (the default)"
@@ -295,7 +296,7 @@
295
296
  "--since": {
296
297
  "value": "<id-or-time>",
297
298
  "meaning": "from this message id, an ISO 8601 time, or 2h / 1d ago; each command says its default",
298
- "note": "the shared `chats events`, `store fetch`, `store export`, `inbox` and `review` take `<time>` only, never a message id: a Telegram id is a counter within one chat"
299
+ "note": "max takes a message id too; the shared `chats events`, `store fetch`, `store export`, `inbox` and `review` take a time only — a Telegram id is a counter within one chat (e6)"
299
300
  },
300
301
  "--stop": {
301
302
  "meaning": "stop this profile's server — the same as `server stop`"
@@ -319,8 +320,10 @@
319
320
  "meaning": "hear voice messages not heard yet, on this machine; slow, the model must be downloaded"
320
321
  },
321
322
  "--unanswered": {
322
- "value": "[hours]",
323
- "meaning": "only questions to you or a group's admins that nobody answered, asked at least this long ago; 24 hours if not given"
323
+ "value": "[duration]",
324
+ "meaning": "only questions to you or a group's admins that nobody answered, asked at least this long ago — 4h, 1d",
325
+ "note": "max's own `review` still takes bare hours until T6 moves it (e2)",
326
+ "default": "24h"
324
327
  },
325
328
  "--unread": {
326
329
  "meaning": "only chats with unread messages"
@@ -338,8 +341,7 @@
338
341
  },
339
342
  "--voice": {
340
343
  "value": "<file>",
341
- "meaning": "send an Ogg Opus file as a voice message, alone, with no text",
342
- "note": "max spells the value `<path>`; rule 6 says `<file>`"
344
+ "meaning": "send an Ogg Opus file as a voice message, alone, with no text"
343
345
  },
344
346
  "--yes": {
345
347
  "meaning": "go ahead without the question an ask level puts before a write"
@@ -423,16 +425,12 @@
423
425
  },
424
426
  "bot": {
425
427
  "state": "planned",
426
- "by": "tg bot — not scheduled",
428
+ "by": "P8",
427
429
  "subtree": true
428
430
  },
429
431
  "cache": {
430
- "state": "planned",
431
- "by": "T6"
432
- },
433
- "cache clear": {
434
- "state": "planned",
435
- "by": "T6"
432
+ "state": "max-only",
433
+ "reason": "max's local cache, removed when the store replaces it (T6 group 6); tg never had one"
436
434
  },
437
435
  "chats": {
438
436
  "state": "both"
@@ -467,43 +465,26 @@
467
465
  }
468
466
  },
469
467
  "chats folders": {
470
- "state": "planned",
471
- "by": "P2"
468
+ "state": "both"
472
469
  },
473
470
  "chats folders create": {
474
- "state": "planned",
475
- "by": "P2",
471
+ "state": "both",
476
472
  "options": {
477
- "--chat": {
478
- "state": "planned",
479
- "by": "P2"
480
- }
473
+ "--chat": "both"
481
474
  }
482
475
  },
483
476
  "chats folders delete": {
484
- "state": "planned",
485
- "by": "P2"
477
+ "state": "both"
486
478
  },
487
479
  "chats folders list": {
488
- "state": "planned",
489
- "by": "P2"
480
+ "state": "both"
490
481
  },
491
482
  "chats folders update": {
492
- "state": "planned",
493
- "by": "P2",
483
+ "state": "both",
494
484
  "options": {
495
- "--add": {
496
- "state": "planned",
497
- "by": "P2"
498
- },
499
- "--remove": {
500
- "state": "planned",
501
- "by": "P2"
502
- },
503
- "--title": {
504
- "state": "planned",
505
- "by": "P2"
506
- }
485
+ "--add": "both",
486
+ "--remove": "both",
487
+ "--title": "both"
507
488
  }
508
489
  },
509
490
  "chats inspect": {
@@ -649,12 +630,12 @@
649
630
  "options": {
650
631
  "--bot": {
651
632
  "state": "planned",
652
- "by": "tg bot — not scheduled"
633
+ "by": "P8"
653
634
  },
654
635
  "--defaults": "both",
655
636
  "--personal": {
656
637
  "state": "planned",
657
- "by": "tg bot — not scheduled"
638
+ "by": "P8"
658
639
  }
659
640
  }
660
641
  },
@@ -663,7 +644,7 @@
663
644
  "options": {
664
645
  "--bot": {
665
646
  "state": "planned",
666
- "by": "tg bot — not scheduled"
647
+ "by": "P8"
667
648
  }
668
649
  }
669
650
  },
@@ -672,12 +653,12 @@
672
653
  "options": {
673
654
  "--bot": {
674
655
  "state": "planned",
675
- "by": "tg bot — not scheduled"
656
+ "by": "P8"
676
657
  },
677
658
  "--defaults": "both",
678
659
  "--personal": {
679
660
  "state": "planned",
680
- "by": "tg bot — not scheduled"
661
+ "by": "P8"
681
662
  }
682
663
  }
683
664
  },