@mgcrea/mcp-apple-core 1.15.0 → 1.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +220 -21
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +544 -78
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -3,26 +3,6 @@ import { DatabaseSync } from "node:sqlite";
|
|
|
3
3
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
4
4
|
import { Transport } from "@modelcontextprotocol/sdk/shared/transport.js";
|
|
5
5
|
import { JSONRPCMessage } from "@modelcontextprotocol/sdk/types.js";
|
|
6
|
-
//#region src/build-info.d.ts
|
|
7
|
-
type PackageIdentity = {
|
|
8
|
-
name: string;
|
|
9
|
-
version: string;
|
|
10
|
-
};
|
|
11
|
-
type BuildInfo = PackageIdentity & {
|
|
12
|
-
gitCommit: string;
|
|
13
|
-
gitCommitDate: string;
|
|
14
|
-
};
|
|
15
|
-
/**
|
|
16
|
-
* Read a package's own name and version at startup, so they are always accurate
|
|
17
|
-
* rather than baked in at build time.
|
|
18
|
-
*
|
|
19
|
-
* Callers pass their own `new URL("../package.json", import.meta.url)`: resolving
|
|
20
|
-
* it here would find *this* package, not theirs. The git fields stay with the
|
|
21
|
-
* caller too, because `__GIT_COMMIT__` is substituted by whichever bundler build
|
|
22
|
-
* compiles the file that mentions it.
|
|
23
|
-
*/
|
|
24
|
-
declare const readPackageIdentity: (packageJsonUrl: URL, fallback: PackageIdentity) => PackageIdentity;
|
|
25
|
-
//#endregion
|
|
26
6
|
//#region src/errors.d.ts
|
|
27
7
|
/**
|
|
28
8
|
* Error taxonomy shared by every Apple-app server.
|
|
@@ -105,6 +85,119 @@ declare class ProtocolError extends AppleAutomationError {
|
|
|
105
85
|
declare class PreconditionError extends AppleAutomationError {
|
|
106
86
|
readonly name: string;
|
|
107
87
|
}
|
|
88
|
+
/**
|
|
89
|
+
* A date argument could not be read.
|
|
90
|
+
*
|
|
91
|
+
* Refusing is the whole point. The alternative — which is what Mail, Messages
|
|
92
|
+
* and Notes did — is `Date.parse` returning `NaN`, node:sqlite binding it as
|
|
93
|
+
* `NULL`, and the query matching nothing: an empty result that looks like an
|
|
94
|
+
* answer. The message lists the accepted forms because the caller is usually a
|
|
95
|
+
* model that guessed, and the fix is to show it the grammar.
|
|
96
|
+
*/
|
|
97
|
+
declare class InvalidDateError extends AppleAutomationError {
|
|
98
|
+
readonly name: string;
|
|
99
|
+
constructor(field: string, raw: string, reason: string);
|
|
100
|
+
}
|
|
101
|
+
//#endregion
|
|
102
|
+
//#region src/ax.d.ts
|
|
103
|
+
type AxCall = {
|
|
104
|
+
/** Tool name, e.g. `apple_desktop_find_elements`. */
|
|
105
|
+
readonly tool: string;
|
|
106
|
+
readonly args: Record<string, unknown>;
|
|
107
|
+
};
|
|
108
|
+
type AxChannel = {
|
|
109
|
+
/**
|
|
110
|
+
* Call one desktop tool and return its parsed JSON body.
|
|
111
|
+
*
|
|
112
|
+
* Calls are serialised. The wire is one socket carrying newline-delimited
|
|
113
|
+
* JSON-RPC, and the driver's handle store is shared mutable state on the other
|
|
114
|
+
* end, so overlapping two walks would interleave both.
|
|
115
|
+
*/
|
|
116
|
+
call(request: AxCall): Promise<unknown>;
|
|
117
|
+
close(): void;
|
|
118
|
+
};
|
|
119
|
+
/**
|
|
120
|
+
* The app is there and said no, or stopped answering.
|
|
121
|
+
*
|
|
122
|
+
* Distinct from the null `openAxChannel` returns, which means there is no app
|
|
123
|
+
* to ask — see the note there on why those two must not collapse.
|
|
124
|
+
*/
|
|
125
|
+
declare class AxChannelError extends AppleAutomationError {
|
|
126
|
+
readonly name: string;
|
|
127
|
+
constructor(surface: SurfaceContext, message: string);
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Open the channel, or return null when this server is not hosted by the app.
|
|
131
|
+
*
|
|
132
|
+
* Null and a throw are different answers and the difference is the whole
|
|
133
|
+
* contract: null means "there is no app here, use your other lane", a throw
|
|
134
|
+
* means "there is an app and it said no", which a caller must report rather
|
|
135
|
+
* than paper over.
|
|
136
|
+
*/
|
|
137
|
+
declare const openAxChannel: (surface: SurfaceContext, env?: NodeJS.ProcessEnv) => AxChannel | null;
|
|
138
|
+
/**
|
|
139
|
+
* Whether a person touched the machine while a sequence was running.
|
|
140
|
+
*
|
|
141
|
+
* Driving an interface is the one capability here that COMPETES with whoever is
|
|
142
|
+
* using the Mac: a keystroke goes to whatever is frontmost and a click goes to a
|
|
143
|
+
* screen point, so somebody typing during a paste does not slow it down, it
|
|
144
|
+
* corrupts it.
|
|
145
|
+
*
|
|
146
|
+
* The comparison is what makes this work. `secondsSinceInput` on its own cannot
|
|
147
|
+
* tell "they typed just before we started" from "they typed into the middle of
|
|
148
|
+
* it" — but a sequence that ran for five seconds and ends with two seconds since
|
|
149
|
+
* the last input knows the input landed inside it.
|
|
150
|
+
*
|
|
151
|
+
* **This exists because of a misdiagnosis, not a theory.** Two runs of the Maps
|
|
152
|
+
* lane were blamed on interference and turned out to be bugs in the lane; one
|
|
153
|
+
* was blamed on the lane and turned out to be interference. Neither could be
|
|
154
|
+
* told apart from the outside, and a failure that names the wrong cause sends
|
|
155
|
+
* the next hour in the wrong direction.
|
|
156
|
+
*/
|
|
157
|
+
type Interference = {
|
|
158
|
+
/** True when input arrived after the sequence began. */
|
|
159
|
+
disturbed: boolean;
|
|
160
|
+
secondsSinceInput: number;
|
|
161
|
+
elapsedSeconds: number;
|
|
162
|
+
};
|
|
163
|
+
type InterferenceWatch = {
|
|
164
|
+
check(): Promise<Interference | null>;
|
|
165
|
+
};
|
|
166
|
+
/**
|
|
167
|
+
* Start watching. `check()` answers for the span since this call.
|
|
168
|
+
*
|
|
169
|
+
* Returns null from `check()` when the question could not be asked at all,
|
|
170
|
+
* which is not the same as "undisturbed" and must not be reported as it.
|
|
171
|
+
*/
|
|
172
|
+
declare const watchInterference: (channel: AxChannel) => InterferenceWatch;
|
|
173
|
+
/**
|
|
174
|
+
* The sentence to append to a failure, or "" when nothing useful can be said.
|
|
175
|
+
*
|
|
176
|
+
* Deliberately says nothing when the machine was quiet: a failure that reads
|
|
177
|
+
* "nobody touched it" invites the reader to stop looking, and the point of this
|
|
178
|
+
* is to send them to the RIGHT place rather than to reassure them.
|
|
179
|
+
*/
|
|
180
|
+
declare const interferenceNote: (found: Interference | null) => string;
|
|
181
|
+
//#endregion
|
|
182
|
+
//#region src/build-info.d.ts
|
|
183
|
+
type PackageIdentity = {
|
|
184
|
+
name: string;
|
|
185
|
+
version: string;
|
|
186
|
+
};
|
|
187
|
+
type BuildInfo = PackageIdentity & {
|
|
188
|
+
gitCommit: string;
|
|
189
|
+
gitCommitDate: string;
|
|
190
|
+
};
|
|
191
|
+
/**
|
|
192
|
+
* Read a package's own name and version at startup, so they are always accurate
|
|
193
|
+
* rather than baked in at build time.
|
|
194
|
+
*
|
|
195
|
+
* Callers pass their own `new URL("../package.json", import.meta.url)`: resolving
|
|
196
|
+
* it here would find *this* package, not theirs. The git fields stay with the
|
|
197
|
+
* caller too, because `__GIT_COMMIT__` is substituted by whichever bundler build
|
|
198
|
+
* compiles the file that mentions it.
|
|
199
|
+
*/
|
|
200
|
+
declare const readPackageIdentity: (packageJsonUrl: URL, fallback: PackageIdentity) => PackageIdentity;
|
|
108
201
|
//#endregion
|
|
109
202
|
//#region src/osascript.d.ts
|
|
110
203
|
type Logger = {
|
|
@@ -309,6 +402,112 @@ declare const BaseConfigSchema: z.ZodObject<{
|
|
|
309
402
|
*/
|
|
310
403
|
declare const parseConfig: <T extends z.ZodType>(schema: T, raw: Record<string, unknown>) => z.infer<T>;
|
|
311
404
|
//#endregion
|
|
405
|
+
//#region src/dates.d.ts
|
|
406
|
+
/**
|
|
407
|
+
* The one grammar every surface reads its date arguments with.
|
|
408
|
+
*
|
|
409
|
+
* ## Why it is here
|
|
410
|
+
*
|
|
411
|
+
* This shipped as three copies. Reminders wrote it, Calendar repeated it
|
|
412
|
+
* verbatim, and Safari repeated it again with signed offsets and `yesterday`
|
|
413
|
+
* added — that third copy's header says outright that three is the trigger for
|
|
414
|
+
* hoisting and that the copies had already diverged. Meanwhile Mail, Messages
|
|
415
|
+
* and Notes never got a grammar at all: they called `Date.parse` or
|
|
416
|
+
* `new Date()` directly, which is where the bugs were.
|
|
417
|
+
*
|
|
418
|
+
* They were not small bugs, and they were all the same shape — a date argument
|
|
419
|
+
* that produced a confident, plausible, wrong answer:
|
|
420
|
+
*
|
|
421
|
+
* - `Date.parse("last week")` is `NaN`, node:sqlite binds `NaN` as `NULL`,
|
|
422
|
+
* and `date_received >= NULL` matches nothing. A model that wrote a date in
|
|
423
|
+
* words got zero results and no error.
|
|
424
|
+
* - `new Date("2026-08-20")` is UTC midnight but `new Date("2026-08-20T00:00")`
|
|
425
|
+
* is LOCAL midnight, so two spellings a tool description treated as the
|
|
426
|
+
* same thing bounded a query an hour or five apart.
|
|
427
|
+
* - `"2026-02-30T09:00"` silently became 2 March, because the rollover guard
|
|
428
|
+
* existed on the date branch and not on the date-time one.
|
|
429
|
+
*
|
|
430
|
+
* ## The rule
|
|
431
|
+
*
|
|
432
|
+
* 1. `YYYY-MM-DD` names a **local calendar day**. As a start bound it is local
|
|
433
|
+
* 00:00 of that day; as an end bound it is local 00:00 of the NEXT day, and
|
|
434
|
+
* every consumer compares with `<`. So `to: "2026-08-20"` includes all of
|
|
435
|
+
* the 20th and nothing of the 21st. Resolving it to midnight of the same day
|
|
436
|
+
* is how an end bound quietly excludes the day it names.
|
|
437
|
+
* 2. `YYYY-MM-DD[T ]HH:MM[:SS]` is local wall-clock; with `Z` or `±HH:MM` it is
|
|
438
|
+
* the instant named. A timed bound is used as given, and is exclusive at the
|
|
439
|
+
* end edge like everything else.
|
|
440
|
+
* 3. Relative forms: `±N m|h|d|w`, `today` / `yesterday` / `tomorrow` with an
|
|
441
|
+
* optional `HH:MM`, and `next|last <weekday>`. Days and weeks are calendar
|
|
442
|
+
* arithmetic; hours and minutes are elapsed time. That split is not
|
|
443
|
+
* cosmetic — reversing it drifts every bound by an hour twice a year.
|
|
444
|
+
* 4. Anything else, an empty string, or an instant that does not exist
|
|
445
|
+
* (`2026-02-30`, `T25:00`, `T09:60`) throws `InvalidDateError`. **Nothing
|
|
446
|
+
* here ever returns `NaN`**, because a `NaN` reaches SQLite as `NULL` and a
|
|
447
|
+
* `NULL` bound is an empty result rather than a complaint.
|
|
448
|
+
*
|
|
449
|
+
* The forward-only surfaces inherit the backward forms too. A reminder cannot
|
|
450
|
+
* be due `-7d`, but accepting it costs nothing and refusing it in one surface
|
|
451
|
+
* while accepting it in another is exactly the drift this file replaces.
|
|
452
|
+
*/
|
|
453
|
+
type DateKind = "allDay" | "timed";
|
|
454
|
+
type ParsedDate = {
|
|
455
|
+
kind: DateKind;
|
|
456
|
+
/** The absolute instant, for comparisons and for range bounds. */
|
|
457
|
+
at: Date;
|
|
458
|
+
/**
|
|
459
|
+
* ISO-8601 **with an explicit offset**, e.g. `2026-08-20T09:00:00+02:00`.
|
|
460
|
+
*
|
|
461
|
+
* Always carries the offset so the value is unambiguous once it leaves this
|
|
462
|
+
* process — a bare local string reinterpreted in another zone is the silent
|
|
463
|
+
* failure this module exists to prevent.
|
|
464
|
+
*/
|
|
465
|
+
iso: string;
|
|
466
|
+
/** Echoed back in tool results so a caller can see how its input was read. */
|
|
467
|
+
raw: string;
|
|
468
|
+
};
|
|
469
|
+
/**
|
|
470
|
+
* Local wall-clock time rendered with its offset.
|
|
471
|
+
*
|
|
472
|
+
* Deliberately not `toISOString()`, which converts to UTC and would report a
|
|
473
|
+
* 09:00 bound as `07:00Z` — correct as an instant, but unreadable in a tool
|
|
474
|
+
* result whose purpose is confirming what the caller asked for.
|
|
475
|
+
*/
|
|
476
|
+
declare const toLocalIso: (d: Date) => string;
|
|
477
|
+
/** Local midnight on the given calendar day. */
|
|
478
|
+
declare const startOfLocalDay: (d: Date) => Date;
|
|
479
|
+
/**
|
|
480
|
+
* The last representable instant of the given calendar day, local.
|
|
481
|
+
*
|
|
482
|
+
* Kept for surfaces that genuinely want an inclusive edge. It is NOT what an
|
|
483
|
+
* end bound resolves to — see `parseBound`.
|
|
484
|
+
*/
|
|
485
|
+
declare const endOfLocalDay: (d: Date) => Date;
|
|
486
|
+
/** Calendar-aware day arithmetic: same wall-clock time, n days later. */
|
|
487
|
+
declare const addLocalDays: (d: Date, n: number) => Date;
|
|
488
|
+
/**
|
|
489
|
+
* Parse one date argument.
|
|
490
|
+
*
|
|
491
|
+
* @param field Named in the error, so a failure says *which* argument was bad.
|
|
492
|
+
* @param raw The caller's string.
|
|
493
|
+
* @param now Injected for hermetic tests, mirroring `loadConfig(env)`.
|
|
494
|
+
*/
|
|
495
|
+
declare const parseDate: (field: string, raw: string, now?: Date) => ParsedDate;
|
|
496
|
+
/**
|
|
497
|
+
* Parse a bound for a range filter.
|
|
498
|
+
*
|
|
499
|
+
* A bare day names the WHOLE day, so which instant it resolves to depends on
|
|
500
|
+
* which edge it is. The start edge is that day's local midnight. The end edge
|
|
501
|
+
* is the NEXT day's local midnight, and every caller compares with `<` — which
|
|
502
|
+
* makes the bound exclusive and the named day fully included.
|
|
503
|
+
*
|
|
504
|
+
* The alternative, 23:59:59.999, was what two of the three copies did, and it
|
|
505
|
+
* is wrong twice: it drops the last millisecond of the day, and more to the
|
|
506
|
+
* point it invites the `<=` that then drops the whole day when somebody writes
|
|
507
|
+
* midnight instead.
|
|
508
|
+
*/
|
|
509
|
+
declare const parseBound: (field: string, raw: string, edge: "start" | "end", now?: Date) => Date;
|
|
510
|
+
//#endregion
|
|
312
511
|
//#region src/facade.d.ts
|
|
313
512
|
type LazyToolsOptions = {
|
|
314
513
|
/** Surface id as in surfaces.json, e.g. "mail". Prefixes every facade name. */
|
|
@@ -700,5 +899,5 @@ declare const limitArg: z.ZodOptional<z.ZodNumber>;
|
|
|
700
899
|
declare const resolveLimit: (limit: number | undefined, maxResults: number, fallback?: number) => number;
|
|
701
900
|
declare const confirmArg: z.ZodLiteral<true>;
|
|
702
901
|
//#endregion
|
|
703
|
-
export { type Aggregation, AppBusyError, AppNotRunningError, AppleAutomationError, BaseConfigSchema, type Bucket, type BuildInfo, CORE_DATA_EPOCH_OFFSET, type CodeConfidence, type CodeMatch, type ExecImpl, type ExtractOptions, type FileFacts, IndexUnavailableError, type JxaEnvelope, type LazyToolsOptions, type Logger, type OpenOptions, type OpenedStore, type OsascriptOptions, type OsascriptRunner, OsascriptTimeoutError, type PackageIdentity, PlatformError, PreconditionError, type Projected, type PromptContext, ProtocolError, RESOURCE_SCHEME, type ReadOnlyMode, type ResourceReader, SchemaDriftError, type StdioServerOptions, type StoreFacts, type SurfaceContext, type SurfaceResourceOptions, TccDeniedError, type ToolResult, type WorkflowPrompt, WritesDisabledError, assertStaticScript, columnsOf, compact, confirmArg, createOsascriptRunner, describeAggregation, describeStore, detectEpoch, escapeLike, extractCode, fail, fingerprintSchema, groupByArg, inspectFile, limitArg, mapOsaError, ok, okText, openReadOnly, parseBool, parseConfig, parseIntOpt, parseList, project, promptArg, readPackageIdentity, registerSurfaceResources, registerWorkflowPrompt, requiredPromptArg, resolveLimit, runStdioServer, selectArg, surfaceUri, tableMap, toFailure, toFileUri, trimToolListing, trimmed, withBusyRetry, withLazyTools, withTrimmedListing, wrap, wrapResult };
|
|
902
|
+
export { type Aggregation, AppBusyError, AppNotRunningError, AppleAutomationError, type AxCall, type AxChannel, AxChannelError, BaseConfigSchema, type Bucket, type BuildInfo, CORE_DATA_EPOCH_OFFSET, type CodeConfidence, type CodeMatch, type DateKind, type ExecImpl, type ExtractOptions, type FileFacts, IndexUnavailableError, type Interference, type InterferenceWatch, InvalidDateError, type JxaEnvelope, type LazyToolsOptions, type Logger, type OpenOptions, type OpenedStore, type OsascriptOptions, type OsascriptRunner, OsascriptTimeoutError, type PackageIdentity, type ParsedDate, PlatformError, PreconditionError, type Projected, type PromptContext, ProtocolError, RESOURCE_SCHEME, type ReadOnlyMode, type ResourceReader, SchemaDriftError, type StdioServerOptions, type StoreFacts, type SurfaceContext, type SurfaceResourceOptions, TccDeniedError, type ToolResult, type WorkflowPrompt, WritesDisabledError, addLocalDays, assertStaticScript, columnsOf, compact, confirmArg, createOsascriptRunner, describeAggregation, describeStore, detectEpoch, endOfLocalDay, escapeLike, extractCode, fail, fingerprintSchema, groupByArg, inspectFile, interferenceNote, limitArg, mapOsaError, ok, okText, openAxChannel, openReadOnly, parseBool, parseBound, parseConfig, parseDate, parseIntOpt, parseList, project, promptArg, readPackageIdentity, registerSurfaceResources, registerWorkflowPrompt, requiredPromptArg, resolveLimit, runStdioServer, selectArg, startOfLocalDay, surfaceUri, tableMap, toFailure, toFileUri, toLocalIso, trimToolListing, trimmed, watchInterference, withBusyRetry, withLazyTools, withTrimmedListing, wrap, wrapResult };
|
|
704
903
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/errors.ts","../src/ax.ts","../src/build-info.ts","../src/osascript.ts","../src/cli.ts","../src/codes.ts","../src/config.ts","../src/dates.ts","../src/facade.ts","../src/fs.ts","../src/listing.ts","../src/prompts.ts","../src/query.ts","../src/resources.ts","../src/schema.ts","../src/sqlite.ts","../src/tools.ts"],"mappings":"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"}
|