@peekdev/mcp 0.1.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/NOTICE +10 -0
  2. package/dist/db/index.d.ts +3 -0
  3. package/dist/db/index.d.ts.map +1 -0
  4. package/dist/db/index.js +7 -0
  5. package/dist/db/index.js.map +1 -0
  6. package/dist/db/migrate.d.ts +37 -0
  7. package/dist/db/migrate.d.ts.map +1 -0
  8. package/dist/db/migrate.js +86 -0
  9. package/dist/db/migrate.js.map +1 -0
  10. package/dist/db/migrations/0001_initial.sql +102 -0
  11. package/dist/db/migrations/0002_network_bodies.sql +15 -0
  12. package/dist/db/open.d.ts +57 -0
  13. package/dist/db/open.d.ts.map +1 -0
  14. package/dist/db/open.js +74 -0
  15. package/dist/db/open.js.map +1 -0
  16. package/dist/index.d.ts +10 -0
  17. package/dist/index.d.ts.map +1 -0
  18. package/dist/index.js +58 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/mcp/action-schema.d.ts +223 -0
  21. package/dist/mcp/action-schema.d.ts.map +1 -0
  22. package/dist/mcp/action-schema.js +97 -0
  23. package/dist/mcp/action-schema.js.map +1 -0
  24. package/dist/mcp/event-blobs.d.ts +32 -0
  25. package/dist/mcp/event-blobs.d.ts.map +1 -0
  26. package/dist/mcp/event-blobs.js +65 -0
  27. package/dist/mcp/event-blobs.js.map +1 -0
  28. package/dist/mcp/event-walker.d.ts +86 -0
  29. package/dist/mcp/event-walker.d.ts.map +1 -0
  30. package/dist/mcp/event-walker.js +398 -0
  31. package/dist/mcp/event-walker.js.map +1 -0
  32. package/dist/mcp/host-bridge.d.ts +80 -0
  33. package/dist/mcp/host-bridge.d.ts.map +1 -0
  34. package/dist/mcp/host-bridge.js +88 -0
  35. package/dist/mcp/host-bridge.js.map +1 -0
  36. package/dist/mcp/index.d.ts +8 -0
  37. package/dist/mcp/index.d.ts.map +1 -0
  38. package/dist/mcp/index.js +32 -0
  39. package/dist/mcp/index.js.map +1 -0
  40. package/dist/mcp/playwright-repro.d.ts +19 -0
  41. package/dist/mcp/playwright-repro.d.ts.map +1 -0
  42. package/dist/mcp/playwright-repro.js +78 -0
  43. package/dist/mcp/playwright-repro.js.map +1 -0
  44. package/dist/mcp/queries.d.ts +73 -0
  45. package/dist/mcp/queries.d.ts.map +1 -0
  46. package/dist/mcp/queries.js +139 -0
  47. package/dist/mcp/queries.js.map +1 -0
  48. package/dist/mcp/roots.d.ts +50 -0
  49. package/dist/mcp/roots.d.ts.map +1 -0
  50. package/dist/mcp/roots.js +97 -0
  51. package/dist/mcp/roots.js.map +1 -0
  52. package/dist/mcp/rrweb-types.d.ts +3 -0
  53. package/dist/mcp/rrweb-types.d.ts.map +1 -0
  54. package/dist/mcp/rrweb-types.js +7 -0
  55. package/dist/mcp/rrweb-types.js.map +1 -0
  56. package/dist/mcp/selector.d.ts +54 -0
  57. package/dist/mcp/selector.d.ts.map +1 -0
  58. package/dist/mcp/selector.js +209 -0
  59. package/dist/mcp/selector.js.map +1 -0
  60. package/dist/mcp/server.d.ts +49 -0
  61. package/dist/mcp/server.d.ts.map +1 -0
  62. package/dist/mcp/server.js +469 -0
  63. package/dist/mcp/server.js.map +1 -0
  64. package/dist/mcp/summary.d.ts +26 -0
  65. package/dist/mcp/summary.d.ts.map +1 -0
  66. package/dist/mcp/summary.js +74 -0
  67. package/dist/mcp/summary.js.map +1 -0
  68. package/dist/native-host/action-protocol.d.ts +49 -0
  69. package/dist/native-host/action-protocol.d.ts.map +1 -0
  70. package/dist/native-host/action-protocol.js +36 -0
  71. package/dist/native-host/action-protocol.js.map +1 -0
  72. package/dist/native-host/audit.d.ts +69 -0
  73. package/dist/native-host/audit.d.ts.map +1 -0
  74. package/dist/native-host/audit.js +85 -0
  75. package/dist/native-host/audit.js.map +1 -0
  76. package/dist/native-host/config.d.ts +18 -0
  77. package/dist/native-host/config.d.ts.map +1 -0
  78. package/dist/native-host/config.js +56 -0
  79. package/dist/native-host/config.js.map +1 -0
  80. package/dist/native-host/extension-ids.json +6 -0
  81. package/dist/native-host/host.d.ts +30 -0
  82. package/dist/native-host/host.d.ts.map +1 -0
  83. package/dist/native-host/host.js +96 -0
  84. package/dist/native-host/host.js.map +1 -0
  85. package/dist/native-host/index.d.ts +4 -0
  86. package/dist/native-host/index.d.ts.map +1 -0
  87. package/dist/native-host/index.js +8 -0
  88. package/dist/native-host/index.js.map +1 -0
  89. package/dist/native-host/ingest.d.ts +83 -0
  90. package/dist/native-host/ingest.d.ts.map +1 -0
  91. package/dist/native-host/ingest.js +283 -0
  92. package/dist/native-host/ingest.js.map +1 -0
  93. package/dist/native-host/installer.d.ts +64 -0
  94. package/dist/native-host/installer.d.ts.map +1 -0
  95. package/dist/native-host/installer.js +110 -0
  96. package/dist/native-host/installer.js.map +1 -0
  97. package/dist/native-host/manifest.d.ts +64 -0
  98. package/dist/native-host/manifest.d.ts.map +1 -0
  99. package/dist/native-host/manifest.js +117 -0
  100. package/dist/native-host/manifest.js.map +1 -0
  101. package/dist/native-host/policy.d.ts +60 -0
  102. package/dist/native-host/policy.d.ts.map +1 -0
  103. package/dist/native-host/policy.js +116 -0
  104. package/dist/native-host/policy.js.map +1 -0
  105. package/dist/native-host/request-registry.d.ts +55 -0
  106. package/dist/native-host/request-registry.d.ts.map +1 -0
  107. package/dist/native-host/request-registry.js +111 -0
  108. package/dist/native-host/request-registry.js.map +1 -0
  109. package/dist/native-host/transport.d.ts +54 -0
  110. package/dist/native-host/transport.d.ts.map +1 -0
  111. package/dist/native-host/transport.js +113 -0
  112. package/dist/native-host/transport.js.map +1 -0
  113. package/dist/postinstall.d.ts +3 -0
  114. package/dist/postinstall.d.ts.map +1 -0
  115. package/dist/postinstall.js +72 -0
  116. package/dist/postinstall.js.map +1 -0
  117. package/package.json +59 -0
  118. package/src/db/migrations/0001_initial.sql +102 -0
  119. package/src/db/migrations/0002_network_bodies.sql +15 -0
  120. package/src/native-host/extension-ids.json +6 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/native-host/transport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export declare function runPostinstall(): void;
3
+ //# sourceMappingURL=postinstall.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postinstall.d.ts","sourceRoot":"","sources":["../src/postinstall.ts"],"names":[],"mappings":";AA0CA,wBAAgB,cAAc,IAAI,IAAI,CAgCrC"}
@@ -0,0 +1,72 @@
1
+ #!/usr/bin/env node
2
+ // Postinstall: register the native-messaging host manifest (P2 PRD §A7).
3
+ //
4
+ // CONSENT GATE (P2 PRD §H1 — the April-2026 Hanff/Anthropic precedent): we must
5
+ // NOT silently write files into other vendors' browser directories on `npm
6
+ // install`. So by default this script performs a DRY RUN — it prints exactly
7
+ // what would be written and where, then exits without touching the filesystem.
8
+ // The actual writes happen only when the extension onboarding flow (Phase 3d)
9
+ // re-runs the installer with explicit consent, signalled by
10
+ // PEEK_INSTALL_NATIVE_HOST=1.
11
+ //
12
+ // Either way the script logs what it wrote / would write and where, so the
13
+ // install side-effects are always visible to the user (Task 3.4 requirement).
14
+ import { hostBinaryPath, loadExtensionIds } from './native-host/config.js';
15
+ import { installManifests } from './native-host/installer.js';
16
+ import { buildManifest, resolveInstallTargets, } from './native-host/manifest.js';
17
+ const SUPPORTED = ['darwin', 'linux', 'win32'];
18
+ function isTruthyEnv(value) {
19
+ if (!value)
20
+ return false;
21
+ const v = value.toLowerCase();
22
+ return v === '1' || v === 'true' || v === 'yes';
23
+ }
24
+ function logResults(results, dryRun) {
25
+ const verb = dryRun ? 'Would register' : 'Registered';
26
+ for (const r of results) {
27
+ const where = r.manifestPath ?? r.registryKey ?? '(unknown target)';
28
+ if (r.error) {
29
+ console.log(` ✗ ${r.browser}: ${where} — ${r.error}`);
30
+ }
31
+ else {
32
+ console.log(` ${dryRun ? '·' : '✔'} ${verb} ${r.browser}: ${where}`);
33
+ }
34
+ }
35
+ }
36
+ export function runPostinstall() {
37
+ const platform = process.platform;
38
+ if (!SUPPORTED.includes(platform)) {
39
+ console.log(`peek: native-host registration is not supported on '${platform}'; skipping.`);
40
+ return;
41
+ }
42
+ const home = process.env.HOME ?? process.env.USERPROFILE ?? '';
43
+ const ids = loadExtensionIds();
44
+ const manifest = buildManifest(hostBinaryPath(), ids);
45
+ const targets = resolveInstallTargets(platform, home);
46
+ const consented = isTruthyEnv(process.env.PEEK_INSTALL_NATIVE_HOST);
47
+ const dryRun = !consented;
48
+ console.log(`peek native messaging host: ${manifest.name}`);
49
+ console.log(` host binary: ${manifest.path}`);
50
+ console.log(manifest.allowed_origins.length > 0
51
+ ? ` allowed origins: ${manifest.allowed_origins.join(', ')}`
52
+ : ' allowed origins: (none yet — extension IDs are still placeholders)');
53
+ const results = installManifests(targets, manifest, { dryRun });
54
+ logResults(results, dryRun);
55
+ if (dryRun) {
56
+ console.log('\npeek: no files were written. The native host is registered during extension\n' +
57
+ 'onboarding (with your consent), or by re-running with PEEK_INSTALL_NATIVE_HOST=1.');
58
+ }
59
+ }
60
+ // Run when invoked directly (postinstall / manual). Guarded so importing this
61
+ // module for tests does not trigger the side-effect path.
62
+ const invokedDirectly = process.argv[1] !== undefined && import.meta.url === `file://${process.argv[1]}`;
63
+ if (invokedDirectly) {
64
+ try {
65
+ runPostinstall();
66
+ }
67
+ catch (err) {
68
+ // A postinstall failure must never break `npm install`.
69
+ console.log(`peek: postinstall skipped — ${err instanceof Error ? err.message : String(err)}`);
70
+ }
71
+ }
72
+ //# sourceMappingURL=postinstall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postinstall.js","sourceRoot":"","sources":["../src/postinstall.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "name": "@peekdev/mcp",
3
+ "version": "0.1.0-alpha.1",
4
+ "description": "peek native messaging host + stdio MCP server. Owns ~/.peek/sessions.db (better-sqlite3) and bridges the browser extension, CLI, and AI tools to a single local source of truth (ADR-0007).",
5
+ "license": "Apache-2.0",
6
+ "type": "module",
7
+ "bin": {
8
+ "peek-mcp": "./dist/index.js"
9
+ },
10
+ "main": "./dist/index.js",
11
+ "types": "./dist/index.d.ts",
12
+ "exports": {
13
+ ".": {
14
+ "types": "./dist/index.d.ts",
15
+ "import": "./dist/index.js"
16
+ },
17
+ "./db": {
18
+ "types": "./dist/db/index.d.ts",
19
+ "import": "./dist/db/index.js"
20
+ },
21
+ "./native-host": {
22
+ "types": "./dist/native-host/index.d.ts",
23
+ "import": "./dist/native-host/index.js"
24
+ }
25
+ },
26
+ "files": [
27
+ "dist",
28
+ "src/db/migrations",
29
+ "src/native-host/extension-ids.json",
30
+ "NOTICE",
31
+ "README.md"
32
+ ],
33
+ "scripts": {
34
+ "build": "tsc -p tsconfig.json && node ./scripts/postbuild.mjs",
35
+ "typecheck": "tsc -p tsconfig.json --noEmit",
36
+ "test": "vitest run --passWithNoTests",
37
+ "postinstall": "node ./scripts/postinstall-guard.mjs"
38
+ },
39
+ "dependencies": {
40
+ "@cubenest/rrweb-core": "workspace:*",
41
+ "@modelcontextprotocol/sdk": "^1.29.0",
42
+ "better-sqlite3": "^12.10.0",
43
+ "zod": "^3.25.76"
44
+ },
45
+ "devDependencies": {
46
+ "@types/better-sqlite3": "^7.6.13",
47
+ "@types/node": "^22.10.0"
48
+ },
49
+ "publishConfig": {
50
+ "access": "public",
51
+ "provenance": true
52
+ },
53
+ "repository": {
54
+ "type": "git",
55
+ "url": "git+https://github.com/Cubenest/rrweb-stack.git",
56
+ "directory": "packages/peek-mcp"
57
+ },
58
+ "homepage": "https://github.com/Cubenest/rrweb-stack/tree/main/packages/peek-mcp#readme"
59
+ }
@@ -0,0 +1,102 @@
1
+ -- 0001_initial — peek native-host SQLite schema (ADR-0007).
2
+ --
3
+ -- The native messaging host owns ~/.peek/sessions.db; the extension writes via
4
+ -- native messaging and the MCP server + CLI read the same file directly. rrweb
5
+ -- event blobs live on disk under ~/.peek/rrweb-events/ (gzipped, one per
6
+ -- session); this DB stores session metadata, the chunk index into those blobs,
7
+ -- and the extracted console / network / audit rows that the MCP tools query.
8
+ --
9
+ -- Conventions: UTC ISO-8601 strings for timestamps (text); epoch-millis
10
+ -- integers where a monotonic ordering key is wanted (`ts_ms`). All foreign keys
11
+ -- reference sessions(id) and cascade on delete so `peek sessions delete` is a
12
+ -- single statement.
13
+
14
+ -- One row per recorded browser session.
15
+ CREATE TABLE sessions (
16
+ id TEXT PRIMARY KEY, -- e.g. "s_8nQ..."
17
+ created_at TEXT NOT NULL, -- UTC ISO-8601 of first event
18
+ updated_at TEXT NOT NULL, -- UTC ISO-8601 of last append
19
+ url TEXT, -- initial top-frame URL
20
+ title TEXT, -- initial document title
21
+ origin TEXT, -- scheme://host[:port] of `url`
22
+ user_agent TEXT,
23
+ -- Path to the gzipped rrweb event blob for this session, relative to
24
+ -- ~/.peek/rrweb-events/ (the native host owns the absolute base).
25
+ events_blob_path TEXT,
26
+ event_count INTEGER NOT NULL DEFAULT 0, -- total rrweb events recorded
27
+ bytes INTEGER NOT NULL DEFAULT 0, -- on-disk size of the blob
28
+ status TEXT NOT NULL DEFAULT 'active' -- 'active' | 'finalized'
29
+ );
30
+
31
+ CREATE INDEX idx_sessions_created_at ON sessions (created_at);
32
+ CREATE INDEX idx_sessions_origin ON sessions (origin);
33
+
34
+ -- Index of rrweb event chunks appended over native messaging. The events
35
+ -- themselves are persisted to the gzipped blob; a chunk row records the byte
36
+ -- range + event range so a reader can seek without parsing the whole blob.
37
+ CREATE TABLE events_chunks (
38
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
39
+ session_id TEXT NOT NULL REFERENCES sessions (id) ON DELETE CASCADE,
40
+ seq INTEGER NOT NULL, -- 0-based chunk order within session
41
+ start_ts_ms INTEGER NOT NULL, -- epoch-millis of first event in chunk
42
+ end_ts_ms INTEGER NOT NULL, -- epoch-millis of last event in chunk
43
+ event_count INTEGER NOT NULL,
44
+ byte_offset INTEGER NOT NULL, -- offset into the gzipped blob
45
+ byte_length INTEGER NOT NULL,
46
+ created_at TEXT NOT NULL,
47
+ UNIQUE (session_id, seq)
48
+ );
49
+
50
+ CREATE INDEX idx_events_chunks_session ON events_chunks (session_id, seq);
51
+
52
+ -- Console messages extracted from the rrweb console plugin
53
+ -- (EventType=6, plugin "rrweb/console@1") for fast MCP queries.
54
+ CREATE TABLE console_events (
55
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
56
+ session_id TEXT NOT NULL REFERENCES sessions (id) ON DELETE CASCADE,
57
+ ts_ms INTEGER NOT NULL, -- epoch-millis of the log
58
+ level TEXT NOT NULL, -- 'log'|'info'|'warn'|'error'|'debug'|...
59
+ message TEXT NOT NULL, -- joined payload text
60
+ stack TEXT, -- trace, when present
61
+ url TEXT -- page URL at time of log
62
+ );
63
+
64
+ CREATE INDEX idx_console_events_session ON console_events (session_id, ts_ms);
65
+ CREATE INDEX idx_console_events_level ON console_events (session_id, level);
66
+
67
+ -- Network activity captured via CDP (chrome.debugger) / console-error fallback.
68
+ CREATE TABLE network_events (
69
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
70
+ session_id TEXT NOT NULL REFERENCES sessions (id) ON DELETE CASCADE,
71
+ ts_ms INTEGER NOT NULL, -- epoch-millis of request start
72
+ method TEXT NOT NULL, -- GET/POST/...
73
+ url TEXT NOT NULL,
74
+ status INTEGER, -- HTTP status; NULL if failed/pending
75
+ status_text TEXT,
76
+ request_id TEXT, -- CDP requestId, for correlation
77
+ resource_type TEXT, -- 'xhr'|'fetch'|'document'|...
78
+ duration_ms INTEGER, -- response time, when known
79
+ error_text TEXT -- net error string, when failed
80
+ );
81
+
82
+ CREATE INDEX idx_network_events_session ON network_events (session_id, ts_ms);
83
+ CREATE INDEX idx_network_events_status ON network_events (session_id, status);
84
+
85
+ -- Append-only audit log of every AI-driven act-tool call (ADR-0010 / PRD §H3).
86
+ -- Mirrors the JSONL shape written to ~/.peek/audit.log; kept in SQLite too so
87
+ -- `peek audit log --since 1h --tool ... --client ...` is an indexed query.
88
+ CREATE TABLE audit_log (
89
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
90
+ ts TEXT NOT NULL, -- UTC ISO-8601 of the action
91
+ tool TEXT NOT NULL, -- e.g. 'execute_action'
92
+ args_json TEXT, -- JSON of the tool args
93
+ approval_ts TEXT, -- when the user approved
94
+ approver TEXT, -- 'user' | ...
95
+ client TEXT, -- 'claude-code' | 'cursor' | ...
96
+ session_id TEXT REFERENCES sessions (id) ON DELETE SET NULL,
97
+ result TEXT -- 'ok' | 'error' | ...
98
+ );
99
+
100
+ CREATE INDEX idx_audit_log_ts ON audit_log (ts);
101
+ CREATE INDEX idx_audit_log_tool ON audit_log (tool);
102
+ CREATE INDEX idx_audit_log_client ON audit_log (client);
@@ -0,0 +1,15 @@
1
+ -- 0002_network_bodies — persist Deep capture masked bodies (ADR-0010, PRD §A.8).
2
+ --
3
+ -- The extension already masks request/response bodies via `maskNetMessage` in
4
+ -- the ISOLATED-world relay (packages/peek-extension/src/relay/mask.ts) BEFORE
5
+ -- forwarding them on `network.append`. Without these columns the native host
6
+ -- silently drops the masked bodies on the floor — the user's yellow-banner
7
+ -- consent for Deep capture yields no persisted body data, defeating the
8
+ -- whole reason `webRequest` is insufficient under MV3 (PRD §A.9).
9
+ --
10
+ -- Columns are TEXT (the relay produces strings via `redactBody`) and nullable
11
+ -- — Basic capture, request-only records, and error records leave them NULL.
12
+ -- SQLite's ALTER TABLE ADD COLUMN is non-destructive: existing rows get NULL
13
+ -- for the new columns, fresh DBs land with them from the start.
14
+ ALTER TABLE network_events ADD COLUMN request_body_redacted TEXT;
15
+ ALTER TABLE network_events ADD COLUMN response_body_redacted TEXT;
@@ -0,0 +1,6 @@
1
+ {
2
+ "$comment": "Extension IDs whose chrome-extension:// origin is allowed to message the peek native host (ADR-0007). Wildcards are forbidden by Chrome, so every supported store + the dev-mode unpacked-load ID is listed explicitly and all three go into the SAME manifest's allowed_origins (the Edge 'first registry location wins' gotcha — see P2 PRD §A7). Pre-publish, `dev` is the unpacked-load ID printed at chrome://extensions; replace `chromeWebStore` and `edgeAddons` with the assigned IDs once the products land in their stores.",
3
+ "chromeWebStore": "PLACEHOLDER_CHROME_WEB_STORE_ID",
4
+ "edgeAddons": "PLACEHOLDER_EDGE_ADDONS_ID",
5
+ "dev": "PLACEHOLDER_DEV_UNPACKED_ID"
6
+ }