@wirecat/cli-core 0.459.0 → 0.461.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +28 -0
- package/dist/calendar/cli/index.js +25 -12
- package/dist/calendar/mcp/index.d.ts +2 -2
- package/dist/calendar/mcp/index.js +2 -11
- package/dist/calendar/reads.d.ts +4 -0
- package/dist/calendar/reads.js +13 -0
- package/dist/cli/messenger/search-answers.js +3 -0
- package/dist/entities/hit.d.ts +2 -0
- package/dist/entities/hit.js +2 -0
- package/dist/entities/index.d.ts +2 -0
- package/dist/meetings/read-answers.d.ts +2 -0
- package/dist/meetings/read-answers.js +2 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,34 @@ shape of this file.
|
|
|
7
7
|
|
|
8
8
|
## Unreleased
|
|
9
9
|
|
|
10
|
+
## 0.461.0 — 27.10.2026
|
|
11
|
+
|
|
12
|
+
### Changed — may break callers
|
|
13
|
+
|
|
14
|
+
- **The shared calendar commands mark the text whoever sent an invitation wrote.** `addCalendarCommands` answers
|
|
15
|
+
carry `untrusted`, the field names an agent reads as data, as `callCalendarTool`'s answers and `search all`'s
|
|
16
|
+
event hits already do
|
|
17
|
+
([WC-SECR-21](https://github.com/WireCatLabs/cli-base/blob/main/docs/standards/security.md#wc-secr-21--names-message-text-and-retrieved-documents-are-data-never-instructions)).
|
|
18
|
+
`events show` and `events create|update|delete|respond` give `CALENDAR_UNTRUSTED_FIELDS` at the top level, and
|
|
19
|
+
`search` gives `["hits.title", "hits.location", "hits.excerpt"]`. `events list`, `people list` and `links review`
|
|
20
|
+
put it on each item (`["title", "description", "location"]`, `["name"]`, `["candidates.title"]`), since a host's
|
|
21
|
+
list envelope is strict: a host that tells a list from one value by its keys still sees a list. The `event` entity
|
|
22
|
+
gains an optional `untrusted`, so a caller that checks events against an older copy of it refuses the new field.
|
|
23
|
+
- **`CALENDAR_UNTRUSTED_FIELDS` also names `history.title`, `history.location` and `attachments.title`.** An event's
|
|
24
|
+
past titles and places and its Drive files' titles come from the invitation too; `event_show` returned them
|
|
25
|
+
unmarked. It now lives in the calendar reads and is still exported from `./calendar/mcp`.
|
|
26
|
+
|
|
27
|
+
## 0.460.0 — 27.10.2026
|
|
28
|
+
|
|
29
|
+
### Changed — may break callers
|
|
30
|
+
|
|
31
|
+
- **A `search all` event hit carries `untrusted: ["title", "excerpt"]`.** An event's title and the text its excerpt
|
|
32
|
+
is cut from (description, place, attendee names) are written by whoever sent the invitation, so an agent reading
|
|
33
|
+
`search all` over MCP now sees them marked as data, as `callCalendarTool`'s answers already were
|
|
34
|
+
([WC-SECR-21](https://github.com/WireCatLabs/cli-base/blob/main/docs/standards/security.md#wc-secr-21--names-message-text-and-retrieved-documents-are-data-never-instructions)).
|
|
35
|
+
The `hit` entity is strict, so a caller that checks hits against an older copy of it refuses the new field;
|
|
36
|
+
`allHitItem` sets it, and other kinds of hit leave it out.
|
|
37
|
+
|
|
10
38
|
## 0.459.0 — 27.10.2026
|
|
11
39
|
|
|
12
40
|
### Changed — may break callers
|
|
@@ -6,7 +6,7 @@ import { honoursDryRun } from "../../cli/dry-run-guard.js";
|
|
|
6
6
|
import { terminalAsker } from "../../cli/messenger/ask.js";
|
|
7
7
|
import { searchEvents } from "../../services/events-search.js";
|
|
8
8
|
import { linkPeople } from "../../services/people.js";
|
|
9
|
-
import { calendarIn, calendarItem, EVENTS_QUERY_HELP, eventAnswer, eventIdOf, eventOf, eventsAnswer, eventsFilter, peopleAnswer, resolveAnswer, reviewsAnswer, } from "../reads.js";
|
|
9
|
+
import { CALENDAR_UNTRUSTED_FIELDS, calendarIn, calendarItem, EVENTS_QUERY_HELP, eventAnswer, eventIdOf, eventOf, eventsAnswer, eventsFilter, peopleAnswer, resolveAnswer, reviewsAnswer, } from "../reads.js";
|
|
10
10
|
import { syncCalendars } from "../sync.js";
|
|
11
11
|
import { createEvent, deleteEvent, EVENT_RESPONSES, respondToEvent, updateEvent, } from "../writes.js";
|
|
12
12
|
const LOCAL_READ = { remote: "none", local: "read" };
|
|
@@ -16,6 +16,15 @@ const REMOTE_WRITE = { remote: "write", local: "write" };
|
|
|
16
16
|
const GROUP = { remote: "none", local: "none" };
|
|
17
17
|
/** How many pieces one `sync --embed` embeds, as drive's. */
|
|
18
18
|
const EMBED_MAX = 600;
|
|
19
|
+
// A list's marker goes on each item: a host's list envelope is strict and `--jsonl` prints only the items.
|
|
20
|
+
const EVENT_ITEM_UNTRUSTED = ["title", "description", "location"];
|
|
21
|
+
const ATTENDEE_UNTRUSTED = ["name"];
|
|
22
|
+
const REVIEW_UNTRUSTED = ["candidates.title"];
|
|
23
|
+
const SEARCH_UNTRUSTED = ["hits.title", "hits.location", "hits.excerpt"];
|
|
24
|
+
const eachMarked = (answer, untrusted) => ({
|
|
25
|
+
...answer,
|
|
26
|
+
items: answer.items.map((item) => ({ ...item, untrusted })),
|
|
27
|
+
});
|
|
19
28
|
const integer = (text) => {
|
|
20
29
|
if (!/^[1-9]\d*$/.test(text) || !Number.isSafeInteger(Number(text)))
|
|
21
30
|
throw new InvalidArgumentError("expected a positive integer");
|
|
@@ -111,12 +120,13 @@ const addCalendarCommandsDefinition = (program, deps) => {
|
|
|
111
120
|
now: now(),
|
|
112
121
|
personOf: personId,
|
|
113
122
|
});
|
|
114
|
-
print(await eventsAnswer(deps.store, filter && { ...filter, limit: opts.limit }), command);
|
|
123
|
+
print(eachMarked(await eventsAnswer(deps.store, filter && { ...filter, limit: opts.limit }), EVENT_ITEM_UNTRUSTED), command);
|
|
115
124
|
});
|
|
116
125
|
output(example(annotate(events.command("show"), { effects: LOCAL_READ })
|
|
117
126
|
.description("one event: its calendar copies, attendees with their person, Drive files and history")
|
|
118
127
|
.argument("<event>", "the event's id, or event:<id>"), "events show event:42 --json")).action(async (reference, _opts, command) => {
|
|
119
|
-
|
|
128
|
+
const shown = await eventAnswer(await eventOf(deps.store, deps.accountId, eventIdOf(reference)), personOfEmail);
|
|
129
|
+
print({ ...shown, untrusted: CALENDAR_UNTRUSTED_FIELDS }, command);
|
|
120
130
|
});
|
|
121
131
|
output(example(annotate(program.command("search"), { effects: LOCAL_READ })
|
|
122
132
|
.description("find stored events by words, and by meaning when its model is downloaded")
|
|
@@ -126,7 +136,7 @@ const addCalendarCommandsDefinition = (program, deps) => {
|
|
|
126
136
|
.option("--exact", "every word as written, no word stems")
|
|
127
137
|
.option("--newest", "latest start first instead of best first")
|
|
128
138
|
.action(async (words, opts, command) => {
|
|
129
|
-
|
|
139
|
+
const found = await searchEvents(messages("search"), words.join(" "), {
|
|
130
140
|
accounts: [deps.account],
|
|
131
141
|
limit: opts.limit,
|
|
132
142
|
offset: opts.cursor,
|
|
@@ -134,7 +144,8 @@ const addCalendarCommandsDefinition = (program, deps) => {
|
|
|
134
144
|
command: program.name(),
|
|
135
145
|
...(opts.exact ? { exact: true } : {}),
|
|
136
146
|
...(opts.newest ? { newest: true } : {}),
|
|
137
|
-
})
|
|
147
|
+
});
|
|
148
|
+
print({ ...found, untrusted: SEARCH_UNTRUSTED }, command);
|
|
138
149
|
});
|
|
139
150
|
if (deps.writes)
|
|
140
151
|
addEventWrites(events, deps.writes, { deps, now, zone, output, print, example });
|
|
@@ -148,11 +159,12 @@ const addCalendarCommandsDefinition = (program, deps) => {
|
|
|
148
159
|
const filter = event === undefined
|
|
149
160
|
? await eventsFilter(["week"], { store: deps.store, accountId: deps.accountId, zone: zone(), now: now() })
|
|
150
161
|
: undefined;
|
|
151
|
-
|
|
162
|
+
const people = await peopleAnswer(deps.store, deps.accountId, {
|
|
152
163
|
...(event === undefined ? {} : { event }),
|
|
153
164
|
...(filter ? { filter } : {}),
|
|
154
165
|
...(personOfEmail ? { personOf: personOfEmail } : {}),
|
|
155
|
-
})
|
|
166
|
+
});
|
|
167
|
+
print(eachMarked(people, ATTENDEE_UNTRUSTED), command);
|
|
156
168
|
});
|
|
157
169
|
output(example(annotate(people.command("link"), { effects: LOCAL_WRITE })
|
|
158
170
|
.description("join an attendee to a person the owner knows elsewhere")
|
|
@@ -169,7 +181,7 @@ const addCalendarCommandsDefinition = (program, deps) => {
|
|
|
169
181
|
effects: GROUP,
|
|
170
182
|
});
|
|
171
183
|
output(example(annotate(links.command("review"), { effects: LOCAL_READ }).description("copies that fit two or more events equally well, waiting for the owner's choice"), "links review --json")).action(async (_opts, command) => {
|
|
172
|
-
print(await reviewsAnswer(deps.store), command);
|
|
184
|
+
print(eachMarked(await reviewsAnswer(deps.store), REVIEW_UNTRUSTED), command);
|
|
173
185
|
});
|
|
174
186
|
output(example(annotate(links.command("resolve"), { effects: LOCAL_WRITE })
|
|
175
187
|
.description("join a copy to the event you choose, or keep it apart")
|
|
@@ -189,6 +201,7 @@ const addEventWrites = (events, writes, { deps, now, zone, output, print, exampl
|
|
|
189
201
|
zone: zone(),
|
|
190
202
|
names: { notify: "--notify or --no-notify", id: "--id", calendar: "--calendar", series: "--series" },
|
|
191
203
|
});
|
|
204
|
+
const printWritten = (value, command) => print({ ...value, untrusted: CALENDAR_UNTRUSTED_FIELDS }, command);
|
|
192
205
|
// Left out on purpose: with other attendees the owner must choose, so neither switch is the default.
|
|
193
206
|
const notify = (command) => command
|
|
194
207
|
.option("--notify", "the provider mails the other attendees; needs events.notify allowed; this or --no-notify is required " +
|
|
@@ -222,7 +235,7 @@ const addEventWrites = (events, writes, { deps, now, zone, output, print, exampl
|
|
|
222
235
|
.argument("<calendar>", "the calendar's id, or the provider's id")).option("--id <id>", "the id a create that ended in outcome_unknown named: a retry finds that event"), "events create 3 --title 'Example planning' --start-time 2026-11-02T10:00 --end-time 2026-11-02T11:00", "events create 3 --title 'Example review' --start-date 2026-11-03 --end-date 2026-11-03 " +
|
|
223
236
|
"--attendee ana@example.com --no-notify")).action(async (calendar, opts, command) => {
|
|
224
237
|
const { notify: choice, id, ...rest } = opts;
|
|
225
|
-
|
|
238
|
+
printWritten(await createEvent(context(command), calendar, fieldsOf(rest), {
|
|
226
239
|
...(choice === undefined ? {} : { notify: choice }),
|
|
227
240
|
...(id === undefined ? {} : { id }),
|
|
228
241
|
}), command);
|
|
@@ -231,17 +244,17 @@ const addEventWrites = (events, writes, { deps, now, zone, output, print, exampl
|
|
|
231
244
|
.description("change an event; with --series every occurrence of the repeating event")
|
|
232
245
|
.option("--series", "change the whole repeating event, not only this occurrence")), "events update event:42 --start-time 2026-11-02T14:00 --end-time 2026-11-02T15:00 --notify")).action(async (reference, opts, command) => {
|
|
233
246
|
const { calendar: _calendar, series: _series, notify: _notify, ...rest } = opts;
|
|
234
|
-
|
|
247
|
+
printWritten(await updateEvent(context(command), reference, fieldsOf(rest), choicesOf(opts)), command);
|
|
235
248
|
});
|
|
236
249
|
output(example(notify(target(write("delete"))
|
|
237
250
|
.description("delete an event; a whole repeating event needs events.delete.series allowed first")
|
|
238
251
|
.option("--series", "delete the whole repeating event, not only this occurrence")), "events delete event:42 --no-notify")).action(async (reference, opts, command) => {
|
|
239
|
-
|
|
252
|
+
printWritten(await deleteEvent(context(command), reference, choicesOf(opts)), command);
|
|
240
253
|
});
|
|
241
254
|
output(example(notify(target(write("respond"))
|
|
242
255
|
.description("answer an invitation; the organiser is told only with --notify")
|
|
243
256
|
.addArgument(new Argument("<response>", "the answer").choices(EVENT_RESPONSES))), "events respond event:42 accepted --notify")).action(async (reference, response, opts, command) => {
|
|
244
|
-
|
|
257
|
+
printWritten(await respondToEvent(context(command), reference, response, choicesOf(opts)), command);
|
|
245
258
|
});
|
|
246
259
|
};
|
|
247
260
|
// honoursDryRun: a host program other than `run` would otherwise let a write through under --dry-run.
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { type FailureContext } from "@wirecat/cli-base";
|
|
2
2
|
import { type EventStore } from "../../meetings/index.js";
|
|
3
|
+
import { CALENDAR_UNTRUSTED_FIELDS } from "../reads.js";
|
|
3
4
|
import type { EventResponse } from "../writer.js";
|
|
4
5
|
import { type CalendarWrites } from "../writes.js";
|
|
5
|
-
|
|
6
|
-
export declare const CALENDAR_UNTRUSTED_FIELDS: string[];
|
|
6
|
+
export { CALENDAR_UNTRUSTED_FIELDS };
|
|
7
7
|
export declare const calendarTools: ({
|
|
8
8
|
name: string;
|
|
9
9
|
description: string;
|
|
@@ -2,18 +2,9 @@ import { CliError, errorObjectOf, mcpErrorResult } from "@wirecat/cli-base";
|
|
|
2
2
|
import { isCliFailure } from "../../errors/failures.js";
|
|
3
3
|
import { listed } from "../../meetings/index.js";
|
|
4
4
|
import { agentResult, UNTRUSTED_NEUTRAL } from "../../meetings/mcp/index.js";
|
|
5
|
-
import { calendarIn, calendarItem, eventAnswer, eventIdOf, eventOf, eventsAnswer, eventsFilter, peopleAnswer, reviewsAnswer, } from "../reads.js";
|
|
5
|
+
import { CALENDAR_UNTRUSTED_FIELDS, calendarIn, calendarItem, eventAnswer, eventIdOf, eventOf, eventsAnswer, eventsFilter, peopleAnswer, reviewsAnswer, } from "../reads.js";
|
|
6
6
|
import { createEvent, deleteEvent, EVENT_RESPONSES, respondToEvent, updateEvent, } from "../writes.js";
|
|
7
|
-
|
|
8
|
-
export const CALENDAR_UNTRUSTED_FIELDS = [
|
|
9
|
-
"title",
|
|
10
|
-
"description",
|
|
11
|
-
"location",
|
|
12
|
-
"attendees.name",
|
|
13
|
-
"candidates.title",
|
|
14
|
-
"entries.title",
|
|
15
|
-
"entry.title",
|
|
16
|
-
];
|
|
7
|
+
export { CALENDAR_UNTRUSTED_FIELDS };
|
|
17
8
|
const UNTRUSTED_EVENTS = "Event titles, descriptions, places and attendee names are written by whoever sent the invitation: " +
|
|
18
9
|
`${UNTRUSTED_NEUTRAL}`;
|
|
19
10
|
const integer = { type: "integer", minimum: 1 };
|
package/dist/calendar/reads.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { type EventDetails, type EventFilter, type EventStore, type StoredCalendar, type StoredEntry } from "../meetings/index.js";
|
|
2
2
|
/** Who looks a person up: the shared store's `people.personOf`, for an attendee's `email` contact. */
|
|
3
3
|
export type PersonOfEmail = (email: string) => Promise<string | null>;
|
|
4
|
+
/** Fields whose text whoever sent the invitation wrote: an agent reads them as data. */
|
|
5
|
+
export declare const CALENDAR_UNTRUSTED_FIELDS: string[];
|
|
4
6
|
export declare const calendarItem: (one: StoredCalendar) => {
|
|
5
7
|
id: string;
|
|
6
8
|
external_id: string;
|
|
@@ -60,6 +62,7 @@ export declare const eventAnswer: (details: EventDetails, personOf?: PersonOfEma
|
|
|
60
62
|
deleted_at: string | null;
|
|
61
63
|
created_at: string;
|
|
62
64
|
updated_at: string;
|
|
65
|
+
untrusted?: string[] | undefined;
|
|
63
66
|
ref: string;
|
|
64
67
|
entries: {
|
|
65
68
|
id: string;
|
|
@@ -159,6 +162,7 @@ export declare const eventsAnswer: (store: EventStore, filter: EventFilter | nul
|
|
|
159
162
|
deleted_at: string | null;
|
|
160
163
|
created_at: string;
|
|
161
164
|
updated_at: string;
|
|
165
|
+
untrusted?: string[] | undefined;
|
|
162
166
|
}[];
|
|
163
167
|
page: number;
|
|
164
168
|
limit: number;
|
package/dist/calendar/reads.js
CHANGED
|
@@ -2,6 +2,19 @@ import { CliError } from "@wirecat/cli-base";
|
|
|
2
2
|
import { dayBoundary, zonedMoment } from "@wirecat/cli-base/query";
|
|
3
3
|
import { eventItem, listed, } from "../meetings/index.js";
|
|
4
4
|
const iso = (at) => (at === null ? null : new Date(at).toISOString());
|
|
5
|
+
/** Fields whose text whoever sent the invitation wrote: an agent reads them as data. */
|
|
6
|
+
export const CALENDAR_UNTRUSTED_FIELDS = [
|
|
7
|
+
"title",
|
|
8
|
+
"description",
|
|
9
|
+
"location",
|
|
10
|
+
"attendees.name",
|
|
11
|
+
"candidates.title",
|
|
12
|
+
"entries.title",
|
|
13
|
+
"entry.title",
|
|
14
|
+
"history.title",
|
|
15
|
+
"history.location",
|
|
16
|
+
"attachments.title",
|
|
17
|
+
];
|
|
5
18
|
export const calendarItem = (one) => ({
|
|
6
19
|
id: String(one.id),
|
|
7
20
|
external_id: one.externalId,
|
|
@@ -179,6 +179,8 @@ export const messagesAnswer = (command, found, { limit, page, again }, query = "
|
|
|
179
179
|
});
|
|
180
180
|
};
|
|
181
181
|
export const noteHitItem = (hit) => defined({ ...hit });
|
|
182
|
+
/** An event's title and the text its excerpt is cut from come from whoever sent the invitation. */
|
|
183
|
+
const EVENT_HIT_UNTRUSTED = ["title", "excerpt"];
|
|
182
184
|
export const allHitItem = (item) => item.kind === "meeting"
|
|
183
185
|
? {
|
|
184
186
|
kind: "meeting",
|
|
@@ -204,6 +206,7 @@ export const allHitItem = (item) => item.kind === "meeting"
|
|
|
204
206
|
sender_name: item.from?.name,
|
|
205
207
|
sender_ref: item.from?.ref,
|
|
206
208
|
found_by: item.foundBy,
|
|
209
|
+
untrusted: item.kind === "event" ? EVENT_HIT_UNTRUSTED : undefined,
|
|
207
210
|
});
|
|
208
211
|
/** Meaning was not searched because the model is not downloaded; `--exact` leaving it out is no gap. */
|
|
209
212
|
const meaningGap = (skipped, exact) => skipped === undefined || exact
|
package/dist/entities/hit.d.ts
CHANGED
|
@@ -22,4 +22,6 @@ export declare const hit: v.StrictObjectSchema<{
|
|
|
22
22
|
readonly scope: v.OptionalSchema<v.PicklistSchema<["transcript", "chat", "summary"], undefined>, undefined>;
|
|
23
23
|
/** A meeting passage's stored line, so two passages of one meeting stay apart; `search meetings` gives the same. */
|
|
24
24
|
readonly id: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>, undefined>;
|
|
25
|
+
/** An event hit's fields that whoever sent the invitation wrote: an agent reads them as data. */
|
|
26
|
+
readonly untrusted: v.OptionalSchema<v.ArraySchema<v.StringSchema<undefined>, undefined>, undefined>;
|
|
25
27
|
}, undefined>;
|
package/dist/entities/hit.js
CHANGED
|
@@ -23,4 +23,6 @@ export const hit = v.strictObject({
|
|
|
23
23
|
scope: v.optional(v.picklist(["transcript", "chat", "summary"])),
|
|
24
24
|
/** A meeting passage's stored line, so two passages of one meeting stay apart; `search meetings` gives the same. */
|
|
25
25
|
id: v.optional(v.pipe(v.string(), v.minLength(1))),
|
|
26
|
+
/** An event hit's fields that whoever sent the invitation wrote: an agent reads them as data. */
|
|
27
|
+
untrusted: v.optional(v.array(text)),
|
|
26
28
|
});
|
package/dist/entities/index.d.ts
CHANGED
|
@@ -5152,6 +5152,7 @@ export declare const ENTITIES: {
|
|
|
5152
5152
|
readonly offset_ms: v.OptionalSchema<v.NullableSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>, undefined>, undefined>;
|
|
5153
5153
|
readonly scope: v.OptionalSchema<v.PicklistSchema<["transcript", "chat", "summary"], undefined>, undefined>;
|
|
5154
5154
|
readonly id: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>, undefined>;
|
|
5155
|
+
readonly untrusted: v.OptionalSchema<v.ArraySchema<v.StringSchema<undefined>, undefined>, undefined>;
|
|
5155
5156
|
}, undefined>;
|
|
5156
5157
|
readonly document: v.StrictObjectSchema<{
|
|
5157
5158
|
readonly ref: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "a reference such as `note:42`">]>;
|
|
@@ -6867,6 +6868,7 @@ export declare const ENTITIES: {
|
|
|
6867
6868
|
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>;
|
|
6868
6869
|
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`">]>;
|
|
6869
6870
|
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`">]>;
|
|
6871
|
+
readonly untrusted: v.OptionalSchema<v.ArraySchema<v.StringSchema<undefined>, undefined>, undefined>;
|
|
6870
6872
|
}, undefined>;
|
|
6871
6873
|
readonly meeting_review: v.StrictObjectSchema<{
|
|
6872
6874
|
readonly ref: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "a reference such as `note:42`">]>;
|
|
@@ -185,5 +185,7 @@ export declare const event: v.StrictObjectSchema<{
|
|
|
185
185
|
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>;
|
|
186
186
|
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`">]>;
|
|
187
187
|
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`">]>;
|
|
188
|
+
/** The fields whoever sent the invitation wrote, on a calendar CLI's `events list`: an agent reads them as data. */
|
|
189
|
+
readonly untrusted: v.OptionalSchema<v.ArraySchema<v.StringSchema<undefined>, undefined>, undefined>;
|
|
188
190
|
}, undefined>;
|
|
189
191
|
export declare const eventItem: (one: Event) => v.InferOutput<typeof event>;
|
|
@@ -200,6 +200,8 @@ export const event = v.strictObject({
|
|
|
200
200
|
deleted_at: v.nullable(isoTime),
|
|
201
201
|
created_at: isoTime,
|
|
202
202
|
updated_at: isoTime,
|
|
203
|
+
/** The fields whoever sent the invitation wrote, on a calendar CLI's `events list`: an agent reads them as data. */
|
|
204
|
+
untrusted: v.optional(v.array(text)),
|
|
203
205
|
});
|
|
204
206
|
export const eventItem = (one) => ({
|
|
205
207
|
id: String(one.id),
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wirecat/cli-core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.461.0",
|
|
4
4
|
"description": "The messenger-neutral half of a messaging CLI: domain model, message locators, rendering, name resolution, the SQLite seam, the command skeleton and shared read commands, the send guard, run records and the message store",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "Viacheslav Ptsarev",
|