@agent-native/core 0.122.3 → 0.122.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/corpus/README.md +1 -1
- package/corpus/core/CHANGELOG.md +6 -0
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/cli/index.ts +2 -1
- package/corpus/core/src/cli/mcp.ts +13 -3
- package/corpus/core/src/cli/skills-content/rewind-skill.ts +36 -4
- package/corpus/core/src/cli/skills.ts +250 -37
- package/corpus/core/src/cli/telemetry-routing.ts +57 -0
- package/corpus/core/src/cli/telemetry.ts +3 -3
- package/corpus/core/src/mcp/screen-memory-stdio.ts +21 -2
- package/dist/cli/index.js +3 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/mcp.d.ts.map +1 -1
- package/dist/cli/mcp.js +12 -3
- package/dist/cli/mcp.js.map +1 -1
- package/dist/cli/skills-content/rewind-skill.d.ts +1 -1
- package/dist/cli/skills-content/rewind-skill.d.ts.map +1 -1
- package/dist/cli/skills-content/rewind-skill.js +36 -4
- package/dist/cli/skills-content/rewind-skill.js.map +1 -1
- package/dist/cli/skills.d.ts +2 -0
- package/dist/cli/skills.d.ts.map +1 -1
- package/dist/cli/skills.js +191 -40
- package/dist/cli/skills.js.map +1 -1
- package/dist/cli/telemetry-routing.d.ts +2 -0
- package/dist/cli/telemetry-routing.d.ts.map +1 -0
- package/dist/cli/telemetry-routing.js +54 -0
- package/dist/cli/telemetry-routing.js.map +1 -0
- package/dist/cli/telemetry.js +3 -3
- package/dist/cli/telemetry.js.map +1 -1
- package/dist/collab/routes.d.ts +1 -1
- package/dist/collab/struct-routes.d.ts +1 -1
- package/dist/file-upload/actions/upload-image.d.ts +1 -1
- package/dist/mcp/screen-memory-stdio.d.ts +2 -0
- package/dist/mcp/screen-memory-stdio.d.ts.map +1 -1
- package/dist/mcp/screen-memory-stdio.js +12 -2
- package/dist/mcp/screen-memory-stdio.js.map +1 -1
- package/dist/observability/routes.d.ts +1 -1
- package/dist/progress/routes.d.ts +1 -1
- package/package.json +1 -1
- package/src/cli/index.ts +2 -1
- package/src/cli/mcp.ts +13 -3
- package/src/cli/skills-content/rewind-skill.ts +36 -4
- package/src/cli/skills.ts +250 -37
- package/src/cli/telemetry-routing.ts +57 -0
- package/src/cli/telemetry.ts +3 -3
- package/src/mcp/screen-memory-stdio.ts +21 -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 runScreenMemoryMCPStdio(\n opts: RunScreenMemoryMCPStdioOptions = {},\n): Promise<void> {\n const env = opts.env ?? process.env;\n const storeDir = opts.storeDir ?? defaultStoreDir(env);\n\n const { Server } = await import(\"@modelcontextprotocol/sdk/server/index.js\");\n const { StdioServerTransport } =\n await import(\"@modelcontextprotocol/sdk/server/stdio.js\");\n const { CallToolRequestSchema, ListToolsRequestSchema } =\n await import(\"@modelcontextprotocol/sdk/types.js\");\n\n const server = new Server(\n { name: \"clips-screen-memory\", version: \"0.1.0\" },\n { capabilities: { tools: {} } },\n );\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: screenMemoryMcpToolDefinitions(),\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request: any) => {\n const name = request.params?.name;\n const args = (request.params?.arguments ?? {}) as Record<string, unknown>;\n if (name === \"screen_memory_status\") {\n const config = readFeatureConfig(storeDir);\n const segments = recentSegments(storeDir, 24 * 60);\n return textResult({\n enabled: config.enabled === true,\n paused: config.paused === true,\n retentionHours: config.retentionHours ?? 24,\n maxBytes: config.maxBytes ?? 20 * 1024 * 1024 * 1024,\n segmentCount: segments.length,\n totalBytes: segments.reduce(\n (sum, segment) => sum + (segment.bytes || 0),\n 0,\n ),\n note: \"The Screen Memory store is connected. Local archive paths are intentionally not exposed to agents.\",\n });\n }\n if (name === \"screen_memory_recent_context\") {\n const result = await queryScreenMemoryContext(\n {\n query: typeof args.query === \"string\" ? args.query : undefined,\n sinceMinutes:\n typeof args.minutes === \"number\" ? args.minutes : undefined,\n limit: typeof args.limit === \"number\" ? args.limit : undefined,\n },\n { env: { ...env, AGENT_NATIVE_SCREEN_MEMORY_DIR: storeDir } },\n );\n const sanitizedEvidence = result.evidence.map((item) => ({\n ...item,\n excerpt: redactCredentialText(item.excerpt),\n }));\n const sanitizedItems = result.items.map((item) => ({\n ...item,\n text: redactCredentialText(item.text),\n sourceFile: \"local-screen-memory\",\n }));\n const requestId = `egress-mcp-${Date.now()}-${process.pid}`;\n const packet = {\n question:\n typeof args.query === \"string\" && args.query.trim()\n ? redactCredentialText(args.query.trim().slice(0, 4_000))\n : \"Recent Screen Memory context\",\n evidence: sanitizedEvidence.slice(0, 20).map((item) => ({\n id: item.id,\n momentId: item.momentId,\n sourceType: item.sourceType,\n capturedAt: item.capturedAt,\n excerpt: item.excerpt.slice(0, 1_200),\n })),\n };\n appendEgressReceipt(\n storeDir,\n requestId,\n \"recent-context\",\n packet.evidence,\n );\n return textResult(\n // Keep the old MCP envelope available while adding the typed contract.\n {\n events: sanitizedItems,\n ...result,\n items: sanitizedItems,\n evidence: sanitizedEvidence,\n contextFiles: [],\n egress: {\n requestId,\n packet,\n note: \"A content-free local activity receipt was recorded before this bounded text packet was returned.\",\n },\n },\n );\n }\n if (name === \"screen_memory_recent_segments\") {\n const minutes = typeof args.minutes === \"number\" ? args.minutes : 30;\n const segments = recentSegments(storeDir, minutes);\n const requestId = `egress-mcp-${Date.now()}-${process.pid}`;\n const packet = {\n question: `List recent Rewind segment references from the previous ${Math.max(1, Math.min(minutes, 24 * 60))} minutes`,\n evidence: segments.slice(0, 20).map((segment) => ({\n id: segment.id,\n momentId: `segment:${segment.id}`,\n sourceType: \"app-context\",\n capturedAt: segment.startedAt,\n excerpt: `Local media segment reference from ${segment.startedAt} to ${segment.endedAt}; media path and bytes were not exposed.`,\n })),\n };\n appendEgressReceipt(\n storeDir,\n requestId,\n \"recent-segments\",\n packet.evidence,\n );\n return textResult({\n localOnly: true,\n mediaApprovalRequired: true,\n segments: segments.map((segment) => ({\n id: segment.id,\n startedAt: segment.startedAt,\n endedAt: segment.endedAt,\n mimeType: segment.mimeType,\n durationMs: segment.durationMs,\n })),\n egress: {\n requestId,\n packet,\n note: \"A content-free local activity receipt was recorded before this bounded metadata packet was returned.\",\n },\n });\n }\n if (name === \"screen_memory_search_chapters\") {\n if (typeof args.query !== \"string\" || !args.query.trim())\n throw new Error(\"query is required.\");\n const document = readScreenMemoryChapters(storeDir);\n if (!document)\n throw new Error(\n \"No valid local Rewind chapters index is available yet.\",\n );\n const minutes =\n typeof args.minutes === \"number\" && Number.isFinite(args.minutes)\n ? Math.max(1, Math.min(Math.trunc(args.minutes), 24 * 60))\n : null;\n const cutoff = minutes ? Date.now() - minutes * 60_000 : null;\n const boundedDocument = cutoff\n ? {\n ...document,\n chapters: document.chapters.filter(\n (chapter) => Date.parse(chapter.endedAt) >= cutoff,\n ),\n }\n : document;\n const candidates = searchScreenMemoryChapters(\n boundedDocument,\n args.query.trim(),\n typeof args.limit === \"number\" ? args.limit : 5,\n typeof args.clientHint === \"string\" ? args.clientHint : undefined,\n );\n const ambiguous =\n candidates.length > 1 &&\n Math.abs(candidates[0].score - candidates[1].score) <= 0.05;\n const packet = {\n question: redactCredentialText(args.query.trim().slice(0, 4_000)),\n evidence: candidates.map((chapter) => ({\n id: chapter.id,\n momentId: chapter.id,\n sourceType: \"chapter\",\n capturedAt: chapter.startedAt,\n excerpt: redactCredentialText(\n `${chapter.label}: ${chapter.summary}`,\n ).slice(0, 1_200),\n })),\n };\n const requestId = `egress-mcp-${Date.now()}-${process.pid}`;\n appendEgressReceipt(\n storeDir,\n requestId,\n \"search-chapters\",\n packet.evidence,\n );\n return textResult({\n localOnly: true,\n generatedAt: document.generatedAt,\n state: document.state,\n coverage: document.coverage,\n gaps:\n isRecord(document.coverage) && Array.isArray(document.coverage.gaps)\n ? document.coverage.gaps\n : [],\n indexState: candidates.some(\n (candidate) => candidate.indexState === \"pending\",\n )\n ? \"pending\"\n : candidates.some((candidate) => candidate.indexState === \"partial\")\n ? \"partial\"\n : \"ready\",\n ambiguous,\n candidates: candidates.map(projectScreenMemoryChapterCandidate),\n egress: {\n requestId,\n packet,\n note: \"A content-free local activity receipt was recorded before this bounded chapter packet was returned.\",\n },\n });\n }\n if (name === \"screen_memory_frame_at\") {\n if (typeof args.timestamp !== \"string\")\n throw new Error(\"timestamp is required.\");\n const frame = readScreenMemoryFrame(\n storeDir,\n args.timestamp,\n opts.decodeFrame ?? decodeFrameWithFfmpeg,\n );\n appendLocalEvidenceReceipt(storeDir, \"frame-at\", [\n { timestamp: frame.timestamp, segmentId: frame.segmentId },\n ]);\n return {\n content: [\n {\n type: \"text\" as const,\n text: JSON.stringify({\n localOnly: true,\n timestamp: frame.timestamp,\n segmentId: frame.segmentId,\n coverage: \"retained clean segment\",\n note: \"This is a bounded local image read. Request screen_memory_request_clip for motion or audio.\",\n }),\n },\n frame.image,\n ],\n };\n }\n if (name === \"screen_memory_contact_sheet\") {\n const document = readScreenMemoryChapters(storeDir);\n const chapter =\n typeof args.chapterId === \"string\"\n ? document?.chapters.find(\n (candidate) => candidate.id === args.chapterId,\n )\n : undefined;\n const startAt =\n chapter?.startedAt ??\n (typeof args.startAt === \"string\" ? args.startAt : null);\n const endAt =\n chapter?.endedAt ??\n (typeof args.endAt === \"string\" ? args.endAt : null);\n if (!startAt || !endAt || !isTimestamp(startAt) || !isTimestamp(endAt))\n throw new Error(\n \"Provide a valid chapterId or RFC3339 startAt and endAt.\",\n );\n const durationMs = Date.parse(endAt) - Date.parse(startAt);\n if (!contactSheetRangeIsValid(durationMs, Boolean(chapter)))\n throw new Error(\n \"A contact sheet range must be between zero and five minutes.\",\n );\n if (Date.parse(endAt) > Date.now() + 5_000)\n throw new Error(\"A Rewind contact sheet cannot include future time.\");\n const count = Math.min(\n Math.max(\n Math.trunc(typeof args.count === \"number\" ? args.count : 4),\n 1,\n ),\n 8,\n );\n const representative = (chapter?.representativeMoments ?? [])\n .filter(\n (moment) =>\n Date.parse(moment.capturedAt) >= Date.parse(startAt) &&\n Date.parse(moment.capturedAt) <= Date.parse(endAt),\n )\n .map((moment) => moment.capturedAt);\n const timestamps = selectContactSheetTimestamps(\n startAt,\n endAt,\n count,\n representative,\n );\n const decoder = opts.decodeFrame ?? decodeFrameWithFfmpeg;\n const frames = timestamps.flatMap((timestamp) => {\n try {\n return [readScreenMemoryFrame(storeDir, timestamp, decoder)];\n } catch {\n // A chapter may span a brief coverage gap. Keep the clean retained\n // frames instead of failing the entire bounded contact sheet.\n return [];\n }\n });\n if (frames.length === 0) {\n throw new Error(\n \"No clean retained Rewind frames cover the requested contact-sheet range.\",\n );\n }\n appendLocalEvidenceReceipt(\n storeDir,\n \"contact-sheet\",\n frames.map(({ timestamp, segmentId }) => ({ timestamp, segmentId })),\n );\n return {\n content: [\n {\n type: \"text\" as const,\n text: JSON.stringify({\n localOnly: true,\n chapterId: chapter?.id ?? null,\n startAt: new Date(Date.parse(startAt)).toISOString(),\n endAt: new Date(Date.parse(endAt)).toISOString(),\n frameCount: frames.length,\n selection: representative.length\n ? \"representative moments then even coverage\"\n : \"even temporal coverage\",\n frames: frames.map(({ timestamp, segmentId }) => ({\n timestamp,\n segmentId,\n })),\n }),\n },\n ...frames.map((frame) => frame.image),\n ],\n };\n }\n if (name === \"screen_memory_request_clip\") {\n const range = parseHandoffRange(args);\n const config = readFeatureConfig(storeDir);\n const requestId = `handoff-${randomUUID()}`;\n const reason =\n typeof args.reason === \"string\"\n ? redactCredentialText(args.reason.trim().slice(0, 500))\n : \"Visual or audio context requested by the agent\";\n const request = {\n requestId,\n status: \"pending\",\n requestedAt: new Date().toISOString(),\n ...range,\n reason,\n includeMicrophone: args.includeMicrophone !== false,\n includeSystemAudio: args.includeSystemAudio !== false,\n reviewRequired: config.reviewBeforeSending !== false,\n agentClipRetention: config.agentClipRetention ?? \"forever\",\n };\n writePrivateJson(handoffPath(storeDir, requestId), request);\n appendEgressEvent(storeDir, {\n requestId,\n occurredAt: request.requestedAt,\n state: \"handoff-requested\",\n operation: \"request-clip\",\n receipt: {\n mediaInterval: { startAt: range.startAt, endAt: range.endAt },\n reviewRequired: request.reviewRequired,\n },\n evidenceCount: 0,\n packetBytes: 0,\n error: null,\n });\n return textResult({\n requestId,\n status: \"pending\",\n startAt: range.startAt,\n endAt: range.endAt,\n reviewRequired: request.reviewRequired,\n note: request.reviewRequired\n ? \"Clips is waiting for the user to review this bounded range. Poll screen_memory_handoff_status.\"\n : \"Clips is processing the explicitly requested bounded range. Poll screen_memory_handoff_status.\",\n });\n }\n if (name === \"screen_memory_handoff_status\") {\n if (typeof args.requestId !== \"string\") {\n throw new Error(\"requestId is required.\");\n }\n const parsed = JSON.parse(\n fs.readFileSync(handoffPath(storeDir, args.requestId), \"utf-8\"),\n ) as Record<string, unknown>;\n return textResult({\n requestId: parsed.requestId,\n status: parsed.status,\n startAt: parsed.startAt,\n endAt: parsed.endAt,\n recordingId: parsed.recordingId,\n agentUrl: parsed.agentUrl,\n contextUrl: parsed.contextUrl,\n expiresAt: parsed.expiresAt,\n autoDeleteAt: parsed.autoDeleteAt,\n autoDeletedAt: parsed.autoDeletedAt,\n error: parsed.error,\n });\n }\n throw new Error(`Unknown Screen Memory tool: ${name}`);\n });\n\n log(`Serving local Screen Memory from ${storeDir}`);\n const transport = new StdioServerTransport();\n await server.connect(transport);\n await new Promise<void>((resolve) => {\n transport.onclose = resolve;\n process.once(\"SIGINT\", resolve);\n process.once(\"SIGTERM\", resolve);\n });\n}\n"]}
|
|
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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-native/core",
|
|
3
|
-
"version": "0.122.
|
|
3
|
+
"version": "0.122.4",
|
|
4
4
|
"description": "Framework for agent-native application development — where AI agents and UI share SQL state, actions, and context",
|
|
5
5
|
"homepage": "https://github.com/BuilderIO/agent-native#readme",
|
|
6
6
|
"bugs": {
|
package/src/cli/index.ts
CHANGED
|
@@ -9,6 +9,7 @@ import { fileURLToPath } from "url";
|
|
|
9
9
|
import * as Sentry from "@sentry/node";
|
|
10
10
|
|
|
11
11
|
import { resolveDeployPostBuildInvocation } from "./deploy-build.js";
|
|
12
|
+
import { shouldTrackCliRun } from "./telemetry-routing.js";
|
|
12
13
|
import { createCliTelemetry } from "./telemetry.js";
|
|
13
14
|
|
|
14
15
|
// Resolve version once at module scope — used by both --version and --help
|
|
@@ -604,7 +605,7 @@ function runBuildStep(
|
|
|
604
605
|
});
|
|
605
606
|
}
|
|
606
607
|
|
|
607
|
-
trackCli("cli.run");
|
|
608
|
+
if (shouldTrackCliRun(command, args)) trackCli("cli.run");
|
|
608
609
|
|
|
609
610
|
switch (command) {
|
|
610
611
|
case "dev": {
|
package/src/cli/mcp.ts
CHANGED
|
@@ -92,6 +92,15 @@ export interface ScreenMemoryStoreResolutionOptions {
|
|
|
92
92
|
homeDir?: string;
|
|
93
93
|
}
|
|
94
94
|
|
|
95
|
+
function existingScreenMemoryStore(candidate: string): string | undefined {
|
|
96
|
+
const resolved = path.resolve(candidate);
|
|
97
|
+
try {
|
|
98
|
+
return fs.statSync(resolved).isDirectory() ? resolved : undefined;
|
|
99
|
+
} catch {
|
|
100
|
+
return undefined;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
95
104
|
/**
|
|
96
105
|
* Resolve the active Clips store without asking people to find an app-data
|
|
97
106
|
* path. Environment overrides remain the unambiguous escape hatch; otherwise
|
|
@@ -100,11 +109,12 @@ export interface ScreenMemoryStoreResolutionOptions {
|
|
|
100
109
|
export function resolveScreenMemoryStoreDir(
|
|
101
110
|
options: ScreenMemoryStoreResolutionOptions = {},
|
|
102
111
|
): string | undefined {
|
|
103
|
-
if (options.explicitDir)
|
|
112
|
+
if (options.explicitDir)
|
|
113
|
+
return existingScreenMemoryStore(options.explicitDir);
|
|
104
114
|
const env = options.env ?? process.env;
|
|
105
115
|
const override =
|
|
106
116
|
env.CLIPS_SCREEN_MEMORY_DIR || env.AGENT_NATIVE_SCREEN_MEMORY_DIR;
|
|
107
|
-
if (override) return
|
|
117
|
+
if (override) return existingScreenMemoryStore(override);
|
|
108
118
|
|
|
109
119
|
const platform = options.platform ?? process.platform;
|
|
110
120
|
const home = options.homeDir ?? os.homedir();
|
|
@@ -116,7 +126,7 @@ export function resolveScreenMemoryStoreDir(
|
|
|
116
126
|
: env.XDG_DATA_HOME || path.join(home, ".local", "share");
|
|
117
127
|
return ["com.clips.tray", "com.clips.tray.alpha"]
|
|
118
128
|
.map((bundleId) => path.join(appDataRoot, bundleId, "screen-memory"))
|
|
119
|
-
.filter((candidate) =>
|
|
129
|
+
.filter((candidate) => existingScreenMemoryStore(candidate))
|
|
120
130
|
.map((candidate) => ({
|
|
121
131
|
candidate,
|
|
122
132
|
modifiedAt: Math.max(
|
|
@@ -13,6 +13,38 @@ metadata:
|
|
|
13
13
|
Use Clips Rewind as local screen memory. Start broad enough to find the right
|
|
14
14
|
moment, then read only the smallest relevant range.
|
|
15
15
|
|
|
16
|
+
## First-Run Setup
|
|
17
|
+
|
|
18
|
+
Call \`screen_memory_status\` before assuming Rewind is ready. If the tool is
|
|
19
|
+
unavailable, do not stop at a missing-tool error and do not silently install
|
|
20
|
+
anything:
|
|
21
|
+
|
|
22
|
+
1. Explain that Rewind requires the signed Clips Desktop app on macOS plus a
|
|
23
|
+
local agent connection.
|
|
24
|
+
2. Ask whether Clips is installed, or use a non-mutating native application
|
|
25
|
+
lookup when the host supports one. Do not inspect Clips' app-data folders.
|
|
26
|
+
If Clips is absent or its presence cannot be confirmed, ask permission
|
|
27
|
+
before opening or downloading anything: “Clips Desktop is required for
|
|
28
|
+
Rewind. Would you like me to open the official installer and guide you
|
|
29
|
+
through setup?”
|
|
30
|
+
3. Only after affirmative permission, open
|
|
31
|
+
\`https://clips.agent-native.com/download\` in the user's browser. Complete
|
|
32
|
+
native installation steps only when the current host can safely do so and
|
|
33
|
+
the user explicitly permitted them. Never bypass Gatekeeper, accept macOS
|
|
34
|
+
permission prompts, or enable screen/audio capture on the user's behalf.
|
|
35
|
+
4. If native UI control is unavailable, return the download link and wait for
|
|
36
|
+
the user to confirm that Clips is installed and running.
|
|
37
|
+
5. Ask the user to enable Rewind in the Clips tray and choose the intended
|
|
38
|
+
capture mode. Then configure the local connection with:
|
|
39
|
+
|
|
40
|
+
\`npx -y @agent-native/core@latest skills add rewind --client <client> --scope user --yes\`
|
|
41
|
+
|
|
42
|
+
Replace \`<client>\` with the current compatible host: \`codex\`,
|
|
43
|
+
\`claude-code\`, \`cursor\`, \`opencode\`, \`github-copilot\`, or \`cowork\`.
|
|
44
|
+
6. Restart the host only if it cannot reload MCP servers in place, then retry
|
|
45
|
+
\`screen_memory_status\`. Do not claim setup succeeded until it reports
|
|
46
|
+
Rewind enabled and unpaused.
|
|
47
|
+
|
|
16
48
|
## Retrieval Flow
|
|
17
49
|
|
|
18
50
|
1. Call \`screen_memory_status\` first. If the newest segment is still open,
|
|
@@ -41,12 +73,12 @@ moment, then read only the smallest relevant range.
|
|
|
41
73
|
bypass the Screen Memory MCP broker.
|
|
42
74
|
- Do not upload frames returned by local Screen Memory tools.
|
|
43
75
|
- Treat foreground apps and chapter labels as evidence, not proof of intent.
|
|
44
|
-
- If
|
|
45
|
-
|
|
76
|
+
- If Clips is installed and Rewind is enabled but the Screen Memory MCP is
|
|
77
|
+
missing, explain that only the agent connection needs repair with:
|
|
46
78
|
|
|
47
79
|
\`npx -y @agent-native/core@latest skills add rewind --client <client> --scope user --yes\`
|
|
48
80
|
|
|
49
|
-
Replace \`<client>\` with the current compatible host: \`codex\`,
|
|
50
|
-
\`claude-code\`, \`cursor\`, \`opencode\`, \`github-copilot\`, or \`cowork\`.
|
|
51
81
|
Ask the user to restart the host if it cannot reload MCP servers in place.
|
|
82
|
+
- Never conflate installing Clips Desktop with installing the skill/MCP
|
|
83
|
+
connection, and never claim either succeeded without direct evidence.
|
|
52
84
|
`;
|