@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
package/dist/mcp/tools/search.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { CliError } from "@leemour/cli-core";
|
|
2
2
|
import * as v from "valibot";
|
|
3
3
|
import { chatOf, limit } from "../tool.js";
|
|
4
|
-
export const MESSAGES_SEARCH_DESCRIPTION = "Search only the local store using the Lucene 9.12.3 profile, default AND, with strict Boolean matching. Legacy discovery is explicit with language=legacy. Text or a versioned AST, account-scoped filters, calendar timezone, term/body regex and candidate presets use one service. Empty hits still report archive coverage. Guide: https://github.com/leemour/cli-messaging/blob/main/docs/search/query-language.md. Returns { items, page, limit, hasMore, corrections, completeness, wordsReady, query, coverage }.";
|
|
4
|
+
export const MESSAGES_SEARCH_DESCRIPTION = "Search only the local store using the Lucene 9.12.3 profile, default AND, with strict Boolean matching. Legacy discovery is explicit with language=legacy. Text or a versioned AST, account-scoped filters, calendar timezone, term/body regex and candidate presets use one service. Empty hits still report archive coverage. `saved` runs a saved search (searches_list) or an earlier run (searches_history). Guide: https://github.com/leemour/cli-messaging/blob/main/docs/search/query-language.md. Returns { items, page, limit, hasMore, corrections, completeness, wordsReady, query, coverage }.";
|
|
5
5
|
export const messagesSearchInput = (messenger) => v.object({
|
|
6
6
|
text: v.optional(v.pipe(v.string(), v.minLength(1), v.description("the query: Lucene text or explicit legacy syntax"))),
|
|
7
7
|
ast: v.optional(v.unknown()),
|
|
@@ -12,10 +12,41 @@ export const messagesSearchInput = (messenger) => v.object({
|
|
|
12
12
|
newest: v.optional(v.pipe(v.boolean(), v.description("newest first instead of best first"))),
|
|
13
13
|
context: v.optional(v.pipe(v.number(), v.integer(), v.minValue(0), v.maxValue(20), v.description("messages around each hit"))),
|
|
14
14
|
limit,
|
|
15
|
+
saved: v.optional(v.pipe(v.string(), v.minLength(1), v.description("run a saved search (name) or an earlier run (id); text is AND-ed to it, other arguments replace its own"))),
|
|
15
16
|
});
|
|
16
|
-
|
|
17
|
+
const typedOf = (args) => Object.fromEntries(["text", "language", "timezone", "chat", "source", "newest", "context", "limit", "by"].flatMap((key) => args[key] === undefined ? [] : [[key, args[key]]]));
|
|
18
|
+
/** `saved` needs the searches service; a host that mounts the tool without it refuses `saved` rather than ignore it. */
|
|
19
|
+
const resolveSaved = async (searches, args) => {
|
|
20
|
+
if (args.saved === undefined)
|
|
21
|
+
return undefined;
|
|
22
|
+
if (!searches)
|
|
23
|
+
throw new CliError("validation_error", "saved searches are not available on this server");
|
|
24
|
+
if (args.ast !== undefined)
|
|
25
|
+
throw new CliError("validation_error", "with saved, give more words as text, not an AST");
|
|
26
|
+
return searches.resolve(args.saved, typedOf(args));
|
|
27
|
+
};
|
|
28
|
+
export const answerMessagesSearch = async (messages, args, defaults, searches) => {
|
|
29
|
+
const resolved = await resolveSaved(searches, args);
|
|
30
|
+
if (resolved) {
|
|
31
|
+
const { params, pattern } = resolved;
|
|
32
|
+
const size = params.limit ?? defaults.limit;
|
|
33
|
+
const found = await messages.search({
|
|
34
|
+
...(pattern ? { pattern } : params.text === undefined ? {} : { text: params.text }),
|
|
35
|
+
...(params.ast === undefined ? {} : { ast: params.ast }),
|
|
36
|
+
language: params.language ?? (pattern ? "legacy" : "lucene"),
|
|
37
|
+
signal: defaults.signal,
|
|
38
|
+
...(params.timezone === undefined ? {} : { timezone: params.timezone }),
|
|
39
|
+
limit: size,
|
|
40
|
+
newest: params.newest === true,
|
|
41
|
+
context: params.context ?? 0,
|
|
42
|
+
...(params.chat === undefined ? {} : { chat: params.chat }),
|
|
43
|
+
...(params.source === undefined ? {} : { source: params.source }),
|
|
44
|
+
saved: resolved.id,
|
|
45
|
+
});
|
|
46
|
+
return { ...found, page: 1, limit: size };
|
|
47
|
+
}
|
|
17
48
|
if (args.text === undefined && args.ast === undefined)
|
|
18
|
-
throw new CliError("validation_error", "give search text
|
|
49
|
+
throw new CliError("validation_error", "give search text, a versioned AST, or saved");
|
|
19
50
|
const size = args.limit ?? defaults.limit;
|
|
20
51
|
const found = await messages.search({
|
|
21
52
|
...(args.text === undefined ? {} : { text: args.text }),
|
|
@@ -40,19 +71,25 @@ export const messagesStatsInput = (messenger) => v.object({
|
|
|
40
71
|
chat: v.optional(chatOf(messenger)),
|
|
41
72
|
source: v.optional(v.pipe(v.string(), v.minLength(1), v.description("a messenger held on this machine; personal, bots or all — as in: in text"))),
|
|
42
73
|
limit,
|
|
74
|
+
saved: v.optional(v.pipe(v.string(), v.minLength(1), v.description("run a saved search (name) or an earlier run (id); text is AND-ed to it, other arguments replace its own"))),
|
|
43
75
|
});
|
|
44
|
-
export const answerMessagesStats = async (messages, args, defaults) => {
|
|
45
|
-
const
|
|
76
|
+
export const answerMessagesStats = async (messages, args, defaults, searches) => {
|
|
77
|
+
const resolved = await resolveSaved(searches, args);
|
|
78
|
+
const params = resolved?.params ?? args;
|
|
79
|
+
if (params.regex || params.language === "legacy")
|
|
80
|
+
throw new CliError("validation_error", "messages stats counts strict Lucene queries; this saved search is legacy");
|
|
81
|
+
const size = params.limit ?? defaults.limit;
|
|
46
82
|
const stats = await messages.stats({
|
|
47
|
-
...(
|
|
48
|
-
...(
|
|
49
|
-
by:
|
|
83
|
+
...(params.text === undefined ? {} : { text: params.text }),
|
|
84
|
+
...(params.ast === undefined ? {} : { ast: params.ast }),
|
|
85
|
+
by: params.by ?? "chat",
|
|
50
86
|
language: "lucene",
|
|
51
87
|
signal: defaults.signal,
|
|
52
|
-
...(
|
|
88
|
+
...(params.timezone === undefined ? {} : { timezone: params.timezone }),
|
|
53
89
|
limit: size,
|
|
54
|
-
...(
|
|
55
|
-
...(
|
|
90
|
+
...(params.chat === undefined ? {} : { chat: params.chat }),
|
|
91
|
+
...(params.source === undefined ? {} : { source: params.source }),
|
|
92
|
+
...(resolved ? { saved: resolved.id } : {}),
|
|
56
93
|
});
|
|
57
94
|
return { ...stats, page: 1, limit: size };
|
|
58
95
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/mcp/tools/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/mcp/tools/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAI5B,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAE1C,MAAM,CAAC,MAAM,2BAA2B,GACtC,6kBAA6kB,CAAA;AAE/kB,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,SAAoB,EAAE,EAAE,CAC1D,CAAC,CAAC,MAAM,CAAC;IACP,IAAI,EAAE,CAAC,CAAC,QAAQ,CACd,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,kDAAkD,CAAC,CAAC,CACtG;IACD,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IAC5B,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;IACtD,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAChC,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACnC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAChB,CAAC,CAAC,IAAI,CACJ,CAAC,CAAC,MAAM,EAAE,EACV,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EACd,CAAC,CAAC,WAAW,CAAC,0EAA0E,CAAC,CAC1F,CACF;IACD,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,oCAAoC,CAAC,CAAC,CAAC;IAC5F,OAAO,EAAE,CAAC,CAAC,QAAQ,CACjB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,0BAA0B,CAAC,CAAC,CAC1G;IACD,KAAK;IACL,KAAK,EAAE,CAAC,CAAC,QAAQ,CACf,CAAC,CAAC,IAAI,CACJ,CAAC,CAAC,MAAM,EAAE,EACV,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EACd,CAAC,CAAC,WAAW,CACX,yGAAyG,CAC1G,CACF,CACF;CACF,CAAC,CAAA;AAIJ,MAAM,OAAO,GAAG,CAAC,IAA6B,EAAgB,EAAE,CAC9D,MAAM,CAAC,WAAW,CAChB,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CACrG,IAAI,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAClD,CACF,CAAA;AAEH,wHAAwH;AACxH,MAAM,YAAY,GAAG,KAAK,EACxB,QAAsD,EACtD,IAAiE,EACjE,EAAE;IACF,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IAC9C,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,iDAAiD,CAAC,CAAA;IACxG,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS;QAAE,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,iDAAiD,CAAC,CAAA;IACrH,OAAO,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;AACpD,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,EACvC,QAAyC,EACzC,IAAwB,EACxB,QAAiD,EACjD,QAA2C,EAC3C,EAAE;IACF,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;IACnD,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,QAAQ,CAAA;QACpC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAA;QAC3C,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;YAClC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;YACnF,GAAG,CAAC,MAAM,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC;YACxD,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;YAC5D,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,GAAG,CAAC,MAAM,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;YACvE,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,MAAM,CAAC,MAAM,KAAK,IAAI;YAC9B,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,CAAC;YAC5B,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;YAC3D,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;YACjE,KAAK,EAAE,QAAQ,CAAC,EAAE;SACnB,CAAC,CAAA;QACF,OAAO,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;IAC3C,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS;QACnD,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,6CAA6C,CAAC,CAAA;IACvF,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAA;IACzC,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;QAClC,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;QACvD,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;QACpD,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,QAAQ;QACnC,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,GAAG,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACnE,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,IAAI,CAAC,MAAM,KAAK,IAAI;QAC5B,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,CAAC;QAC1B,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;QACvD,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;KAC9D,CAAC,CAAA;IACF,OAAO,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;AAC3C,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,0BAA0B,GACrC,sWAAsW,CAAA;AAExW,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,SAAoB,EAAE,EAAE,CACzD,CAAC,CAAC,MAAM,CAAC;IACP,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,0CAA0C,CAAC,CAAC,CAAC;IAC/G,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IAC5B,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;IAC7D,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAChC,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACnC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAChB,CAAC,CAAC,IAAI,CACJ,CAAC,CAAC,MAAM,EAAE,EACV,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EACd,CAAC,CAAC,WAAW,CAAC,0EAA0E,CAAC,CAC1F,CACF;IACD,KAAK;IACL,KAAK,EAAE,CAAC,CAAC,QAAQ,CACf,CAAC,CAAC,IAAI,CACJ,CAAC,CAAC,MAAM,EAAE,EACV,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EACd,CAAC,CAAC,WAAW,CACX,yGAAyG,CAC1G,CACF,CACF;CACF,CAAC,CAAA;AAEJ,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,EACtC,QAAwC,EACxC,IAA0D,EAC1D,QAAiD,EACjD,QAA2C,EAC3C,EAAE;IACF,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;IACnD,MAAM,MAAM,GAAiB,QAAQ,EAAE,MAAM,IAAI,IAAI,CAAA;IACrD,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ;QAC9C,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,0EAA0E,CAAC,CAAA;IACpH,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAA;IAC3C,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC;QACjC,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;QAC3D,GAAG,CAAC,MAAM,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC;QACxD,EAAE,EAAE,MAAM,CAAC,EAAE,IAAI,MAAM;QACvB,QAAQ,EAAE,QAAQ;QAClB,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,GAAG,CAAC,MAAM,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;QACvE,KAAK,EAAE,IAAI;QACX,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;QAC3D,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;QACjE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5C,CAAC,CAAA;IACF,OAAO,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;AAC3C,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"searches.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/searches.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAA;AAK/D,OAAO,EAAE,KAAK,OAAO,EAAoD,MAAM,YAAY,CAAA;AAU3F,eAAO,MAAM,aAAa,cAAe,SAAS,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CA6E1E,CAAA"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import * as v from "valibot";
|
|
2
|
+
import { listed } from "../../cli/paging.js";
|
|
3
|
+
import { servicesFor, storedDeps } from "../../services/index.js";
|
|
4
|
+
import { chatOf, limit, READ, refuseAskedLocalWrite, tool } from "../tool.js";
|
|
5
|
+
const LOCAL = { readOnlyHint: false, openWorldHint: false };
|
|
6
|
+
const ROW = "{ id, name, command, params, language, version, fieldsVersion, createdAt, lastRunAt, runs }";
|
|
7
|
+
const reference = v.pipe(v.string(), v.minLength(1), v.description("a saved search's name, or the id of any row of searches_history"));
|
|
8
|
+
export const searchesTools = (messenger) => {
|
|
9
|
+
const command = messenger.app.command;
|
|
10
|
+
const services = (store, account, guard) => servicesFor(storedDeps(messenger, store, account, guard));
|
|
11
|
+
return {
|
|
12
|
+
searches_list: tool({
|
|
13
|
+
title: "List saved searches",
|
|
14
|
+
description: `The saved searches, by name; messages_search and messages_stats run one with \`saved\`. Returns { items: [${ROW}], page, limit, hasMore }.`,
|
|
15
|
+
input: v.object({}),
|
|
16
|
+
annotations: { ...READ, openWorldHint: false },
|
|
17
|
+
stored: async (store, account, _args, defaults) => listed(await services(store, account, defaults.guard).searches.list()),
|
|
18
|
+
}),
|
|
19
|
+
searches_history: tool({
|
|
20
|
+
title: "Search history",
|
|
21
|
+
description: "The searches and counts that ran, newest first, saved ones included: the query and options as given, " +
|
|
22
|
+
`never the results. \`saved\` with an id runs one again. Returns { items: [${ROW}], page, limit, hasMore }.`,
|
|
23
|
+
input: v.object({ limit }),
|
|
24
|
+
annotations: { ...READ, openWorldHint: false },
|
|
25
|
+
stored: async (store, account, args, defaults) => {
|
|
26
|
+
const size = args.limit ?? defaults.limit;
|
|
27
|
+
return { ...(await services(store, account, defaults.guard).searches.history(size)), page: 1, limit: size };
|
|
28
|
+
},
|
|
29
|
+
}),
|
|
30
|
+
searches_create: tool({
|
|
31
|
+
title: "Save a search",
|
|
32
|
+
description: "Saves a search under a name without running it; the query is checked against today's fields. Takes " +
|
|
33
|
+
"messages_search's arguments, plus `by` for messages_stats. A taken name is refused unless `replace`. " +
|
|
34
|
+
`Writes only to the local store. Returns ${ROW}.`,
|
|
35
|
+
input: v.object({
|
|
36
|
+
name: v.pipe(v.string(), v.minLength(1), v.description("up to 64 letters a–z, digits and hyphens")),
|
|
37
|
+
text: v.optional(v.pipe(v.string(), v.minLength(1), v.description("the query: Lucene text or legacy syntax"))),
|
|
38
|
+
ast: v.optional(v.unknown()),
|
|
39
|
+
language: v.optional(v.picklist(["lucene", "legacy"])),
|
|
40
|
+
timezone: v.optional(v.string()),
|
|
41
|
+
chat: v.optional(chatOf(messenger)),
|
|
42
|
+
source: v.optional(v.pipe(v.string(), v.minLength(1), v.description("a messenger held on this machine"))),
|
|
43
|
+
newest: v.optional(v.boolean()),
|
|
44
|
+
context: v.optional(v.pipe(v.number(), v.integer(), v.minValue(0), v.maxValue(20))),
|
|
45
|
+
limit,
|
|
46
|
+
by: v.optional(v.picklist(["chat", "sender", "day", "hour"])),
|
|
47
|
+
replace: v.optional(v.pipe(v.boolean(), v.description("overwrite a saved search of the same name"))),
|
|
48
|
+
}),
|
|
49
|
+
annotations: { ...LOCAL, destructiveHint: false, idempotentHint: false },
|
|
50
|
+
stored: async (store, account, { name, replace, ...params }, defaults) => {
|
|
51
|
+
refuseAskedLocalWrite(defaults, "searches.create", command);
|
|
52
|
+
return services(store, account, defaults.guard).searches.create(name, params, { replace: replace === true });
|
|
53
|
+
},
|
|
54
|
+
}),
|
|
55
|
+
searches_delete: tool({
|
|
56
|
+
title: "Delete a saved search",
|
|
57
|
+
description: `Deletes a saved search, or one run from the history. Writes only to the local store. Returns ${ROW}.`,
|
|
58
|
+
input: v.object({ name: reference }),
|
|
59
|
+
annotations: { ...LOCAL, destructiveHint: true, idempotentHint: false },
|
|
60
|
+
stored: async (store, account, args, defaults) => {
|
|
61
|
+
refuseAskedLocalWrite(defaults, "searches.delete", command);
|
|
62
|
+
return services(store, account, defaults.guard).searches.delete(args.name);
|
|
63
|
+
},
|
|
64
|
+
}),
|
|
65
|
+
searches_clear: tool({
|
|
66
|
+
title: "Clear search history",
|
|
67
|
+
description: "Empties the search history; saved searches stay. Writes only to the local store. Returns { cleared }.",
|
|
68
|
+
input: v.object({}),
|
|
69
|
+
annotations: { ...LOCAL, destructiveHint: true, idempotentHint: true },
|
|
70
|
+
stored: async (store, account, _args, defaults) => {
|
|
71
|
+
refuseAskedLocalWrite(defaults, "searches.clear", command);
|
|
72
|
+
return services(store, account, defaults.guard).searches.clear();
|
|
73
|
+
},
|
|
74
|
+
}),
|
|
75
|
+
};
|
|
76
|
+
};
|
|
77
|
+
//# sourceMappingURL=searches.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"searches.js","sourceRoot":"","sources":["../../../src/mcp/tools/searches.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tags.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/tags.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAA;AAI/D,OAAO,EAAE,KAAK,OAAO,EAA6C,MAAM,YAAY,CAAA;AAOpF,eAAO,MAAM,SAAS,cAAe,SAAS,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CA0DtE,CAAA"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import * as v from "valibot";
|
|
2
|
+
import { listed } from "../../cli/paging.js";
|
|
3
|
+
import { TAG_TYPES } from "../../domain/tags.js";
|
|
4
|
+
import { servicesFor, storedDeps } from "../../services/index.js";
|
|
5
|
+
import { chatOf, READ, refuseAskedLocalWrite, tool } from "../tool.js";
|
|
6
|
+
const LOCAL = { readOnlyHint: false, idempotentHint: true, openWorldHint: false };
|
|
7
|
+
const TARGET = "One target: `chat` alone, `contact` (id, @username or name), or `message` with `chat` — or `message` as a " +
|
|
8
|
+
"msg: locator alone. Writes only to the local store; nothing is sent.";
|
|
9
|
+
export const tagsTools = (messenger) => {
|
|
10
|
+
const command = messenger.app.command;
|
|
11
|
+
const input = v.object({
|
|
12
|
+
tags: v.pipe(v.array(v.pipe(v.string(), v.maxLength(64))), v.minLength(1), v.maxLength(32), v.description("tags: 1–32 letters a–z, digits and hyphens; upper case is lowered")),
|
|
13
|
+
chat: v.optional(chatOf(messenger)),
|
|
14
|
+
contact: v.optional(v.pipe(v.string(), v.minLength(1), v.description("a person: id, @username or name"))),
|
|
15
|
+
message: v.optional(v.pipe(v.string(), v.minLength(1), v.description("a message id in `chat`, or a msg: locator alone"))),
|
|
16
|
+
});
|
|
17
|
+
const targetOf = (args) => ({
|
|
18
|
+
...(args.chat === undefined ? {} : { chat: args.chat }),
|
|
19
|
+
...(args.contact === undefined ? {} : { contact: args.contact }),
|
|
20
|
+
...(args.message === undefined ? {} : { message: args.message }),
|
|
21
|
+
});
|
|
22
|
+
return {
|
|
23
|
+
tags_list: tool({
|
|
24
|
+
title: "List tags",
|
|
25
|
+
description: "The owner's own tags in the local store: this account's tagged chats and messages, and the people of its " +
|
|
26
|
+
"messenger. `tag:<tag>` in messages_search finds the messages they label. Returns { items: [{ tag, type, " +
|
|
27
|
+
"chatId?, chatTitle?, personId?, name?, messageId?, locator?, createdAt }], page, limit, hasMore }.",
|
|
28
|
+
input: v.object({
|
|
29
|
+
tag: v.optional(v.pipe(v.string(), v.minLength(1), v.description("only this tag"))),
|
|
30
|
+
type: v.optional(v.picklist(TAG_TYPES)),
|
|
31
|
+
}),
|
|
32
|
+
annotations: { ...READ, openWorldHint: false },
|
|
33
|
+
stored: async (store, account, args, defaults) => listed(await servicesFor(storedDeps(messenger, store, account, defaults.guard)).tags.list(args)),
|
|
34
|
+
}),
|
|
35
|
+
tags_add: tool({
|
|
36
|
+
title: "Tag a chat, person or message",
|
|
37
|
+
description: `Puts tags on one chat, person or message. ${TARGET} Returns { target, added, unchanged }.`,
|
|
38
|
+
input,
|
|
39
|
+
annotations: { ...LOCAL, destructiveHint: false },
|
|
40
|
+
stored: async (store, account, args, defaults) => {
|
|
41
|
+
refuseAskedLocalWrite(defaults, "tags.add", command);
|
|
42
|
+
return servicesFor(storedDeps(messenger, store, account, defaults.guard)).tags.add(targetOf(args), args.tags);
|
|
43
|
+
},
|
|
44
|
+
}),
|
|
45
|
+
tags_remove: tool({
|
|
46
|
+
title: "Untag a chat, person or message",
|
|
47
|
+
description: `Takes tags off one chat, person or message. ${TARGET} Returns { target, removed, unchanged }.`,
|
|
48
|
+
input,
|
|
49
|
+
annotations: { ...LOCAL, destructiveHint: true },
|
|
50
|
+
stored: async (store, account, args, defaults) => {
|
|
51
|
+
refuseAskedLocalWrite(defaults, "tags.remove", command);
|
|
52
|
+
return servicesFor(storedDeps(messenger, store, account, defaults.guard)).tags.remove(targetOf(args), args.tags);
|
|
53
|
+
},
|
|
54
|
+
}),
|
|
55
|
+
};
|
|
56
|
+
};
|
|
57
|
+
//# sourceMappingURL=tags.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tags.js","sourceRoot":"","sources":["../../../src/mcp/tools/tags.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/tools.d.ts
CHANGED
|
@@ -11,4 +11,6 @@ export declare const markReadTools: (messenger: Messenger) => Record<string, Any
|
|
|
11
11
|
export declare const deleteTools: (messenger: Messenger) => Record<string, AnyTool>;
|
|
12
12
|
/** The writes others see, offered by the profile's permissions like every write. */
|
|
13
13
|
export declare const sendTools: (messenger: Messenger) => Record<string, AnyTool>;
|
|
14
|
+
/** The owner's own records in the local store — tags, saved searches — read and written; never sent. */
|
|
15
|
+
export declare const localTools: (messenger: Messenger) => Record<string, AnyTool>;
|
|
14
16
|
//# sourceMappingURL=tools.d.ts.map
|
package/dist/mcp/tools.d.ts.map
CHANGED
|
@@ -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;
|
|
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;AAwBxC;;;GAGG;AACH,eAAO,MAAM,SAAS,cAAe,SAAS,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAYrE,CAAA;AAEF,sFAAsF;AACtF,eAAO,MAAM,aAAa,cAAe,SAAS,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAA8B,CAAA;AAEzG,8EAA8E;AAC9E,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,CAUrE,CAAA;AAEF,wGAAwG;AACxG,eAAO,MAAM,UAAU,cAAe,SAAS,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAGtE,CAAA"}
|
package/dist/mcp/tools.js
CHANGED
|
@@ -17,6 +17,8 @@ import { moderationTools } from "./tools/moderation.js";
|
|
|
17
17
|
import { pollReadTools, pollWriteTools } from "./tools/polls.js";
|
|
18
18
|
import { reactionTools } from "./tools/reactions.js";
|
|
19
19
|
import { reviewTools } from "./tools/review.js";
|
|
20
|
+
import { searchesTools } from "./tools/searches.js";
|
|
21
|
+
import { tagsTools } from "./tools/tags.js";
|
|
20
22
|
import { topicsTools, topicWriteTools } from "./tools/topics.js";
|
|
21
23
|
/**
|
|
22
24
|
* The read tools, each answering what its command's `--json` prints. Named `<cli>_<command words>`,
|
|
@@ -51,4 +53,9 @@ export const sendTools = (messenger) => ({
|
|
|
51
53
|
...reactionTools(messenger),
|
|
52
54
|
...pollWriteTools(messenger),
|
|
53
55
|
});
|
|
56
|
+
/** The owner's own records in the local store — tags, saved searches — read and written; never sent. */
|
|
57
|
+
export const localTools = (messenger) => ({
|
|
58
|
+
...tagsTools(messenger),
|
|
59
|
+
...searchesTools(messenger),
|
|
60
|
+
});
|
|
54
61
|
//# sourceMappingURL=tools.js.map
|
package/dist/mcp/tools.js.map
CHANGED
|
@@ -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,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,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,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,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,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAEhE;;;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,kBAAkB,CAAC,SAAS,CAAC;IAChC,GAAG,aAAa,CAAC,SAAS,CAAC;IAC3B,GAAG,kBAAkB,CAAC,SAAS,CAAC;IAChC,GAAG,uBAAuB,CAAC,SAAS,CAAC;CACtC,CAAC,CAAA;AAEF,sFAAsF;AACtF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,SAAoB,EAA2B,EAAE,CAAC,cAAc,CAAC,SAAS,CAAC,CAAA;AAEzG,8EAA8E;AAC9E,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,eAAe,CAAC,SAAS,CAAC;IAC7B,GAAG,WAAW,CAAC,SAAS,CAAC;IACzB,GAAG,iBAAiB,CAAC,SAAS,CAAC;IAC/B,GAAG,eAAe,CAAC,SAAS,CAAC;IAC7B,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":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { Chat, Id, Message } from "../domain/models.js";
|
|
2
|
+
import { type ReplyRule } from "./rules.js";
|
|
3
|
+
import { type RepliesState } from "./state.js";
|
|
4
|
+
/** What the matcher knows about one arriving message beyond the message itself. */
|
|
5
|
+
export interface Incoming {
|
|
6
|
+
message: Message;
|
|
7
|
+
chat: Pick<Chat, "id" | "kind">;
|
|
8
|
+
/** The owner, to tell a mention or a reply to them; `null` when the account is not known. */
|
|
9
|
+
owner: {
|
|
10
|
+
id: Id | null;
|
|
11
|
+
username?: string;
|
|
12
|
+
};
|
|
13
|
+
/** `isTester`: named in the file's `testers` — nobody else is ever answered (NEED-601). */
|
|
14
|
+
sender: {
|
|
15
|
+
isBot: boolean;
|
|
16
|
+
isContact: boolean;
|
|
17
|
+
isTester: boolean;
|
|
18
|
+
};
|
|
19
|
+
/** ms: when `serve` began catching up. Older messages are never answered — a week away must not get a week of replies. */
|
|
20
|
+
since: number;
|
|
21
|
+
}
|
|
22
|
+
export type Decision = {
|
|
23
|
+
reply: {
|
|
24
|
+
text: string;
|
|
25
|
+
asReply: boolean;
|
|
26
|
+
model: ReplyRule["reply"]["model"];
|
|
27
|
+
};
|
|
28
|
+
} | {
|
|
29
|
+
skip: string;
|
|
30
|
+
};
|
|
31
|
+
export declare const NOT_A_TESTER = "not a test account";
|
|
32
|
+
/**
|
|
33
|
+
* Whether `rule` answers this message at `now`, and with what — or why not, in words `replies test`
|
|
34
|
+
* can print. Pure: it reads `state` and changes nothing; the caller records a reply it sent.
|
|
35
|
+
*/
|
|
36
|
+
export declare const decide: (rule: ReplyRule, incoming: Incoming, state: RepliesState, now: number) => Decision;
|
|
37
|
+
//# sourceMappingURL=decide.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decide.d.ts","sourceRoot":"","sources":["../../src/replies/decide.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAC5D,OAAO,EAA8B,KAAK,SAAS,EAAe,MAAM,YAAY,CAAA;AACpF,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,YAAY,CAAA;AAE3D,mFAAmF;AACnF,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,OAAO,CAAA;IAChB,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAAC,CAAA;IAC/B,6FAA6F;IAC7F,KAAK,EAAE;QAAE,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAC3C,2FAA2F;IAC3F,MAAM,EAAE;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAA;KAAE,CAAA;IACjE,0HAA0H;IAC1H,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,MAAM,QAAQ,GAChB;IAAE,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAA;KAAE,CAAA;CAAE,GACjF;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AAIpB,eAAO,MAAM,YAAY,uBAAuB,CAAA;AAEhD;;;GAGG;AACH,eAAO,MAAM,MAAM,SAAU,SAAS,YAAY,QAAQ,SAAS,YAAY,OAAO,MAAM,KAAG,QAyC9F,CAAA"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { DAYS } from "./rules.js";
|
|
2
|
+
import { answeredKey } from "./state.js";
|
|
3
|
+
const skip = (why) => ({ skip: why });
|
|
4
|
+
export const NOT_A_TESTER = "not a test account";
|
|
5
|
+
/**
|
|
6
|
+
* Whether `rule` answers this message at `now`, and with what — or why not, in words `replies test`
|
|
7
|
+
* can print. Pure: it reads `state` and changes nothing; the caller records a reply it sent.
|
|
8
|
+
*/
|
|
9
|
+
export const decide = (rule, incoming, state, now) => {
|
|
10
|
+
const { message, chat, owner, sender } = incoming;
|
|
11
|
+
if (state.paused)
|
|
12
|
+
return skip("replies are paused");
|
|
13
|
+
if (!rule.on)
|
|
14
|
+
return skip("the rule is off");
|
|
15
|
+
if (message.outgoing !== false)
|
|
16
|
+
return skip(message.outgoing ? "your own message" : "the account is not known");
|
|
17
|
+
if (message.senderIsChat || message.senderId === null)
|
|
18
|
+
return skip("sent as a chat, not by a person");
|
|
19
|
+
if (!sender.isTester)
|
|
20
|
+
return skip(NOT_A_TESTER);
|
|
21
|
+
if (sender.isBot)
|
|
22
|
+
return skip("sent by a bot");
|
|
23
|
+
if (chat.kind !== "dialog" && chat.kind !== "group")
|
|
24
|
+
return skip(`a ${chat.kind} is never answered`);
|
|
25
|
+
if (message.editedAt !== null)
|
|
26
|
+
return skip("an edited message");
|
|
27
|
+
if (message.scheduledFor !== undefined)
|
|
28
|
+
return skip("a scheduled message");
|
|
29
|
+
if (Date.parse(message.timestamp) < incoming.since)
|
|
30
|
+
return skip("older than the catch-up start");
|
|
31
|
+
if (state.answered.includes(answeredKey(message)))
|
|
32
|
+
return skip("already answered");
|
|
33
|
+
const { where, when } = rule;
|
|
34
|
+
if (where.kinds.length > 0 && !where.kinds.includes(chat.kind))
|
|
35
|
+
return skip(`the rule does not answer a ${chat.kind}`);
|
|
36
|
+
if (where.chats.length > 0 && !where.chats.includes(chat.id))
|
|
37
|
+
return skip("not one of the rule's chats");
|
|
38
|
+
if (where.notChats.includes(chat.id))
|
|
39
|
+
return skip("one of the chats the rule leaves out");
|
|
40
|
+
const toMe = mentionsOwner(message, owner);
|
|
41
|
+
if (chat.kind === "group" && !where.chats.includes(chat.id) && !toMe) {
|
|
42
|
+
return skip("a group message that neither mentions you nor replies to you");
|
|
43
|
+
}
|
|
44
|
+
if (when.hours && !outside(when.hours, now))
|
|
45
|
+
return skip("inside the hours the rule leaves alone");
|
|
46
|
+
if (when.words.length > 0 && !when.words.some((word) => hasWord(message.text, word))) {
|
|
47
|
+
return skip("none of the rule's words");
|
|
48
|
+
}
|
|
49
|
+
if (when.question && !isQuestion(message.text))
|
|
50
|
+
return skip("not a question");
|
|
51
|
+
if (when.mentionsMe && !toMe)
|
|
52
|
+
return skip("does not mention you or reply to you");
|
|
53
|
+
const { from } = when;
|
|
54
|
+
if (from.people.length > 0 && !from.people.includes(message.senderId))
|
|
55
|
+
return skip("not from the rule's people");
|
|
56
|
+
if (from.notPeople.includes(message.senderId))
|
|
57
|
+
return skip("from a person the rule leaves out");
|
|
58
|
+
if (from.contactsOnly && !sender.isContact)
|
|
59
|
+
return skip("not from a contact");
|
|
60
|
+
const sent = state.sent[rule.id];
|
|
61
|
+
if (over(sent?.chats[chat.id], rule.limits.perChat, now))
|
|
62
|
+
return skip("the chat's limit is reached");
|
|
63
|
+
if (over(sent?.people[message.senderId], rule.limits.perPerson, now))
|
|
64
|
+
return skip("the person's limit is reached");
|
|
65
|
+
const text = filled(rule.reply.template, message.senderName);
|
|
66
|
+
if (text === undefined)
|
|
67
|
+
return skip("the template needs a name the sender has not given");
|
|
68
|
+
return { reply: { text, asReply: rule.reply.asReply, model: rule.reply.model } };
|
|
69
|
+
};
|
|
70
|
+
const mentionsOwner = (message, owner) => message.replyTo?.outgoing === true ||
|
|
71
|
+
(owner.id !== null && (message.mentions ?? []).includes(owner.id)) ||
|
|
72
|
+
(owner.username !== undefined && hasWord(message.text, `@${owner.username}`));
|
|
73
|
+
const local = (zone, now) => {
|
|
74
|
+
const parts = new Intl.DateTimeFormat("en-US", {
|
|
75
|
+
timeZone: zone,
|
|
76
|
+
weekday: "short",
|
|
77
|
+
hour: "2-digit",
|
|
78
|
+
minute: "2-digit",
|
|
79
|
+
hourCycle: "h23",
|
|
80
|
+
}).formatToParts(now);
|
|
81
|
+
const part = (type) => parts.find((one) => one.type === type)?.value ?? "";
|
|
82
|
+
return {
|
|
83
|
+
day: part("weekday").toLowerCase(),
|
|
84
|
+
minute: Number(part("hour")) * 60 + Number(part("minute")),
|
|
85
|
+
};
|
|
86
|
+
};
|
|
87
|
+
/**
|
|
88
|
+
* Outside the working time: not on one of `days`, or on one but not inside the window. A window that
|
|
89
|
+
* crosses midnight belongs to the day it starts on, so Friday 22:00–02:00 covers Saturday 01:00.
|
|
90
|
+
*/
|
|
91
|
+
const outside = ({ outside: window, days, timezone }, now) => {
|
|
92
|
+
const { day, minute } = local(timezone, now);
|
|
93
|
+
const crosses = window.to < window.from;
|
|
94
|
+
const working = crosses
|
|
95
|
+
? (days.includes(day) && minute >= window.from) || (days.includes(dayBefore(day)) && minute < window.to)
|
|
96
|
+
: days.includes(day) && minute >= window.from && minute < window.to;
|
|
97
|
+
return !working;
|
|
98
|
+
};
|
|
99
|
+
const dayBefore = (day) => DAYS[(DAYS.indexOf(day) + 6) % 7];
|
|
100
|
+
const escaped = (text) => text.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
101
|
+
/** Whole words, any case, any script: `price` is not found in `prices`, `цена` is found in `Цена?`. */
|
|
102
|
+
const hasWord = (text, word) => new RegExp(`(?<![\\p{L}\\p{N}_])${escaped(word.trim())}(?![\\p{L}\\p{N}_])`, "iu").test(text);
|
|
103
|
+
/** A shared link's query string is not a question. */
|
|
104
|
+
const isQuestion = (text) => text.replace(/https?:\/\/\S+/g, "").includes("?");
|
|
105
|
+
const over = (sent, { count, ms }, now) => (sent ?? []).filter((at) => now - Date.parse(at) < ms).length >= count;
|
|
106
|
+
const filled = (template, senderName) => {
|
|
107
|
+
const name = senderName?.trim() ?? "";
|
|
108
|
+
if (/\{(firstName|name)\}/.test(template) && name === "")
|
|
109
|
+
return undefined;
|
|
110
|
+
return template.replaceAll("{firstName}", name.split(/\s+/)[0] ?? name).replaceAll("{name}", name);
|
|
111
|
+
};
|
|
112
|
+
//# sourceMappingURL=decide.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decide.js","sourceRoot":"","sources":["../../src/replies/decide.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { Id } from "../domain/models.js";
|
|
2
|
+
import type { AccountKey, MessageStore } from "../store/store.js";
|
|
3
|
+
import { type ReplyRule, type Tester } from "./rules.js";
|
|
4
|
+
export declare const DRY_RUN_DAYS = 7;
|
|
5
|
+
export interface WouldReply {
|
|
6
|
+
locator: string;
|
|
7
|
+
chatId: Id;
|
|
8
|
+
chatTitle: string | null;
|
|
9
|
+
to: {
|
|
10
|
+
id: Id;
|
|
11
|
+
name: string | null;
|
|
12
|
+
};
|
|
13
|
+
at: string;
|
|
14
|
+
text: string;
|
|
15
|
+
asReply: boolean;
|
|
16
|
+
}
|
|
17
|
+
export interface RuleDryRun {
|
|
18
|
+
id: string;
|
|
19
|
+
would: WouldReply[];
|
|
20
|
+
/** How many messages the rule passed over, by the reason it gives. */
|
|
21
|
+
skipped: Record<string, number>;
|
|
22
|
+
}
|
|
23
|
+
export interface DryRun {
|
|
24
|
+
since: string;
|
|
25
|
+
until: string;
|
|
26
|
+
rules: RuleDryRun[];
|
|
27
|
+
/** Senders the store has no bot flag for; taken as people, as `serve` would have to. */
|
|
28
|
+
botUnknown: number;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* What the rules would have answered in the stored messages since `since`, as `serve` would have met
|
|
32
|
+
* them: oldest first, rules in file order, the first that replies wins, the limits counted as it goes.
|
|
33
|
+
* The state starts empty and lives only here, so a run changes no file and sends nothing. A rule that
|
|
34
|
+
* is off is tried as if on: trying it before turning it on is the point.
|
|
35
|
+
*/
|
|
36
|
+
export declare const dryRun: (store: MessageStore, account: AccountKey, rules: ReplyRule[], { since, until, only, testers, }: {
|
|
37
|
+
since: number;
|
|
38
|
+
until?: number;
|
|
39
|
+
only?: string;
|
|
40
|
+
testers: readonly Tester[];
|
|
41
|
+
}) => Promise<DryRun>;
|
|
42
|
+
/**
|
|
43
|
+
* What a message does not say about its sender, from the store: a contact is someone with a
|
|
44
|
+
* one-to-one chat, as `contacts list` counts them; `null` when the store has no bot flag.
|
|
45
|
+
*/
|
|
46
|
+
export declare const senderFacts: (store: MessageStore, account: AccountKey) => Promise<{
|
|
47
|
+
isContact: (id: Id) => boolean;
|
|
48
|
+
botOf: (id: Id) => Promise<boolean | null>;
|
|
49
|
+
botFlags: Map<string, boolean | null>;
|
|
50
|
+
}>;
|
|
51
|
+
//# sourceMappingURL=dry-run.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dry-run.d.ts","sourceRoot":"","sources":["../../src/replies/dry-run.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAQ,EAAE,EAAW,MAAM,qBAAqB,CAAA;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAEjE,OAAO,EAAY,KAAK,SAAS,EAAE,KAAK,MAAM,EAAE,MAAM,YAAY,CAAA;AAGlE,eAAO,MAAM,YAAY,IAAI,CAAA;AAG7B,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,EAAE,CAAA;IACV,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,EAAE,EAAE;QAAE,EAAE,EAAE,EAAE,CAAC;QAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAA;IACnC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,OAAO,CAAA;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,UAAU,EAAE,CAAA;IACnB,sEAAsE;IACtE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAChC;AAED,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,UAAU,EAAE,CAAA;IACnB,wFAAwF;IACxF,UAAU,EAAE,MAAM,CAAA;CACnB;AAED;;;;;GAKG;AACH,eAAO,MAAM,MAAM,UACV,YAAY,WACV,UAAU,SACZ,SAAS,EAAE,oCAMf;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,KAC9E,OAAO,CAAC,MAAM,CA0EhB,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,WAAW,UAAiB,YAAY,WAAW,UAAU;oBAa/C,EAAE;gBARF,EAAE,KAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;;EAStD,CAAA"}
|