@agent-native/core 0.114.5 → 0.114.7

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 (210) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +14 -0
  3. package/corpus/core/package.json +1 -1
  4. package/corpus/core/src/cli/mcp-config-writers.ts +6 -4
  5. package/corpus/core/src/cli/mcp.ts +124 -0
  6. package/corpus/core/src/cli/skills-content/help.ts +4 -3
  7. package/corpus/core/src/cli/skills-content/index.ts +1 -0
  8. package/corpus/core/src/cli/skills-content/rewind-skill.ts +52 -0
  9. package/corpus/core/src/cli/skills.ts +115 -13
  10. package/corpus/core/src/client/resources/ResourceTree.tsx +11 -5
  11. package/corpus/core/src/client/resources/ResourcesPanel.tsx +141 -18
  12. package/corpus/core/src/mcp/screen-memory-stdio.ts +1360 -104
  13. package/corpus/core/src/mcp-client/index.ts +9 -0
  14. package/corpus/core/src/mcp-client/screen-memory-local.ts +847 -13
  15. package/corpus/templates/clips/actions/apply-rewind-extension.ts +195 -0
  16. package/corpus/templates/clips/actions/delete-agent-recording-if-unpromoted.ts +64 -0
  17. package/corpus/templates/clips/actions/get-rewind-extension-request.ts +22 -0
  18. package/corpus/templates/clips/actions/get-screen-memory-status.ts +18 -2
  19. package/corpus/templates/clips/actions/list-rewind-extension-requests.ts +52 -0
  20. package/corpus/templates/clips/actions/make-recording-private-for-rewind.ts +55 -0
  21. package/corpus/templates/clips/actions/query-screen-memory-context.ts +4 -4
  22. package/corpus/templates/clips/actions/request-rewind-extension.ts +81 -0
  23. package/corpus/templates/clips/actions/update-rewind-extension-request.ts +47 -0
  24. package/corpus/templates/clips/app/components/editor/editor-layout.tsx +25 -0
  25. package/corpus/templates/clips/app/components/editor/editor-toolbar.tsx +36 -0
  26. package/corpus/templates/clips/app/components/editor/rewind-extension-dialog.tsx +338 -0
  27. package/corpus/templates/clips/app/components/editor/stitch-manager.tsx +1 -16
  28. package/corpus/templates/clips/app/components/editor/timeline.tsx +26 -0
  29. package/corpus/templates/clips/app/components/meetings/meeting-card.tsx +1 -2
  30. package/corpus/templates/clips/app/i18n/en-US.ts +18 -0
  31. package/corpus/templates/clips/app/lib/ffmpeg-export.ts +19 -12
  32. package/corpus/templates/clips/app/lib/rewind-visibility.ts +31 -0
  33. package/corpus/templates/clips/app/lib/timestamp-mapping.ts +7 -0
  34. package/corpus/templates/clips/app/lib/upload-file-client.ts +17 -0
  35. package/corpus/templates/clips/changelog/2026-07-14-rewind-keeps-recent-screen-context-local-and-turns-it-into-clips.md +6 -0
  36. package/corpus/templates/clips/changelog/2026-07-17-active-clips-keep-rewind-stable-and-settings-clear.md +12 -0
  37. package/corpus/templates/clips/changelog/2026-07-17-clicking-the-clips-icon-during-a-recording-now-opens-the-app.md +6 -0
  38. package/corpus/templates/clips/changelog/2026-07-17-default-mic-now-uses-the-mac-default-and-transcription-shares-one-capture.md +6 -0
  39. package/corpus/templates/clips/changelog/2026-07-17-full-screen-clips-finalize-even-when-screencapturekit-stop-hangs.md +6 -0
  40. package/corpus/templates/clips/changelog/2026-07-17-normal-full-screen-clips-no-longer-stop-immediately-after-th.md +6 -0
  41. package/corpus/templates/clips/changelog/2026-07-17-rewind-can-hand-one-bounded-private-clip-to-your-agent.md +12 -0
  42. package/corpus/templates/clips/changelog/2026-07-17-rewind-home-can-copy-a-local-agent-prompt.md +6 -0
  43. package/corpus/templates/clips/changelog/2026-07-17-rewind-now-has-a-calm-home-status-focused-first-run-consent-.md +6 -0
  44. package/corpus/templates/clips/changelog/2026-07-17-rewind-settings-are-smaller-clearer-and-agent-first.md +6 -0
  45. package/corpus/templates/clips/changelog/2026-07-17-the-full-clips-interface-stays-available-while-recording.md +6 -0
  46. package/corpus/templates/clips/changelog/2026-07-18-rewind-organizes-recent-work-into-local-searchable-chapters.md +8 -0
  47. package/corpus/templates/clips/changelog/2026-07-18-searchable-rewind-chapters.md +6 -0
  48. package/corpus/templates/clips/changelog/2026-07-19-rewind-backed-recordings-now-start-immediately-after-the-cou.md +6 -0
  49. package/corpus/templates/clips/changelog/2026-07-20-opening-zoom-meeting-launches-native-app.md +6 -0
  50. package/corpus/templates/clips/changelog/2026-07-20-rewind-can-set-up-your-local-agent-once-so-future-requests-w.md +6 -0
  51. package/corpus/templates/clips/desktop/package.json +1 -0
  52. package/corpus/templates/clips/desktop/scripts/sign-macos-local.ts +12 -1
  53. package/corpus/templates/clips/desktop/src/app.tsx +2478 -223
  54. package/corpus/templates/clips/desktop/src/components/ReadinessPanel.tsx +21 -1
  55. package/corpus/templates/clips/desktop/src/components/Switch.tsx +3 -0
  56. package/corpus/templates/clips/desktop/src/hooks/useMeetingTranscription.ts +156 -24
  57. package/corpus/templates/clips/desktop/src/lib/native-recording-warm.ts +6 -7
  58. package/corpus/templates/clips/desktop/src/lib/open-meeting-join-url.ts +22 -0
  59. package/corpus/templates/clips/desktop/src/lib/recorder.ts +1763 -1160
  60. package/corpus/templates/clips/desktop/src/lib/rewind-agent-prompt.ts +9 -0
  61. package/corpus/templates/clips/desktop/src/lib/rewind-recording-start.ts +20 -0
  62. package/corpus/templates/clips/desktop/src/main.tsx +3 -0
  63. package/corpus/templates/clips/desktop/src/overlays/countdown.tsx +14 -14
  64. package/corpus/templates/clips/desktop/src/overlays/meeting-notification.tsx +2 -3
  65. package/corpus/templates/clips/desktop/src/overlays/onboarding.tsx +4 -4
  66. package/corpus/templates/clips/desktop/src/overlays/preparing.tsx +13 -0
  67. package/corpus/templates/clips/desktop/src/overlays/toolbar.tsx +27 -2
  68. package/corpus/templates/clips/desktop/src/shared/config.ts +16 -0
  69. package/corpus/templates/clips/desktop/src/styles.css +956 -134
  70. package/corpus/templates/clips/desktop/src-tauri/Cargo.toml +5 -0
  71. package/corpus/templates/clips/desktop/src-tauri/build.rs +69 -1
  72. package/corpus/templates/clips/desktop/src-tauri/src/accessibility.rs +386 -12
  73. package/corpus/templates/clips/desktop/src-tauri/src/capture_audio_bus.rs +382 -0
  74. package/corpus/templates/clips/desktop/src-tauri/src/capture_graph.rs +777 -0
  75. package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +249 -22
  76. package/corpus/templates/clips/desktop/src-tauri/src/config.rs +148 -1
  77. package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +58 -4
  78. package/corpus/templates/clips/desktop/src-tauri/src/logfile.rs +13 -1
  79. package/corpus/templates/clips/desktop/src-tauri/src/native_screen/custom_capture.rs +1505 -51
  80. package/corpus/templates/clips/desktop/src-tauri/src/native_screen/live_upload.rs +124 -0
  81. package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +1006 -95
  82. package/corpus/templates/clips/desktop/src-tauri/src/rewind_capture_suspension.rs +165 -0
  83. package/corpus/templates/clips/desktop/src-tauri/src/rewind_chapters.rs +2434 -0
  84. package/corpus/templates/clips/desktop/src-tauri/src/rewind_clip.rs +1650 -0
  85. package/corpus/templates/clips/desktop/src-tauri/src/rewind_egress.rs +643 -0
  86. package/corpus/templates/clips/desktop/src-tauri/src/rewind_local_ask.rs +803 -0
  87. package/corpus/templates/clips/desktop/src-tauri/src/rewind_meeting_history.rs +595 -0
  88. package/corpus/templates/clips/desktop/src-tauri/src/screen_memory.rs +2900 -91
  89. package/corpus/templates/clips/desktop/src-tauri/src/screen_memory_ocr.rs +360 -0
  90. package/corpus/templates/clips/desktop/src-tauri/src/screen_memory_transcript.rs +408 -0
  91. package/corpus/templates/clips/desktop/src-tauri/src/shortcuts.rs +114 -33
  92. package/corpus/templates/clips/desktop/src-tauri/src/state.rs +2 -2
  93. package/corpus/templates/clips/desktop/src-tauri/src/system_audio.rs +13 -3
  94. package/corpus/templates/clips/desktop/src-tauri/src/tray.rs +4 -1
  95. package/corpus/templates/clips/desktop/src-tauri/src/util.rs +7 -13
  96. package/corpus/templates/clips/desktop/src-tauri/src/whisper_speech.rs +198 -11
  97. package/corpus/templates/clips/desktop/src-tauri/tauri.alpha.conf.json +17 -0
  98. package/corpus/templates/clips/shared/meeting-join-url.ts +0 -5
  99. package/corpus/templates/content/.agents/skills/document-editing/SKILL.md +9 -1
  100. package/corpus/templates/content/AGENTS.md +4 -1
  101. package/corpus/templates/content/actions/_content-spaces.ts +6 -1
  102. package/corpus/templates/content/actions/_database-row-batch.ts +15 -2
  103. package/corpus/templates/content/actions/_database-utils.ts +83 -15
  104. package/corpus/templates/content/actions/add-database-item.ts +3 -0
  105. package/corpus/templates/content/actions/connect-local-folder-source.ts +2 -1
  106. package/corpus/templates/content/actions/delete-content-database.ts +12 -9
  107. package/corpus/templates/content/actions/delete-database-items.ts +3 -2
  108. package/corpus/templates/content/actions/delete-document.ts +233 -6
  109. package/corpus/templates/content/actions/duplicate-database-item.ts +1 -0
  110. package/corpus/templates/content/actions/get-document.ts +4 -1
  111. package/corpus/templates/content/actions/list-content-databases.ts +1 -0
  112. package/corpus/templates/content/actions/list-documents.ts +1 -0
  113. package/corpus/templates/content/actions/list-trashed-content-databases.ts +8 -2
  114. package/corpus/templates/content/actions/list-trashed-documents.ts +50 -0
  115. package/corpus/templates/content/actions/permanently-delete-document.ts +28 -0
  116. package/corpus/templates/content/actions/pull-document.ts +15 -2
  117. package/corpus/templates/content/actions/restore-content-database.ts +48 -11
  118. package/corpus/templates/content/actions/restore-document.ts +28 -0
  119. package/corpus/templates/content/actions/search-documents.ts +2 -1
  120. package/corpus/templates/content/actions/view-screen.ts +2 -1
  121. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +149 -55
  122. package/corpus/templates/content/app/components/editor/database/GalleryView.tsx +7 -2
  123. package/corpus/templates/content/app/components/editor/database/ListView.tsx +7 -2
  124. package/corpus/templates/content/app/components/editor/database/TimelineView.tsx +3 -0
  125. package/corpus/templates/content/app/components/editor/database/sidebar.tsx +26 -5
  126. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +243 -163
  127. package/corpus/templates/content/app/components/sidebar/WorkspaceSourceMenu.tsx +154 -0
  128. package/corpus/templates/content/app/components/sidebar/select-content-space.ts +11 -0
  129. package/corpus/templates/content/app/hooks/use-content-database.ts +6 -0
  130. package/corpus/templates/content/app/hooks/use-documents.ts +57 -0
  131. package/corpus/templates/content/app/i18n-data.ts +83 -2
  132. package/corpus/templates/content/app/routes/_app.local-files.tsx +8 -1
  133. package/corpus/templates/content/changelog/2026-07-19-pages-now-move-to-a-reversible-trash-and-the-organization-pi.md +6 -0
  134. package/corpus/templates/content/changelog/2026-07-20-trash-actions-now-preserve-independent-archived-pages-enforc.md +6 -0
  135. package/corpus/templates/content/changelog/2026-07-20-workspace-toggles-now-stay-independently-open-or-closed-and-.md +6 -0
  136. package/corpus/templates/content/changelog/2026-07-20-workspaces-can-be-added-from-a-blank-workspace-or-a-connecte.md +6 -0
  137. package/corpus/templates/content/parity/matrix.md +1 -1
  138. package/corpus/templates/content/parity/matrix.ts +3 -0
  139. package/corpus/templates/content/server/db/schema.ts +2 -0
  140. package/corpus/templates/content/server/lib/public-documents.ts +8 -2
  141. package/corpus/templates/content/server/plugins/db.ts +52 -0
  142. package/corpus/templates/content/server/routes/api/document-agent-context.json.get.ts +2 -2
  143. package/corpus/templates/content/shared/api.ts +10 -0
  144. package/corpus/toolkit/CHANGELOG.md +6 -0
  145. package/corpus/toolkit/package.json +1 -1
  146. package/corpus/toolkit/src/ui/progress.tsx +3 -2
  147. package/dist/cli/mcp-config-writers.d.ts +2 -2
  148. package/dist/cli/mcp-config-writers.d.ts.map +1 -1
  149. package/dist/cli/mcp-config-writers.js +6 -6
  150. package/dist/cli/mcp-config-writers.js.map +1 -1
  151. package/dist/cli/mcp.d.ts +14 -0
  152. package/dist/cli/mcp.d.ts.map +1 -1
  153. package/dist/cli/mcp.js +79 -0
  154. package/dist/cli/mcp.js.map +1 -1
  155. package/dist/cli/skills-content/help.d.ts +1 -1
  156. package/dist/cli/skills-content/help.d.ts.map +1 -1
  157. package/dist/cli/skills-content/help.js +4 -3
  158. package/dist/cli/skills-content/help.js.map +1 -1
  159. package/dist/cli/skills-content/index.d.ts +1 -0
  160. package/dist/cli/skills-content/index.d.ts.map +1 -1
  161. package/dist/cli/skills-content/index.js +1 -0
  162. package/dist/cli/skills-content/index.js.map +1 -1
  163. package/dist/cli/skills-content/rewind-skill.d.ts +2 -0
  164. package/dist/cli/skills-content/rewind-skill.d.ts.map +1 -0
  165. package/dist/cli/skills-content/rewind-skill.js +53 -0
  166. package/dist/cli/skills-content/rewind-skill.js.map +1 -0
  167. package/dist/cli/skills.d.ts +6 -0
  168. package/dist/cli/skills.d.ts.map +1 -1
  169. package/dist/cli/skills.js +90 -14
  170. package/dist/cli/skills.js.map +1 -1
  171. package/dist/client/resources/ResourceTree.d.ts +3 -1
  172. package/dist/client/resources/ResourceTree.d.ts.map +1 -1
  173. package/dist/client/resources/ResourceTree.js +4 -4
  174. package/dist/client/resources/ResourceTree.js.map +1 -1
  175. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
  176. package/dist/client/resources/ResourcesPanel.js +55 -6
  177. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  178. package/dist/collab/routes.d.ts +1 -1
  179. package/dist/collab/struct-routes.d.ts +1 -1
  180. package/dist/mcp/screen-memory-stdio.d.ts +365 -0
  181. package/dist/mcp/screen-memory-stdio.d.ts.map +1 -1
  182. package/dist/mcp/screen-memory-stdio.js +1014 -91
  183. package/dist/mcp/screen-memory-stdio.js.map +1 -1
  184. package/dist/mcp-client/index.d.ts +1 -1
  185. package/dist/mcp-client/index.d.ts.map +1 -1
  186. package/dist/mcp-client/index.js +1 -1
  187. package/dist/mcp-client/index.js.map +1 -1
  188. package/dist/mcp-client/screen-memory-local.d.ts +90 -0
  189. package/dist/mcp-client/screen-memory-local.d.ts.map +1 -1
  190. package/dist/mcp-client/screen-memory-local.js +590 -12
  191. package/dist/mcp-client/screen-memory-local.js.map +1 -1
  192. package/dist/notifications/routes.d.ts +2 -2
  193. package/dist/observability/routes.d.ts +5 -5
  194. package/dist/progress/routes.d.ts +1 -1
  195. package/dist/provider-api/actions/provider-api.d.ts +4 -4
  196. package/dist/resources/handlers.d.ts +1 -1
  197. package/dist/secrets/routes.d.ts +9 -9
  198. package/dist/server/transcribe-voice.d.ts +1 -1
  199. package/package.json +2 -2
  200. package/src/cli/mcp-config-writers.ts +6 -4
  201. package/src/cli/mcp.ts +124 -0
  202. package/src/cli/skills-content/help.ts +4 -3
  203. package/src/cli/skills-content/index.ts +1 -0
  204. package/src/cli/skills-content/rewind-skill.ts +52 -0
  205. package/src/cli/skills.ts +115 -13
  206. package/src/client/resources/ResourceTree.tsx +11 -5
  207. package/src/client/resources/ResourcesPanel.tsx +141 -18
  208. package/src/mcp/screen-memory-stdio.ts +1360 -104
  209. package/src/mcp-client/index.ts +9 -0
  210. package/src/mcp-client/screen-memory-local.ts +847 -13
@@ -1 +1 @@
1
- {"version":3,"file":"screen-memory-stdio.js","sourceRoot":"","sources":["../../src/mcp/screen-memory-stdio.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\ninterface ScreenMemoryEvent {\n capturedAt: string;\n appName?: string | null;\n windowTitle?: string | null;\n bundleId?: string | null;\n source: string;\n}\n\ninterface ScreenMemorySegment {\n id: string;\n startedAt: string;\n endedAt: string;\n path: string;\n fileName?: string;\n mimeType: string;\n bytes: number;\n durationMs: number;\n corrupt?: boolean;\n}\n\ninterface ScreenMemoryConfig {\n enabled?: boolean;\n paused?: boolean;\n retentionHours?: number;\n maxBytes?: number;\n}\n\nexport interface RunScreenMemoryMCPStdioOptions {\n storeDir?: string;\n env?: NodeJS.ProcessEnv;\n}\n\nconst EVENTS_JSONL = \"events.jsonl\";\n\nfunction log(msg: string): void {\n process.stderr.write(`[screen-memory-mcp] ${msg}\\n`);\n}\n\nfunction defaultAppDataDir(env: NodeJS.ProcessEnv): string {\n const home = os.homedir();\n if (process.platform === \"darwin\") {\n return path.join(home, \"Library\", \"Application Support\", \"com.clips.tray\");\n }\n if (process.platform === \"win32\") {\n return path.join(\n env.APPDATA || path.join(home, \"AppData\", \"Roaming\"),\n \"com.clips.tray\",\n );\n }\n return path.join(\n env.XDG_DATA_HOME || path.join(home, \".local\", \"share\"),\n \"com.clips.tray\",\n );\n}\n\nfunction defaultStoreDir(env: NodeJS.ProcessEnv): string {\n const envDir =\n env.AGENT_NATIVE_SCREEN_MEMORY_DIR ?? env.CLIPS_SCREEN_MEMORY_DIR;\n if (envDir) return envDir;\n return path.join(defaultAppDataDir(env), \"screen-memory\");\n}\n\nfunction readJsonl<T>(file: string): T[] {\n let body = \"\";\n try {\n body = fs.readFileSync(file, \"utf-8\");\n } catch {\n return [];\n }\n return body\n .split(/\\r?\\n/)\n .filter(Boolean)\n .map((line) => {\n try {\n return JSON.parse(line) as T;\n } catch {\n return null;\n }\n })\n .filter((value): value is T => Boolean(value));\n}\n\nfunction readFeatureConfig(storeDir: string): ScreenMemoryConfig {\n const configPath = path.join(path.dirname(storeDir), \"feature-config.json\");\n try {\n const parsed = JSON.parse(fs.readFileSync(configPath, \"utf-8\")) as {\n screenMemory?: ScreenMemoryConfig;\n };\n return parsed.screenMemory ?? {};\n } catch {\n return {};\n }\n}\n\nfunction cutoffFor(minutes: number): number {\n return Date.now() - Math.max(1, Math.min(minutes, 24 * 60)) * 60_000;\n}\n\nfunction eventMatches(event: ScreenMemoryEvent, query: string): boolean {\n const needle = query.trim().toLowerCase();\n if (!needle) return true;\n return [event.appName, event.windowTitle, event.bundleId, event.source].some(\n (value) => value?.toLowerCase().includes(needle),\n );\n}\n\nfunction recentEvents(\n storeDir: string,\n args: { query?: string; minutes?: number; limit?: number },\n): ScreenMemoryEvent[] {\n const cutoff = cutoffFor(args.minutes ?? 30);\n const limit = Math.max(1, Math.min(args.limit ?? 40, 200));\n return readJsonl<ScreenMemoryEvent>(path.join(storeDir, EVENTS_JSONL))\n .filter((event) => {\n const capturedAt = Date.parse(event.capturedAt);\n return Number.isFinite(capturedAt) && capturedAt >= cutoff;\n })\n .filter((event) => eventMatches(event, args.query ?? \"\"))\n .sort((a, b) => b.capturedAt.localeCompare(a.capturedAt))\n .slice(0, limit);\n}\n\nfunction readSegments(storeDir: string): ScreenMemorySegment[] {\n let entries: string[] = [];\n try {\n entries = fs.readdirSync(storeDir);\n } catch {\n return [];\n }\n return entries\n .filter((entry) => entry.endsWith(\".json\"))\n .map((entry) => {\n try {\n return JSON.parse(\n fs.readFileSync(path.join(storeDir, entry), \"utf-8\"),\n ) as ScreenMemorySegment;\n } catch {\n return null;\n }\n })\n .filter((segment): segment is ScreenMemorySegment => Boolean(segment));\n}\n\nfunction recentSegments(\n storeDir: string,\n minutes: number,\n): ScreenMemorySegment[] {\n const cutoff = cutoffFor(minutes);\n return readSegments(storeDir)\n .filter((segment) => {\n const endedAt = Date.parse(segment.endedAt);\n return (\n Number.isFinite(endedAt) &&\n endedAt >= cutoff &&\n typeof segment.path === \"string\" &&\n fs.existsSync(segment.path) &&\n segment.corrupt !== true\n );\n })\n .sort((a, b) => b.endedAt.localeCompare(a.endedAt));\n}\n\nfunction textResult(value: unknown) {\n return {\n content: [\n {\n type: \"text\" as const,\n text:\n typeof value === \"string\" ? value : JSON.stringify(value, null, 2),\n },\n ],\n };\n}\n\nexport async function runScreenMemoryMCPStdio(\n opts: RunScreenMemoryMCPStdioOptions = {},\n): Promise<void> {\n const env = opts.env ?? process.env;\n const storeDir = opts.storeDir ?? defaultStoreDir(env);\n\n const { Server } = await import(\"@modelcontextprotocol/sdk/server/index.js\");\n const { StdioServerTransport } =\n await import(\"@modelcontextprotocol/sdk/server/stdio.js\");\n const { CallToolRequestSchema, ListToolsRequestSchema } =\n await import(\"@modelcontextprotocol/sdk/types.js\");\n\n const server = new Server(\n { name: \"clips-screen-memory\", version: \"0.1.0\" },\n { capabilities: { tools: {} } },\n );\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [\n {\n name: \"screen_memory_status\",\n description:\n \"Read local Clips Screen Memory status, retention, disk usage, and store path. Local-only.\",\n inputSchema: { type: \"object\", properties: {} },\n },\n {\n name: \"screen_memory_recent_context\",\n description:\n \"Search recent local Screen Memory app/window context. Returns timestamps, app names, window titles, and bundle ids; does not return images.\",\n inputSchema: {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n description: \"Optional case-insensitive text filter.\",\n },\n minutes: {\n type: \"number\",\n description: \"Lookback window in minutes. Defaults to 30.\",\n },\n limit: {\n type: \"number\",\n description: \"Maximum events to return. Defaults to 40.\",\n },\n },\n },\n },\n {\n name: \"screen_memory_recent_segments\",\n description:\n \"List recent local Screen Memory video segment file paths and timestamps. Use only when the user asks to inspect or export local context.\",\n inputSchema: {\n type: \"object\",\n properties: {\n minutes: {\n type: \"number\",\n description: \"Lookback window in minutes. Defaults to 30.\",\n },\n },\n },\n },\n ],\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request: any) => {\n const name = request.params?.name;\n const args = (request.params?.arguments ?? {}) as Record<string, unknown>;\n if (name === \"screen_memory_status\") {\n const config = readFeatureConfig(storeDir);\n const segments = recentSegments(storeDir, 24 * 60);\n return textResult({\n enabled: config.enabled === true,\n paused: config.paused === true,\n retentionHours: config.retentionHours ?? 24,\n maxBytes: config.maxBytes ?? 20 * 1024 * 1024 * 1024,\n segmentCount: segments.length,\n totalBytes: segments.reduce(\n (sum, segment) => sum + (segment.bytes || 0),\n 0,\n ),\n storeDir,\n });\n }\n if (name === \"screen_memory_recent_context\") {\n return textResult({\n storeDir,\n events: recentEvents(storeDir, {\n query: typeof args.query === \"string\" ? args.query : undefined,\n minutes: typeof args.minutes === \"number\" ? args.minutes : undefined,\n limit: typeof args.limit === \"number\" ? args.limit : undefined,\n }),\n });\n }\n if (name === \"screen_memory_recent_segments\") {\n const minutes = typeof args.minutes === \"number\" ? args.minutes : 30;\n return textResult({\n storeDir,\n segments: recentSegments(storeDir, minutes),\n });\n }\n throw new Error(`Unknown Screen Memory tool: ${name}`);\n });\n\n log(`Serving local Screen Memory from ${storeDir}`);\n const transport = new StdioServerTransport();\n await server.connect(transport);\n await new Promise<void>((resolve) => {\n transport.onclose = resolve;\n process.once(\"SIGINT\", resolve);\n process.once(\"SIGTERM\", resolve);\n });\n}\n"]}
1
+ {"version":3,"file":"screen-memory-stdio.js","sourceRoot":"","sources":["../../src/mcp/screen-memory-stdio.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawnSync } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nimport { queryScreenMemoryContext } from \"../mcp-client/screen-memory-local.js\";\n\ninterface ScreenMemorySegment {\n id: string;\n startedAt: string;\n endedAt: string;\n path: string;\n fileName?: string;\n mimeType: string;\n bytes: number;\n durationMs: number;\n corrupt?: boolean;\n excluded?: boolean;\n exclusionTainted?: boolean;\n tainted?: boolean;\n}\n\nexport interface ScreenMemoryChapter {\n id: string;\n /** In v2, chapter identity survives later semantic refinements. */\n revision: number;\n aliases: string[];\n startedAt: string;\n endedAt: string;\n durationMs: number;\n label: string;\n summary: string;\n keywords: string[];\n accessibilitySummary: string;\n accessibilityKeywords: string[];\n confidence: number;\n segmentRefs: Array<{ id: string; startedAt: string; endedAt: string }>;\n sceneRefs: Array<{ id: string; startedAt?: string; endedAt?: string }>;\n evidenceRefs: Array<{\n sourceType: string;\n sourceKind?: string;\n segmentId?: string;\n offsetMs?: number;\n capturedAt?: string;\n keywords?: string[];\n confidence?: number;\n }>;\n contexts: Array<{\n appName?: string;\n windowTitle?: string;\n bundleId?: string;\n }>;\n representativeMoments: Array<{\n momentId: string;\n capturedAt: string;\n segmentId: string;\n offsetMs: number;\n reason: string;\n }>;\n representativeCoverage?:\n | string\n | { coveredScenes: number; totalScenes: number; truncated: boolean };\n ambiguityReasons: string[];\n indexState: \"pending\" | \"partial\" | \"ready\";\n}\n\nexport interface ScreenMemoryChaptersDocument {\n schemaVersion: 1 | 2;\n generatedAt: string;\n state: string;\n coverage: unknown;\n chapters: ScreenMemoryChapter[];\n}\n\nexport interface ScreenMemoryFrameDecoder {\n (segmentPath: string, offsetMs: number): Buffer;\n}\n\ninterface ScreenMemoryConfig {\n enabled?: boolean;\n paused?: boolean;\n retentionHours?: number;\n maxBytes?: number;\n reviewBeforeSending?: boolean;\n agentClipRetention?: \"forever\" | \"24-hours\" | \"7-days\" | \"30-days\";\n}\n\nexport interface RunScreenMemoryMCPStdioOptions {\n storeDir?: string;\n env?: NodeJS.ProcessEnv;\n /** Test seam; production uses the local ffmpeg executable. */\n decodeFrame?: ScreenMemoryFrameDecoder;\n}\n\nconst MAX_CHAPTERS = 12;\nconst MAX_FRAME_BYTES = 900_000;\nconst MAX_FRAME_EDGE = 1280;\nconst SEARCH_STOP_WORDS = new Set([\n \"and\",\n \"for\",\n \"from\",\n \"that\",\n \"the\",\n \"this\",\n \"was\",\n \"were\",\n \"what\",\n \"when\",\n \"with\",\n \"work\",\n \"working\",\n]);\n\nfunction log(msg: string): void {\n process.stderr.write(`[screen-memory-mcp] ${msg}\\n`);\n}\n\nfunction defaultAppDataDir(env: NodeJS.ProcessEnv): string {\n const home = os.homedir();\n if (process.platform === \"darwin\") {\n return path.join(home, \"Library\", \"Application Support\", \"com.clips.tray\");\n }\n if (process.platform === \"win32\") {\n return path.join(\n env.APPDATA || path.join(home, \"AppData\", \"Roaming\"),\n \"com.clips.tray\",\n );\n }\n return path.join(\n env.XDG_DATA_HOME || path.join(home, \".local\", \"share\"),\n \"com.clips.tray\",\n );\n}\n\nfunction defaultStoreDir(env: NodeJS.ProcessEnv): string {\n const envDir =\n env.AGENT_NATIVE_SCREEN_MEMORY_DIR ?? env.CLIPS_SCREEN_MEMORY_DIR;\n if (envDir) return envDir;\n return path.join(defaultAppDataDir(env), \"screen-memory\");\n}\n\nfunction readFeatureConfig(storeDir: string): ScreenMemoryConfig {\n const configPath = path.join(path.dirname(storeDir), \"feature-config.json\");\n try {\n const parsed = JSON.parse(fs.readFileSync(configPath, \"utf-8\")) as {\n screenMemory?: ScreenMemoryConfig;\n };\n return parsed.screenMemory ?? {};\n } catch {\n return {};\n }\n}\n\nfunction cutoffFor(minutes: number): number {\n return Date.now() - Math.max(1, Math.min(minutes, 24 * 60)) * 60_000;\n}\n\nfunction readSegments(storeDir: string): ScreenMemorySegment[] {\n let entries: string[] = [];\n try {\n entries = fs.readdirSync(storeDir);\n } catch {\n return [];\n }\n return entries\n .filter((entry) => entry.endsWith(\".json\"))\n .map((entry) => {\n try {\n return JSON.parse(\n fs.readFileSync(path.join(storeDir, entry), \"utf-8\"),\n ) as ScreenMemorySegment;\n } catch {\n return null;\n }\n })\n .filter((segment): segment is ScreenMemorySegment => Boolean(segment));\n}\n\nfunction isTimestamp(value: unknown): value is string {\n return typeof value === \"string\" && Number.isFinite(Date.parse(value));\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction cleanText(value: unknown, fallback = \"\"): string {\n return typeof value === \"string\" ? value.trim().slice(0, 2_000) : fallback;\n}\n\nfunction cleanKeywords(value: unknown, limit = 12): string[] {\n return Array.isArray(value)\n ? value\n .filter((item): item is string => typeof item === \"string\")\n .map((item) => cleanText(item).slice(0, 80))\n .filter(Boolean)\n .slice(0, limit)\n : [];\n}\n\nfunction parseChapter(value: unknown): ScreenMemoryChapter | null {\n if (\n !isRecord(value) ||\n !isTimestamp(value.startedAt) ||\n !isTimestamp(value.endedAt)\n )\n return null;\n const id = cleanText(value.id);\n if (!id) return null;\n const indexState = value.indexState;\n if (\n indexState !== \"pending\" &&\n indexState !== \"partial\" &&\n indexState !== \"ready\"\n )\n return null;\n const segmentRefs = Array.isArray(value.segmentRefs)\n ? value.segmentRefs.flatMap((ref) =>\n isRecord(ref) &&\n cleanText(ref.id) &&\n isTimestamp(ref.startedAt) &&\n isTimestamp(ref.endedAt)\n ? [\n {\n id: cleanText(ref.id),\n startedAt: ref.startedAt,\n endedAt: ref.endedAt,\n },\n ]\n : [],\n )\n : [];\n const evidenceRefs = Array.isArray(value.evidenceRefs)\n ? value.evidenceRefs.flatMap((ref) =>\n isRecord(ref) && cleanText(ref.sourceType)\n ? [\n {\n sourceType: cleanText(ref.sourceType),\n ...(cleanText(ref.sourceKind)\n ? { sourceKind: cleanText(ref.sourceKind) }\n : {}),\n ...(cleanText(ref.segmentId)\n ? { segmentId: cleanText(ref.segmentId) }\n : {}),\n ...(typeof ref.offsetMs === \"number\" &&\n Number.isFinite(ref.offsetMs)\n ? { offsetMs: ref.offsetMs }\n : {}),\n ...(isTimestamp(ref.capturedAt)\n ? { capturedAt: ref.capturedAt }\n : {}),\n ...(cleanKeywords(ref.keywords, 64).length\n ? { keywords: cleanKeywords(ref.keywords, 64) }\n : {}),\n ...(typeof ref.confidence === \"number\" &&\n Number.isFinite(ref.confidence)\n ? { confidence: Math.max(0, Math.min(1, ref.confidence)) }\n : {}),\n },\n ]\n : [],\n )\n : [];\n const sceneRefs = Array.isArray(value.sceneRefs)\n ? value.sceneRefs.flatMap((ref) =>\n typeof ref === \"string\" && cleanText(ref)\n ? [{ id: cleanText(ref) }]\n : isRecord(ref) && cleanText(ref.id)\n ? [\n {\n id: cleanText(ref.id),\n ...(isTimestamp(ref.startedAt)\n ? { startedAt: ref.startedAt }\n : {}),\n ...(isTimestamp(ref.endedAt) ? { endedAt: ref.endedAt } : {}),\n },\n ]\n : [],\n )\n : [];\n const representativeCoverage = isRecord(value.representativeCoverage)\n ? typeof value.representativeCoverage.coveredScenes === \"number\" &&\n Number.isFinite(value.representativeCoverage.coveredScenes) &&\n typeof value.representativeCoverage.totalScenes === \"number\" &&\n Number.isFinite(value.representativeCoverage.totalScenes) &&\n typeof value.representativeCoverage.truncated === \"boolean\"\n ? {\n coveredScenes: Math.max(\n 0,\n Math.trunc(value.representativeCoverage.coveredScenes),\n ),\n totalScenes: Math.max(\n 0,\n Math.trunc(value.representativeCoverage.totalScenes),\n ),\n truncated: value.representativeCoverage.truncated,\n }\n : undefined\n : cleanText(value.representativeCoverage) || undefined;\n const contexts = Array.isArray(value.contexts)\n ? value.contexts.flatMap((context) =>\n isRecord(context)\n ? [\n {\n ...(cleanText(context.appName)\n ? { appName: cleanText(context.appName) }\n : {}),\n ...(cleanText(context.windowTitle)\n ? { windowTitle: cleanText(context.windowTitle) }\n : {}),\n ...(cleanText(context.bundleId)\n ? { bundleId: cleanText(context.bundleId) }\n : {}),\n },\n ]\n : [],\n )\n : [];\n const representativeMoments = Array.isArray(value.representativeMoments)\n ? value.representativeMoments.flatMap((moment) =>\n isRecord(moment) &&\n cleanText(moment.momentId) &&\n isTimestamp(moment.capturedAt) &&\n cleanText(moment.segmentId) &&\n typeof moment.offsetMs === \"number\" &&\n Number.isFinite(moment.offsetMs)\n ? [\n {\n momentId: cleanText(moment.momentId),\n capturedAt: moment.capturedAt,\n segmentId: cleanText(moment.segmentId),\n offsetMs: moment.offsetMs,\n reason: cleanText(moment.reason),\n },\n ]\n : [],\n )\n : [];\n return {\n id,\n revision:\n typeof value.revision === \"number\" &&\n Number.isInteger(value.revision) &&\n value.revision >= 0\n ? value.revision\n : 1,\n aliases: cleanKeywords(value.aliases, 24),\n startedAt: value.startedAt,\n endedAt: value.endedAt,\n durationMs:\n typeof value.durationMs === \"number\" && Number.isFinite(value.durationMs)\n ? value.durationMs\n : Date.parse(value.endedAt) - Date.parse(value.startedAt),\n label: cleanText(value.label, \"Untitled work chapter\"),\n summary: cleanText(value.summary),\n keywords: cleanKeywords(value.keywords),\n accessibilitySummary: cleanText(value.accessibilitySummary),\n accessibilityKeywords: cleanKeywords(value.accessibilityKeywords),\n confidence:\n typeof value.confidence === \"number\" && Number.isFinite(value.confidence)\n ? Math.max(0, Math.min(1, value.confidence))\n : 0,\n segmentRefs,\n sceneRefs,\n evidenceRefs,\n contexts,\n representativeMoments,\n ...(representativeCoverage ? { representativeCoverage } : {}),\n ambiguityReasons: Array.isArray(value.ambiguityReasons)\n ? value.ambiguityReasons\n .filter((item): item is string => typeof item === \"string\")\n .map((item) => item.slice(0, 500))\n .slice(0, 8)\n : [],\n indexState,\n };\n}\n\n/** Reads only the native, retention-bound chapter manifest; malformed rows never escape. */\nexport function readScreenMemoryChapters(\n storeDir: string,\n): ScreenMemoryChaptersDocument | null {\n try {\n const raw: unknown = JSON.parse(\n fs.readFileSync(path.join(storeDir, \"chapters.json\"), \"utf8\"),\n );\n if (\n !isRecord(raw) ||\n (raw.schemaVersion !== 1 && raw.schemaVersion !== 2) ||\n !isTimestamp(raw.generatedAt) ||\n typeof raw.state !== \"string\" ||\n !Array.isArray(raw.chapters)\n )\n return null;\n const chapters = raw.chapters\n .map(parseChapter)\n .filter((chapter): chapter is ScreenMemoryChapter => Boolean(chapter));\n if (chapters.length !== raw.chapters.length) return null;\n return {\n schemaVersion: raw.schemaVersion,\n generatedAt: raw.generatedAt,\n state: raw.state,\n coverage: raw.coverage ?? null,\n chapters,\n };\n } catch {\n return null;\n }\n}\n\ntype MatchProvenance = {\n sourceType: string;\n sourceKind?: string;\n confidence?: number;\n matchedTerms: string[];\n};\n\nfunction textIncludes(value: string, term: string): boolean {\n return value.toLowerCase().includes(term);\n}\n\nfunction isMicrophoneEvidence(\n ref: ScreenMemoryChapter[\"evidenceRefs\"][number],\n) {\n return /microphone|mic/.test(\n `${ref.sourceType} ${ref.sourceKind ?? \"\"}`.toLowerCase(),\n );\n}\n\nfunction isStrongScreenEvidence(\n ref: ScreenMemoryChapter[\"evidenceRefs\"][number],\n) {\n return /accessibility|ocr|visible|screen|visual/.test(\n `${ref.sourceType} ${ref.sourceKind ?? \"\"}`.toLowerCase(),\n );\n}\n\nexport function searchScreenMemoryChapters(\n document: ScreenMemoryChaptersDocument,\n query: string,\n limit = 5,\n clientHint?: string,\n): Array<\n ScreenMemoryChapter & {\n score: number;\n matchReasons: string[];\n matchProvenance: MatchProvenance[];\n }\n> {\n const terms = (\n query.toLowerCase().match(/[\\p{L}\\p{N}_-]{2,}/gu) ?? []\n ).filter((term) => !SEARCH_STOP_WORDS.has(term));\n const exactPhrase = query.trim().toLowerCase();\n const hint = clientHint?.toLowerCase().slice(0, 500) ?? \"\";\n return document.chapters\n .map((chapter) => {\n const strongText = [\n chapter.label,\n chapter.summary,\n ...chapter.keywords,\n chapter.accessibilitySummary,\n ...chapter.accessibilityKeywords,\n ]\n .filter(Boolean)\n .join(\" \");\n const contextText = chapter.contexts\n .flatMap((context) => [\n context.appName,\n context.windowTitle,\n context.bundleId,\n ])\n .filter(Boolean)\n .join(\" \");\n const strongMatched = terms.filter((term) =>\n textIncludes(strongText, term),\n );\n const contextMatched = terms.filter((term) =>\n textIncludes(contextText, term),\n );\n const evidenceMatches = chapter.evidenceRefs.flatMap((ref) => {\n const matchedTerms = terms.filter((term) =>\n (ref.keywords ?? []).some((keyword) => textIncludes(keyword, term)),\n );\n return matchedTerms.length ? [{ ref, matchedTerms }] : [];\n });\n const corroboratedTerms = new Set([\n ...strongMatched,\n ...evidenceMatches\n .filter(({ ref }) => isStrongScreenEvidence(ref))\n .flatMap(({ matchedTerms }) => matchedTerms),\n ]);\n const evidenceScore = evidenceMatches.reduce(\n (sum, { ref, matchedTerms }) => {\n const sourceWeight = isStrongScreenEvidence(ref)\n ? 1.5\n : isMicrophoneEvidence(ref)\n ? matchedTerms.filter((term) => corroboratedTerms.has(term))\n .length\n ? 0.12\n : 0\n : /transcript/.test(\n `${ref.sourceType} ${ref.sourceKind ?? \"\"}`.toLowerCase(),\n )\n ? 0.3\n : 0.5;\n return (\n sum + sourceWeight * matchedTerms.length * (ref.confidence ?? 1)\n );\n },\n 0,\n );\n const exactStrong =\n exactPhrase.length >= 2 && textIncludes(strongText, exactPhrase);\n const exactEvidence = chapter.evidenceRefs.some(\n (ref) =>\n isStrongScreenEvidence(ref) &&\n (ref.keywords ?? []).some((keyword) =>\n textIncludes(keyword, exactPhrase),\n ),\n );\n const semanticScore = terms.length\n ? (strongMatched.length * 1.2 +\n contextMatched.length * 0.2 +\n evidenceScore) /\n terms.length +\n (exactStrong || exactEvidence ? 2 : 0)\n : 0;\n // A hint may only settle an otherwise close semantic result; it cannot make a non-match win.\n const hintScore =\n semanticScore > 0 &&\n hint &&\n (textIncludes(strongText, hint) || textIncludes(contextText, hint))\n ? 0.03\n : 0;\n const score = semanticScore + hintScore + chapter.confidence * 0.001;\n return {\n ...chapter,\n score,\n semanticScore,\n matchReasons: [\n ...(exactStrong || exactEvidence\n ? [\n `exact phrase \\\"${exactPhrase}\\\" matched visible or accessibility evidence`,\n ]\n : []),\n ...strongMatched.map(\n (term) =>\n `matched \\\"${term}\\\" in chapter or accessibility evidence`,\n ),\n ...contextMatched.map(\n (term) => `matched \\\"${term}\\\" in app or document context`,\n ),\n ...evidenceMatches.flatMap(({ ref, matchedTerms }) =>\n matchedTerms.map((term) =>\n isMicrophoneEvidence(ref) && !corroboratedTerms.has(term)\n ? `ignored uncorroborated microphone match \\\"${term}\\\"`\n : `matched \\\"${term}\\\" in ${ref.sourceType}${ref.sourceKind ? `/${ref.sourceKind}` : \"\"} evidence`,\n ),\n ),\n ...(hintScore ? [\"client hint weakly broke a close tie\"] : []),\n ],\n matchProvenance: evidenceMatches.map(({ ref, matchedTerms }) => ({\n sourceType: ref.sourceType,\n ...(ref.sourceKind ? { sourceKind: ref.sourceKind } : {}),\n ...(typeof ref.confidence === \"number\"\n ? { confidence: ref.confidence }\n : {}),\n matchedTerms,\n })),\n };\n })\n .filter((chapter) => chapter.semanticScore > 0)\n .sort((a, b) => b.score - a.score || b.endedAt.localeCompare(a.endedAt))\n .slice(0, Math.min(Math.max(Math.trunc(limit), 1), MAX_CHAPTERS))\n .map(({ semanticScore: _semanticScore, ...chapter }) => chapter);\n}\n\nexport function projectScreenMemoryChapterCandidate(\n chapter: ReturnType<typeof searchScreenMemoryChapters>[number],\n) {\n const evidenceSources = [\n ...new Set(\n chapter.evidenceRefs.map(\n (reference) =>\n `${reference.sourceType}${reference.sourceKind ? `/${reference.sourceKind}` : \"\"}`,\n ),\n ),\n ].slice(0, 8);\n return {\n id: chapter.id,\n revision: chapter.revision,\n aliases: chapter.aliases.slice(0, 8),\n startedAt: chapter.startedAt,\n endedAt: chapter.endedAt,\n durationMs: chapter.durationMs,\n label: redactCredentialText(chapter.label),\n summary: redactCredentialText(chapter.summary),\n keywords: chapter.keywords.slice(0, 8),\n confidence: chapter.confidence,\n sceneCount: chapter.sceneRefs.length,\n evidenceSources,\n contexts: chapter.contexts.slice(0, 6),\n representativeMoments: chapter.representativeMoments\n .slice(0, 8)\n .map(({ momentId, capturedAt, reason }) => ({\n momentId,\n capturedAt,\n reason,\n })),\n representativeCoverage: chapter.representativeCoverage,\n ambiguityReasons: chapter.ambiguityReasons.slice(0, 8),\n indexState: chapter.indexState,\n score: chapter.score,\n matchReasons: chapter.matchReasons.slice(0, 8),\n matchProvenance: chapter.matchProvenance.slice(0, 6),\n };\n}\n\nfunction decodeFrameWithFfmpeg(segmentPath: string, offsetMs: number): Buffer {\n const result = spawnSync(\n \"ffmpeg\",\n [\n \"-v\",\n \"error\",\n \"-ss\",\n (Math.max(0, offsetMs) / 1000).toFixed(3),\n \"-i\",\n segmentPath,\n \"-frames:v\",\n \"1\",\n \"-vf\",\n `scale='min(${MAX_FRAME_EDGE},iw)':-2`,\n \"-f\",\n \"image2pipe\",\n \"-vcodec\",\n \"mjpeg\",\n \"pipe:1\",\n ],\n { encoding: null, maxBuffer: MAX_FRAME_BYTES + 1 },\n );\n if (result.error || result.status !== 0 || !result.stdout?.length)\n throw new Error(\n \"Local frame decoding is unavailable because ffmpeg could not decode this retained segment.\",\n );\n if (result.stdout.length > MAX_FRAME_BYTES)\n throw new Error(\"The decoded frame exceeded the local byte cap.\");\n return result.stdout;\n}\n\nfunction retainedSegmentAt(\n storeDir: string,\n timestamp: string,\n): ScreenMemorySegment {\n const target = Date.parse(timestamp);\n if (!Number.isFinite(target))\n throw new Error(\"timestamp must be a valid RFC3339 timestamp.\");\n if (target > Date.now() + 5_000)\n throw new Error(\"A Rewind frame cannot be requested from the future.\");\n const segment = readSegments(storeDir).find(\n (candidate) =>\n Date.parse(candidate.startedAt) <= target &&\n target <= Date.parse(candidate.endedAt),\n );\n if (!segment)\n throw new Error(\n \"No clean retained Rewind segment covers that timestamp (it may be outside retention or in a coverage gap).\",\n );\n if (!segment.path || !fs.existsSync(segment.path))\n throw new Error(\"That Rewind segment is no longer retained locally.\");\n let storeRoot: string;\n let canonicalSegmentPath: string;\n try {\n storeRoot = fs.realpathSync(storeDir);\n canonicalSegmentPath = fs.realpathSync(segment.path);\n } catch {\n throw new Error(\"That Rewind segment is no longer retained locally.\");\n }\n const relative = path.relative(storeRoot, canonicalSegmentPath);\n if (\n path.isAbsolute(relative) ||\n relative === \"..\" ||\n relative.startsWith(`..${path.sep}`) ||\n !fs.statSync(canonicalSegmentPath).isFile()\n ) {\n throw new Error(\"That Rewind segment is outside the local memory store.\");\n }\n if (segment.corrupt)\n throw new Error(\n \"That Rewind segment is corrupt and cannot provide a frame.\",\n );\n if (segment.excluded || segment.exclusionTainted || segment.tainted)\n throw new Error(\n \"That Rewind interval was excluded from capture and cannot provide a frame.\",\n );\n return { ...segment, path: canonicalSegmentPath };\n}\n\nfunction frameContent(\n segment: ScreenMemorySegment,\n timestamp: string,\n decoder: ScreenMemoryFrameDecoder,\n) {\n const offsetMs = Date.parse(timestamp) - Date.parse(segment.startedAt);\n const bytes = decoder(segment.path, offsetMs);\n if (bytes.length > MAX_FRAME_BYTES)\n throw new Error(\"The decoded frame exceeded the local byte cap.\");\n return {\n timestamp: new Date(Date.parse(segment.startedAt) + offsetMs).toISOString(),\n segmentId: segment.id,\n image: {\n type: \"image\" as const,\n data: bytes.toString(\"base64\"),\n mimeType: \"image/jpeg\",\n },\n };\n}\n\nexport function readScreenMemoryFrame(\n storeDir: string,\n timestamp: string,\n decoder: ScreenMemoryFrameDecoder = decodeFrameWithFfmpeg,\n) {\n return frameContent(\n retainedSegmentAt(storeDir, timestamp),\n timestamp,\n decoder,\n );\n}\n\nexport function selectContactSheetTimestamps(\n startAt: string,\n endAt: string,\n count: number,\n representative: string[] = [],\n): string[] {\n const started = Date.parse(startAt);\n const duration = Date.parse(endAt) - started;\n const representatives = [\n ...new Set(\n representative\n .filter(isTimestamp)\n .filter(\n (timestamp) =>\n Date.parse(timestamp) >= started &&\n Date.parse(timestamp) <= started + duration,\n ),\n ),\n ];\n // Reserve one slot for temporal coverage whenever possible: a contact sheet\n // should not become a cluster of favorite frames with no sense of the span.\n const preferred = representatives.slice(0, Math.max(0, count - 1));\n const even = Array.from({ length: count }, (_, index) =>\n new Date(started + (duration * (index + 0.5)) / count).toISOString(),\n );\n const selected = [...preferred];\n while (selected.length < count) {\n const next = even\n .filter((timestamp) => !selected.includes(timestamp))\n .sort((a, b) => {\n const distance = (timestamp: string) =>\n Math.min(\n ...selected.map((chosen) =>\n Math.abs(Date.parse(timestamp) - Date.parse(chosen)),\n ),\n Number.POSITIVE_INFINITY,\n );\n return distance(b) - distance(a);\n })[0];\n if (!next) break;\n selected.push(next);\n }\n return selected;\n}\n\nexport function contactSheetRangeIsValid(\n durationMs: number,\n usesChapterMoments: boolean,\n): boolean {\n return durationMs >= 0 && (usesChapterMoments || durationMs <= 5 * 60_000);\n}\n\nfunction recentSegments(\n storeDir: string,\n minutes: number,\n): ScreenMemorySegment[] {\n const cutoff = cutoffFor(minutes);\n return readSegments(storeDir)\n .filter((segment) => {\n const endedAt = Date.parse(segment.endedAt);\n return (\n Number.isFinite(endedAt) &&\n endedAt >= cutoff &&\n typeof segment.path === \"string\" &&\n fs.existsSync(segment.path) &&\n segment.corrupt !== true\n );\n })\n .sort((a, b) => b.endedAt.localeCompare(a.endedAt));\n}\n\nfunction textResult(value: unknown) {\n return {\n content: [\n {\n type: \"text\" as const,\n text:\n typeof value === \"string\" ? value : JSON.stringify(value, null, 2),\n },\n ],\n };\n}\n\nexport function redactCredentialText(value: string): string {\n return value\n .replace(\n /\\b(?:sk-[A-Za-z0-9_-]{12,}|gh[pousr]_[A-Za-z0-9]{12,}|AKIA[A-Z0-9]{16})\\b/g,\n \"[REDACTED CREDENTIAL]\",\n )\n .replace(/\\bBearer\\s+[A-Za-z0-9._~+\\/-]{8,}/gi, \"Bearer [REDACTED]\")\n .replace(\n /\\b(api[_-]?key|access[_-]?token|password|secret)\\s*[:=]\\s*([^\\s,;]{4,})/gi,\n \"$1=[REDACTED]\",\n );\n}\n\nconst sanitizedEgressStores = new Set<string>();\n\nfunction sanitizeLegacyEgressLog(storeDir: string): void {\n if (sanitizedEgressStores.has(storeDir)) return;\n sanitizedEgressStores.add(storeDir);\n const logPath = path.join(storeDir, \"egress.jsonl\");\n if (!fs.existsSync(logPath)) return;\n const sanitized = fs\n .readFileSync(logPath, \"utf-8\")\n .split(\"\\n\")\n .filter(Boolean)\n .flatMap((line) => {\n try {\n const event = JSON.parse(line) as Record<string, unknown>;\n const packet = event.packet as\n | { evidence?: Array<Record<string, unknown>> }\n | null\n | undefined;\n if (!event.receipt && Array.isArray(packet?.evidence)) {\n event.receipt = {\n evidence: packet.evidence.map((evidence) => ({\n id: evidence.id,\n momentId: evidence.momentId,\n sourceType: evidence.sourceType,\n capturedAt: evidence.capturedAt ?? null,\n })),\n };\n }\n delete event.packet;\n delete event.reason;\n event.packetBytes =\n typeof event.packetBytes === \"number\" ? event.packetBytes : 0;\n return [JSON.stringify(event)];\n } catch {\n // A malformed audit row cannot provide reliable provenance. Dropping it\n // also prevents arbitrary stale text from surviving this migration.\n return [];\n }\n });\n const temporaryPath = `${logPath}.sanitize-${process.pid}`;\n fs.writeFileSync(\n temporaryPath,\n sanitized.length > 0 ? `${sanitized.join(\"\\n\")}\\n` : \"\",\n { encoding: \"utf-8\", mode: 0o600 },\n );\n fs.renameSync(temporaryPath, logPath);\n fs.chmodSync(logPath, 0o600);\n}\n\nfunction appendEgressEvent(storeDir: string, event: Record<string, unknown>) {\n fs.mkdirSync(storeDir, { recursive: true });\n fs.chmodSync(storeDir, 0o700);\n sanitizeLegacyEgressLog(storeDir);\n fs.appendFileSync(\n path.join(storeDir, \"egress.jsonl\"),\n `${JSON.stringify(event)}\\n`,\n { encoding: \"utf-8\", mode: 0o600 },\n );\n fs.chmodSync(path.join(storeDir, \"egress.jsonl\"), 0o600);\n}\n\ntype EgressEvidenceReference = {\n id: string;\n momentId: string;\n sourceType: string;\n capturedAt: string | null;\n};\n\n/**\n * Records that bounded evidence was returned without preserving its text.\n * The originating Screen Memory interval remains the only durable home for\n * transcripts and chapter summaries.\n */\nfunction appendEgressReceipt(\n storeDir: string,\n requestId: string,\n operation: string,\n evidence: EgressEvidenceReference[],\n): void {\n const occurredAt = new Date().toISOString();\n const receipt = {\n evidence: evidence.map(({ id, momentId, sourceType, capturedAt }) => ({\n id,\n momentId,\n sourceType,\n capturedAt,\n })),\n };\n appendEgressEvent(storeDir, {\n requestId,\n occurredAt,\n state: \"prepared\",\n operation,\n receipt,\n evidenceCount: receipt.evidence.length,\n packetBytes: 0,\n error: null,\n });\n appendEgressEvent(storeDir, {\n requestId,\n occurredAt: new Date().toISOString(),\n state: \"completed\",\n operation,\n receipt: null,\n evidenceCount: receipt.evidence.length,\n packetBytes: 0,\n error: null,\n });\n}\n\nexport function appendLocalEvidenceReceipt(\n storeDir: string,\n operation: string,\n evidence: Array<{ timestamp: string; segmentId: string }>,\n): void {\n appendEgressEvent(storeDir, {\n requestId: `local-${operation}-${Date.now()}-${process.pid}`,\n occurredAt: new Date().toISOString(),\n state: \"local-evidence-read\",\n operation,\n receipt: {\n frames: evidence.map(({ timestamp, segmentId }) => ({\n timestamp,\n segmentId,\n })),\n },\n evidenceCount: evidence.length,\n packetBytes: 0,\n error: null,\n });\n}\n\nfunction handoffDir(storeDir: string): string {\n return path.join(storeDir, \"agent-handoffs\");\n}\n\nfunction handoffPath(storeDir: string, requestId: string): string {\n const safeId = requestId.replace(/[^a-zA-Z0-9_-]/g, \"\");\n if (!safeId || safeId !== requestId)\n throw new Error(\"Invalid handoff request ID.\");\n return path.join(handoffDir(storeDir), `${safeId}.json`);\n}\n\nfunction writePrivateJson(file: string, value: unknown): void {\n fs.mkdirSync(path.dirname(file), { recursive: true, mode: 0o700 });\n fs.writeFileSync(file, `${JSON.stringify(value, null, 2)}\\n`, {\n encoding: \"utf-8\",\n mode: 0o600,\n });\n fs.chmodSync(file, 0o600);\n}\n\nfunction parseHandoffRange(args: Record<string, unknown>) {\n if (typeof args.startAt !== \"string\" || typeof args.endAt !== \"string\") {\n throw new Error(\"startAt and endAt must be RFC3339 timestamps.\");\n }\n const startAt = new Date(args.startAt);\n const endAt = new Date(args.endAt);\n if (\n !Number.isFinite(startAt.getTime()) ||\n !Number.isFinite(endAt.getTime())\n ) {\n throw new Error(\"startAt and endAt must be valid RFC3339 timestamps.\");\n }\n const durationMs = endAt.getTime() - startAt.getTime();\n if (durationMs < 1_000 || durationMs > 5 * 60_000) {\n throw new Error(\n \"A Rewind Clip handoff must be between one second and five minutes.\",\n );\n }\n if (endAt.getTime() > Date.now() + 5_000) {\n throw new Error(\"A Rewind Clip handoff cannot include future time.\");\n }\n return {\n startAt: startAt.toISOString(),\n endAt: endAt.toISOString(),\n durationMs,\n };\n}\n\nexport function screenMemoryMcpToolDefinitions() {\n return [\n {\n name: \"screen_memory_status\",\n description:\n \"Read local Clips Screen Memory status, retention, disk usage, and connection health without exposing archive paths.\",\n inputSchema: { type: \"object\", properties: {} },\n },\n {\n name: \"screen_memory_recent_context\",\n description:\n \"Search bounded local Screen Memory evidence. Returns coverage, explicit gaps, typed app-context/OCR/transcript evidence when local files contain it, and no media bytes or images.\",\n inputSchema: {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n description: \"Optional case-insensitive text filter.\",\n },\n minutes: {\n type: \"number\",\n description: \"Lookback window in minutes. Defaults to 30.\",\n },\n limit: {\n type: \"number\",\n description: \"Maximum evidence items to return. Defaults to 40.\",\n },\n },\n },\n },\n {\n name: \"screen_memory_recent_segments\",\n description:\n \"List recent local Screen Memory segment references and timestamps. Media paths and bytes stay behind Clips' bounded private Clip handoff boundary.\",\n inputSchema: {\n type: \"object\",\n properties: {\n minutes: {\n type: \"number\",\n description: \"Lookback window in minutes. Defaults to 30.\",\n },\n },\n },\n },\n {\n name: \"screen_memory_search_chapters\",\n description:\n \"Search locally generated, retention-bound Rewind work chapters. Returns bounded scored candidates, coverage and ambiguity for the connected agent; never archive paths or media bytes.\",\n inputSchema: {\n type: \"object\",\n required: [\"query\"],\n properties: {\n query: {\n type: \"string\",\n description:\n \"Question or topic to match against local chapter labels, summaries, context, and evidence types.\",\n },\n minutes: {\n type: \"number\",\n description: \"Optional recent-window cap, up to 24 hours.\",\n },\n limit: {\n type: \"number\",\n description: \"Maximum candidates, up to 12.\",\n },\n clientHint: {\n type: \"string\",\n description:\n \"Optional weak tie-breaker such as project or working directory; cannot hide a stronger semantic match.\",\n },\n },\n },\n },\n {\n name: \"screen_memory_frame_at\",\n description:\n \"Decode one bounded local JPEG at an exact RFC3339 Rewind timestamp. Returns image content and opaque segment reference only; no archive path, upload, motion, or audio.\",\n inputSchema: {\n type: \"object\",\n required: [\"timestamp\"],\n properties: {\n timestamp: {\n type: \"string\",\n description: \"Exact RFC3339 timestamp.\",\n },\n reason: {\n type: \"string\",\n description: \"Short reason for this bounded local evidence read.\",\n },\n },\n },\n },\n {\n name: \"screen_memory_contact_sheet\",\n description:\n \"Return up to eight bounded, timestamped local Rewind frames from one chapter or a range of no more than five minutes. Prefer representative moments; no paths or uploads.\",\n inputSchema: {\n type: \"object\",\n properties: {\n chapterId: { type: \"string\" },\n startAt: { type: \"string\" },\n endAt: { type: \"string\" },\n count: {\n type: \"number\",\n description: \"1 to 8 frames; defaults to 4.\",\n },\n reason: { type: \"string\" },\n },\n },\n },\n {\n name: \"screen_memory_request_clip\",\n description:\n \"Request one bounded private Clip from a Rewind interval when visual or audio inspection is necessary. Clips reviews it first by default, unless the user disabled review in Settings. Raw archive paths are never returned.\",\n inputSchema: {\n type: \"object\",\n required: [\"startAt\", \"endAt\"],\n properties: {\n startAt: { type: \"string\", description: \"RFC3339 start timestamp.\" },\n endAt: { type: \"string\", description: \"RFC3339 end timestamp.\" },\n reason: {\n type: \"string\",\n description: \"Short user-facing reason this media range is needed.\",\n },\n includeMicrophone: { type: \"boolean\" },\n includeSystemAudio: { type: \"boolean\" },\n },\n },\n },\n {\n name: \"screen_memory_handoff_status\",\n description:\n \"Check whether a bounded Rewind Clip request is awaiting review, processing, ready, declined, or failed. Ready responses contain only the private agent URL and timestamps, never local archive paths.\",\n inputSchema: {\n type: \"object\",\n required: [\"requestId\"],\n properties: { requestId: { type: \"string\" } },\n },\n },\n ];\n}\n\nexport async function runScreenMemoryMCPStdio(\n opts: RunScreenMemoryMCPStdioOptions = {},\n): Promise<void> {\n const env = opts.env ?? process.env;\n const storeDir = opts.storeDir ?? defaultStoreDir(env);\n\n const { Server } = await import(\"@modelcontextprotocol/sdk/server/index.js\");\n const { StdioServerTransport } =\n await import(\"@modelcontextprotocol/sdk/server/stdio.js\");\n const { CallToolRequestSchema, ListToolsRequestSchema } =\n await import(\"@modelcontextprotocol/sdk/types.js\");\n\n const server = new Server(\n { name: \"clips-screen-memory\", version: \"0.1.0\" },\n { capabilities: { tools: {} } },\n );\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: screenMemoryMcpToolDefinitions(),\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request: any) => {\n const name = request.params?.name;\n const args = (request.params?.arguments ?? {}) as Record<string, unknown>;\n if (name === \"screen_memory_status\") {\n const config = readFeatureConfig(storeDir);\n const segments = recentSegments(storeDir, 24 * 60);\n return textResult({\n enabled: config.enabled === true,\n paused: config.paused === true,\n retentionHours: config.retentionHours ?? 24,\n maxBytes: config.maxBytes ?? 20 * 1024 * 1024 * 1024,\n segmentCount: segments.length,\n totalBytes: segments.reduce(\n (sum, segment) => sum + (segment.bytes || 0),\n 0,\n ),\n note: \"The Screen Memory store is connected. Local archive paths are intentionally not exposed to agents.\",\n });\n }\n if (name === \"screen_memory_recent_context\") {\n const result = await queryScreenMemoryContext(\n {\n query: typeof args.query === \"string\" ? args.query : undefined,\n sinceMinutes:\n typeof args.minutes === \"number\" ? args.minutes : undefined,\n limit: typeof args.limit === \"number\" ? args.limit : undefined,\n },\n { env: { ...env, AGENT_NATIVE_SCREEN_MEMORY_DIR: storeDir } },\n );\n const sanitizedEvidence = result.evidence.map((item) => ({\n ...item,\n excerpt: redactCredentialText(item.excerpt),\n }));\n const sanitizedItems = result.items.map((item) => ({\n ...item,\n text: redactCredentialText(item.text),\n sourceFile: \"local-screen-memory\",\n }));\n const requestId = `egress-mcp-${Date.now()}-${process.pid}`;\n const packet = {\n question:\n typeof args.query === \"string\" && args.query.trim()\n ? redactCredentialText(args.query.trim().slice(0, 4_000))\n : \"Recent Screen Memory context\",\n evidence: sanitizedEvidence.slice(0, 20).map((item) => ({\n id: item.id,\n momentId: item.momentId,\n sourceType: item.sourceType,\n capturedAt: item.capturedAt,\n excerpt: item.excerpt.slice(0, 1_200),\n })),\n };\n appendEgressReceipt(\n storeDir,\n requestId,\n \"recent-context\",\n packet.evidence,\n );\n return textResult(\n // Keep the old MCP envelope available while adding the typed contract.\n {\n events: sanitizedItems,\n ...result,\n items: sanitizedItems,\n evidence: sanitizedEvidence,\n contextFiles: [],\n egress: {\n requestId,\n packet,\n note: \"A content-free local activity receipt was recorded before this bounded text packet was returned.\",\n },\n },\n );\n }\n if (name === \"screen_memory_recent_segments\") {\n const minutes = typeof args.minutes === \"number\" ? args.minutes : 30;\n const segments = recentSegments(storeDir, minutes);\n const requestId = `egress-mcp-${Date.now()}-${process.pid}`;\n const packet = {\n question: `List recent Rewind segment references from the previous ${Math.max(1, Math.min(minutes, 24 * 60))} minutes`,\n evidence: segments.slice(0, 20).map((segment) => ({\n id: segment.id,\n momentId: `segment:${segment.id}`,\n sourceType: \"app-context\",\n capturedAt: segment.startedAt,\n excerpt: `Local media segment reference from ${segment.startedAt} to ${segment.endedAt}; media path and bytes were not exposed.`,\n })),\n };\n appendEgressReceipt(\n storeDir,\n requestId,\n \"recent-segments\",\n packet.evidence,\n );\n return textResult({\n localOnly: true,\n mediaApprovalRequired: true,\n segments: segments.map((segment) => ({\n id: segment.id,\n startedAt: segment.startedAt,\n endedAt: segment.endedAt,\n mimeType: segment.mimeType,\n durationMs: segment.durationMs,\n })),\n egress: {\n requestId,\n packet,\n note: \"A content-free local activity receipt was recorded before this bounded metadata packet was returned.\",\n },\n });\n }\n if (name === \"screen_memory_search_chapters\") {\n if (typeof args.query !== \"string\" || !args.query.trim())\n throw new Error(\"query is required.\");\n const document = readScreenMemoryChapters(storeDir);\n if (!document)\n throw new Error(\n \"No valid local Rewind chapters index is available yet.\",\n );\n const minutes =\n typeof args.minutes === \"number\" && Number.isFinite(args.minutes)\n ? Math.max(1, Math.min(Math.trunc(args.minutes), 24 * 60))\n : null;\n const cutoff = minutes ? Date.now() - minutes * 60_000 : null;\n const boundedDocument = cutoff\n ? {\n ...document,\n chapters: document.chapters.filter(\n (chapter) => Date.parse(chapter.endedAt) >= cutoff,\n ),\n }\n : document;\n const candidates = searchScreenMemoryChapters(\n boundedDocument,\n args.query.trim(),\n typeof args.limit === \"number\" ? args.limit : 5,\n typeof args.clientHint === \"string\" ? args.clientHint : undefined,\n );\n const ambiguous =\n candidates.length > 1 &&\n Math.abs(candidates[0].score - candidates[1].score) <= 0.05;\n const packet = {\n question: redactCredentialText(args.query.trim().slice(0, 4_000)),\n evidence: candidates.map((chapter) => ({\n id: chapter.id,\n momentId: chapter.id,\n sourceType: \"chapter\",\n capturedAt: chapter.startedAt,\n excerpt: redactCredentialText(\n `${chapter.label}: ${chapter.summary}`,\n ).slice(0, 1_200),\n })),\n };\n const requestId = `egress-mcp-${Date.now()}-${process.pid}`;\n appendEgressReceipt(\n storeDir,\n requestId,\n \"search-chapters\",\n packet.evidence,\n );\n return textResult({\n localOnly: true,\n generatedAt: document.generatedAt,\n state: document.state,\n coverage: document.coverage,\n gaps:\n isRecord(document.coverage) && Array.isArray(document.coverage.gaps)\n ? document.coverage.gaps\n : [],\n indexState: candidates.some(\n (candidate) => candidate.indexState === \"pending\",\n )\n ? \"pending\"\n : candidates.some((candidate) => candidate.indexState === \"partial\")\n ? \"partial\"\n : \"ready\",\n ambiguous,\n candidates: candidates.map(projectScreenMemoryChapterCandidate),\n egress: {\n requestId,\n packet,\n note: \"A content-free local activity receipt was recorded before this bounded chapter packet was returned.\",\n },\n });\n }\n if (name === \"screen_memory_frame_at\") {\n if (typeof args.timestamp !== \"string\")\n throw new Error(\"timestamp is required.\");\n const frame = readScreenMemoryFrame(\n storeDir,\n args.timestamp,\n opts.decodeFrame ?? decodeFrameWithFfmpeg,\n );\n appendLocalEvidenceReceipt(storeDir, \"frame-at\", [\n { timestamp: frame.timestamp, segmentId: frame.segmentId },\n ]);\n return {\n content: [\n {\n type: \"text\" as const,\n text: JSON.stringify({\n localOnly: true,\n timestamp: frame.timestamp,\n segmentId: frame.segmentId,\n coverage: \"retained clean segment\",\n note: \"This is a bounded local image read. Request screen_memory_request_clip for motion or audio.\",\n }),\n },\n frame.image,\n ],\n };\n }\n if (name === \"screen_memory_contact_sheet\") {\n const document = readScreenMemoryChapters(storeDir);\n const chapter =\n typeof args.chapterId === \"string\"\n ? document?.chapters.find(\n (candidate) => candidate.id === args.chapterId,\n )\n : undefined;\n const startAt =\n chapter?.startedAt ??\n (typeof args.startAt === \"string\" ? args.startAt : null);\n const endAt =\n chapter?.endedAt ??\n (typeof args.endAt === \"string\" ? args.endAt : null);\n if (!startAt || !endAt || !isTimestamp(startAt) || !isTimestamp(endAt))\n throw new Error(\n \"Provide a valid chapterId or RFC3339 startAt and endAt.\",\n );\n const durationMs = Date.parse(endAt) - Date.parse(startAt);\n if (!contactSheetRangeIsValid(durationMs, Boolean(chapter)))\n throw new Error(\n \"A contact sheet range must be between zero and five minutes.\",\n );\n if (Date.parse(endAt) > Date.now() + 5_000)\n throw new Error(\"A Rewind contact sheet cannot include future time.\");\n const count = Math.min(\n Math.max(\n Math.trunc(typeof args.count === \"number\" ? args.count : 4),\n 1,\n ),\n 8,\n );\n const representative = (chapter?.representativeMoments ?? [])\n .filter(\n (moment) =>\n Date.parse(moment.capturedAt) >= Date.parse(startAt) &&\n Date.parse(moment.capturedAt) <= Date.parse(endAt),\n )\n .map((moment) => moment.capturedAt);\n const timestamps = selectContactSheetTimestamps(\n startAt,\n endAt,\n count,\n representative,\n );\n const decoder = opts.decodeFrame ?? decodeFrameWithFfmpeg;\n const frames = timestamps.flatMap((timestamp) => {\n try {\n return [readScreenMemoryFrame(storeDir, timestamp, decoder)];\n } catch {\n // A chapter may span a brief coverage gap. Keep the clean retained\n // frames instead of failing the entire bounded contact sheet.\n return [];\n }\n });\n if (frames.length === 0) {\n throw new Error(\n \"No clean retained Rewind frames cover the requested contact-sheet range.\",\n );\n }\n appendLocalEvidenceReceipt(\n storeDir,\n \"contact-sheet\",\n frames.map(({ timestamp, segmentId }) => ({ timestamp, segmentId })),\n );\n return {\n content: [\n {\n type: \"text\" as const,\n text: JSON.stringify({\n localOnly: true,\n chapterId: chapter?.id ?? null,\n startAt: new Date(Date.parse(startAt)).toISOString(),\n endAt: new Date(Date.parse(endAt)).toISOString(),\n frameCount: frames.length,\n selection: representative.length\n ? \"representative moments then even coverage\"\n : \"even temporal coverage\",\n frames: frames.map(({ timestamp, segmentId }) => ({\n timestamp,\n segmentId,\n })),\n }),\n },\n ...frames.map((frame) => frame.image),\n ],\n };\n }\n if (name === \"screen_memory_request_clip\") {\n const range = parseHandoffRange(args);\n const config = readFeatureConfig(storeDir);\n const requestId = `handoff-${randomUUID()}`;\n const reason =\n typeof args.reason === \"string\"\n ? redactCredentialText(args.reason.trim().slice(0, 500))\n : \"Visual or audio context requested by the agent\";\n const request = {\n requestId,\n status: \"pending\",\n requestedAt: new Date().toISOString(),\n ...range,\n reason,\n includeMicrophone: args.includeMicrophone !== false,\n includeSystemAudio: args.includeSystemAudio !== false,\n reviewRequired: config.reviewBeforeSending !== false,\n agentClipRetention: config.agentClipRetention ?? \"forever\",\n };\n writePrivateJson(handoffPath(storeDir, requestId), request);\n appendEgressEvent(storeDir, {\n requestId,\n occurredAt: request.requestedAt,\n state: \"handoff-requested\",\n operation: \"request-clip\",\n receipt: {\n mediaInterval: { startAt: range.startAt, endAt: range.endAt },\n reviewRequired: request.reviewRequired,\n },\n evidenceCount: 0,\n packetBytes: 0,\n error: null,\n });\n return textResult({\n requestId,\n status: \"pending\",\n startAt: range.startAt,\n endAt: range.endAt,\n reviewRequired: request.reviewRequired,\n note: request.reviewRequired\n ? \"Clips is waiting for the user to review this bounded range. Poll screen_memory_handoff_status.\"\n : \"Clips is processing the explicitly requested bounded range. Poll screen_memory_handoff_status.\",\n });\n }\n if (name === \"screen_memory_handoff_status\") {\n if (typeof args.requestId !== \"string\") {\n throw new Error(\"requestId is required.\");\n }\n const parsed = JSON.parse(\n fs.readFileSync(handoffPath(storeDir, args.requestId), \"utf-8\"),\n ) as Record<string, unknown>;\n return textResult({\n requestId: parsed.requestId,\n status: parsed.status,\n startAt: parsed.startAt,\n endAt: parsed.endAt,\n recordingId: parsed.recordingId,\n agentUrl: parsed.agentUrl,\n contextUrl: parsed.contextUrl,\n expiresAt: parsed.expiresAt,\n autoDeleteAt: parsed.autoDeleteAt,\n autoDeletedAt: parsed.autoDeletedAt,\n error: parsed.error,\n });\n }\n throw new Error(`Unknown Screen Memory tool: ${name}`);\n });\n\n log(`Serving local Screen Memory from ${storeDir}`);\n const transport = new StdioServerTransport();\n await server.connect(transport);\n await new Promise<void>((resolve) => {\n transport.onclose = resolve;\n process.once(\"SIGINT\", resolve);\n process.once(\"SIGTERM\", resolve);\n });\n}\n"]}
@@ -16,7 +16,7 @@ export { fetchHubServers } from "./hub-client.js";
16
16
  export { isMcpToolAllowedForRequest } from "./visibility.js";
17
17
  export { callMcpTool, listVisibleMcpTools, McpAppApiError, type AppMcpTool, type ListVisibleMcpToolsOptions, } from "./app-api.js";
18
18
  export { classifyMcpToolCall, evaluateMcpToolCallPolicy, type McpToolCallClassification, type McpToolEffect, type McpToolFamily, type McpToolInvocationPolicy, type McpToolPolicyDecision, } from "./tool-policy.js";
19
- export { configureScreenMemory, queryScreenMemoryContext, readScreenMemoryStatus, type ScreenMemoryConfig, type ScreenMemoryContextItem, type ScreenMemoryQueryResult, type ScreenMemoryStatus, } from "./screen-memory-local.js";
19
+ export { configureScreenMemory, queryScreenMemoryForAgent, queryScreenMemoryContext, readScreenMemoryStatus, type ScreenMemoryConfig, type ScreenMemoryAgentQueryResult, type ScreenMemoryContextItem, type ScreenMemoryCoverageGap, type ScreenMemoryEvidenceItem, type ScreenMemoryEvidenceSourceType, type ScreenMemoryQueryResult, type ScreenMemoryRetrievalCoverage, type ScreenMemorySegmentReference, type ScreenMemoryStatus, type ScreenMemoryTimeRange, type ScreenMemoryTruncation, } from "./screen-memory-local.js";
20
20
  export { MCP_ACTION_RESULT_MARKER, isMcpActionResult, type AgentMcpAppPayload, type AgentMcpAppResourceContent, type McpActionResult, } from "./app-result.js";
21
21
  import type { EngineToolResultImagePart } from "../agent/engine/types.js";
22
22
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp-client/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp-client/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,KAAK,SAAS,EACd,KAAK,eAAe,GACrB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,KAAK,OAAO,EACZ,KAAK,uBAAuB,GAC7B,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,oBAAoB,EACpB,yBAAyB,EACzB,iCAAiC,EACjC,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,EACf,cAAc,EACd,SAAS,EACT,kBAAkB,EAClB,uBAAuB,EACvB,kBAAkB,EAClB,KAAK,cAAc,EACnB,KAAK,qBAAqB,GAC3B,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,2BAA2B,EAC3B,sBAAsB,EACtB,uBAAuB,EACvB,uBAAuB,EACvB,0BAA0B,EAC1B,KAAK,sBAAsB,EAC3B,KAAK,wBAAwB,EAC7B,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,EAC5B,KAAK,mBAAmB,GACzB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,kCAAkC,EAClC,wBAAwB,EACxB,uBAAuB,EACvB,+BAA+B,EAC/B,mCAAmC,EACnC,gCAAgC,EAChC,wBAAwB,EACxB,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,GAC5B,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,iCAAiC,EACjC,iCAAiC,EACjC,gCAAgC,EAChC,8BAA8B,EAC9B,KAAK,4BAA4B,GAClC,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,sBAAsB,EACtB,qBAAqB,EACrB,KAAK,uBAAuB,GAC7B,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,EACnB,KAAK,eAAe,EACpB,KAAK,kBAAkB,GACxB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,cAAc,EACd,KAAK,UAAU,EACf,KAAK,0BAA0B,GAChC,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,mBAAmB,EACnB,yBAAyB,EACzB,KAAK,yBAAyB,EAC9B,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,uBAAuB,EAC5B,KAAK,qBAAqB,GAC3B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,qBAAqB,EACrB,yBAAyB,EACzB,wBAAwB,EACxB,sBAAsB,EACtB,KAAK,kBAAkB,EACvB,KAAK,4BAA4B,EACjC,KAAK,uBAAuB,EAC5B,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,EAC7B,KAAK,8BAA8B,EACnC,KAAK,uBAAuB,EAC5B,KAAK,6BAA6B,EAClC,KAAK,4BAA4B,EACjC,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,GAC5B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,wBAAwB,EACxB,iBAAiB,EACjB,KAAK,kBAAkB,EACvB,KAAK,0BAA0B,EAC/B,KAAK,eAAe,GACrB,MAAM,iBAAiB,CAAC;AAQzB,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAC1E;;;;GAIG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAShE,OAAO,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAEL,KAAK,uBAAuB,EAC7B,MAAM,kBAAkB,CAAC;AAE1B,MAAM,WAAW,qBAAqB;IACpC,gBAAgB,CAAC,EAAE,uBAAuB,CAAC;CAC5C;AAED,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,gBAAgB,EACzB,OAAO,GAAE,qBAA0B,GAClC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAM7B;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,GAClC,IAAI,CAWN;AA6DD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAMxD;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAiB5D;AA6BD;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,OAAO,GACd,yBAAyB,EAAE,CAgB7B"}
@@ -17,7 +17,7 @@ export { isMcpToolAllowedForRequest } from "./visibility.js";
17
17
  export { callMcpTool, listVisibleMcpTools, McpAppApiError, } from "./app-api.js";
18
18
  import { isMcpToolAllowedForRequest } from "./visibility.js";
19
19
  export { classifyMcpToolCall, evaluateMcpToolCallPolicy, } from "./tool-policy.js";
20
- export { configureScreenMemory, queryScreenMemoryContext, readScreenMemoryStatus, } from "./screen-memory-local.js";
20
+ export { configureScreenMemory, queryScreenMemoryForAgent, queryScreenMemoryContext, readScreenMemoryStatus, } from "./screen-memory-local.js";
21
21
  export { MCP_ACTION_RESULT_MARKER, isMcpActionResult, } from "./app-result.js";
22
22
  import { getToolUiResourceUri, isToolVisibilityAppOnly, isToolVisibilityModelOnly, } from "@modelcontextprotocol/ext-apps/app-bridge";
23
23
  import { MCP_APP_MIME_TYPE } from "../action.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp-client/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * MCP client module — symmetric counterpart to `@agent-native/core/mcp`\n * (the MCP server). Connects to local MCP servers configured in\n * `mcp.config.json` or the `MCP_SERVERS` env var and exposes their tools\n * to the agent-chat tool-use loop.\n */\n\nexport {\n loadMcpConfig,\n autoDetectMcpConfig,\n type McpConfig,\n type McpServerConfig,\n} from \"./config.js\";\n\nexport {\n McpClientManager,\n buildMcpToolName,\n parseMcpToolName,\n MCP_TOOL_PREFIX,\n type McpTool,\n type McpClientManagerOptions,\n} from \"./manager.js\";\n\nexport {\n listRemoteServers,\n addRemoteServer,\n addOAuthRemoteServer,\n addFirstPartyRemoteServer,\n isFirstPartyRemoteEndpointTrusted,\n removeRemoteServer,\n validateRemoteUrl,\n normalizeServerName,\n mergedConfigKey,\n parseMergedKey,\n hashEmail,\n toHttpServerConfig,\n toHttpServerConfigAsync,\n materializeHeaders,\n type RemoteMcpScope,\n type StoredRemoteMcpServer,\n} from \"./remote-store.js\";\n\nexport {\n finishMcpOAuthAuthorization,\n getMcpOAuthAccessToken,\n readMcpOAuthCredentials,\n saveMcpOAuthCredentials,\n startMcpOAuthAuthorization,\n type McpOAuthCallbackResult,\n type McpOAuthCredentialBundle,\n type McpOAuthDiscoveryState,\n type McpOAuthProviderOptions,\n type McpOAuthStartResult,\n} from \"./oauth-client.js\";\n\nexport {\n areBuiltinMcpCapabilitiesSupported,\n BUILTIN_MCP_CAPABILITIES,\n getBuiltinMcpCapability,\n isBuiltinMcpCapabilityAvailable,\n listSupportedBuiltinMcpCapabilities,\n normalizeBuiltinMcpCapabilityIds,\n toBuiltinMcpServerConfig,\n type BuiltinMcpCapability,\n type BuiltinMcpCapabilityId,\n} from \"./builtin-capabilities.js\";\n\nexport {\n builtinMcpCapabilitiesSettingsKey,\n listEnabledBuiltinMcpCapabilities,\n setEnabledBuiltinMcpCapabilities,\n setBuiltinMcpCapabilityEnabled,\n type StoredBuiltinMcpCapabilities,\n} from \"./builtin-store.js\";\n\nexport {\n mountMcpServersRoutes,\n buildMergedConfig,\n builtinMergedConfigKey,\n startMcpConfigRefresh,\n type ClientBuiltinCapability,\n} from \"./routes.js\";\n\nexport {\n mountMcpHubRoutes,\n listHubServers,\n getHubStatus,\n isHubServeEnabled,\n isHubConsumeEnabled,\n type HubServerRecord,\n type HubServersResponse,\n} from \"./hub-routes.js\";\n\nexport { fetchHubServers } from \"./hub-client.js\";\n\nexport { isMcpToolAllowedForRequest } from \"./visibility.js\";\nexport {\n callMcpTool,\n listVisibleMcpTools,\n McpAppApiError,\n type AppMcpTool,\n type ListVisibleMcpToolsOptions,\n} from \"./app-api.js\";\nimport { isMcpToolAllowedForRequest } from \"./visibility.js\";\nexport {\n classifyMcpToolCall,\n evaluateMcpToolCallPolicy,\n type McpToolCallClassification,\n type McpToolEffect,\n type McpToolFamily,\n type McpToolInvocationPolicy,\n type McpToolPolicyDecision,\n} from \"./tool-policy.js\";\nexport {\n configureScreenMemory,\n queryScreenMemoryContext,\n readScreenMemoryStatus,\n type ScreenMemoryConfig,\n type ScreenMemoryContextItem,\n type ScreenMemoryQueryResult,\n type ScreenMemoryStatus,\n} from \"./screen-memory-local.js\";\nexport {\n MCP_ACTION_RESULT_MARKER,\n isMcpActionResult,\n type AgentMcpAppPayload,\n type AgentMcpAppResourceContent,\n type McpActionResult,\n} from \"./app-result.js\";\nimport {\n getToolUiResourceUri,\n isToolVisibilityAppOnly,\n isToolVisibilityModelOnly,\n} from \"@modelcontextprotocol/ext-apps/app-bridge\";\n\nimport { MCP_APP_MIME_TYPE } from \"../action.js\";\nimport type { EngineToolResultImagePart } from \"../agent/engine/types.js\";\n/**\n * Convert MCP tools into `ActionEntry` values suitable for registration in\n * the agent's action registry. Each tool is marked `http: false` so it's\n * never auto-mounted as an HTTP endpoint — MCP tools are agent-only.\n */\nimport type { ActionEntry } from \"../agent/production-agent.js\";\nimport { normalizeToolResultImages } from \"../agent/tool-result-images.js\";\nimport {\n MCP_ACTION_RESULT_MARKER,\n toolForMcpAppPayload,\n type AgentMcpAppPayload,\n type AgentMcpAppResourceContent,\n type McpActionResult,\n} from \"./app-result.js\";\nimport type { McpClientManager, McpTool } from \"./manager.js\";\nimport {\n evaluateMcpToolCallPolicy,\n type McpToolInvocationPolicy,\n} from \"./tool-policy.js\";\n\nexport interface McpActionEntryOptions {\n invocationPolicy?: McpToolInvocationPolicy;\n}\n\nexport function mcpToolsToActionEntries(\n manager: McpClientManager,\n options: McpActionEntryOptions = {},\n): Record<string, ActionEntry> {\n const entries: Record<string, ActionEntry> = {};\n for (const tool of manager.getTools().filter(isVisibleToModel)) {\n entries[tool.name] = mcpToolToActionEntry(manager, tool, options);\n }\n return entries;\n}\n\n/**\n * Mutate a target action dict in place so it matches the current MCP tool set:\n * - adds new `mcp__*` keys that aren't in target,\n * - removes `mcp__*` keys that no longer exist in the manager,\n * - leaves non-MCP keys untouched.\n *\n * Used by the agent-chat plugin to keep its `prodActions` / `devActions`\n * registries in sync after `McpClientManager.reconfigure()` runs.\n */\nexport function syncMcpActionEntries(\n manager: McpClientManager,\n target: Record<string, ActionEntry>,\n): void {\n const current = new Set<string>();\n for (const tool of manager.getTools().filter(isVisibleToModel)) {\n current.add(tool.name);\n target[tool.name] = mcpToolToActionEntry(manager, tool);\n }\n for (const key of Object.keys(target)) {\n if (key.startsWith(\"mcp__\") && !current.has(key)) {\n delete target[key];\n }\n }\n}\n\nfunction mcpToolToActionEntry(\n manager: McpClientManager,\n tool: McpTool,\n options: McpActionEntryOptions = {},\n): ActionEntry {\n return {\n tool: {\n description: tool.description,\n parameters: tool.inputSchema as any,\n },\n http: false,\n ...(tool.annotations?.readOnlyHint === true ? { readOnly: true } : {}),\n run: async (args: Record<string, unknown>) => {\n // Defense-in-depth: even if a cross-scope MCP tool somehow makes it\n // into the LLM's visible tool list, reject invocation here so we never\n // execute a user's credentials on behalf of another user.\n if (!isMcpToolAllowedForRequest(tool.name)) {\n return buildMcpErrorActionResult(\n tool,\n args,\n `Error: MCP tool ${tool.name} is not available in the current request scope.`,\n );\n }\n if (options.invocationPolicy) {\n const decision = evaluateMcpToolCallPolicy(\n options.invocationPolicy,\n tool,\n args,\n );\n if (!decision.allowed) {\n return buildMcpErrorActionResult(\n tool,\n args,\n `Error: MCP tool ${tool.name} is unavailable in read-only mode: ${decision.reason}.`,\n );\n }\n }\n try {\n const result = await manager.callTool(tool.name, args);\n return await buildMcpActionResult(manager, tool, args, result);\n } catch (err: any) {\n return buildMcpErrorActionResult(\n tool,\n args,\n `Error calling MCP tool ${tool.name}: ${err?.message ?? err}`,\n );\n }\n },\n };\n}\n\nfunction isVisibleToModel(tool: McpTool): boolean {\n try {\n return !isToolVisibilityAppOnly(tool.raw as any);\n } catch {\n return true;\n }\n}\n\nexport function isVisibleToMcpApp(tool: McpTool): boolean {\n try {\n return !isToolVisibilityModelOnly(tool.raw as any);\n } catch {\n return true;\n }\n}\n\nexport function flattenMcpToolResult(result: unknown): string {\n if (\n result &&\n typeof result === \"object\" &&\n Array.isArray((result as any).content)\n ) {\n const parts = (result as any).content as Array<Record<string, any>>;\n const text = parts.map(formatMcpContentPart).join(\"\\n\");\n const fallback =\n text ||\n (hasStructuredContent(result)\n ? JSON.stringify((result as any).structuredContent, null, 2)\n : \"(no output)\");\n if ((result as any).isError) return `Error: ${fallback}`;\n return fallback;\n }\n return typeof result === \"string\" ? result : JSON.stringify(result);\n}\n\nfunction formatMcpContentPart(part: Record<string, any>): string {\n if (part?.type === \"text\" && typeof part.text === \"string\") {\n return part.text;\n }\n if (part?.type === \"image\") {\n return `[image: ${part?.mimeType ?? \"unknown\"}]`;\n }\n if (part?.type === \"resource\") {\n const resource = part.resource ?? {};\n const uri = typeof resource.uri === \"string\" ? ` ${resource.uri}` : \"\";\n return `[resource: ${resource.mimeType ?? \"unknown\"}${uri}]`;\n }\n if (part?.type === \"resource_link\") {\n const uri = typeof part.uri === \"string\" ? ` ${part.uri}` : \"\";\n return `[resource: ${part.mimeType ?? \"unknown\"}${uri}]`;\n }\n return JSON.stringify(part);\n}\n\nfunction hasStructuredContent(result: unknown): boolean {\n return (\n !!result &&\n typeof result === \"object\" &&\n Object.prototype.hasOwnProperty.call(result, \"structuredContent\")\n );\n}\n\n/**\n * Extract vision images from a raw MCP tool result so the model can SEE\n * screenshots/previews returned by external MCP tools instead of only the\n * `[image: <mime>]` placeholder that `flattenMcpToolResult` leaves in the\n * text. Shares the per-result caps with `_agentImages` (max count, max base64\n * size); over-cap or unsupported images stay placeholder-only. Never throws.\n */\nexport function extractMcpToolResultImages(\n result: unknown,\n): EngineToolResultImagePart[] {\n if (\n !result ||\n typeof result !== \"object\" ||\n !Array.isArray((result as any).content) ||\n (result as any).isError\n ) {\n return [];\n }\n const candidates = ((result as any).content as Array<Record<string, any>>)\n .filter((part) => part?.type === \"image\" && typeof part.data === \"string\")\n .map((part) => ({\n data: part.data as string,\n mediaType: typeof part.mimeType === \"string\" ? part.mimeType : undefined,\n }));\n return normalizeToolResultImages(candidates).images;\n}\n\nasync function buildMcpActionResult(\n manager: McpClientManager,\n tool: McpTool,\n input: Record<string, unknown>,\n raw: unknown,\n): Promise<McpActionResult> {\n const text = flattenMcpToolResult(raw);\n const mcpApp = await extractMcpAppPayload(manager, tool, input, raw);\n return {\n [MCP_ACTION_RESULT_MARKER]: true,\n text,\n raw,\n serverId: tool.source,\n toolName: tool.name,\n originalToolName: tool.originalName,\n input,\n ...(mcpApp ? { mcpApp } : {}),\n };\n}\n\nfunction buildMcpErrorActionResult(\n tool: McpTool,\n input: Record<string, unknown>,\n text: string,\n): McpActionResult {\n return {\n [MCP_ACTION_RESULT_MARKER]: true,\n text,\n raw: {\n isError: true,\n content: [{ type: \"text\", text }],\n },\n serverId: tool.source,\n toolName: tool.name,\n originalToolName: tool.originalName,\n input,\n };\n}\n\nasync function extractMcpAppPayload(\n manager: McpClientManager,\n tool: McpTool,\n input: Record<string, unknown>,\n raw: unknown,\n): Promise<AgentMcpAppPayload | undefined> {\n const inlineResource = findInlineMcpAppResource(raw);\n const resourceUri =\n inlineResource?.uri ??\n resourceUriFromTool(tool) ??\n resourceUriFromResult(raw);\n if (!resourceUri) return undefined;\n\n const resource =\n inlineResource ?? (await readMcpAppResource(manager, tool, resourceUri));\n\n return {\n serverId: tool.source,\n toolName: tool.name,\n originalToolName: tool.originalName,\n resourceUri,\n toolInput: input,\n toolResult:\n raw && typeof raw === \"object\"\n ? ({ ...(raw as Record<string, unknown>) } as Record<string, unknown>)\n : { content: [{ type: \"text\", text: String(raw ?? \"\") }] },\n tool: toolForMcpAppPayload(tool),\n ...(resource ? { resource } : {}),\n };\n}\n\nfunction resourceUriFromTool(tool: McpTool): string | undefined {\n try {\n return getToolUiResourceUri(tool.raw as any);\n } catch {\n return undefined;\n }\n}\n\nfunction resourceUriFromResult(raw: unknown): string | undefined {\n if (!raw || typeof raw !== \"object\") return undefined;\n const meta = (raw as any)._meta;\n const nested = meta?.ui?.resourceUri;\n if (typeof nested === \"string\" && nested.startsWith(\"ui://\")) return nested;\n const flat = meta?.[\"ui/resourceUri\"] ?? meta?.[\"ui.resourceUri\"];\n if (typeof flat === \"string\" && flat.startsWith(\"ui://\")) return flat;\n return findInlineMcpAppResource(raw)?.uri;\n}\n\nfunction findInlineMcpAppResource(\n raw: unknown,\n): AgentMcpAppResourceContent | undefined {\n if (!raw || typeof raw !== \"object\") return undefined;\n const content = Array.isArray((raw as any).content)\n ? ((raw as any).content as unknown[])\n : [];\n for (const part of content) {\n const resource = normalizeMcpAppResourceContent(part);\n if (resource) return resource;\n }\n return undefined;\n}\n\nfunction normalizeMcpAppResourceContent(\n part: unknown,\n): AgentMcpAppResourceContent | undefined {\n if (!part || typeof part !== \"object\") return undefined;\n const candidate =\n (part as any).type === \"resource\"\n ? (part as any).resource\n : ((part as any).resource ?? part);\n if (!candidate || typeof candidate !== \"object\") return undefined;\n const uri = (candidate as any).uri;\n if (typeof uri !== \"string\" || !uri.startsWith(\"ui://\")) return undefined;\n const mimeType =\n typeof (candidate as any).mimeType === \"string\"\n ? (candidate as any).mimeType\n : undefined;\n if (mimeType && !mimeType.includes(MCP_APP_MIME_TYPE)) return undefined;\n const text =\n typeof (candidate as any).text === \"string\"\n ? (candidate as any).text\n : undefined;\n const blob =\n typeof (candidate as any).blob === \"string\"\n ? (candidate as any).blob\n : undefined;\n const meta =\n (candidate as any)._meta && typeof (candidate as any)._meta === \"object\"\n ? ((candidate as any)._meta as Record<string, unknown>)\n : (part as any)._meta && typeof (part as any)._meta === \"object\"\n ? ((part as any)._meta as Record<string, unknown>)\n : undefined;\n return {\n uri,\n ...(mimeType ? { mimeType } : {}),\n ...(text ? { text } : {}),\n ...(blob ? { blob } : {}),\n ...(meta ? { _meta: meta } : {}),\n };\n}\n\nasync function readMcpAppResource(\n manager: McpClientManager,\n tool: McpTool,\n resourceUri: string,\n): Promise<AgentMcpAppResourceContent | undefined> {\n try {\n const result = await manager.readResourceForTool(tool.name, resourceUri);\n const contents = Array.isArray((result as any)?.contents)\n ? ((result as any).contents as unknown[])\n : [];\n for (const content of contents) {\n const resource = normalizeMcpAppResourceContent(content);\n if (\n resource?.uri === resourceUri ||\n (resource && contents.length === 1)\n ) {\n return resource;\n }\n }\n } catch (err: any) {\n console.warn(\n `[mcp-client] Failed to read MCP App resource ${resourceUri}: ${err?.message ?? err}`,\n );\n }\n return undefined;\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp-client/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * MCP client module — symmetric counterpart to `@agent-native/core/mcp`\n * (the MCP server). Connects to local MCP servers configured in\n * `mcp.config.json` or the `MCP_SERVERS` env var and exposes their tools\n * to the agent-chat tool-use loop.\n */\n\nexport {\n loadMcpConfig,\n autoDetectMcpConfig,\n type McpConfig,\n type McpServerConfig,\n} from \"./config.js\";\n\nexport {\n McpClientManager,\n buildMcpToolName,\n parseMcpToolName,\n MCP_TOOL_PREFIX,\n type McpTool,\n type McpClientManagerOptions,\n} from \"./manager.js\";\n\nexport {\n listRemoteServers,\n addRemoteServer,\n addOAuthRemoteServer,\n addFirstPartyRemoteServer,\n isFirstPartyRemoteEndpointTrusted,\n removeRemoteServer,\n validateRemoteUrl,\n normalizeServerName,\n mergedConfigKey,\n parseMergedKey,\n hashEmail,\n toHttpServerConfig,\n toHttpServerConfigAsync,\n materializeHeaders,\n type RemoteMcpScope,\n type StoredRemoteMcpServer,\n} from \"./remote-store.js\";\n\nexport {\n finishMcpOAuthAuthorization,\n getMcpOAuthAccessToken,\n readMcpOAuthCredentials,\n saveMcpOAuthCredentials,\n startMcpOAuthAuthorization,\n type McpOAuthCallbackResult,\n type McpOAuthCredentialBundle,\n type McpOAuthDiscoveryState,\n type McpOAuthProviderOptions,\n type McpOAuthStartResult,\n} from \"./oauth-client.js\";\n\nexport {\n areBuiltinMcpCapabilitiesSupported,\n BUILTIN_MCP_CAPABILITIES,\n getBuiltinMcpCapability,\n isBuiltinMcpCapabilityAvailable,\n listSupportedBuiltinMcpCapabilities,\n normalizeBuiltinMcpCapabilityIds,\n toBuiltinMcpServerConfig,\n type BuiltinMcpCapability,\n type BuiltinMcpCapabilityId,\n} from \"./builtin-capabilities.js\";\n\nexport {\n builtinMcpCapabilitiesSettingsKey,\n listEnabledBuiltinMcpCapabilities,\n setEnabledBuiltinMcpCapabilities,\n setBuiltinMcpCapabilityEnabled,\n type StoredBuiltinMcpCapabilities,\n} from \"./builtin-store.js\";\n\nexport {\n mountMcpServersRoutes,\n buildMergedConfig,\n builtinMergedConfigKey,\n startMcpConfigRefresh,\n type ClientBuiltinCapability,\n} from \"./routes.js\";\n\nexport {\n mountMcpHubRoutes,\n listHubServers,\n getHubStatus,\n isHubServeEnabled,\n isHubConsumeEnabled,\n type HubServerRecord,\n type HubServersResponse,\n} from \"./hub-routes.js\";\n\nexport { fetchHubServers } from \"./hub-client.js\";\n\nexport { isMcpToolAllowedForRequest } from \"./visibility.js\";\nexport {\n callMcpTool,\n listVisibleMcpTools,\n McpAppApiError,\n type AppMcpTool,\n type ListVisibleMcpToolsOptions,\n} from \"./app-api.js\";\nimport { isMcpToolAllowedForRequest } from \"./visibility.js\";\nexport {\n classifyMcpToolCall,\n evaluateMcpToolCallPolicy,\n type McpToolCallClassification,\n type McpToolEffect,\n type McpToolFamily,\n type McpToolInvocationPolicy,\n type McpToolPolicyDecision,\n} from \"./tool-policy.js\";\nexport {\n configureScreenMemory,\n queryScreenMemoryForAgent,\n queryScreenMemoryContext,\n readScreenMemoryStatus,\n type ScreenMemoryConfig,\n type ScreenMemoryAgentQueryResult,\n type ScreenMemoryContextItem,\n type ScreenMemoryCoverageGap,\n type ScreenMemoryEvidenceItem,\n type ScreenMemoryEvidenceSourceType,\n type ScreenMemoryQueryResult,\n type ScreenMemoryRetrievalCoverage,\n type ScreenMemorySegmentReference,\n type ScreenMemoryStatus,\n type ScreenMemoryTimeRange,\n type ScreenMemoryTruncation,\n} from \"./screen-memory-local.js\";\nexport {\n MCP_ACTION_RESULT_MARKER,\n isMcpActionResult,\n type AgentMcpAppPayload,\n type AgentMcpAppResourceContent,\n type McpActionResult,\n} from \"./app-result.js\";\nimport {\n getToolUiResourceUri,\n isToolVisibilityAppOnly,\n isToolVisibilityModelOnly,\n} from \"@modelcontextprotocol/ext-apps/app-bridge\";\n\nimport { MCP_APP_MIME_TYPE } from \"../action.js\";\nimport type { EngineToolResultImagePart } from \"../agent/engine/types.js\";\n/**\n * Convert MCP tools into `ActionEntry` values suitable for registration in\n * the agent's action registry. Each tool is marked `http: false` so it's\n * never auto-mounted as an HTTP endpoint — MCP tools are agent-only.\n */\nimport type { ActionEntry } from \"../agent/production-agent.js\";\nimport { normalizeToolResultImages } from \"../agent/tool-result-images.js\";\nimport {\n MCP_ACTION_RESULT_MARKER,\n toolForMcpAppPayload,\n type AgentMcpAppPayload,\n type AgentMcpAppResourceContent,\n type McpActionResult,\n} from \"./app-result.js\";\nimport type { McpClientManager, McpTool } from \"./manager.js\";\nimport {\n evaluateMcpToolCallPolicy,\n type McpToolInvocationPolicy,\n} from \"./tool-policy.js\";\n\nexport interface McpActionEntryOptions {\n invocationPolicy?: McpToolInvocationPolicy;\n}\n\nexport function mcpToolsToActionEntries(\n manager: McpClientManager,\n options: McpActionEntryOptions = {},\n): Record<string, ActionEntry> {\n const entries: Record<string, ActionEntry> = {};\n for (const tool of manager.getTools().filter(isVisibleToModel)) {\n entries[tool.name] = mcpToolToActionEntry(manager, tool, options);\n }\n return entries;\n}\n\n/**\n * Mutate a target action dict in place so it matches the current MCP tool set:\n * - adds new `mcp__*` keys that aren't in target,\n * - removes `mcp__*` keys that no longer exist in the manager,\n * - leaves non-MCP keys untouched.\n *\n * Used by the agent-chat plugin to keep its `prodActions` / `devActions`\n * registries in sync after `McpClientManager.reconfigure()` runs.\n */\nexport function syncMcpActionEntries(\n manager: McpClientManager,\n target: Record<string, ActionEntry>,\n): void {\n const current = new Set<string>();\n for (const tool of manager.getTools().filter(isVisibleToModel)) {\n current.add(tool.name);\n target[tool.name] = mcpToolToActionEntry(manager, tool);\n }\n for (const key of Object.keys(target)) {\n if (key.startsWith(\"mcp__\") && !current.has(key)) {\n delete target[key];\n }\n }\n}\n\nfunction mcpToolToActionEntry(\n manager: McpClientManager,\n tool: McpTool,\n options: McpActionEntryOptions = {},\n): ActionEntry {\n return {\n tool: {\n description: tool.description,\n parameters: tool.inputSchema as any,\n },\n http: false,\n ...(tool.annotations?.readOnlyHint === true ? { readOnly: true } : {}),\n run: async (args: Record<string, unknown>) => {\n // Defense-in-depth: even if a cross-scope MCP tool somehow makes it\n // into the LLM's visible tool list, reject invocation here so we never\n // execute a user's credentials on behalf of another user.\n if (!isMcpToolAllowedForRequest(tool.name)) {\n return buildMcpErrorActionResult(\n tool,\n args,\n `Error: MCP tool ${tool.name} is not available in the current request scope.`,\n );\n }\n if (options.invocationPolicy) {\n const decision = evaluateMcpToolCallPolicy(\n options.invocationPolicy,\n tool,\n args,\n );\n if (!decision.allowed) {\n return buildMcpErrorActionResult(\n tool,\n args,\n `Error: MCP tool ${tool.name} is unavailable in read-only mode: ${decision.reason}.`,\n );\n }\n }\n try {\n const result = await manager.callTool(tool.name, args);\n return await buildMcpActionResult(manager, tool, args, result);\n } catch (err: any) {\n return buildMcpErrorActionResult(\n tool,\n args,\n `Error calling MCP tool ${tool.name}: ${err?.message ?? err}`,\n );\n }\n },\n };\n}\n\nfunction isVisibleToModel(tool: McpTool): boolean {\n try {\n return !isToolVisibilityAppOnly(tool.raw as any);\n } catch {\n return true;\n }\n}\n\nexport function isVisibleToMcpApp(tool: McpTool): boolean {\n try {\n return !isToolVisibilityModelOnly(tool.raw as any);\n } catch {\n return true;\n }\n}\n\nexport function flattenMcpToolResult(result: unknown): string {\n if (\n result &&\n typeof result === \"object\" &&\n Array.isArray((result as any).content)\n ) {\n const parts = (result as any).content as Array<Record<string, any>>;\n const text = parts.map(formatMcpContentPart).join(\"\\n\");\n const fallback =\n text ||\n (hasStructuredContent(result)\n ? JSON.stringify((result as any).structuredContent, null, 2)\n : \"(no output)\");\n if ((result as any).isError) return `Error: ${fallback}`;\n return fallback;\n }\n return typeof result === \"string\" ? result : JSON.stringify(result);\n}\n\nfunction formatMcpContentPart(part: Record<string, any>): string {\n if (part?.type === \"text\" && typeof part.text === \"string\") {\n return part.text;\n }\n if (part?.type === \"image\") {\n return `[image: ${part?.mimeType ?? \"unknown\"}]`;\n }\n if (part?.type === \"resource\") {\n const resource = part.resource ?? {};\n const uri = typeof resource.uri === \"string\" ? ` ${resource.uri}` : \"\";\n return `[resource: ${resource.mimeType ?? \"unknown\"}${uri}]`;\n }\n if (part?.type === \"resource_link\") {\n const uri = typeof part.uri === \"string\" ? ` ${part.uri}` : \"\";\n return `[resource: ${part.mimeType ?? \"unknown\"}${uri}]`;\n }\n return JSON.stringify(part);\n}\n\nfunction hasStructuredContent(result: unknown): boolean {\n return (\n !!result &&\n typeof result === \"object\" &&\n Object.prototype.hasOwnProperty.call(result, \"structuredContent\")\n );\n}\n\n/**\n * Extract vision images from a raw MCP tool result so the model can SEE\n * screenshots/previews returned by external MCP tools instead of only the\n * `[image: <mime>]` placeholder that `flattenMcpToolResult` leaves in the\n * text. Shares the per-result caps with `_agentImages` (max count, max base64\n * size); over-cap or unsupported images stay placeholder-only. Never throws.\n */\nexport function extractMcpToolResultImages(\n result: unknown,\n): EngineToolResultImagePart[] {\n if (\n !result ||\n typeof result !== \"object\" ||\n !Array.isArray((result as any).content) ||\n (result as any).isError\n ) {\n return [];\n }\n const candidates = ((result as any).content as Array<Record<string, any>>)\n .filter((part) => part?.type === \"image\" && typeof part.data === \"string\")\n .map((part) => ({\n data: part.data as string,\n mediaType: typeof part.mimeType === \"string\" ? part.mimeType : undefined,\n }));\n return normalizeToolResultImages(candidates).images;\n}\n\nasync function buildMcpActionResult(\n manager: McpClientManager,\n tool: McpTool,\n input: Record<string, unknown>,\n raw: unknown,\n): Promise<McpActionResult> {\n const text = flattenMcpToolResult(raw);\n const mcpApp = await extractMcpAppPayload(manager, tool, input, raw);\n return {\n [MCP_ACTION_RESULT_MARKER]: true,\n text,\n raw,\n serverId: tool.source,\n toolName: tool.name,\n originalToolName: tool.originalName,\n input,\n ...(mcpApp ? { mcpApp } : {}),\n };\n}\n\nfunction buildMcpErrorActionResult(\n tool: McpTool,\n input: Record<string, unknown>,\n text: string,\n): McpActionResult {\n return {\n [MCP_ACTION_RESULT_MARKER]: true,\n text,\n raw: {\n isError: true,\n content: [{ type: \"text\", text }],\n },\n serverId: tool.source,\n toolName: tool.name,\n originalToolName: tool.originalName,\n input,\n };\n}\n\nasync function extractMcpAppPayload(\n manager: McpClientManager,\n tool: McpTool,\n input: Record<string, unknown>,\n raw: unknown,\n): Promise<AgentMcpAppPayload | undefined> {\n const inlineResource = findInlineMcpAppResource(raw);\n const resourceUri =\n inlineResource?.uri ??\n resourceUriFromTool(tool) ??\n resourceUriFromResult(raw);\n if (!resourceUri) return undefined;\n\n const resource =\n inlineResource ?? (await readMcpAppResource(manager, tool, resourceUri));\n\n return {\n serverId: tool.source,\n toolName: tool.name,\n originalToolName: tool.originalName,\n resourceUri,\n toolInput: input,\n toolResult:\n raw && typeof raw === \"object\"\n ? ({ ...(raw as Record<string, unknown>) } as Record<string, unknown>)\n : { content: [{ type: \"text\", text: String(raw ?? \"\") }] },\n tool: toolForMcpAppPayload(tool),\n ...(resource ? { resource } : {}),\n };\n}\n\nfunction resourceUriFromTool(tool: McpTool): string | undefined {\n try {\n return getToolUiResourceUri(tool.raw as any);\n } catch {\n return undefined;\n }\n}\n\nfunction resourceUriFromResult(raw: unknown): string | undefined {\n if (!raw || typeof raw !== \"object\") return undefined;\n const meta = (raw as any)._meta;\n const nested = meta?.ui?.resourceUri;\n if (typeof nested === \"string\" && nested.startsWith(\"ui://\")) return nested;\n const flat = meta?.[\"ui/resourceUri\"] ?? meta?.[\"ui.resourceUri\"];\n if (typeof flat === \"string\" && flat.startsWith(\"ui://\")) return flat;\n return findInlineMcpAppResource(raw)?.uri;\n}\n\nfunction findInlineMcpAppResource(\n raw: unknown,\n): AgentMcpAppResourceContent | undefined {\n if (!raw || typeof raw !== \"object\") return undefined;\n const content = Array.isArray((raw as any).content)\n ? ((raw as any).content as unknown[])\n : [];\n for (const part of content) {\n const resource = normalizeMcpAppResourceContent(part);\n if (resource) return resource;\n }\n return undefined;\n}\n\nfunction normalizeMcpAppResourceContent(\n part: unknown,\n): AgentMcpAppResourceContent | undefined {\n if (!part || typeof part !== \"object\") return undefined;\n const candidate =\n (part as any).type === \"resource\"\n ? (part as any).resource\n : ((part as any).resource ?? part);\n if (!candidate || typeof candidate !== \"object\") return undefined;\n const uri = (candidate as any).uri;\n if (typeof uri !== \"string\" || !uri.startsWith(\"ui://\")) return undefined;\n const mimeType =\n typeof (candidate as any).mimeType === \"string\"\n ? (candidate as any).mimeType\n : undefined;\n if (mimeType && !mimeType.includes(MCP_APP_MIME_TYPE)) return undefined;\n const text =\n typeof (candidate as any).text === \"string\"\n ? (candidate as any).text\n : undefined;\n const blob =\n typeof (candidate as any).blob === \"string\"\n ? (candidate as any).blob\n : undefined;\n const meta =\n (candidate as any)._meta && typeof (candidate as any)._meta === \"object\"\n ? ((candidate as any)._meta as Record<string, unknown>)\n : (part as any)._meta && typeof (part as any)._meta === \"object\"\n ? ((part as any)._meta as Record<string, unknown>)\n : undefined;\n return {\n uri,\n ...(mimeType ? { mimeType } : {}),\n ...(text ? { text } : {}),\n ...(blob ? { blob } : {}),\n ...(meta ? { _meta: meta } : {}),\n };\n}\n\nasync function readMcpAppResource(\n manager: McpClientManager,\n tool: McpTool,\n resourceUri: string,\n): Promise<AgentMcpAppResourceContent | undefined> {\n try {\n const result = await manager.readResourceForTool(tool.name, resourceUri);\n const contents = Array.isArray((result as any)?.contents)\n ? ((result as any).contents as unknown[])\n : [];\n for (const content of contents) {\n const resource = normalizeMcpAppResourceContent(content);\n if (\n resource?.uri === resourceUri ||\n (resource && contents.length === 1)\n ) {\n return resource;\n }\n }\n } catch (err: any) {\n console.warn(\n `[mcp-client] Failed to read MCP App resource ${resourceUri}: ${err?.message ?? err}`,\n );\n }\n return undefined;\n}\n"]}
@@ -5,6 +5,11 @@ export interface ScreenMemoryConfig {
5
5
  maxBytes: number;
6
6
  segmentSeconds: number;
7
7
  sampleIntervalSeconds: number;
8
+ captureMode: "visuals" | "visuals-audio";
9
+ reviewBeforeSending: boolean;
10
+ agentClipRetention: "forever" | "24-hours" | "7-days" | "30-days";
11
+ excludedBundleIds: string[];
12
+ excludePrivateWindows: boolean;
8
13
  }
9
14
  export interface ScreenMemoryStatus {
10
15
  feature: "screen-memory";
@@ -34,6 +39,58 @@ export interface ScreenMemoryContextItem {
34
39
  text: string;
35
40
  sourceFile: string;
36
41
  }
42
+ export type ScreenMemoryEvidenceSourceType = "app-context" | "transcript" | "ocr";
43
+ export interface ScreenMemoryTimeRange {
44
+ startedAt: string | null;
45
+ endedAt: string;
46
+ }
47
+ export interface ScreenMemoryCoverageGap {
48
+ startedAt: string | null;
49
+ endedAt: string | null;
50
+ reason: "no-context-files" | "no-evidence-in-requested-range" | "missing-before-first-evidence" | "capture-stale" | "timestamps-unavailable" | "index-pending" | "index-failed" | "index-skipped" | "privacy-excluded-or-unretained";
51
+ }
52
+ export interface ScreenMemorySegmentReference {
53
+ id: string;
54
+ startedAt: string | null;
55
+ endedAt: string | null;
56
+ }
57
+ export interface ScreenMemoryEvidenceItem {
58
+ id: string;
59
+ momentId: string;
60
+ capturedAt: string | null;
61
+ sourceType: ScreenMemoryEvidenceSourceType;
62
+ excerpt: string;
63
+ excerptTruncated: boolean;
64
+ appName: string | null;
65
+ windowTitle: string | null;
66
+ bundleId: string | null;
67
+ url: string | null;
68
+ title: string | null;
69
+ segmentRefs: ScreenMemorySegmentReference[];
70
+ jumpTarget: {
71
+ kind: "screen-memory-moment";
72
+ momentId: string;
73
+ capturedAt: string | null;
74
+ segmentId: string | null;
75
+ };
76
+ }
77
+ export interface ScreenMemoryRetrievalCoverage {
78
+ requestedRange: ScreenMemoryTimeRange;
79
+ coveredRange: {
80
+ startedAt: string | null;
81
+ endedAt: string | null;
82
+ };
83
+ gaps: ScreenMemoryCoverageGap[];
84
+ }
85
+ export interface ScreenMemoryTruncation {
86
+ itemLimit: number;
87
+ returnedItems: number;
88
+ omittedItems: number;
89
+ maxExcerptChars: number;
90
+ excerptsTruncated: number;
91
+ sourceRowsReadLimit: number;
92
+ sourceRowsReadTruncated: boolean;
93
+ }
37
94
  export interface ScreenMemoryQueryResult {
38
95
  feature: "screen-memory";
39
96
  localOnly: true;
@@ -43,6 +100,10 @@ export interface ScreenMemoryQueryResult {
43
100
  sinceMinutes: number | null;
44
101
  count: number;
45
102
  items: ScreenMemoryContextItem[];
103
+ /** Stable, bounded local retrieval contract. `items` remains for legacy callers. */
104
+ evidence: ScreenMemoryEvidenceItem[];
105
+ coverage: ScreenMemoryRetrievalCoverage;
106
+ truncation: ScreenMemoryTruncation;
46
107
  contextFiles: string[];
47
108
  note: string;
48
109
  }
@@ -50,6 +111,24 @@ export interface ScreenMemoryLocalOptions {
50
111
  env?: NodeJS.ProcessEnv;
51
112
  platform?: NodeJS.Platform;
52
113
  homeDir?: string;
114
+ /** Test-only clock injection; retrieval never reads network time. */
115
+ now?: () => Date;
116
+ }
117
+ export interface ScreenMemoryAgentQueryResult extends ScreenMemoryQueryResult {
118
+ egress: {
119
+ requestId: string;
120
+ packet: {
121
+ question: string;
122
+ evidence: Array<{
123
+ id: string;
124
+ momentId: string;
125
+ sourceType: ScreenMemoryEvidenceSourceType;
126
+ capturedAt: string | null;
127
+ excerpt: string;
128
+ }>;
129
+ };
130
+ note: string;
131
+ };
53
132
  }
54
133
  export declare function configureScreenMemory(patch: Partial<ScreenMemoryConfig>, options?: ScreenMemoryLocalOptions): Promise<ScreenMemoryStatus>;
55
134
  export declare function queryScreenMemoryContext(args?: {
@@ -57,5 +136,16 @@ export declare function queryScreenMemoryContext(args?: {
57
136
  limit?: number | null;
58
137
  sinceMinutes?: number | null;
59
138
  }, options?: ScreenMemoryLocalOptions): Promise<ScreenMemoryQueryResult>;
139
+ /**
140
+ * Agent-facing retrieval boundary. Asking an agent to search Rewind is the
141
+ * authorization. This removes filesystem paths, redacts obvious
142
+ * credential-shaped text, and records a content-free activity receipt before
143
+ * it is returned to an action caller.
144
+ */
145
+ export declare function queryScreenMemoryForAgent(args?: {
146
+ query?: string | null;
147
+ limit?: number | null;
148
+ sinceMinutes?: number | null;
149
+ }, options?: ScreenMemoryLocalOptions): Promise<ScreenMemoryAgentQueryResult>;
60
150
  export declare function readScreenMemoryStatus(options?: ScreenMemoryLocalOptions): Promise<ScreenMemoryStatus>;
61
151
  //# sourceMappingURL=screen-memory-local.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"screen-memory-local.d.ts","sourceRoot":"","sources":["../../src/mcp-client/screen-memory-local.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,qBAAqB,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,eAAe,CAAC;IACzB,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,UAAU,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,GAAG,aAAa,CAAC;IACjE,MAAM,EAAE,kBAAkB,CAAC;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,gBAAgB,GAAG,YAAY,GAAG,SAAS,CAAC;IAC1D,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,eAAe,CAAC;IACzB,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,uBAAuB,EAAE,CAAC;IACjC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,wBAAwB;IACvC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAkMD,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,OAAO,CAAC,kBAAkB,CAAC,EAClC,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC,kBAAkB,CAAC,CAa7B;AAuGD,wBAAsB,wBAAwB,CAC5C,IAAI,GAAE;IACJ,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB,EACN,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC,uBAAuB,CAAC,CAsClC;AAED,wBAAsB,sBAAsB,CAC1C,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC,kBAAkB,CAAC,CA0C7B"}
1
+ {"version":3,"file":"screen-memory-local.d.ts","sourceRoot":"","sources":["../../src/mcp-client/screen-memory-local.ts"],"names":[],"mappings":"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"}