@wirecat/cli-core 0.400.0 → 0.402.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/README.md +1 -1
  3. package/dist/cli/bot/api.js +5 -2
  4. package/dist/cli/bot/store.js +1 -1
  5. package/dist/cli/config-command.js +13 -7
  6. package/dist/cli/context.d.ts +2 -0
  7. package/dist/cli/index.d.ts +2 -1
  8. package/dist/cli/index.js +2 -1
  9. package/dist/cli/meeting-evidence-answer.d.ts +46 -0
  10. package/dist/cli/meeting-evidence-answer.js +22 -0
  11. package/dist/cli/meeting-preparation-answer.js +1 -13
  12. package/dist/cli/messenger/account-sessions-command.js +0 -2
  13. package/dist/cli/messenger/archive-commands.js +1 -1
  14. package/dist/cli/messenger/doctor-command.js +0 -1
  15. package/dist/cli/messenger/message-writes.d.ts +192 -2
  16. package/dist/cli/messenger/message-writes.js +6 -2
  17. package/dist/cli/messenger/messages-send-command.js +9 -6
  18. package/dist/cli/messenger/models-command.js +0 -3
  19. package/dist/cli/messenger/records-command.js +0 -2
  20. package/dist/cli/messenger/review.js +1 -1
  21. package/dist/cli/messenger/schedule-command.js +2 -2
  22. package/dist/cli/messenger/search-answers.js +2 -0
  23. package/dist/cli/messenger/server-command.js +0 -3
  24. package/dist/cli/messenger/store-maintenance-command.d.ts +1 -1
  25. package/dist/cli/messenger/store-maintenance-command.js +7 -7
  26. package/dist/cli/messenger/stored.js +4 -1
  27. package/dist/cli/messenger/tasks-command.js +10 -6
  28. package/dist/cli/program.js +5 -1
  29. package/dist/documents/index.d.ts +1 -0
  30. package/dist/documents/index.js +1 -0
  31. package/dist/entities/hit.d.ts +4 -0
  32. package/dist/entities/hit.js +4 -0
  33. package/dist/entities/index.d.ts +285 -0
  34. package/dist/entities/index.js +5 -1
  35. package/dist/entities/meeting-evidence.d.ts +86 -0
  36. package/dist/entities/meeting-evidence.js +25 -0
  37. package/dist/entities/meeting-preparation-parts.d.ts +14 -0
  38. package/dist/entities/meeting-preparation-parts.js +15 -13
  39. package/dist/entities/meeting.d.ts +1 -1
  40. package/dist/entities/meeting.js +1 -1
  41. package/dist/entities/message-write.d.ts +187 -0
  42. package/dist/entities/message-write.js +2 -0
  43. package/dist/errors/reasons.js +2 -0
  44. package/dist/mcp/agent.js +12 -6
  45. package/dist/meetings/cli/index.js +3 -1
  46. package/dist/meetings/index.d.ts +1 -1
  47. package/dist/meetings/index.js +1 -1
  48. package/dist/meetings/mcp/index.d.ts +15 -15
  49. package/dist/meetings/read-answers.d.ts +18 -0
  50. package/dist/meetings/read-answers.js +30 -0
  51. package/dist/ports/messenger.d.ts +10 -1
  52. package/dist/search/dictionary.d.ts +20 -0
  53. package/dist/search/dictionary.js +106 -0
  54. package/dist/sends/guard.d.ts +1 -1
  55. package/dist/sends/guard.js +9 -5
  56. package/dist/sends/journal.d.ts +1 -1
  57. package/dist/sends/permissions.d.ts +10 -1
  58. package/dist/sends/permissions.js +43 -1
  59. package/dist/sends/upload.d.ts +4 -4
  60. package/dist/sends/upload.js +24 -20
  61. package/dist/services/documents/mirrors.d.ts +98 -0
  62. package/dist/services/documents/mirrors.js +144 -0
  63. package/dist/services/messages.js +1 -0
  64. package/dist/services/search-all-meetings.js +21 -8
  65. package/dist/services/task-rules.d.ts +1 -1
  66. package/dist/services/tasks.d.ts +2 -2
  67. package/dist/services/tasks.js +1 -1
  68. package/dist/store/sqlite/drizzle/bun.js +3 -3
  69. package/dist/store/sqlite/drizzle/bun.js.map +1 -1
  70. package/dist/store/sqlite/drizzle/core.js +2 -2
  71. package/dist/store/sqlite/drizzle/core.js.map +1 -1
  72. package/dist/store/sqlite/drizzle/node.js +3 -3
  73. package/dist/store/sqlite/drizzle/node.js.map +1 -1
  74. package/dist/store/sqlite/drizzle/{shared-O7CTKP45.js → shared-HKXF6HKX.js} +57 -57
  75. package/dist/store/sqlite/drizzle/{shared-O7CTKP45.js.map → shared-HKXF6HKX.js.map} +1 -1
  76. package/dist/store/sqlite/transcript-query.js +15 -5
  77. package/package.json +4 -2
  78. package/parity.json +6 -3
@@ -42,7 +42,8 @@ import { job } from "./job.js";
42
42
  import { joinRequest } from "./join-request.js";
43
43
  import { messageEvent, serveSummary, watchedMessage, watchItem } from "./listener.js";
44
44
  import { mediaArchive, mediaArchiveCheck, mediaArchiveMove, mediaArchiveTimer } from "./media-archive.js";
45
- import { meeting, meetingDetails, meetingHit, meetingLink, meetingParticipants, meetingPassage, meetingProjectEvidence, meetingReview, meetingSpeaker, meetingStats, meetingSummary, meetingTranscript, } from "./meeting.js";
45
+ import { event, meeting, meetingDetails, meetingHit, meetingLink, meetingParticipants, meetingPassage, meetingProjectEvidence, meetingReview, meetingSpeaker, meetingStats, meetingSummary, meetingTranscript, } from "./meeting.js";
46
+ import { meetingEvidence, meetingPersonContext } from "./meeting-evidence.js";
46
47
  import { meetingFindings } from "./meeting-findings.js";
47
48
  import { meetingPreparation } from "./meeting-preparation.js";
48
49
  import { meetingProjectCandidates } from "./meeting-project-candidates.js";
@@ -212,6 +213,9 @@ export const ENTITIES = {
212
213
  meeting_findings: meetingFindings,
213
214
  meeting_transcript: meetingTranscript,
214
215
  meeting_summary: meetingSummary,
216
+ meeting_evidence: meetingEvidence,
217
+ meeting_person_context: meetingPersonContext,
218
+ event,
215
219
  meeting_review: meetingReview,
216
220
  meeting_link: meetingLink,
217
221
  meeting_stats: meetingStats,
@@ -0,0 +1,86 @@
1
+ import * as v from "valibot";
2
+ /** `meetings evidence`: the stored lines behind a meeting reference, a page at a time. */
3
+ export declare const meetingEvidence: v.StrictObjectSchema<{
4
+ readonly schema_version: v.LiteralSchema<1, undefined>;
5
+ readonly kind: v.LiteralSchema<"meeting", undefined>;
6
+ readonly source: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "a reference such as `note:42`">]>;
7
+ readonly fingerprint: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
8
+ readonly limits: v.StrictObjectSchema<{
9
+ readonly cues: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
10
+ readonly bytes: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
11
+ readonly max_read_bytes: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
12
+ readonly max_transcript_pages: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
13
+ }, undefined>;
14
+ readonly content_bytes: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
15
+ readonly coverage: v.StrictObjectSchema<{
16
+ readonly provided: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
17
+ readonly included: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
18
+ readonly omitted: v.NullableSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>, undefined>;
19
+ readonly provided_exact: v.BooleanSchema<undefined>;
20
+ readonly next_transcript_id: v.NullableSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>, undefined>;
21
+ readonly next_reference: v.NullableSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "a reference such as `note:42`">]>, undefined>;
22
+ readonly transcript_pages: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
23
+ readonly skipped_unavailable: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
24
+ readonly has_more: v.BooleanSchema<undefined>;
25
+ readonly truncated_by: v.NullableSchema<v.PicklistSchema<["cues", "bytes", "transcripts"], undefined>, undefined>;
26
+ readonly input: v.LiteralSchema<"bounded-meeting-pages", undefined>;
27
+ readonly archive_completeness: v.LiteralSchema<"unknown", undefined>;
28
+ }, undefined>;
29
+ readonly items: v.ArraySchema<v.StrictObjectSchema<{
30
+ readonly ref: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "a reference such as `note:42`">]>;
31
+ readonly fingerprint: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
32
+ readonly transcript_id: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
33
+ readonly content_hash: v.NullableSchema<v.StringSchema<undefined>, undefined>;
34
+ readonly position: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
35
+ readonly offset_ms: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
36
+ readonly end_ms: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
37
+ readonly speaker_participant_id: v.NullableSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>, undefined>;
38
+ readonly speaker_name: v.NullableSchema<v.StringSchema<undefined>, undefined>;
39
+ readonly text: v.StringSchema<undefined>;
40
+ readonly revision: v.PicklistSchema<["current", "superseded"], undefined>;
41
+ }, undefined>, undefined>;
42
+ }, undefined>;
43
+ /** `meetings context`: what the stored meetings say about one person, through their linked identities. */
44
+ export declare const meetingPersonContext: v.StrictObjectSchema<{
45
+ readonly person: v.StrictObjectSchema<{
46
+ readonly uid: v.StringSchema<undefined>;
47
+ readonly name: v.NullableSchema<v.StringSchema<undefined>, undefined>;
48
+ }, undefined>;
49
+ readonly items: v.ArraySchema<v.StrictObjectSchema<{
50
+ readonly ref: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "a reference such as `note:42`">]>;
51
+ readonly cues: v.ArraySchema<v.StrictObjectSchema<{
52
+ readonly ref: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "a reference such as `note:42`">]>;
53
+ readonly fingerprint: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
54
+ readonly transcript_id: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
55
+ readonly content_hash: v.NullableSchema<v.StringSchema<undefined>, undefined>;
56
+ readonly position: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
57
+ readonly offset_ms: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
58
+ readonly end_ms: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
59
+ readonly speaker_participant_id: v.NullableSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>, undefined>;
60
+ readonly speaker_name: v.NullableSchema<v.StringSchema<undefined>, undefined>;
61
+ readonly text: v.StringSchema<undefined>;
62
+ readonly revision: v.PicklistSchema<["current", "superseded"], undefined>;
63
+ }, undefined>, undefined>;
64
+ readonly cue_coverage: v.StrictObjectSchema<{
65
+ readonly included: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
66
+ readonly omitted: v.NullableSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>, undefined>;
67
+ readonly has_more: v.BooleanSchema<undefined>;
68
+ }, undefined>;
69
+ }, undefined>, undefined>;
70
+ readonly limits: v.StrictObjectSchema<{
71
+ readonly meetings: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
72
+ readonly cues: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
73
+ readonly bytes: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
74
+ readonly scan_limit: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
75
+ }, undefined>;
76
+ readonly content_bytes: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
77
+ readonly coverage: v.StrictObjectSchema<{
78
+ readonly involvements_scanned: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
79
+ readonly scan_limit_reached: v.BooleanSchema<undefined>;
80
+ readonly pending: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
81
+ readonly truncated_by: v.NullableSchema<v.PicklistSchema<["meetings", "bytes"], undefined>, undefined>;
82
+ readonly skipped_unavailable: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
83
+ readonly complete: v.LiteralSchema<false, undefined>;
84
+ readonly input: v.LiteralSchema<"bounded-meeting-pages", undefined>;
85
+ }, undefined>;
86
+ }, undefined>;
@@ -0,0 +1,25 @@
1
+ import { reference } from "@wirecat/cli-base/standards";
2
+ import * as v from "valibot";
3
+ import { preparationCount as count, preparationCue, preparationEvidence } from "./meeting-preparation-parts.js";
4
+ /** `meetings evidence`: the stored lines behind a meeting reference, a page at a time. */
5
+ export const meetingEvidence = preparationEvidence;
6
+ /** `meetings context`: what the stored meetings say about one person, through their linked identities. */
7
+ export const meetingPersonContext = v.strictObject({
8
+ person: v.strictObject({ uid: v.string(), name: v.nullable(v.string()) }),
9
+ items: v.array(v.strictObject({
10
+ ref: reference,
11
+ cues: v.array(preparationCue),
12
+ cue_coverage: v.strictObject({ included: count, omitted: v.nullable(count), has_more: v.boolean() }),
13
+ })),
14
+ limits: v.strictObject({ meetings: count, cues: count, bytes: count, scan_limit: count }),
15
+ content_bytes: count,
16
+ coverage: v.strictObject({
17
+ involvements_scanned: count,
18
+ scan_limit_reached: v.boolean(),
19
+ pending: count,
20
+ truncated_by: v.nullable(v.picklist(["meetings", "bytes"])),
21
+ skipped_unavailable: count,
22
+ complete: v.literal(false),
23
+ input: v.literal("bounded-meeting-pages"),
24
+ }),
25
+ });
@@ -30,6 +30,20 @@ export declare const preparationUpcoming: v.StrictObjectSchema<{
30
30
  readonly missing: v.ArraySchema<v.PicklistSchema<["schedule-details", "occurrence-details"], undefined>, undefined>;
31
31
  }, undefined>;
32
32
  }, undefined>;
33
+ /** One stored transcript line as evidence: where it is, who said it, and its text. */
34
+ export declare const preparationCue: v.StrictObjectSchema<{
35
+ readonly ref: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "a reference such as `note:42`">]>;
36
+ readonly fingerprint: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
37
+ readonly transcript_id: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
38
+ readonly content_hash: v.NullableSchema<v.StringSchema<undefined>, undefined>;
39
+ readonly position: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
40
+ readonly offset_ms: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
41
+ readonly end_ms: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
42
+ readonly speaker_participant_id: v.NullableSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>, undefined>;
43
+ readonly speaker_name: v.NullableSchema<v.StringSchema<undefined>, undefined>;
44
+ readonly text: v.StringSchema<undefined>;
45
+ readonly revision: v.PicklistSchema<["current", "superseded"], undefined>;
46
+ }, undefined>;
33
47
  export declare const preparationEvidence: v.StrictObjectSchema<{
34
48
  readonly schema_version: v.LiteralSchema<1, undefined>;
35
49
  readonly kind: v.LiteralSchema<"meeting", undefined>;
@@ -32,6 +32,20 @@ export const preparationUpcoming = v.strictObject({
32
32
  missing: v.array(v.picklist(["schedule-details", "occurrence-details"])),
33
33
  }),
34
34
  });
35
+ /** One stored transcript line as evidence: where it is, who said it, and its text. */
36
+ export const preparationCue = v.strictObject({
37
+ ref: reference,
38
+ fingerprint: id,
39
+ transcript_id: id,
40
+ content_hash: text,
41
+ position: count,
42
+ offset_ms: count,
43
+ end_ms: count,
44
+ speaker_participant_id: v.nullable(id),
45
+ speaker_name: text,
46
+ text: v.string(),
47
+ revision: v.picklist(["current", "superseded"]),
48
+ });
35
49
  export const preparationEvidence = v.strictObject({
36
50
  schema_version: v.literal(1),
37
51
  kind: v.literal("meeting"),
@@ -53,19 +67,7 @@ export const preparationEvidence = v.strictObject({
53
67
  input: v.literal("bounded-meeting-pages"),
54
68
  archive_completeness: v.literal("unknown"),
55
69
  }),
56
- items: v.array(v.strictObject({
57
- ref: reference,
58
- fingerprint: id,
59
- transcript_id: id,
60
- content_hash: text,
61
- position: count,
62
- offset_ms: count,
63
- end_ms: count,
64
- speaker_participant_id: v.nullable(id),
65
- speaker_name: text,
66
- text: v.string(),
67
- revision: v.picklist(["current", "superseded"]),
68
- })),
70
+ items: v.array(preparationCue),
69
71
  });
70
72
  export const preparationContext = v.strictObject({
71
73
  participants: page(v.strictObject({ id, identity_id: id, display_name: text, person_uid: v.nullable(id) })),
@@ -1 +1 @@
1
- export { meeting, meetingDetails, meetingHit, meetingLink, meetingParticipants, meetingPassage, meetingProjectEvidence, meetingReview, meetingSpeaker, meetingStats, meetingSummary, meetingTranscript, } from "../meetings/index.js";
1
+ export { event, meeting, meetingDetails, meetingHit, meetingLink, meetingParticipants, meetingPassage, meetingProjectEvidence, meetingReview, meetingSpeaker, meetingStats, meetingSummary, meetingTranscript, } from "../meetings/index.js";
@@ -1 +1 @@
1
- export { meeting, meetingDetails, meetingHit, meetingLink, meetingParticipants, meetingPassage, meetingProjectEvidence, meetingReview, meetingSpeaker, meetingStats, meetingSummary, meetingTranscript, } from "../meetings/index.js";
1
+ export { event, meeting, meetingDetails, meetingHit, meetingLink, meetingParticipants, meetingPassage, meetingProjectEvidence, meetingReview, meetingSpeaker, meetingStats, meetingSummary, meetingTranscript, } from "../meetings/index.js";
@@ -187,5 +187,192 @@ export declare const messageWrite: v.StrictObjectSchema<{
187
187
  }, undefined>, undefined>;
188
188
  readonly provider_metadata: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.UnknownSchema, undefined>, undefined>;
189
189
  }, undefined>;
190
+ /** An album's messages, in order; `message` is the first. Absent for a single message. */
191
+ readonly messages: v.OptionalSchema<v.ArraySchema<v.StrictObjectSchema<{
192
+ readonly ref: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "a reference such as `note:42`">]>;
193
+ readonly id: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
194
+ readonly provider: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
195
+ readonly account: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
196
+ readonly chat_id: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
197
+ readonly chat_title: v.OptionalSchema<v.NullableSchema<v.StringSchema<undefined>, undefined>, undefined>;
198
+ readonly sender_id: v.NullableSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>, undefined>;
199
+ readonly sender_name: v.NullableSchema<v.StringSchema<undefined>, undefined>;
200
+ readonly sender_username: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
201
+ readonly sender_is_chat: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
202
+ readonly mentions: v.OptionalSchema<v.ArraySchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>, undefined>, undefined>;
203
+ readonly timestamp: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.IsoTimestampAction<string, "an ISO 8601 time in UTC">, v.EndsWithAction<string, "Z", "an ISO 8601 time in UTC, ending in `Z`">]>;
204
+ readonly edited_at: v.NullableSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.IsoTimestampAction<string, "an ISO 8601 time in UTC">, v.EndsWithAction<string, "Z", "an ISO 8601 time in UTC, ending in `Z`">]>, undefined>;
205
+ readonly text: v.StringSchema<undefined>;
206
+ readonly transcript: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
207
+ readonly anchor: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
208
+ readonly excerpt: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
209
+ readonly matched_in: v.OptionalSchema<v.PicklistSchema<["text", "transcript", "filename", "file", "context", "picture"], undefined>, undefined>;
210
+ readonly score: v.OptionalSchema<v.NumberSchema<undefined>, undefined>;
211
+ readonly match: v.OptionalSchema<v.PicklistSchema<["words", "beginnings", "corrected"], undefined>, undefined>;
212
+ readonly corrections: v.OptionalSchema<v.ArraySchema<v.StrictObjectSchema<{
213
+ readonly from: v.StringSchema<undefined>;
214
+ readonly to: v.ArraySchema<v.StringSchema<undefined>, undefined>;
215
+ }, undefined>, undefined>, undefined>;
216
+ readonly found_in: v.OptionalSchema<v.PicklistSchema<["archive", "server", "both"], undefined>, undefined>;
217
+ readonly discovery: v.OptionalSchema<v.StrictObjectSchema<{
218
+ readonly coverage: v.NumberSchema<undefined>;
219
+ readonly matched_terms: v.ArraySchema<v.StringSchema<undefined>, undefined>;
220
+ readonly missing_terms: v.ArraySchema<v.StringSchema<undefined>, undefined>;
221
+ readonly parent: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "a reference such as `note:42`">]>, undefined>;
222
+ }, undefined>, undefined>;
223
+ readonly context: v.OptionalSchema<v.ArraySchema<v.StrictObjectSchema<{
224
+ readonly ref: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "a reference such as `note:42`">]>;
225
+ readonly timestamp: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.IsoTimestampAction<string, "an ISO 8601 time in UTC">, v.EndsWithAction<string, "Z", "an ISO 8601 time in UTC, ending in `Z`">]>;
226
+ readonly sender_name: v.NullableSchema<v.StringSchema<undefined>, undefined>;
227
+ readonly text: v.StringSchema<undefined>;
228
+ }, undefined>, undefined>, undefined>;
229
+ readonly outgoing: v.NullableSchema<v.BooleanSchema<undefined>, undefined>;
230
+ readonly attachments: v.ArraySchema<v.StrictObjectSchema<{
231
+ readonly message: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "a reference such as `note:42`">]>, undefined>;
232
+ readonly kind: v.StringSchema<undefined>;
233
+ readonly position: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>, undefined>;
234
+ readonly url: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
235
+ readonly name: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
236
+ readonly title: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
237
+ readonly mime: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
238
+ readonly size: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>, undefined>;
239
+ readonly width: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>, undefined>;
240
+ readonly height: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>, undefined>;
241
+ readonly duration: v.OptionalSchema<v.NumberSchema<undefined>, undefined>;
242
+ readonly text: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
243
+ readonly extraction: v.OptionalSchema<v.StrictObjectSchema<{
244
+ readonly origin: v.StringSchema<undefined>;
245
+ readonly extractor: v.StringSchema<undefined>;
246
+ readonly chars: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
247
+ readonly error: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
248
+ }, undefined>, undefined>;
249
+ readonly local_path: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
250
+ readonly buttons: v.OptionalSchema<v.ArraySchema<v.ArraySchema<v.StrictObjectSchema<{
251
+ readonly kind: v.PicklistSchema<["callback", "link", "message", "chat", "contact", "location", "app", "clipboard", "other"], undefined>;
252
+ readonly text: v.StringSchema<undefined>;
253
+ readonly url: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
254
+ }, undefined>, undefined>, undefined>, undefined>;
255
+ }, undefined>, undefined>;
256
+ readonly reply_to: v.NullableSchema<v.StrictObjectSchema<{
257
+ readonly id: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
258
+ readonly sender_id: v.NullableSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>, undefined>;
259
+ readonly sender_name: v.NullableSchema<v.StringSchema<undefined>, undefined>;
260
+ readonly timestamp: v.NullableSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.IsoTimestampAction<string, "an ISO 8601 time in UTC">, v.EndsWithAction<string, "Z", "an ISO 8601 time in UTC, ending in `Z`">]>, undefined>;
261
+ readonly text: v.StringSchema<undefined>;
262
+ readonly attachments: v.ArraySchema<v.StrictObjectSchema<{
263
+ readonly message: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "a reference such as `note:42`">]>, undefined>;
264
+ readonly kind: v.StringSchema<undefined>;
265
+ readonly position: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>, undefined>;
266
+ readonly url: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
267
+ readonly name: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
268
+ readonly title: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
269
+ readonly mime: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
270
+ readonly size: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>, undefined>;
271
+ readonly width: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>, undefined>;
272
+ readonly height: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>, undefined>;
273
+ readonly duration: v.OptionalSchema<v.NumberSchema<undefined>, undefined>;
274
+ readonly text: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
275
+ readonly extraction: v.OptionalSchema<v.StrictObjectSchema<{
276
+ readonly origin: v.StringSchema<undefined>;
277
+ readonly extractor: v.StringSchema<undefined>;
278
+ readonly chars: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
279
+ readonly error: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
280
+ }, undefined>, undefined>;
281
+ readonly local_path: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
282
+ readonly buttons: v.OptionalSchema<v.ArraySchema<v.ArraySchema<v.StrictObjectSchema<{
283
+ readonly kind: v.PicklistSchema<["callback", "link", "message", "chat", "contact", "location", "app", "clipboard", "other"], undefined>;
284
+ readonly text: v.StringSchema<undefined>;
285
+ readonly url: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
286
+ }, undefined>, undefined>, undefined>, undefined>;
287
+ }, undefined>, undefined>;
288
+ readonly outgoing: v.NullableSchema<v.BooleanSchema<undefined>, undefined>;
289
+ }, undefined>, undefined>;
290
+ readonly reply_to_id: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>, undefined>;
291
+ readonly forwarded_from: v.NullableSchema<v.StrictObjectSchema<{
292
+ readonly id: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
293
+ readonly sender_id: v.NullableSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>, undefined>;
294
+ readonly sender_name: v.NullableSchema<v.StringSchema<undefined>, undefined>;
295
+ readonly timestamp: v.NullableSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.IsoTimestampAction<string, "an ISO 8601 time in UTC">, v.EndsWithAction<string, "Z", "an ISO 8601 time in UTC, ending in `Z`">]>, undefined>;
296
+ readonly text: v.StringSchema<undefined>;
297
+ readonly attachments: v.ArraySchema<v.StrictObjectSchema<{
298
+ readonly message: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "a reference such as `note:42`">]>, undefined>;
299
+ readonly kind: v.StringSchema<undefined>;
300
+ readonly position: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>, undefined>;
301
+ readonly url: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
302
+ readonly name: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
303
+ readonly title: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
304
+ readonly mime: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
305
+ readonly size: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>, undefined>;
306
+ readonly width: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>, undefined>;
307
+ readonly height: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>, undefined>;
308
+ readonly duration: v.OptionalSchema<v.NumberSchema<undefined>, undefined>;
309
+ readonly text: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
310
+ readonly extraction: v.OptionalSchema<v.StrictObjectSchema<{
311
+ readonly origin: v.StringSchema<undefined>;
312
+ readonly extractor: v.StringSchema<undefined>;
313
+ readonly chars: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
314
+ readonly error: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
315
+ }, undefined>, undefined>;
316
+ readonly local_path: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
317
+ readonly buttons: v.OptionalSchema<v.ArraySchema<v.ArraySchema<v.StrictObjectSchema<{
318
+ readonly kind: v.PicklistSchema<["callback", "link", "message", "chat", "contact", "location", "app", "clipboard", "other"], undefined>;
319
+ readonly text: v.StringSchema<undefined>;
320
+ readonly url: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
321
+ }, undefined>, undefined>, undefined>, undefined>;
322
+ }, undefined>, undefined>;
323
+ readonly outgoing: v.NullableSchema<v.BooleanSchema<undefined>, undefined>;
324
+ }, undefined>, undefined>;
325
+ readonly thread_id: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>, undefined>;
326
+ readonly thread_root_id: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>, undefined>;
327
+ readonly reactions: v.OptionalSchema<v.NullableSchema<v.StrictObjectSchema<{
328
+ readonly counts: v.ArraySchema<v.StrictObjectSchema<{
329
+ readonly reaction: v.StringSchema<undefined>;
330
+ readonly count: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
331
+ }, undefined>, undefined>;
332
+ readonly mine: v.NullableSchema<v.StringSchema<undefined>, undefined>;
333
+ readonly total: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
334
+ }, undefined>, undefined>, undefined>;
335
+ readonly scheduled_for: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.IsoTimestampAction<string, "an ISO 8601 time in UTC">, v.EndsWithAction<string, "Z", "an ISO 8601 time in UTC, ending in `Z`">]>, undefined>;
336
+ readonly starred: v.OptionalSchema<v.LiteralSchema<true, undefined>, undefined>;
337
+ readonly delivery: v.OptionalSchema<v.PicklistSchema<["delivered", "read"], undefined>, undefined>;
338
+ readonly email: v.OptionalSchema<v.StrictObjectSchema<{
339
+ readonly subject: v.NullableSchema<v.StringSchema<undefined>, undefined>;
340
+ readonly from: v.NullableSchema<v.StrictObjectSchema<{
341
+ readonly name: v.NullableSchema<v.StringSchema<undefined>, undefined>;
342
+ readonly address: v.StringSchema<undefined>;
343
+ readonly ref: v.NullableSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "a reference such as `note:42`">]>, undefined>;
344
+ }, undefined>, undefined>;
345
+ readonly to: v.ArraySchema<v.StrictObjectSchema<{
346
+ readonly name: v.NullableSchema<v.StringSchema<undefined>, undefined>;
347
+ readonly address: v.StringSchema<undefined>;
348
+ readonly ref: v.NullableSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "a reference such as `note:42`">]>, undefined>;
349
+ }, undefined>, undefined>;
350
+ readonly cc: v.ArraySchema<v.StrictObjectSchema<{
351
+ readonly name: v.NullableSchema<v.StringSchema<undefined>, undefined>;
352
+ readonly address: v.StringSchema<undefined>;
353
+ readonly ref: v.NullableSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "a reference such as `note:42`">]>, undefined>;
354
+ }, undefined>, undefined>;
355
+ readonly bcc: v.ArraySchema<v.StrictObjectSchema<{
356
+ readonly name: v.NullableSchema<v.StringSchema<undefined>, undefined>;
357
+ readonly address: v.StringSchema<undefined>;
358
+ readonly ref: v.NullableSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "a reference such as `note:42`">]>, undefined>;
359
+ }, undefined>, undefined>;
360
+ readonly reply_addresses: v.ArraySchema<v.StrictObjectSchema<{
361
+ readonly name: v.NullableSchema<v.StringSchema<undefined>, undefined>;
362
+ readonly address: v.StringSchema<undefined>;
363
+ readonly ref: v.NullableSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "a reference such as `note:42`">]>, undefined>;
364
+ }, undefined>, undefined>;
365
+ readonly labels: v.ArraySchema<v.StringSchema<undefined>, undefined>;
366
+ readonly thread: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "a reference such as `note:42`">]>;
367
+ readonly read: v.NullableSchema<v.BooleanSchema<undefined>, undefined>;
368
+ readonly flagged: v.NullableSchema<v.BooleanSchema<undefined>, undefined>;
369
+ readonly sender_score: v.OptionalSchema<v.StrictObjectSchema<{
370
+ readonly score: v.NumberSchema<undefined>;
371
+ readonly signals: v.ArraySchema<v.StringSchema<undefined>, undefined>;
372
+ readonly demoted: v.OptionalSchema<v.LiteralSchema<true, undefined>, undefined>;
373
+ }, undefined>, undefined>;
374
+ }, undefined>, undefined>;
375
+ readonly provider_metadata: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.UnknownSchema, undefined>, undefined>;
376
+ }, undefined>, undefined>, undefined>;
190
377
  readonly scheduled_for: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.IsoTimestampAction<string, "an ISO 8601 time in UTC">, v.EndsWithAction<string, "Z", "an ISO 8601 time in UTC, ending in `Z`">]>, undefined>;
191
378
  }, undefined>;
@@ -4,5 +4,7 @@ import { message } from "./message.js";
4
4
  export const messageWrite = v.strictObject({
5
5
  operation_id: id,
6
6
  message,
7
+ /** An album's messages, in order; `message` is the first. Absent for a single message. */
8
+ messages: v.optional(v.array(message)),
7
9
  scheduled_for: v.optional(time),
8
10
  });
@@ -26,10 +26,12 @@ const OTHERS = [
26
26
  ["extraction.invalid-proposals", "invalid_response", "the model's memory proposals could not be used"],
27
27
  validation("extraction.text-too-long", "the text is too long for memory extraction"),
28
28
  validation("file.locked", "another process holds the file's lock"),
29
+ ["mirror.partial", "provider_error", "some mirrored files were not synced"],
29
30
  ["profile.wrong-account", "authentication_error", "the signed-in source account does not match this profile"],
30
31
  validation("push.too-many-files", "the folder holds more files than one push takes"),
31
32
  validation("push.unreadable", "the folder to push could not be read"),
32
33
  validation("spreadsheet.unreadable", "the workbook could not be read"),
34
+ ["state.invalid", "configuration_error", "the saved sync state is unreadable or invalid; it is kept, not reset"],
33
35
  validation("store.refused", "the local store refused the document text"),
34
36
  ["store.not-writable", "permission_error", "the message store cannot be written from this process"],
35
37
  validation("catalog.scope-limit", "the selected catalog exceeds its entry limit"),
package/dist/mcp/agent.js CHANGED
@@ -6,7 +6,7 @@ import { VOCABULARY } from "@wirecat/cli-base/standards/tables";
6
6
  import * as v from "valibot";
7
7
  import { changesMessenger } from "../cli/effects.js";
8
8
  import { lentConnection } from "../cli/messenger/serve-relay.js";
9
- import { AUTHORITY_KEY, authorityAllowed, keyForCommand, levelFor, readKeysForCommand, } from "../sends/permissions.js";
9
+ import { AUTHORITY_KEY, authorityAllowed, botApiAllowed, isBotApi, keyForCommand, levelFor, readKeysForCommand, } from "../sends/permissions.js";
10
10
  const TYPES = new Map(VOCABULARY.flags.map((flag) => [flag.name, flag.type]));
11
11
  // `<name|id>` is one argument: its field is `name_or_id`.
12
12
  const snake = (name) => name.replaceAll("|", "_or_").replace(/[^a-z0-9]+/gi, "_");
@@ -24,6 +24,8 @@ const optionKind = (option, long) => {
24
24
  return type;
25
25
  if (/<json>/.test(option.flags))
26
26
  return "json";
27
+ if (Array.isArray(option.default))
28
+ return "repeat";
27
29
  return /\.\.\.[>\]]/.test(option.flags) ? "variadic" : "text";
28
30
  };
29
31
  const optionField = (option, long, negatable = false) => {
@@ -38,8 +40,8 @@ const optionField = (option, long, negatable = false) => {
38
40
  v.pipe(v.number(), v.integer(), v.minValue(0), v.description(about))
39
41
  : kind === "number"
40
42
  ? v.pipe(v.number(), v.description(about))
41
- : kind === "list"
42
- ? // The command line takes `a,b`; an agent may write it so, or as a list.
43
+ : kind === "list" || kind === "repeat"
44
+ ? // The command line takes `a,b` or the flag repeated; an agent may write one value, or a list.
43
45
  v.pipe(v.union([v.pipe(v.array(text("one value")), v.minLength(1)), text(about)]), v.description(about))
44
46
  : kind === "variadic"
45
47
  ? v.pipe(v.array(text("one value")), v.minLength(1), v.description(about))
@@ -58,6 +60,8 @@ const optionField = (option, long, negatable = false) => {
58
60
  return value === true ? [long] : negatable ? [`--no-${long.slice(2)}`] : [];
59
61
  if (kind === "variadic")
60
62
  return value.map((one) => `${long}=${String(one)}`);
63
+ if (kind === "repeat")
64
+ return (Array.isArray(value) ? value : [value]).map((one) => `${long}=${String(one)}`);
61
65
  if (kind === "list")
62
66
  return [`${long}=${Array.isArray(value) ? value.map(String).join(",") : String(value)}`];
63
67
  if (kind === "json")
@@ -138,7 +142,7 @@ export const toolsFromCommands = (commands, options = {}) => {
138
142
  const { root = [], exclude = [], levels, keyOf, authority, readOnly = false } = options;
139
143
  return flatten(commands)
140
144
  .filter((info) =>
141
- // A group that also runs on its own declares effects: `tasks duplicates` lists, its subcommands decide.
145
+ // Only a group that declares effects can run without a leaf.
142
146
  (info.commands.length === 0 || info.effects !== undefined) &&
143
147
  info.path.length > root.length &&
144
148
  startsWith(info.path, root) &&
@@ -146,7 +150,8 @@ export const toolsFromCommands = (commands, options = {}) => {
146
150
  info.mcp !== false &&
147
151
  info.lifetime === undefined &&
148
152
  !(readOnly && (changesMessenger(info) || authority?.(info.path))) &&
149
- (levels === undefined || refusal(info, levels, keyOf, authority) === undefined))
153
+ (levels === undefined ||
154
+ (refusal(info, levels, keyOf, authority) === undefined && (!isBotApi(info.path) || botApiAllowed(levels)))))
150
155
  .map((info) => ({
151
156
  command: info.path.slice(root.length).join(" "),
152
157
  path: info.path,
@@ -193,7 +198,7 @@ const argvOf = (info, input, profile, stdin) => {
193
198
  export const runCommandForAgent = async (program, path, input, ctx) => {
194
199
  try {
195
200
  const info = flatten(program.commands).find((one) => one.path.length === path.length && startsWith(one.path, path));
196
- // A group runs when it declares effects of its own, as `toolsFromCommands` offers it: `tasks duplicates` lists.
201
+ // Runnable groups declare effects, as `toolsFromCommands` offers them.
197
202
  if (!info || (info.commands.length > 0 && info.effects === undefined))
198
203
  throw new CliError("validation_error", `no command "${path.join(" ")}" to run`);
199
204
  if (info.lifetime)
@@ -226,6 +231,7 @@ export const runCommandForAgent = async (program, path, input, ctx) => {
226
231
  },
227
232
  ...(ctx.overrides?.length ? { overrides: ctx.overrides } : {}),
228
233
  authority: levels !== undefined && authorityAllowed(levels),
234
+ botApi: levels !== undefined && botApiAllowed(levels),
229
235
  },
230
236
  // Opened only when the command asks: a read the store answers never connects.
231
237
  ...(lend
@@ -5,6 +5,7 @@ import { exportMeeting } from "../export.js";
5
5
  import { importFiles } from "../import.js";
6
6
  import { MEETING_QUERY } from "../item.js";
7
7
  import { pull } from "../pull.js";
8
+ import { eventItem } from "../read-answers.js";
8
9
  import { listed, MEETING_QUERY_GUIDE, MeetingError, meetingDetailsAnswer, meetingPeople, meetingSummaryAnswer, meetingsList, meetingsQuery, meetingTranscriptAnswer, } from "../reads.js";
9
10
  import { SAVE_HELP } from "../save-hints.js";
10
11
  import { queryWordsAfterOptions } from "./query-options.js";
@@ -137,8 +138,9 @@ export const addMeetingCommands = (program, deps) => {
137
138
  });
138
139
  output(annotate(program.command("events").description("the owner's stored events").command("list"), {
139
140
  effects: LOCAL_READ,
141
+ output: { entity: "event" },
140
142
  }).description("list stored events")).action(async (_opts, command) => {
141
- print(listed(await deps.store.events()), command);
143
+ print(listed((await deps.store.events()).map(eventItem)), command);
142
144
  });
143
145
  };
144
146
  export { addMeetingPassageCommand, createMeetingPassageCommand, meetingPassageRequest, } from "./passage.js";
@@ -25,7 +25,7 @@ export { type MeetingProjectEvidenceAnswer, type MeetingProjectEvidenceItem, mee
25
25
  export { MEETING_PROJECT_EVIDENCE_QUERY, type MeetingProjectEvidenceRequest, prepareMeetingProjectEvidence, } from "./project-evidence-query.js";
26
26
  export { type MeetingProviderScope, snapshotMeetingScope } from "./provider.js";
27
27
  export { type PullOptions, pull, type RunReport } from "./pull.js";
28
- export { meetingLink, meetingLinkItem, meetingParticipants, meetingPassage, meetingReview, meetingReviewItem, meetingSpeaker, meetingSpeakerItem, meetingStats, meetingStatsItem, } from "./read-answers.js";
28
+ export { event, eventItem, meetingLink, meetingLinkItem, meetingParticipants, meetingPassage, meetingReview, meetingReviewItem, meetingSpeaker, meetingSpeakerItem, meetingStats, meetingStatsItem, } from "./read-answers.js";
29
29
  export type { MeetingContextReadCapabilities, MeetingReadBudget, MeetingReadCapabilities, MeetingReadScope, TranscriptContextInput, TranscriptContextPage, TranscriptPage, TranscriptReadScope, TranscriptRowPage, } from "./read-store.js";
30
30
  export { listed, MeetingError, meetingDetailsAnswer, meetingPeople, meetingSummaryAnswer, meetingTranscriptAnswer, type TranscriptReadOptions, } from "./reads.js";
31
31
  export { installRecordingArchiveSchedule, parseRecordingArchiveSchedule, planRecordingArchiveSchedule, type RecordingArchiveSchedule, type RecordingArchiveScheduleInput, type RecordingArchiveScheduler, recordingArchiveScheduleWindow, } from "./recording-schedule.js";
@@ -18,7 +18,7 @@ export { meetingProjectEvidence, meetingProjectEvidenceAnswer, } from "./project
18
18
  export { MEETING_PROJECT_EVIDENCE_QUERY, prepareMeetingProjectEvidence, } from "./project-evidence-query.js";
19
19
  export { snapshotMeetingScope } from "./provider.js";
20
20
  export { pull } from "./pull.js";
21
- export { meetingLink, meetingLinkItem, meetingParticipants, meetingPassage, meetingReview, meetingReviewItem, meetingSpeaker, meetingSpeakerItem, meetingStats, meetingStatsItem, } from "./read-answers.js";
21
+ export { event, eventItem, meetingLink, meetingLinkItem, meetingParticipants, meetingPassage, meetingReview, meetingReviewItem, meetingSpeaker, meetingSpeakerItem, meetingStats, meetingStatsItem, } from "./read-answers.js";
22
22
  export { listed, MeetingError, meetingDetailsAnswer, meetingPeople, meetingSummaryAnswer, meetingTranscriptAnswer, } from "./reads.js";
23
23
  export { installRecordingArchiveSchedule, parseRecordingArchiveSchedule, planRecordingArchiveSchedule, recordingArchiveScheduleWindow, } from "./recording-schedule.js";
24
24
  export { parseRecordingSyncCheckpoint, RecordingSyncError, recordingAssetFingerprint, recordingWindows, syncRecordingArchive, } from "./recording-sync.js";