@gramatr/mcp 0.7.5 → 0.7.6

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 (61) hide show
  1. package/dist/hooks/lib/feedback.d.ts +0 -2
  2. package/dist/hooks/lib/feedback.d.ts.map +1 -1
  3. package/dist/hooks/lib/feedback.js +18 -19
  4. package/dist/hooks/lib/feedback.js.map +1 -1
  5. package/dist/hooks/lib/formatting-compat.d.ts.map +1 -1
  6. package/dist/hooks/lib/formatting-compat.js +82 -55
  7. package/dist/hooks/lib/formatting-compat.js.map +1 -1
  8. package/dist/hooks/lib/gramatr-hook-utils.d.ts +0 -59
  9. package/dist/hooks/lib/gramatr-hook-utils.d.ts.map +1 -1
  10. package/dist/hooks/lib/gramatr-hook-utils.js +1 -212
  11. package/dist/hooks/lib/gramatr-hook-utils.js.map +1 -1
  12. package/dist/hooks/lib/hook-state.d.ts +159 -0
  13. package/dist/hooks/lib/hook-state.d.ts.map +1 -0
  14. package/dist/hooks/lib/hook-state.js +430 -0
  15. package/dist/hooks/lib/hook-state.js.map +1 -0
  16. package/dist/hooks/lib/intelligence.d.ts.map +1 -1
  17. package/dist/hooks/lib/intelligence.js +112 -88
  18. package/dist/hooks/lib/intelligence.js.map +1 -1
  19. package/dist/hooks/lib/routing.d.ts +2 -2
  20. package/dist/hooks/lib/routing.d.ts.map +1 -1
  21. package/dist/hooks/lib/routing.js +71 -25
  22. package/dist/hooks/lib/routing.js.map +1 -1
  23. package/dist/hooks/lib/session-end.d.ts +7 -0
  24. package/dist/hooks/lib/session-end.d.ts.map +1 -1
  25. package/dist/hooks/lib/session-end.js +33 -16
  26. package/dist/hooks/lib/session-end.js.map +1 -1
  27. package/dist/hooks/lib/session.d.ts +7 -38
  28. package/dist/hooks/lib/session.d.ts.map +1 -1
  29. package/dist/hooks/lib/session.js +43 -87
  30. package/dist/hooks/lib/session.js.map +1 -1
  31. package/dist/hooks/lib/types.d.ts +174 -36
  32. package/dist/hooks/lib/types.d.ts.map +1 -1
  33. package/dist/hooks/session-end.d.ts.map +1 -1
  34. package/dist/hooks/session-end.js +53 -45
  35. package/dist/hooks/session-end.js.map +1 -1
  36. package/dist/hooks/session-start.d.ts.map +1 -1
  37. package/dist/hooks/session-start.js +87 -77
  38. package/dist/hooks/session-start.js.map +1 -1
  39. package/dist/hooks/stop.d.ts.map +1 -1
  40. package/dist/hooks/stop.js +1 -10
  41. package/dist/hooks/stop.js.map +1 -1
  42. package/dist/hooks/user-prompt-submit.d.ts.map +1 -1
  43. package/dist/hooks/user-prompt-submit.js +57 -68
  44. package/dist/hooks/user-prompt-submit.js.map +1 -1
  45. package/dist/intelligence/packet2-fetcher.d.ts +3 -3
  46. package/dist/intelligence/packet2-fetcher.js +8 -8
  47. package/dist/intelligence/packet2-fetcher.js.map +1 -1
  48. package/dist/proxy/local-client.d.ts +49 -0
  49. package/dist/proxy/local-client.d.ts.map +1 -0
  50. package/dist/proxy/local-client.js +135 -0
  51. package/dist/proxy/local-client.js.map +1 -0
  52. package/dist/server/hooks-listener.d.ts +32 -0
  53. package/dist/server/hooks-listener.d.ts.map +1 -0
  54. package/dist/server/hooks-listener.js +144 -0
  55. package/dist/server/hooks-listener.js.map +1 -0
  56. package/dist/server/server.d.ts.map +1 -1
  57. package/dist/server/server.js +16 -1
  58. package/dist/server/server.js.map +1 -1
  59. package/dist/setup/integrations.js +3 -3
  60. package/dist/setup/integrations.js.map +1 -1
  61. package/package.json +5 -2
@@ -1,11 +1,11 @@
1
1
  /**
2
2
  * Packet 2 Auto-Fetcher — automatically fetches enrichment when route_request
3
- * returns packet_2_status: "pending".
3
+ * returns packet_2_status: "required".
4
4
  *
5
5
  * Flow:
6
6
  * 1. Agent calls gramatr_route_request
7
7
  * 2. Server returns Packet 1 immediately with enrichment_id
8
- * 3. This module detects pending status, calls gramatr_get_enrichment
8
+ * 3. This module detects required status, calls gramatr_get_enrichment
9
9
  * 4. Merges Packet 2 into the response before returning to agent
10
10
  *
11
11
  * The agent never has to manually call gramatr_get_enrichment — it just works.
@@ -14,14 +14,14 @@ import { callRemoteTool } from '../proxy/remote-client.js';
14
14
  const MAX_RETRIES = 3;
15
15
  const RETRY_DELAY_MS = 500;
16
16
  /**
17
- * Check if a tool result is a route_request response with pending Packet 2.
17
+ * Check if a tool result is a route_request response with required Packet 2.
18
18
  */
19
19
  export function hasPendingPacket2(result) {
20
20
  if (!result.content?.[0]?.text)
21
21
  return { pending: false };
22
22
  try {
23
23
  const data = JSON.parse(result.content[0].text);
24
- if (data.packet_2_status === 'pending' && data.enrichment_id) {
24
+ if (data.packet_2_status === 'required' && data.enrichment_id) {
25
25
  return { pending: true, enrichmentId: data.enrichment_id };
26
26
  }
27
27
  }
@@ -59,9 +59,9 @@ export async function fetchAndMergePacket2(result, enrichmentId) {
59
59
  await new Promise((resolve) => setTimeout(resolve, RETRY_DELAY_MS));
60
60
  }
61
61
  }
62
- // Enrichment not ready after retries — return original Packet 1 as-is
63
- // The agent can still work with Packet 1 alone
64
- process.stderr.write(`[gramatr-mcp] Packet 2 not ready after ${MAX_RETRIES} retries, returning Packet 1 only\n`);
62
+ // Enrichment not ready after retries — return original Packet 1 as-is and
63
+ // leave the required status intact so the caller can keep polling.
64
+ process.stderr.write(`[gramatr-mcp] Packet 2 still required after ${MAX_RETRIES} retries; returning Packet 1 and preserving required status\n`);
65
65
  return result;
66
66
  }
67
67
  /**
@@ -73,7 +73,7 @@ function mergePackets(packet1, packet2) {
73
73
  const p1Data = JSON.parse(packet1.content[0].text);
74
74
  const p2Data = JSON.parse(packet2.content[0].text);
75
75
  // Merge Packet 2 into Packet 1
76
- p1Data.packet_2 = p2Data;
76
+ p1Data.packet_2 = p2Data.packet_2 || p2Data;
77
77
  p1Data.packet_2_status = 'merged';
78
78
  return {
79
79
  content: [{ type: 'text', text: JSON.stringify(p1Data) }],
@@ -1 +1 @@
1
- {"version":3,"file":"packet2-fetcher.js","sourceRoot":"","sources":["../../src/intelligence/packet2-fetcher.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"packet2-fetcher.js","sourceRoot":"","sources":["../../src/intelligence/packet2-fetcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAa3D,MAAM,WAAW,GAAG,CAAC,CAAC;AACtB,MAAM,cAAc,GAAG,GAAG,CAAC;AAE3B;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAsB;IACtD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAE1D,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAwB,CAAC;QACvE,IAAI,IAAI,CAAC,eAAe,KAAK,UAAU,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YAC9D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;QAC7D,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,qCAAqC;IACvC,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAC5B,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,MAAsB,EACtB,YAAoB;IAEpB,IAAI,UAAU,GAAY,IAAI,CAAC;IAE/B,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;QACvD,IAAI,CAAC;YACH,UAAU,GAAG,MAAM,cAAc,CAAC,wBAAwB,EAAE;gBAC1D,aAAa,EAAE,YAAY;aAC5B,CAAC,CAAC;YAEH,+BAA+B;YAC/B,MAAM,YAAY,GAAG,UAA4B,CAAC;YAClD,IAAI,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;gBACrC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAA4B,CAAC;gBACvF,IAAI,UAAU,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;oBACpC,iCAAiC;oBACjC,OAAO,YAAY,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;gBAC5C,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,iDAAiD;QACnD,CAAC;QAED,uBAAuB;QACvB,IAAI,OAAO,GAAG,WAAW,GAAG,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAED,0EAA0E;IAC1E,mEAAmE;IACnE,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,+CAA+C,WAAW,+DAA+D,CAC1H,CAAC;IACF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,SAAS,YAAY,CAAC,OAAuB,EAAE,OAAuB;IACpE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAA4B,CAAC;QAC9E,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAA4B,CAAC;QAE9E,+BAA+B;QAC/B,MAAM,CAAC,QAAQ,GAAI,MAAM,CAAC,QAAgD,IAAI,MAAM,CAAC;QACrF,MAAM,CAAC,eAAe,GAAG,QAAQ,CAAC;QAElC,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;SAC1D,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,4CAA4C;QAC5C,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * local-client.ts — Hook-side client for the local MCP hooks listener.
3
+ *
4
+ * Phase IV: Hook subprocesses call this module instead of remote-client.ts.
5
+ * Routes all tool calls and session-context reads/writes through the local
6
+ * MCP server when it is running, falling back to direct remote calls otherwise.
7
+ *
8
+ * Priority:
9
+ * 1. Local hooks server (localhost:PORT from ~/.gramatr/.hooks-port)
10
+ * → auth already loaded in server process, no token resolution needed
11
+ * → data shape validated before any remote call
12
+ * 2. Direct remote (callRemoteTool from remote-client.ts)
13
+ * → hooks resolve their own auth token as before
14
+ *
15
+ * The local server's port file is read once per hook process lifetime and
16
+ * cached. Stale port files (server crashed without cleanup) are caught by a
17
+ * connection error on first use, which clears the cache and falls through to
18
+ * direct remote.
19
+ */
20
+ /** True when the local hooks server port file exists and contains a valid port. */
21
+ export declare function isLocalHooksServerAvailable(): boolean;
22
+ /**
23
+ * Call a gramatr tool, routing through the local hooks server when available.
24
+ *
25
+ * The local server injects auth and enforces data shapes before forwarding to
26
+ * the remote API. If the local server is unavailable or returns an error,
27
+ * falls back to a direct remote call via callRemoteTool.
28
+ */
29
+ export declare function callTool(name: string, args: Record<string, unknown>): Promise<unknown>;
30
+ /**
31
+ * Push session context to the local server's in-memory store.
32
+ *
33
+ * Called by the session-start hook after setSessionContext() so later hook
34
+ * processes (user-prompt-submit, session-end) can read the context without
35
+ * hitting the SQLite file or the remote REST API.
36
+ *
37
+ * Returns true if the write was acknowledged. A false return is non-fatal —
38
+ * later hooks fall back to SQLite → remote REST.
39
+ */
40
+ export declare function pushSessionContextToLocal(ctx: unknown): Promise<boolean>;
41
+ /**
42
+ * Pull session context from the local server's in-memory store.
43
+ *
44
+ * Returns the stored context for the given session_id, or the most recently
45
+ * written context as a fallback. Returns null if the local server is
46
+ * unavailable or has no context for this session.
47
+ */
48
+ export declare function pullSessionContextFromLocal(sessionId: string): Promise<Record<string, unknown> | null>;
49
+ //# sourceMappingURL=local-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-client.d.ts","sourceRoot":"","sources":["../../src/proxy/local-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AA6BH,mFAAmF;AACnF,wBAAgB,2BAA2B,IAAI,OAAO,CAErD;AAID;;;;;;GAMG;AACH,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,OAAO,CAAC,CAuBlB;AAID;;;;;;;;;GASG;AACH,wBAAsB,yBAAyB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAe9E;AAED;;;;;;GAMG;AACH,wBAAsB,2BAA2B,CAC/C,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAezC"}
@@ -0,0 +1,135 @@
1
+ /**
2
+ * local-client.ts — Hook-side client for the local MCP hooks listener.
3
+ *
4
+ * Phase IV: Hook subprocesses call this module instead of remote-client.ts.
5
+ * Routes all tool calls and session-context reads/writes through the local
6
+ * MCP server when it is running, falling back to direct remote calls otherwise.
7
+ *
8
+ * Priority:
9
+ * 1. Local hooks server (localhost:PORT from ~/.gramatr/.hooks-port)
10
+ * → auth already loaded in server process, no token resolution needed
11
+ * → data shape validated before any remote call
12
+ * 2. Direct remote (callRemoteTool from remote-client.ts)
13
+ * → hooks resolve their own auth token as before
14
+ *
15
+ * The local server's port file is read once per hook process lifetime and
16
+ * cached. Stale port files (server crashed without cleanup) are caught by a
17
+ * connection error on first use, which clears the cache and falls through to
18
+ * direct remote.
19
+ */
20
+ import { readFileSync } from 'node:fs';
21
+ import { join } from 'node:path';
22
+ import { getGramatrDirFromEnv, getHomeDir } from '../config-runtime.js';
23
+ import { callRemoteTool } from './remote-client.js';
24
+ // ── Port discovery ──
25
+ function getPortFilePath() {
26
+ const dir = getGramatrDirFromEnv() || join(getHomeDir(), '.gramatr');
27
+ return join(dir, '.hooks-port');
28
+ }
29
+ // undefined = not yet read; null = not available; number = available
30
+ let _cachedPort = undefined;
31
+ function getLocalPort() {
32
+ if (_cachedPort !== undefined)
33
+ return _cachedPort;
34
+ try {
35
+ const raw = readFileSync(getPortFilePath(), 'utf8').trim();
36
+ const port = parseInt(raw, 10);
37
+ _cachedPort = Number.isFinite(port) && port > 0 ? port : null;
38
+ }
39
+ catch {
40
+ _cachedPort = null;
41
+ }
42
+ return _cachedPort;
43
+ }
44
+ /** True when the local hooks server port file exists and contains a valid port. */
45
+ export function isLocalHooksServerAvailable() {
46
+ return getLocalPort() !== null;
47
+ }
48
+ // ── Tool call proxy ──
49
+ /**
50
+ * Call a gramatr tool, routing through the local hooks server when available.
51
+ *
52
+ * The local server injects auth and enforces data shapes before forwarding to
53
+ * the remote API. If the local server is unavailable or returns an error,
54
+ * falls back to a direct remote call via callRemoteTool.
55
+ */
56
+ export async function callTool(name, args) {
57
+ const port = getLocalPort();
58
+ if (port !== null) {
59
+ try {
60
+ const res = await fetch(`http://127.0.0.1:${port}/hooks/tool`, {
61
+ method: 'POST',
62
+ headers: { 'Content-Type': 'application/json' },
63
+ body: JSON.stringify({ name, args }),
64
+ signal: AbortSignal.timeout(30000),
65
+ });
66
+ // gramatr-allow: B1 — HTTP transport sentinel, caught immediately in the enclosing try/catch
67
+ if (!res.ok)
68
+ throw new Error(`HTTP ${res.status}`);
69
+ const data = await res.json();
70
+ // gramatr-allow: B1 — error string forwarded from local server, caught immediately in the enclosing try/catch
71
+ if (data.error)
72
+ throw new Error(data.error);
73
+ return data.result;
74
+ }
75
+ catch {
76
+ // Local server failed (stale port file, crash, etc.) — invalidate cache
77
+ // and fall through to direct remote.
78
+ _cachedPort = null;
79
+ }
80
+ }
81
+ return callRemoteTool(name, args);
82
+ }
83
+ // ── Session context IPC ──
84
+ /**
85
+ * Push session context to the local server's in-memory store.
86
+ *
87
+ * Called by the session-start hook after setSessionContext() so later hook
88
+ * processes (user-prompt-submit, session-end) can read the context without
89
+ * hitting the SQLite file or the remote REST API.
90
+ *
91
+ * Returns true if the write was acknowledged. A false return is non-fatal —
92
+ * later hooks fall back to SQLite → remote REST.
93
+ */
94
+ export async function pushSessionContextToLocal(ctx) {
95
+ const port = getLocalPort();
96
+ if (port === null)
97
+ return false;
98
+ try {
99
+ const res = await fetch(`http://127.0.0.1:${port}/hooks/session`, {
100
+ method: 'POST',
101
+ headers: { 'Content-Type': 'application/json' },
102
+ body: JSON.stringify(ctx),
103
+ signal: AbortSignal.timeout(3000),
104
+ });
105
+ return res.ok;
106
+ }
107
+ catch {
108
+ _cachedPort = null; // Invalidate on connection failure
109
+ return false;
110
+ }
111
+ }
112
+ /**
113
+ * Pull session context from the local server's in-memory store.
114
+ *
115
+ * Returns the stored context for the given session_id, or the most recently
116
+ * written context as a fallback. Returns null if the local server is
117
+ * unavailable or has no context for this session.
118
+ */
119
+ export async function pullSessionContextFromLocal(sessionId) {
120
+ const port = getLocalPort();
121
+ if (port === null)
122
+ return null;
123
+ try {
124
+ const res = await fetch(`http://127.0.0.1:${port}/hooks/session?session_id=${encodeURIComponent(sessionId)}`, { signal: AbortSignal.timeout(3000) });
125
+ if (!res.ok)
126
+ return null;
127
+ const data = await res.json();
128
+ return data.ctx;
129
+ }
130
+ catch {
131
+ _cachedPort = null;
132
+ return null;
133
+ }
134
+ }
135
+ //# sourceMappingURL=local-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-client.js","sourceRoot":"","sources":["../../src/proxy/local-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * hooks-listener.ts — Local HTTP IPC server for hook subprocesses.
3
+ *
4
+ * Phase IV: The local MCP proxy server opens a lightweight HTTP listener on a
5
+ * random localhost port at startup and writes the port to ~/.gramatr/.hooks-port.
6
+ * Hook subprocesses (session-start, user-prompt-submit, session-end) discover
7
+ * this port and route calls through the local server instead of calling the
8
+ * remote server directly.
9
+ *
10
+ * Benefits:
11
+ * - Auth managed in one place: the local server has the token; hooks never
12
+ * need to resolve or refresh it themselves.
13
+ * - Single enforcement point for data shapes and schema validation before
14
+ * any call reaches the remote API.
15
+ * - Cross-hook session context via in-process memory (no SQLite file needed).
16
+ * - Faster: localhost vs. internet round-trip for session context reads.
17
+ *
18
+ * Fallback: if the port file is absent (local server not running), hooks fall
19
+ * back to direct remote calls with their own auth resolution.
20
+ */
21
+ /**
22
+ * Start the hooks IPC listener on a random localhost port.
23
+ * Writes the port to ~/.gramatr/.hooks-port so hook subprocesses can find it.
24
+ * Returns the assigned port number.
25
+ */
26
+ export declare function startHooksListener(): Promise<number>;
27
+ /**
28
+ * Stop the hooks listener and remove the port file.
29
+ * Called on server shutdown so stale hooks know to fall back to direct remote.
30
+ */
31
+ export declare function stopHooksListener(): void;
32
+ //# sourceMappingURL=hooks-listener.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks-listener.d.ts","sourceRoot":"","sources":["../../src/server/hooks-listener.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AA2FH;;;;GAIG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC,CA4B1D;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAIxC"}
@@ -0,0 +1,144 @@
1
+ /**
2
+ * hooks-listener.ts — Local HTTP IPC server for hook subprocesses.
3
+ *
4
+ * Phase IV: The local MCP proxy server opens a lightweight HTTP listener on a
5
+ * random localhost port at startup and writes the port to ~/.gramatr/.hooks-port.
6
+ * Hook subprocesses (session-start, user-prompt-submit, session-end) discover
7
+ * this port and route calls through the local server instead of calling the
8
+ * remote server directly.
9
+ *
10
+ * Benefits:
11
+ * - Auth managed in one place: the local server has the token; hooks never
12
+ * need to resolve or refresh it themselves.
13
+ * - Single enforcement point for data shapes and schema validation before
14
+ * any call reaches the remote API.
15
+ * - Cross-hook session context via in-process memory (no SQLite file needed).
16
+ * - Faster: localhost vs. internet round-trip for session context reads.
17
+ *
18
+ * Fallback: if the port file is absent (local server not running), hooks fall
19
+ * back to direct remote calls with their own auth resolution.
20
+ */
21
+ import { createServer } from 'node:http';
22
+ import { existsSync, mkdirSync, unlinkSync, writeFileSync } from 'node:fs';
23
+ import { join } from 'node:path';
24
+ import { getGramatrDirFromEnv, getHomeDir } from '../config-runtime.js';
25
+ import { callRemoteTool } from '../proxy/remote-client.js';
26
+ // ── In-memory session context store ──
27
+ // Keys: session_id (string) + '__latest__' sentinel for the most recent write.
28
+ // Hooks that don't know the session_id (e.g. a status query) fall back to __latest__.
29
+ const sessionStore = new Map();
30
+ // ── Port file path ──
31
+ function getPortFilePath() {
32
+ const dir = getGramatrDirFromEnv() || join(getHomeDir(), '.gramatr');
33
+ return join(dir, '.hooks-port');
34
+ }
35
+ // ── Request helpers ──
36
+ async function readBody(req) {
37
+ return new Promise((resolve) => {
38
+ const chunks = [];
39
+ req.on('data', (chunk) => chunks.push(chunk));
40
+ req.on('end', () => resolve(Buffer.concat(chunks).toString('utf8')));
41
+ req.on('error', () => resolve(''));
42
+ });
43
+ }
44
+ function json(res, status, body) {
45
+ res.writeHead(status, { 'Content-Type': 'application/json' });
46
+ res.end(JSON.stringify(body));
47
+ }
48
+ // ── Route handlers ──
49
+ async function handleRequest(req, res) {
50
+ const url = new URL(req.url || '/', 'http://localhost');
51
+ const method = (req.method || 'GET').toUpperCase();
52
+ // ── POST /hooks/tool — proxy a gramatr tool call with server-managed auth ──
53
+ if (url.pathname === '/hooks/tool' && method === 'POST') {
54
+ const raw = await readBody(req);
55
+ try {
56
+ const { name, args } = JSON.parse(raw);
57
+ if (!name || typeof name !== 'string') {
58
+ json(res, 400, { error: 'name is required' });
59
+ return;
60
+ }
61
+ const result = await callRemoteTool(name, args ?? {});
62
+ json(res, 200, { result });
63
+ }
64
+ catch (err) {
65
+ json(res, 502, { error: err instanceof Error ? err.message : String(err) });
66
+ }
67
+ return;
68
+ }
69
+ // ── GET /hooks/session?session_id=xxx — retrieve session context ──
70
+ if (url.pathname === '/hooks/session' && method === 'GET') {
71
+ const sessionId = url.searchParams.get('session_id');
72
+ const ctx = (sessionId ? sessionStore.get(sessionId) : null)
73
+ ?? sessionStore.get('__latest__')
74
+ ?? null;
75
+ json(res, 200, { ctx });
76
+ return;
77
+ }
78
+ // ── POST /hooks/session — store session context ──
79
+ if (url.pathname === '/hooks/session' && method === 'POST') {
80
+ const raw = await readBody(req);
81
+ try {
82
+ const ctx = JSON.parse(raw);
83
+ const sessionId = ctx?.session_id;
84
+ if (sessionId)
85
+ sessionStore.set(sessionId, ctx);
86
+ sessionStore.set('__latest__', ctx);
87
+ json(res, 200, { ok: true });
88
+ }
89
+ catch {
90
+ json(res, 400, { error: 'Invalid JSON' });
91
+ }
92
+ return;
93
+ }
94
+ json(res, 404, { error: 'Not found' });
95
+ }
96
+ // ── Lifecycle ──
97
+ let _server = null;
98
+ /**
99
+ * Start the hooks IPC listener on a random localhost port.
100
+ * Writes the port to ~/.gramatr/.hooks-port so hook subprocesses can find it.
101
+ * Returns the assigned port number.
102
+ */
103
+ export async function startHooksListener() {
104
+ // Ensure the directory exists for the port file
105
+ const dir = getGramatrDirFromEnv() || join(getHomeDir(), '.gramatr');
106
+ try {
107
+ if (!existsSync(dir))
108
+ mkdirSync(dir, { recursive: true });
109
+ }
110
+ catch { /* non-critical — port file write will fail gracefully below */ }
111
+ return new Promise((resolve, reject) => {
112
+ _server = createServer((req, res) => {
113
+ handleRequest(req, res).catch((err) => {
114
+ json(res, 500, { error: err instanceof Error ? err.message : String(err) });
115
+ });
116
+ });
117
+ _server.listen(0, '127.0.0.1', () => {
118
+ const addr = _server.address();
119
+ const port = typeof addr === 'object' && addr !== null ? addr.port : 0;
120
+ try {
121
+ // mode 0o600: readable only by the current user
122
+ writeFileSync(getPortFilePath(), String(port), { mode: 0o600 });
123
+ }
124
+ catch {
125
+ // Non-critical — hooks will fall back to SQLite + direct remote
126
+ }
127
+ resolve(port);
128
+ });
129
+ _server.once('error', reject);
130
+ });
131
+ }
132
+ /**
133
+ * Stop the hooks listener and remove the port file.
134
+ * Called on server shutdown so stale hooks know to fall back to direct remote.
135
+ */
136
+ export function stopHooksListener() {
137
+ _server?.close();
138
+ _server = null;
139
+ try {
140
+ unlinkSync(getPortFilePath());
141
+ }
142
+ catch { /* best-effort cleanup */ }
143
+ }
144
+ //# sourceMappingURL=hooks-listener.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks-listener.js","sourceRoot":"","sources":["../../src/server/hooks-listener.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAwBnE;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAuDrC;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAwDjD"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAyBnE;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAuDrC;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAuEjD"}
@@ -25,6 +25,7 @@ import { loadRemoteResources, getResources } from '../proxy/resource-registry.js
25
25
  import { proxyToolCall } from '../proxy/tool-proxy.js';
26
26
  import { fetchRemotePrompt, fetchRemoteResource } from '../proxy/remote-client.js';
27
27
  import { getToken } from './auth.js';
28
+ import { startHooksListener, stopHooksListener } from './hooks-listener.js';
28
29
  import { getLocalToolDefinitions } from '../tools/local-tools.js';
29
30
  import { replayQueue } from '../queue/replay.js';
30
31
  import { queueSize } from '../queue/offline-queue.js';
@@ -124,10 +125,24 @@ export async function startServer() {
124
125
  process.stderr.write(`[gramatr-mcp] Found ${pending} queued call(s), replaying...\n`);
125
126
  void replayQueue();
126
127
  }
127
- // Create and start the server
128
+ // Create and start the MCP stdio server
128
129
  const server = createServer();
129
130
  const transport = new StdioServerTransport();
130
131
  await server.connect(transport);
131
132
  process.stderr.write(`[gramatr-mcp] Server started (stdio transport)\n`);
133
+ // Start hooks IPC listener so hook subprocesses can route through this
134
+ // process for auth, schema enforcement, and session context storage.
135
+ try {
136
+ const hooksPort = await startHooksListener();
137
+ process.stderr.write(`[gramatr-mcp] Hooks listener on port ${hooksPort}\n`);
138
+ }
139
+ catch (err) {
140
+ const msg = err instanceof Error ? err.message : String(err);
141
+ process.stderr.write(`[gramatr-mcp] Warning: hooks listener failed to start (${msg})\n`);
142
+ }
143
+ // Clean up port file on exit so stale hooks fall back to direct remote.
144
+ process.on('exit', () => stopHooksListener());
145
+ process.on('SIGTERM', () => { stopHooksListener(); process.exit(0); });
146
+ process.on('SIGINT', () => { stopHooksListener(); process.exit(0); });
132
147
  }
133
148
  //# sourceMappingURL=server.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,wBAAwB,EACxB,0BAA0B,EAC1B,sBAAsB,EACtB,yBAAyB,GAC1B,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAC5E,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACnF,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAElD,MAAM,WAAW,GAAG,aAAa,CAAC;AAElC;;GAEG;AACH,MAAM,UAAU,YAAY;IAC1B,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,EACvC,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,CAC5D,CAAC;IAEF,kDAAkD;IAClD,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,WAAW,GAAG,QAAQ,EAAE,CAAC;QAC/B,MAAM,UAAU,GAAG,uBAAuB,EAAE,CAAC;QAC7C,MAAM,QAAQ,GAAG,CAAC,GAAG,WAAW,EAAE,GAAG,UAAU,CAAC,CAAC;QACjD,OAAO;YACL,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC1B,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,WAAW,EAAE,CAAC,CAAC,WAAW;gBAC1B,WAAW,EAAE,CAAC,CAAC,WAAW;gBAC1B,WAAW,EAAE,CAAC,CAAC,WAAW;aAC3B,CAAC,CAAC;SACJ,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,2BAA2B;IAC3B,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAChE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;QACjD,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,EAAG,IAAgC,IAAI,EAAE,CAAC,CAAC;QAClF,OAAO,MAA4C,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,mDAAmD;IACnD,MAAM,CAAC,iBAAiB,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;QAC7B,OAAO,EAAE,OAAO,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,kDAAkD;IAClD,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACjE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;QACvD,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,IAAI,EAAE,UAAgD,CAAC,CAAC;QAC/F,OAAO,MAAiC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,qDAAqD;IACrD,MAAM,CAAC,iBAAiB,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;QACjC,OAAO,EAAE,SAAS,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,qDAAqD;IACrD,MAAM,CAAC,iBAAiB,CAAC,yBAAyB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACpE,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;QAC/B,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAC9C,OAAO,MAAiC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,8BAA8B;IAC9B,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,6DAA6D,CAC9D,CAAC;IACJ,CAAC;IAED,+BAA+B;IAC/B,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,eAAe,EAAE,CAAC;QACtC,MAAM,UAAU,GAAG,uBAAuB,EAAE,CAAC,MAAM,CAAC;QACpD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,wBAAwB,KAAK,CAAC,MAAM,aAAa,UAAU,gBAAgB,CAC5E,CAAC;IACJ,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,uDAAuD,OAAO,qCAAqC,CACpG,CAAC;IACJ,CAAC;IAED,sBAAsB;IACtB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,iBAAiB,EAAE,CAAC;QAC1C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,wBAAwB,OAAO,CAAC,MAAM,mBAAmB,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,sCAAsC;IACxC,CAAC;IAED,wBAAwB;IACxB,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,mBAAmB,EAAE,CAAC;QAC9C,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,wBAAwB,SAAS,CAAC,MAAM,qBAAqB,CAAC,CAAC;QACtF,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,wCAAwC;IAC1C,CAAC;IAED,oDAAoD;IACpD,MAAM,OAAO,GAAG,SAAS,EAAE,CAAC;IAC5B,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,OAAO,iCAAiC,CAAC,CAAC;QACtF,KAAK,WAAW,EAAE,CAAC;IACrB,CAAC;IAED,8BAA8B;IAC9B,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;AAC3E,CAAC"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server/server.ts"],"names":[],"mappings":"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"}
@@ -9,9 +9,9 @@ const CLAUDE_HOOKS = [
9
9
  { event: 'PostToolUse', matcher: 'mcp__.*gramatr.*__', mcpHookName: 'tool-tracker' },
10
10
  { event: 'UserPromptSubmit', mcpHookName: 'rating-capture' },
11
11
  { event: 'UserPromptSubmit', mcpHookName: 'user-prompt-submit' },
12
- { event: 'SessionStart', mcpHookName: 'session-start' },
13
- { event: 'SessionEnd', mcpHookName: 'session-end' },
14
- { event: 'Stop', mcpHookName: 'stop' },
12
+ { event: 'SessionStart', mcpHookName: 'session-start', statusMessage: 'Loading grāmatr session context' },
13
+ { event: 'SessionEnd', mcpHookName: 'session-end', statusMessage: 'Saving grāmatr session' },
14
+ { event: 'Stop', mcpHookName: 'stop', statusMessage: 'Submitting grāmatr classification feedback' },
15
15
  ];
16
16
  const CODEX_HOOKS = [
17
17
  {
@@ -1 +1 @@
1
- {"version":3,"file":"integrations.js","sourceRoot":"","sources":["../../src/setup/integrations.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"integrations.js","sourceRoot":"","sources":["../../src/setup/integrations.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gramatr/mcp",
3
- "version": "0.7.5",
3
+ "version": "0.7.6",
4
4
  "description": "grāmatr — Intelligence middleware for AI agents. Pre-classifies every request, injects relevant memory and behavioral context, enforces data quality, and maintains session continuity across Claude, ChatGPT, Codex, Cursor, Gemini, and any MCP-compatible client.",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "publishConfig": {
@@ -48,14 +48,17 @@
48
48
  "LICENSE"
49
49
  ],
50
50
  "dependencies": {
51
- "@modelcontextprotocol/sdk": "^1.12.0"
51
+ "@modelcontextprotocol/sdk": "^1.12.0",
52
+ "better-sqlite3": "^12.9.0"
52
53
  },
53
54
  "devDependencies": {
55
+ "@types/better-sqlite3": "^7.6.13",
54
56
  "typescript": "^5.9.3",
55
57
  "vitest": "^4.0.18"
56
58
  },
57
59
  "scripts": {
58
60
  "build": "tsc --build",
61
+ "deploy": "rm -rf $HOME/.gramatr/mcp/dist && mkdir -p $HOME/.gramatr/mcp && cp -r dist $HOME/.gramatr/mcp/dist && cp package.json $HOME/.gramatr/mcp/package.json && cd $HOME/.gramatr/mcp && npm install --production --no-package-lock --prefer-offline && echo 'Deployed @gramatr/mcp -> ~/.gramatr/mcp'",
59
62
  "clean": "rm -rf dist",
60
63
  "start": "node dist/bin/gramatr-mcp.js",
61
64
  "dev": "tsx src/bin/gramatr-mcp.ts",