@alan512/experienceengine 0.3.6 → 0.4.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 (137) hide show
  1. package/README.md +15 -4
  2. package/README.zh-CN.md +15 -4
  3. package/dist/adapters/antigravity/artifact-analyzer.d.ts +27 -0
  4. package/dist/adapters/antigravity/artifact-analyzer.js +151 -0
  5. package/dist/adapters/antigravity/artifact-analyzer.js.map +1 -0
  6. package/dist/adapters/codex/behavior-loop.d.ts +15 -43
  7. package/dist/adapters/codex/behavior-loop.js +2 -215
  8. package/dist/adapters/codex/behavior-loop.js.map +1 -1
  9. package/dist/adapters/codex/mcp-server.d.ts +37 -44
  10. package/dist/adapters/codex/mcp-server.js +5 -427
  11. package/dist/adapters/codex/mcp-server.js.map +1 -1
  12. package/dist/adapters/shared-mcp/action-registry.d.ts +121 -0
  13. package/dist/adapters/shared-mcp/action-registry.js +435 -0
  14. package/dist/adapters/shared-mcp/action-registry.js.map +1 -0
  15. package/dist/adapters/shared-mcp/behavior-loop.d.ts +91 -0
  16. package/dist/adapters/shared-mcp/behavior-loop.js +218 -0
  17. package/dist/adapters/shared-mcp/behavior-loop.js.map +1 -0
  18. package/dist/adapters/shared-mcp/server.d.ts +113 -0
  19. package/dist/adapters/shared-mcp/server.js +423 -0
  20. package/dist/adapters/shared-mcp/server.js.map +1 -0
  21. package/dist/cli/commands/agy-exec.d.ts +23 -0
  22. package/dist/cli/commands/agy-exec.js +92 -0
  23. package/dist/cli/commands/agy-exec.js.map +1 -0
  24. package/dist/cli/commands/antigravity-hook.d.ts +58 -0
  25. package/dist/cli/commands/antigravity-hook.js +192 -0
  26. package/dist/cli/commands/antigravity-hook.js.map +1 -0
  27. package/dist/cli/commands/antigravity.d.ts +8 -0
  28. package/dist/cli/commands/antigravity.js +37 -0
  29. package/dist/cli/commands/antigravity.js.map +1 -0
  30. package/dist/cli/commands/doctor.d.ts +2 -0
  31. package/dist/cli/commands/doctor.js +160 -3
  32. package/dist/cli/commands/doctor.js.map +1 -1
  33. package/dist/cli/commands/inspect.js +78 -1
  34. package/dist/cli/commands/inspect.js.map +1 -1
  35. package/dist/cli/commands/install.d.ts +3 -1
  36. package/dist/cli/commands/install.js +32 -2
  37. package/dist/cli/commands/install.js.map +1 -1
  38. package/dist/cli/commands/maintenance.js +80 -2
  39. package/dist/cli/commands/maintenance.js.map +1 -1
  40. package/dist/cli/commands/mcp-server.js +10 -2
  41. package/dist/cli/commands/mcp-server.js.map +1 -1
  42. package/dist/cli/commands/repair.d.ts +1 -1
  43. package/dist/cli/commands/repair.js +21 -3
  44. package/dist/cli/commands/repair.js.map +1 -1
  45. package/dist/cli/commands/upgrade.d.ts +4 -1
  46. package/dist/cli/commands/upgrade.js +25 -2
  47. package/dist/cli/commands/upgrade.js.map +1 -1
  48. package/dist/cli/dispatch.js +22 -6
  49. package/dist/cli/dispatch.js.map +1 -1
  50. package/dist/compiler/command-normalizer.d.ts +27 -0
  51. package/dist/compiler/command-normalizer.js +263 -0
  52. package/dist/compiler/command-normalizer.js.map +1 -0
  53. package/dist/compiler/trajectory-compiler.d.ts +12 -0
  54. package/dist/compiler/trajectory-compiler.js +179 -0
  55. package/dist/compiler/trajectory-compiler.js.map +1 -0
  56. package/dist/compiler/trajectory-matcher.d.ts +18 -0
  57. package/dist/compiler/trajectory-matcher.js +419 -0
  58. package/dist/compiler/trajectory-matcher.js.map +1 -0
  59. package/dist/config/config-schema.d.ts +11 -0
  60. package/dist/config/config-schema.js +9 -0
  61. package/dist/config/config-schema.js.map +1 -1
  62. package/dist/config/default-config.js +1 -0
  63. package/dist/config/default-config.js.map +1 -1
  64. package/dist/controller/candidate-retriever.d.ts +3 -1
  65. package/dist/controller/candidate-retriever.js +247 -7
  66. package/dist/controller/candidate-retriever.js.map +1 -1
  67. package/dist/controller/intervention-controller.js +48 -21
  68. package/dist/controller/intervention-controller.js.map +1 -1
  69. package/dist/controller/trigger-evaluator.d.ts +2 -1
  70. package/dist/controller/trigger-evaluator.js +10 -4
  71. package/dist/controller/trigger-evaluator.js.map +1 -1
  72. package/dist/experience-management/node-lifecycle-governance.js +25 -6
  73. package/dist/experience-management/node-lifecycle-governance.js.map +1 -1
  74. package/dist/input/fingerprint-extractor.d.ts +53 -0
  75. package/dist/input/fingerprint-extractor.js +620 -0
  76. package/dist/input/fingerprint-extractor.js.map +1 -0
  77. package/dist/install/antigravity-global-wiring.d.ts +25 -0
  78. package/dist/install/antigravity-global-wiring.js +165 -0
  79. package/dist/install/antigravity-global-wiring.js.map +1 -0
  80. package/dist/install/antigravity-project-wiring.d.ts +24 -0
  81. package/dist/install/antigravity-project-wiring.js +380 -0
  82. package/dist/install/antigravity-project-wiring.js.map +1 -0
  83. package/dist/install/antigravity.d.ts +78 -0
  84. package/dist/install/antigravity.js +169 -0
  85. package/dist/install/antigravity.js.map +1 -0
  86. package/dist/install/host-detection.d.ts +1 -1
  87. package/dist/install/host-detection.js +2 -1
  88. package/dist/install/host-detection.js.map +1 -1
  89. package/dist/install/public-install.d.ts +2 -0
  90. package/dist/install/public-install.js +8 -0
  91. package/dist/install/public-install.js.map +1 -1
  92. package/dist/interaction/operational-actions-service.d.ts +8 -5
  93. package/dist/interaction/operational-actions-service.js +36 -6
  94. package/dist/interaction/operational-actions-service.js.map +1 -1
  95. package/dist/interaction/operational-service.d.ts +3 -1
  96. package/dist/interaction/operational-service.js +9 -0
  97. package/dist/interaction/operational-service.js.map +1 -1
  98. package/dist/interaction/service.d.ts +11 -1
  99. package/dist/interaction/service.js +11 -1
  100. package/dist/interaction/service.js.map +1 -1
  101. package/dist/maintenance/vector-migrator.d.ts +37 -0
  102. package/dist/maintenance/vector-migrator.js +170 -0
  103. package/dist/maintenance/vector-migrator.js.map +1 -0
  104. package/dist/plugin/openclaw-plugin.d.ts +8 -0
  105. package/dist/runtime/prompt-service.js +10 -0
  106. package/dist/runtime/prompt-service.js.map +1 -1
  107. package/dist/runtime/service.d.ts +2 -0
  108. package/dist/runtime/service.js +127 -2
  109. package/dist/runtime/service.js.map +1 -1
  110. package/dist/store/sqlite/db.js +18 -1
  111. package/dist/store/sqlite/db.js.map +1 -1
  112. package/dist/store/sqlite/repositories/attribution-record-repo.js +12 -0
  113. package/dist/store/sqlite/repositories/attribution-record-repo.js.map +1 -1
  114. package/dist/store/sqlite/repositories/node-repo.d.ts +1 -0
  115. package/dist/store/sqlite/repositories/node-repo.js +47 -2
  116. package/dist/store/sqlite/repositories/node-repo.js.map +1 -1
  117. package/dist/store/sqlite/repositories/scope-fingerprint-repo.d.ts +8 -0
  118. package/dist/store/sqlite/repositories/scope-fingerprint-repo.js +23 -0
  119. package/dist/store/sqlite/repositories/scope-fingerprint-repo.js.map +1 -0
  120. package/dist/store/sqlite/schema.sql +26 -0
  121. package/dist/store/vector/embeddings.d.ts +4 -2
  122. package/dist/store/vector/embeddings.js +19 -6
  123. package/dist/store/vector/embeddings.js.map +1 -1
  124. package/dist/store/vector/local-provider.d.ts +1 -1
  125. package/dist/store/vector/local-provider.js +40 -8
  126. package/dist/store/vector/local-provider.js.map +1 -1
  127. package/dist/store/vector/offline-manifest.d.ts +7 -0
  128. package/dist/store/vector/offline-manifest.js +162 -0
  129. package/dist/store/vector/offline-manifest.js.map +1 -0
  130. package/dist/store/vector/provider-types.d.ts +1 -0
  131. package/dist/types/domain.d.ts +112 -2
  132. package/dist/types/plugin.d.ts +1 -0
  133. package/docs/releases/v0.4.0.md +39 -0
  134. package/docs/releases/v0.4.1.md +22 -0
  135. package/docs/user-guide.md +119 -3
  136. package/openclaw.plugin.json +1 -1
  137. package/package.json +68 -68
@@ -0,0 +1,165 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { dirname, join, resolve } from "node:path";
4
+ import { resolveExperienceEnginePaths } from "../config/path-resolver.js";
5
+ import { resolveExperienceEnginePackageRoot } from "./openclaw-cli.js";
6
+ import { buildAntigravityHookLauncher, buildAntigravityHooksConfig, runAntigravityHookSpikeVerification } from "./antigravity-project-wiring.js";
7
+ const resolveAntigravityHome = (homeDir) => resolve(homeDir ?? homedir());
8
+ const getAgentDesktopPluginDir = (homeDir) => join(resolveAntigravityHome(homeDir), ".gemini", "config", "plugins", "experienceengine");
9
+ const getAgyCliPluginDir = (homeDir) => join(resolveAntigravityHome(homeDir), ".gemini", "antigravity-cli", "plugins", "experienceengine");
10
+ const getIdePluginDir = (homeDir) => join(resolveAntigravityHome(homeDir), ".gemini", "antigravity-ide", "plugins", "experienceengine");
11
+ const getIdeMcpCacheDir = (homeDir) => join(resolveAntigravityHome(homeDir), ".gemini", "antigravity-ide", "mcp", "experienceengine");
12
+ const getAgentDesktopMcpConfigPath = (homeDir) => join(resolveAntigravityHome(homeDir), ".gemini", "antigravity", "mcp_config.json");
13
+ const getSharedMcpConfigPath = (homeDir) => join(resolveAntigravityHome(homeDir), ".gemini", "config", "mcp_config.json");
14
+ const readJsonObject = (path) => {
15
+ if (!existsSync(path)) {
16
+ return {};
17
+ }
18
+ try {
19
+ const text = readFileSync(path, "utf8").trim();
20
+ return text ? JSON.parse(text) : {};
21
+ }
22
+ catch {
23
+ return {};
24
+ }
25
+ };
26
+ const buildServerConfig = (cliScript) => ({
27
+ command: "node",
28
+ args: [cliScript, "mcp-server"],
29
+ env: {
30
+ EXPERIENCE_ENGINE_ADAPTER: "antigravity"
31
+ }
32
+ });
33
+ const writePlugin = (pluginDir, cliScript, productHome) => {
34
+ mkdirSync(pluginDir, { recursive: true });
35
+ writeFileSync(join(pluginDir, "plugin.json"), `${JSON.stringify({
36
+ name: "experienceengine",
37
+ description: "ExperienceEngine lifecycle hooks and MCP server for Antigravity.",
38
+ disabled: false
39
+ }, null, 2)}\n`, "utf8");
40
+ writeFileSync(join(pluginDir, "mcp_config.json"), `${JSON.stringify({ mcpServers: { experienceengine: buildServerConfig(cliScript) } }, null, 2)}\n`, "utf8");
41
+ const launcherPath = join(pluginDir, "experienceengine-antigravity-hook.mjs");
42
+ writeFileSync(launcherPath, buildAntigravityHookLauncher(cliScript, productHome.replace(/\\/g, "/")), "utf8");
43
+ const hookCommand = "node experienceengine-antigravity-hook.mjs";
44
+ writeFileSync(join(pluginDir, "hooks.json"), `${JSON.stringify(buildAntigravityHooksConfig(hookCommand), null, 2)}\n`, "utf8");
45
+ };
46
+ const upsertAgentDesktopMcpConfig = (mcpConfigPath, cliScript) => {
47
+ mkdirSync(dirname(mcpConfigPath), { recursive: true });
48
+ const config = readJsonObject(mcpConfigPath);
49
+ config.mcpServers = {
50
+ ...(config.mcpServers ?? {}),
51
+ experienceengine: buildServerConfig(cliScript)
52
+ };
53
+ writeFileSync(mcpConfigPath, `${JSON.stringify(config, null, 2)}\n`, "utf8");
54
+ };
55
+ const pluginHasExperienceEngine = (pluginDir) => {
56
+ const pluginPath = join(pluginDir, "plugin.json");
57
+ const hooksPath = join(pluginDir, "hooks.json");
58
+ const mcpPath = join(pluginDir, "mcp_config.json");
59
+ if (!existsSync(pluginPath) || !existsSync(hooksPath) || !existsSync(mcpPath)) {
60
+ return false;
61
+ }
62
+ const plugin = readJsonObject(pluginPath);
63
+ const hooks = readJsonObject(hooksPath);
64
+ const mcp = readJsonObject(mcpPath);
65
+ return Boolean(plugin.name === "experienceengine"
66
+ && plugin.disabled !== true
67
+ && hooks.experienceengine?.PreInvocation?.length
68
+ && hooks.experienceengine?.PreToolUse?.length
69
+ && hooks.experienceengine?.PostToolUse?.length
70
+ && hooks.experienceengine?.Stop?.length
71
+ && mcp.mcpServers?.experienceengine);
72
+ };
73
+ const ideMcpCacheHasExperienceEngine = (cacheDir) => existsSync(join(cacheDir, "experienceengine_get_capabilities.json"))
74
+ || existsSync(join(cacheDir, "experienceengine_lookup_hints.json"))
75
+ || existsSync(join(cacheDir, "experienceengine_doctor.json"));
76
+ const mcpConfigHasExperienceEngine = (mcpConfigPath) => {
77
+ const config = readJsonObject(mcpConfigPath);
78
+ return Boolean(config.mcpServers?.experienceengine);
79
+ };
80
+ export const inspectAntigravityGlobalWiring = (options = {}) => {
81
+ const packageRoot = resolveExperienceEnginePackageRoot();
82
+ const cliScript = join(packageRoot, "dist/cli/index.js").replace(/\\/g, "/");
83
+ const agentDesktopPluginDir = getAgentDesktopPluginDir(options.homeDir);
84
+ const agyCliPluginDir = getAgyCliPluginDir(options.homeDir);
85
+ const idePluginDir = getIdePluginDir(options.homeDir);
86
+ const ideMcpCacheDir = getIdeMcpCacheDir(options.homeDir);
87
+ const mcpConfigPath = getAgentDesktopMcpConfigPath(options.homeDir);
88
+ const agentDesktopPluginRegistered = pluginHasExperienceEngine(agentDesktopPluginDir);
89
+ const agyCliPluginRegistered = pluginHasExperienceEngine(agyCliPluginDir);
90
+ const idePluginRegistered = pluginHasExperienceEngine(idePluginDir);
91
+ const ideMcpToolCacheRegistered = ideMcpCacheHasExperienceEngine(ideMcpCacheDir);
92
+ const hooksRegistered = agentDesktopPluginRegistered && agyCliPluginRegistered;
93
+ const ideHooksRegistered = idePluginRegistered || agentDesktopPluginRegistered;
94
+ const ideActivation = ideHooksRegistered
95
+ ? "hooks_observed"
96
+ : ideMcpToolCacheRegistered
97
+ ? "mcp_cache_observed"
98
+ : "unsupported";
99
+ const sharedMcpConfigPath = getSharedMcpConfigPath(options.homeDir);
100
+ const mcpRegistered = mcpConfigHasExperienceEngine(mcpConfigPath)
101
+ || mcpConfigHasExperienceEngine(sharedMcpConfigPath)
102
+ || agentDesktopPluginRegistered
103
+ || agyCliPluginRegistered;
104
+ const lifecycleMode = hooksRegistered ? "host_native_hooks_validated" : "mcp_only";
105
+ return {
106
+ lifecycleMode,
107
+ agentDesktopGlobalActivation: hooksRegistered ? "supported" : "unknown",
108
+ agentDesktopPluginDir,
109
+ agentDesktopPluginRegistered,
110
+ agyCliPluginDir,
111
+ agyCliPluginRegistered,
112
+ idePluginDir,
113
+ idePluginRegistered,
114
+ ideHooksRegistered,
115
+ ideMcpCacheDir,
116
+ ideMcpToolCacheRegistered,
117
+ ideActivation,
118
+ mcpConfigPath,
119
+ mcpRegistered,
120
+ hooksRegistered,
121
+ hookContractSpikePassed: hooksRegistered,
122
+ serverName: "experienceengine",
123
+ serverCommand: `node ${cliScript} mcp-server`
124
+ };
125
+ };
126
+ export const ensureAntigravityGlobalWiring = async (options = {}) => {
127
+ const paths = resolveExperienceEnginePaths({
128
+ adapter: "antigravity",
129
+ env: options.env ?? process.env,
130
+ homeDir: options.homeDir
131
+ });
132
+ const packageRoot = resolveExperienceEnginePackageRoot();
133
+ const cliScript = join(packageRoot, "dist/cli/index.js").replace(/\\/g, "/");
134
+ let mcpOnly = options.mcpOnly ?? false;
135
+ let hookContractSpikePassed = false;
136
+ if (!mcpOnly) {
137
+ const spike = await runAntigravityHookSpikeVerification();
138
+ if (spike.success) {
139
+ hookContractSpikePassed = true;
140
+ }
141
+ else {
142
+ mcpOnly = true;
143
+ console.warn("[ExperienceEngine] Antigravity native hook spike verification failed. Falling back to global mcp_only mode.");
144
+ for (const err of spike.errors) {
145
+ console.warn(` - ${err}`);
146
+ }
147
+ }
148
+ }
149
+ const mcpConfigPath = getAgentDesktopMcpConfigPath(options.homeDir);
150
+ upsertAgentDesktopMcpConfig(mcpConfigPath, cliScript);
151
+ upsertAgentDesktopMcpConfig(getSharedMcpConfigPath(options.homeDir), cliScript);
152
+ if (!mcpOnly) {
153
+ writePlugin(getAgentDesktopPluginDir(options.homeDir), cliScript, paths.productHome);
154
+ writePlugin(getAgyCliPluginDir(options.homeDir), cliScript, paths.productHome);
155
+ }
156
+ return {
157
+ ...inspectAntigravityGlobalWiring(options),
158
+ hookContractSpikePassed,
159
+ lifecycleMode: mcpOnly ? "mcp_only" : "host_native_hooks_validated",
160
+ agentDesktopGlobalActivation: mcpOnly ? "unknown" : "supported",
161
+ hooksRegistered: !mcpOnly,
162
+ mcpRegistered: true
163
+ };
164
+ };
165
+ //# sourceMappingURL=antigravity-global-wiring.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"antigravity-global-wiring.js","sourceRoot":"","sources":["../../src/install/antigravity-global-wiring.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,4BAA4B,EAAE,MAAM,4BAA4B,CAAC;AAC1E,OAAO,EAAE,kCAAkC,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EACL,4BAA4B,EAC5B,2BAA2B,EAC3B,mCAAmC,EAGpC,MAAM,iCAAiC,CAAC;AA0BzC,MAAM,sBAAsB,GAAG,CAAC,OAAgB,EAAU,EAAE,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,EAAE,CAAC,CAAC;AAE3F,MAAM,wBAAwB,GAAG,CAAC,OAAgB,EAAU,EAAE,CAC5D,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAAC;AAE5F,MAAM,kBAAkB,GAAG,CAAC,OAAgB,EAAU,EAAE,CACtD,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,iBAAiB,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAAC;AAErG,MAAM,eAAe,GAAG,CAAC,OAAgB,EAAU,EAAE,CACnD,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,iBAAiB,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAAC;AAErG,MAAM,iBAAiB,GAAG,CAAC,OAAgB,EAAU,EAAE,CACrD,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,iBAAiB,EAAE,KAAK,EAAE,kBAAkB,CAAC,CAAC;AAEjG,MAAM,4BAA4B,GAAG,CAAC,OAAgB,EAAU,EAAE,CAChE,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,aAAa,EAAE,iBAAiB,CAAC,CAAC;AAErF,MAAM,sBAAsB,GAAG,CAAC,OAAgB,EAAU,EAAE,CAC1D,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,iBAAiB,CAAC,CAAC;AAEhF,MAAM,cAAc,GAAG,CAAC,IAAY,EAAO,EAAE;IAC3C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/C,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,SAAiB,EAA2B,EAAE,CAAC,CAAC;IACzE,OAAO,EAAE,MAAM;IACf,IAAI,EAAE,CAAC,SAAS,EAAE,YAAY,CAAC;IAC/B,GAAG,EAAE;QACH,yBAAyB,EAAE,aAAa;KACzC;CACF,CAAC,CAAC;AAEH,MAAM,WAAW,GAAG,CAAC,SAAiB,EAAE,SAAiB,EAAE,WAAmB,EAAQ,EAAE;IACtF,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,aAAa,CACX,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,EAC9B,GAAG,IAAI,CAAC,SAAS,CACf;QACE,IAAI,EAAE,kBAAkB;QACxB,WAAW,EAAE,kEAAkE;QAC/E,QAAQ,EAAE,KAAK;KAChB,EACD,IAAI,EACJ,CAAC,CACF,IAAI,EACL,MAAM,CACP,CAAC;IAEF,aAAa,CACX,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,EAClC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,EAAE,gBAAgB,EAAE,iBAAiB,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAClG,MAAM,CACP,CAAC;IAEF,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,uCAAuC,CAAC,CAAC;IAC9E,aAAa,CACX,YAAY,EACZ,4BAA4B,CAAC,SAAS,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,EACxE,MAAM,CACP,CAAC;IAEF,MAAM,WAAW,GAAG,4CAA4C,CAAC;IACjE,aAAa,CACX,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,EAC7B,GAAG,IAAI,CAAC,SAAS,CAAC,2BAA2B,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EACxE,MAAM,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,2BAA2B,GAAG,CAAC,aAAqB,EAAE,SAAiB,EAAQ,EAAE;IACrF,SAAS,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;IAC7C,MAAM,CAAC,UAAU,GAAG;QAClB,GAAG,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC;QAC5B,gBAAgB,EAAE,iBAAiB,CAAC,SAAS,CAAC;KAC/C,CAAC;IACF,aAAa,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC/E,CAAC,CAAC;AAEF,MAAM,yBAAyB,GAAG,CAAC,SAAiB,EAAW,EAAE;IAC/D,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;IACnD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9E,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,MAAM,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;IACxC,MAAM,GAAG,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IACpC,OAAO,OAAO,CACZ,MAAM,CAAC,IAAI,KAAK,kBAAkB;WAC7B,MAAM,CAAC,QAAQ,KAAK,IAAI;WACxB,KAAK,CAAC,gBAAgB,EAAE,aAAa,EAAE,MAAM;WAC7C,KAAK,CAAC,gBAAgB,EAAE,UAAU,EAAE,MAAM;WAC1C,KAAK,CAAC,gBAAgB,EAAE,WAAW,EAAE,MAAM;WAC3C,KAAK,CAAC,gBAAgB,EAAE,IAAI,EAAE,MAAM;WACpC,GAAG,CAAC,UAAU,EAAE,gBAAgB,CACtC,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,8BAA8B,GAAG,CAAC,QAAgB,EAAW,EAAE,CACnE,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,wCAAwC,CAAC,CAAC;OACjE,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,oCAAoC,CAAC,CAAC;OAChE,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,8BAA8B,CAAC,CAAC,CAAC;AAEhE,MAAM,4BAA4B,GAAG,CAAC,aAAqB,EAAW,EAAE;IACtE,MAAM,MAAM,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;IAC7C,OAAO,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;AACtD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,UAA8B,EAAE,EAAiC,EAAE;IAChH,MAAM,WAAW,GAAG,kCAAkC,EAAE,CAAC;IACzD,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,mBAAmB,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC7E,MAAM,qBAAqB,GAAG,wBAAwB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACxE,MAAM,eAAe,GAAG,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5D,MAAM,YAAY,GAAG,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACtD,MAAM,cAAc,GAAG,iBAAiB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1D,MAAM,aAAa,GAAG,4BAA4B,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACpE,MAAM,4BAA4B,GAAG,yBAAyB,CAAC,qBAAqB,CAAC,CAAC;IACtF,MAAM,sBAAsB,GAAG,yBAAyB,CAAC,eAAe,CAAC,CAAC;IAC1E,MAAM,mBAAmB,GAAG,yBAAyB,CAAC,YAAY,CAAC,CAAC;IACpE,MAAM,yBAAyB,GAAG,8BAA8B,CAAC,cAAc,CAAC,CAAC;IACjF,MAAM,eAAe,GAAG,4BAA4B,IAAI,sBAAsB,CAAC;IAC/E,MAAM,kBAAkB,GAAG,mBAAmB,IAAI,4BAA4B,CAAC;IAC/E,MAAM,aAAa,GAAkC,kBAAkB;QACrE,CAAC,CAAC,gBAAgB;QAClB,CAAC,CAAC,yBAAyB;YACzB,CAAC,CAAC,oBAAoB;YACtB,CAAC,CAAC,aAAa,CAAC;IACpB,MAAM,mBAAmB,GAAG,sBAAsB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACpE,MAAM,aAAa,GACjB,4BAA4B,CAAC,aAAa,CAAC;WACxC,4BAA4B,CAAC,mBAAmB,CAAC;WACjD,4BAA4B;WAC5B,sBAAsB,CAAC;IAC5B,MAAM,aAAa,GAA6B,eAAe,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,UAAU,CAAC;IAE7G,OAAO;QACL,aAAa;QACb,4BAA4B,EAAE,eAAe,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;QACvE,qBAAqB;QACrB,4BAA4B;QAC5B,eAAe;QACf,sBAAsB;QACtB,YAAY;QACZ,mBAAmB;QACnB,kBAAkB;QAClB,cAAc;QACd,yBAAyB;QACzB,aAAa;QACb,aAAa;QACb,aAAa;QACb,eAAe;QACf,uBAAuB,EAAE,eAAe;QACxC,UAAU,EAAE,kBAAkB;QAC9B,aAAa,EAAE,QAAQ,SAAS,aAAa;KAC9C,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,6BAA6B,GAAG,KAAK,EAChD,UAA8B,EAAE,EACQ,EAAE;IAC1C,MAAM,KAAK,GAAG,4BAA4B,CAAC;QACzC,OAAO,EAAE,aAAa;QACtB,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG;QAC/B,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC,CAAC;IACH,MAAM,WAAW,GAAG,kCAAkC,EAAE,CAAC;IACzD,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,mBAAmB,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC7E,IAAI,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC;IACvC,IAAI,uBAAuB,GAAG,KAAK,CAAC;IAEpC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,KAAK,GAAG,MAAM,mCAAmC,EAAE,CAAC;QAC1D,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAClB,uBAAuB,GAAG,IAAI,CAAC;QACjC,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,IAAI,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,6GAA6G,CAAC,CAAC;YAC5H,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBAC/B,OAAO,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,aAAa,GAAG,4BAA4B,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACpE,2BAA2B,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IACtD,2BAA2B,CAAC,sBAAsB,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,CAAC;IAEhF,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,WAAW,CAAC,wBAAwB,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;QACrF,WAAW,CAAC,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;IACjF,CAAC;IAED,OAAO;QACL,GAAG,8BAA8B,CAAC,OAAO,CAAC;QAC1C,uBAAuB;QACvB,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,6BAA6B;QACnE,4BAA4B,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW;QAC/D,eAAe,EAAE,CAAC,OAAO;QACzB,aAAa,EAAE,IAAI;KACpB,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,24 @@
1
+ export type AntigravityLifecycleMode = "host_native_hooks_validated" | "mcp_only";
2
+ export type AntigravityOptions = {
3
+ cwd?: string;
4
+ env?: NodeJS.ProcessEnv;
5
+ homeDir?: string;
6
+ mcpOnly?: boolean;
7
+ };
8
+ export type AntigravityProjectWiringReport = {
9
+ cwd: string;
10
+ lifecycleMode: AntigravityLifecycleMode;
11
+ mcpRegistered: boolean;
12
+ hooksRegistered: boolean;
13
+ hookContractSpikePassed: boolean;
14
+ serverName: string;
15
+ serverCommand: string;
16
+ };
17
+ export declare const buildAntigravityHooksConfig: (commandPrefix: string) => Record<string, unknown>;
18
+ export declare const buildAntigravityHookLauncher: (cliScript: string, productHome: string) => string;
19
+ export declare const runAntigravityHookSpikeVerification: () => Promise<{
20
+ success: boolean;
21
+ errors: string[];
22
+ }>;
23
+ export declare const inspectAntigravityProjectWiring: (options?: AntigravityOptions) => AntigravityProjectWiringReport;
24
+ export declare const ensureAntigravityProjectWiring: (options?: AntigravityOptions) => Promise<AntigravityProjectWiringReport>;
@@ -0,0 +1,380 @@
1
+ import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync, unlinkSync } from "node:fs";
2
+ import { randomUUID } from "node:crypto";
3
+ import { tmpdir } from "node:os";
4
+ import { dirname, join } from "node:path";
5
+ import { resolveExperienceEnginePaths } from "../config/path-resolver.js";
6
+ import { handleAntigravityHookPayload } from "../cli/commands/antigravity-hook.js";
7
+ import { resolveExperienceEnginePackageRoot } from "./openclaw-cli.js";
8
+ const getMcpConfigPath = (cwd) => join(cwd, ".mcp.json");
9
+ const getHooksConfigPath = (cwd) => join(cwd, ".agents", "hooks.json");
10
+ const getHookLauncherPath = (cwd) => join(cwd, ".agents", "experienceengine-antigravity-hook.mjs");
11
+ export const buildAntigravityHooksConfig = (commandPrefix) => ({
12
+ experienceengine: {
13
+ PreInvocation: [
14
+ {
15
+ type: "command",
16
+ command: `${commandPrefix} PreInvocation`,
17
+ timeout: 10
18
+ }
19
+ ],
20
+ PreToolUse: [
21
+ {
22
+ matcher: "*",
23
+ hooks: [
24
+ {
25
+ type: "command",
26
+ command: `${commandPrefix} PreToolUse`,
27
+ timeout: 10
28
+ }
29
+ ]
30
+ }
31
+ ],
32
+ PostToolUse: [
33
+ {
34
+ matcher: "*",
35
+ hooks: [
36
+ {
37
+ type: "command",
38
+ command: `${commandPrefix} PostToolUse`,
39
+ timeout: 10
40
+ }
41
+ ]
42
+ }
43
+ ],
44
+ Stop: [
45
+ {
46
+ type: "command",
47
+ command: `${commandPrefix} Stop`,
48
+ timeout: 10
49
+ }
50
+ ]
51
+ }
52
+ });
53
+ export const buildAntigravityHookLauncher = (cliScript, productHome) => [
54
+ 'import { spawnSync } from "node:child_process";',
55
+ "",
56
+ "const eventName = process.argv[2] || \"unknown\";",
57
+ "const chunks = [];",
58
+ "for await (const chunk of process.stdin) {",
59
+ " chunks.push(Buffer.from(chunk));",
60
+ "}",
61
+ "const stdinText = Buffer.concat(chunks).toString(\"utf8\");",
62
+ `const result = spawnSync(process.execPath, [${JSON.stringify(cliScript)}, "antigravity-hook", eventName], {`,
63
+ " input: stdinText,",
64
+ " encoding: \"utf8\",",
65
+ " env: {",
66
+ " ...process.env,",
67
+ ` EXPERIENCE_ENGINE_HOME: process.env.EXPERIENCE_ENGINE_HOME || ${JSON.stringify(productHome)}`,
68
+ " }",
69
+ "});",
70
+ "if (result.stderr) {",
71
+ " process.stderr.write(result.stderr);",
72
+ "}",
73
+ "process.stdout.write(result.stdout || \"{}\\n\");",
74
+ "process.exit(result.status ?? 0);",
75
+ ""
76
+ ].join("\n");
77
+ export const runAntigravityHookSpikeVerification = async () => {
78
+ const errors = [];
79
+ const packageRoot = resolveExperienceEnginePackageRoot();
80
+ const fixturesDir = join(packageRoot, "tests/fixtures/antigravity");
81
+ const previousHome = process.env.EXPERIENCE_ENGINE_HOME;
82
+ const spikeHome = mkdtempSync(join(tmpdir(), "experienceengine-antigravity-spike-home-"));
83
+ const mockBehaviorLoop = {
84
+ lookupHints: async (args) => {
85
+ if (!args.cwd || !args.prompt || !args.sessionId) {
86
+ errors.push("lookupHints argument validation failed: missing cwd, prompt, or sessionId");
87
+ }
88
+ return { text: "Spike constraint injected.", mode: "inject" };
89
+ },
90
+ recordToolResult: async (args) => {
91
+ if (!args.sessionId || !args.toolName || args.status === undefined) {
92
+ errors.push("recordToolResult argument validation failed: missing sessionId, toolName, or status");
93
+ }
94
+ return { status: "recorded" };
95
+ },
96
+ finalizeTask: async (args) => {
97
+ if (!args.sessionId || !args.cwd || !args.prompt) {
98
+ errors.push("finalizeTask argument validation failed: missing sessionId, cwd, or prompt");
99
+ }
100
+ return { status: "finalized" };
101
+ }
102
+ };
103
+ let preInvocationPayload = {
104
+ conversationId: "spike-test-session",
105
+ workspacePaths: ["/tmp/spike-test-workspace"],
106
+ artifactDirectoryPath: "/tmp/spike-test-workspace/brain/spike-test-session",
107
+ prompt: "Verify hook contract spike compatibility."
108
+ };
109
+ let preToolUsePayload = {
110
+ conversationId: "spike-test-session",
111
+ workspacePaths: ["/tmp/spike-test-workspace"],
112
+ artifactDirectoryPath: "/tmp/spike-test-workspace/brain/spike-test-session",
113
+ toolName: "run_command",
114
+ toolInput: { CommandLine: "pnpm test" }
115
+ };
116
+ let postToolUsePayload = {
117
+ conversationId: "spike-test-session",
118
+ workspacePaths: ["/tmp/spike-test-workspace"],
119
+ artifactDirectoryPath: "/tmp/spike-test-workspace/brain/spike-test-session",
120
+ toolName: "run_command",
121
+ toolInput: { CommandLine: "pnpm test" },
122
+ exitCode: 0,
123
+ status: "success",
124
+ outputSummary: "All tests green"
125
+ };
126
+ let stopPayload = {
127
+ conversationId: "spike-test-session",
128
+ workspacePaths: ["/tmp/spike-test-workspace"],
129
+ artifactDirectoryPath: "/tmp/spike-test-workspace/brain/spike-test-session",
130
+ lastMessage: "Finished spike task verification"
131
+ };
132
+ try {
133
+ const preInvPath = join(fixturesDir, "payload-pre-invocation.json");
134
+ if (existsSync(preInvPath)) {
135
+ preInvocationPayload = JSON.parse(readFileSync(preInvPath, "utf8"));
136
+ }
137
+ const preToolPath = join(fixturesDir, "payload-pre-tool-use.json");
138
+ if (existsSync(preToolPath)) {
139
+ preToolUsePayload = JSON.parse(readFileSync(preToolPath, "utf8"));
140
+ }
141
+ const postToolPath = join(fixturesDir, "payload-post-tool-use.json");
142
+ if (existsSync(postToolPath)) {
143
+ postToolUsePayload = JSON.parse(readFileSync(postToolPath, "utf8"));
144
+ }
145
+ const stopPath = join(fixturesDir, "payload-stop.json");
146
+ if (existsSync(stopPath)) {
147
+ stopPayload = JSON.parse(readFileSync(stopPath, "utf8"));
148
+ }
149
+ }
150
+ catch (err) {
151
+ errors.push(`Failed to read/parse committed fixtures: ${err?.message || err}`);
152
+ }
153
+ const tempTranscriptPath = join(packageRoot, ".agents", `temp-spike-transcript-${randomUUID()}.jsonl`);
154
+ try {
155
+ process.env.EXPERIENCE_ENGINE_HOME = spikeHome;
156
+ mkdirSync(dirname(tempTranscriptPath), { recursive: true });
157
+ writeFileSync(tempTranscriptPath, JSON.stringify({
158
+ type: "USER_INPUT",
159
+ content: "<USER_REQUEST>Verify hook contract spike compatibility via transcript.</USER_REQUEST>"
160
+ }) + "\n", "utf8");
161
+ }
162
+ catch (err) {
163
+ errors.push(`Failed to write temp transcript for spike: ${err?.message || err}`);
164
+ }
165
+ try {
166
+ const preInvocationResult = await handleAntigravityHookPayload("PreInvocation", preInvocationPayload, mockBehaviorLoop);
167
+ if (!preInvocationResult?.injectSteps?.[0]?.ephemeralMessage?.includes("Spike constraint injected.")) {
168
+ errors.push("PreInvocation hook did not return the expected context mutation injection steps.");
169
+ }
170
+ let recordCalled = false;
171
+ const preToolUseResult = await handleAntigravityHookPayload("PreToolUse", preToolUsePayload, {
172
+ ...mockBehaviorLoop,
173
+ recordToolResult: async () => {
174
+ recordCalled = true;
175
+ return { status: "recorded" };
176
+ }
177
+ });
178
+ if (preToolUseResult?.decision !== "allow") {
179
+ errors.push(`PreToolUse hook did not return an explicit allow decision: ${JSON.stringify(preToolUseResult)}`);
180
+ }
181
+ if (recordCalled) {
182
+ errors.push("PreToolUse hook incorrectly recorded tool result, causing telemetry pollution.");
183
+ }
184
+ let postToolUseRecordCalled = false;
185
+ const postToolUseResult = await handleAntigravityHookPayload("PostToolUse", postToolUsePayload, {
186
+ ...mockBehaviorLoop,
187
+ recordToolResult: async (args) => {
188
+ postToolUseRecordCalled = true;
189
+ const expectedSession = postToolUsePayload.conversationId || "0b03efea-7f1d-4aff-84a4-ce954372619b";
190
+ if (args.sessionId !== expectedSession || args.toolName !== "run_command" || args.status !== "success") {
191
+ errors.push(`PostToolUse passed incorrect arguments to recordToolResult: ${JSON.stringify(args)}`);
192
+ }
193
+ return { status: "recorded" };
194
+ }
195
+ });
196
+ if (JSON.stringify(postToolUseResult) !== "{}") {
197
+ errors.push("PostToolUse hook did not return an empty JSON object.");
198
+ }
199
+ if (!postToolUseRecordCalled) {
200
+ errors.push("PostToolUse hook failed to record tool result.");
201
+ }
202
+ let stopFinalizeCalled = false;
203
+ const stopResult = await handleAntigravityHookPayload("Stop", {
204
+ ...stopPayload,
205
+ transcriptPath: tempTranscriptPath,
206
+ prompt: undefined
207
+ }, {
208
+ ...mockBehaviorLoop,
209
+ finalizeTask: async (args) => {
210
+ stopFinalizeCalled = true;
211
+ const expectedSession = stopPayload.conversationId || "0b03efea-7f1d-4aff-84a4-ce954372619b";
212
+ if (args.sessionId !== expectedSession) {
213
+ errors.push(`Stop passed incorrect sessionId: expected ${expectedSession}, got ${args.sessionId}`);
214
+ }
215
+ if (args.prompt !== "Verify hook contract spike compatibility via transcript.") {
216
+ errors.push(`Stop failed to resolve prompt from transcriptPath: got "${args.prompt}"`);
217
+ }
218
+ return { status: "finalized" };
219
+ }
220
+ });
221
+ if (JSON.stringify(stopResult) !== "{}") {
222
+ errors.push("Stop hook did not return an empty JSON object.");
223
+ }
224
+ if (!stopFinalizeCalled) {
225
+ errors.push("Stop hook failed to finalize task.");
226
+ }
227
+ }
228
+ catch (err) {
229
+ errors.push(`Spike verification threw an unexpected exception: ${err?.message || err}`);
230
+ }
231
+ finally {
232
+ if (previousHome === undefined) {
233
+ delete process.env.EXPERIENCE_ENGINE_HOME;
234
+ }
235
+ else {
236
+ process.env.EXPERIENCE_ENGINE_HOME = previousHome;
237
+ }
238
+ try {
239
+ if (existsSync(tempTranscriptPath)) {
240
+ unlinkSync(tempTranscriptPath);
241
+ }
242
+ }
243
+ catch {
244
+ // Ignore cleanup error.
245
+ }
246
+ rmSync(spikeHome, { recursive: true, force: true });
247
+ }
248
+ return {
249
+ success: errors.length === 0,
250
+ errors
251
+ };
252
+ };
253
+ export const inspectAntigravityProjectWiring = (options = {}) => {
254
+ const cwd = options.cwd ?? process.cwd();
255
+ const packageRoot = resolveExperienceEnginePackageRoot();
256
+ const defaultServerCommand = `node ${join(packageRoot, "dist/cli/index.js").replace(/\\/g, "/")} mcp-server`;
257
+ let serverCommand = defaultServerCommand;
258
+ let mcpRegistered = false;
259
+ const mcpPath = getMcpConfigPath(cwd);
260
+ if (existsSync(mcpPath)) {
261
+ try {
262
+ const mcpConfig = JSON.parse(readFileSync(mcpPath, "utf8"));
263
+ const server = mcpConfig?.mcpServers?.experienceengine;
264
+ if (server && server.type === "stdio" && server.env?.EXPERIENCE_ENGINE_ADAPTER === "antigravity") {
265
+ mcpRegistered = true;
266
+ serverCommand = `${server.command || ""} ${(server.args || []).join(" ")}`.trim();
267
+ }
268
+ }
269
+ catch {
270
+ // Ignore malformed project config.
271
+ }
272
+ }
273
+ let hooksRegistered = false;
274
+ const hooksPath = getHooksConfigPath(cwd);
275
+ if (existsSync(hooksPath)) {
276
+ try {
277
+ const hooksConfig = JSON.parse(readFileSync(hooksPath, "utf8"));
278
+ const eeHooks = hooksConfig?.experienceengine;
279
+ hooksRegistered = Boolean(eeHooks?.PreInvocation?.length > 0
280
+ && eeHooks?.PreToolUse?.length > 0
281
+ && eeHooks?.PostToolUse?.length > 0
282
+ && eeHooks?.Stop?.length > 0);
283
+ }
284
+ catch {
285
+ // Ignore malformed project hooks.
286
+ }
287
+ }
288
+ const mcpOnly = options.mcpOnly !== undefined ? options.mcpOnly : !(mcpRegistered && hooksRegistered);
289
+ const lifecycleMode = mcpRegistered && hooksRegistered && !mcpOnly
290
+ ? "host_native_hooks_validated"
291
+ : "mcp_only";
292
+ return {
293
+ cwd,
294
+ lifecycleMode,
295
+ mcpRegistered,
296
+ hooksRegistered,
297
+ hookContractSpikePassed: hooksRegistered,
298
+ serverName: "experienceengine",
299
+ serverCommand
300
+ };
301
+ };
302
+ export const ensureAntigravityProjectWiring = async (options = {}) => {
303
+ const cwd = options.cwd ?? process.cwd();
304
+ const env = options.env ?? process.env;
305
+ const paths = resolveExperienceEnginePaths({
306
+ adapter: "antigravity",
307
+ env,
308
+ homeDir: options.homeDir
309
+ });
310
+ const packageRoot = resolveExperienceEnginePackageRoot();
311
+ let mcpOnly = options.mcpOnly !== undefined ? options.mcpOnly : false;
312
+ let hookContractSpikePassed = false;
313
+ if (!mcpOnly) {
314
+ const spike = await runAntigravityHookSpikeVerification();
315
+ if (spike.success) {
316
+ hookContractSpikePassed = true;
317
+ }
318
+ else {
319
+ mcpOnly = true;
320
+ console.warn("[ExperienceEngine] Antigravity native hook spike verification failed. Falling back to mcp_only mode.");
321
+ for (const err of spike.errors) {
322
+ console.warn(` - ${err}`);
323
+ }
324
+ }
325
+ }
326
+ const portableCliScript = join(packageRoot, "dist/cli/index.js").replace(/\\/g, "/");
327
+ const serverCommand = "node";
328
+ const serverArgs = [portableCliScript, "mcp-server"];
329
+ const mcpPath = getMcpConfigPath(cwd);
330
+ let mcpConfig = {};
331
+ if (existsSync(mcpPath)) {
332
+ try {
333
+ mcpConfig = JSON.parse(readFileSync(mcpPath, "utf8"));
334
+ }
335
+ catch {
336
+ // Ignore malformed config and recreate the ExperienceEngine entry.
337
+ }
338
+ }
339
+ if (!mcpConfig.mcpServers) {
340
+ mcpConfig.mcpServers = {};
341
+ }
342
+ mcpConfig.mcpServers.experienceengine = {
343
+ type: "stdio",
344
+ command: serverCommand,
345
+ args: serverArgs,
346
+ env: {
347
+ EXPERIENCE_ENGINE_ADAPTER: "antigravity"
348
+ }
349
+ };
350
+ writeFileSync(mcpPath, `${JSON.stringify(mcpConfig, null, 2)}\n`, "utf8");
351
+ let hooksRegistered = false;
352
+ if (!mcpOnly) {
353
+ const hooksPath = getHooksConfigPath(cwd);
354
+ mkdirSync(dirname(hooksPath), { recursive: true });
355
+ const hookLauncherPath = getHookLauncherPath(cwd);
356
+ writeFileSync(hookLauncherPath, buildAntigravityHookLauncher(portableCliScript, paths.productHome.replace(/\\/g, "/")), "utf8");
357
+ let hooksConfig = {};
358
+ if (existsSync(hooksPath)) {
359
+ try {
360
+ hooksConfig = JSON.parse(readFileSync(hooksPath, "utf8"));
361
+ }
362
+ catch {
363
+ // Ignore malformed config and recreate the ExperienceEngine hook block.
364
+ }
365
+ }
366
+ hooksConfig.experienceengine = buildAntigravityHooksConfig("node experienceengine-antigravity-hook.mjs").experienceengine;
367
+ writeFileSync(hooksPath, `${JSON.stringify(hooksConfig, null, 2)}\n`, "utf8");
368
+ hooksRegistered = true;
369
+ }
370
+ return {
371
+ cwd,
372
+ lifecycleMode: mcpOnly ? "mcp_only" : "host_native_hooks_validated",
373
+ mcpRegistered: true,
374
+ hooksRegistered,
375
+ hookContractSpikePassed,
376
+ serverName: "experienceengine",
377
+ serverCommand: `${serverCommand} ${serverArgs.join(" ")}`
378
+ };
379
+ };
380
+ //# sourceMappingURL=antigravity-project-wiring.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"antigravity-project-wiring.js","sourceRoot":"","sources":["../../src/install/antigravity-project-wiring.ts"],"names":[],"mappings":"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"}