@wirecat/cli-core 0.399.0 → 0.401.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 (259) hide show
  1. package/CHANGELOG.md +111 -0
  2. package/README.md +1 -1
  3. package/dist/analysis/consents.d.ts +11 -6
  4. package/dist/analysis/consents.js +5 -2
  5. package/dist/cli/bot/mcp.js +2 -1
  6. package/dist/cli/bot/store.js +1 -1
  7. package/dist/cli/config-command.js +20 -1
  8. package/dist/cli/context.d.ts +2 -0
  9. package/dist/cli/context.js +1 -1
  10. package/dist/cli/effects.d.ts +4 -1
  11. package/dist/cli/effects.js +10 -2
  12. package/dist/cli/index.d.ts +3 -2
  13. package/dist/cli/index.js +3 -2
  14. package/dist/cli/json-fields.js +12 -1
  15. package/dist/cli/meeting-evidence-answer.d.ts +46 -0
  16. package/dist/cli/meeting-evidence-answer.js +22 -0
  17. package/dist/cli/meeting-preparation-answer.js +1 -13
  18. package/dist/cli/messenger/account-command.js +15 -6
  19. package/dist/cli/messenger/account-profile-query.d.ts +2 -0
  20. package/dist/cli/messenger/account-profile-query.js +13 -0
  21. package/dist/cli/messenger/account-sessions-command.js +1 -2
  22. package/dist/cli/messenger/admin-commands.js +12 -12
  23. package/dist/cli/messenger/admin-contacts-command.js +6 -3
  24. package/dist/cli/messenger/admin-folders-command.js +5 -5
  25. package/dist/cli/messenger/admin-moderation-command.js +4 -4
  26. package/dist/cli/messenger/admin-statistics-command.js +6 -14
  27. package/dist/cli/messenger/analysis-consents-query.d.ts +5 -0
  28. package/dist/cli/messenger/analysis-consents-query.js +20 -0
  29. package/dist/cli/messenger/archive-commands.js +3 -3
  30. package/dist/cli/messenger/attachments-command.js +3 -0
  31. package/dist/cli/messenger/backfill-command.js +5 -4
  32. package/dist/cli/messenger/chat-queries.d.ts +1 -0
  33. package/dist/cli/messenger/chat-queries.js +12 -2
  34. package/dist/cli/messenger/chats-command.js +2 -2
  35. package/dist/cli/messenger/chats-documents-command.js +7 -5
  36. package/dist/cli/messenger/chats-members-command.js +7 -3
  37. package/dist/cli/messenger/chats-read-command.js +1 -1
  38. package/dist/cli/messenger/chats-tracking-command.js +14 -6
  39. package/dist/cli/messenger/contacts-command.js +9 -5
  40. package/dist/cli/messenger/conversations-command.js +20 -16
  41. package/dist/cli/messenger/doctor-command.js +4 -1
  42. package/dist/cli/messenger/document-links-query.d.ts +2 -0
  43. package/dist/cli/messenger/document-links-query.js +9 -0
  44. package/dist/cli/messenger/download-command.js +1 -0
  45. package/dist/cli/messenger/flood-command.d.ts +2 -2
  46. package/dist/cli/messenger/flood-command.js +3 -3
  47. package/dist/cli/messenger/gaps-command.js +2 -2
  48. package/dist/cli/messenger/guard-commands.js +35 -13
  49. package/dist/cli/messenger/images-command.js +1 -0
  50. package/dist/cli/messenger/media-archive-command.js +2 -0
  51. package/dist/cli/messenger/media-archive-move-command.js +1 -0
  52. package/dist/cli/messenger/media-archive-timer-command.js +1 -1
  53. package/dist/cli/messenger/mentions-command.js +15 -2
  54. package/dist/cli/messenger/message-writes.d.ts +192 -2
  55. package/dist/cli/messenger/message-writes.js +6 -2
  56. package/dist/cli/messenger/messages-command.js +2 -0
  57. package/dist/cli/messenger/messages-delete-command.js +1 -0
  58. package/dist/cli/messenger/messages-edit-command.js +1 -0
  59. package/dist/cli/messenger/messages-evidence-command.js +3 -1
  60. package/dist/cli/messenger/messages-forward-command.js +1 -0
  61. package/dist/cli/messenger/messages-pin-command.js +3 -0
  62. package/dist/cli/messenger/messages-send-command.js +10 -6
  63. package/dist/cli/messenger/metadata-command.js +6 -1
  64. package/dist/cli/messenger/models-command.js +10 -5
  65. package/dist/cli/messenger/polls-command.js +4 -0
  66. package/dist/cli/messenger/private-people-command.js +3 -3
  67. package/dist/cli/messenger/rankings-command.js +6 -11
  68. package/dist/cli/messenger/reactions-command.js +2 -0
  69. package/dist/cli/messenger/recipients-query.d.ts +5 -0
  70. package/dist/cli/messenger/recipients-query.js +18 -0
  71. package/dist/cli/messenger/records-command.js +13 -8
  72. package/dist/cli/messenger/review.js +1 -1
  73. package/dist/cli/messenger/schedule-command.js +2 -2
  74. package/dist/cli/messenger/search-answers.js +2 -0
  75. package/dist/cli/messenger/search-command.js +3 -1
  76. package/dist/cli/messenger/searches-command.js +5 -1
  77. package/dist/cli/messenger/sends-query.d.ts +5 -0
  78. package/dist/cli/messenger/sends-query.js +33 -0
  79. package/dist/cli/messenger/serve-command.js +1 -0
  80. package/dist/cli/messenger/server-command.js +0 -3
  81. package/dist/cli/messenger/statistics-query.d.ts +14 -0
  82. package/dist/cli/messenger/statistics-query.js +143 -0
  83. package/dist/cli/messenger/stats-command.js +5 -5
  84. package/dist/cli/messenger/store-maintenance-command.js +10 -10
  85. package/dist/cli/messenger/stored.js +4 -1
  86. package/dist/cli/messenger/tags-command.js +7 -1
  87. package/dist/cli/messenger/tasks-command.js +57 -14
  88. package/dist/cli/messenger/transcribe-command.js +1 -0
  89. package/dist/cli/messenger/watch-answers.d.ts +6 -0
  90. package/dist/cli/messenger/watch-answers.js +69 -0
  91. package/dist/cli/messenger/watch-command.d.ts +1 -1
  92. package/dist/cli/messenger/watch-command.js +56 -7
  93. package/dist/cli/program.js +5 -1
  94. package/dist/cli/runs/command.js +25 -38
  95. package/dist/cli/runs/query.d.ts +5 -0
  96. package/dist/cli/runs/query.js +32 -0
  97. package/dist/cli/runs/search-command.d.ts +4 -0
  98. package/dist/cli/runs/search-command.js +27 -0
  99. package/dist/cli/runs/search-query.d.ts +4 -0
  100. package/dist/cli/runs/search-query.js +50 -0
  101. package/dist/cli/runs/search.d.ts +2 -1
  102. package/dist/cli/runs/search.js +6 -6
  103. package/dist/documents/index.d.ts +1 -0
  104. package/dist/documents/index.js +1 -0
  105. package/dist/domain/attachments.js +9 -1
  106. package/dist/domain/rankings-options.js +3 -3
  107. package/dist/entities/account-change.d.ts +89 -0
  108. package/dist/entities/account-change.js +20 -0
  109. package/dist/entities/account-profile.d.ts +7 -0
  110. package/dist/entities/account-profile.js +8 -0
  111. package/dist/entities/analysis-consent.d.ts +9 -0
  112. package/dist/entities/analysis-consent.js +4 -0
  113. package/dist/entities/attachment-results.d.ts +96 -0
  114. package/dist/entities/attachment-results.js +31 -0
  115. package/dist/entities/batch-result.d.ts +27 -0
  116. package/dist/entities/batch-result.js +18 -0
  117. package/dist/entities/chat-admin.d.ts +234 -0
  118. package/dist/entities/chat-admin.js +84 -0
  119. package/dist/entities/chat-change.d.ts +25 -0
  120. package/dist/entities/chat-change.js +11 -0
  121. package/dist/entities/chat-metadata.d.ts +34 -0
  122. package/dist/entities/chat-metadata.js +15 -0
  123. package/dist/entities/chat-moderation.d.ts +44 -0
  124. package/dist/entities/chat-moderation.js +37 -0
  125. package/dist/entities/chat-tracking.d.ts +26 -0
  126. package/dist/entities/chat-tracking.js +23 -0
  127. package/dist/entities/contact-activity.d.ts +52 -0
  128. package/dist/entities/contact-activity.js +42 -0
  129. package/dist/entities/contact-context.d.ts +1568 -0
  130. package/dist/entities/contact-context.js +191 -0
  131. package/dist/entities/contact-write.d.ts +22 -0
  132. package/dist/entities/contact-write.js +6 -0
  133. package/dist/entities/conversation-preparation.d.ts +63 -0
  134. package/dist/entities/conversation-preparation.js +23 -0
  135. package/dist/entities/conversation-results.d.ts +567 -0
  136. package/dist/entities/conversation-results.js +94 -0
  137. package/dist/entities/document-link.d.ts +13 -0
  138. package/dist/entities/document-link.js +11 -0
  139. package/dist/entities/extraction-report.d.ts +95 -0
  140. package/dist/entities/extraction-report.js +34 -0
  141. package/dist/entities/hit.d.ts +4 -0
  142. package/dist/entities/hit.js +4 -0
  143. package/dist/entities/image-embedding.d.ts +9 -0
  144. package/dist/entities/image-embedding.js +10 -0
  145. package/dist/entities/index.d.ts +8284 -1921
  146. package/dist/entities/index.js +178 -3
  147. package/dist/entities/listener.d.ts +2150 -0
  148. package/dist/entities/listener.js +46 -0
  149. package/dist/entities/media-archive.d.ts +43 -0
  150. package/dist/entities/media-archive.js +32 -0
  151. package/dist/entities/meeting-evidence.d.ts +86 -0
  152. package/dist/entities/meeting-evidence.js +25 -0
  153. package/dist/entities/meeting-preparation-parts.d.ts +14 -0
  154. package/dist/entities/meeting-preparation-parts.js +15 -13
  155. package/dist/entities/meeting-task-proposal.d.ts +14 -0
  156. package/dist/entities/meeting-task-proposal.js +19 -0
  157. package/dist/entities/meeting.d.ts +1 -1
  158. package/dist/entities/meeting.js +1 -1
  159. package/dist/entities/mention.d.ts +63 -0
  160. package/dist/entities/mention.js +44 -0
  161. package/dist/entities/message-change.d.ts +19 -0
  162. package/dist/entities/message-change.js +6 -0
  163. package/dist/entities/message-context.d.ts +617 -0
  164. package/dist/entities/message-context.js +20 -0
  165. package/dist/entities/message-read.d.ts +73 -0
  166. package/dist/entities/message-read.js +58 -0
  167. package/dist/entities/message-transfer.d.ts +379 -0
  168. package/dist/entities/message-transfer.js +83 -0
  169. package/dist/entities/message-write.d.ts +378 -0
  170. package/dist/entities/message-write.js +10 -0
  171. package/dist/entities/model-key.d.ts +14 -0
  172. package/dist/entities/model-key.js +10 -0
  173. package/dist/entities/poll.d.ts +40 -0
  174. package/dist/entities/poll.js +16 -0
  175. package/dist/entities/private-contact.d.ts +10 -0
  176. package/dist/entities/private-contact.js +4 -0
  177. package/dist/entities/reaction-change.d.ts +7 -0
  178. package/dist/entities/reaction-change.js +8 -0
  179. package/dist/entities/recipient.d.ts +29 -0
  180. package/dist/entities/recipient.js +11 -0
  181. package/dist/entities/recorded-run.d.ts +103 -0
  182. package/dist/entities/recorded-run.js +44 -0
  183. package/dist/entities/saved-search.d.ts +4 -0
  184. package/dist/entities/saved-search.js +2 -0
  185. package/dist/entities/send-attempt.d.ts +31 -0
  186. package/dist/entities/send-attempt.js +29 -0
  187. package/dist/entities/store-maintenance.d.ts +319 -0
  188. package/dist/entities/store-maintenance.js +145 -0
  189. package/dist/entities/store-records.d.ts +442 -0
  190. package/dist/entities/store-records.js +99 -0
  191. package/dist/entities/tag-change.d.ts +74 -0
  192. package/dist/entities/tag-change.js +31 -0
  193. package/dist/entities/task-pair.d.ts +31 -0
  194. package/dist/entities/task-pair.js +23 -0
  195. package/dist/entities/task-results.d.ts +524 -0
  196. package/dist/entities/task-results.js +142 -0
  197. package/dist/errors/reasons.js +3 -0
  198. package/dist/mcp/agent.d.ts +3 -1
  199. package/dist/mcp/agent.js +17 -10
  200. package/dist/mcp/bot/server.d.ts +2 -0
  201. package/dist/mcp/bot/server.js +1 -0
  202. package/dist/mcp/server.js +3 -1
  203. package/dist/mcp/tools/attachments.js +1 -0
  204. package/dist/meetings/cli/index.js +4 -2
  205. package/dist/meetings/cli/passage.js +1 -0
  206. package/dist/meetings/index.d.ts +2 -1
  207. package/dist/meetings/index.js +1 -0
  208. package/dist/meetings/links.d.ts +16 -0
  209. package/dist/meetings/read-answers.d.ts +185 -0
  210. package/dist/meetings/read-answers.js +213 -0
  211. package/dist/ports/messenger.d.ts +10 -1
  212. package/dist/runs/run.d.ts +10 -2
  213. package/dist/runs/run.js +11 -3
  214. package/dist/sends/guard.d.ts +1 -1
  215. package/dist/sends/guard.js +9 -5
  216. package/dist/sends/journal.d.ts +9 -2
  217. package/dist/sends/journal.js +9 -2
  218. package/dist/sends/permissions.d.ts +5 -1
  219. package/dist/sends/permissions.js +42 -2
  220. package/dist/sends/recipients.d.ts +8 -0
  221. package/dist/sends/recipients.js +9 -0
  222. package/dist/sends/upload.d.ts +4 -4
  223. package/dist/sends/upload.js +24 -20
  224. package/dist/services/admin-statistics.js +3 -3
  225. package/dist/services/chat-documents.d.ts +1 -0
  226. package/dist/services/chat-documents.js +9 -3
  227. package/dist/services/chats.d.ts +1 -1
  228. package/dist/services/chats.js +5 -2
  229. package/dist/services/documents/mirrors.d.ts +98 -0
  230. package/dist/services/documents/mirrors.js +144 -0
  231. package/dist/services/meeting-links.d.ts +2 -17
  232. package/dist/services/messages.js +1 -0
  233. package/dist/services/search-all-meetings.js +21 -8
  234. package/dist/services/task-rules.d.ts +1 -1
  235. package/dist/services/tasks.d.ts +2 -2
  236. package/dist/services/tasks.js +1 -1
  237. package/dist/store/exports.d.ts +1 -1
  238. package/dist/store/exports.js +1 -1
  239. package/dist/store/messages.d.ts +3 -1
  240. package/dist/store/messages.js +2 -2
  241. package/dist/store/roster.d.ts +4 -1
  242. package/dist/store/roster.js +2 -2
  243. package/dist/store/sqlite/chats.d.ts +12 -0
  244. package/dist/store/sqlite/chats.js +1 -0
  245. package/dist/store/sqlite/document-links.d.ts +1 -1
  246. package/dist/store/sqlite/document-links.js +5 -5
  247. package/dist/store/sqlite/drizzle/bun.js +3 -3
  248. package/dist/store/sqlite/drizzle/bun.js.map +1 -1
  249. package/dist/store/sqlite/drizzle/core.js +2 -2
  250. package/dist/store/sqlite/drizzle/core.js.map +1 -1
  251. package/dist/store/sqlite/drizzle/node.js +3 -3
  252. package/dist/store/sqlite/drizzle/node.js.map +1 -1
  253. package/dist/store/sqlite/drizzle/{shared-O7CTKP45.js → shared-HKXF6HKX.js} +57 -57
  254. package/dist/store/sqlite/drizzle/{shared-O7CTKP45.js.map → shared-HKXF6HKX.js.map} +1 -1
  255. package/dist/store/sqlite/involvements.js +2 -1
  256. package/dist/store/sqlite/roster.d.ts +2 -1
  257. package/dist/store/sqlite/roster.js +3 -2
  258. package/package.json +2 -2
  259. package/parity.json +14 -69
@@ -0,0 +1,142 @@
1
+ import * as v from "valibot";
2
+ import { TASK_TYPES } from "../domain/knowledge.js";
3
+ import { TASK_KINDS, TASK_ORIGINS, TASK_STATES, TASK_VERDICTS } from "../tasks/index.js";
4
+ import { count, id, reference, text, time } from "./fields.js";
5
+ import { closeSuggestion } from "./task.js";
6
+ import { taskPair } from "./task-pair.js";
7
+ const nullableTime = v.nullable(time);
8
+ const link = v.strictObject({
9
+ id,
10
+ from: reference,
11
+ to: v.nullable(reference),
12
+ kind: v.picklist([
13
+ "links-to",
14
+ "blocked-by",
15
+ "follow-up-of",
16
+ "about",
17
+ "member-of",
18
+ "labelled",
19
+ "answered-by",
20
+ "evidence",
21
+ "created-from",
22
+ "duplicate-of",
23
+ "related-to",
24
+ "assigned-to",
25
+ ]),
26
+ anchor: v.nullable(text),
27
+ origin: v.picklist(["file", "owner", "suggested", "message"]),
28
+ target_text: v.nullable(text),
29
+ role: v.nullable(text),
30
+ evidence: v.nullable(text),
31
+ provenance: v.nullable(text),
32
+ confirmed: v.boolean(),
33
+ created_at: time,
34
+ });
35
+ export const taskCard = v.strictObject({
36
+ id,
37
+ ref: reference,
38
+ key: text,
39
+ project: reference,
40
+ title: text,
41
+ description: v.nullable(text),
42
+ type: v.picklist(TASK_TYPES),
43
+ status: v.picklist(TASK_STATES),
44
+ priority: v.nullable(v.number()),
45
+ parent: v.nullable(reference),
46
+ source: v.nullable(text),
47
+ due_at: nullableTime,
48
+ next_check_at: nullableTime,
49
+ closed_at: nullableTime,
50
+ reason: v.nullable(text),
51
+ verdict: v.nullable(v.picklist(TASK_VERDICTS)),
52
+ category: v.nullable(text),
53
+ claimed_by: v.nullable(text),
54
+ claimed_until: nullableTime,
55
+ close_certainty: v.nullable(v.number()),
56
+ close_suggestion: v.nullable(closeSuggestion),
57
+ assignments: v.array(v.strictObject({ to: reference, role: v.picklist(["assignee", "reviewer", "watcher"]) })),
58
+ created_at: time,
59
+ updated_at: time,
60
+ links: v.array(link),
61
+ linked_from: v.array(link),
62
+ });
63
+ /** Service task receipts preserve source pointers and their on-demand previews. */
64
+ const taskView = v.strictObject({
65
+ id,
66
+ source: text,
67
+ source_kind: text,
68
+ account: text,
69
+ group: text,
70
+ kind: v.picklist(TASK_KINDS),
71
+ state: v.picklist(TASK_STATES),
72
+ reason: v.optional(text),
73
+ origin: v.picklist(TASK_ORIGINS),
74
+ created_at: time,
75
+ due_at: v.optional(time),
76
+ closed_at: v.optional(time),
77
+ closed_by: v.optional(v.picklist(TASK_ORIGINS)),
78
+ key: v.optional(text),
79
+ category: v.optional(text),
80
+ claimed_by: v.optional(text),
81
+ claimed_until: v.optional(time),
82
+ message: v.nullable(v.strictObject({ sender_name: v.nullable(text), text, timestamp: time })),
83
+ note: v.optional(v.nullable(v.strictObject({ id, title: v.nullable(text), text, updated_at: time }))),
84
+ });
85
+ export const taskCreated = v.strictObject({
86
+ ...taskView.entries,
87
+ created: v.boolean(),
88
+ attached: v.optional(v.literal(true)),
89
+ review: v.optional(count),
90
+ follow_up_of: v.optional(taskPair.entries.other),
91
+ card: v.optional(taskCard),
92
+ });
93
+ export const taskClosed = v.strictObject({
94
+ ...taskView.entries,
95
+ close_certainty: v.nullable(v.number()),
96
+ close_suggestion: v.nullable(closeSuggestion),
97
+ });
98
+ export const taskLinks = v.union([
99
+ v.strictObject({ ...taskCard.entries, review: v.optional(count) }),
100
+ v.strictObject({
101
+ relations: v.array(v.strictObject({
102
+ id,
103
+ from: reference,
104
+ to: reference,
105
+ kind: v.picklist(["blocked-by", "follow-up-of", "related-to", "duplicate-of", "discovered-from"]),
106
+ })),
107
+ }),
108
+ ]);
109
+ export const taskSimilar = v.strictObject({
110
+ ref: reference,
111
+ key: text,
112
+ title: text,
113
+ status: text,
114
+ created_at: time,
115
+ found_by: v.array(v.picklist(["text", "person", "category", "reply"])),
116
+ score: v.number(),
117
+ band: taskPair.entries.band,
118
+ levels: taskPair.entries.levels,
119
+ reasons: v.array(text),
120
+ text: v.strictObject({ shared_stems: count, all_stems: count, stems: v.number(), trigrams: v.number() }),
121
+ });
122
+ export const taskMerge = v.strictObject({ pair: taskPair, linked: count, review: count, task: taskCard });
123
+ export const taskUnmerge = v.strictObject({ pair: taskPair, task: taskCard });
124
+ export const taskCategories = v.strictObject({
125
+ categories: v.array(v.strictObject({
126
+ name: text,
127
+ meaning: text,
128
+ triggers: v.strictObject({ en: v.array(text), ru: v.array(text), es: v.array(text) }),
129
+ })),
130
+ unlisted: v.array(v.strictObject({ name: text, open: count, total: count })),
131
+ file: v.nullable(text),
132
+ });
133
+ export const taskScan = v.strictObject({
134
+ chat: text,
135
+ messages: count,
136
+ added: count,
137
+ closed: count,
138
+ review: count,
139
+ held: v.optional(count),
140
+ held_chats: v.optional(count),
141
+ tasks: v.array(v.strictObject({ source: text, kind: v.picklist(TASK_KINDS), category: v.nullable(text) })),
142
+ });
@@ -8,6 +8,7 @@ const QUERY = [
8
8
  ["query.invalid-context", "the context size is out of range"],
9
9
  ["query.invalid-limit", "the limit is out of range"],
10
10
  ["query.invalid-scope", "the query selects no account"],
11
+ ["query.invalid-duration", "a duration in the query cannot be read"],
11
12
  ["query.invalid-size", "a size in the query cannot be read"],
12
13
  ["query.invalid-reference", "a reference in the query is not valid"],
13
14
  ["query.invalid-tag", "a tag in the query is not valid"],
@@ -25,10 +26,12 @@ const OTHERS = [
25
26
  ["extraction.invalid-proposals", "invalid_response", "the model's memory proposals could not be used"],
26
27
  validation("extraction.text-too-long", "the text is too long for memory extraction"),
27
28
  validation("file.locked", "another process holds the file's lock"),
29
+ ["mirror.partial", "provider_error", "some mirrored files were not synced"],
28
30
  ["profile.wrong-account", "authentication_error", "the signed-in source account does not match this profile"],
29
31
  validation("push.too-many-files", "the folder holds more files than one push takes"),
30
32
  validation("push.unreadable", "the folder to push could not be read"),
31
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"],
32
35
  validation("store.refused", "the local store refused the document text"),
33
36
  ["store.not-writable", "permission_error", "the message store cannot be written from this process"],
34
37
  validation("catalog.scope-limit", "the selected catalog exceeds its entry limit"),
@@ -53,6 +53,8 @@ export interface CatalogueOptions {
53
53
  /** Under `<PREFIX>_READ_ONLY`: a change on the messenger is not offered either. */
54
54
  readOnly?: boolean;
55
55
  keyOf?: (path: readonly string[]) => PermissionKey | null | undefined;
56
+ /** Whether a command changes what a later run may do (`grantsAuthority`): offered only under `mcp.authority`. */
57
+ authority?: (path: readonly string[]) => boolean;
56
58
  /** Arguments left out of every tool, by name. */
57
59
  omit?: readonly string[];
58
60
  /** Offer `offline` on commands that read the messenger: answer from the copy on this machine. */
@@ -64,7 +66,7 @@ export interface CatalogueOptions {
64
66
  * One tool per command an agent may run under `root` (NEED-1411): every leaf command and every group that runs on
65
67
  * its own, except one marked
66
68
  * `mcp: false` (on itself or a group above it), one with a `lifetime` — an agent call must return — and one the
67
- * profile's levels refuse. Its input is the command's arguments and options in snake_case, typed as far as the
69
+ * profile's levels refuse, which include `mcp.authority` for what `authority` names. Its input is the command's arguments and options in snake_case, typed as far as the
68
70
  * command tree and the shared flag vocabulary say; an option marked `mcp: false` is left out.
69
71
  */
70
72
  export declare const toolsFromCommands: (commands: readonly CommandInfo[], options?: CatalogueOptions) => AgentTool[];
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 { keyForCommand, levelFor, readKeysForCommand } from "../sends/permissions.js";
9
+ import { AUTHORITY_KEY, authorityAllowed, 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")
@@ -115,7 +119,9 @@ const fieldsOf = (info, { omit = [], offline = false, stdin }) => {
115
119
  const schemaOf = (fields) => v.object(Object.fromEntries(fields.map((field) => [field.name, field.required ? field.schema : v.optional(field.schema)])));
116
120
  const startsWith = (path, prefix) => prefix.every((word, at) => path[at] === word);
117
121
  /** Why the profile refuses this command now, or nothing. */
118
- const refusal = (info, levels, keyOf) => {
122
+ const refusal = (info, levels, keyOf, authority) => {
123
+ if (authority?.(info.path) && !authorityAllowed(levels))
124
+ return `the profile keeps ${AUTHORITY_KEY} off`;
119
125
  const key = keyOf?.(info.path) ?? keyForCommand(info.path);
120
126
  const level = key ? levelFor(levels, key).level : "allow";
121
127
  if (level === "deny")
@@ -129,22 +135,22 @@ const refusal = (info, levels, keyOf) => {
129
135
  * One tool per command an agent may run under `root` (NEED-1411): every leaf command and every group that runs on
130
136
  * its own, except one marked
131
137
  * `mcp: false` (on itself or a group above it), one with a `lifetime` — an agent call must return — and one the
132
- * profile's levels refuse. Its input is the command's arguments and options in snake_case, typed as far as the
138
+ * profile's levels refuse, which include `mcp.authority` for what `authority` names. Its input is the command's arguments and options in snake_case, typed as far as the
133
139
  * command tree and the shared flag vocabulary say; an option marked `mcp: false` is left out.
134
140
  */
135
141
  export const toolsFromCommands = (commands, options = {}) => {
136
- const { root = [], exclude = [], levels, keyOf, readOnly = false } = options;
142
+ const { root = [], exclude = [], levels, keyOf, authority, readOnly = false } = options;
137
143
  return flatten(commands)
138
144
  .filter((info) =>
139
- // 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.
140
146
  (info.commands.length === 0 || info.effects !== undefined) &&
141
147
  info.path.length > root.length &&
142
148
  startsWith(info.path, root) &&
143
149
  !exclude.some((skipped) => startsWith(info.path.slice(root.length), skipped)) &&
144
150
  info.mcp !== false &&
145
151
  info.lifetime === undefined &&
146
- !(readOnly && changesMessenger(info)) &&
147
- (levels === undefined || refusal(info, levels, keyOf) === undefined))
152
+ !(readOnly && (changesMessenger(info) || authority?.(info.path))) &&
153
+ (levels === undefined || refusal(info, levels, keyOf, authority) === undefined))
148
154
  .map((info) => ({
149
155
  command: info.path.slice(root.length).join(" "),
150
156
  path: info.path,
@@ -191,7 +197,7 @@ const argvOf = (info, input, profile, stdin) => {
191
197
  export const runCommandForAgent = async (program, path, input, ctx) => {
192
198
  try {
193
199
  const info = flatten(program.commands).find((one) => one.path.length === path.length && startsWith(one.path, path));
194
- // A group runs when it declares effects of its own, as `toolsFromCommands` offers it: `tasks duplicates` lists.
200
+ // Runnable groups declare effects, as `toolsFromCommands` offers them.
195
201
  if (!info || (info.commands.length > 0 && info.effects === undefined))
196
202
  throw new CliError("validation_error", `no command "${path.join(" ")}" to run`);
197
203
  if (info.lifetime)
@@ -223,6 +229,7 @@ export const runCommandForAgent = async (program, path, input, ctx) => {
223
229
  failure = object;
224
230
  },
225
231
  ...(ctx.overrides?.length ? { overrides: ctx.overrides } : {}),
232
+ authority: levels !== undefined && authorityAllowed(levels),
226
233
  },
227
234
  // Opened only when the command asks: a read the store answers never connects.
228
235
  ...(lend
@@ -14,6 +14,8 @@ export interface BotServerOptions {
14
14
  levels?: () => Readonly<Record<PermissionKey, Level>>;
15
15
  /** The key a CLI's own bot command is guarded by, from its full path, when `keyForCommand` does not know it. */
16
16
  keyOf?: (path: readonly string[]) => PermissionKey | null | undefined;
17
+ /** Whether a command changes what a later run may do; such a command is offered only under `mcp.authority`. */
18
+ authority?: (path: readonly string[]) => boolean;
17
19
  env: NodeJS.ProcessEnv;
18
20
  skill?: URL;
19
21
  }
@@ -28,6 +28,7 @@ export const createBotServer = (options) => {
28
28
  levels: settings.permissions,
29
29
  readOnly: readOnlyLockOf(bot.app, env) !== undefined,
30
30
  ...(options.keyOf ? { keyOf: options.keyOf } : {}),
31
+ ...(options.authority ? { authority: options.authority } : {}),
31
32
  offline: true,
32
33
  // Another bot's copy is this bot's to read only where `read_other_bots` says so.
33
34
  ...(settings.readOtherBots ? {} : { omit: ["all_bots", "bots"] }),
@@ -8,7 +8,7 @@ import * as v from "valibot";
8
8
  import { findCommand } from "../cli/command-contract.js";
9
9
  import { environmentOf } from "../cli/context.js";
10
10
  import { refuseWriteBeforeConnecting } from "../cli/early-refusal.js";
11
- import { judgedTargets } from "../cli/effects.js";
11
+ import { changesAuthorityAt, judgedTargets } from "../cli/effects.js";
12
12
  import { itemOf } from "../cli/envelope.js";
13
13
  import { DEFAULT_OUTPUT_BYTES } from "../cli/execution.js";
14
14
  import { recalledAccount } from "../cli/messenger/accounts.js";
@@ -98,6 +98,7 @@ export const createServer = (command, context, messenger, sessionOptions) => {
98
98
  return undefined;
99
99
  }
100
100
  };
101
+ const authority = changesAuthorityAt(root);
101
102
  const stdin = (path) => {
102
103
  try {
103
104
  return stdinFieldOf(findCommand(root, path));
@@ -115,6 +116,7 @@ export const createServer = (command, context, messenger, sessionOptions) => {
115
116
  levels: settings.permissions,
116
117
  readOnly: readOnlyLockOf(app, context.env) !== undefined,
117
118
  keyOf,
119
+ authority,
118
120
  offline: true,
119
121
  stdin,
120
122
  }).map((one) => "sync_first" in one.input.entries && !syncAllowed(one.path)
@@ -9,6 +9,7 @@ export const attachmentsTools = (messenger) => {
9
9
  const _command = messenger.app.command;
10
10
  return {
11
11
  attachments_show: tool({
12
+ output: { entity: "attachment_bytes", list: false },
12
13
  title: "Read bytes of one retained attachment",
13
14
  outputLimit: (args, defaults) => args.page === undefined
14
15
  ? DEFAULT_OUTPUT_BYTES
@@ -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";
@@ -94,7 +95,7 @@ export const addMeetingCommands = (program, deps) => {
94
95
  else
95
96
  print(result, command);
96
97
  });
97
- output(annotate(group.command("people"), { effects: LOCAL_READ })
98
+ output(annotate(group.command("people"), { effects: LOCAL_READ, output: { entity: "meeting_participants" } })
98
99
  .description("find meeting participants by name or email")
99
100
  .argument("<query>", "a name or an email address"))
100
101
  .option("--limit <n>", "most matching observations per page, 1–1000 (default 50)", integer)
@@ -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";
@@ -39,6 +39,7 @@ export const createMeetingPassageCommand = (program) => {
39
39
  .default("text")), {
40
40
  origin: "handwritten",
41
41
  effects: { remote: "none", local: "read" },
42
+ output: { entity: "meeting_passage" },
42
43
  examples: [`${program.name()} meetings passage meeting:1/1/1/0 --json`],
43
44
  });
44
45
  };
@@ -9,7 +9,7 @@ export { type Finding, type FindingsInput, type FindingsReceipt, type FindingsRu
9
9
  export { liftMeetingFields, MEETING_HIT_QUERY, meetingWordsQuery, parseMeetingQuery } from "./hit-query.js";
10
10
  export { type ImportFile, importFiles } from "./import.js";
11
11
  export { MEETING_ISSUES, MEETING_QUERY, type MeetingIssue, type MeetingItem, type MeetingOwner, meeting, meetingIssuesOf, meetingItem, } from "./item.js";
12
- export { CHAT_MESSAGES_READ, type MeetingChatLine, type MeetingChatLinesInput, type MeetingChatLinesStore, } from "./links.js";
12
+ export { CHAT_MESSAGES_READ, type MeetingChatLine, type MeetingChatLinesInput, type MeetingChatLinesStore, type MeetingLink, } from "./links.js";
13
13
  export { createMeetingContext, MEETING_FACT_TYPES, type MeetingContextAction, type MeetingContextChange, type MeetingContextOperation, type MeetingContextPorts, type MeetingContextReceipt, validateMeetingContextChange, } from "./meeting-context.js";
14
14
  export { createMeetingManagement, dispatchMeetingMutation, type ManagedMeeting, type ManagedMeetingChange, type MeetingManagement, type MeetingManagementPorts, type MeetingMutationOptions, type MeetingMutationProposal, type MeetingMutationReceipt, type MeetingOperationOptions, type MeetingProviderContext, validateMeetingChange, } from "./meeting-management.js";
15
15
  export type { Attachment, ChatLine, Event, EventSeries, JsonValue, Meeting, MeetingSeries, Metadata, Occurrence, Participant, RecordTimes, SourceChatLine, SourceMeeting, Summary, SummaryContent, Transcript, TranscriptLine, TranscriptRow, } from "./model.js";
@@ -25,6 +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 { event, eventItem, meetingLink, meetingLinkItem, meetingParticipants, meetingPassage, meetingReview, meetingReviewItem, meetingSpeaker, meetingSpeakerItem, meetingStats, meetingStatsItem, } from "./read-answers.js";
28
29
  export type { MeetingContextReadCapabilities, MeetingReadBudget, MeetingReadCapabilities, MeetingReadScope, TranscriptContextInput, TranscriptContextPage, TranscriptPage, TranscriptReadScope, TranscriptRowPage, } from "./read-store.js";
29
30
  export { listed, MeetingError, meetingDetailsAnswer, meetingPeople, meetingSummaryAnswer, meetingTranscriptAnswer, type TranscriptReadOptions, } from "./reads.js";
30
31
  export { installRecordingArchiveSchedule, parseRecordingArchiveSchedule, planRecordingArchiveSchedule, type RecordingArchiveSchedule, type RecordingArchiveScheduleInput, type RecordingArchiveScheduler, recordingArchiveScheduleWindow, } from "./recording-schedule.js";
@@ -18,6 +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 { event, eventItem, meetingLink, meetingLinkItem, meetingParticipants, meetingPassage, meetingReview, meetingReviewItem, meetingSpeaker, meetingSpeakerItem, meetingStats, meetingStatsItem, } from "./read-answers.js";
21
22
  export { listed, MeetingError, meetingDetailsAnswer, meetingPeople, meetingSummaryAnswer, meetingTranscriptAnswer, } from "./reads.js";
22
23
  export { installRecordingArchiveSchedule, parseRecordingArchiveSchedule, planRecordingArchiveSchedule, recordingArchiveScheduleWindow, } from "./recording-schedule.js";
23
24
  export { parseRecordingSyncCheckpoint, RecordingSyncError, recordingAssetFingerprint, recordingWindows, syncRecordingArchive, } from "./recording-sync.js";
@@ -15,4 +15,20 @@ export interface MeetingChatLine {
15
15
  export interface MeetingChatLinesStore {
16
16
  meetingChatLines(input: MeetingChatLinesInput): Promise<MeetingChatLine[]>;
17
17
  }
18
+ /** One link as the meetings' chat holds it: where and how often it was shared. */
19
+ export interface MeetingLink {
20
+ url: string;
21
+ domain: string | null;
22
+ /** The Google Docs, Sheets, Slides, Forms or Drive file it names. */
23
+ documentId: string | null;
24
+ count: number;
25
+ firstAt: number;
26
+ lastAt: number;
27
+ senders: string[];
28
+ meetings: {
29
+ meetingId: number;
30
+ accountId: number;
31
+ title: string | null;
32
+ }[];
33
+ }
18
34
  export declare const CHAT_MESSAGES_READ = 100000;
@@ -0,0 +1,185 @@
1
+ import * as v from "valibot";
2
+ import type { MeetingLink } from "./links.js";
3
+ import type { Event } from "./model.js";
4
+ import type { MeetingReviewItem } from "./review.js";
5
+ import type { MeetingSpeakerStats, MeetingStats } from "./stats.js";
6
+ /** One meeting in `review`: what the store holds about it, never transcript text. */
7
+ export declare const meetingReview: v.StrictObjectSchema<{
8
+ readonly ref: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "a reference such as `note:42`">]>;
9
+ readonly id: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
10
+ readonly title: v.NullableSchema<v.StringSchema<undefined>, undefined>;
11
+ readonly started_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>;
12
+ readonly duration_ms: v.NullableSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>, undefined>;
13
+ readonly participants_count: v.NullableSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>, undefined>;
14
+ readonly projects: v.ArraySchema<v.StringSchema<undefined>, undefined>;
15
+ /** Null when the meeting has no current transcript. */
16
+ readonly transcript: v.NullableSchema<v.StrictObjectSchema<{
17
+ readonly lines: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
18
+ readonly words: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
19
+ }, undefined>, undefined>;
20
+ /** The three who talked longest. */
21
+ readonly speakers: v.ArraySchema<v.StrictObjectSchema<{
22
+ readonly name: v.NullableSchema<v.StringSchema<undefined>, undefined>;
23
+ readonly talk_ms: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
24
+ }, undefined>, undefined>;
25
+ /** The newest stored summary; null when there is none. */
26
+ readonly summary: v.NullableSchema<v.StrictObjectSchema<{
27
+ readonly source: v.StringSchema<undefined>;
28
+ readonly title: v.NullableSchema<v.StringSchema<undefined>, undefined>;
29
+ readonly overview: v.NullableSchema<v.StringSchema<undefined>, undefined>;
30
+ readonly next_steps: v.ArraySchema<v.StringSchema<undefined>, undefined>;
31
+ readonly url: v.NullableSchema<v.StringSchema<undefined>, undefined>;
32
+ }, undefined>, undefined>;
33
+ }, undefined>;
34
+ export declare const meetingReviewItem: (one: MeetingReviewItem) => v.InferOutput<typeof meetingReview>;
35
+ /** A link shared in meeting chat, with where and how often; `mentions list` answers these. */
36
+ export declare const meetingLink: v.StrictObjectSchema<{
37
+ readonly url: v.StringSchema<undefined>;
38
+ readonly domain: v.NullableSchema<v.StringSchema<undefined>, undefined>;
39
+ /** The Google Docs, Sheets, Slides, Forms or Drive file it names. */
40
+ readonly document_id: v.NullableSchema<v.StringSchema<undefined>, undefined>;
41
+ readonly count: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
42
+ readonly first_at: 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`">]>;
43
+ readonly last_at: 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`">]>;
44
+ readonly senders: v.ArraySchema<v.StringSchema<undefined>, undefined>;
45
+ readonly meetings: v.ArraySchema<v.StrictObjectSchema<{
46
+ readonly ref: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "a reference such as `note:42`">]>;
47
+ readonly title: v.NullableSchema<v.StringSchema<undefined>, undefined>;
48
+ }, undefined>, undefined>;
49
+ }, undefined>;
50
+ export declare const meetingLinkItem: (link: MeetingLink) => v.InferOutput<typeof meetingLink>;
51
+ /** One speaker's talk over the selected meetings; `stats meetings top` answers these. */
52
+ export declare const meetingSpeaker: v.StrictObjectSchema<{
53
+ /** `person:<id>`, `identity:<id>`, `name:<lowercased name>` or `unknown`. */
54
+ readonly key: v.StringSchema<undefined>;
55
+ readonly name: v.NullableSchema<v.StringSchema<undefined>, undefined>;
56
+ readonly person_id: v.NullableSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>]>, undefined>;
57
+ readonly identity_id: v.NullableSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>]>, undefined>;
58
+ readonly meetings: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
59
+ readonly lines: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
60
+ readonly words: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
61
+ readonly talk_ms: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
62
+ /** This speaker's part of all talk time, 0–1. */
63
+ readonly share: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 0, undefined>, v.MaxValueAction<number, 1, undefined>]>;
64
+ }, undefined>;
65
+ export declare const meetingSpeakerItem: (one: MeetingSpeakerStats) => v.InferOutput<typeof meetingSpeaker>;
66
+ /** `stats meetings show`: how much was said over the selected meetings, by week, with the top speakers. */
67
+ export declare const meetingStats: v.StrictObjectSchema<{
68
+ readonly time_zone: v.StringSchema<undefined>;
69
+ readonly meetings: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
70
+ readonly lines: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
71
+ readonly words: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
72
+ readonly talk_ms: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
73
+ /** `week_start` is the Monday, as a date in `time_zone`. */
74
+ readonly weeks: v.ArraySchema<v.StrictObjectSchema<{
75
+ readonly week_start: v.StringSchema<undefined>;
76
+ readonly meetings: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
77
+ readonly talk_ms: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
78
+ }, undefined>, undefined>;
79
+ readonly top_speakers: v.ArraySchema<v.StrictObjectSchema<{
80
+ /** `person:<id>`, `identity:<id>`, `name:<lowercased name>` or `unknown`. */
81
+ readonly key: v.StringSchema<undefined>;
82
+ readonly name: v.NullableSchema<v.StringSchema<undefined>, undefined>;
83
+ readonly person_id: v.NullableSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>]>, undefined>;
84
+ readonly identity_id: v.NullableSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>]>, undefined>;
85
+ readonly meetings: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
86
+ readonly lines: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
87
+ readonly words: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
88
+ readonly talk_ms: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
89
+ /** This speaker's part of all talk time, 0–1. */
90
+ readonly share: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 0, undefined>, v.MaxValueAction<number, 1, undefined>]>;
91
+ }, undefined>, undefined>;
92
+ }, undefined>;
93
+ export declare const meetingStatsItem: (found: MeetingStats, top?: number) => v.InferOutput<typeof meetingStats>;
94
+ /** `meetings people`: one page of participant observations whose name or email matches. */
95
+ export declare const meetingParticipants: v.StrictObjectSchema<{
96
+ readonly schema_version: v.LiteralSchema<1, undefined>;
97
+ readonly kind: v.LiteralSchema<"meeting_participants", undefined>;
98
+ readonly account_id: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>]>;
99
+ readonly query: v.StringSchema<undefined>;
100
+ readonly items: v.ArraySchema<v.StrictObjectSchema<{
101
+ readonly participant_id: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>]>;
102
+ readonly meeting_id: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>]>;
103
+ readonly identity_id: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>]>;
104
+ readonly display_name: v.NullableSchema<v.StringSchema<undefined>, undefined>;
105
+ readonly email: v.NullableSchema<v.StringSchema<undefined>, undefined>;
106
+ }, undefined>, undefined>;
107
+ /** Several identities on one page are observations, never speaker attribution or person links. */
108
+ readonly ambiguity: v.StrictObjectSchema<{
109
+ readonly scope: v.LiteralSchema<"page", undefined>;
110
+ readonly multiple_identities: v.BooleanSchema<undefined>;
111
+ readonly identity_ids: v.ArraySchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>]>, undefined>;
112
+ }, undefined>;
113
+ readonly coverage: v.StrictObjectSchema<{
114
+ readonly scanned: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
115
+ readonly read_bytes: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
116
+ readonly archive_completeness: v.LiteralSchema<"unknown", undefined>;
117
+ readonly truncated_by: v.NullableSchema<v.PicklistSchema<("limit" | "read_bytes" | "scan_limit")[], undefined>, undefined>;
118
+ }, undefined>;
119
+ readonly page: v.StrictObjectSchema<{
120
+ readonly mode: v.LiteralSchema<"cursor", undefined>;
121
+ readonly limit: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
122
+ readonly has_more: v.BooleanSchema<undefined>;
123
+ readonly next_cursor: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
124
+ }, undefined>;
125
+ }, undefined>;
126
+ /** `meetings passage`: a transcript line with the lines around it. */
127
+ export declare const meetingPassage: v.StrictObjectSchema<{
128
+ readonly schema_version: v.LiteralSchema<1, undefined>;
129
+ readonly kind: v.LiteralSchema<"meeting_context", undefined>;
130
+ readonly source: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "a reference such as `note:42`">]>;
131
+ readonly target_ref: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "a reference such as `note:42`">]>;
132
+ readonly target_fingerprint: v.StringSchema<undefined>;
133
+ readonly fingerprint: v.StringSchema<undefined>;
134
+ readonly revision: v.PicklistSchema<["current", "superseded"], undefined>;
135
+ readonly limits: v.StrictObjectSchema<{
136
+ readonly before: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
137
+ readonly after: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
138
+ readonly bytes: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
139
+ readonly max_read_bytes: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
140
+ }, undefined>;
141
+ readonly content_bytes: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
142
+ readonly coverage: v.StrictObjectSchema<{
143
+ readonly included: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
144
+ readonly before: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
145
+ readonly after: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
146
+ readonly has_before: v.BooleanSchema<undefined>;
147
+ readonly has_after: v.BooleanSchema<undefined>;
148
+ readonly truncated_by: v.NullableSchema<v.PicklistSchema<"bytes"[], undefined>, undefined>;
149
+ readonly before_ref: v.NullableSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "a reference such as `note:42`">]>, undefined>;
150
+ readonly after_ref: v.NullableSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "a reference such as `note:42`">]>, undefined>;
151
+ readonly continuation: v.LiteralSchema<"anchor-inclusive", undefined>;
152
+ readonly archive_completeness: v.LiteralSchema<"unknown", undefined>;
153
+ readonly input: v.LiteralSchema<"bounded-meeting-context", undefined>;
154
+ }, undefined>;
155
+ readonly items: v.ArraySchema<v.StrictObjectSchema<{
156
+ readonly ref: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "a reference such as `note:42`">]>;
157
+ readonly fingerprint: v.StringSchema<undefined>;
158
+ readonly transcript_id: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>]>;
159
+ readonly content_hash: v.NullableSchema<v.StringSchema<undefined>, undefined>;
160
+ readonly position: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
161
+ readonly start_ms: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
162
+ readonly end_ms: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
163
+ readonly speaker_participant_id: v.NullableSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>]>, undefined>;
164
+ readonly speaker_name: v.NullableSchema<v.StringSchema<undefined>, undefined>;
165
+ readonly text: v.StringSchema<undefined>;
166
+ readonly revision: v.PicklistSchema<["current", "superseded"], undefined>;
167
+ }, undefined>, undefined>;
168
+ }, undefined>;
169
+ /** A stored event a meeting belongs to; `id` is what `meetings update --event-id` takes. */
170
+ export declare const event: v.StrictObjectSchema<{
171
+ readonly id: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
172
+ readonly event_series_id: v.NullableSchema<v.StringSchema<undefined>, undefined>;
173
+ readonly title: v.NullableSchema<v.StringSchema<undefined>, undefined>;
174
+ readonly description: v.NullableSchema<v.StringSchema<undefined>, undefined>;
175
+ readonly location: v.NullableSchema<v.StringSchema<undefined>, undefined>;
176
+ readonly starts_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>;
177
+ readonly ends_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>;
178
+ readonly timezone: v.NullableSchema<v.StringSchema<undefined>, undefined>;
179
+ /** `auto`: made from a meeting; `owner`: made by hand. */
180
+ readonly origin: v.PicklistSchema<["auto", "owner"], undefined>;
181
+ readonly deleted_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>;
182
+ readonly created_at: 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`">]>;
183
+ readonly updated_at: 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`">]>;
184
+ }, undefined>;
185
+ export declare const eventItem: (one: Event) => v.InferOutput<typeof event>;