memorix 0.9.10 → 0.9.12

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/CHANGELOG.md CHANGED
@@ -2,6 +2,26 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file.
4
4
 
5
+ ## [0.9.12] — 2026-02-25
6
+
7
+ ### Fixed
8
+ - **Copilot hooks format completely wrong** — Was reusing Claude Code's `generateClaudeConfig()` (PascalCase events, `command` field). Copilot requires `version: 1`, `bash`/`powershell` fields, `timeoutSec`, and camelCase event names (`sessionStart`, `userPromptSubmitted`, `preToolUse`, `postToolUse`, `sessionEnd`, `errorOccurred`). Now uses dedicated `generateCopilotConfig()`. Source: [GitHub Docs](https://docs.github.com/en/copilot/reference/hooks-configuration).
9
+ - **Codex fake hooks.json removed** — Codex has no hooks system (only `notify` in config.toml for `agent-turn-complete`). Was generating a non-existent `.codex/hooks.json`. Now only installs rules (AGENTS.md). Source: [OpenAI Codex Config Reference](https://developers.openai.com/codex/config-reference/).
10
+ - **Kiro hook file extension wrong** — Was `.hook.md`, should be `.kiro.hook`. Now generates 3 hook files: `memorix-agent-stop.kiro.hook` (session memory), `memorix-prompt-submit.kiro.hook` (context loading), `memorix-file-save.kiro.hook` (file change tracking). Source: [Kiro Docs](https://kiro.dev/docs/hooks/).
11
+ - **Kiro only had 1 event** — Was only `file_saved`. Now covers `agent_stop`, `prompt_submit`, and `file_save` events.
12
+
13
+ ### Added
14
+ - **Antigravity/Gemini CLI hook installer** — New `generateGeminiConfig()` for `.gemini/settings.json`. PascalCase events (`SessionStart`, `AfterTool`, `AfterAgent`, `PreCompress`), timeout in milliseconds (10000ms). Source: [Gemini CLI Docs](https://geminicli.com/docs/hooks/).
15
+ - **Copilot normalizer** — Dedicated `normalizeCopilot()` function with `inferCopilotEvent()` for payload-based event detection (Copilot sends typed payloads without explicit event names).
16
+ - **Gemini CLI normalizer** — Dedicated `normalizeGemini()` function with event mapping for all 11 Gemini CLI events (`BeforeAgent`, `AfterAgent`, `BeforeTool`, `AfterTool`, `PreCompress`, etc.).
17
+ - **Gemini CLI event mappings** — Full EVENT_MAP entries for Gemini CLI PascalCase events → normalized events.
18
+ - **Copilot event mappings** — EVENT_MAP entries for Copilot-specific camelCase events (`userPromptSubmitted`, `preToolUse`, `postToolUse`, `errorOccurred`).
19
+
20
+ ## [0.9.11] — 2026-02-25
21
+
22
+ ### Fixed
23
+ - **CLI crashes with `Dynamic require of "fs" is not supported`** — When bundling CJS dependencies (like `gray-matter`) into ESM output via `noExternal`, esbuild's CJS-to-ESM wrapper couldn't resolve Node.js built-in modules. Added `createRequire` banner to provide a real `require` function before esbuild's wrapper runs, fixing `require('fs')` and other built-in module calls.
24
+
5
25
  ## [0.9.10] — 2026-02-25
6
26
 
7
27
  ### Fixed
package/README.md CHANGED
@@ -8,7 +8,7 @@
8
8
  <a href="https://www.npmjs.com/package/memorix"><img src="https://img.shields.io/npm/dm/memorix.svg?style=flat-square&color=blue" alt="npm downloads"></a>
9
9
  <a href="LICENSE"><img src="https://img.shields.io/badge/license-Apache%202.0-green.svg?style=flat-square" alt="License"></a>
10
10
  <a href="https://github.com/AVIDS2/memorix"><img src="https://img.shields.io/github/stars/AVIDS2/memorix?style=flat-square&color=yellow" alt="GitHub stars"></a>
11
- <img src="https://img.shields.io/badge/tests-422%20passed-brightgreen?style=flat-square" alt="Tests">
11
+ <img src="https://img.shields.io/badge/tests-491%20passed-brightgreen?style=flat-square" alt="Tests">
12
12
  </p>
13
13
  <p align="center">
14
14
  <img src="https://img.shields.io/badge/Works%20with-Cursor-orange?style=flat-square" alt="Cursor">
@@ -18,6 +18,7 @@
18
18
  <img src="https://img.shields.io/badge/Works%20with-Copilot-lightblue?style=flat-square" alt="Copilot">
19
19
  <img src="https://img.shields.io/badge/Works%20with-Kiro-red?style=flat-square" alt="Kiro">
20
20
  <img src="https://img.shields.io/badge/Works%20with-Antigravity-grey?style=flat-square" alt="Antigravity">
21
+ <img src="https://img.shields.io/badge/Works%20with-Gemini%20CLI-4285F4?style=flat-square" alt="Gemini CLI">
21
22
  </p>
22
23
  <p align="center">
23
24
  <a href="#-stop-re-explaining-your-project">Why</a> •
@@ -43,7 +44,7 @@ Your AI assistant forgets everything when you start a new chat. You spend 10 min
43
44
  | **After 50 tool calls:** Context explodes, restart needed | **After restart:** Picks up right where you left off |
44
45
  | **MCP configs:** Copy-paste between 7 IDEs manually | **MCP configs:** One command syncs everything |
45
46
 
46
- **Memorix solves all of this.** One MCP server. Seven agents. Zero context loss.
47
+ **Memorix solves all of this.** One MCP server. Eight agents. Zero context loss.
47
48
 
48
49
  ---
49
50
 
@@ -112,7 +113,7 @@ Add to Windsurf MCP settings (`~/.codeium/windsurf/mcp_config.json`):
112
113
  </details>
113
114
 
114
115
  <details>
115
- <summary><strong>VS Code Copilot / Codex / Kiro / Antigravity</strong></summary>
116
+ <summary><strong>VS Code Copilot / Codex / Kiro</strong></summary>
116
117
 
117
118
  Same format — add to the agent's MCP config file:
118
119
  ```json
@@ -125,8 +126,24 @@ Same format — add to the agent's MCP config file:
125
126
  }
126
127
  }
127
128
  ```
129
+ </details>
130
+
131
+ <details>
132
+ <summary><strong>Antigravity / Gemini CLI</strong></summary>
128
133
 
129
- **Antigravity only:** Antigravity uses its own install path as CWD. You **must** add:
134
+ Add to `.gemini/settings.json` (project) or `~/.gemini/settings.json` (global):
135
+ ```json
136
+ {
137
+ "mcpServers": {
138
+ "memorix": {
139
+ "command": "memorix",
140
+ "args": ["serve"]
141
+ }
142
+ }
143
+ }
144
+ ```
145
+
146
+ **Antigravity IDE only:** Antigravity uses its own install path as CWD. You **must** add:
130
147
  ```json
131
148
  {
132
149
  "mcpServers": {
@@ -140,13 +157,15 @@ Same format — add to the agent's MCP config file:
140
157
  }
141
158
  }
142
159
  ```
160
+
161
+ **Gemini CLI** reads MCP config from the same path. Hooks are automatically installed to `.gemini/settings.json`.
143
162
  </details>
144
163
 
145
164
  ### Step 3: Restart your agent — done!
146
165
 
147
166
  No API keys. No cloud accounts. No dependencies. Works with any directory (git repo or not).
148
167
 
149
- > 📖 **Full setup guide for all 7 agents** → [docs/SETUP.md](docs/SETUP.md)
168
+ > 📖 **Full setup guide for all 8 agents** → [docs/SETUP.md](docs/SETUP.md)
150
169
 
151
170
  <details>
152
171
  <summary><strong>🔧 Troubleshooting</strong></summary>
@@ -293,7 +312,7 @@ You update your architecture decision 3 times over a week:
293
312
  | What You Say | What Memorix Does |
294
313
  |-------------|-------------------|
295
314
  | "Sync my MCP servers to Kiro" | `memorix_workspace_sync` — Migrates configs, merges (never overwrites) |
296
- | "Check my agent rules" | `memorix_rules_sync` — Scans 7 agents, deduplicates, detects conflicts |
315
+ | "Check my agent rules" | `memorix_rules_sync` — Scans 8 agents, deduplicates, detects conflicts |
297
316
  | "Generate rules for Cursor" | `memorix_rules_sync` — Cross-format conversion (`.mdc` ↔ `CLAUDE.md` ↔ `.kiro/steering/`) |
298
317
  | "Generate project skills" | `memorix_skills` — Creates SKILL.md from observation patterns |
299
318
  | "Inject the auth skill" | `memorix_skills` — Returns skill content directly into agent context |
package/README.zh-CN.md CHANGED
@@ -8,7 +8,7 @@
8
8
  <a href="https://www.npmjs.com/package/memorix"><img src="https://img.shields.io/npm/dm/memorix.svg?style=flat-square&color=blue" alt="npm downloads"></a>
9
9
  <a href="LICENSE"><img src="https://img.shields.io/badge/license-Apache%202.0-green.svg?style=flat-square" alt="License"></a>
10
10
  <a href="https://github.com/AVIDS2/memorix"><img src="https://img.shields.io/github/stars/AVIDS2/memorix?style=flat-square&color=yellow" alt="GitHub stars"></a>
11
- <img src="https://img.shields.io/badge/tests-422%20passed-brightgreen?style=flat-square" alt="Tests">
11
+ <img src="https://img.shields.io/badge/tests-491%20passed-brightgreen?style=flat-square" alt="Tests">
12
12
  </p>
13
13
  <p align="center">
14
14
  <img src="https://img.shields.io/badge/Works%20with-Cursor-orange?style=flat-square" alt="Cursor">
@@ -18,6 +18,7 @@
18
18
  <img src="https://img.shields.io/badge/Works%20with-Copilot-lightblue?style=flat-square" alt="Copilot">
19
19
  <img src="https://img.shields.io/badge/Works%20with-Kiro-red?style=flat-square" alt="Kiro">
20
20
  <img src="https://img.shields.io/badge/Works%20with-Antigravity-grey?style=flat-square" alt="Antigravity">
21
+ <img src="https://img.shields.io/badge/Works%20with-Gemini%20CLI-4285F4?style=flat-square" alt="Gemini CLI">
21
22
  </p>
22
23
  <p align="center">
23
24
  <a href="#-别再反复解释你的项目了">痛点</a> •
@@ -41,9 +42,9 @@
41
42
  | **切换 IDE:** 全部上下文丢失 | **切换 IDE:** 上下文立即跟随 |
42
43
  | **新同事的 AI:** 从零开始 | **新同事的 AI:** 已了解整个代码库 |
43
44
  | **50 次工具调用后:** 上下文爆炸,需要重开 | **重开后:** 无缝恢复到上次状态 |
44
- | **MCP 配置:** 在 7 个 IDE 之间手动复制粘贴 | **MCP 配置:** 一条命令全部同步 |
45
+ | **MCP 配置:** 在 8 个 IDE 之间手动复制粘贴 | **MCP 配置:** 一条命令全部同步 |
45
46
 
46
- **Memorix 解决所有这些问题。** 一个 MCP 服务器。七个 Agent。零上下文丢失。
47
+ **Memorix 解决所有这些问题。** 一个 MCP 服务器。八个 Agent。零上下文丢失。
47
48
 
48
49
  ---
49
50
 
@@ -112,7 +113,7 @@ claude mcp add memorix -- memorix serve
112
113
  </details>
113
114
 
114
115
  <details>
115
- <summary><strong>VS Code Copilot / Codex / Kiro / Antigravity</strong></summary>
116
+ <summary><strong>VS Code Copilot / Codex / Kiro</strong></summary>
116
117
 
117
118
  同样的格式 — 添加到对应 Agent 的 MCP 配置文件:
118
119
  ```json
@@ -125,8 +126,24 @@ claude mcp add memorix -- memorix serve
125
126
  }
126
127
  }
127
128
  ```
129
+ </details>
130
+
131
+ <details>
132
+ <summary><strong>Antigravity / Gemini CLI</strong></summary>
128
133
 
129
- **仅 Antigravity:** Antigravity 使用自身安装路径作为工作目录,**必须**添加:
134
+ 添加到 `.gemini/settings.json`(项目级)或 `~/.gemini/settings.json`(全局):
135
+ ```json
136
+ {
137
+ "mcpServers": {
138
+ "memorix": {
139
+ "command": "memorix",
140
+ "args": ["serve"]
141
+ }
142
+ }
143
+ }
144
+ ```
145
+
146
+ **仅 Antigravity IDE:** Antigravity 使用自身安装路径作为工作目录,**必须**添加:
130
147
  ```json
131
148
  {
132
149
  "mcpServers": {
@@ -140,13 +157,15 @@ claude mcp add memorix -- memorix serve
140
157
  }
141
158
  }
142
159
  ```
160
+
161
+ **Gemini CLI** 读取相同路径的 MCP 配置。Hooks 会自动安装到 `.gemini/settings.json`。
143
162
  </details>
144
163
 
145
164
  ### 第三步:重启你的 Agent — 完成!
146
165
 
147
166
  不需要 API Key,不需要云账号,不需要额外依赖。**任何目录都能用**(有没有 git 都行)。
148
167
 
149
- > 📖 **7 个 Agent 的完整配置指南** → [docs/SETUP.md](docs/SETUP.md)
168
+ > 📖 **8 个 Agent 的完整配置指南** → [docs/SETUP.md](docs/SETUP.md)
150
169
 
151
170
  <details>
152
171
  <summary><strong>🔧 常见问题</strong></summary>
package/dist/cli/index.js CHANGED
@@ -1,4 +1,6 @@
1
1
  #!/usr/bin/env node
2
+ import {createRequire as __memorix_cjsRequire} from "module";
3
+ const require = __memorix_cjsRequire(import.meta.url);
2
4
  var __create = Object.create;
3
5
  var __defProp = Object.defineProperty;
4
6
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
@@ -39382,6 +39384,42 @@ function generateClaudeConfig() {
39382
39384
  }
39383
39385
  };
39384
39386
  }
39387
+ function generateCopilotConfig() {
39388
+ const cmd = `${resolveHookCommand()} hook`;
39389
+ const hookEntry = {
39390
+ type: "command",
39391
+ bash: cmd,
39392
+ powershell: cmd,
39393
+ timeoutSec: 10
39394
+ };
39395
+ return {
39396
+ version: 1,
39397
+ hooks: {
39398
+ sessionStart: [hookEntry],
39399
+ sessionEnd: [hookEntry],
39400
+ userPromptSubmitted: [hookEntry],
39401
+ preToolUse: [hookEntry],
39402
+ postToolUse: [hookEntry],
39403
+ errorOccurred: [hookEntry]
39404
+ }
39405
+ };
39406
+ }
39407
+ function generateGeminiConfig() {
39408
+ const cmd = `${resolveHookCommand()} hook`;
39409
+ const hookEntry = {
39410
+ type: "command",
39411
+ command: cmd,
39412
+ timeout: 1e4
39413
+ };
39414
+ return {
39415
+ hooks: {
39416
+ SessionStart: [{ hooks: [hookEntry] }],
39417
+ AfterTool: [{ hooks: [hookEntry] }],
39418
+ AfterAgent: [{ hooks: [hookEntry] }],
39419
+ PreCompress: [{ hooks: [hookEntry] }]
39420
+ }
39421
+ };
39422
+ }
39385
39423
  function generateWindsurfConfig() {
39386
39424
  const cmd = `${resolveHookCommand()} hook`;
39387
39425
  const hookEntry = {
@@ -39414,20 +39452,51 @@ function generateCursorConfig() {
39414
39452
  }
39415
39453
  };
39416
39454
  }
39417
- function generateKiroHookFile() {
39418
- return `---
39419
- title: Memorix Auto-Memory
39420
- description: Automatically record development context for cross-agent memory sharing
39421
- event: file_saved
39422
- filePattern: "**/*"
39455
+ function generateKiroHookFiles() {
39456
+ const cmd = `${resolveHookCommand()} hook`;
39457
+ return [
39458
+ {
39459
+ filename: "memorix-agent-stop.kiro.hook",
39460
+ content: `---
39461
+ title: Memorix Session Memory
39462
+ description: Record session context when agent completes a turn
39463
+ event: agent_stop
39423
39464
  ---
39424
39465
 
39425
- Run the memorix hook command to analyze changes and store relevant memories:
39466
+ Call memorix MCP tools to store important context from this conversation:
39467
+ 1. Use memorix_store to record any decisions, bug fixes, gotchas, or configuration changes
39468
+ 2. Include relevant file paths and concepts for searchability
39469
+ `
39470
+ },
39471
+ {
39472
+ filename: "memorix-prompt-submit.kiro.hook",
39473
+ content: `---
39474
+ title: Memorix Context Loader
39475
+ description: Load relevant memories when user submits a prompt
39476
+ event: prompt_submit
39477
+ ---
39478
+
39479
+ Before responding, search for relevant context:
39480
+ 1. Call memorix_search with a query related to the user's prompt
39481
+ 2. If results are found, use memorix_detail to fetch the most relevant ones
39482
+ 3. Reference relevant memories naturally in your response
39483
+ `
39484
+ },
39485
+ {
39486
+ filename: "memorix-file-save.kiro.hook",
39487
+ content: `---
39488
+ title: Memorix File Change Tracker
39489
+ description: Track significant file changes for cross-session memory
39490
+ event: file_save
39491
+ filePattern: "**/*.{ts,js,tsx,jsx,py,rs,go,java,md}"
39492
+ ---
39426
39493
 
39427
39494
  \`\`\`bash
39428
- ${resolveHookCommand()} hook
39495
+ ${cmd}
39429
39496
  \`\`\`
39430
- `;
39497
+ `
39498
+ }
39499
+ ];
39431
39500
  }
39432
39501
  function getProjectConfigPath(agent, projectRoot) {
39433
39502
  switch (agent) {
@@ -39440,9 +39509,11 @@ function getProjectConfigPath(agent, projectRoot) {
39440
39509
  case "cursor":
39441
39510
  return path6.join(projectRoot, ".cursor", "hooks.json");
39442
39511
  case "kiro":
39443
- return path6.join(projectRoot, ".kiro", "hooks", "memorix.hook.md");
39512
+ return path6.join(projectRoot, ".kiro", "hooks", "memorix-agent-stop.kiro.hook");
39444
39513
  case "codex":
39445
- return path6.join(projectRoot, ".codex", "hooks.json");
39514
+ return path6.join(projectRoot, "AGENTS.md");
39515
+ case "antigravity":
39516
+ return path6.join(projectRoot, ".gemini", "settings.json");
39446
39517
  default:
39447
39518
  return path6.join(projectRoot, ".memorix", "hooks.json");
39448
39519
  }
@@ -39457,6 +39528,8 @@ function getGlobalConfigPath(agent) {
39457
39528
  return path6.join(home, ".codeium", "windsurf", "hooks.json");
39458
39529
  case "cursor":
39459
39530
  return path6.join(home, ".cursor", "hooks.json");
39531
+ case "antigravity":
39532
+ return path6.join(home, ".gemini", "settings.json");
39460
39533
  default:
39461
39534
  return path6.join(home, ".memorix", "hooks.json");
39462
39535
  }
@@ -39502,9 +39575,9 @@ async function detectInstalledAgents() {
39502
39575
  agents.push("codex");
39503
39576
  } catch {
39504
39577
  }
39505
- const antigravityDir = path6.join(home, ".gemini", "antigravity");
39578
+ const geminiDir = path6.join(home, ".gemini");
39506
39579
  try {
39507
- await fs4.access(antigravityDir);
39580
+ await fs4.access(geminiDir);
39508
39581
  agents.push("antigravity");
39509
39582
  } catch {
39510
39583
  }
@@ -39515,24 +39588,42 @@ async function installHooks(agent, projectRoot, global = false) {
39515
39588
  let generated;
39516
39589
  switch (agent) {
39517
39590
  case "claude":
39518
- case "copilot":
39519
39591
  generated = generateClaudeConfig();
39520
39592
  break;
39593
+ case "copilot":
39594
+ generated = generateCopilotConfig();
39595
+ break;
39521
39596
  case "windsurf":
39522
39597
  generated = generateWindsurfConfig();
39523
39598
  break;
39524
39599
  case "cursor":
39525
39600
  generated = generateCursorConfig();
39526
39601
  break;
39602
+ case "antigravity":
39603
+ generated = generateGeminiConfig();
39604
+ break;
39527
39605
  case "kiro":
39528
- generated = generateKiroHookFile();
39606
+ generated = "kiro-multi";
39529
39607
  break;
39608
+ case "codex":
39609
+ await installAgentRules(agent, projectRoot);
39610
+ return {
39611
+ agent,
39612
+ configPath: getProjectConfigPath(agent, projectRoot),
39613
+ events: [],
39614
+ generated: { note: "Codex has no hooks system, only rules (AGENTS.md) installed" }
39615
+ };
39530
39616
  default:
39531
39617
  generated = generateClaudeConfig();
39532
39618
  }
39533
39619
  await fs4.mkdir(path6.dirname(configPath), { recursive: true });
39534
39620
  if (agent === "kiro") {
39535
- await fs4.writeFile(configPath, generated, "utf-8");
39621
+ const hookFiles = generateKiroHookFiles();
39622
+ const hooksDir = path6.join(path6.dirname(configPath));
39623
+ await fs4.mkdir(hooksDir, { recursive: true });
39624
+ for (const hf of hookFiles) {
39625
+ await fs4.writeFile(path6.join(hooksDir, hf.filename), hf.content, "utf-8");
39626
+ }
39536
39627
  } else {
39537
39628
  let existing = {};
39538
39629
  try {
@@ -39551,17 +39642,22 @@ async function installHooks(agent, projectRoot, global = false) {
39551
39642
  const events = [];
39552
39643
  switch (agent) {
39553
39644
  case "claude":
39554
- case "copilot":
39555
39645
  events.push("session_start", "post_tool", "user_prompt", "pre_compact", "session_end");
39556
39646
  break;
39647
+ case "copilot":
39648
+ events.push("session_start", "session_end", "user_prompt", "post_tool");
39649
+ break;
39557
39650
  case "windsurf":
39558
39651
  events.push("post_edit", "post_command", "post_tool", "user_prompt", "post_response");
39559
39652
  break;
39560
39653
  case "cursor":
39561
- events.push("user_prompt", "post_edit", "session_end");
39654
+ events.push("session_start", "user_prompt", "post_edit", "post_tool", "pre_compact", "session_end");
39655
+ break;
39656
+ case "antigravity":
39657
+ events.push("session_start", "post_tool", "post_response", "pre_compact");
39562
39658
  break;
39563
39659
  case "kiro":
39564
- events.push("post_edit");
39660
+ events.push("session_end", "user_prompt", "post_edit");
39565
39661
  break;
39566
39662
  }
39567
39663
  await installAgentRules(agent, projectRoot);
@@ -43222,10 +43318,13 @@ var init_sync = __esm({
43222
43318
  function detectAgent(payload) {
43223
43319
  if ("agent_action_name" in payload) return "windsurf";
43224
43320
  if ("conversation_id" in payload || "cursor_version" in payload) return "cursor";
43225
- if ("hook_event_name" in payload) return "claude";
43226
- if ("hookEventName" in payload) return "copilot";
43321
+ if ("gemini_session_id" in payload || "gemini_project_dir" in payload) return "antigravity";
43322
+ if ("hook_event_name" in payload && "session_id" in payload) return "claude";
43323
+ if ("hook_event_name" in payload) {
43324
+ return "claude";
43325
+ }
43326
+ if ("toolName" in payload || "initialPrompt" in payload || "reason" in payload) return "copilot";
43227
43327
  if ("event_type" in payload) return "kiro";
43228
- if ("hook_type" in payload) return "codex";
43229
43328
  return "claude";
43230
43329
  }
43231
43330
  function extractEventName(payload, agent) {
@@ -43235,13 +43334,13 @@ function extractEventName(payload, agent) {
43235
43334
  case "cursor":
43236
43335
  return payload.hook_event_name ?? inferCursorEvent(payload);
43237
43336
  case "claude":
43238
- return payload.hook_event_name ?? payload.hookEventName ?? "";
43337
+ return payload.hook_event_name ?? "";
43338
+ case "antigravity":
43339
+ return payload.hook_event_name ?? "";
43239
43340
  case "copilot":
43240
- return payload.hookEventName ?? "";
43341
+ return inferCopilotEvent(payload);
43241
43342
  case "kiro":
43242
43343
  return payload.event_type ?? "";
43243
- case "codex":
43244
- return payload.hook_type ?? "";
43245
43344
  default:
43246
43345
  return "";
43247
43346
  }
@@ -43309,6 +43408,15 @@ function normalizeWindsurf(payload, event) {
43309
43408
  }
43310
43409
  return result;
43311
43410
  }
43411
+ function inferCopilotEvent(payload) {
43412
+ if ("source" in payload && "initialPrompt" in payload) return "sessionStart";
43413
+ if ("reason" in payload && !("toolName" in payload)) return "sessionEnd";
43414
+ if ("prompt" in payload) return "userPromptSubmitted";
43415
+ if ("toolName" in payload && "toolResult" in payload) return "postToolUse";
43416
+ if ("toolName" in payload) return "preToolUse";
43417
+ if ("error" in payload) return "errorOccurred";
43418
+ return "";
43419
+ }
43312
43420
  function inferCursorEvent(payload) {
43313
43421
  if ("composer_mode" in payload) return "sessionStart";
43314
43422
  if ("prompt" in payload) return "beforeSubmitPrompt";
@@ -43347,6 +43455,59 @@ function normalizeCursor(payload, event) {
43347
43455
  }
43348
43456
  return result;
43349
43457
  }
43458
+ function normalizeCopilot(payload, event) {
43459
+ const result = {
43460
+ sessionId: "",
43461
+ cwd: payload.cwd ?? ""
43462
+ };
43463
+ switch (event) {
43464
+ case "session_start":
43465
+ result.userPrompt = payload.initialPrompt ?? "";
43466
+ break;
43467
+ case "user_prompt":
43468
+ result.userPrompt = payload.prompt ?? "";
43469
+ break;
43470
+ case "post_tool": {
43471
+ result.toolName = payload.toolName ?? "";
43472
+ const toolArgs = payload.toolArgs;
43473
+ if (toolArgs) {
43474
+ try {
43475
+ result.toolInput = JSON.parse(toolArgs);
43476
+ } catch {
43477
+ }
43478
+ }
43479
+ const toolResult = payload.toolResult;
43480
+ if (toolResult) {
43481
+ result.toolResult = toolResult.textResultForLlm ?? JSON.stringify(toolResult);
43482
+ }
43483
+ break;
43484
+ }
43485
+ case "session_end":
43486
+ break;
43487
+ }
43488
+ return result;
43489
+ }
43490
+ function normalizeGemini(payload, event) {
43491
+ const result = {
43492
+ sessionId: payload.gemini_session_id ?? payload.session_id ?? "",
43493
+ cwd: payload.cwd ?? payload.gemini_project_dir ?? ""
43494
+ };
43495
+ const toolName = payload.tool_name ?? "";
43496
+ if (toolName) {
43497
+ result.toolName = toolName;
43498
+ result.toolInput = payload.tool_input;
43499
+ const toolResponse = payload.tool_response ?? payload.tool_result;
43500
+ if (typeof toolResponse === "string") {
43501
+ result.toolResult = toolResponse;
43502
+ } else if (toolResponse && typeof toolResponse === "object") {
43503
+ result.toolResult = JSON.stringify(toolResponse);
43504
+ }
43505
+ }
43506
+ if (event === "user_prompt") {
43507
+ result.userPrompt = payload.prompt ?? "";
43508
+ }
43509
+ return result;
43510
+ }
43350
43511
  function normalizeHookInput(payload) {
43351
43512
  const directEvent = typeof payload.event === "string" ? EVENT_MAP[payload.event] : void 0;
43352
43513
  const agent = detectAgent(payload);
@@ -43356,15 +43517,20 @@ function normalizeHookInput(payload) {
43356
43517
  let agentSpecific = {};
43357
43518
  switch (agent) {
43358
43519
  case "claude":
43359
- case "copilot":
43360
43520
  agentSpecific = normalizeClaude(payload, event);
43361
43521
  break;
43522
+ case "copilot":
43523
+ agentSpecific = normalizeCopilot(payload, event);
43524
+ break;
43362
43525
  case "windsurf":
43363
43526
  agentSpecific = normalizeWindsurf(payload, event);
43364
43527
  break;
43365
43528
  case "cursor":
43366
43529
  agentSpecific = normalizeCursor(payload, event);
43367
43530
  break;
43531
+ case "antigravity":
43532
+ agentSpecific = normalizeGemini(payload, event);
43533
+ break;
43368
43534
  default:
43369
43535
  agentSpecific = { sessionId: "", cwd: "" };
43370
43536
  }
@@ -43394,7 +43560,7 @@ var init_normalizer = __esm({
43394
43560
  pre_compact: "pre_compact",
43395
43561
  session_end: "session_end",
43396
43562
  post_response: "post_response",
43397
- // Claude Code / VS Code Copilot
43563
+ // Claude Code
43398
43564
  SessionStart: "session_start",
43399
43565
  UserPromptSubmit: "user_prompt",
43400
43566
  PreToolUse: "post_tool",
@@ -43402,6 +43568,22 @@ var init_normalizer = __esm({
43402
43568
  PostToolUse: "post_tool",
43403
43569
  PreCompact: "pre_compact",
43404
43570
  Stop: "session_end",
43571
+ SessionEnd: "session_end",
43572
+ // GitHub Copilot (camelCase, different names from Cursor)
43573
+ userPromptSubmitted: "user_prompt",
43574
+ preToolUse: "post_tool",
43575
+ postToolUse: "post_tool",
43576
+ errorOccurred: "session_end",
43577
+ // Gemini CLI / Antigravity (PascalCase, different events from Claude Code)
43578
+ BeforeAgent: "user_prompt",
43579
+ AfterAgent: "post_response",
43580
+ BeforeModel: "user_prompt",
43581
+ AfterModel: "post_response",
43582
+ BeforeToolSelection: "post_tool",
43583
+ BeforeTool: "post_tool",
43584
+ AfterTool: "post_tool",
43585
+ PreCompress: "pre_compact",
43586
+ Notification: "post_response",
43405
43587
  // Windsurf
43406
43588
  pre_user_prompt: "user_prompt",
43407
43589
  post_write_code: "post_edit",
@@ -43410,7 +43592,7 @@ var init_normalizer = __esm({
43410
43592
  pre_mcp_tool_use: "post_tool",
43411
43593
  post_mcp_tool_use: "post_tool",
43412
43594
  post_cascade_response: "post_response",
43413
- // Cursor (camelCase event names)
43595
+ // Cursor (camelCase event names — distinct from Copilot by hook_event_name field)
43414
43596
  sessionStart: "session_start",
43415
43597
  sessionEnd: "session_end",
43416
43598
  beforeSubmitPrompt: "user_prompt",