@wirecat/cli-core 0.339.0 → 0.341.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/cli/author.d.ts +6 -0
- package/dist/cli/author.d.ts.map +1 -1
- package/dist/cli/author.js +15 -0
- package/dist/cli/author.js.map +1 -1
- package/dist/cli/context.d.ts +4 -2
- package/dist/cli/context.d.ts.map +1 -1
- package/dist/cli/context.js +2 -1
- package/dist/cli/context.js.map +1 -1
- package/dist/cli/effects.d.ts +2 -1
- package/dist/cli/effects.d.ts.map +1 -1
- package/dist/cli/effects.js +3 -2
- package/dist/cli/effects.js.map +1 -1
- package/dist/cli/index.d.ts +0 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +0 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/messenger/account-command.d.ts.map +1 -1
- package/dist/cli/messenger/account-command.js +3 -3
- package/dist/cli/messenger/account-command.js.map +1 -1
- package/dist/cli/messenger/admin-commands.d.ts +3 -0
- package/dist/cli/messenger/admin-commands.d.ts.map +1 -1
- package/dist/cli/messenger/admin-commands.js +15 -4
- package/dist/cli/messenger/admin-commands.js.map +1 -1
- package/dist/cli/messenger/attachments-command.d.ts.map +1 -1
- package/dist/cli/messenger/attachments-command.js +10 -3
- package/dist/cli/messenger/attachments-command.js.map +1 -1
- package/dist/cli/messenger/catch-up.d.ts +8 -2
- package/dist/cli/messenger/catch-up.d.ts.map +1 -1
- package/dist/cli/messenger/catch-up.js +11 -3
- package/dist/cli/messenger/catch-up.js.map +1 -1
- package/dist/cli/messenger/context.d.ts +14 -0
- package/dist/cli/messenger/context.d.ts.map +1 -1
- package/dist/cli/messenger/context.js +8 -4
- 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 +25 -1
- package/dist/cli/messenger/conversations-command.js.map +1 -1
- package/dist/cli/messenger/flood-command.js +2 -2
- package/dist/cli/messenger/flood-command.js.map +1 -1
- package/dist/cli/messenger/flooded.js +10 -10
- package/dist/cli/messenger/flooded.js.map +1 -1
- package/dist/cli/messenger/guard-commands.js +1 -1
- package/dist/cli/messenger/guard-commands.js.map +1 -1
- package/dist/cli/messenger/inbox.d.ts.map +1 -1
- package/dist/cli/messenger/inbox.js +11 -6
- package/dist/cli/messenger/inbox.js.map +1 -1
- package/dist/cli/messenger/mcp-command.js +1 -1
- package/dist/cli/messenger/mcp-command.js.map +1 -1
- package/dist/cli/messenger/mentions-command.d.ts.map +1 -1
- package/dist/cli/messenger/mentions-command.js +6 -7
- package/dist/cli/messenger/mentions-command.js.map +1 -1
- package/dist/cli/messenger/messages-command.d.ts.map +1 -1
- package/dist/cli/messenger/messages-command.js +2 -2
- package/dist/cli/messenger/messages-command.js.map +1 -1
- package/dist/cli/messenger/messages-send-command.d.ts.map +1 -1
- package/dist/cli/messenger/messages-send-command.js +13 -6
- package/dist/cli/messenger/messages-send-command.js.map +1 -1
- package/dist/cli/messenger/private-people-command.d.ts.map +1 -1
- package/dist/cli/messenger/private-people-command.js +5 -4
- package/dist/cli/messenger/private-people-command.js.map +1 -1
- package/dist/cli/messenger/refreshed-refs.d.ts +16 -0
- package/dist/cli/messenger/refreshed-refs.d.ts.map +1 -0
- package/dist/cli/messenger/refreshed-refs.js +31 -0
- package/dist/cli/messenger/refreshed-refs.js.map +1 -0
- package/dist/cli/messenger/review.js +6 -6
- package/dist/cli/messenger/review.js.map +1 -1
- package/dist/cli/messenger/serve-relay.d.ts +3 -0
- package/dist/cli/messenger/serve-relay.d.ts.map +1 -1
- package/dist/cli/messenger/stored.d.ts +1 -1
- package/dist/cli/messenger/stored.d.ts.map +1 -1
- package/dist/cli/messenger/stored.js +1 -1
- package/dist/cli/messenger/stored.js.map +1 -1
- package/dist/cli/messenger/tasks-command.d.ts.map +1 -1
- package/dist/cli/messenger/tasks-command.js +11 -9
- package/dist/cli/messenger/tasks-command.js.map +1 -1
- package/dist/cli/messenger/transcribe-command.d.ts.map +1 -1
- package/dist/cli/messenger/transcribe-command.js +3 -1
- package/dist/cli/messenger/transcribe-command.js.map +1 -1
- package/dist/cli/program.d.ts.map +1 -1
- package/dist/cli/program.js +7 -3
- package/dist/cli/program.js.map +1 -1
- package/dist/cli/stdin-field.d.ts +11 -0
- package/dist/cli/stdin-field.d.ts.map +1 -0
- package/dist/cli/stdin-field.js +7 -0
- package/dist/cli/stdin-field.js.map +1 -0
- package/dist/domain/attachments.d.ts +15 -1
- package/dist/domain/attachments.d.ts.map +1 -1
- package/dist/domain/attachments.js.map +1 -1
- package/dist/domain/models.d.ts +2 -0
- package/dist/domain/models.d.ts.map +1 -1
- package/dist/domain/models.js.map +1 -1
- package/dist/domain/tag-consolidation.d.ts +78 -0
- package/dist/domain/tag-consolidation.d.ts.map +1 -0
- package/dist/domain/tag-consolidation.js +2 -0
- package/dist/domain/tag-consolidation.js.map +1 -0
- package/dist/errors/reasons.d.ts.map +1 -1
- package/dist/errors/reasons.js +7 -1
- package/dist/errors/reasons.js.map +1 -1
- package/dist/mcp/agent.d.ts +10 -1
- package/dist/mcp/agent.d.ts.map +1 -1
- package/dist/mcp/agent.js +65 -20
- package/dist/mcp/agent.js.map +1 -1
- package/dist/mcp/prompts.js +1 -1
- package/dist/mcp/prompts.js.map +1 -1
- package/dist/mcp/server.d.ts +5 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +278 -32
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/session.d.ts +2 -0
- package/dist/mcp/session.d.ts.map +1 -1
- package/dist/mcp/session.js +2 -0
- package/dist/mcp/session.js.map +1 -1
- package/dist/mcp/surface.d.ts +5 -2
- package/dist/mcp/surface.d.ts.map +1 -1
- package/dist/mcp/surface.js +7 -4
- package/dist/mcp/surface.js.map +1 -1
- package/dist/mcp/tool.d.ts +3 -6
- package/dist/mcp/tool.d.ts.map +1 -1
- package/dist/mcp/tool.js +3 -36
- package/dist/mcp/tool.js.map +1 -1
- package/dist/mcp/tools/attachments.d.ts.map +1 -1
- package/dist/mcp/tools/attachments.js +3 -138
- package/dist/mcp/tools/attachments.js.map +1 -1
- package/dist/mcp/tools/messages-photo.d.ts.map +1 -1
- package/dist/mcp/tools/messages-photo.js +3 -1
- package/dist/mcp/tools/messages-photo.js.map +1 -1
- package/dist/mcp/tools.d.ts +4 -21
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +4 -97
- package/dist/mcp/tools.js.map +1 -1
- package/dist/meetings/mcp/index.d.ts +15 -15
- package/dist/meetings/mcp/index.d.ts.map +1 -1
- package/dist/ports/messenger.d.ts +3 -1
- package/dist/ports/messenger.d.ts.map +1 -1
- package/dist/ports/messenger.js.map +1 -1
- package/dist/sends/file-lock.d.ts +10 -1
- package/dist/sends/file-lock.d.ts.map +1 -1
- package/dist/sends/file-lock.js +42 -14
- package/dist/sends/file-lock.js.map +1 -1
- package/dist/sends/guard.d.ts +5 -0
- package/dist/sends/guard.d.ts.map +1 -1
- package/dist/sends/guard.js +54 -42
- package/dist/sends/guard.js.map +1 -1
- package/dist/sends/guarded.d.ts.map +1 -1
- package/dist/sends/guarded.js +14 -1
- package/dist/sends/guarded.js.map +1 -1
- package/dist/sends/index.d.ts +1 -1
- package/dist/sends/index.d.ts.map +1 -1
- package/dist/sends/journal.d.ts +3 -1
- package/dist/sends/journal.d.ts.map +1 -1
- package/dist/sends/journal.js +5 -1
- package/dist/sends/journal.js.map +1 -1
- package/dist/sends/pace.d.ts +3 -3
- package/dist/sends/pace.d.ts.map +1 -1
- package/dist/sends/pace.js +7 -7
- package/dist/sends/pace.js.map +1 -1
- package/dist/sends/permissions.d.ts.map +1 -1
- package/dist/sends/permissions.js +2 -1
- package/dist/sends/permissions.js.map +1 -1
- package/dist/sends/recipients.d.ts +3 -1
- package/dist/sends/recipients.d.ts.map +1 -1
- package/dist/sends/recipients.js +23 -16
- package/dist/sends/recipients.js.map +1 -1
- package/dist/sends/upload.d.ts +15 -2
- package/dist/sends/upload.d.ts.map +1 -1
- package/dist/sends/upload.js +58 -9
- package/dist/sends/upload.js.map +1 -1
- package/dist/services/admin.d.ts.map +1 -1
- package/dist/services/admin.js +7 -1
- package/dist/services/admin.js.map +1 -1
- package/dist/services/file-download.d.ts +3 -0
- package/dist/services/file-download.d.ts.map +1 -1
- package/dist/services/file-download.js +11 -0
- package/dist/services/file-download.js.map +1 -1
- package/dist/services/messages.d.ts +3 -1
- package/dist/services/messages.d.ts.map +1 -1
- package/dist/services/messages.js +14 -5
- package/dist/services/messages.js.map +1 -1
- package/dist/services/pictures.d.ts.map +1 -1
- package/dist/services/pictures.js +12 -2
- package/dist/services/pictures.js.map +1 -1
- package/dist/speech/transcribe.d.ts +3 -2
- package/dist/speech/transcribe.d.ts.map +1 -1
- package/dist/speech/transcribe.js +5 -2
- package/dist/speech/transcribe.js.map +1 -1
- package/dist/store/attachments.d.ts +6 -1
- package/dist/store/attachments.d.ts.map +1 -1
- package/dist/store/attachments.js +10 -0
- package/dist/store/attachments.js.map +1 -1
- package/dist/store/drivers/node-sqlite.d.ts +2 -3
- package/dist/store/drivers/node-sqlite.d.ts.map +1 -1
- package/dist/store/drivers/node-sqlite.js +2 -3
- package/dist/store/drivers/node-sqlite.js.map +1 -1
- package/dist/store/index.d.ts +1 -0
- package/dist/store/index.d.ts.map +1 -1
- package/dist/store/index.js.map +1 -1
- package/dist/store/open.d.ts.map +1 -1
- package/dist/store/open.js +2 -0
- package/dist/store/open.js.map +1 -1
- package/dist/store/sqlite/attachments.d.ts +4 -2
- package/dist/store/sqlite/attachments.d.ts.map +1 -1
- package/dist/store/sqlite/attachments.js +15 -12
- package/dist/store/sqlite/attachments.js.map +1 -1
- package/dist/store/sqlite/open.d.ts.map +1 -1
- package/dist/store/sqlite/open.js +2 -0
- package/dist/store/sqlite/open.js.map +1 -1
- package/dist/store/sqlite/tag-consolidation.d.ts +5 -0
- package/dist/store/sqlite/tag-consolidation.d.ts.map +1 -0
- package/dist/store/sqlite/tag-consolidation.js +178 -0
- package/dist/store/sqlite/tag-consolidation.js.map +1 -0
- package/dist/store/sqlite/tags.js +1 -1
- package/dist/store/sqlite/tags.js.map +1 -1
- package/dist/store/sqlite/vocabulary.d.ts +2 -1
- package/dist/store/sqlite/vocabulary.d.ts.map +1 -1
- package/dist/store/sqlite/vocabulary.js +2 -0
- package/dist/store/sqlite/vocabulary.js.map +1 -1
- package/dist/store/sqlite-warning.d.ts +8 -0
- package/dist/store/sqlite-warning.d.ts.map +1 -0
- package/dist/store/sqlite-warning.js +26 -0
- package/dist/store/sqlite-warning.js.map +1 -0
- package/package.json +2 -2
- package/parity.json +36 -2
- package/dist/mcp/search-sync.d.ts +0 -12
- package/dist/mcp/search-sync.d.ts.map +0 -1
- package/dist/mcp/search-sync.js +0 -18
- package/dist/mcp/search-sync.js.map +0 -1
- package/dist/mcp/thread-options.d.ts +0 -19
- package/dist/mcp/thread-options.d.ts.map +0 -1
- package/dist/mcp/thread-options.js +0 -20
- package/dist/mcp/thread-options.js.map +0 -1
- package/dist/mcp/tools/account.d.ts +0 -4
- package/dist/mcp/tools/account.d.ts.map +0 -1
- package/dist/mcp/tools/account.js +0 -31
- package/dist/mcp/tools/account.js.map +0 -1
- package/dist/mcp/tools/admin-statistics.d.ts +0 -4
- package/dist/mcp/tools/admin-statistics.d.ts.map +0 -1
- package/dist/mcp/tools/admin-statistics.js +0 -163
- package/dist/mcp/tools/admin-statistics.js.map +0 -1
- package/dist/mcp/tools/admin.d.ts +0 -5
- package/dist/mcp/tools/admin.d.ts.map +0 -1
- package/dist/mcp/tools/admin.js +0 -257
- package/dist/mcp/tools/admin.js.map +0 -1
- package/dist/mcp/tools/chats-read.d.ts +0 -4
- package/dist/mcp/tools/chats-read.d.ts.map +0 -1
- package/dist/mcp/tools/chats-read.js +0 -28
- package/dist/mcp/tools/chats-read.js.map +0 -1
- package/dist/mcp/tools/chats-state.d.ts +0 -5
- package/dist/mcp/tools/chats-state.d.ts.map +0 -1
- package/dist/mcp/tools/chats-state.js +0 -58
- package/dist/mcp/tools/chats-state.js.map +0 -1
- package/dist/mcp/tools/chats.d.ts +0 -4
- package/dist/mcp/tools/chats.d.ts.map +0 -1
- package/dist/mcp/tools/chats.js +0 -194
- package/dist/mcp/tools/chats.js.map +0 -1
- package/dist/mcp/tools/contacts-write.d.ts +0 -5
- package/dist/mcp/tools/contacts-write.d.ts.map +0 -1
- package/dist/mcp/tools/contacts-write.js +0 -53
- package/dist/mcp/tools/contacts-write.js.map +0 -1
- package/dist/mcp/tools/contacts.d.ts +0 -4
- package/dist/mcp/tools/contacts.d.ts.map +0 -1
- package/dist/mcp/tools/contacts.js +0 -196
- package/dist/mcp/tools/contacts.js.map +0 -1
- package/dist/mcp/tools/conversations.d.ts +0 -5
- package/dist/mcp/tools/conversations.d.ts.map +0 -1
- package/dist/mcp/tools/conversations.js +0 -265
- package/dist/mcp/tools/conversations.js.map +0 -1
- package/dist/mcp/tools/folders.d.ts +0 -5
- package/dist/mcp/tools/folders.d.ts.map +0 -1
- package/dist/mcp/tools/folders.js +0 -103
- package/dist/mcp/tools/folders.js.map +0 -1
- package/dist/mcp/tools/inbox.d.ts +0 -6
- package/dist/mcp/tools/inbox.d.ts.map +0 -1
- package/dist/mcp/tools/inbox.js +0 -65
- package/dist/mcp/tools/inbox.js.map +0 -1
- package/dist/mcp/tools/messages-actions.d.ts +0 -5
- package/dist/mcp/tools/messages-actions.d.ts.map +0 -1
- package/dist/mcp/tools/messages-actions.js +0 -129
- package/dist/mcp/tools/messages-actions.js.map +0 -1
- package/dist/mcp/tools/messages-delete.d.ts +0 -4
- package/dist/mcp/tools/messages-delete.d.ts.map +0 -1
- package/dist/mcp/tools/messages-delete.js +0 -39
- package/dist/mcp/tools/messages-delete.js.map +0 -1
- package/dist/mcp/tools/messages-send.d.ts +0 -8
- package/dist/mcp/tools/messages-send.d.ts.map +0 -1
- package/dist/mcp/tools/messages-send.js +0 -99
- package/dist/mcp/tools/messages-send.js.map +0 -1
- package/dist/mcp/tools/messages-transcribe.d.ts +0 -4
- package/dist/mcp/tools/messages-transcribe.d.ts.map +0 -1
- package/dist/mcp/tools/messages-transcribe.js +0 -32
- package/dist/mcp/tools/messages-transcribe.js.map +0 -1
- package/dist/mcp/tools/messages.d.ts +0 -4
- package/dist/mcp/tools/messages.d.ts.map +0 -1
- package/dist/mcp/tools/messages.js +0 -205
- package/dist/mcp/tools/messages.js.map +0 -1
- package/dist/mcp/tools/moderation.d.ts +0 -8
- package/dist/mcp/tools/moderation.d.ts.map +0 -1
- package/dist/mcp/tools/moderation.js +0 -36
- package/dist/mcp/tools/moderation.js.map +0 -1
- package/dist/mcp/tools/polls.d.ts +0 -6
- package/dist/mcp/tools/polls.d.ts.map +0 -1
- package/dist/mcp/tools/polls.js +0 -140
- package/dist/mcp/tools/polls.js.map +0 -1
- package/dist/mcp/tools/private-people.d.ts +0 -4
- package/dist/mcp/tools/private-people.d.ts.map +0 -1
- package/dist/mcp/tools/private-people.js +0 -121
- package/dist/mcp/tools/private-people.js.map +0 -1
- package/dist/mcp/tools/rankings.d.ts +0 -4
- package/dist/mcp/tools/rankings.d.ts.map +0 -1
- package/dist/mcp/tools/rankings.js +0 -112
- package/dist/mcp/tools/rankings.js.map +0 -1
- package/dist/mcp/tools/reactions.d.ts +0 -5
- package/dist/mcp/tools/reactions.d.ts.map +0 -1
- package/dist/mcp/tools/reactions.js +0 -33
- package/dist/mcp/tools/reactions.js.map +0 -1
- package/dist/mcp/tools/review.d.ts +0 -4
- package/dist/mcp/tools/review.d.ts.map +0 -1
- package/dist/mcp/tools/review.js +0 -68
- package/dist/mcp/tools/review.js.map +0 -1
- package/dist/mcp/tools/runs.d.ts +0 -4
- package/dist/mcp/tools/runs.d.ts.map +0 -1
- package/dist/mcp/tools/runs.js +0 -28
- package/dist/mcp/tools/runs.js.map +0 -1
- package/dist/mcp/tools/search-tools.d.ts +0 -5
- package/dist/mcp/tools/search-tools.d.ts.map +0 -1
- package/dist/mcp/tools/search-tools.js +0 -132
- package/dist/mcp/tools/search-tools.js.map +0 -1
- package/dist/mcp/tools/search.d.ts +0 -154
- package/dist/mcp/tools/search.d.ts.map +0 -1
- package/dist/mcp/tools/search.js +0 -163
- package/dist/mcp/tools/search.js.map +0 -1
- package/dist/mcp/tools/searches.d.ts +0 -4
- package/dist/mcp/tools/searches.d.ts.map +0 -1
- package/dist/mcp/tools/searches.js +0 -108
- package/dist/mcp/tools/searches.js.map +0 -1
- package/dist/mcp/tools/store.d.ts +0 -4
- package/dist/mcp/tools/store.d.ts.map +0 -1
- package/dist/mcp/tools/store.js +0 -163
- package/dist/mcp/tools/store.js.map +0 -1
- package/dist/mcp/tools/tags.d.ts +0 -4
- package/dist/mcp/tools/tags.d.ts.map +0 -1
- package/dist/mcp/tools/tags.js +0 -64
- package/dist/mcp/tools/tags.js.map +0 -1
- package/dist/mcp/tools/tasks.d.ts +0 -4
- package/dist/mcp/tools/tasks.d.ts.map +0 -1
- package/dist/mcp/tools/tasks.js +0 -369
- package/dist/mcp/tools/tasks.js.map +0 -1
- package/dist/mcp/tools/topics.d.ts +0 -5
- package/dist/mcp/tools/topics.d.ts.map +0 -1
- package/dist/mcp/tools/topics.js +0 -134
- package/dist/mcp/tools/topics.js.map +0 -1
package/dist/mcp/tools/review.js
DELETED
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
import { CliError } from "@wirecat/cli-base";
|
|
2
|
-
import * as v from "valibot";
|
|
3
|
-
import { catchUpQuery, REVIEW_QUERY, reviewAnswer } from "../../cli/messenger/catch-up-answers.js";
|
|
4
|
-
import { checkPoints } from "../../cli/messenger/points.js";
|
|
5
|
-
import { REVIEW_DAYS, reviewStart, UNANSWERED_HOURS } from "../../services/inbox.js";
|
|
6
|
-
import { heard, hearForTool, modelWith } from "../../speech/hearing.js";
|
|
7
|
-
import { READ, tool } from "../tool.js";
|
|
8
|
-
import { kindsInput } from "./inbox.js";
|
|
9
|
-
export const reviewTools = (messenger) => ({
|
|
10
|
-
review: tool({
|
|
11
|
-
title: "Review who owes what",
|
|
12
|
-
description: "Every message, the owner's too (outgoing: true), in each chat that changed since a point — for sorting out " +
|
|
13
|
-
`what the owner owes and what others owe. Without a date in \`query\`, the last ${REVIEW_DAYS} days; with \`new\`, ` +
|
|
14
|
-
"what changed since the last call with new, from points this tool keeps apart from the owner's own. Muted and archived " +
|
|
15
|
-
"chats are left out unless they mention the owner, or `all` is set. Items are messages, oldest first, each " +
|
|
16
|
-
"naming its chat. The first next step, review.next, is the query the next review starts from; chats cut short, " +
|
|
17
|
-
"skipped or left out are `missing` entries.",
|
|
18
|
-
input: v.object({
|
|
19
|
-
query: v.optional(v.pipe(v.string(), v.description('where the last review ended and which chat: date>"2026-10-01T09:00:00Z", chat:"Book club"'))),
|
|
20
|
-
new: v.optional(v.pipe(v.boolean(), v.description("what changed since the last call with new"))),
|
|
21
|
-
kinds: kindsInput,
|
|
22
|
-
unanswered: v.optional(v.pipe(v.number(), v.minValue(0), v.description(`only questions nobody answered, asked at least this many hours ago (${UNANSWERED_HOURS} is usual)`))),
|
|
23
|
-
all: v.optional(v.pipe(v.boolean(), v.description("muted and archived chats too"))),
|
|
24
|
-
transcribe: v.optional(v.pipe(v.boolean(), v.description("turn voice messages not heard yet into text; can take minutes"))),
|
|
25
|
-
model: v.optional(v.pipe(v.string(), v.minLength(1), v.description("which downloaded speech model hears them, with transcribe"))),
|
|
26
|
-
}),
|
|
27
|
-
annotations: READ,
|
|
28
|
-
output: { entity: "message.summary", list: true },
|
|
29
|
-
served: async (services, args, defaults, connect) => {
|
|
30
|
-
const { since: from, chat } = catchUpQuery(args.query, REVIEW_QUERY, "review");
|
|
31
|
-
if (args.new && (from !== undefined || args.unanswered !== undefined)) {
|
|
32
|
-
// An open question stays open: moving past it would drop it from the next review.
|
|
33
|
-
throw new CliError("validation_error", "new keeps its own point — not with a date or unanswered");
|
|
34
|
-
}
|
|
35
|
-
const saved = args.new
|
|
36
|
-
? checkPoints(messenger.app, {
|
|
37
|
-
command: "mcp-review",
|
|
38
|
-
profile: defaults.settings.profile,
|
|
39
|
-
env: defaults.env,
|
|
40
|
-
firstLookMs: REVIEW_DAYS * 86_400_000,
|
|
41
|
-
})
|
|
42
|
-
: undefined;
|
|
43
|
-
const model = modelWith(args.transcribe, args.model);
|
|
44
|
-
let hearing;
|
|
45
|
-
const transcribe = args.transcribe === true;
|
|
46
|
-
const found = await services.inbox.review({
|
|
47
|
-
since: from ?? saved?.first ?? reviewStart(),
|
|
48
|
-
...(saved === undefined ? {} : { points: saved.chats }),
|
|
49
|
-
...(chat === undefined ? {} : { chat }),
|
|
50
|
-
...(args.kinds === undefined ? {} : { kinds: args.kinds }),
|
|
51
|
-
...(args.all ? { all: true } : {}),
|
|
52
|
-
...(args.unanswered === undefined ? {} : { unansweredAfterHours: args.unanswered }),
|
|
53
|
-
enrich: async (raw) => {
|
|
54
|
-
hearing = await hearForTool(messenger, connect, raw.chats.flatMap((chat) => chat.messages), transcribe, defaults, model);
|
|
55
|
-
return {
|
|
56
|
-
...raw,
|
|
57
|
-
complete: raw.complete && (hearing?.unheard.length ?? 0) === 0,
|
|
58
|
-
chats: raw.chats.map((chat) => ({ ...chat, messages: heard(chat.messages, hearing) })),
|
|
59
|
-
};
|
|
60
|
-
},
|
|
61
|
-
});
|
|
62
|
-
const answer = reviewAnswer({ ...found, complete: found.complete && (hearing?.unheard.length ?? 0) === 0 }, hearing, await services.messages.reader(), { transcribe, fresh: saved !== undefined, ...(chat === undefined ? {} : { chat }) });
|
|
63
|
-
saved?.save(found.checked ?? {});
|
|
64
|
-
return answer;
|
|
65
|
-
},
|
|
66
|
-
}),
|
|
67
|
-
});
|
|
68
|
-
//# sourceMappingURL=review.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"review.js","sourceRoot":"","sources":["../../../src/mcp/tools/review.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/tools/runs.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runs.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/runs.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAA;AAG/D,OAAO,EAAE,KAAK,OAAO,EAAc,MAAM,YAAY,CAAA;AAErD,eAAO,MAAM,SAAS,cAAe,SAAS,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CA2BrE,CAAA"}
|
package/dist/mcp/tools/runs.js
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import * as v from "valibot";
|
|
2
|
-
import { runsFound, searchRuns } from "../../cli/runs/search.js";
|
|
3
|
-
import { runsDirFor } from "../../runs/run.js";
|
|
4
|
-
import { READ, tool } from "../tool.js";
|
|
5
|
-
export const runsTools = (messenger) => ({
|
|
6
|
-
runs_search: tool({
|
|
7
|
-
title: "Search recorded diagnostic logs",
|
|
8
|
-
description: "Search this profile's run metadata and safe diagnostic events, including partial batches and failed IDs. No message contents, tokens or raw job logs. Literal query plus status, error_code, operation and since_time filters; paged results. Does not connect or record its own search. Each run has at most 100 matched events, with events_truncated.",
|
|
9
|
-
key: null,
|
|
10
|
-
annotations: { ...READ, openWorldHint: false },
|
|
11
|
-
input: v.object({
|
|
12
|
-
query: v.optional(v.string()),
|
|
13
|
-
status: v.optional(v.picklist(["success", "failed", "partial", "running"])),
|
|
14
|
-
error_code: v.optional(v.string()),
|
|
15
|
-
operation: v.optional(v.string()),
|
|
16
|
-
since_time: v.optional(v.string()),
|
|
17
|
-
limit: v.optional(v.pipe(v.number(), v.integer(), v.minValue(1), v.maxValue(100))),
|
|
18
|
-
page: v.optional(v.pipe(v.number(), v.integer(), v.minValue(1))),
|
|
19
|
-
}),
|
|
20
|
-
local: async (args, defaults) => runsFound(searchRuns(runsDirFor(messenger.app, defaults.env), {
|
|
21
|
-
...args,
|
|
22
|
-
errorCode: args.error_code,
|
|
23
|
-
since: args.since_time,
|
|
24
|
-
profile: defaults.settings.profile ?? "default",
|
|
25
|
-
}), { ...args }),
|
|
26
|
-
}),
|
|
27
|
-
});
|
|
28
|
-
//# sourceMappingURL=runs.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runs.js","sourceRoot":"","sources":["../../../src/mcp/tools/runs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAE5B,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAgB,IAAI,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAErD,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,SAAoB,EAA2B,EAAE,CAAC,CAAC;IAC3E,WAAW,EAAE,IAAI,CAAC;QAChB,KAAK,EAAE,iCAAiC;QACxC,WAAW,EACT,0VAA0V;QAC5V,GAAG,EAAE,IAAI;QACT,WAAW,EAAE,EAAE,GAAG,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE;QAC9C,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;YACd,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;YAC7B,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;YAC3E,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;YAClC,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;YACjC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;YAClC,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,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,GAAG,CAAC,CAAC,CAAC;YAClF,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;SACjE,CAAC;QACF,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,CAC9B,SAAS,CACP,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE;YAClD,GAAG,IAAI;YACP,SAAS,EAAE,IAAI,CAAC,UAAU;YAC1B,KAAK,EAAE,IAAI,CAAC,UAAU;YACtB,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,OAAO,IAAI,SAAS;SAChD,CAAC,EACF,EAAE,GAAG,IAAI,EAAE,CACZ;KACJ,CAAC;CACH,CAAC,CAAA"}
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import type { Messenger } from "../../cli/messenger/context.js";
|
|
2
|
-
import { type AnyTool } from "../tool.js";
|
|
3
|
-
/** One tool per `search` leaf; `search all` is the one an agent reaches for first. */
|
|
4
|
-
export declare const searchTools: (messenger: Messenger) => Record<string, AnyTool>;
|
|
5
|
-
//# sourceMappingURL=search-tools.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"search-tools.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/search-tools.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAA;AAI/D,OAAO,EAAE,KAAK,OAAO,EAAqB,MAAM,YAAY,CAAA;AAgB5D,sFAAsF;AACtF,eAAO,MAAM,WAAW,cAAe,SAAS,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAyJvE,CAAA"}
|
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
import * as v from "valibot";
|
|
2
|
-
import { allAnswer, notesAnswer, offsetOf, SOURCE_SEARCHED } from "../../cli/messenger/search-answers.js";
|
|
3
|
-
import { searchNotesOf } from "../../services/notes-search.js";
|
|
4
|
-
import { searchServices } from "../search-sync.js";
|
|
5
|
-
import { limit, READ, tool } from "../tool.js";
|
|
6
|
-
import { answerMessagesSearch, backendArgs, backendInputs, messagesSearchDescription, messagesSearchInput, page, } from "./search.js";
|
|
7
|
-
const text = v.pipe(v.string(), v.minLength(1), v.description("the query, in the strict Lucene language"));
|
|
8
|
-
const exact = v.optional(v.pipe(v.boolean(), v.description("bare words and quotes match their exact form only; meaning is not searched")));
|
|
9
|
-
const timezone = v.optional(v.pipe(v.string(), v.description("the IANA timezone for calendar date boundaries")));
|
|
10
|
-
/** One tool per `search` leaf; `search all` is the one an agent reaches for first. */
|
|
11
|
-
export const searchTools = (messenger) => ({
|
|
12
|
-
search_all: tool({
|
|
13
|
-
title: "Search messages and notes",
|
|
14
|
-
description: "Messenger messages and notes held in the local store, merged best first — only these two kinds, and one " +
|
|
15
|
-
"meeting account when `source` names it; mail is memo's (its search_mail), and tasks, people, memories, " +
|
|
16
|
-
"projects, organizations and decisions are not searched here. Use it when you do not know where something was " +
|
|
17
|
-
"written. When you know the kind, call its own tool: `search messages`, `search notes`, or `search conversations` to " +
|
|
18
|
-
"find by meaning. An empty answer means neither holds it: try the kind's own tool, looser words or search by " +
|
|
19
|
-
"meaning before you conclude it was never written. Where the messenger's server can search, it is asked for " +
|
|
20
|
-
"messages too, as `search messages` asks it (backend=both by default; archive for the local store only; server " +
|
|
21
|
-
"for the server's hits only) — notes are local only. Each item says its kind (message, note), ref (msg:… or " +
|
|
22
|
-
"note:…), provider and account. A query field one kind lacks skips that kind and meta.issues names it; `only` " +
|
|
23
|
-
"narrows the kinds. `source` names the accounts: provider:account as an item shows it, a provider, a kind or " +
|
|
24
|
-
"group:<name>; each kind reads its own of them, and meta.issues names an entry no kind reads. Meetings are read " +
|
|
25
|
-
"only when `source` names one meeting account (zoom:<account>, zoom, meetings, or all when one account holds " +
|
|
26
|
-
"meetings): its transcripts, chat and summaries join in as kind meeting, with offset_ms into the meeting, and a " +
|
|
27
|
-
"null timestamp when the start is unknown; otherwise meta.issues says meetings were not searched. Returns " +
|
|
28
|
-
"{ items, page, next?, missing?, meta }; meta.accounts lists every account read as provider:account; a missing " +
|
|
29
|
-
"entry says when a bounded meeting scan stopped before it could tell whether more match.",
|
|
30
|
-
input: v.object({
|
|
31
|
-
// Typed as present so the answer code reads them; offered only where the server can search.
|
|
32
|
-
...(messenger.serverSearch ? backendInputs : {}),
|
|
33
|
-
text,
|
|
34
|
-
page,
|
|
35
|
-
only: v.optional(v.pipe(v.array(v.picklist(SOURCE_SEARCHED)), v.minLength(1), v.description("only these kinds: messages, notes; meetings when `source` names a meeting account"))),
|
|
36
|
-
source: v.optional(v.pipe(v.string(), v.minLength(1), v.description("only these accounts, comma-separated: provider:account as an item shows it, a provider, a kind or group:<name>"))),
|
|
37
|
-
max_meetings: v.optional(v.pipe(v.union([v.pipe(v.number(), v.integer(), v.minValue(1)), v.literal("all")]), v.description("how many of the meeting account's meetings to look through, newest first, or all (default 100)"))),
|
|
38
|
-
exact,
|
|
39
|
-
timezone,
|
|
40
|
-
limit,
|
|
41
|
-
}),
|
|
42
|
-
annotations: { ...READ, openWorldHint: Boolean(messenger.serverSearch) },
|
|
43
|
-
output: { entity: "hit", list: true },
|
|
44
|
-
stored: async (store, account, args, defaults, connect) => {
|
|
45
|
-
const network = Boolean(messenger.serverSearch) && args.backend !== "archive";
|
|
46
|
-
const services = searchServices(messenger, store, account, defaults, network ? connect : undefined);
|
|
47
|
-
const size = args.limit ?? defaults.limit;
|
|
48
|
-
const offset = offsetOf(args.page, size);
|
|
49
|
-
const request = {
|
|
50
|
-
text: args.text,
|
|
51
|
-
limit: size,
|
|
52
|
-
...(offset === undefined ? {} : { offset }),
|
|
53
|
-
...(args.exact ? { exact: true } : {}),
|
|
54
|
-
...(args.timezone === undefined ? {} : { timezone: args.timezone }),
|
|
55
|
-
...backendArgs(args),
|
|
56
|
-
env: defaults.env,
|
|
57
|
-
...(defaults.signal === undefined ? {} : { signal: defaults.signal }),
|
|
58
|
-
};
|
|
59
|
-
const found = await services.messages.searchAllWithMeetings({
|
|
60
|
-
...request,
|
|
61
|
-
only: args.only ?? SOURCE_SEARCHED,
|
|
62
|
-
...(args.source === undefined ? {} : { source: args.source }),
|
|
63
|
-
...(args.max_meetings === undefined ? {} : { maxMeetings: args.max_meetings }),
|
|
64
|
-
});
|
|
65
|
-
const again = {
|
|
66
|
-
query: args.text,
|
|
67
|
-
...(args.only === undefined ? {} : { only: args.only.join(",") }),
|
|
68
|
-
...(args.source === undefined ? {} : { source: args.source }),
|
|
69
|
-
...(args.max_meetings === undefined ? {} : { max_meetings: args.max_meetings }),
|
|
70
|
-
...(args.exact ? { exact: true } : {}),
|
|
71
|
-
...(args.timezone === undefined ? {} : { timezone: args.timezone }),
|
|
72
|
-
};
|
|
73
|
-
return allAnswer("search all", found, { limit: size, page: args.page ?? 1, again }, args.exact === true);
|
|
74
|
-
},
|
|
75
|
-
}),
|
|
76
|
-
search_messages: tool({
|
|
77
|
-
title: "Search messenger messages",
|
|
78
|
-
description: messagesSearchDescription(messenger),
|
|
79
|
-
input: messagesSearchInput(messenger),
|
|
80
|
-
annotations: { ...READ, openWorldHint: Boolean(messenger.serverSearch) },
|
|
81
|
-
output: { entity: "message.hit", list: true },
|
|
82
|
-
stored: (store, account, args, defaults, connect) => {
|
|
83
|
-
const network = args.sync_first || (Boolean(messenger.serverSearch) && args.backend !== "archive");
|
|
84
|
-
const services = searchServices(messenger, store, account, defaults, network ? connect : undefined);
|
|
85
|
-
return answerMessagesSearch(services.messages, args, defaults, services.searches);
|
|
86
|
-
},
|
|
87
|
-
}),
|
|
88
|
-
search_notes: tool({
|
|
89
|
-
title: "Search notes",
|
|
90
|
-
description: "Search the notes — written in memo, or imported from a notes folder — by words and, with the local text " +
|
|
91
|
-
"model, by meaning. Each item says which found it (found_by) and what it links to (links). source:internal in " +
|
|
92
|
-
"text keeps the notes written in memo, source:file those from a notes folder. The `source` input narrows " +
|
|
93
|
-
"which accounts are read: notes:internal for notes written in memo, notes:<folder id> as an item's folder_id shows it, or a list " +
|
|
94
|
-
"with group:<name>; an entry naming none is in meta.issues. `filter` is a query every item must also match, " +
|
|
95
|
-
"tag:work among them, and leaves the search by meaning as it is. Returns { items, page, next?, missing?, meta }.",
|
|
96
|
-
input: v.object({
|
|
97
|
-
text,
|
|
98
|
-
source: v.optional(v.pipe(v.string(), v.minLength(1), v.description("only these notes accounts, comma-separated: notes:internal, notes:<folder id>, or group:<name>"))),
|
|
99
|
-
filter: v.optional(v.pipe(v.string(), v.description("a query every hit must also match"))),
|
|
100
|
-
page,
|
|
101
|
-
exact,
|
|
102
|
-
timezone,
|
|
103
|
-
limit,
|
|
104
|
-
}),
|
|
105
|
-
annotations: { ...READ, openWorldHint: false },
|
|
106
|
-
output: { entity: "note.hit", list: true },
|
|
107
|
-
stored: async (store, account, args, defaults) => {
|
|
108
|
-
const size = args.limit ?? defaults.limit;
|
|
109
|
-
const offset = offsetOf(args.page, size);
|
|
110
|
-
const found = await searchNotesOf(store, account, args.text, {
|
|
111
|
-
limit: size,
|
|
112
|
-
command: messenger.app.command,
|
|
113
|
-
env: defaults.env,
|
|
114
|
-
...(offset === undefined ? {} : { offset }),
|
|
115
|
-
...(args.source === undefined ? {} : { accounts: args.source }),
|
|
116
|
-
app: messenger.app,
|
|
117
|
-
...(args.filter === undefined ? {} : { filter: args.filter }),
|
|
118
|
-
...(args.exact ? { exact: true } : {}),
|
|
119
|
-
...(args.timezone === undefined ? {} : { timezone: args.timezone }),
|
|
120
|
-
});
|
|
121
|
-
const again = {
|
|
122
|
-
query: args.text,
|
|
123
|
-
...(args.source === undefined ? {} : { source: args.source }),
|
|
124
|
-
...(args.filter === undefined ? {} : { filter: args.filter }),
|
|
125
|
-
...(args.exact ? { exact: true } : {}),
|
|
126
|
-
...(args.timezone === undefined ? {} : { timezone: args.timezone }),
|
|
127
|
-
};
|
|
128
|
-
return notesAnswer("search notes", found, { limit: size, page: args.page ?? 1, again }, args.exact === true);
|
|
129
|
-
},
|
|
130
|
-
}),
|
|
131
|
-
});
|
|
132
|
-
//# sourceMappingURL=search-tools.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"search-tools.js","sourceRoot":"","sources":["../../../src/mcp/tools/search-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
import * as v from "valibot";
|
|
2
|
-
import type { Messenger } from "../../cli/messenger/context.js";
|
|
3
|
-
import type { MessagesService } from "../../services/messages.js";
|
|
4
|
-
import type { SearchKind } from "../../services/search-kind.js";
|
|
5
|
-
import type { SearchesService } from "../../services/searches.js";
|
|
6
|
-
export declare const MESSAGES_SEARCH_DESCRIPTION = "Use discover=true for partial lexical evidence and eligible replies to natural questions in the local archive, without model downloads; inspect each item's discovery.missing_terms and its context before answering. Explicit syntax stays strict, and ranking is not answer confidence. Search the local store, and the messenger's server where it can search, using the Lucene 9.12.3 profile, default AND, with strict Boolean matching. chat: narrows to one chat; has:voice, has:file and NOT has:attachment to voice messages, files or text alone. `saved` runs a saved search (`searches list`) or an earlier run (`searches history`). With sync_first, first fetch new messages within max_chats (5), sync_time (30s), max_messages (500), under messages.sync-first permission. thread=true puts each hit's bounded parent/reply graph in its context; thread_hops, thread_messages, thread_bytes, thread_within set its bounds. Guide: https://github.com/WireCatLabs/cli-core/blob/main/docs/search/query-language.md. Text words and quoted phrases match every form of their words (Snowball stems, exact forms ranked first); exact:word, or exact=true, matches the exact form only. A bare word also matches voice transcripts, file names and file text; each item's matched_in says where (text, transcript, filename, file) and its excerpt comes from there; items with matched_in picture follow the text hits on the first page: pictures found by what they show, where the profile turned picture search on; text:, transcript:, content: (file text), filename: narrow to one place. Without discover=true, where the messenger's server can search, it is also asked by default (backend=both; archive for the local store only) within server_time (5s), under messages.server-search: its hits are saved and re-checked by the same strict query, and each item's found_in says archive, server or both. Returns { items, page, next?, missing?, meta }: items are message hits; meta.accounts the accounts read. A missing entry with field coverage means the archive lacks messages: when nothing was found, run its next step (messages sync) or ask the owner before concluding the message does not exist.";
|
|
7
|
-
/** For a messenger that pushes its history (`history: "store"`): nothing to fetch first, no sync to suggest. */
|
|
8
|
-
export declare const messagesSearchDescription: (messenger: Pick<Messenger, "history">) => string;
|
|
9
|
-
export declare const backendInputs: {
|
|
10
|
-
backend: v.OptionalSchema<v.SchemaWithPipe<readonly [v.PicklistSchema<["archive", "server", "both"], undefined>, v.DescriptionAction<"archive" | "both" | "server", "both (default), archive, or the messenger's server; server hits are saved and re-checked by the same strict query, each hit says its source; needs messages.server-search">]>, undefined>;
|
|
11
|
-
server_time: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.DescriptionAction<string, "how long to wait for the server, default 5s, at most 60s">]>, undefined>;
|
|
12
|
-
};
|
|
13
|
-
export declare const backendArgs: (args: {
|
|
14
|
-
backend?: "archive" | "server" | "both";
|
|
15
|
-
server_time?: string;
|
|
16
|
-
}) => {
|
|
17
|
-
backend?: "archive" | "both" | "server" | undefined;
|
|
18
|
-
server?: {
|
|
19
|
-
timeMs: number;
|
|
20
|
-
} | undefined;
|
|
21
|
-
};
|
|
22
|
-
export declare const page: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 1000, undefined>, v.DescriptionAction<number, "which page, from 1: the page a page.next step names">]>, undefined>;
|
|
23
|
-
export declare const messagesSearchInput: (messenger: Messenger) => v.ObjectSchema<{
|
|
24
|
-
readonly sync_first: v.OptionalSchema<v.SchemaWithPipe<readonly [v.BooleanSchema<undefined>, v.DescriptionAction<boolean, "first fetch new messages within the bounds">]>, undefined>;
|
|
25
|
-
readonly max_chats: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 100, undefined>]>, undefined>;
|
|
26
|
-
readonly sync_time: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.DescriptionAction<string, "fetch time budget, default 30s">]>, undefined>;
|
|
27
|
-
readonly max_messages: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 10000, undefined>]>, undefined>;
|
|
28
|
-
readonly thread: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
|
|
29
|
-
readonly thread_hops: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>, v.MaxValueAction<number, 50, undefined>]>, undefined>;
|
|
30
|
-
readonly thread_messages: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 500, undefined>]>, undefined>;
|
|
31
|
-
readonly thread_bytes: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 1048576, undefined>]>, undefined>;
|
|
32
|
-
readonly thread_within: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
|
|
33
|
-
readonly backend: v.OptionalSchema<v.SchemaWithPipe<readonly [v.PicklistSchema<["archive", "server", "both"], undefined>, v.DescriptionAction<"archive" | "both" | "server", "both (default), archive, or the messenger's server; server hits are saved and re-checked by the same strict query, each hit says its source; needs messages.server-search">]>, undefined>;
|
|
34
|
-
readonly server_time: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.DescriptionAction<string, "how long to wait for the server, default 5s, at most 60s">]>, undefined>;
|
|
35
|
-
readonly page: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 1000, undefined>, v.DescriptionAction<number, "which page, from 1: the page a page.next step names">]>, undefined>;
|
|
36
|
-
readonly text: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.DescriptionAction<string, "the query, in Lucene syntax">]>, undefined>;
|
|
37
|
-
readonly ast: v.OptionalSchema<v.UnknownSchema, undefined>;
|
|
38
|
-
readonly discover: v.OptionalSchema<v.SchemaWithPipe<readonly [v.BooleanSchema<undefined>, v.DescriptionAction<boolean, "partial lexical discovery with eligible replies in the local archive; use for questions when wording is uncertain; hits are evidence, not confirmed answers">]>, undefined>;
|
|
39
|
-
readonly timezone: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
|
|
40
|
-
readonly source: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>, v.DescriptionAction<string, "a messenger held on this machine; personal, bots or all — as in: in text">]>, undefined>;
|
|
41
|
-
readonly newest: v.OptionalSchema<v.SchemaWithPipe<readonly [v.BooleanSchema<undefined>, v.DescriptionAction<boolean, "newest first instead of best first">]>, undefined>;
|
|
42
|
-
readonly exact: v.OptionalSchema<v.SchemaWithPipe<readonly [v.BooleanSchema<undefined>, v.DescriptionAction<boolean, "bare words and quotes match their exact form only, as exact:word does; not with an AST">]>, undefined>;
|
|
43
|
-
readonly context: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>, v.MaxValueAction<number, 20, undefined>, v.DescriptionAction<number, "messages around each hit">]>, undefined>;
|
|
44
|
-
readonly limit: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 100, undefined>, v.DescriptionAction<number, "how many">]>, undefined>;
|
|
45
|
-
readonly saved: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>, v.DescriptionAction<string, "run a saved search (name) or an earlier run (id); text is AND-ed to it, other arguments replace its own">]>, undefined>;
|
|
46
|
-
}, undefined>;
|
|
47
|
-
export declare const syncArgs: (args: {
|
|
48
|
-
sync_first?: boolean;
|
|
49
|
-
max_chats?: number;
|
|
50
|
-
sync_time?: string;
|
|
51
|
-
max_messages?: number;
|
|
52
|
-
}) => {
|
|
53
|
-
syncFirst: {
|
|
54
|
-
maxChats?: number | undefined;
|
|
55
|
-
timeMs?: number | undefined;
|
|
56
|
-
maxMessages?: number | undefined;
|
|
57
|
-
};
|
|
58
|
-
} | {
|
|
59
|
-
syncFirst?: undefined;
|
|
60
|
-
};
|
|
61
|
-
export type MessagesSearchArgs = v.InferOutput<ReturnType<typeof messagesSearchInput>>;
|
|
62
|
-
export declare const answerMessagesSearch: (messages: Pick<MessagesService, "search">, given: MessagesSearchArgs, defaults: {
|
|
63
|
-
limit: number;
|
|
64
|
-
signal?: AbortSignal;
|
|
65
|
-
}, searches?: Pick<SearchesService, "resolve">, kind?: SearchKind) => Promise<import("../../cli/envelope.js").ListBody<{
|
|
66
|
-
ref: string;
|
|
67
|
-
chat_title?: string | null | undefined;
|
|
68
|
-
sender_name: string | null;
|
|
69
|
-
timestamp: string;
|
|
70
|
-
excerpt?: string | undefined;
|
|
71
|
-
matched_in?: "context" | "file" | "filename" | "picture" | "text" | "transcript" | undefined;
|
|
72
|
-
score?: number | undefined;
|
|
73
|
-
found_in?: "archive" | "both" | "server" | undefined;
|
|
74
|
-
discovery?: {
|
|
75
|
-
coverage: number;
|
|
76
|
-
matched_terms: string[];
|
|
77
|
-
missing_terms: string[];
|
|
78
|
-
parent?: string | undefined;
|
|
79
|
-
} | undefined;
|
|
80
|
-
context?: {
|
|
81
|
-
ref: string;
|
|
82
|
-
timestamp: string;
|
|
83
|
-
sender_name: string | null;
|
|
84
|
-
text: string;
|
|
85
|
-
}[] | undefined;
|
|
86
|
-
email?: {
|
|
87
|
-
subject: string | null;
|
|
88
|
-
from: {
|
|
89
|
-
name: string | null;
|
|
90
|
-
address: string;
|
|
91
|
-
ref: string | null;
|
|
92
|
-
} | null;
|
|
93
|
-
to: {
|
|
94
|
-
name: string | null;
|
|
95
|
-
address: string;
|
|
96
|
-
ref: string | null;
|
|
97
|
-
}[];
|
|
98
|
-
cc: {
|
|
99
|
-
name: string | null;
|
|
100
|
-
address: string;
|
|
101
|
-
ref: string | null;
|
|
102
|
-
}[];
|
|
103
|
-
bcc: {
|
|
104
|
-
name: string | null;
|
|
105
|
-
address: string;
|
|
106
|
-
ref: string | null;
|
|
107
|
-
}[];
|
|
108
|
-
reply_addresses: {
|
|
109
|
-
name: string | null;
|
|
110
|
-
address: string;
|
|
111
|
-
ref: string | null;
|
|
112
|
-
}[];
|
|
113
|
-
labels: string[];
|
|
114
|
-
thread: string;
|
|
115
|
-
read: boolean | null;
|
|
116
|
-
flagged: boolean | null;
|
|
117
|
-
sender_score?: {
|
|
118
|
-
score: number;
|
|
119
|
-
signals: string[];
|
|
120
|
-
demoted?: true | undefined;
|
|
121
|
-
} | undefined;
|
|
122
|
-
} | undefined;
|
|
123
|
-
}>>;
|
|
124
|
-
export declare const MESSAGES_STATS_DESCRIPTION = "Count what a strict Lucene query matches in the local store, by chat, sender, calendar day or hour (in the timezone). Each message is counted once; no text means every stored message. Words match every form, as in `search messages`; exact=true counts exact forms only. Counts are lower bounds where coverage is not complete. sync_first optionally refreshes within max_chats, sync_time and max_messages; failed refreshes keep counts with stale coverage and refreshed details. Returns { item: { by, total, rows: [{ key, ref?, name, count }] } }; meta.truncated marks more rows than limit, and missing names a chat the store does not hold whole.";
|
|
125
|
-
export declare const messagesStatsDescription: (messenger: Pick<Messenger, "history">) => string;
|
|
126
|
-
export declare const messagesStatsInput: (messenger: Messenger) => v.ObjectSchema<{
|
|
127
|
-
readonly sync_first: v.OptionalSchema<v.SchemaWithPipe<readonly [v.BooleanSchema<undefined>, v.DescriptionAction<boolean, "first fetch new messages within the bounds">]>, undefined>;
|
|
128
|
-
readonly max_chats: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 100, undefined>]>, undefined>;
|
|
129
|
-
readonly sync_time: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.DescriptionAction<string, "fetch time budget, default 30s">]>, undefined>;
|
|
130
|
-
readonly max_messages: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 10000, undefined>]>, undefined>;
|
|
131
|
-
readonly text: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>, v.DescriptionAction<string, "a strict Lucene query; omit to count all">]>, undefined>;
|
|
132
|
-
readonly ast: v.OptionalSchema<v.UnknownSchema, undefined>;
|
|
133
|
-
readonly exact: v.OptionalSchema<v.SchemaWithPipe<readonly [v.BooleanSchema<undefined>, v.DescriptionAction<boolean, "bare words and quotes match their exact form only, as exact:word does; not with an AST">]>, undefined>;
|
|
134
|
-
readonly by: v.OptionalSchema<v.PicklistSchema<["chat", "sender", "day", "hour"], undefined>, undefined>;
|
|
135
|
-
readonly timezone: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
|
|
136
|
-
readonly chat: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>, v.DescriptionAction<string, string>]>, undefined>;
|
|
137
|
-
readonly source: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>, v.DescriptionAction<string, "a messenger held on this machine; personal, bots or all — as in: in text">]>, undefined>;
|
|
138
|
-
readonly limit: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 100, undefined>, v.DescriptionAction<number, "how many">]>, undefined>;
|
|
139
|
-
readonly saved: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>, v.DescriptionAction<string, "run a saved search (name) or an earlier run (id); text is AND-ed to it, other arguments replace its own">]>, undefined>;
|
|
140
|
-
}, undefined>;
|
|
141
|
-
export declare const answerMessagesStats: (messages: Pick<MessagesService, "stats">, args: v.InferOutput<ReturnType<typeof messagesStatsInput>>, defaults: {
|
|
142
|
-
limit: number;
|
|
143
|
-
signal?: AbortSignal;
|
|
144
|
-
}, searches?: Pick<SearchesService, "resolve">) => Promise<import("../../cli/envelope.js").ItemBody<{
|
|
145
|
-
by: "chat" | "day" | "hour" | "sender";
|
|
146
|
-
total: number;
|
|
147
|
-
rows: {
|
|
148
|
-
key: string;
|
|
149
|
-
ref?: string | undefined;
|
|
150
|
-
name: string | null;
|
|
151
|
-
count: number;
|
|
152
|
-
}[];
|
|
153
|
-
}>>;
|
|
154
|
-
//# sourceMappingURL=search.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/search.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAC5B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAA;AAK/D,OAAO,KAAK,EAAE,eAAe,EAAe,MAAM,4BAA4B,CAAA;AAE9E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAA;AAE/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAOjE,eAAO,MAAM,2BAA2B,qnEAC4kE,CAAA;AAOpnE,gHAAgH;AAChH,eAAO,MAAM,yBAAyB,cAAe,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,KAAG,MAM3E,CAAA;AAEP,eAAO,MAAM,aAAa;IACxB,OAAO;IAQP,WAAW;CAGZ,CAAA;AAED,eAAO,MAAM,WAAW,SAAU;IAAE,OAAO,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE;;;;;CAGjG,CAAA;AAEF,eAAO,MAAM,IAAI,gSAQhB,CAAA;AAED,eAAO,MAAM,mBAAmB,cAAe,SAAS;;;;;;;;;;;;;;;;;;;;;;;aAwCpD,CAAA;AAEJ,eAAO,MAAM,QAAQ,SAAU;IAC7B,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;;;;;;;;CASO,CAAA;AAER,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,WAAW,CAAC,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC,CAAA;AAyBtF,eAAO,MAAM,oBAAoB,aACrB,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC,SAClC,kBAAkB,YACf;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,aACtC,IAAI,CAAC,eAAe,EAAE,SAAS,CAAC,SACrC,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4DjB,CAAA;AAED,eAAO,MAAM,0BAA0B,uoBAC+lB,CAAA;AAEtoB,eAAO,MAAM,wBAAwB,cAAe,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,KAAG,MAM1E,CAAA;AAEP,eAAO,MAAM,kBAAkB,cAAe,SAAS;;;;;;;;;;;;;;aA0BnD,CAAA;AAEJ,eAAO,MAAM,mBAAmB,aACpB,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,QAClC,CAAC,CAAC,WAAW,CAAC,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC,YAChD;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,aACtC,IAAI,CAAC,eAAe,EAAE,SAAS,CAAC;;;;;;;;;GAmB5C,CAAA"}
|
package/dist/mcp/tools/search.js
DELETED
|
@@ -1,163 +0,0 @@
|
|
|
1
|
-
import { CliError } from "@wirecat/cli-base";
|
|
2
|
-
import * as v from "valibot";
|
|
3
|
-
import { messagesAnswer, offsetOf } from "../../cli/messenger/search-answers.js";
|
|
4
|
-
import { syncsFirst } from "../../cli/messenger/search-sync-options.js";
|
|
5
|
-
import { countsAnswer } from "../../cli/messenger/stats-answers.js";
|
|
6
|
-
import { parseDuration } from "../../domain/duration.js";
|
|
7
|
-
import { MAX_SEARCH_OFFSET } from "../../services/messages-archive-search.js";
|
|
8
|
-
import { syncInputs } from "../search-sync.js";
|
|
9
|
-
import { threadArgs, threadInputs } from "../thread-options.js";
|
|
10
|
-
import { chatOf, limit } from "../tool.js";
|
|
11
|
-
const EXACT = "bare words and quotes match their exact form only, as exact:word does; not with an AST";
|
|
12
|
-
export const MESSAGES_SEARCH_DESCRIPTION = "Use discover=true for partial lexical evidence and eligible replies to natural questions in the local archive, without model downloads; inspect each item's discovery.missing_terms and its context before answering. Explicit syntax stays strict, and ranking is not answer confidence. Search the local store, and the messenger's server where it can search, using the Lucene 9.12.3 profile, default AND, with strict Boolean matching. chat: narrows to one chat; has:voice, has:file and NOT has:attachment to voice messages, files or text alone. `saved` runs a saved search (`searches list`) or an earlier run (`searches history`). With sync_first, first fetch new messages within max_chats (5), sync_time (30s), max_messages (500), under messages.sync-first permission. thread=true puts each hit's bounded parent/reply graph in its context; thread_hops, thread_messages, thread_bytes, thread_within set its bounds. Guide: https://github.com/WireCatLabs/cli-core/blob/main/docs/search/query-language.md. Text words and quoted phrases match every form of their words (Snowball stems, exact forms ranked first); exact:word, or exact=true, matches the exact form only. A bare word also matches voice transcripts, file names and file text; each item's matched_in says where (text, transcript, filename, file) and its excerpt comes from there; items with matched_in picture follow the text hits on the first page: pictures found by what they show, where the profile turned picture search on; text:, transcript:, content: (file text), filename: narrow to one place. Without discover=true, where the messenger's server can search, it is also asked by default (backend=both; archive for the local store only) within server_time (5s), under messages.server-search: its hits are saved and re-checked by the same strict query, and each item's found_in says archive, server or both. Returns { items, page, next?, missing?, meta }: items are message hits; meta.accounts the accounts read. A missing entry with field coverage means the archive lacks messages: when nothing was found, run its next step (messages sync) or ask the owner before concluding the message does not exist.";
|
|
13
|
-
const SYNC_SENTENCE = " With sync_first, first fetch new messages within max_chats (5), sync_time (30s), max_messages (500), under messages.sync-first permission.";
|
|
14
|
-
const COVERAGE_SENTENCE = " A missing entry with field coverage means the archive lacks messages: when nothing was found, run its next step (messages sync) or ask the owner before concluding the message does not exist.";
|
|
15
|
-
/** For a messenger that pushes its history (`history: "store"`): nothing to fetch first, no sync to suggest. */
|
|
16
|
-
export const messagesSearchDescription = (messenger) => syncsFirst(messenger)
|
|
17
|
-
? MESSAGES_SEARCH_DESCRIPTION
|
|
18
|
-
: MESSAGES_SEARCH_DESCRIPTION.replace(SYNC_SENTENCE, "").replace(COVERAGE_SENTENCE, " The archive holds what serve has kept since the account was linked: when nothing was found, ask the owner before concluding the message does not exist.");
|
|
19
|
-
export const backendInputs = {
|
|
20
|
-
backend: v.optional(v.pipe(v.picklist(["archive", "server", "both"]), v.description("both (default), archive, or the messenger's server; server hits are saved and re-checked by the same strict query, each hit says its source; needs messages.server-search"))),
|
|
21
|
-
server_time: v.optional(v.pipe(v.string(), v.description("how long to wait for the server, default 5s, at most 60s"))),
|
|
22
|
-
};
|
|
23
|
-
export const backendArgs = (args) => ({
|
|
24
|
-
...(args.backend === undefined ? {} : { backend: args.backend }),
|
|
25
|
-
...(args.server_time === undefined ? {} : { server: { timeMs: parseDuration(args.server_time, "server_time") } }),
|
|
26
|
-
});
|
|
27
|
-
export const page = v.optional(v.pipe(v.number(), v.integer(), v.minValue(1), v.maxValue(MAX_SEARCH_OFFSET), v.description("which page, from 1: the page a page.next step names")));
|
|
28
|
-
export const messagesSearchInput = (messenger) => v.object({
|
|
29
|
-
page,
|
|
30
|
-
// Typed as present so the answer code reads them; offered only where the server can search.
|
|
31
|
-
...(messenger.serverSearch ? backendInputs : {}),
|
|
32
|
-
...threadInputs,
|
|
33
|
-
...syncInputs,
|
|
34
|
-
text: v.optional(v.pipe(v.string(), v.description("the query, in Lucene syntax"))),
|
|
35
|
-
ast: v.optional(v.unknown()),
|
|
36
|
-
discover: v.optional(v.pipe(v.boolean(), v.description("partial lexical discovery with eligible replies in the local archive; use for questions when wording is uncertain; hits are evidence, not confirmed answers"))),
|
|
37
|
-
timezone: v.optional(v.string()),
|
|
38
|
-
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"))),
|
|
39
|
-
newest: v.optional(v.pipe(v.boolean(), v.description("newest first instead of best first"))),
|
|
40
|
-
exact: v.optional(v.pipe(v.boolean(), v.description(EXACT))),
|
|
41
|
-
context: v.optional(v.pipe(v.number(), v.integer(), v.minValue(0), v.maxValue(20), v.description("messages around each hit"))),
|
|
42
|
-
limit,
|
|
43
|
-
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"))),
|
|
44
|
-
});
|
|
45
|
-
export const syncArgs = (args) => args.sync_first
|
|
46
|
-
? {
|
|
47
|
-
syncFirst: {
|
|
48
|
-
...(args.max_chats === undefined ? {} : { maxChats: args.max_chats }),
|
|
49
|
-
...(args.sync_time === undefined ? {} : { timeMs: parseDuration(args.sync_time, "sync_time") }),
|
|
50
|
-
...(args.max_messages === undefined ? {} : { maxMessages: args.max_messages }),
|
|
51
|
-
},
|
|
52
|
-
}
|
|
53
|
-
: {};
|
|
54
|
-
const typedOf = (args) => Object.fromEntries(["text", "discover", "language", "timezone", "source", "newest", "exact", "context", "limit", "by"].flatMap((key) => (args[key] === undefined ? [] : [[key, args[key]]])));
|
|
55
|
-
/** `saved` needs the searches service; a host that mounts the tool without it refuses `saved` rather than ignore it. */
|
|
56
|
-
const resolveSaved = async (searches, args) => {
|
|
57
|
-
if (args.saved === undefined)
|
|
58
|
-
return undefined;
|
|
59
|
-
if (!searches)
|
|
60
|
-
throw new CliError("validation_error", "saved searches are not available on this server");
|
|
61
|
-
if (args.ast !== undefined)
|
|
62
|
-
throw new CliError("validation_error", "with saved, give more words as text, not an AST");
|
|
63
|
-
return searches.resolve(args.saved, typedOf(args));
|
|
64
|
-
};
|
|
65
|
-
const offsetArg = (page, limit) => {
|
|
66
|
-
const offset = offsetOf(page, limit);
|
|
67
|
-
return offset === undefined ? {} : { offset };
|
|
68
|
-
};
|
|
69
|
-
export const answerMessagesSearch = async (messages, given, defaults, searches, kind = "messages") => {
|
|
70
|
-
const args = given;
|
|
71
|
-
const again = {
|
|
72
|
-
...(args.text === undefined ? {} : { query: args.text }),
|
|
73
|
-
...(args.saved === undefined ? {} : { saved: args.saved }),
|
|
74
|
-
...(args.source === undefined ? {} : { source: args.source }),
|
|
75
|
-
...(args.discover ? { discover: true } : {}),
|
|
76
|
-
...(args.exact ? { exact: true } : {}),
|
|
77
|
-
...(args.newest ? { newest: true } : {}),
|
|
78
|
-
...(args.timezone === undefined ? {} : { timezone: args.timezone }),
|
|
79
|
-
};
|
|
80
|
-
const answer = (found, limit) => messagesAnswer(`search ${kind}`, found, { limit, page: args.page ?? 1, again }, args.text);
|
|
81
|
-
const resolved = await resolveSaved(searches, args);
|
|
82
|
-
if (resolved) {
|
|
83
|
-
const { params } = resolved;
|
|
84
|
-
const size = params.limit ?? defaults.limit;
|
|
85
|
-
const found = await messages.search({
|
|
86
|
-
kind,
|
|
87
|
-
...syncArgs(args),
|
|
88
|
-
...backendArgs(args),
|
|
89
|
-
...threadArgs(args),
|
|
90
|
-
...(params.text === undefined ? {} : { text: params.text }),
|
|
91
|
-
...(params.ast === undefined ? {} : { ast: params.ast }),
|
|
92
|
-
...(params.discover === undefined ? {} : { discover: params.discover }),
|
|
93
|
-
signal: defaults.signal,
|
|
94
|
-
...(params.timezone === undefined ? {} : { timezone: params.timezone }),
|
|
95
|
-
limit: size,
|
|
96
|
-
...offsetArg(args.page, size),
|
|
97
|
-
newest: params.newest === true,
|
|
98
|
-
...(params.exact ? { exact: true } : {}),
|
|
99
|
-
context: params.context ?? 0,
|
|
100
|
-
...(params.chat === undefined ? {} : { chat: params.chat }),
|
|
101
|
-
...(params.source === undefined ? {} : { source: params.source }),
|
|
102
|
-
saved: resolved.id,
|
|
103
|
-
});
|
|
104
|
-
return answer(found, size);
|
|
105
|
-
}
|
|
106
|
-
if (args.text === undefined && args.ast === undefined)
|
|
107
|
-
throw new CliError("validation_error", "give search text, a versioned AST, or saved");
|
|
108
|
-
const size = args.limit ?? defaults.limit;
|
|
109
|
-
const found = await messages.search({
|
|
110
|
-
kind,
|
|
111
|
-
...syncArgs(args),
|
|
112
|
-
...backendArgs(args),
|
|
113
|
-
...threadArgs(args),
|
|
114
|
-
...(args.text === undefined ? {} : { text: args.text }),
|
|
115
|
-
...(args.ast === undefined ? {} : { ast: args.ast }),
|
|
116
|
-
...(args.discover === undefined ? {} : { discover: args.discover }),
|
|
117
|
-
signal: defaults.signal,
|
|
118
|
-
...(args.timezone === undefined ? {} : { timezone: args.timezone }),
|
|
119
|
-
limit: size,
|
|
120
|
-
...offsetArg(args.page, size),
|
|
121
|
-
newest: args.newest === true,
|
|
122
|
-
...(args.exact ? { exact: true } : {}),
|
|
123
|
-
context: args.context ?? 0,
|
|
124
|
-
...(args.source === undefined ? {} : { source: args.source }),
|
|
125
|
-
});
|
|
126
|
-
return answer(found, size);
|
|
127
|
-
};
|
|
128
|
-
export const MESSAGES_STATS_DESCRIPTION = "Count what a strict Lucene query matches in the local store, by chat, sender, calendar day or hour (in the timezone). Each message is counted once; no text means every stored message. Words match every form, as in `search messages`; exact=true counts exact forms only. Counts are lower bounds where coverage is not complete. sync_first optionally refreshes within max_chats, sync_time and max_messages; failed refreshes keep counts with stale coverage and refreshed details. Returns { item: { by, total, rows: [{ key, ref?, name, count }] } }; meta.truncated marks more rows than limit, and missing names a chat the store does not hold whole.";
|
|
129
|
-
export const messagesStatsDescription = (messenger) => syncsFirst(messenger)
|
|
130
|
-
? MESSAGES_STATS_DESCRIPTION
|
|
131
|
-
: MESSAGES_STATS_DESCRIPTION.replace(" sync_first optionally refreshes within max_chats, sync_time and max_messages; failed refreshes keep counts with stale coverage and refreshed details.", "");
|
|
132
|
-
export const messagesStatsInput = (messenger) => v.object({
|
|
133
|
-
...syncInputs,
|
|
134
|
-
text: v.optional(v.pipe(v.string(), v.minLength(1), v.description("a strict Lucene query; omit to count all"))),
|
|
135
|
-
ast: v.optional(v.unknown()),
|
|
136
|
-
exact: v.optional(v.pipe(v.boolean(), v.description(EXACT))),
|
|
137
|
-
by: v.optional(v.picklist(["chat", "sender", "day", "hour"])),
|
|
138
|
-
timezone: v.optional(v.string()),
|
|
139
|
-
chat: v.optional(chatOf(messenger)),
|
|
140
|
-
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"))),
|
|
141
|
-
limit,
|
|
142
|
-
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"))),
|
|
143
|
-
});
|
|
144
|
-
export const answerMessagesStats = async (messages, args, defaults, searches) => {
|
|
145
|
-
const resolved = await resolveSaved(searches, args);
|
|
146
|
-
const params = resolved?.params ?? args;
|
|
147
|
-
const size = params.limit ?? defaults.limit;
|
|
148
|
-
const stats = await messages.stats({
|
|
149
|
-
...syncArgs(args),
|
|
150
|
-
...(params.text === undefined ? {} : { text: params.text }),
|
|
151
|
-
...(params.ast === undefined ? {} : { ast: params.ast }),
|
|
152
|
-
by: params.by ?? "chat",
|
|
153
|
-
...(params.exact ? { exact: true } : {}),
|
|
154
|
-
signal: defaults.signal,
|
|
155
|
-
...(params.timezone === undefined ? {} : { timezone: params.timezone }),
|
|
156
|
-
limit: size,
|
|
157
|
-
...(params.chat === undefined ? {} : { chat: params.chat }),
|
|
158
|
-
...(params.source === undefined ? {} : { source: params.source }),
|
|
159
|
-
...(resolved ? { saved: resolved.id } : {}),
|
|
160
|
-
});
|
|
161
|
-
return countsAnswer(stats);
|
|
162
|
-
};
|
|
163
|
-
//# sourceMappingURL=search.js.map
|