@wirecat/cli-core 0.462.0 → 0.464.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 (79) hide show
  1. package/CHANGELOG.md +106 -0
  2. package/dist/background/after-upgrade.d.ts +51 -0
  3. package/dist/background/after-upgrade.js +245 -0
  4. package/dist/background/budget.d.ts +37 -0
  5. package/dist/background/budget.js +48 -0
  6. package/dist/background/index.d.ts +1 -0
  7. package/dist/background/index.js +1 -0
  8. package/dist/calendar/busy.d.ts +68 -0
  9. package/dist/calendar/busy.js +148 -0
  10. package/dist/calendar/cli/index.d.ts +7 -0
  11. package/dist/calendar/cli/index.js +94 -12
  12. package/dist/calendar/index.d.ts +3 -2
  13. package/dist/calendar/index.js +2 -1
  14. package/dist/calendar/mcp/index.d.ts +55 -13
  15. package/dist/calendar/mcp/index.js +19 -4
  16. package/dist/calendar/recurrence.d.ts +10 -0
  17. package/dist/calendar/recurrence.js +65 -0
  18. package/dist/calendar/source.d.ts +19 -0
  19. package/dist/calendar/sync.d.ts +86 -7
  20. package/dist/calendar/sync.js +271 -105
  21. package/dist/calendar/testing/source-contract.js +14 -0
  22. package/dist/calendar/testing/source.d.ts +6 -0
  23. package/dist/calendar/testing/source.js +30 -2
  24. package/dist/calendar/testing/sync-contract.d.ts +2 -1
  25. package/dist/calendar/testing/sync-contract.js +80 -5
  26. package/dist/calendar/testing/writer-contract.d.ts +2 -1
  27. package/dist/calendar/testing/writer-contract.js +46 -2
  28. package/dist/calendar/testing/writer.js +1 -1
  29. package/dist/calendar/writer.d.ts +7 -2
  30. package/dist/calendar/writes.d.ts +12 -2
  31. package/dist/calendar/writes.js +32 -6
  32. package/dist/cli/bot/mcp.js +11 -3
  33. package/dist/cli/context.d.ts +8 -0
  34. package/dist/cli/context.js +15 -0
  35. package/dist/cli/execution.d.ts +7 -0
  36. package/dist/cli/execution.js +7 -0
  37. package/dist/cli/guide.js +1 -1
  38. package/dist/cli/index.d.ts +1 -1
  39. package/dist/cli/index.js +1 -1
  40. package/dist/cli/mcp-server-command.d.ts +9 -4
  41. package/dist/cli/mcp-server-command.js +32 -25
  42. package/dist/cli/meeting-preparation-answer.d.ts +1 -0
  43. package/dist/cli/meeting-preparation-projects.d.ts +1 -0
  44. package/dist/cli/meeting-preparation-read.d.ts +1 -0
  45. package/dist/cli/messenger/chat-answers.js +1 -0
  46. package/dist/cli/messenger/mcp-command.d.ts +3 -4
  47. package/dist/cli/messenger/mcp-command.js +42 -26
  48. package/dist/cli/messenger/search-answers.js +29 -4
  49. package/dist/cli/messenger/store-maintenance-command.d.ts +1 -1
  50. package/dist/cli/program.js +15 -5
  51. package/dist/cli/upgrade-command.d.ts +7 -2
  52. package/dist/cli/upgrade-command.js +65 -9
  53. package/dist/entities/fields.d.ts +2 -0
  54. package/dist/entities/fields.js +2 -0
  55. package/dist/entities/hit.d.ts +1 -1
  56. package/dist/entities/hit.js +3 -3
  57. package/dist/entities/index.d.ts +10 -800
  58. package/dist/entities/index.js +37 -31
  59. package/dist/entities/meeting-preparation.d.ts +1 -0
  60. package/dist/entities/topic.d.ts +1 -0
  61. package/dist/entities/topic.js +2 -1
  62. package/dist/errors/reasons.js +4 -0
  63. package/dist/kit/mcp-stdio.d.ts +2 -2
  64. package/dist/kit/mcp-stdio.js +2 -2
  65. package/dist/mcp/http/activity.d.ts +1 -1
  66. package/dist/mcp/http/activity.js +1 -1
  67. package/dist/mcp/http/oauth.js +1 -1
  68. package/dist/mcp/http/state.d.ts +14 -0
  69. package/dist/mcp/http/state.js +16 -0
  70. package/dist/mcp/meeting-preparation.d.ts +1 -0
  71. package/dist/meetings/answers.d.ts +2 -0
  72. package/dist/meetings/answers.js +3 -0
  73. package/dist/meetings/mcp/search.d.ts +1 -0
  74. package/dist/meetings/project-evidence-answer.d.ts +1 -0
  75. package/dist/ports/app.d.ts +5 -0
  76. package/dist/services/package-upgrade.d.ts +9 -0
  77. package/dist/services/package-upgrade.js +8 -1
  78. package/package.json +3 -3
  79. package/parity.json +30 -22
@@ -33,7 +33,7 @@ import { document } from "./document.js";
33
33
  import { documentLink } from "./document-link.js";
34
34
  import { evidence } from "./evidence.js";
35
35
  import { fact } from "./fact.js";
36
- import { reference } from "./fields.js";
36
+ import { reference, untrusted } from "./fields.js";
37
37
  import { folder } from "./folder.js";
38
38
  import { hit } from "./hit.js";
39
39
  import { identity } from "./identity.js";
@@ -101,21 +101,24 @@ export const ENTITIES = {
101
101
  message_context: messageContext,
102
102
  message_download: messageDownload,
103
103
  message_sync: messageSync,
104
- "message.hit": v.pick(message, [
105
- "ref",
106
- "chat_title",
107
- "timestamp",
108
- "sender_name",
109
- "excerpt",
110
- "matched_in",
111
- "score",
112
- "match",
113
- "corrections",
114
- "found_in",
115
- "discovery",
116
- "context",
117
- "email",
118
- ]),
104
+ "message.hit": v.strictObject({
105
+ ...v.pick(message, [
106
+ "ref",
107
+ "chat_title",
108
+ "timestamp",
109
+ "sender_name",
110
+ "excerpt",
111
+ "matched_in",
112
+ "score",
113
+ "match",
114
+ "corrections",
115
+ "found_in",
116
+ "discovery",
117
+ "context",
118
+ "email",
119
+ ]).entries,
120
+ untrusted,
121
+ }),
119
122
  "message.summary": v.pick(message, [
120
123
  "ref",
121
124
  "chat_id",
@@ -182,21 +185,24 @@ export const ENTITIES = {
182
185
  call_record: callRecord,
183
186
  sticker_inventory: stickerInventory,
184
187
  note,
185
- "note.hit": v.pick(note, [
186
- "kind",
187
- "provider",
188
- "account",
189
- "url",
190
- "ref",
191
- "source",
192
- "folder_id",
193
- "path",
194
- "title",
195
- "updated_at",
196
- "excerpt",
197
- "found_by",
198
- "links",
199
- ]),
188
+ "note.hit": v.strictObject({
189
+ ...v.pick(note, [
190
+ "kind",
191
+ "provider",
192
+ "account",
193
+ "url",
194
+ "ref",
195
+ "source",
196
+ "folder_id",
197
+ "path",
198
+ "title",
199
+ "updated_at",
200
+ "excerpt",
201
+ "found_by",
202
+ "links",
203
+ ]).entries,
204
+ untrusted,
205
+ }),
200
206
  hit,
201
207
  document,
202
208
  document_link: documentLink,
@@ -320,6 +320,7 @@ export declare const meetingPreparation: v.StrictObjectSchema<{
320
320
  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>;
321
321
  readonly url: v.NullableSchema<v.StringSchema<undefined>, undefined>;
322
322
  }, undefined>, undefined>;
323
+ readonly untrusted: v.OptionalSchema<v.ArraySchema<v.StringSchema<undefined>, undefined>, undefined>;
323
324
  }, undefined>, undefined>;
324
325
  readonly association: v.LiteralSchema<"unconfirmed-word-evidence", undefined>;
325
326
  readonly vocabulary_fingerprint: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
@@ -10,4 +10,5 @@ export declare const topic: v.StrictObjectSchema<{
10
10
  readonly unread_count: v.NullableSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>, undefined>;
11
11
  readonly last_message_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
12
  readonly created_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>;
13
+ readonly untrusted: v.OptionalSchema<v.ArraySchema<v.StringSchema<undefined>, undefined>, undefined>;
13
14
  }, undefined>;
@@ -1,5 +1,5 @@
1
1
  import * as v from "valibot";
2
- import { count, id, text, time } from "./fields.js";
2
+ import { count, id, text, time, untrusted } from "./fields.js";
3
3
  /** A topic of a forum group; its messages carry this id as their thread. */
4
4
  export const topic = v.strictObject({
5
5
  id,
@@ -11,4 +11,5 @@ export const topic = v.strictObject({
11
11
  unread_count: v.nullable(count),
12
12
  last_message_at: v.nullable(time),
13
13
  created_at: v.nullable(time),
14
+ untrusted,
14
15
  });
@@ -56,6 +56,10 @@ const OTHERS = [
56
56
  ["sync.partial", "provider_error", "some calendars did not sync; the next sync retries them"],
57
57
  validation("event.conflict", "the event changed at the provider since the last sync; sync and try again"),
58
58
  validation("event.notify-required", "the event has other attendees; say whether to notify them"),
59
+ validation("event.repeat-invalid", "the repeat rule is outside the RFC 5545 subset the calendars take"),
60
+ validation("event.repeat-kind", "the series' rule holds a date or a time of the kind the event is leaving"),
61
+ ["busy.offline", "permission_error", "calendars busy asks the provider; --offline was given"],
62
+ validation("busy.no-calendars", "no calendar syncs and no person was named, so there is nobody to ask"),
59
63
  validation("store.refused", "the local store refused the document text"),
60
64
  ["store.not-writable", "permission_error", "the message store cannot be written from this process"],
61
65
  [
@@ -19,8 +19,8 @@ export interface McpStdio {
19
19
  close: () => Promise<number>;
20
20
  }
21
21
  /**
22
- * A CLI's `mcp` driven over its stdin and stdout, through its own `run()`, with no process and no SDK:
23
- * `start` passes the two streams to `run(["<profile>", "mcp"], { ...yourOptions, ...streams })`. It has
22
+ * A CLI's `mcp serve` driven over its stdin and stdout, through its own `run()`, with no process and no SDK:
23
+ * `start` passes the two streams to `run(["<profile>", "mcp", "serve"], { ...yourOptions, ...streams })`. It has
24
24
  * already answered `initialize` when this resolves.
25
25
  */
26
26
  export declare const mcpOverStdio: (start: (streams: McpStdioStreams) => Promise<number>, { protocolVersion }?: {
@@ -8,8 +8,8 @@ const parsedOrText = (text) => {
8
8
  }
9
9
  };
10
10
  /**
11
- * A CLI's `mcp` driven over its stdin and stdout, through its own `run()`, with no process and no SDK:
12
- * `start` passes the two streams to `run(["<profile>", "mcp"], { ...yourOptions, ...streams })`. It has
11
+ * A CLI's `mcp serve` driven over its stdin and stdout, through its own `run()`, with no process and no SDK:
12
+ * `start` passes the two streams to `run(["<profile>", "mcp", "serve"], { ...yourOptions, ...streams })`. It has
13
13
  * already answered `initialize` when this resolves.
14
14
  */
15
15
  export const mcpOverStdio = async (start, { protocolVersion = "2025-06-18" } = {}) => {
@@ -15,7 +15,7 @@ export declare const readActivity: (path: string) => Activity;
15
15
  export declare const calledTools: (body: unknown) => string[];
16
16
  /**
17
17
  * Keeps the activity file of one running server. A call is written at once, so status shows it while the owner
18
- * watches; other requests at most every two seconds. Its own file, not the token file: `mcp --revoke` rewrites that
18
+ * watches; other requests at most every two seconds. Its own file, not the token file: `mcp revoke` rewrites that
19
19
  * from another process.
20
20
  */
21
21
  export declare const activityRecorder: (path: string, now?: () => number) => {
@@ -30,7 +30,7 @@ export const calledTools = (body) => (Array.isArray(body) ? body : [body]).flatM
30
30
  });
31
31
  /**
32
32
  * Keeps the activity file of one running server. A call is written at once, so status shows it while the owner
33
- * watches; other requests at most every two seconds. Its own file, not the token file: `mcp --revoke` rewrites that
33
+ * watches; other requests at most every two seconds. Its own file, not the token file: `mcp revoke` rewrites that
34
34
  * from another process.
35
35
  */
36
36
  export const activityRecorder = (path, now = Date.now) => {
@@ -132,7 +132,7 @@ export const ownerLogin = ({ issuer, resource, file, appName, onCode, now = () =
132
132
  while (stored.clients.length > MAX_CLIENTS) {
133
133
  const idle = stored.clients.findIndex((one) => !holding.has(one.id));
134
134
  if (idle === -1)
135
- return oauthError("invalid_client_metadata", "too many logged-in apps — run mcp --revoke first");
135
+ return oauthError("invalid_client_metadata", "too many logged-in apps — run mcp revoke first");
136
136
  stored.clients.splice(idle, 1);
137
137
  }
138
138
  store.write(stored);
@@ -33,6 +33,20 @@ export declare const mcpHttpMarker: (envPrefix: string) => string;
33
33
  export declare const httpLogFile: (tokenFile: string) => string;
34
34
  /** Beside the token file, so each CLI's own layout decides both: `mcp-http/<profile>.json` → `.lock`. */
35
35
  export declare const httpLockFile: (tokenFile: string) => string;
36
+ /**
37
+ * What `mcp server start` ran, so `upgrade` can run it again on the new code with the same port, address and
38
+ * `--permission` limits. Without it a server is left running rather than restarted with fewer limits.
39
+ */
40
+ export interface HttpLaunch {
41
+ /** What a person types before `mcp`: `tg personal`. */
42
+ invocation: string;
43
+ /** The words after the CLI's entry. */
44
+ argv: string[];
45
+ /** Added to the inherited environment: the marker, and the profile for a CLI that reads it from there. */
46
+ env: Record<string, string>;
47
+ }
48
+ export declare const httpLaunchFile: (lockFile: string) => string;
49
+ export declare const readHttpLaunch: (path: string) => HttpLaunch | undefined;
36
50
  export declare const readHttpLock: (path: string) => HttpLock | undefined;
37
51
  /** The lock a serving process keeps current: taken before it listens, given up when it closes. */
38
52
  export declare const httpLock: (path: string, first: HttpLock) => {
@@ -9,6 +9,22 @@ export const mcpHttpMarker = (envPrefix) => `${envPrefix}_MCP_HTTP`;
9
9
  export const httpLogFile = (tokenFile) => `${tokenFile.replace(/\.json$/, "")}.log`;
10
10
  /** Beside the token file, so each CLI's own layout decides both: `mcp-http/<profile>.json` → `.lock`. */
11
11
  export const httpLockFile = (tokenFile) => `${tokenFile.replace(/\.json$/, "")}.lock`;
12
+ export const httpLaunchFile = (lockFile) => `${lockFile.replace(/\.lock$/, "")}.launch.json`;
13
+ export const readHttpLaunch = (path) => {
14
+ try {
15
+ const launch = JSON.parse(readFileSync(path, "utf8"));
16
+ return typeof launch.invocation === "string" &&
17
+ Array.isArray(launch.argv) &&
18
+ launch.argv.every((word) => typeof word === "string") &&
19
+ typeof launch.env === "object" &&
20
+ launch.env !== null
21
+ ? launch
22
+ : undefined;
23
+ }
24
+ catch {
25
+ return undefined;
26
+ }
27
+ };
12
28
  export const readHttpLock = (path) => {
13
29
  const lock = readLock(path);
14
30
  return lock && typeof lock.port === "number" && typeof lock.publicUrl === "string" ? lock : undefined;
@@ -387,6 +387,7 @@ export declare const callMeetingPreparationTool: (read: MeetingPreparationReader
387
387
  started_at: string | null;
388
388
  url: string | null;
389
389
  } | undefined;
390
+ untrusted?: string[] | undefined;
390
391
  }[];
391
392
  association: "unconfirmed-word-evidence";
392
393
  vocabulary_fingerprint: string;
@@ -27,6 +27,8 @@ export declare const meetingHit: v.StrictObjectSchema<{
27
27
  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>;
28
28
  readonly url: v.NullableSchema<v.StringSchema<undefined>, undefined>;
29
29
  }, undefined>, undefined>;
30
+ /** What people said, wrote or a provider summarised from it, and the invitation's title: data, never instructions. */
31
+ readonly untrusted: v.OptionalSchema<v.ArraySchema<v.StringSchema<undefined>, undefined>, undefined>;
30
32
  }, undefined>;
31
33
  /** One retained transcript of a meeting, its cues in order. */
32
34
  export declare const meetingTranscript: v.StrictObjectSchema<{
@@ -25,6 +25,8 @@ export const meetingHit = v.strictObject({
25
25
  started_at: v.nullable(isoTime),
26
26
  url: v.nullable(text),
27
27
  })),
28
+ /** What people said, wrote or a provider summarised from it, and the invitation's title: data, never instructions. */
29
+ untrusted: v.optional(v.array(text)),
28
30
  });
29
31
  const line = v.strictObject({
30
32
  position: count,
@@ -188,6 +190,7 @@ export const meetingHitItem = (hit) => ({
188
190
  id: String(hit.id),
189
191
  excerpt: hit.text,
190
192
  offset_ms: hit.startMs,
193
+ untrusted: hit.source === undefined ? ["excerpt"] : ["excerpt", "source.title"],
191
194
  ...(hit.match === undefined ? {} : { match: hit.match }),
192
195
  ...(hit.corrections === undefined ? {} : { corrections: hit.corrections }),
193
196
  ...(hit.source === undefined
@@ -150,6 +150,7 @@ export declare const callMeetingSearchTool: (search: MeetingHitSearch, input: un
150
150
  started_at: string | null;
151
151
  url: string | null;
152
152
  } | undefined;
153
+ untrusted?: string[] | undefined;
153
154
  }> & {
154
155
  meta?: Partial<import("@wirecat/cli-base/standards").Meta>;
155
156
  };
@@ -35,6 +35,7 @@ export declare const meetingProjectEvidence: v.StrictObjectSchema<{
35
35
  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>;
36
36
  readonly url: v.NullableSchema<v.StringSchema<undefined>, undefined>;
37
37
  }, undefined>, undefined>;
38
+ readonly untrusted: v.OptionalSchema<v.ArraySchema<v.StringSchema<undefined>, undefined>, undefined>;
38
39
  }, undefined>, undefined>;
39
40
  readonly association: v.LiteralSchema<"unconfirmed-word-evidence", undefined>;
40
41
  readonly vocabulary_fingerprint: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
@@ -25,6 +25,11 @@ export interface AppIdentity {
25
25
  * tg, max and wa print what they always did.
26
26
  */
27
27
  messenger?: boolean;
28
+ /**
29
+ * How long one request to the provider usually takes, in ms: a sync's budget is the deadline, less its margin,
30
+ * divided by it (`requestsFor`). 2 s when unset.
31
+ */
32
+ requestMs?: number;
28
33
  /** Error reasons and detail keys of its own — max's `max_code`, tg's `migrated_chat_id` — kept in every error it prints. */
29
34
  errors?: AppErrors;
30
35
  }
@@ -1,7 +1,12 @@
1
1
  import { type Installer } from "@wirecat/cli-base/update";
2
+ import type { McpServerRestart, StaleSessions } from "../background/after-upgrade.js";
2
3
  export interface ServerRestarts {
3
4
  restarted: readonly string[];
4
5
  left: readonly string[];
6
+ /** Profiles whose `server restart` ran out of time: their serve may still run the old code. */
7
+ timedOut?: readonly string[];
8
+ mcpServers?: readonly McpServerRestart[];
9
+ staleSessions?: StaleSessions;
5
10
  }
6
11
  export interface PackageUpgradePorts {
7
12
  installer: () => Installer;
@@ -22,6 +27,9 @@ export interface PackageUpgradeResult {
22
27
  command: string | null;
23
28
  updated: boolean;
24
29
  restarted: readonly string[];
30
+ /** Set once an install ran: the HTTP MCP servers it restarted or left, and the stdio sessions still on old code. */
31
+ mcpServers?: readonly McpServerRestart[];
32
+ staleSessions?: StaleSessions;
25
33
  installed?: string;
26
34
  /** The package manager installed an older version than `latest`. */
27
35
  heldBack?: {
@@ -33,6 +41,7 @@ export interface PackageUpgradeOutcome {
33
41
  result: PackageUpgradeResult;
34
42
  reason: "checked" | "unavailable" | "up_to_date" | "manual" | "updated" | "held_back";
35
43
  left: readonly string[];
44
+ timedOut?: readonly string[];
36
45
  }
37
46
  export declare const upgradePackage: ({ current, command, packageName, check }: {
38
47
  current: string;
@@ -47,9 +47,16 @@ export const upgradePackage = async ({ current, command, packageName, check }, p
47
47
  const restart = async (result, ports) => {
48
48
  const servers = await ports.afterUpdate?.();
49
49
  return {
50
- result: { ...result, updated: true, restarted: servers?.restarted ?? [] },
50
+ result: {
51
+ ...result,
52
+ updated: true,
53
+ restarted: servers?.restarted ?? [],
54
+ ...(servers?.mcpServers ? { mcpServers: servers.mcpServers } : {}),
55
+ ...(servers?.staleSessions ? { staleSessions: servers.staleSessions } : {}),
56
+ },
51
57
  reason: "updated",
52
58
  left: servers?.left ?? [],
59
+ ...(servers?.timedOut?.length ? { timedOut: servers.timedOut } : {}),
53
60
  };
54
61
  };
55
62
  const dayAfter = (published) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wirecat/cli-core",
3
- "version": "0.462.0",
3
+ "version": "0.464.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",
@@ -233,7 +233,7 @@
233
233
  "@types/node": "^22.20.5",
234
234
  "@types/pngjs": "6.0.5",
235
235
  "@vitest/coverage-v8": "^5.0.5",
236
- "@wirecat/cli-base": "0.63.0",
236
+ "@wirecat/cli-base": "0.64.0",
237
237
  "@wirecat/cli-core-legacy-tags": "npm:@wirecat/cli-core@0.414.0",
238
238
  "commander": "15.0.0",
239
239
  "cspell": "10.4.0",
@@ -253,7 +253,7 @@
253
253
  },
254
254
  "peerDependencies": {
255
255
  "@napi-rs/canvas": ">=0.1.69 <2",
256
- "@wirecat/cli-base": ">=0.63.0 <0.64.0",
256
+ "@wirecat/cli-base": ">=0.64.0 <0.65.0",
257
257
  "commander": ">=15"
258
258
  },
259
259
  "bin": {
package/parity.json CHANGED
@@ -789,7 +789,7 @@
789
789
  },
790
790
  "--port": {
791
791
  "value": "<port>",
792
- "meaning": "the local port behind the tunnel, for mcp --http or bot watch --public-url"
792
+ "meaning": "the local port behind the tunnel, for mcp serve --http or bot watch --public-url"
793
793
  },
794
794
  "--priority": {
795
795
  "value": "<n>",
@@ -804,7 +804,7 @@
804
804
  },
805
805
  "--public-url": {
806
806
  "value": "<url>",
807
- "meaning": "the tunnel's https address: the browser apps reach mcp --http through it, a messenger delivers to bot watch"
807
+ "meaning": "the tunnel's https address: the browser apps reach mcp serve --http through it, a messenger delivers to bot watch"
808
808
  },
809
809
  "--question": {
810
810
  "meaning": "match only questions"
@@ -861,9 +861,6 @@
861
861
  "value": "<n>",
862
862
  "meaning": "the revision you read before editing"
863
863
  },
864
- "--revoke": {
865
- "meaning": "forget every login given to a browser app over --http"
866
- },
867
864
  "--revote": {
868
865
  "meaning": "people may change their vote"
869
866
  },
@@ -1732,7 +1729,6 @@
1732
1729
  },
1733
1730
  "bot mcp": {
1734
1731
  "in": ["max", "tg"],
1735
- "options": {},
1736
1732
  "planned": {
1737
1733
  "wa": "whatsapp-cli: wa bot API, plans/2026-10-22-wa-bot-api"
1738
1734
  }
@@ -1744,6 +1740,13 @@
1744
1740
  "wa": "whatsapp-cli: wa bot API, plans/2026-10-22-wa-bot-api"
1745
1741
  }
1746
1742
  },
1743
+ "bot mcp serve": {
1744
+ "in": ["max", "tg"],
1745
+ "options": {},
1746
+ "planned": {
1747
+ "wa": "whatsapp-cli: wa bot API, plans/2026-10-22-wa-bot-api"
1748
+ }
1749
+ },
1747
1750
  "bot me": {
1748
1751
  "in": ["max", "tg"],
1749
1752
  "planned": {
@@ -3138,22 +3141,7 @@
3138
3141
  }
3139
3142
  },
3140
3143
  "mcp": {
3141
- "in": "all",
3142
- "options": {
3143
- "--http": "all",
3144
- "--permission": "all",
3145
- "--port": "all",
3146
- "--public-url": "all",
3147
- "--revoke": "all",
3148
- "--yes": {
3149
- "in": [],
3150
- "planned": {
3151
- "max": "P7",
3152
- "tg": "P7",
3153
- "wa": "P7"
3154
- }
3155
- }
3156
- }
3144
+ "in": "all"
3157
3145
  },
3158
3146
  "mcp add": {
3159
3147
  "in": "all",
@@ -3182,6 +3170,26 @@
3182
3170
  }
3183
3171
  }
3184
3172
  },
3173
+ "mcp revoke": {
3174
+ "in": "all"
3175
+ },
3176
+ "mcp serve": {
3177
+ "in": "all",
3178
+ "options": {
3179
+ "--http": "all",
3180
+ "--permission": "all",
3181
+ "--port": "all",
3182
+ "--public-url": "all",
3183
+ "--yes": {
3184
+ "in": [],
3185
+ "planned": {
3186
+ "max": "P7",
3187
+ "tg": "P7",
3188
+ "wa": "P7"
3189
+ }
3190
+ }
3191
+ }
3192
+ },
3185
3193
  "mcp server": {
3186
3194
  "in": "all"
3187
3195
  },