@heznpc/imcp 1.1.0 → 1.3.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 (46) hide show
  1. package/README.md +197 -212
  2. package/dist/cli/doctor.d.ts +7 -0
  3. package/dist/cli/doctor.js +135 -0
  4. package/dist/cli/doctor.js.map +1 -0
  5. package/dist/cli/init.d.ts +8 -0
  6. package/dist/cli/init.js +145 -0
  7. package/dist/cli/init.js.map +1 -0
  8. package/dist/cross/tools.d.ts +7 -0
  9. package/dist/cross/tools.js +81 -0
  10. package/dist/cross/tools.js.map +1 -0
  11. package/dist/finder/tools.js +1 -1
  12. package/dist/finder/tools.js.map +1 -1
  13. package/dist/index.js +21 -2
  14. package/dist/index.js.map +1 -1
  15. package/dist/mail/scripts.d.ts +2 -0
  16. package/dist/mail/scripts.js +42 -0
  17. package/dist/mail/scripts.js.map +1 -1
  18. package/dist/mail/tools.d.ts +1 -1
  19. package/dist/mail/tools.js +45 -4
  20. package/dist/mail/tools.js.map +1 -1
  21. package/dist/semantic/embeddings.d.ts +10 -0
  22. package/dist/semantic/embeddings.js +112 -0
  23. package/dist/semantic/embeddings.js.map +1 -0
  24. package/dist/semantic/store.d.ts +47 -0
  25. package/dist/semantic/store.js +101 -0
  26. package/dist/semantic/store.js.map +1 -0
  27. package/dist/semantic/tools.d.ts +7 -0
  28. package/dist/semantic/tools.js +287 -0
  29. package/dist/semantic/tools.js.map +1 -0
  30. package/dist/shared/config.d.ts +1 -1
  31. package/dist/shared/config.js +1 -0
  32. package/dist/shared/config.js.map +1 -1
  33. package/dist/shared/resources.d.ts +10 -1
  34. package/dist/shared/resources.js +199 -45
  35. package/dist/shared/resources.js.map +1 -1
  36. package/dist/shared/setup.js +1 -0
  37. package/dist/shared/setup.js.map +1 -1
  38. package/dist/system/tools.js +2 -2
  39. package/dist/system/tools.js.map +1 -1
  40. package/dist/tv/scripts.d.ts +6 -0
  41. package/dist/tv/scripts.js +121 -0
  42. package/dist/tv/scripts.js.map +1 -0
  43. package/dist/tv/tools.d.ts +3 -0
  44. package/dist/tv/tools.js +95 -0
  45. package/dist/tv/tools.js.map +1 -0
  46. package/package.json +1 -1
@@ -0,0 +1,112 @@
1
+ import { runSwift, checkSwiftBridge } from "../shared/swift.js";
2
+ let _provider = null;
3
+ async function detectProvider() {
4
+ if (_provider !== null)
5
+ return _provider;
6
+ if (process.env.GEMINI_API_KEY) {
7
+ _provider = "gemini";
8
+ return _provider;
9
+ }
10
+ const err = await checkSwiftBridge();
11
+ _provider = err === null ? "swift" : "none";
12
+ return _provider;
13
+ }
14
+ /** Check if any embedding backend is available. */
15
+ export async function isEmbeddingAvailable() {
16
+ return (await detectProvider()) !== "none";
17
+ }
18
+ /** Get the current embedding provider name. */
19
+ export async function getProvider() {
20
+ return detectProvider();
21
+ }
22
+ // ── Gemini Embedding API ──
23
+ const GEMINI_EMBED_URL = "https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-001:embedContent";
24
+ const GEMINI_BATCH_URL = "https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-001:batchEmbedContents";
25
+ const GEMINI_DIMENSION = 768; // good balance of quality vs storage
26
+ async function geminiEmbed(text) {
27
+ const apiKey = process.env.GEMINI_API_KEY;
28
+ const res = await fetch(`${GEMINI_EMBED_URL}?key=${apiKey}`, {
29
+ method: "POST",
30
+ headers: { "Content-Type": "application/json" },
31
+ body: JSON.stringify({
32
+ content: { parts: [{ text }] },
33
+ taskType: "SEMANTIC_SIMILARITY",
34
+ outputDimensionality: GEMINI_DIMENSION,
35
+ }),
36
+ });
37
+ if (!res.ok) {
38
+ const body = await res.text();
39
+ throw new Error(`Gemini API error ${res.status}: ${body}`);
40
+ }
41
+ const data = (await res.json());
42
+ return data.embedding.values;
43
+ }
44
+ async function geminiBatchEmbed(texts) {
45
+ const apiKey = process.env.GEMINI_API_KEY;
46
+ // Gemini batch API: max 100 per request
47
+ const chunks = [];
48
+ for (let i = 0; i < texts.length; i += 100) {
49
+ chunks.push(texts.slice(i, i + 100));
50
+ }
51
+ const allVectors = [];
52
+ for (const chunk of chunks) {
53
+ const res = await fetch(`${GEMINI_BATCH_URL}?key=${apiKey}`, {
54
+ method: "POST",
55
+ headers: { "Content-Type": "application/json" },
56
+ body: JSON.stringify({
57
+ requests: chunk.map((text) => ({
58
+ model: "models/gemini-embedding-001",
59
+ content: { parts: [{ text }] },
60
+ taskType: "SEMANTIC_SIMILARITY",
61
+ outputDimensionality: GEMINI_DIMENSION,
62
+ })),
63
+ }),
64
+ });
65
+ if (!res.ok) {
66
+ const body = await res.text();
67
+ throw new Error(`Gemini batch API error ${res.status}: ${body}`);
68
+ }
69
+ const data = (await res.json());
70
+ allVectors.push(...data.embeddings.map((e) => e.values));
71
+ }
72
+ return allVectors;
73
+ }
74
+ // ── Public API (auto-selects provider) ──
75
+ /** Embed a single text. Uses Gemini if GEMINI_API_KEY is set, otherwise Swift bridge. */
76
+ export async function embedText(text, language) {
77
+ const provider = await detectProvider();
78
+ if (provider === "gemini") {
79
+ return geminiEmbed(text);
80
+ }
81
+ if (provider === "swift") {
82
+ const result = await runSwift("embed-text", JSON.stringify({ text, language }));
83
+ return result.vector;
84
+ }
85
+ throw new Error("No embedding backend available. Set GEMINI_API_KEY or run 'npm run swift-build'.");
86
+ }
87
+ /** Embed multiple texts. Uses Gemini batch API if available, otherwise Swift bridge. */
88
+ export async function embedBatch(texts, language) {
89
+ const provider = await detectProvider();
90
+ if (provider === "gemini") {
91
+ return geminiBatchEmbed(texts);
92
+ }
93
+ if (provider === "swift") {
94
+ const result = await runSwift("embed-batch", JSON.stringify({ texts, language }));
95
+ return result.vectors;
96
+ }
97
+ throw new Error("No embedding backend available. Set GEMINI_API_KEY or run 'npm run swift-build'.");
98
+ }
99
+ /** Cosine similarity between two vectors. */
100
+ export function cosineSimilarity(a, b) {
101
+ let dot = 0;
102
+ let magA = 0;
103
+ let magB = 0;
104
+ for (let i = 0; i < a.length; i++) {
105
+ dot += a[i] * b[i];
106
+ magA += a[i] * a[i];
107
+ magB += b[i] * b[i];
108
+ }
109
+ const denom = Math.sqrt(magA) * Math.sqrt(magB);
110
+ return denom === 0 ? 0 : dot / denom;
111
+ }
112
+ //# sourceMappingURL=embeddings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../../src/semantic/embeddings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ export interface VectorEntry {
2
+ id: string;
3
+ source: string;
4
+ title: string;
5
+ text: string;
6
+ vector: number[];
7
+ updatedAt: string;
8
+ }
9
+ interface VectorStore {
10
+ version: number;
11
+ indexedAt?: string;
12
+ entries: Record<string, VectorEntry>;
13
+ }
14
+ export interface SearchResult {
15
+ id: string;
16
+ source: string;
17
+ title: string;
18
+ similarity: number;
19
+ }
20
+ /** Upsert one or more entries into the vector store. */
21
+ export declare function upsertEntries(entries: VectorEntry[]): Promise<number>;
22
+ /** Check if the index is empty or stale (older than STALE_MS). */
23
+ export declare function isIndexStale(): Promise<boolean>;
24
+ /** Remove entries by ID prefix (e.g. "note:" removes all notes). */
25
+ export declare function removeByPrefix(prefix: string): Promise<number>;
26
+ /** Search the store by cosine similarity to a query vector. */
27
+ export declare function search(store: VectorStore, queryVector: number[], opts?: {
28
+ topK?: number;
29
+ threshold?: number;
30
+ sources?: string[];
31
+ }): SearchResult[];
32
+ /** Search by query vector against the persisted store. */
33
+ export declare function searchStore(queryVector: number[], opts?: {
34
+ topK?: number;
35
+ threshold?: number;
36
+ sources?: string[];
37
+ }): Promise<SearchResult[]>;
38
+ /** Get store stats. */
39
+ export declare function getStoreStats(): Promise<{
40
+ total: number;
41
+ bySource: Record<string, number>;
42
+ indexedAt: string | null;
43
+ stale: boolean;
44
+ }>;
45
+ /** Find entry by ID. */
46
+ export declare function getEntry(id: string): Promise<VectorEntry | null>;
47
+ export {};
@@ -0,0 +1,101 @@
1
+ import { readFile, writeFile, mkdir } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { homedir } from "node:os";
4
+ import { cosineSimilarity } from "./embeddings.js";
5
+ const STALE_MS = 30 * 60 * 1000; // 30 minutes
6
+ const STORE_DIR = join(homedir(), ".imcp");
7
+ const STORE_PATH = join(STORE_DIR, "vectors.json");
8
+ let cache = null;
9
+ async function loadStore() {
10
+ if (cache)
11
+ return cache;
12
+ try {
13
+ const data = await readFile(STORE_PATH, "utf-8");
14
+ cache = JSON.parse(data);
15
+ }
16
+ catch {
17
+ cache = { version: 1, entries: {} };
18
+ }
19
+ return cache;
20
+ }
21
+ async function saveStore(store) {
22
+ await mkdir(STORE_DIR, { recursive: true });
23
+ await writeFile(STORE_PATH, JSON.stringify(store), "utf-8");
24
+ cache = store;
25
+ }
26
+ /** Upsert one or more entries into the vector store. */
27
+ export async function upsertEntries(entries) {
28
+ const store = await loadStore();
29
+ for (const entry of entries) {
30
+ store.entries[entry.id] = entry;
31
+ }
32
+ store.indexedAt = new Date().toISOString();
33
+ await saveStore(store);
34
+ return entries.length;
35
+ }
36
+ /** Check if the index is empty or stale (older than STALE_MS). */
37
+ export async function isIndexStale() {
38
+ const store = await loadStore();
39
+ if (Object.keys(store.entries).length === 0)
40
+ return true;
41
+ if (!store.indexedAt)
42
+ return true;
43
+ return Date.now() - new Date(store.indexedAt).getTime() > STALE_MS;
44
+ }
45
+ /** Remove entries by ID prefix (e.g. "note:" removes all notes). */
46
+ export async function removeByPrefix(prefix) {
47
+ const store = await loadStore();
48
+ let removed = 0;
49
+ for (const key of Object.keys(store.entries)) {
50
+ if (key.startsWith(prefix)) {
51
+ delete store.entries[key];
52
+ removed++;
53
+ }
54
+ }
55
+ if (removed > 0)
56
+ await saveStore(store);
57
+ return removed;
58
+ }
59
+ /** Search the store by cosine similarity to a query vector. */
60
+ export function search(store, queryVector, opts = {}) {
61
+ const { topK = 10, threshold = 0.5, sources } = opts;
62
+ const results = [];
63
+ for (const entry of Object.values(store.entries)) {
64
+ if (sources && !sources.includes(entry.source))
65
+ continue;
66
+ if (entry.vector.length !== queryVector.length)
67
+ continue;
68
+ const sim = cosineSimilarity(queryVector, entry.vector);
69
+ if (sim >= threshold) {
70
+ results.push({
71
+ id: entry.id,
72
+ source: entry.source,
73
+ title: entry.title,
74
+ similarity: Math.round(sim * 1000) / 1000,
75
+ });
76
+ }
77
+ }
78
+ results.sort((a, b) => b.similarity - a.similarity);
79
+ return results.slice(0, topK);
80
+ }
81
+ /** Search by query vector against the persisted store. */
82
+ export async function searchStore(queryVector, opts) {
83
+ const store = await loadStore();
84
+ return search(store, queryVector, opts);
85
+ }
86
+ /** Get store stats. */
87
+ export async function getStoreStats() {
88
+ const store = await loadStore();
89
+ const bySource = {};
90
+ for (const entry of Object.values(store.entries)) {
91
+ bySource[entry.source] = (bySource[entry.source] || 0) + 1;
92
+ }
93
+ const stale = await isIndexStale();
94
+ return { total: Object.keys(store.entries).length, bySource, indexedAt: store.indexedAt ?? null, stale };
95
+ }
96
+ /** Find entry by ID. */
97
+ export async function getEntry(id) {
98
+ const store = await loadStore();
99
+ return store.entries[id] ?? null;
100
+ }
101
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/semantic/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { ImcpConfig } from "../shared/config.js";
3
+ /**
4
+ * Semantic search tools — on-device NLContextualEmbedding via Swift bridge.
5
+ * Requires `npm run swift-build` for the Swift bridge binary.
6
+ */
7
+ export declare function registerSemanticTools(server: McpServer, config: ImcpConfig): void;
@@ -0,0 +1,287 @@
1
+ import { z } from "zod";
2
+ import { ok, err } from "../shared/result.js";
3
+ import { isModuleEnabled } from "../shared/config.js";
4
+ import { isEmbeddingAvailable, embedText, embedBatch, getProvider } from "./embeddings.js";
5
+ import { upsertEntries, searchStore, getStoreStats, getEntry, isIndexStale } from "./store.js";
6
+ import { runJxa } from "../shared/jxa.js";
7
+ import { listRemindersScript } from "../reminders/scripts.js";
8
+ /**
9
+ * Semantic search tools — on-device NLContextualEmbedding via Swift bridge.
10
+ * Requires `npm run swift-build` for the Swift bridge binary.
11
+ */
12
+ export function registerSemanticTools(server, config) {
13
+ const enabled = (mod) => isModuleEnabled(config, mod);
14
+ // ── Index: build/rebuild the vector store from Apple app data ──
15
+ server.registerTool("semantic_index", {
16
+ title: "Build Semantic Index",
17
+ description: "Index data from enabled Apple apps (Notes, Calendar, Reminders, Mail) into the local vector store " +
18
+ "for semantic search. Run this once, then use semantic_search. Requires Swift bridge (npm run swift-build).",
19
+ inputSchema: {
20
+ sources: z
21
+ .array(z.enum(["notes", "calendar", "reminders", "mail"]))
22
+ .optional()
23
+ .describe("Which sources to index. Defaults to all enabled modules."),
24
+ },
25
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false },
26
+ }, async ({ sources }) => {
27
+ if (!(await isEmbeddingAvailable())) {
28
+ return err("No embedding backend available. Set GEMINI_API_KEY or run 'npm run swift-build'.");
29
+ }
30
+ // If specific sources requested, filter enabled check per source
31
+ const enabledFilter = sources
32
+ ? (mod) => sources.includes(mod) && enabled(mod)
33
+ : enabled;
34
+ try {
35
+ const { indexed, errors } = await runIndex(enabledFilter);
36
+ if (indexed === 0) {
37
+ return err(`No items to index.${errors.length > 0 ? " Errors: " + errors.join("; ") : ""}`);
38
+ }
39
+ const stats = await getStoreStats();
40
+ return ok({
41
+ indexed,
42
+ store: stats,
43
+ ...(errors.length > 0 ? { warnings: errors } : {}),
44
+ });
45
+ }
46
+ catch (e) {
47
+ return err(`Indexing failed: ${e instanceof Error ? e.message : String(e)}`);
48
+ }
49
+ });
50
+ // ── Search: semantic search across indexed data ──
51
+ server.registerTool("semantic_search", {
52
+ title: "Semantic Search",
53
+ description: "Search across Apple app data by meaning, not just keywords. " +
54
+ "Finds related notes, events, reminders, and emails even if they use different words. " +
55
+ "Auto-indexes on first use and refreshes every 30 minutes.",
56
+ inputSchema: {
57
+ query: z.string().describe("Natural language search query"),
58
+ sources: z
59
+ .array(z.enum(["notes", "calendar", "reminders", "mail"]))
60
+ .optional()
61
+ .describe("Filter by source type"),
62
+ limit: z.number().int().min(1).max(50).optional().describe("Max results (default 10)"),
63
+ threshold: z.number().min(0).max(1).optional().describe("Minimum similarity (default 0.5)"),
64
+ },
65
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
66
+ }, async ({ query, sources, limit, threshold }) => {
67
+ if (!(await isEmbeddingAvailable())) {
68
+ return err("No embedding backend available. Set GEMINI_API_KEY or run 'npm run swift-build'.");
69
+ }
70
+ // Auto-index if store is empty or stale
71
+ await ensureIndex(enabled);
72
+ const stats = await getStoreStats();
73
+ if (stats.total === 0) {
74
+ return err("No data to search. Ensure at least one Apple app module is enabled.");
75
+ }
76
+ let queryVector;
77
+ try {
78
+ queryVector = await embedText(query);
79
+ }
80
+ catch (e) {
81
+ return err(`Failed to embed query: ${e instanceof Error ? e.message : String(e)}`);
82
+ }
83
+ const results = await searchStore(queryVector, {
84
+ topK: limit ?? 10,
85
+ threshold: threshold ?? 0.5,
86
+ sources,
87
+ });
88
+ return ok({ query, results, total: results.length, autoIndexed: stats.stale });
89
+ });
90
+ // ── Find Related: given an item, find semantically related items ──
91
+ server.registerTool("find_related", {
92
+ title: "Find Related Items",
93
+ description: "Given a note, event, reminder, or email ID, find semantically related items across all indexed Apple apps. " +
94
+ "Discovers cross-app connections (e.g., a calendar event related to notes and reminders about the same topic).",
95
+ inputSchema: {
96
+ id: z.string().describe("Item ID (as stored in the vector index)"),
97
+ limit: z.number().int().min(1).max(50).optional().describe("Max results (default 10)"),
98
+ threshold: z.number().min(0).max(1).optional().describe("Minimum similarity (default 0.6)"),
99
+ },
100
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
101
+ }, async ({ id, limit, threshold }) => {
102
+ // Auto-index if stale
103
+ await ensureIndex(enabled);
104
+ const entry = await getEntry(id);
105
+ if (!entry) {
106
+ return err(`Item not found in index: ${id}. Try running semantic_index.`);
107
+ }
108
+ const results = await searchStore(entry.vector, {
109
+ topK: (limit ?? 10) + 1, // +1 to exclude self
110
+ threshold: threshold ?? 0.6,
111
+ });
112
+ // Exclude the item itself
113
+ const filtered = results.filter((r) => r.id !== id).slice(0, limit ?? 10);
114
+ return ok({
115
+ item: { id: entry.id, source: entry.source, title: entry.title },
116
+ related: filtered,
117
+ total: filtered.length,
118
+ });
119
+ });
120
+ // ── Stats: vector store status ──
121
+ server.registerTool("semantic_status", {
122
+ title: "Semantic Index Status",
123
+ description: "Show the current state of the semantic vector index — total entries, breakdown by source.",
124
+ inputSchema: {},
125
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
126
+ }, async () => {
127
+ const available = await isEmbeddingAvailable();
128
+ const provider = await getProvider();
129
+ const stats = await getStoreStats();
130
+ return ok({ embeddingAvailable: available, provider, ...stats });
131
+ });
132
+ }
133
+ // ── Shared indexing logic ──
134
+ let _indexing = null;
135
+ async function runIndex(enabled) {
136
+ const sources = ["notes", "calendar", "reminders", "mail"].filter((m) => enabled(m));
137
+ const entries = [];
138
+ const errors = [];
139
+ for (const source of sources) {
140
+ try {
141
+ const items = await collectItems(source);
142
+ entries.push(...items);
143
+ }
144
+ catch (e) {
145
+ errors.push(`${source}: ${e instanceof Error ? e.message : String(e)}`);
146
+ }
147
+ }
148
+ if (entries.length > 0) {
149
+ const texts = entries.map((e) => e.text);
150
+ const vectors = await embedBatch(texts);
151
+ for (let i = 0; i < entries.length; i++) {
152
+ entries[i].vector = vectors[i];
153
+ }
154
+ await upsertEntries(entries);
155
+ }
156
+ return { indexed: entries.length, errors };
157
+ }
158
+ /** Auto-index if store is empty or stale. Deduplicates concurrent calls. */
159
+ async function ensureIndex(enabled) {
160
+ if (!(await isIndexStale()))
161
+ return;
162
+ if (!(await isEmbeddingAvailable()))
163
+ return;
164
+ if (!_indexing) {
165
+ _indexing = runIndex(enabled).then(() => { _indexing = null; }).catch(() => { _indexing = null; });
166
+ }
167
+ await _indexing;
168
+ }
169
+ async function collectItems(source) {
170
+ const now = new Date().toISOString();
171
+ let items;
172
+ switch (source) {
173
+ case "notes":
174
+ items = await collectNotes();
175
+ break;
176
+ case "calendar":
177
+ items = await collectCalendarEvents();
178
+ break;
179
+ case "reminders":
180
+ items = await collectReminders();
181
+ break;
182
+ case "mail":
183
+ items = await collectMail();
184
+ break;
185
+ default:
186
+ return [];
187
+ }
188
+ return items.map((item) => ({
189
+ ...item,
190
+ vector: [], // filled later by batch embed
191
+ updatedAt: now,
192
+ }));
193
+ }
194
+ async function collectNotes() {
195
+ return runJxa(`
196
+ const Notes = Application('Notes');
197
+ const names = Notes.notes.name();
198
+ const ids = Notes.notes.id();
199
+ const count = Math.min(names.length, 200);
200
+ const indices = Array.from({length: names.length}, (_, i) => i);
201
+ const modDates = Notes.notes.modificationDate();
202
+ indices.sort((a, b) => modDates[b] - modDates[a]);
203
+ const top = indices.slice(0, count);
204
+ const result = top.map(i => {
205
+ const preview = Notes.notes[i].plaintext().substring(0, 300);
206
+ return {
207
+ id: 'note:' + ids[i],
208
+ source: 'notes',
209
+ title: names[i],
210
+ text: names[i] + ' ' + preview
211
+ };
212
+ });
213
+ JSON.stringify(result);
214
+ `);
215
+ }
216
+ async function collectCalendarEvents() {
217
+ const now = new Date();
218
+ const start = new Date(now.getTime() - 30 * 86400000).toISOString(); // past 30 days
219
+ const end = new Date(now.getTime() + 30 * 86400000).toISOString(); // next 30 days
220
+ return runJxa(`
221
+ const Calendar = Application('Calendar');
222
+ const start = new Date('${start}');
223
+ const end = new Date('${end}');
224
+ const cals = Calendar.calendars();
225
+ const result = [];
226
+ for (const cal of cals) {
227
+ try {
228
+ const events = cal.events.whose({
229
+ _and: [
230
+ { startDate: { _greaterThan: start } },
231
+ { startDate: { _lessThan: end } }
232
+ ]
233
+ })();
234
+ for (const ev of events) {
235
+ try {
236
+ const summary = ev.summary();
237
+ const loc = ev.location() || '';
238
+ const desc = (ev.description() || '').substring(0, 200);
239
+ result.push({
240
+ id: 'event:' + ev.uid(),
241
+ source: 'calendar',
242
+ title: summary,
243
+ text: summary + ' ' + loc + ' ' + desc
244
+ });
245
+ } catch(e) {}
246
+ }
247
+ } catch(e) {}
248
+ }
249
+ JSON.stringify(result.slice(0, 200));
250
+ `);
251
+ }
252
+ async function collectReminders() {
253
+ const raw = await runJxa(listRemindersScript(undefined, false));
254
+ return raw.slice(0, 200).map((r) => ({
255
+ id: "reminder:" + r.id,
256
+ source: "reminders",
257
+ title: r.name,
258
+ text: r.name + (r.body ? " " + r.body : ""),
259
+ }));
260
+ }
261
+ async function collectMail() {
262
+ return runJxa(`
263
+ const Mail = Application('Mail');
264
+ const result = [];
265
+ try {
266
+ const inbox = Mail.inbox;
267
+ const msgs = inbox.messages();
268
+ const count = Math.min(msgs.length, 100);
269
+ for (let i = 0; i < count; i++) {
270
+ try {
271
+ const m = msgs[i];
272
+ const subject = m.subject();
273
+ const sender = m.sender();
274
+ const excerpt = (m.content() || '').substring(0, 200);
275
+ result.push({
276
+ id: 'mail:' + m.id(),
277
+ source: 'mail',
278
+ title: subject,
279
+ text: subject + ' ' + sender + ' ' + excerpt
280
+ });
281
+ } catch(e) {}
282
+ }
283
+ } catch(e) {}
284
+ JSON.stringify(result);
285
+ `);
286
+ }
287
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/semantic/tools.ts"],"names":[],"mappings":"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"}
@@ -5,7 +5,7 @@ export interface HitlConfig {
5
5
  timeout: number;
6
6
  socketPath: string;
7
7
  }
8
- export declare const MODULE_NAMES: readonly ["notes", "reminders", "calendar", "contacts", "mail", "messages", "music", "finder", "safari", "system", "photos", "shortcuts", "intelligence"];
8
+ export declare const MODULE_NAMES: readonly ["notes", "reminders", "calendar", "contacts", "mail", "messages", "music", "finder", "safari", "system", "photos", "shortcuts", "intelligence", "tv"];
9
9
  /** Core modules enabled by default when no config.json exists */
10
10
  export declare const STARTER_MODULES: ReadonlySet<string>;
11
11
  export type ModuleName = (typeof MODULE_NAMES)[number];
@@ -15,6 +15,7 @@ export const MODULE_NAMES = [
15
15
  "photos",
16
16
  "shortcuts",
17
17
  "intelligence",
18
+ "tv",
18
19
  ];
19
20
  /** Core modules enabled by default when no config.json exists */
20
21
  export const STARTER_MODULES = new Set([
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/shared/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/shared/config.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,14 @@
1
1
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { ImcpConfig } from "./config.js";
3
+ interface DepthConfig {
4
+ notes: number;
5
+ events: number;
6
+ reminders: number;
7
+ previewLen: number;
8
+ }
2
9
  /**
3
10
  * Register MCP resources that expose live Apple data for direct client reads.
4
11
  */
5
- export declare function registerResources(server: McpServer): void;
12
+ export declare function registerResources(server: McpServer, config?: ImcpConfig): void;
13
+ export declare function buildSnapshot(enabled: (mod: string) => boolean, depth: DepthConfig | string): Promise<string>;
14
+ export {};