@agent-native/core 0.128.4 → 0.129.1

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 (351) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +90 -0
  3. package/corpus/core/docs/content/template-design-collaboration-and-full-apps.mdx +3 -1
  4. package/corpus/core/package.json +6 -3
  5. package/corpus/core/src/a2a/client.ts +18 -4
  6. package/corpus/core/src/a2a/server.ts +19 -3
  7. package/corpus/core/src/a2a/types.ts +7 -0
  8. package/corpus/core/src/action.ts +43 -16
  9. package/corpus/core/src/agent/engine/ai-sdk-engine.ts +14 -10
  10. package/corpus/core/src/agent/production-agent.ts +41 -3
  11. package/corpus/core/src/agent/thread-data-builder.ts +5 -0
  12. package/corpus/core/src/chat-threads/migrations.ts +53 -0
  13. package/corpus/core/src/cli/create.ts +4 -0
  14. package/corpus/core/src/cli/skills-content/design-visual-edit-skill.ts +36 -16
  15. package/corpus/core/src/cli/skills.ts +16 -0
  16. package/corpus/core/src/client/AgentPanel.tsx +9 -5
  17. package/corpus/core/src/client/AssistantChat.tsx +138 -46
  18. package/corpus/core/src/client/MultiTabAssistantChat.tsx +16 -10
  19. package/corpus/core/src/client/agent-chat-adapter.ts +21 -3
  20. package/corpus/core/src/client/analytics.ts +159 -102
  21. package/corpus/core/src/client/chat/message-components.tsx +12 -5
  22. package/corpus/core/src/client/chat/runtime.ts +2 -1
  23. package/corpus/core/src/client/chat/tool-call-display.tsx +25 -2
  24. package/corpus/core/src/client/chat-model-groups.ts +3 -0
  25. package/corpus/core/src/client/client-status-requests.ts +161 -0
  26. package/corpus/core/src/client/org/OrgSwitcher.tsx +4 -4
  27. package/corpus/core/src/client/settings/VoiceTranscriptionSection.tsx +2 -2
  28. package/corpus/core/src/client/sse-event-processor.ts +15 -3
  29. package/corpus/core/src/client/use-agent-engine-configured.ts +54 -50
  30. package/corpus/core/src/client/use-chat-models.ts +16 -11
  31. package/corpus/core/src/client/use-chat-threads.ts +32 -9
  32. package/corpus/core/src/client/use-session.ts +4 -5
  33. package/corpus/core/src/db/client.ts +83 -8
  34. package/corpus/core/src/db/ensure-additive-columns.ts +31 -20
  35. package/corpus/core/src/db/migrations.ts +22 -2
  36. package/corpus/core/src/mcp/approval-store.ts +99 -0
  37. package/corpus/core/src/mcp/build-server.ts +579 -303
  38. package/corpus/core/src/mcp/embed-app.ts +1 -1
  39. package/corpus/core/src/mcp/oauth-client-metadata.ts +380 -0
  40. package/corpus/core/src/mcp/oauth-route.ts +57 -52
  41. package/corpus/core/src/mcp/screen-memory-stdio.ts +400 -378
  42. package/corpus/core/src/mcp/server.ts +29 -145
  43. package/corpus/core/src/mcp/stdio.ts +72 -80
  44. package/corpus/core/src/mcp-client/manager.ts +6 -10
  45. package/corpus/core/src/mcp-client/oauth-client.ts +127 -36
  46. package/corpus/core/src/mcp-client/oauth-routes.ts +16 -6
  47. package/corpus/core/src/mcp-client/routes.ts +6 -5
  48. package/corpus/core/src/server/agent-capabilities.ts +20 -0
  49. package/corpus/core/src/server/agent-chat/action-filters-a2a.ts +27 -0
  50. package/corpus/core/src/server/agent-chat-plugin.ts +18 -0
  51. package/corpus/core/src/server/transcribe-voice.ts +14 -5
  52. package/corpus/core/src/templates/default/.agents/skills/security/SKILL.md +13 -2
  53. package/corpus/core/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +5 -2
  54. package/corpus/core/src/templates/workspace-core/.agents/skills/external-agents/SKILL.md +18 -0
  55. package/corpus/core/src/templates/workspace-core/.agents/skills/security/SKILL.md +13 -2
  56. package/corpus/templates/analytics/.agents/skills/security/SKILL.md +13 -2
  57. package/corpus/templates/analytics/app/components/dashboard/DashboardPanelSkeleton.tsx +1 -10
  58. package/corpus/templates/analytics/app/global.css +0 -31
  59. package/corpus/templates/analytics/app/lib/sql-query.ts +46 -20
  60. package/corpus/templates/analytics/changelog/2026-07-28-analytics-dashboard-loading-states-now-use-a-simpler-standar.md +6 -0
  61. package/corpus/templates/analytics/changelog/2026-07-28-analytics-dashboards-now-load-first-party-charts-reliably-in.md +6 -0
  62. package/corpus/templates/analytics/server/lib/first-party-analytics-cache.ts +42 -16
  63. package/corpus/templates/analytics/server/lib/first-party-analytics.ts +4 -2
  64. package/corpus/templates/analytics/shared/sql-query-limits.ts +1 -0
  65. package/corpus/templates/assets/.agents/skills/security/SKILL.md +13 -2
  66. package/corpus/templates/brain/.agents/skills/security/SKILL.md +13 -2
  67. package/corpus/templates/calendar/.agents/skills/security/SKILL.md +13 -2
  68. package/corpus/templates/chat/.agents/skills/security/SKILL.md +13 -2
  69. package/corpus/templates/chat/README.md +0 -2
  70. package/corpus/templates/clips/.agents/skills/security/SKILL.md +13 -2
  71. package/corpus/templates/clips/app/components/player/player-controls.tsx +3 -6
  72. package/corpus/templates/clips/app/components/player/recording-views-badge.tsx +6 -2
  73. package/corpus/templates/clips/app/components/sharing/share-ui.tsx +25 -10
  74. package/corpus/templates/clips/app/components/sharing/viewed-by-popover.tsx +28 -6
  75. package/corpus/templates/clips/app/lib/use-visible-avatar-url.ts +34 -0
  76. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +6 -2
  77. package/corpus/templates/clips/app/routes/share.$shareId.tsx +3 -1
  78. package/corpus/templates/clips/changelog/2026-07-28-copied-share-links-no-longer-leave-an-unnecessary-confirmati.md +6 -0
  79. package/corpus/templates/clips/changelog/2026-07-28-playback-skip-controls-no-longer-show-overlapping-numbers.md +6 -0
  80. package/corpus/templates/clips/changelog/2026-07-28-profile-avatars-now-appear-in-viewer-and-share-access-lists.md +6 -0
  81. package/corpus/templates/clips/changelog/2026-07-28-public-clips-share-buttons-now-use-a-clean-text-only-label.md +6 -0
  82. package/corpus/templates/clips/desktop/src/app.tsx +14 -17
  83. package/corpus/templates/clips/desktop/src/overlays/live-audio-bars.tsx +3 -1
  84. package/corpus/templates/clips/desktop/src/styles.css +13 -10
  85. package/corpus/templates/clips/desktop/src-tauri/src/recording_indicator.rs +2 -2
  86. package/corpus/templates/clips/desktop/src-tauri/src/whisper_speech.rs +36 -0
  87. package/corpus/templates/content/.agents/skills/security/SKILL.md +13 -2
  88. package/corpus/templates/content/actions/_builder-cms-read-client.ts +155 -34
  89. package/corpus/templates/content/actions/_builder-docs-client.ts +151 -30
  90. package/corpus/templates/content/actions/stage-builder-source-bulk-update.ts +5 -2
  91. package/corpus/templates/content/app/root.tsx +35 -14
  92. package/corpus/templates/content/changelog/2026-07-28-builder-backed-files-media-fields-now-accept-direct-file-url.md +6 -0
  93. package/corpus/templates/content/changelog/2026-07-28-builder-content-reads-now-negotiate-the-newest-mcp-protocol-.md +6 -0
  94. package/corpus/templates/content/changelog/2026-07-28-public-content-pages-load-faster-before-the-optional-ask-sid.md +6 -0
  95. package/corpus/templates/design/.agents/skills/security/SKILL.md +13 -2
  96. package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +36 -16
  97. package/corpus/templates/design/.generated/bridge/editor-chrome.generated.ts +42 -3
  98. package/corpus/templates/design/actions/open-visual-edit.ts +2 -1
  99. package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +2 -2
  100. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +14 -15
  101. package/corpus/templates/design/app/components/design/ResponsiveInteractBar.tsx +314 -0
  102. package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +88 -3
  103. package/corpus/templates/design/app/components/design/keyboard-shortcuts.ts +1 -1
  104. package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +7 -6
  105. package/corpus/templates/design/app/i18n-data.ts +56 -11
  106. package/corpus/templates/design/app/i18n-responsive-interact.ts +183 -0
  107. package/corpus/templates/design/app/lib/agent-chat.ts +60 -0
  108. package/corpus/templates/design/app/pages/design-editor/responsive-interact.ts +89 -0
  109. package/corpus/templates/design/changelog/2026-07-28-design-edits-can-be-applied-through-the-host-coding-agent-fr.md +6 -0
  110. package/corpus/templates/design/changelog/2026-07-28-interact-mode-can-preview-designs-in-responsive-device-sizes.md +6 -0
  111. package/corpus/templates/design/changelog/2026-07-28-interact-mode-now-opens-a-full-screen-responsive-preview-wit.md +6 -0
  112. package/corpus/templates/design/changelog/2026-07-28-show-or-hide-design-editing-chrome-with-cmd-on-apple-devices.md +2 -2
  113. package/corpus/templates/design/changelog/2026-07-28-visual-edit-now-always-shows-the-live-running-app-in-the-can.md +6 -0
  114. package/corpus/templates/dispatch/.agents/skills/security/SKILL.md +13 -2
  115. package/corpus/templates/forms/.agents/skills/security/SKILL.md +13 -2
  116. package/corpus/templates/macros/.agents/skills/security/SKILL.md +13 -2
  117. package/corpus/templates/mail/.agents/skills/security/SKILL.md +13 -2
  118. package/corpus/templates/plan/.agents/skills/security/SKILL.md +13 -2
  119. package/corpus/templates/slides/.agents/skills/security/SKILL.md +13 -2
  120. package/corpus/templates/tasks/.agents/skills/security/SKILL.md +13 -2
  121. package/corpus/toolkit/CHANGELOG.md +13 -0
  122. package/corpus/toolkit/package.json +1 -1
  123. package/corpus/toolkit/src/chat-history.css +1 -2
  124. package/corpus/toolkit/src/composer/TiptapComposer.tsx +45 -0
  125. package/dist/a2a/client.d.ts +7 -0
  126. package/dist/a2a/client.d.ts.map +1 -1
  127. package/dist/a2a/client.js +8 -3
  128. package/dist/a2a/client.js.map +1 -1
  129. package/dist/a2a/server.d.ts.map +1 -1
  130. package/dist/a2a/server.js +18 -3
  131. package/dist/a2a/server.js.map +1 -1
  132. package/dist/a2a/types.d.ts +7 -0
  133. package/dist/a2a/types.d.ts.map +1 -1
  134. package/dist/a2a/types.js.map +1 -1
  135. package/dist/action.d.ts +15 -1
  136. package/dist/action.d.ts.map +1 -1
  137. package/dist/action.js +39 -16
  138. package/dist/action.js.map +1 -1
  139. package/dist/agent/engine/ai-sdk-engine.d.ts.map +1 -1
  140. package/dist/agent/engine/ai-sdk-engine.js +14 -10
  141. package/dist/agent/engine/ai-sdk-engine.js.map +1 -1
  142. package/dist/agent/production-agent.d.ts.map +1 -1
  143. package/dist/agent/production-agent.js +35 -7
  144. package/dist/agent/production-agent.js.map +1 -1
  145. package/dist/agent/thread-data-builder.d.ts +2 -0
  146. package/dist/agent/thread-data-builder.d.ts.map +1 -1
  147. package/dist/agent/thread-data-builder.js +3 -0
  148. package/dist/agent/thread-data-builder.js.map +1 -1
  149. package/dist/chat-threads/migrations.d.ts +21 -0
  150. package/dist/chat-threads/migrations.d.ts.map +1 -0
  151. package/dist/chat-threads/migrations.js +45 -0
  152. package/dist/chat-threads/migrations.js.map +1 -0
  153. package/dist/cli/create.d.ts.map +1 -1
  154. package/dist/cli/create.js +4 -0
  155. package/dist/cli/create.js.map +1 -1
  156. package/dist/cli/skills-content/design-visual-edit-skill.d.ts +1 -1
  157. package/dist/cli/skills-content/design-visual-edit-skill.d.ts.map +1 -1
  158. package/dist/cli/skills-content/design-visual-edit-skill.js +36 -16
  159. package/dist/cli/skills-content/design-visual-edit-skill.js.map +1 -1
  160. package/dist/cli/skills.d.ts.map +1 -1
  161. package/dist/cli/skills.js +15 -0
  162. package/dist/cli/skills.js.map +1 -1
  163. package/dist/client/AgentPanel.d.ts.map +1 -1
  164. package/dist/client/AgentPanel.js +6 -5
  165. package/dist/client/AgentPanel.js.map +1 -1
  166. package/dist/client/AssistantChat.d.ts +37 -0
  167. package/dist/client/AssistantChat.d.ts.map +1 -1
  168. package/dist/client/AssistantChat.js +41 -8
  169. package/dist/client/AssistantChat.js.map +1 -1
  170. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  171. package/dist/client/MultiTabAssistantChat.js +11 -10
  172. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  173. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  174. package/dist/client/agent-chat-adapter.js +19 -3
  175. package/dist/client/agent-chat-adapter.js.map +1 -1
  176. package/dist/client/analytics.d.ts.map +1 -1
  177. package/dist/client/analytics.js +150 -101
  178. package/dist/client/analytics.js.map +1 -1
  179. package/dist/client/chat/message-components.d.ts +2 -1
  180. package/dist/client/chat/message-components.d.ts.map +1 -1
  181. package/dist/client/chat/message-components.js +11 -4
  182. package/dist/client/chat/message-components.js.map +1 -1
  183. package/dist/client/chat/runtime.d.ts.map +1 -1
  184. package/dist/client/chat/runtime.js +2 -1
  185. package/dist/client/chat/runtime.js.map +1 -1
  186. package/dist/client/chat/tool-call-display.d.ts +4 -1
  187. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  188. package/dist/client/chat/tool-call-display.js +14 -8
  189. package/dist/client/chat/tool-call-display.js.map +1 -1
  190. package/dist/client/chat-model-groups.d.ts.map +1 -1
  191. package/dist/client/chat-model-groups.js +3 -0
  192. package/dist/client/chat-model-groups.js.map +1 -1
  193. package/dist/client/client-status-requests.d.ts +14 -0
  194. package/dist/client/client-status-requests.d.ts.map +1 -0
  195. package/dist/client/client-status-requests.js +126 -0
  196. package/dist/client/client-status-requests.js.map +1 -0
  197. package/dist/client/org/OrgSwitcher.js +2 -2
  198. package/dist/client/org/OrgSwitcher.js.map +1 -1
  199. package/dist/client/settings/VoiceTranscriptionSection.js +1 -1
  200. package/dist/client/settings/VoiceTranscriptionSection.js.map +1 -1
  201. package/dist/client/sse-event-processor.d.ts +7 -0
  202. package/dist/client/sse-event-processor.d.ts.map +1 -1
  203. package/dist/client/sse-event-processor.js +8 -3
  204. package/dist/client/sse-event-processor.js.map +1 -1
  205. package/dist/client/use-agent-engine-configured.d.ts.map +1 -1
  206. package/dist/client/use-agent-engine-configured.js +29 -43
  207. package/dist/client/use-agent-engine-configured.js.map +1 -1
  208. package/dist/client/use-chat-models.d.ts.map +1 -1
  209. package/dist/client/use-chat-models.js +11 -11
  210. package/dist/client/use-chat-models.js.map +1 -1
  211. package/dist/client/use-chat-threads.d.ts.map +1 -1
  212. package/dist/client/use-chat-threads.js +23 -7
  213. package/dist/client/use-chat-threads.js.map +1 -1
  214. package/dist/client/use-session.d.ts.map +1 -1
  215. package/dist/client/use-session.js +4 -4
  216. package/dist/client/use-session.js.map +1 -1
  217. package/dist/collab/awareness.d.ts +2 -2
  218. package/dist/collab/awareness.d.ts.map +1 -1
  219. package/dist/db/client.d.ts.map +1 -1
  220. package/dist/db/client.js +48 -4
  221. package/dist/db/client.js.map +1 -1
  222. package/dist/db/ensure-additive-columns.d.ts.map +1 -1
  223. package/dist/db/ensure-additive-columns.js +32 -21
  224. package/dist/db/ensure-additive-columns.js.map +1 -1
  225. package/dist/db/migrations.d.ts +9 -0
  226. package/dist/db/migrations.d.ts.map +1 -1
  227. package/dist/db/migrations.js +14 -3
  228. package/dist/db/migrations.js.map +1 -1
  229. package/dist/file-upload/actions/upload-image.d.ts +1 -1
  230. package/dist/mcp/approval-store.d.ts +16 -0
  231. package/dist/mcp/approval-store.d.ts.map +1 -0
  232. package/dist/mcp/approval-store.js +85 -0
  233. package/dist/mcp/approval-store.js.map +1 -0
  234. package/dist/mcp/build-server.d.ts +1 -34
  235. package/dist/mcp/build-server.d.ts.map +1 -1
  236. package/dist/mcp/build-server.js +220 -23
  237. package/dist/mcp/build-server.js.map +1 -1
  238. package/dist/mcp/embed-app.js +1 -1
  239. package/dist/mcp/embed-app.js.map +1 -1
  240. package/dist/mcp/oauth-client-metadata.d.ts +15 -0
  241. package/dist/mcp/oauth-client-metadata.d.ts.map +1 -0
  242. package/dist/mcp/oauth-client-metadata.js +297 -0
  243. package/dist/mcp/oauth-client-metadata.js.map +1 -0
  244. package/dist/mcp/oauth-route.d.ts.map +1 -1
  245. package/dist/mcp/oauth-route.js +39 -53
  246. package/dist/mcp/oauth-route.js.map +1 -1
  247. package/dist/mcp/screen-memory-stdio.d.ts.map +1 -1
  248. package/dist/mcp/screen-memory-stdio.js +304 -296
  249. package/dist/mcp/screen-memory-stdio.js.map +1 -1
  250. package/dist/mcp/server.d.ts +12 -25
  251. package/dist/mcp/server.d.ts.map +1 -1
  252. package/dist/mcp/server.js +24 -133
  253. package/dist/mcp/server.js.map +1 -1
  254. package/dist/mcp/stdio.d.ts.map +1 -1
  255. package/dist/mcp/stdio.js +36 -35
  256. package/dist/mcp/stdio.js.map +1 -1
  257. package/dist/mcp-client/manager.d.ts.map +1 -1
  258. package/dist/mcp-client/manager.js +6 -6
  259. package/dist/mcp-client/manager.js.map +1 -1
  260. package/dist/mcp-client/oauth-client.d.ts +13 -17
  261. package/dist/mcp-client/oauth-client.d.ts.map +1 -1
  262. package/dist/mcp-client/oauth-client.js +74 -16
  263. package/dist/mcp-client/oauth-client.js.map +1 -1
  264. package/dist/mcp-client/oauth-routes.d.ts +2 -2
  265. package/dist/mcp-client/oauth-routes.d.ts.map +1 -1
  266. package/dist/mcp-client/oauth-routes.js +16 -6
  267. package/dist/mcp-client/oauth-routes.js.map +1 -1
  268. package/dist/mcp-client/routes.js +5 -5
  269. package/dist/mcp-client/routes.js.map +1 -1
  270. package/dist/observability/routes.d.ts +3 -3
  271. package/dist/progress/routes.d.ts +1 -1
  272. package/dist/provider-api/actions/custom-provider-registration.d.ts +14 -14
  273. package/dist/provider-api/actions/provider-api.d.ts +8 -8
  274. package/dist/resources/handlers.d.ts +1 -1
  275. package/dist/secrets/routes.d.ts +9 -9
  276. package/dist/server/agent-capabilities.d.ts.map +1 -1
  277. package/dist/server/agent-capabilities.js +21 -0
  278. package/dist/server/agent-capabilities.js.map +1 -1
  279. package/dist/server/agent-chat/action-filters-a2a.d.ts +14 -0
  280. package/dist/server/agent-chat/action-filters-a2a.d.ts.map +1 -1
  281. package/dist/server/agent-chat/action-filters-a2a.js +16 -0
  282. package/dist/server/agent-chat/action-filters-a2a.js.map +1 -1
  283. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  284. package/dist/server/agent-chat-plugin.js +11 -1
  285. package/dist/server/agent-chat-plugin.js.map +1 -1
  286. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  287. package/dist/server/realtime-token.d.ts +1 -1
  288. package/dist/server/transcribe-voice.d.ts +1 -1
  289. package/dist/server/transcribe-voice.js +12 -6
  290. package/dist/server/transcribe-voice.js.map +1 -1
  291. package/dist/templates/chat/.agents/skills/security/SKILL.md +13 -2
  292. package/dist/templates/chat/README.md +0 -2
  293. package/dist/templates/default/.agents/skills/security/SKILL.md +13 -2
  294. package/dist/templates/workspace-core/.agents/skills/authentication/SKILL.md +5 -2
  295. package/dist/templates/workspace-core/.agents/skills/external-agents/SKILL.md +18 -0
  296. package/dist/templates/workspace-core/.agents/skills/security/SKILL.md +13 -2
  297. package/docs/content/template-design-collaboration-and-full-apps.mdx +3 -1
  298. package/package.json +7 -4
  299. package/src/a2a/client.ts +18 -4
  300. package/src/a2a/server.ts +19 -3
  301. package/src/a2a/types.ts +7 -0
  302. package/src/action.ts +43 -16
  303. package/src/agent/engine/ai-sdk-engine.ts +14 -10
  304. package/src/agent/production-agent.ts +41 -3
  305. package/src/agent/thread-data-builder.ts +5 -0
  306. package/src/chat-threads/migrations.ts +53 -0
  307. package/src/cli/create.ts +4 -0
  308. package/src/cli/skills-content/design-visual-edit-skill.ts +36 -16
  309. package/src/cli/skills.ts +16 -0
  310. package/src/client/AgentPanel.tsx +9 -5
  311. package/src/client/AssistantChat.tsx +138 -46
  312. package/src/client/MultiTabAssistantChat.tsx +16 -10
  313. package/src/client/agent-chat-adapter.ts +21 -3
  314. package/src/client/analytics.ts +159 -102
  315. package/src/client/chat/message-components.tsx +12 -5
  316. package/src/client/chat/runtime.ts +2 -1
  317. package/src/client/chat/tool-call-display.tsx +25 -2
  318. package/src/client/chat-model-groups.ts +3 -0
  319. package/src/client/client-status-requests.ts +161 -0
  320. package/src/client/org/OrgSwitcher.tsx +4 -4
  321. package/src/client/settings/VoiceTranscriptionSection.tsx +2 -2
  322. package/src/client/sse-event-processor.ts +15 -3
  323. package/src/client/use-agent-engine-configured.ts +54 -50
  324. package/src/client/use-chat-models.ts +16 -11
  325. package/src/client/use-chat-threads.ts +32 -9
  326. package/src/client/use-session.ts +4 -5
  327. package/src/db/client.ts +83 -8
  328. package/src/db/ensure-additive-columns.ts +31 -20
  329. package/src/db/migrations.ts +22 -2
  330. package/src/mcp/approval-store.ts +99 -0
  331. package/src/mcp/build-server.ts +579 -303
  332. package/src/mcp/embed-app.ts +1 -1
  333. package/src/mcp/oauth-client-metadata.ts +380 -0
  334. package/src/mcp/oauth-route.ts +57 -52
  335. package/src/mcp/screen-memory-stdio.ts +400 -378
  336. package/src/mcp/server.ts +29 -145
  337. package/src/mcp/stdio.ts +72 -80
  338. package/src/mcp-client/manager.ts +6 -10
  339. package/src/mcp-client/oauth-client.ts +127 -36
  340. package/src/mcp-client/oauth-routes.ts +16 -6
  341. package/src/mcp-client/routes.ts +6 -5
  342. package/src/server/agent-capabilities.ts +20 -0
  343. package/src/server/agent-chat/action-filters-a2a.ts +27 -0
  344. package/src/server/agent-chat-plugin.ts +18 -0
  345. package/src/server/transcribe-voice.ts +14 -5
  346. package/src/templates/chat/.agents/skills/security/SKILL.md +13 -2
  347. package/src/templates/chat/README.md +0 -2
  348. package/src/templates/default/.agents/skills/security/SKILL.md +13 -2
  349. package/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +5 -2
  350. package/src/templates/workspace-core/.agents/skills/external-agents/SKILL.md +18 -0
  351. package/src/templates/workspace-core/.agents/skills/security/SKILL.md +13 -2
@@ -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 { 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 queryScreenMemoryContextForStore(\n args: Parameters<typeof queryScreenMemoryContext>[0],\n storeDir: string,\n env: NodeJS.ProcessEnv,\n) {\n return queryScreenMemoryContext(args, {\n homeDir: env.HOME,\n env: {\n ...env,\n AGENT_NATIVE_SCREEN_MEMORY_DIR: storeDir,\n AGENT_NATIVE_SCREEN_MEMORY_CONFIG: path.join(\n path.dirname(storeDir),\n \"feature-config.json\",\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 queryScreenMemoryContextForStore(\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 storeDir,\n env,\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"]}
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 queryScreenMemoryContextForStore(\n args: Parameters<typeof queryScreenMemoryContext>[0],\n storeDir: string,\n env: NodeJS.ProcessEnv,\n) {\n return queryScreenMemoryContext(args, {\n homeDir: env.HOME,\n env: {\n ...env,\n AGENT_NATIVE_SCREEN_MEMORY_DIR: storeDir,\n AGENT_NATIVE_SCREEN_MEMORY_CONFIG: path.join(\n path.dirname(storeDir),\n \"feature-config.json\",\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/server\");\n const { serveStdio } = await import(\"@modelcontextprotocol/server/stdio\");\n\n const stdio = serveStdio(\n () => {\n const server = new Server(\n { name: \"clips-screen-memory\", version: \"0.1.0\" },\n { capabilities: { tools: {} } },\n );\n\n server.setRequestHandler(\n \"tools/list\",\n async () =>\n ({\n tools: screenMemoryMcpToolDefinitions(),\n }) as any,\n );\n\n server.setRequestHandler(\"tools/call\", async (request: any) => {\n const name = request.params?.name;\n const args = (request.params?.arguments ?? {}) as Record<\n string,\n unknown\n >;\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 queryScreenMemoryContextForStore(\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 storeDir,\n env,\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) &&\n 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(\n (candidate) => candidate.indexState === \"partial\",\n )\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 (\n !startAt ||\n !endAt ||\n !isTimestamp(startAt) ||\n !isTimestamp(endAt)\n )\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(\n \"A Rewind contact sheet cannot include future time.\",\n );\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 }) => ({\n timestamp,\n segmentId,\n })),\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 return server;\n },\n { legacy: \"serve\" },\n );\n\n log(`Serving local Screen Memory from ${storeDir}`);\n await new Promise<void>((resolve) => {\n process.stdin.once(\"end\", resolve);\n process.once(\"SIGINT\", resolve);\n process.once(\"SIGTERM\", resolve);\n });\n await stdio.close();\n}\n"]}
@@ -5,29 +5,20 @@ export type { MCPConfig, MCPCallerIdentity, MCPRequestMeta };
5
5
  /**
6
6
  * Handle a single `{routePrefix}/mcp` request on either runtime.
7
7
  *
8
- * - **Default path:** build the SAME MCP `Server`
9
- * from the SAME config + identity, drive it through the SDK's
10
- * `WebStandardStreamableHTTPServerTransport` (which the Node transport is
11
- * itself just a thin wrapper around), and return the resulting Web
12
- * `Response` as a normal h3 return value. This is used for Nitro local dev
13
- * too; the direct Node writer can otherwise race h3 and double-write.
14
- * - **Opt-in Node fast-path:** set `AGENT_NATIVE_MCP_NODE_FAST_PATH=1` to
15
- * delegate directly to the SDK's `StreamableHTTPServerTransport`.
8
+ * Builds one request-scoped MCP `Server` from the verified caller identity and
9
+ * drives it through the SDK's v2 `createMcpHandler`. That entry serves native
10
+ * 2026-07-28 envelopes and stateless 2025-era traffic from the same factory,
11
+ * so protocol generations cannot drift apart.
16
12
  *
17
- * Auth, the `runWithRequestContext` identity wrap, the deep-link `_meta` /
18
- * markdown append, `requestMeta` origin/target derivation and the stateless
19
- * semantics are IDENTICAL on both paths because both build the same server
20
- * via `createMCPServerForRequest` and both transports funnel into the same
21
- * `WebStandardStreamableHTTPServerTransport.handleRequest(webRequest, {
22
- * parsedBody })` with the same options.
13
+ * The handler is Web Standard on every runtime. H3 owns the Node response when
14
+ * one exists, avoiding the double-write race from a transport writing directly
15
+ * to `node.res`.
23
16
  *
24
17
  * Returns:
25
18
  * - `undefined` when the request targets a sub-route (so management/status
26
19
  * routes mounted under `/_agent-native/mcp/*` handle it themselves) — the
27
20
  * h3 mount falls through to the next handler.
28
- * - a Web `Response` (web fallback) or a string/object (Node path /
29
- * auth-error path) otherwise. The Node path also sets `_handled` so h3
30
- * doesn't double-write.
21
+ * - a Web `Response` or an auth-error object otherwise.
31
22
  */
32
23
  export declare function handleMcpRequest(event: H3Event, config: MCPConfig): Promise<Response | string | {
33
24
  error: string;
@@ -38,14 +29,10 @@ export declare function handleMcpRequest(event: H3Event, config: MCPConfig): Pro
38
29
  * Endpoints: `/mcp` (public) and `/_agent-native/mcp` (compatibility).
39
30
  * A custom route prefix only mounts that custom endpoint.
40
31
  *
41
- * Uses stateless Streamable HTTP transport no in-memory sessions, JSON
42
- * request/response (no SSE), and no standalone GET stream, so it survives
43
- * serverless instances that freeze between invocations (SSE framing there
44
- * drops the result and clients report "session expired"). Runtime-agnostic: a real Node
45
- * server uses the SDK's Node transport; the web-standard runtime (Nitro 3 /
46
- * Netlify web runtime, Cloudflare, Deno, Bun) uses the SDK's web-standard
47
- * transport. Both build the same server and produce identical JSON-RPC
48
- * output.
32
+ * Uses the v2 Web Standard per-request handler with native 2026-07-28 serving
33
+ * and stateless 2025-era fallback. It carries no in-memory protocol session
34
+ * across invocations and works unchanged on Node, Nitro/Netlify web runtimes,
35
+ * Cloudflare, Deno, and Bun.
49
36
  *
50
37
  * Auth: Bearer token matching ACCESS_TOKEN/ACCESS_TOKENS or JWT via A2A_SECRET.
51
38
  * No auth required when neither is configured (dev mode).
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAalC,OAAO,EACL,yBAAyB,EACzB,UAAU,EACV,eAAe,EACf,sBAAsB,EACtB,kBAAkB,EAClB,KAAK,SAAS,EACd,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACpB,MAAM,mBAAmB,CAAC;AAiB3B,OAAO,EACL,yBAAyB,EACzB,UAAU,EACV,eAAe,EACf,sBAAsB,EACtB,kBAAkB,GACnB,CAAC;AACF,YAAY,EAAE,SAAS,EAAE,iBAAiB,EAAE,cAAc,EAAE,CAAC;AA+M7D;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,SAAS,GAChB,OAAO,CACR,QAAQ,GAAG,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAC5E,CAgLA;AAMD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,QAAQ,CACtB,QAAQ,EAAE,GAAG,EACb,MAAM,EAAE,SAAS,EACjB,WAAW,SAAmB,GAC7B,IAAI,CAiBN"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAalC,OAAO,EACL,yBAAyB,EACzB,UAAU,EACV,eAAe,EACf,sBAAsB,EACtB,kBAAkB,EAClB,KAAK,SAAS,EACd,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACpB,MAAM,mBAAmB,CAAC;AAiB3B,OAAO,EACL,yBAAyB,EACzB,UAAU,EACV,eAAe,EACf,sBAAsB,EACtB,kBAAkB,GACnB,CAAC;AACF,YAAY,EAAE,SAAS,EAAE,iBAAiB,EAAE,cAAc,EAAE,CAAC;AAoL7D;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,SAAS,GAChB,OAAO,CACR,QAAQ,GAAG,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAC5E,CAoGA;AAMD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,QAAQ,CACtB,QAAQ,EAAE,GAAG,EACb,MAAM,EAAE,SAAS,EACjB,WAAW,SAAmB,GAC7B,IAAI,CAiBN"}