@leemour/cli-messaging 0.146.0 → 0.148.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/background/index.d.ts +1 -1
- package/dist/background/index.d.ts.map +1 -1
- package/dist/background/index.js +1 -1
- package/dist/background/index.js.map +1 -1
- package/dist/background/lock.d.ts +6 -0
- package/dist/background/lock.d.ts.map +1 -1
- package/dist/background/lock.js +31 -1
- package/dist/background/lock.js.map +1 -1
- package/dist/background/units.d.ts +1 -0
- package/dist/background/units.d.ts.map +1 -1
- package/dist/background/units.js +9 -0
- package/dist/background/units.js.map +1 -1
- package/dist/cli/bot/people.js +1 -1
- package/dist/cli/bot/people.js.map +1 -1
- package/dist/cli/config-command.d.ts.map +1 -1
- package/dist/cli/config-command.js +17 -3
- package/dist/cli/config-command.js.map +1 -1
- package/dist/cli/index.d.ts +6 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +5 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/messenger/backfill-command.d.ts.map +1 -1
- package/dist/cli/messenger/backfill-command.js +4 -0
- package/dist/cli/messenger/backfill-command.js.map +1 -1
- package/dist/cli/messenger/chats-command.d.ts.map +1 -1
- package/dist/cli/messenger/chats-command.js +2 -2
- package/dist/cli/messenger/chats-command.js.map +1 -1
- package/dist/cli/messenger/chats-members-command.d.ts.map +1 -1
- package/dist/cli/messenger/chats-members-command.js +35 -1
- package/dist/cli/messenger/chats-members-command.js.map +1 -1
- package/dist/cli/messenger/chats-stats-command.js +1 -1
- package/dist/cli/messenger/chats-stats-command.js.map +1 -1
- package/dist/cli/messenger/contacts-command.d.ts.map +1 -1
- package/dist/cli/messenger/contacts-command.js +45 -1
- package/dist/cli/messenger/contacts-command.js.map +1 -1
- package/dist/cli/messenger/context.d.ts +10 -1
- package/dist/cli/messenger/context.d.ts.map +1 -1
- package/dist/cli/messenger/context.js +21 -2
- package/dist/cli/messenger/context.js.map +1 -1
- package/dist/cli/messenger/conversations-command.d.ts.map +1 -1
- package/dist/cli/messenger/conversations-command.js +6 -20
- package/dist/cli/messenger/conversations-command.js.map +1 -1
- package/dist/cli/messenger/doctor-command.d.ts +14 -0
- package/dist/cli/messenger/doctor-command.d.ts.map +1 -1
- package/dist/cli/messenger/doctor-command.js +117 -6
- package/dist/cli/messenger/doctor-command.js.map +1 -1
- package/dist/cli/messenger/flood-command.d.ts +8 -0
- package/dist/cli/messenger/flood-command.d.ts.map +1 -0
- package/dist/cli/messenger/flood-command.js +31 -0
- package/dist/cli/messenger/flood-command.js.map +1 -0
- package/dist/cli/messenger/flooded.d.ts +12 -0
- package/dist/cli/messenger/flooded.d.ts.map +1 -0
- package/dist/cli/messenger/flooded.js +77 -0
- package/dist/cli/messenger/flooded.js.map +1 -0
- package/dist/cli/messenger/inbox.d.ts +1 -0
- package/dist/cli/messenger/inbox.d.ts.map +1 -1
- package/dist/cli/messenger/inbox.js +4 -3
- package/dist/cli/messenger/inbox.js.map +1 -1
- package/dist/cli/messenger/mcp-command.d.ts +12 -0
- package/dist/cli/messenger/mcp-command.d.ts.map +1 -1
- package/dist/cli/messenger/mcp-command.js +49 -3
- package/dist/cli/messenger/mcp-command.js.map +1 -1
- package/dist/cli/messenger/messages-search-command.d.ts +2 -0
- package/dist/cli/messenger/messages-search-command.d.ts.map +1 -1
- package/dist/cli/messenger/messages-search-command.js +49 -16
- package/dist/cli/messenger/messages-search-command.js.map +1 -1
- package/dist/cli/messenger/messages-stats-command.d.ts +2 -0
- package/dist/cli/messenger/messages-stats-command.d.ts.map +1 -1
- package/dist/cli/messenger/messages-stats-command.js +35 -11
- package/dist/cli/messenger/messages-stats-command.js.map +1 -1
- package/dist/cli/messenger/points.d.ts +2 -1
- package/dist/cli/messenger/points.d.ts.map +1 -1
- package/dist/cli/messenger/points.js +1 -0
- package/dist/cli/messenger/points.js.map +1 -1
- package/dist/cli/messenger/port.d.ts +25 -1
- package/dist/cli/messenger/port.d.ts.map +1 -1
- package/dist/cli/messenger/port.js.map +1 -1
- package/dist/cli/messenger/private-files.d.ts +25 -0
- package/dist/cli/messenger/private-files.d.ts.map +1 -0
- package/dist/cli/messenger/private-files.js +28 -0
- package/dist/cli/messenger/private-files.js.map +1 -0
- package/dist/cli/messenger/replies-command.d.ts +5 -0
- package/dist/cli/messenger/replies-command.d.ts.map +1 -0
- package/dist/cli/messenger/replies-command.js +78 -0
- package/dist/cli/messenger/replies-command.js.map +1 -0
- package/dist/cli/messenger/report.d.ts +5 -0
- package/dist/cli/messenger/report.d.ts.map +1 -1
- package/dist/cli/messenger/report.js +25 -7
- package/dist/cli/messenger/report.js.map +1 -1
- package/dist/cli/messenger/review.d.ts.map +1 -1
- package/dist/cli/messenger/review.js +5 -3
- package/dist/cli/messenger/review.js.map +1 -1
- package/dist/cli/messenger/searches-command.d.ts +5 -0
- package/dist/cli/messenger/searches-command.d.ts.map +1 -0
- package/dist/cli/messenger/searches-command.js +117 -0
- package/dist/cli/messenger/searches-command.js.map +1 -0
- package/dist/cli/messenger/serve-command.d.ts.map +1 -1
- package/dist/cli/messenger/serve-command.js +87 -8
- package/dist/cli/messenger/serve-command.js.map +1 -1
- package/dist/cli/messenger/server-command.d.ts.map +1 -1
- package/dist/cli/messenger/server-command.js +25 -2
- package/dist/cli/messenger/server-command.js.map +1 -1
- package/dist/cli/messenger/store-maintenance-command.d.ts.map +1 -1
- package/dist/cli/messenger/store-maintenance-command.js +105 -4
- package/dist/cli/messenger/store-maintenance-command.js.map +1 -1
- package/dist/cli/messenger/tags-command.d.ts +5 -0
- package/dist/cli/messenger/tags-command.d.ts.map +1 -0
- package/dist/cli/messenger/tags-command.js +76 -0
- package/dist/cli/messenger/tags-command.js.map +1 -0
- package/dist/cli/messenger/watch-command.d.ts +4 -1
- package/dist/cli/messenger/watch-command.d.ts.map +1 -1
- package/dist/cli/messenger/watch-command.js +2 -1
- package/dist/cli/messenger/watch-command.js.map +1 -1
- package/dist/cli/store-settings.d.ts +26 -0
- package/dist/cli/store-settings.d.ts.map +1 -0
- package/dist/cli/store-settings.js +59 -0
- package/dist/cli/store-settings.js.map +1 -0
- package/dist/domain/models.d.ts +11 -1
- package/dist/domain/models.d.ts.map +1 -1
- package/dist/domain/tags.d.ts +6 -0
- package/dist/domain/tags.d.ts.map +1 -0
- package/dist/domain/tags.js +15 -0
- package/dist/domain/tags.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/kit/contract.d.ts.map +1 -1
- package/dist/kit/contract.js +6 -2
- package/dist/kit/contract.js.map +1 -1
- package/dist/mcp/personal.d.ts.map +1 -1
- package/dist/mcp/personal.js +2 -1
- package/dist/mcp/personal.js.map +1 -1
- package/dist/mcp/prompts.d.ts.map +1 -1
- package/dist/mcp/prompts.js +27 -8
- package/dist/mcp/prompts.js.map +1 -1
- package/dist/mcp/tool.d.ts +5 -0
- package/dist/mcp/tool.d.ts.map +1 -1
- package/dist/mcp/tool.js +12 -1
- package/dist/mcp/tool.js.map +1 -1
- package/dist/mcp/tools/chats.d.ts.map +1 -1
- package/dist/mcp/tools/chats.js +22 -4
- package/dist/mcp/tools/chats.js.map +1 -1
- package/dist/mcp/tools/contacts.d.ts.map +1 -1
- package/dist/mcp/tools/contacts.js +21 -1
- package/dist/mcp/tools/contacts.js.map +1 -1
- package/dist/mcp/tools/conversations.d.ts.map +1 -1
- package/dist/mcp/tools/conversations.js +2 -7
- package/dist/mcp/tools/conversations.js.map +1 -1
- package/dist/mcp/tools/inbox.d.ts +2 -0
- package/dist/mcp/tools/inbox.d.ts.map +1 -1
- package/dist/mcp/tools/inbox.js +27 -4
- package/dist/mcp/tools/inbox.js.map +1 -1
- package/dist/mcp/tools/messages.d.ts.map +1 -1
- package/dist/mcp/tools/messages.js +8 -2
- package/dist/mcp/tools/messages.js.map +1 -1
- package/dist/mcp/tools/review.d.ts.map +1 -1
- package/dist/mcp/tools/review.js +23 -2
- package/dist/mcp/tools/review.js.map +1 -1
- package/dist/mcp/tools/search.d.ts +6 -3
- package/dist/mcp/tools/search.d.ts.map +1 -1
- package/dist/mcp/tools/search.js +48 -11
- package/dist/mcp/tools/search.js.map +1 -1
- package/dist/mcp/tools/searches.d.ts +4 -0
- package/dist/mcp/tools/searches.d.ts.map +1 -0
- package/dist/mcp/tools/searches.js +77 -0
- package/dist/mcp/tools/searches.js.map +1 -0
- package/dist/mcp/tools/tags.d.ts +4 -0
- package/dist/mcp/tools/tags.d.ts.map +1 -0
- package/dist/mcp/tools/tags.js +57 -0
- package/dist/mcp/tools/tags.js.map +1 -0
- package/dist/mcp/tools.d.ts +2 -0
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +7 -0
- package/dist/mcp/tools.js.map +1 -1
- package/dist/replies/decide.d.ts +37 -0
- package/dist/replies/decide.d.ts.map +1 -0
- package/dist/replies/decide.js +112 -0
- package/dist/replies/decide.js.map +1 -0
- package/dist/replies/dry-run.d.ts +51 -0
- package/dist/replies/dry-run.d.ts.map +1 -0
- package/dist/replies/dry-run.js +116 -0
- package/dist/replies/dry-run.js.map +1 -0
- package/dist/replies/rules.d.ts +139 -0
- package/dist/replies/rules.d.ts.map +1 -0
- package/dist/replies/rules.js +128 -0
- package/dist/replies/rules.js.map +1 -0
- package/dist/replies/serve.d.ts +44 -0
- package/dist/replies/serve.d.ts.map +1 -0
- package/dist/replies/serve.js +70 -0
- package/dist/replies/serve.js.map +1 -0
- package/dist/replies/state.d.ts +36 -0
- package/dist/replies/state.d.ts.map +1 -0
- package/dist/replies/state.js +67 -0
- package/dist/replies/state.js.map +1 -0
- package/dist/search/lucene/automaton.d.ts +5 -0
- package/dist/search/lucene/automaton.d.ts.map +1 -1
- package/dist/search/lucene/automaton.js +116 -0
- package/dist/search/lucene/automaton.js.map +1 -1
- package/dist/search/lucene/parser.d.ts.map +1 -1
- package/dist/search/lucene/parser.js +6 -2
- package/dist/search/lucene/parser.js.map +1 -1
- package/dist/search/lucene/registry.d.ts +5 -5
- package/dist/search/lucene/registry.d.ts.map +1 -1
- package/dist/search/lucene/registry.js +12 -7
- package/dist/search/lucene/registry.js.map +1 -1
- package/dist/search/search.d.ts.map +1 -1
- package/dist/search/search.js +4 -3
- package/dist/search/search.js.map +1 -1
- package/dist/sends/flood.d.ts +57 -0
- package/dist/sends/flood.d.ts.map +1 -0
- package/dist/sends/flood.js +90 -0
- package/dist/sends/flood.js.map +1 -0
- package/dist/sends/guard.d.ts +4 -1
- package/dist/sends/guard.d.ts.map +1 -1
- package/dist/sends/guard.js +9 -1
- package/dist/sends/guard.js.map +1 -1
- package/dist/sends/index.d.ts +1 -0
- package/dist/sends/index.d.ts.map +1 -1
- package/dist/sends/index.js +1 -0
- package/dist/sends/index.js.map +1 -1
- package/dist/sends/journal.d.ts +2 -0
- package/dist/sends/journal.d.ts.map +1 -1
- package/dist/sends/journal.js.map +1 -1
- package/dist/sends/permissions.d.ts +1 -1
- package/dist/sends/permissions.d.ts.map +1 -1
- package/dist/sends/permissions.js +13 -1
- package/dist/sends/permissions.js.map +1 -1
- package/dist/services/archive.d.ts.map +1 -1
- package/dist/services/archive.js +4 -2
- package/dist/services/archive.js.map +1 -1
- package/dist/services/chat-stats.d.ts +3 -0
- package/dist/services/chat-stats.d.ts.map +1 -1
- package/dist/services/chat-stats.js +3 -0
- package/dist/services/chat-stats.js.map +1 -1
- package/dist/services/chats.d.ts +13 -3
- package/dist/services/chats.d.ts.map +1 -1
- package/dist/services/chats.js +63 -2
- package/dist/services/chats.js.map +1 -1
- package/dist/services/deps.d.ts +2 -0
- package/dist/services/deps.d.ts.map +1 -1
- package/dist/services/deps.js.map +1 -1
- package/dist/services/inbox.d.ts +0 -2
- package/dist/services/inbox.d.ts.map +1 -1
- package/dist/services/inbox.js +13 -8
- package/dist/services/inbox.js.map +1 -1
- package/dist/services/index.d.ts +8 -0
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +6 -0
- package/dist/services/index.js.map +1 -1
- package/dist/services/members-audit.d.ts +44 -0
- package/dist/services/members-audit.d.ts.map +1 -0
- package/dist/services/members-audit.js +111 -0
- package/dist/services/members-audit.js.map +1 -0
- package/dist/services/messages-search.d.ts +6 -4
- package/dist/services/messages-search.d.ts.map +1 -1
- package/dist/services/messages-search.js +24 -8
- package/dist/services/messages-search.js.map +1 -1
- package/dist/services/messages.d.ts +10 -3
- package/dist/services/messages.d.ts.map +1 -1
- package/dist/services/messages.js +48 -5
- package/dist/services/messages.js.map +1 -1
- package/dist/services/people.d.ts +7 -0
- package/dist/services/people.d.ts.map +1 -1
- package/dist/services/people.js +18 -0
- package/dist/services/people.js.map +1 -1
- package/dist/services/person-context.d.ts +69 -0
- package/dist/services/person-context.d.ts.map +1 -0
- package/dist/services/person-context.js +130 -0
- package/dist/services/person-context.js.map +1 -0
- package/dist/services/searches.d.ts +50 -0
- package/dist/services/searches.d.ts.map +1 -0
- package/dist/services/searches.js +127 -0
- package/dist/services/searches.js.map +1 -0
- package/dist/services/tags.d.ts +40 -0
- package/dist/services/tags.d.ts.map +1 -0
- package/dist/services/tags.js +56 -0
- package/dist/services/tags.js.map +1 -0
- package/dist/store/index.d.ts +1 -1
- package/dist/store/index.d.ts.map +1 -1
- package/dist/store/index.js.map +1 -1
- package/dist/store/normalize.d.ts +2 -0
- package/dist/store/normalize.d.ts.map +1 -1
- package/dist/store/normalize.js +7 -5
- package/dist/store/normalize.js.map +1 -1
- package/dist/store/repair.d.ts +55 -0
- package/dist/store/repair.d.ts.map +1 -0
- package/dist/store/repair.js +313 -0
- package/dist/store/repair.js.map +1 -0
- package/dist/store/sqlite/accounts.d.ts.map +1 -1
- package/dist/store/sqlite/accounts.js +3 -1
- package/dist/store/sqlite/accounts.js.map +1 -1
- package/dist/store/sqlite/chats.d.ts.map +1 -1
- package/dist/store/sqlite/chats.js +3 -1
- package/dist/store/sqlite/chats.js.map +1 -1
- package/dist/store/sqlite/completeness.d.ts +10 -1
- package/dist/store/sqlite/completeness.d.ts.map +1 -1
- package/dist/store/sqlite/completeness.js +15 -3
- package/dist/store/sqlite/completeness.js.map +1 -1
- package/dist/store/sqlite/drizzle/bun.js +1 -1
- package/dist/store/sqlite/drizzle/core.d.ts +1 -1
- package/dist/store/sqlite/drizzle/core.d.ts.map +1 -1
- package/dist/store/sqlite/drizzle/core.js +3 -1
- package/dist/store/sqlite/drizzle/core.js.map +1 -1
- package/dist/store/sqlite/drizzle/node.js +1 -1
- package/dist/store/sqlite/drizzle/{shared-WZFJ4TMA.js → shared-IZ6QGA7N.js} +2 -1
- package/dist/store/sqlite/lucene.d.ts.map +1 -1
- package/dist/store/sqlite/lucene.js +17 -3
- package/dist/store/sqlite/lucene.js.map +1 -1
- package/dist/store/sqlite/manifest.d.ts.map +1 -1
- package/dist/store/sqlite/manifest.js +6 -0
- package/dist/store/sqlite/manifest.js.map +1 -1
- package/dist/store/sqlite/migrations.generated.d.ts.map +1 -1
- package/dist/store/sqlite/migrations.generated.js +53 -0
- package/dist/store/sqlite/migrations.generated.js.map +1 -1
- package/dist/store/sqlite/person-links.d.ts +18 -0
- package/dist/store/sqlite/person-links.d.ts.map +1 -0
- package/dist/store/sqlite/person-links.js +122 -0
- package/dist/store/sqlite/person-links.js.map +1 -0
- package/dist/store/sqlite/roster.d.ts +57 -0
- package/dist/store/sqlite/roster.d.ts.map +1 -0
- package/dist/store/sqlite/roster.js +179 -0
- package/dist/store/sqlite/roster.js.map +1 -0
- package/dist/store/sqlite/schema.d.ts +753 -0
- package/dist/store/sqlite/schema.d.ts.map +1 -1
- package/dist/store/sqlite/schema.js +99 -0
- package/dist/store/sqlite/schema.js.map +1 -1
- package/dist/store/sqlite/search-index.d.ts +3 -0
- package/dist/store/sqlite/search-index.d.ts.map +1 -1
- package/dist/store/sqlite/search-index.js +8 -6
- package/dist/store/sqlite/search-index.js.map +1 -1
- package/dist/store/sqlite/search.d.ts +2 -0
- package/dist/store/sqlite/search.d.ts.map +1 -1
- package/dist/store/sqlite/search.js +5 -0
- package/dist/store/sqlite/search.js.map +1 -1
- package/dist/store/sqlite/searches.d.ts +35 -0
- package/dist/store/sqlite/searches.d.ts.map +1 -0
- package/dist/store/sqlite/searches.js +77 -0
- package/dist/store/sqlite/searches.js.map +1 -0
- package/dist/store/sqlite/stems.d.ts +61 -0
- package/dist/store/sqlite/stems.d.ts.map +1 -0
- package/dist/store/sqlite/stems.js +215 -0
- package/dist/store/sqlite/stems.js.map +1 -0
- package/dist/store/sqlite/tags.d.ts +38 -0
- package/dist/store/sqlite/tags.d.ts.map +1 -0
- package/dist/store/sqlite/tags.js +85 -0
- package/dist/store/sqlite/tags.js.map +1 -0
- package/dist/store/store.d.ts +99 -1
- package/dist/store/store.d.ts.map +1 -1
- package/dist/store/store.js +115 -2
- package/dist/store/store.js.map +1 -1
- package/package.json +1 -1
- package/parity.json +254 -30
- /package/dist/store/sqlite/drizzle/{shared-WZFJ4TMA.js.map → shared-IZ6QGA7N.js.map} +0 -0
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export interface ModeProblem {
|
|
2
|
+
path: string;
|
|
3
|
+
mode: string;
|
|
4
|
+
want: string;
|
|
5
|
+
fix: string;
|
|
6
|
+
}
|
|
7
|
+
export type PrivateFiles = {
|
|
8
|
+
checked: false;
|
|
9
|
+
reason: string;
|
|
10
|
+
} | {
|
|
11
|
+
checked: true;
|
|
12
|
+
ok: boolean;
|
|
13
|
+
problems: ModeProblem[];
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Whether anybody but the owner can read these files or enter these folders. Only `stat`, never an
|
|
17
|
+
* open: the session is among them. Read-only for the owner is fine, so only group and other bits count.
|
|
18
|
+
*/
|
|
19
|
+
export declare const privateFiles: ({ files, dirs }: {
|
|
20
|
+
files: string[];
|
|
21
|
+
dirs: string[];
|
|
22
|
+
}, platform?: NodeJS.Platform) => PrivateFiles;
|
|
23
|
+
/** A SQLite database in write-ahead mode keeps its newest pages beside it. */
|
|
24
|
+
export declare const withSqliteSidecars: (path: string) => string[];
|
|
25
|
+
//# sourceMappingURL=private-files.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"private-files.d.ts","sourceRoot":"","sources":["../../../src/cli/messenger/private-files.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,MAAM,YAAY,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,EAAE,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,WAAW,EAAE,CAAA;CAAE,CAAA;AAIvH;;;GAGG;AACH,eAAO,MAAM,YAAY,oBACN;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,aAC1C,MAAM,CAAC,QAAQ,KACxB,YAaF,CAAA;AAED,8EAA8E;AAC9E,eAAO,MAAM,kBAAkB,SAAU,MAAM,KAAG,MAAM,EAA0C,CAAA"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { existsSync, statSync } from "node:fs";
|
|
2
|
+
const shellQuoted = (path) => `'${path.replaceAll("'", `'\\''`)}'`;
|
|
3
|
+
/**
|
|
4
|
+
* Whether anybody but the owner can read these files or enter these folders. Only `stat`, never an
|
|
5
|
+
* open: the session is among them. Read-only for the owner is fine, so only group and other bits count.
|
|
6
|
+
*/
|
|
7
|
+
export const privateFiles = ({ files, dirs }, platform = process.platform) => {
|
|
8
|
+
if (platform === "win32")
|
|
9
|
+
return { checked: false, reason: "Windows has no Unix file modes" };
|
|
10
|
+
const problems = [];
|
|
11
|
+
const check = (path, want) => {
|
|
12
|
+
if (!existsSync(path))
|
|
13
|
+
return;
|
|
14
|
+
const mode = statSync(path).mode & 0o777;
|
|
15
|
+
if ((mode & 0o077) === 0)
|
|
16
|
+
return;
|
|
17
|
+
const octal = (value) => `0${value.toString(8)}`;
|
|
18
|
+
problems.push({ path, mode: octal(mode), want: octal(want), fix: `chmod ${want.toString(8)} ${shellQuoted(path)}` });
|
|
19
|
+
};
|
|
20
|
+
for (const file of files)
|
|
21
|
+
check(file, 0o600);
|
|
22
|
+
for (const dir of dirs)
|
|
23
|
+
check(dir, 0o700);
|
|
24
|
+
return { checked: true, ok: problems.length === 0, problems };
|
|
25
|
+
};
|
|
26
|
+
/** A SQLite database in write-ahead mode keeps its newest pages beside it. */
|
|
27
|
+
export const withSqliteSidecars = (path) => [path, `${path}-wal`, `${path}-shm`];
|
|
28
|
+
//# sourceMappingURL=private-files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"private-files.js","sourceRoot":"","sources":["../../../src/cli/messenger/private-files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAW9C,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAA;AAE1E;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,EAAE,KAAK,EAAE,IAAI,EAAuC,EACpD,QAAQ,GAAoB,OAAO,CAAC,QAAQ,EAC9B,EAAE;IAChB,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,gCAAgC,EAAE,CAAA;IAC7F,MAAM,QAAQ,GAAkB,EAAE,CAAA;IAClC,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,IAAY,EAAE,EAAE;QAC3C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAM;QAC7B,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,KAAK,CAAA;QACxC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC;YAAE,OAAM;QAChC,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAA;QACxD,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,SAAS,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAA;IACtH,CAAC,CAAA;IACD,KAAK,MAAM,IAAI,IAAI,KAAK;QAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;IAC5C,KAAK,MAAM,GAAG,IAAI,IAAI;QAAE,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;IACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAA;AAC/D,CAAC,CAAA;AAED,8EAA8E;AAC9E,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,IAAY,EAAY,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,IAAI,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,CAAA"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { type Messenger } from "./context.js";
|
|
3
|
+
/** `replies`: rules that answer messages for the owner, from `serve`, and only to its test accounts (`NEED-601`). */
|
|
4
|
+
export declare const repliesCommand: (messenger: Messenger) => Command;
|
|
5
|
+
//# sourceMappingURL=replies-command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replies-command.d.ts","sourceRoot":"","sources":["../../../src/cli/messenger/replies-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAMnC,OAAO,EAAE,KAAK,SAAS,EAAoB,MAAM,cAAc,CAAA;AAE/D,qHAAqH;AACrH,eAAO,MAAM,cAAc,cAAe,SAAS,KAAG,OAoFrD,CAAA"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { DRY_RUN_DAYS, dryRun } from "../../replies/dry-run.js";
|
|
3
|
+
import { readReplies, repliesPathFor } from "../../replies/rules.js";
|
|
4
|
+
import { paused, readRepliesState, repliesStatePathFor, writeRepliesState } from "../../replies/state.js";
|
|
5
|
+
import { levelFor } from "../../sends/permissions.js";
|
|
6
|
+
import { momentOf } from "../../services/moment.js";
|
|
7
|
+
import { messengerContext } from "./context.js";
|
|
8
|
+
/** `replies`: rules that answer messages for the owner, from `serve`, and only to its test accounts (`NEED-601`). */
|
|
9
|
+
export const repliesCommand = (messenger) => {
|
|
10
|
+
const replies = new Command("replies").description("rules that answer messages for you, kept in a file of this profile");
|
|
11
|
+
replies
|
|
12
|
+
.command("test")
|
|
13
|
+
.description("what the rules would have answered in the stored messages, to whom and why — sends nothing, " +
|
|
14
|
+
"changes nothing, never connects")
|
|
15
|
+
.argument("[rule]", "only this rule, by its id; every rule in file order if not given")
|
|
16
|
+
.option("--since-time <time>", `from this ISO 8601 time, or 2h / 1d ago; ${DRY_RUN_DAYS}d ago if not given`)
|
|
17
|
+
.action(async function (rule) {
|
|
18
|
+
const { sinceTime } = this.opts();
|
|
19
|
+
const context = messengerContext(this, messenger);
|
|
20
|
+
const { settings, renderer, format, streams, env } = context;
|
|
21
|
+
const since = momentOf(sinceTime ?? `${DRY_RUN_DAYS}d`, "--since-time");
|
|
22
|
+
const path = repliesPathFor(messenger.app, settings.profile, env);
|
|
23
|
+
const { rules, testers } = readReplies(path);
|
|
24
|
+
if (rules.length === 0) {
|
|
25
|
+
renderer.note(`no reply rules yet — they live in ${path}`);
|
|
26
|
+
}
|
|
27
|
+
const found = await context.withStore((store, account) => dryRun(store, account, rules, { since, testers, ...(rule === undefined ? {} : { only: rule }) }), { name: "replies test" });
|
|
28
|
+
if (found.botUnknown > 0) {
|
|
29
|
+
renderer.note(`${found.botUnknown} sender(s) not known as bot or person; taken as people`);
|
|
30
|
+
}
|
|
31
|
+
renderer.note(`only what this machine has stored from ${found.since} to ${found.until} was read`);
|
|
32
|
+
if (format !== "pretty") {
|
|
33
|
+
renderer.result(found);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
const lines = found.rules.flatMap(({ id, would, skipped }) => [
|
|
37
|
+
`${id}: would answer ${would.length}`,
|
|
38
|
+
...would.map((one) => ` ${one.at} ${one.chatTitle ?? one.chatId} → ${one.to.name ?? one.to.id}: ${JSON.stringify(one.text)}`),
|
|
39
|
+
...Object.entries(skipped)
|
|
40
|
+
.sort(([, a], [, b]) => b - a)
|
|
41
|
+
.map(([why, count]) => ` passed over ${count}: ${why}`),
|
|
42
|
+
]);
|
|
43
|
+
streams.data(`${lines.join("\n")}\n`);
|
|
44
|
+
});
|
|
45
|
+
const switched = (on) => async function () {
|
|
46
|
+
const { settings, renderer, env } = messengerContext(this, messenger);
|
|
47
|
+
const path = repliesStatePathFor(messenger.app, settings.profile, env);
|
|
48
|
+
writeRepliesState(path, paused(readRepliesState(path), on));
|
|
49
|
+
renderer.note(on ? "reply rules paused — a running serve stops answering now" : "reply rules on again");
|
|
50
|
+
renderer.result({ paused: on });
|
|
51
|
+
};
|
|
52
|
+
replies
|
|
53
|
+
.command("pause")
|
|
54
|
+
.description("stop every reply rule of this profile at once, a running serve too; resume undoes it")
|
|
55
|
+
.action(switched(true));
|
|
56
|
+
replies.command("resume").description("let the reply rules answer again after pause").action(switched(false));
|
|
57
|
+
replies
|
|
58
|
+
.command("status")
|
|
59
|
+
.description("whether the rules may send, which are on, and who they may answer")
|
|
60
|
+
.action(async function () {
|
|
61
|
+
const { settings, renderer, env } = messengerContext(this, messenger);
|
|
62
|
+
const { rules, testers } = readReplies(repliesPathFor(messenger.app, settings.profile, env));
|
|
63
|
+
const state = readRepliesState(repliesStatePathFor(messenger.app, settings.profile, env));
|
|
64
|
+
const level = levelFor(settings.permissions ?? {}, "replies.send").level;
|
|
65
|
+
if (level !== "allow")
|
|
66
|
+
renderer.note(`replies.send is ${level}: serve sends nothing until it is allow`);
|
|
67
|
+
if (testers.length === 0)
|
|
68
|
+
renderer.note("no test accounts named in testers: serve answers nobody");
|
|
69
|
+
renderer.result({
|
|
70
|
+
paused: state.paused,
|
|
71
|
+
send: level,
|
|
72
|
+
testers: testers.length,
|
|
73
|
+
rules: rules.map(({ id, on }) => ({ id, on })),
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
return replies;
|
|
77
|
+
};
|
|
78
|
+
//# sourceMappingURL=replies-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replies-command.js","sourceRoot":"","sources":["../../../src/cli/messenger/replies-command.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,5 +27,10 @@ export declare const buildReport: ({ doctor, runsDir, runId, command, sends, now
|
|
|
27
27
|
now?: Date;
|
|
28
28
|
home: string | undefined;
|
|
29
29
|
}) => Report;
|
|
30
|
+
/**
|
|
31
|
+
* Every field of a journal line that names a chat, a message or a write. A send's `operationId` is
|
|
32
|
+
* its `sendId`, so one left raw would undo the other's label.
|
|
33
|
+
*/
|
|
34
|
+
export declare const SEND_ID_FIELDS: readonly ["chatId", "messageId", "replyTo", "threadId", "resultChatId", "sendId", "operationId", "parentOperationId", "reservation"];
|
|
30
35
|
export declare const reportFileName: (app: string, now: Date) => string;
|
|
31
36
|
//# sourceMappingURL=report.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../../src/cli/messenger/report.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AACvD,OAAO,EAAqB,KAAK,WAAW,EAAc,MAAM,gBAAgB,CAAA;AAIhF,MAAM,WAAW,MAAM;IACrB,SAAS,EAAE,MAAM,CAAA;IACjB,6FAA6F;IAC7F,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC/B,iFAAiF;IACjF,GAAG,EAAE;QAAE,QAAQ,EAAE,WAAW,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;KAAE,GAAG,IAAI,CAAA;IACxE,yFAAyF;IACzF,KAAK,EAAE,SAAS,EAAE,CAAA;CACnB;AAeD;;;;GAIG;AACH,eAAO,MAAM,WAAW,2DAQrB;IACD,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC/B,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,wEAAwE;IACxE,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,SAAS,EAAE,CAAA;IAClB,GAAG,CAAC,EAAE,IAAI,CAAA;IACV,IAAI,EAAE,MAAM,GAAG,SAAS,CAAA;CACzB,KAAG,
|
|
1
|
+
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../../src/cli/messenger/report.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AACvD,OAAO,EAAqB,KAAK,WAAW,EAAc,MAAM,gBAAgB,CAAA;AAIhF,MAAM,WAAW,MAAM;IACrB,SAAS,EAAE,MAAM,CAAA;IACjB,6FAA6F;IAC7F,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC/B,iFAAiF;IACjF,GAAG,EAAE;QAAE,QAAQ,EAAE,WAAW,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;KAAE,GAAG,IAAI,CAAA;IACxE,yFAAyF;IACzF,KAAK,EAAE,SAAS,EAAE,CAAA;CACnB;AAeD;;;;GAIG;AACH,eAAO,MAAM,WAAW,2DAQrB;IACD,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC/B,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,wEAAwE;IACxE,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,SAAS,EAAE,CAAA;IAClB,GAAG,CAAC,EAAE,IAAI,CAAA;IACV,IAAI,EAAE,MAAM,GAAG,SAAS,CAAA;CACzB,KAAG,MAiBH,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,cAAc,sIAUsB,CAAA;AAWjD,eAAO,MAAM,cAAc,QAAS,MAAM,OAAO,IAAI,KAAG,MAIrB,CAAA"}
|
|
@@ -33,16 +33,34 @@ export const buildReport = ({ doctor, runsDir, runId, command, sends, now = new
|
|
|
33
33
|
...(account?.remembered ? { account: { ...account, remembered: label(account.remembered) } } : {}),
|
|
34
34
|
},
|
|
35
35
|
run: chosen ? { metadata: chosen.metadata, events: readEvents(chosen.dir).map(eventOf(label)) } : null,
|
|
36
|
-
sends: sends.slice(-RECENT_SENDS).map((entry) => (
|
|
37
|
-
...entry,
|
|
38
|
-
chatId: entry.chatId === null ? null : label(entry.chatId),
|
|
39
|
-
...(entry.messageId === undefined ? {} : { messageId: label(entry.messageId) }),
|
|
40
|
-
...(entry.replyTo === undefined ? {} : { replyTo: label(entry.replyTo) }),
|
|
41
|
-
...(entry.sendId === undefined ? {} : { sendId: label(entry.sendId) }),
|
|
42
|
-
})),
|
|
36
|
+
sends: sends.slice(-RECENT_SENDS).map((entry) => labelled(entry, label)),
|
|
43
37
|
};
|
|
44
38
|
return JSON.parse(hideHome(JSON.stringify(report), home));
|
|
45
39
|
};
|
|
40
|
+
/**
|
|
41
|
+
* Every field of a journal line that names a chat, a message or a write. A send's `operationId` is
|
|
42
|
+
* its `sendId`, so one left raw would undo the other's label.
|
|
43
|
+
*/
|
|
44
|
+
export const SEND_ID_FIELDS = [
|
|
45
|
+
"chatId",
|
|
46
|
+
"messageId",
|
|
47
|
+
"replyTo",
|
|
48
|
+
"threadId",
|
|
49
|
+
"resultChatId",
|
|
50
|
+
"sendId",
|
|
51
|
+
"operationId",
|
|
52
|
+
"parentOperationId",
|
|
53
|
+
"reservation",
|
|
54
|
+
];
|
|
55
|
+
const labelled = (entry, label) => {
|
|
56
|
+
const copy = { ...entry };
|
|
57
|
+
for (const field of SEND_ID_FIELDS) {
|
|
58
|
+
const value = copy[field];
|
|
59
|
+
if (value !== undefined && value !== null)
|
|
60
|
+
copy[field] = label(String(value));
|
|
61
|
+
}
|
|
62
|
+
return copy;
|
|
63
|
+
};
|
|
46
64
|
export const reportFileName = (app, now) => `${app}-report-${now
|
|
47
65
|
.toISOString()
|
|
48
66
|
.replace(/[-:]/g, "")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../../src/cli/messenger/report.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAE5C,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAoB,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAEhF,MAAM,YAAY,GAAG,EAAE,CAAA;AAYvB,uGAAuG;AACvG,MAAM,YAAY,GAAG;IACnB,OAAO;IACP,WAAW;IACX,KAAK;IACL,QAAQ;IACR,YAAY;IACZ,SAAS;IACT,WAAW;IACX,eAAe;IACf,MAAM;CACP,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,EAC1B,MAAM,EACN,OAAO,EACP,KAAK,EACL,OAAO,EACP,KAAK,EACL,GAAG,GAAG,IAAI,IAAI,EAAE,EAChB,IAAI,GAUL,EAAU,EAAE;IACX,MAAM,MAAM,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;IACpF,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,MAAM;QAChC,MAAM,IAAI,QAAQ,CAAC,WAAW,EAAE,UAAU,KAAK,QAAQ,OAAO,yBAAyB,CAAC,CAAA;IAE1F,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAA;IACxB,MAAM,OAAO,GAAG,MAAM,CAAC,OAAqD,CAAA;IAC5E,MAAM,MAAM,GAAW;QACrB,SAAS,EAAE,GAAG,CAAC,WAAW,EAAE;QAC5B,MAAM,EAAE;YACN,GAAG,MAAM;YACT,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,GAAG,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACnG;QACD,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI;QACtG,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../../src/cli/messenger/report.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../../src/cli/messenger/review.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AASnC,OAAO,EAAE,KAAK,SAAS,EAAoB,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../../src/cli/messenger/review.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AASnC,OAAO,EAAE,KAAK,SAAS,EAAoB,MAAM,cAAc,CAAA;AAY/D,8CAA8C;AAC9C,eAAO,MAAM,eAAe,UAAW,OAAO,oBAA0B,MACY,CAAA;AAEpF;;;;GAIG;AACH,eAAO,MAAM,aAAa,cAAe,SAAS,KAAG,OAsG/C,CAAA"}
|
|
@@ -2,13 +2,14 @@ import { CliError } from "@leemour/cli-core";
|
|
|
2
2
|
import { Command } from "commander";
|
|
3
3
|
import { renderMessages } from "../../render/messages.js";
|
|
4
4
|
import { CHAT_KINDS } from "../../services/chats.js";
|
|
5
|
-
import {
|
|
5
|
+
import { kindsOf, REVIEW_DAYS, reviewStart, UNANSWERED_HOURS } from "../../services/inbox.js";
|
|
6
6
|
import { momentOf } from "../../services/moment.js";
|
|
7
7
|
import { modelWith } from "../../speech/hearing.js";
|
|
8
8
|
import { parseDuration } from "../settings.js";
|
|
9
9
|
import { MARK_READ_OPTION, markShown, marksRead, NO_MARK_READ_OPTION } from "./catch-up.js";
|
|
10
10
|
import { messengerContext } from "./context.js";
|
|
11
11
|
import { heardItems, hearForCommand, hearingFields, MODEL_OPTION, spokenItems, TRANSCRIBE_OPTION, } from "./hearing-command.js";
|
|
12
|
+
import { PARTIAL_NOTE } from "./inbox.js";
|
|
12
13
|
import { checkPoints } from "./points.js";
|
|
13
14
|
/** `--unanswered` with no value is `true`. */
|
|
14
15
|
export const unansweredHours = (value, flag = "--unanswered") => value === true ? UNANSWERED_HOURS : parseDuration(String(value), flag) / 3_600_000;
|
|
@@ -108,10 +109,11 @@ const notes = (found, command, fresh, note) => {
|
|
|
108
109
|
note(`${chat.title ?? chat.id}: its admins are not known, so only your answers count`);
|
|
109
110
|
}
|
|
110
111
|
if (found.skipped.length > 0) {
|
|
111
|
-
|
|
112
|
+
const names = found.skipped.map((chat) => chat.title ?? chat.id).join(", ");
|
|
113
|
+
note(`skipped ${found.skipped.length} chats — too many at once: ${names}`);
|
|
112
114
|
}
|
|
113
115
|
if (found.partial)
|
|
114
|
-
note(
|
|
116
|
+
note(PARTIAL_NOTE);
|
|
115
117
|
if (found.quiet > 0)
|
|
116
118
|
note(`${found.quiet} muted or archived chats left out — --all reads them`);
|
|
117
119
|
if (found.unanswered) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review.js","sourceRoot":"","sources":["../../../src/cli/messenger/review.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AACpD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"review.js","sourceRoot":"","sources":["../../../src/cli/messenger/review.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { type Messenger } from "./context.js";
|
|
3
|
+
/** Saved searches and the history of `messages search` and `messages stats`, in the local store only. */
|
|
4
|
+
export declare const searchesCommand: (messenger: Messenger) => Command;
|
|
5
|
+
//# sourceMappingURL=searches-command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"searches-command.d.ts","sourceRoot":"","sources":["../../../src/cli/messenger/searches-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAInC,OAAO,EAAE,KAAK,SAAS,EAAsC,MAAM,cAAc,CAAA;AAcjF,yGAAyG;AACzG,eAAO,MAAM,eAAe,cAAe,SAAS,KAAG,OAqGtD,CAAA"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { listed, positiveCount } from "../paging.js";
|
|
3
|
+
import { messengerContext, refuseLocalWrite } from "./context.js";
|
|
4
|
+
import { languageOf, wholeCount } from "./messages-search-command.js";
|
|
5
|
+
import { groupingOf } from "./messages-stats-command.js";
|
|
6
|
+
const line = ({ id, name, command, params, runs, lastRunAt }) => [
|
|
7
|
+
id.padStart(5),
|
|
8
|
+
name ?? "-",
|
|
9
|
+
command,
|
|
10
|
+
JSON.stringify(params.text ?? params.ast ?? ""),
|
|
11
|
+
`${runs} runs`,
|
|
12
|
+
lastRunAt?.slice(0, 16).replace("T", " ") ?? "never run",
|
|
13
|
+
].join(" ");
|
|
14
|
+
/** Saved searches and the history of `messages search` and `messages stats`, in the local store only. */
|
|
15
|
+
export const searchesCommand = (messenger) => {
|
|
16
|
+
const searches = new Command("searches").description("saved searches and the history of messages search and messages stats, kept in the local store; --saved runs one");
|
|
17
|
+
searches
|
|
18
|
+
.command("create")
|
|
19
|
+
.description("save a search under a name without running it; messages search --saved <name> runs it")
|
|
20
|
+
.argument("<name>", "up to 64 letters a–z, digits and hyphens, not only digits")
|
|
21
|
+
.argument("[query...]", "the query, as for messages search; none matches every stored message")
|
|
22
|
+
.option("--chat <chat>", `only this chat — the same as chat: in the query; ${messenger.chatArgument}`)
|
|
23
|
+
.option("--source <messenger>", "every account of this messenger held in the store; personal, bots or all — the same as in: in the query")
|
|
24
|
+
.option("--limit <n>", "how many", positiveCount("--limit"))
|
|
25
|
+
.option("--newest", "newest first instead of best first")
|
|
26
|
+
.option("--context <n>", "messages before and after each hit", wholeCount)
|
|
27
|
+
.option("--language <lucene|legacy>", "the query language: strict Lucene or legacy discovery", languageOf)
|
|
28
|
+
.option("--timezone <zone>", "the IANA timezone for calendar date boundaries")
|
|
29
|
+
.option("--regex", "the words are one regular expression, case-insensitive, tested against every stored text")
|
|
30
|
+
.option("--by <chat|sender|day|hour>", "what messages stats --saved counts by", groupingOf)
|
|
31
|
+
.option("--replace", "overwrite a saved search of the same name")
|
|
32
|
+
.action(async function (name, words) {
|
|
33
|
+
const context = messengerContext(this, messenger);
|
|
34
|
+
refuseLocalWrite(context, messenger.app.command, "searches.create");
|
|
35
|
+
const { replace, ...options } = this.opts();
|
|
36
|
+
const params = {
|
|
37
|
+
...Object.fromEntries(Object.entries(options).filter(([, one]) => one !== undefined)),
|
|
38
|
+
...(words.length ? { text: words.join(" ") } : {}),
|
|
39
|
+
};
|
|
40
|
+
const saved = await context.withServices((services) => services.searches.create(name, params, { replace: replace === true }));
|
|
41
|
+
if (context.format !== "pretty")
|
|
42
|
+
context.renderer.result(saved);
|
|
43
|
+
else
|
|
44
|
+
context.streams.data(`${line(saved)}\n`);
|
|
45
|
+
});
|
|
46
|
+
searches
|
|
47
|
+
.command("show")
|
|
48
|
+
.description("one saved search or earlier run: its query, options and how often it ran")
|
|
49
|
+
.argument("<name|id>", "a saved search's name, or the id of any row of searches history")
|
|
50
|
+
.action(async function (reference) {
|
|
51
|
+
const context = messengerContext(this, messenger);
|
|
52
|
+
context.renderer.result(await context.withServices((services) => services.searches.show(reference)));
|
|
53
|
+
});
|
|
54
|
+
searches
|
|
55
|
+
.command("list")
|
|
56
|
+
.description("the saved searches, by name")
|
|
57
|
+
.action(async function () {
|
|
58
|
+
const context = messengerContext(this, messenger);
|
|
59
|
+
const found = await context.withServices((services) => services.searches.list());
|
|
60
|
+
if (context.format === "jsonl")
|
|
61
|
+
context.renderer.stream(found);
|
|
62
|
+
else if (context.format !== "pretty")
|
|
63
|
+
context.renderer.result(listed(found));
|
|
64
|
+
else if (found.length === 0)
|
|
65
|
+
context.renderer.note("no saved searches — `searches create <name> <query>` saves one");
|
|
66
|
+
else
|
|
67
|
+
context.streams.data(`${found.map(line).join("\n")}\n`);
|
|
68
|
+
});
|
|
69
|
+
searches
|
|
70
|
+
.command("history")
|
|
71
|
+
.description("the searches and counts that ran, newest first — saved ones included; never their results")
|
|
72
|
+
.option("--limit <n>", "how many", positiveCount("--limit"))
|
|
73
|
+
.action(async function () {
|
|
74
|
+
const context = messengerContext(this, messenger);
|
|
75
|
+
const { limit } = context.settings;
|
|
76
|
+
const found = await context.withServices((services) => services.searches.history(limit));
|
|
77
|
+
if (context.format === "jsonl")
|
|
78
|
+
context.renderer.stream(found.items);
|
|
79
|
+
else if (context.format !== "pretty")
|
|
80
|
+
context.renderer.result({ ...found, page: 1, limit });
|
|
81
|
+
else {
|
|
82
|
+
if (found.items.length > 0)
|
|
83
|
+
context.streams.data(`${found.items.map(line).join("\n")}\n`);
|
|
84
|
+
else
|
|
85
|
+
context.renderer.note("no searches ran yet");
|
|
86
|
+
if (found.hasMore)
|
|
87
|
+
context.renderer.note(`more — \`searches history --limit ${limit * 2}\``);
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
searches
|
|
91
|
+
.command("delete")
|
|
92
|
+
.description("delete a saved search, or one run from the history")
|
|
93
|
+
.argument("<name|id>", "a saved search's name, or the id of any row of searches history")
|
|
94
|
+
.action(async function (reference) {
|
|
95
|
+
const context = messengerContext(this, messenger);
|
|
96
|
+
refuseLocalWrite(context, messenger.app.command, "searches.delete");
|
|
97
|
+
const deleted = await context.withServices((services) => services.searches.delete(reference));
|
|
98
|
+
if (context.format !== "pretty")
|
|
99
|
+
context.renderer.result(deleted);
|
|
100
|
+
else
|
|
101
|
+
context.streams.data(`deleted ${deleted.name ?? `run ${deleted.id}`}\n`);
|
|
102
|
+
});
|
|
103
|
+
searches
|
|
104
|
+
.command("clear")
|
|
105
|
+
.description("empty the history; saved searches stay")
|
|
106
|
+
.action(async function () {
|
|
107
|
+
const context = messengerContext(this, messenger);
|
|
108
|
+
refuseLocalWrite(context, messenger.app.command, "searches.clear");
|
|
109
|
+
const cleared = await context.withServices((services) => services.searches.clear());
|
|
110
|
+
if (context.format !== "pretty")
|
|
111
|
+
context.renderer.result(cleared);
|
|
112
|
+
else
|
|
113
|
+
context.streams.data(`${cleared.cleared} runs cleared\n`);
|
|
114
|
+
});
|
|
115
|
+
return searches;
|
|
116
|
+
};
|
|
117
|
+
//# sourceMappingURL=searches-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"searches-command.js","sourceRoot":"","sources":["../../../src/cli/messenger/searches-command.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serve-command.d.ts","sourceRoot":"","sources":["../../../src/cli/messenger/serve-command.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"serve-command.d.ts","sourceRoot":"","sources":["../../../src/cli/messenger/serve-command.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAYnC,OAAO,EAAE,KAAK,SAAS,EAA2C,MAAM,cAAc,CAAA;AAItF,OAAO,EAAE,KAAK,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAEzF;;;;GAIG;AACH,eAAO,MAAM,YAAY,cAAe,SAAS,KAAG,OAmDnD,CAAA"}
|
|
@@ -1,7 +1,15 @@
|
|
|
1
1
|
import { CliError } from "@leemour/cli-core";
|
|
2
2
|
import { Command } from "commander";
|
|
3
|
-
import { holdLock, lockPath,
|
|
4
|
-
import {
|
|
3
|
+
import { holdLock, lockPath, releaseLock, takeLock } from "../../background/lock.js";
|
|
4
|
+
import { senderFacts } from "../../replies/dry-run.js";
|
|
5
|
+
import { repliesPathFor } from "../../replies/rules.js";
|
|
6
|
+
import { NO_RULES, replyTo } from "../../replies/serve.js";
|
|
7
|
+
import { repliesStatePathFor } from "../../replies/state.js";
|
|
8
|
+
import { levelFor } from "../../sends/permissions.js";
|
|
9
|
+
import { newSendId } from "../../sends/send-id.js";
|
|
10
|
+
import { onlineDeps } from "../../services/deps.js";
|
|
11
|
+
import { servicesFor } from "../../services/index.js";
|
|
12
|
+
import { recalledAccount } from "./accounts.js";
|
|
5
13
|
import { messengerContext } from "./context.js";
|
|
6
14
|
import { listenUntilStopped } from "./watch-command.js";
|
|
7
15
|
export { lockPath, readLock, servingProfiles } from "../../background/lock.js";
|
|
@@ -17,34 +25,105 @@ export const serveCommand = (messenger) => {
|
|
|
17
25
|
if (context.settings.offline)
|
|
18
26
|
throw new CliError("validation_error", "serve listens live; --offline cannot");
|
|
19
27
|
const path = lockPath(messenger.app, context.profile, context.env);
|
|
20
|
-
const held = readLock(path);
|
|
21
|
-
if (held && held.pid !== process.pid && alive(held.pid)) {
|
|
22
|
-
throw new CliError("validation_error", `${messenger.app.command} serve is already running for profile ${context.profile} (PID ${held.pid}, since ${held.startedAt})`);
|
|
23
|
-
}
|
|
24
28
|
const startedAt = new Date().toISOString();
|
|
25
29
|
const { version } = messenger.app;
|
|
26
|
-
|
|
30
|
+
const held = takeLock(path, { pid: process.pid, startedAt, version });
|
|
31
|
+
if (held) {
|
|
32
|
+
throw new CliError("validation_error", `${messenger.app.command} serve is already running for profile ${context.profile} (PID ${held.pid}, since ${held.startedAt})`);
|
|
33
|
+
}
|
|
27
34
|
// `server start` answers on this, not on the lock alone: a lock is written before the connection opens.
|
|
28
35
|
const onReady = () => {
|
|
29
36
|
holdLock(path, { pid: process.pid, startedAt, version, listeningAt: new Date().toISOString() });
|
|
30
37
|
context.renderer.note(`listening for profile ${context.profile}, catching up on what arrived while it was down`);
|
|
31
38
|
};
|
|
32
39
|
const counts = {};
|
|
40
|
+
const rules = replying(context, messenger, Date.parse(startedAt));
|
|
33
41
|
const count = (event) => {
|
|
34
42
|
counts[event.event] = (counts[event.event] ?? 0) + 1;
|
|
43
|
+
if (event.event === "message")
|
|
44
|
+
rules.arrived(event.message);
|
|
35
45
|
};
|
|
36
46
|
try {
|
|
37
47
|
await listenUntilStopped(this, context, messenger, count, {
|
|
38
48
|
stop: new AbortController(),
|
|
39
49
|
catchUp: true,
|
|
40
50
|
onReady,
|
|
51
|
+
connected: rules.connected,
|
|
41
52
|
});
|
|
42
53
|
}
|
|
43
54
|
finally {
|
|
55
|
+
await rules.settled();
|
|
44
56
|
releaseLock(path);
|
|
45
57
|
}
|
|
46
|
-
context.renderer.result({
|
|
58
|
+
context.renderer.result({
|
|
59
|
+
profile: context.profile,
|
|
60
|
+
startedAt,
|
|
61
|
+
stoppedAt: new Date().toISOString(),
|
|
62
|
+
kept: counts,
|
|
63
|
+
...rules.summary(),
|
|
64
|
+
});
|
|
47
65
|
});
|
|
48
66
|
return command;
|
|
49
67
|
};
|
|
68
|
+
/**
|
|
69
|
+
* The reply rules, one message at a time in the order they came: two at once would both read the
|
|
70
|
+
* limits before either counted its reply.
|
|
71
|
+
*/
|
|
72
|
+
const replying = (context, messenger, since) => {
|
|
73
|
+
const { app, provider } = messenger;
|
|
74
|
+
const { profile, env, settings, renderer } = context;
|
|
75
|
+
let connection;
|
|
76
|
+
let queue = Promise.resolve();
|
|
77
|
+
const sent = {};
|
|
78
|
+
const skipped = {};
|
|
79
|
+
const chats = new Map();
|
|
80
|
+
const owner = recalledAccount(app, provider, profile, env)?.account ?? null;
|
|
81
|
+
const handle = async (message) => {
|
|
82
|
+
if (connection === undefined)
|
|
83
|
+
return;
|
|
84
|
+
const open = connection;
|
|
85
|
+
const answer = await replyTo({
|
|
86
|
+
rulesPath: repliesPathFor(app, profile, env),
|
|
87
|
+
statePath: repliesStatePathFor(app, profile, env),
|
|
88
|
+
provider,
|
|
89
|
+
owner: { id: owner },
|
|
90
|
+
since,
|
|
91
|
+
allowed: () => levelFor(settings.permissions ?? {}, "replies.send").level === "allow",
|
|
92
|
+
chatOf: (chat) => {
|
|
93
|
+
if (!chats.has(chat))
|
|
94
|
+
chats.set(chat, open.resolve(chat).then(({ id, kind }) => ({ id, kind })));
|
|
95
|
+
return chats.get(chat);
|
|
96
|
+
},
|
|
97
|
+
senderOf: (person) => context.withStore(async (store, account) => {
|
|
98
|
+
const { isContact, botOf } = await senderFacts(store, account);
|
|
99
|
+
return { isBot: (await botOf(person)) === true, isContact: isContact(person) };
|
|
100
|
+
}, { name: "serve replies" }),
|
|
101
|
+
send: (reply) => servicesFor(onlineDeps(messenger, open, context.guard, { profile, env })).messages.send({
|
|
102
|
+
chat: reply.chat,
|
|
103
|
+
text: reply.text,
|
|
104
|
+
sendId: reply.sendId,
|
|
105
|
+
key: "replies.send",
|
|
106
|
+
origin: reply.origin,
|
|
107
|
+
...(reply.replyTo === undefined ? {} : { replyTo: reply.replyTo }),
|
|
108
|
+
}),
|
|
109
|
+
newSendId: () => open.newSendId?.() ?? newSendId(),
|
|
110
|
+
}, message);
|
|
111
|
+
if ("sent" in answer)
|
|
112
|
+
sent[answer.sent] = (sent[answer.sent] ?? 0) + 1;
|
|
113
|
+
else if (answer.skip !== NO_RULES)
|
|
114
|
+
skipped[answer.skip] = (skipped[answer.skip] ?? 0) + 1;
|
|
115
|
+
};
|
|
116
|
+
return {
|
|
117
|
+
connected: (open) => {
|
|
118
|
+
connection = open;
|
|
119
|
+
},
|
|
120
|
+
arrived: (message) => {
|
|
121
|
+
if (message.outgoing !== false)
|
|
122
|
+
return;
|
|
123
|
+
queue = queue.then(() => handle(message).catch((error) => renderer.warn(`a reply rule failed: ${error instanceof Error ? error.message : String(error)}`)));
|
|
124
|
+
},
|
|
125
|
+
settled: () => queue,
|
|
126
|
+
summary: () => Object.keys(sent).length === 0 && Object.keys(skipped).length === 0 ? {} : { replies: { sent, skipped } },
|
|
127
|
+
};
|
|
128
|
+
};
|
|
50
129
|
//# sourceMappingURL=serve-command.js.map
|