summer-engine 3.3.0 → 3.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 (293) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +4 -2
  3. package/.codex-plugin/plugin.json +5 -3
  4. package/.cursor-plugin/plugin.json +4 -2
  5. package/.factory-plugin/plugin.json +4 -2
  6. package/.opencode/INSTALL.md +8 -8
  7. package/.opencode/plugins/summer.js +2 -2
  8. package/AGENTS.md +7 -7
  9. package/CHANGELOG.md +50 -0
  10. package/GEMINI.md +1 -1
  11. package/NOTICE +1 -1
  12. package/README.md +32 -35
  13. package/assets/api-docs.json.gz +0 -0
  14. package/assets/autopilot/run.sh +2 -2
  15. package/assets/navigation/web-routes.json +1 -1
  16. package/commands/gameskill.md +2 -2
  17. package/commands/summer.md +25 -25
  18. package/dist/cli/commands/install.d.ts +10 -0
  19. package/dist/cli/commands/install.js +55 -10
  20. package/dist/cli/commands/open.d.ts +1 -1
  21. package/dist/cli/commands/run.d.ts +1 -1
  22. package/dist/cli/commands/run.js +1 -1
  23. package/dist/cli/commands/skills.js +2 -2
  24. package/dist/cli/commands/tool.d.ts +7 -0
  25. package/dist/cli/commands/tool.js +36 -1
  26. package/dist/core/api-client.d.ts +5 -6
  27. package/dist/core/api-client.js +12 -15
  28. package/dist/core/auth.js +2 -2
  29. package/dist/core/capabilities/asset-import.d.ts +0 -1
  30. package/dist/core/capabilities/camera-view.d.ts +1 -1
  31. package/dist/core/capabilities/camera-view.js +2 -2
  32. package/dist/core/capabilities/capture-gameplay.d.ts +69 -0
  33. package/dist/core/capabilities/capture-gameplay.js +283 -0
  34. package/dist/core/capabilities/connect-signal.d.ts +1 -2
  35. package/dist/core/capabilities/connect-signal.js +1 -2
  36. package/dist/core/capabilities/console-read.d.ts +2 -2
  37. package/dist/core/capabilities/console-read.js +2 -2
  38. package/dist/core/capabilities/creator.js +1 -1
  39. package/dist/core/capabilities/doctor.d.ts +9 -1
  40. package/dist/core/capabilities/doctor.js +47 -4
  41. package/dist/core/capabilities/engine-receipt.d.ts +5 -7
  42. package/dist/core/capabilities/engine-receipt.js +7 -9
  43. package/dist/core/capabilities/engine-run.d.ts +4 -0
  44. package/dist/core/capabilities/engine-run.js +33 -5
  45. package/dist/core/capabilities/export-engine-version.d.ts +15 -0
  46. package/dist/core/capabilities/export-engine-version.js +24 -0
  47. package/dist/core/capabilities/export-game.d.ts +9 -1
  48. package/dist/core/capabilities/export-game.js +115 -39
  49. package/dist/core/capabilities/export-presets.d.ts +1 -1
  50. package/dist/core/capabilities/export-presets.js +1 -1
  51. package/dist/core/capabilities/fabricate-mesh.d.ts +2 -3
  52. package/dist/core/capabilities/fabricate-mesh.js +2 -3
  53. package/dist/core/capabilities/frame-quality.d.ts +4 -4
  54. package/dist/core/capabilities/frame-quality.js +4 -4
  55. package/dist/core/capabilities/grep.d.ts +1 -1
  56. package/dist/core/capabilities/grep.js +1 -1
  57. package/dist/core/capabilities/image-generation.d.ts +9 -0
  58. package/dist/core/capabilities/image-generation.js +19 -1
  59. package/dist/core/capabilities/navigation/open.d.ts +1 -1
  60. package/dist/core/capabilities/navigation/open.js +1 -1
  61. package/dist/core/capabilities/navigation/render-product-map.js +1 -1
  62. package/dist/core/capabilities/navigation/targets.js +2 -2
  63. package/dist/core/capabilities/placement-batch.d.ts +1 -1
  64. package/dist/core/capabilities/placement-batch.js +2 -2
  65. package/dist/core/capabilities/play-determinism.d.ts +1 -1
  66. package/dist/core/capabilities/play-determinism.js +1 -1
  67. package/dist/core/capabilities/publish-build.d.ts +15 -2
  68. package/dist/core/capabilities/publish-build.js +78 -28
  69. package/dist/core/capabilities/publish-download.d.ts +1 -2
  70. package/dist/core/capabilities/publish-download.js +2 -3
  71. package/dist/core/capabilities/replace-node.d.ts +1 -3
  72. package/dist/core/capabilities/replace-node.js +1 -3
  73. package/dist/core/capabilities/runtime-control.d.ts +5 -7
  74. package/dist/core/capabilities/runtime-control.js +7 -9
  75. package/dist/core/capabilities/scene-batch.d.ts +1 -1
  76. package/dist/core/capabilities/scene-batch.js +1 -1
  77. package/dist/core/capabilities/scene-kind.js +1 -1
  78. package/dist/core/capabilities/scene-readback.d.ts +3 -4
  79. package/dist/core/capabilities/scene-readback.js +3 -4
  80. package/dist/core/capabilities/scene-script.d.ts +2 -2
  81. package/dist/core/capabilities/scene-script.js +2 -2
  82. package/dist/core/capabilities/seeing/shot-store.d.ts +1 -1
  83. package/dist/core/capabilities/seeing/shot-store.js +1 -1
  84. package/dist/core/capabilities/summer-bundle.d.ts +2 -3
  85. package/dist/core/capabilities/summer-bundle.js +2 -3
  86. package/dist/core/capabilities/surface-snap.d.ts +1 -1
  87. package/dist/core/capabilities/surface-snap.js +1 -1
  88. package/dist/core/capabilities/tool-dispatch.js +11 -1
  89. package/dist/core/capabilities/ui-control.d.ts +1 -2
  90. package/dist/core/capabilities/ui-control.js +1 -2
  91. package/dist/core/capabilities/world-snapshot.d.ts +1 -1
  92. package/dist/core/capabilities/world-snapshot.js +1 -1
  93. package/dist/core/capability-skew.d.ts +2 -3
  94. package/dist/core/capability-skew.js +4 -5
  95. package/dist/core/config.js +2 -2
  96. package/dist/core/engine-install.d.ts +16 -0
  97. package/dist/core/engine-install.js +32 -2
  98. package/dist/core/feedback/client.js +1 -1
  99. package/dist/core/hosted-mcp.d.ts +115 -0
  100. package/dist/core/hosted-mcp.js +164 -0
  101. package/dist/core/launch-posture.d.ts +6 -3
  102. package/dist/core/launch-posture.js +18 -5
  103. package/dist/core/library-read.js +1 -2
  104. package/dist/core/templates.d.ts +1 -2
  105. package/dist/core/templates.js +1 -2
  106. package/dist/mcp/hosted-mount.d.ts +13 -59
  107. package/dist/mcp/hosted-mount.js +24 -30
  108. package/dist/mcp/server.d.ts +2 -2
  109. package/dist/mcp/server.js +5 -4
  110. package/dist/mcp/tools/creator-tools.js +14 -4
  111. package/dist/mcp/tools/debug-tools.js +1 -1
  112. package/dist/mcp/tools/generate-tools.js +19 -9
  113. package/dist/mcp/tools/navigation-tools.d.ts +1 -1
  114. package/dist/mcp/tools/navigation-tools.js +1 -1
  115. package/dist/mcp/tools/spatial-tools.js +1 -1
  116. package/dist/mcp/tools/visual-tools.js +2 -2
  117. package/dist/mcp/tools/with-engine.d.ts +1 -2
  118. package/dist/mcp/tools/with-engine.js +1 -2
  119. package/gemini-extension.json +3 -1
  120. package/hooks/session-start.sh +2 -2
  121. package/integrations/README.md +70 -76
  122. package/integrations/claude/README.md +0 -3
  123. package/integrations/codex/README.md +1 -2
  124. package/integrations/copilot-jetbrains/README.md +1 -1
  125. package/integrations/cursor/README.md +1 -2
  126. package/integrations/factory/README.md +15 -11
  127. package/integrations/mistral-vibe/README.md +1 -1
  128. package/integrations/opencode/README.md +1 -1
  129. package/integrations/roo-code/README.md +1 -1
  130. package/integrations/rovo-dev/README.md +1 -1
  131. package/integrations/trae/README.md +1 -1
  132. package/integrations/windsurf/README.md +3 -3
  133. package/library/references/collaborative-protocol/collaborative-protocol.md +5 -5
  134. package/library/references/gd-style/gd-style.md +4 -6
  135. package/library/references/godot-version/godot-version.md +3 -3
  136. package/library/references/headless-routing/headless-routing.md +2 -2
  137. package/library/references/mcp-fresh-chat-playbook/mcp-fresh-chat-playbook.md +2 -2
  138. package/library/references/mcp-tools-reference/mcp-tools-reference.md +18 -16
  139. package/library/references/product-map/product-map.md +1 -1
  140. package/library/references/public-surface-language/public-surface-language.md +1 -1
  141. package/library/references/summer-folder/summer-folder.md +1 -1
  142. package/library/skills/3d-lighting/SKILL.md +4 -4
  143. package/library/skills/README.md +11 -9
  144. package/library/skills/adaptive-music/SKILL.md +7 -7
  145. package/library/skills/ai-characters-in-games/SKILL.md +1 -1
  146. package/library/skills/ambient-bed/SKILL.md +12 -14
  147. package/library/skills/animated-loop/SKILL.md +42 -42
  148. package/library/skills/animation-tree/SKILL.md +6 -6
  149. package/library/skills/art-direction/SKILL.md +8 -11
  150. package/library/skills/asset-strategy/SKILL.md +3 -3
  151. package/library/skills/audio-direction/SKILL.md +8 -10
  152. package/library/skills/auto-fire-targeting/SKILL.md +4 -3
  153. package/library/skills/bounded-engine-runs/SKILL.md +95 -0
  154. package/library/skills/bounded-engine-runs/resource.yaml +29 -0
  155. package/library/skills/brainstorm-game/SKILL.md +5 -5
  156. package/library/skills/brainstorming/SKILL.md +9 -15
  157. package/library/skills/celeste-momentum-platforming/SKILL.md +8 -13
  158. package/library/skills/celeste-momentum-platforming/resource.yaml +1 -1
  159. package/library/skills/character-animation-wiring/SKILL.md +2 -2
  160. package/library/skills/character-model/SKILL.md +15 -26
  161. package/library/skills/character-movement/SKILL.md +1 -1
  162. package/library/skills/character-movement/references/movement-3d.md +1 -1
  163. package/library/skills/character-portrait/SKILL.md +4 -4
  164. package/library/skills/cinematic-cutscene/SKILL.md +38 -38
  165. package/library/skills/combat-basics/SKILL.md +1 -1
  166. package/library/skills/compatibility-renderer-traps/SKILL.md +78 -0
  167. package/library/skills/compatibility-renderer-traps/resource.yaml +28 -0
  168. package/library/skills/concept-art/SKILL.md +4 -4
  169. package/library/skills/create-asset-sheet/SKILL.md +12 -31
  170. package/library/skills/debug/SKILL.md +5 -4
  171. package/library/skills/debugging-game-feel/SKILL.md +1 -4
  172. package/library/skills/debugging-game-feel/resource.yaml +1 -1
  173. package/library/skills/design-level/SKILL.md +5 -5
  174. package/library/skills/design-mechanic/SKILL.md +6 -6
  175. package/library/skills/design-npc/SKILL.md +8 -15
  176. package/library/skills/diagnosing-perf-regressions/SKILL.md +5 -10
  177. package/library/skills/dispatching-parallel-agents/SKILL.md +1 -19
  178. package/library/skills/environment-kit/SKILL.md +5 -5
  179. package/library/skills/export-and-ship/SKILL.md +25 -24
  180. package/library/skills/fabricating-assets/SKILL.md +1 -1
  181. package/library/skills/facial-and-lipsync/SKILL.md +5 -5
  182. package/library/skills/fps-controller/SKILL.md +17 -16
  183. package/library/skills/fps-controller/resource.yaml +0 -2
  184. package/library/skills/game-feel/SKILL.md +6 -7
  185. package/library/skills/gameskill/SKILL.md +3 -3
  186. package/library/skills/gdscript-patterns/SKILL.md +3 -3
  187. package/library/skills/generate-motion/SKILL.md +5 -22
  188. package/library/skills/godogen-visual-proof-game-generation/SKILL.md +72 -90
  189. package/library/skills/godogen-visual-proof-game-generation/resource.yaml +0 -1
  190. package/library/skills/headless-scripting/SKILL.md +8 -8
  191. package/library/skills/headless-scripting/resource.yaml +1 -0
  192. package/library/skills/in-game-purchases/SKILL.md +123 -118
  193. package/library/skills/in-game-purchases/resource.yaml +2 -2
  194. package/library/skills/instantiate-asset-pack/SKILL.md +7 -3
  195. package/library/skills/investigating-bugs/SKILL.md +3 -11
  196. package/library/skills/investigating-bugs/condition-based-waiting.md +0 -10
  197. package/library/skills/investigating-bugs/root-cause-tracing.md +0 -8
  198. package/library/skills/lumera-single-image-scene-reconstruction/SKILL.md +15 -15
  199. package/library/skills/lumera-single-image-scene-reconstruction/resource.yaml +0 -1
  200. package/library/skills/make-game/SKILL.md +3 -5
  201. package/library/skills/make-game/references/2d-platformer.md +1 -1
  202. package/library/skills/multiplayer-project/SKILL.md +1 -1
  203. package/library/skills/multiplayer-testing/SKILL.md +4 -4
  204. package/library/skills/music-track/SKILL.md +40 -38
  205. package/library/skills/new-project/SKILL.md +4 -6
  206. package/library/skills/organic-model/SKILL.md +9 -9
  207. package/library/skills/pixel-art/SKILL.md +6 -6
  208. package/library/skills/play/SKILL.md +3 -4
  209. package/library/skills/playtesting-a-feature/SKILL.md +4 -6
  210. package/library/skills/procedural-animation/SKILL.md +10 -11
  211. package/library/skills/prop-model/SKILL.md +4 -4
  212. package/library/skills/psx-retro-rendering/SKILL.md +20 -20
  213. package/library/skills/psx-retro-rendering/resource.yaml +2 -3
  214. package/library/skills/realtime-wet-surfaces/SKILL.md +15 -15
  215. package/library/skills/realtime-wet-surfaces/resource.yaml +1 -2
  216. package/library/skills/remote-deploy/SKILL.md +20 -21
  217. package/library/skills/retarget/SKILL.md +19 -23
  218. package/library/skills/running-in-the-cloud/SKILL.md +5 -5
  219. package/library/skills/scene-composition/SKILL.md +5 -5
  220. package/library/skills/scene-hierarchy-design/SKILL.md +3 -3
  221. package/library/skills/scene-hierarchy-design/resource.yaml +0 -1
  222. package/library/skills/scene-scripting/SKILL.md +3 -3
  223. package/library/skills/scene-to-level/SKILL.md +28 -31
  224. package/library/skills/skill-create/SKILL.md +1 -1
  225. package/library/skills/skill-improve/SKILL.md +9 -9
  226. package/library/skills/skill-test/SKILL.md +10 -10
  227. package/library/skills/skintokens-auto-rigging/SKILL.md +18 -18
  228. package/library/skills/skintokens-auto-rigging/resource.yaml +3 -3
  229. package/library/skills/skybox-panorama/SKILL.md +8 -9
  230. package/library/skills/sound-effect/SKILL.md +19 -19
  231. package/library/skills/spatial-placement/SKILL.md +2 -2
  232. package/library/skills/spatial-placement/references/kit-placement-tools.md +12 -22
  233. package/library/skills/sprite-sheet/SKILL.md +10 -10
  234. package/library/skills/summer-analytics/SKILL.md +3 -3
  235. package/library/skills/summer-friends/SKILL.md +10 -10
  236. package/library/skills/summer-leaderboards/SKILL.md +6 -6
  237. package/library/skills/summer-match-results/SKILL.md +13 -13
  238. package/library/skills/summer-matchmaking/SKILL.md +11 -11
  239. package/library/skills/summer-parties/SKILL.md +9 -9
  240. package/library/skills/summer-player-data/SKILL.md +12 -12
  241. package/library/skills/summer-store/SKILL.md +6 -6
  242. package/library/skills/summer-world-chat/SKILL.md +9 -9
  243. package/library/skills/summer-world-saves/SKILL.md +7 -7
  244. package/library/skills/text-to-motion/rigging-for-text-motion.md +1 -1
  245. package/library/skills/tileable-texture/SKILL.md +1 -1
  246. package/library/skills/trailer-shot/SKILL.md +36 -36
  247. package/library/skills/tune-performance/SKILL.md +13 -13
  248. package/library/skills/tune-performance/resource.yaml +1 -1
  249. package/library/skills/ui-graphics/SKILL.md +7 -7
  250. package/library/skills/use-widget-asset/SKILL.md +7 -7
  251. package/library/skills/using-summer/SKILL.md +5 -7
  252. package/library/skills/vehicle-model/SKILL.md +6 -7
  253. package/library/skills/vehicle-model/resource.yaml +2 -2
  254. package/library/skills/verification-before-completion/SKILL.md +5 -6
  255. package/library/skills/vfx-dissolve/SKILL.md +4 -4
  256. package/library/skills/vfx-fire/SKILL.md +6 -6
  257. package/library/skills/vfx-fire/_building-blocks/additive-billboard-particles.md +3 -3
  258. package/library/skills/vfx-hit-spark/SKILL.md +4 -4
  259. package/library/skills/vfx-hit-spark/_building-blocks/additive-billboard-particles.md +3 -3
  260. package/library/skills/vfx-lightning/SKILL.md +5 -5
  261. package/library/skills/vfx-lightning/_building-blocks/additive-billboard-particles.md +3 -3
  262. package/library/skills/vfx-lightning/_building-blocks/trauma-shake-snippet.md +9 -3
  263. package/library/skills/vfx-magic-glow/SKILL.md +4 -4
  264. package/library/skills/vfx-magic-glow/_building-blocks/additive-billboard-particles.md +3 -3
  265. package/library/skills/vfx-muzzle-flash/SKILL.md +5 -5
  266. package/library/skills/vfx-muzzle-flash/_building-blocks/additive-billboard-particles.md +3 -3
  267. package/library/skills/vfx-muzzle-flash/_building-blocks/trauma-shake-snippet.md +9 -3
  268. package/library/skills/vfx-smoke/SKILL.md +5 -5
  269. package/library/skills/vfx-water-ripple/SKILL.md +2 -2
  270. package/library/skills/vfx-water-ripple/_building-blocks/additive-billboard-particles.md +3 -3
  271. package/library/skills/voice-line/SKILL.md +9 -9
  272. package/library/skills/web-compatibility-look/resource.yaml +1 -0
  273. package/library/skills/world-building-3d/references/spatial-tools.md +2 -2
  274. package/library/skills/writing-plans/SKILL.md +4 -4
  275. package/library/skills/writing-skills/SKILL.md +8 -8
  276. package/library/tools/capture-gameplay/resource.yaml +73 -0
  277. package/library/tools/creator-publish/resource.yaml +4 -4
  278. package/library/tools/creator-releases/resource.yaml +5 -5
  279. package/library/tools/generate-image/resource.yaml +15 -1
  280. package/library/tools/publish-build/resource.yaml +6 -2
  281. package/package.json +1 -1
  282. package/registry/generated/aliases.json +1 -0
  283. package/registry/generated/counts.json +3 -3
  284. package/registry/generated/gemini-extension.json +3 -1
  285. package/registry/generated/index.json +248 -135
  286. package/registry/generated/marketplace.claude.json +2 -2
  287. package/registry/generated/plugin.claude.json +4 -2
  288. package/registry/generated/plugin.codex.json +5 -3
  289. package/registry/generated/plugin.cursor.json +4 -2
  290. package/registry/generated/plugin.factory.json +4 -2
  291. package/registry/generated/skills-index.md +11 -9
  292. package/registry/generated/skills-registry.json +33 -6
  293. package/registry/schemas/domains.json +1 -1
@@ -58,6 +58,22 @@ export declare function linuxEngineInstallDir(): string;
58
58
  export declare function macEnginePaths(env?: NodeJS.ProcessEnv): string[];
59
59
  export declare function windowsEnginePaths(env?: NodeJS.ProcessEnv): string[];
60
60
  export declare function linuxEnginePaths(): string[];
61
+ /** Where `summer install` records the engine it installed last
62
+ * (~/.summer/engine-install.json), so an install with --path is found later
63
+ * without SUMMER_BIN. */
64
+ export declare const ENGINE_INSTALL_FILE = "engine-install.json";
65
+ export interface RecordedEngineInstall {
66
+ schemaVersion: 1;
67
+ /** The engine executable (on macOS the one inside Summer.app). */
68
+ binary: string;
69
+ version: string | null;
70
+ installedAt: string;
71
+ }
72
+ export declare function recordEngineInstall(binary: string, version: string | null): Promise<void>;
73
+ /** The engine `summer install` installed last, or null (sync: findEngineBinary is). */
74
+ export declare function recordedEngineBinary(): string | null;
75
+ /** The bundle summer install writes on macOS: <path>/Summer.app, or the path itself when it names a .app. */
76
+ export declare function macInstallDestination(customPath?: string): string;
61
77
  export declare function engineBinaryCandidates(os?: NodeJS.Platform, env?: NodeJS.ProcessEnv): string[];
62
78
  /** First existing engine binary for this machine, or null. SUMMER_BIN /
63
79
  * SUMMER_ENGINE_BINARY wins when set and present; a set-but-missing override
@@ -1,6 +1,7 @@
1
- import { existsSync, statSync } from "fs";
1
+ import { existsSync, readFileSync, statSync } from "fs";
2
2
  import { homedir, platform } from "os";
3
3
  import { basename, join } from "path";
4
+ import { getSummerDir, writeStoreJson } from "./store.js";
4
5
  /**
5
6
  * Where each platform's engine binary lives, shared by `summer install`,
6
7
  * `summer run`, and `summer doctor` so they can never disagree about what
@@ -95,6 +96,31 @@ export function windowsEnginePaths(env = process.env) {
95
96
  export function linuxEnginePaths() {
96
97
  return [join(linuxEngineInstallDir(), LINUX_ENGINE_BINARY_NAME)];
97
98
  }
99
+ /** Where `summer install` records the engine it installed last
100
+ * (~/.summer/engine-install.json), so an install with --path is found later
101
+ * without SUMMER_BIN. */
102
+ export const ENGINE_INSTALL_FILE = "engine-install.json";
103
+ export async function recordEngineInstall(binary, version) {
104
+ const record = { schemaVersion: 1, binary, version, installedAt: new Date().toISOString() };
105
+ await writeStoreJson(ENGINE_INSTALL_FILE, record);
106
+ }
107
+ /** The engine `summer install` installed last, or null (sync: findEngineBinary is). */
108
+ export function recordedEngineBinary() {
109
+ try {
110
+ const record = JSON.parse(readFileSync(join(getSummerDir(), ENGINE_INSTALL_FILE), "utf8"));
111
+ return record.schemaVersion === 1 && typeof record.binary === "string" && record.binary ? record.binary : null;
112
+ }
113
+ catch {
114
+ return null;
115
+ }
116
+ }
117
+ /** The bundle summer install writes on macOS: <path>/Summer.app, or the path itself when it names a .app. */
118
+ export function macInstallDestination(customPath) {
119
+ if (!customPath?.trim())
120
+ return "/Applications/Summer.app";
121
+ const trimmed = customPath.trim().replace(/\/+$/, "");
122
+ return /\.app$/i.test(trimmed) ? trimmed : join(trimmed, "Summer.app");
123
+ }
98
124
  export function engineBinaryCandidates(os = platform(), env = process.env) {
99
125
  const override = engineBinaryOverride(env)?.path;
100
126
  const platformPaths = os === "darwin"
@@ -102,7 +128,11 @@ export function engineBinaryCandidates(os = platform(), env = process.env) {
102
128
  : os === "linux"
103
129
  ? linuxEnginePaths()
104
130
  : windowsEnginePaths(env);
105
- return override ? [override, ...platformPaths] : platformPaths;
131
+ // The engine summer install put in place last wins over the default
132
+ // locations (an install with --path next to an older /Applications copy).
133
+ const recorded = recordedEngineBinary();
134
+ const paths = recorded ? [recorded, ...platformPaths.filter((path) => path !== recorded)] : platformPaths;
135
+ return override ? [override, ...paths] : paths;
106
136
  }
107
137
  /** First existing engine binary for this machine, or null. SUMMER_BIN /
108
138
  * SUMMER_ENGINE_BINARY wins when set and present; a set-but-missing override
@@ -7,7 +7,7 @@
7
7
  * silent failure, never throws, never retries, never blocks the agent
8
8
  * for more than the timeout.
9
9
  *
10
- * Consent (SELF_IMPROVING_LIBRARY.md §3.4):
10
+ * Consent:
11
11
  * - SUMMER_NO_TELEMETRY=1 or DO_NOT_TRACK=1 → nothing is ever sent.
12
12
  * - First-run notice BEFORE the first event (CONTRACT §10): the first call
13
13
  * ever made on a machine sends NOTHING and returns a one-paragraph notice
@@ -0,0 +1,115 @@
1
+ import type { Tool } from "@modelcontextprotocol/sdk/types.js";
2
+ /** The part of an MCP client the mount and the CLI use (a fake in tests). */
3
+ export interface HostedClient {
4
+ listTools(params?: {
5
+ cursor?: string;
6
+ }): Promise<{
7
+ tools: Tool[];
8
+ nextCursor?: string;
9
+ }>;
10
+ callTool(params: {
11
+ name: string;
12
+ arguments?: Record<string, unknown>;
13
+ }): Promise<Record<string, unknown>>;
14
+ listPrompts(params?: {
15
+ cursor?: string;
16
+ }): Promise<{
17
+ prompts: Array<{
18
+ name: string;
19
+ title?: string;
20
+ description?: string;
21
+ arguments?: Array<{
22
+ name: string;
23
+ description?: string;
24
+ required?: boolean;
25
+ }>;
26
+ }>;
27
+ nextCursor?: string;
28
+ }>;
29
+ getPrompt(params: {
30
+ name: string;
31
+ arguments?: Record<string, string>;
32
+ }): Promise<Record<string, unknown>>;
33
+ listResources(params?: {
34
+ cursor?: string;
35
+ }): Promise<{
36
+ resources: Array<{
37
+ uri: string;
38
+ name: string;
39
+ title?: string;
40
+ description?: string;
41
+ mimeType?: string;
42
+ }>;
43
+ nextCursor?: string;
44
+ }>;
45
+ readResource(params: {
46
+ uri: string;
47
+ }): Promise<Record<string, unknown>>;
48
+ close?(): Promise<void>;
49
+ }
50
+ export interface HostedConnectDependencies {
51
+ /** The hosted Summer Engine MCP URL (the store sign-in's resource). */
52
+ url: () => string;
53
+ token: () => Promise<string>;
54
+ connect: (url: string, token: () => Promise<string>) => Promise<HostedClient>;
55
+ }
56
+ export declare function connectHostedMcp(url: string, token: () => Promise<string>): Promise<HostedClient>;
57
+ export declare const defaultHostedConnectDependencies: HostedConnectDependencies;
58
+ /** True when this machine has a store sign-in on disk (no network). */
59
+ export declare function hasStoreSignIn(): Promise<boolean>;
60
+ export declare function listAllHostedTools(client: HostedClient): Promise<Tool[]>;
61
+ /** Connect with the store sign-in, run fn, close. Throws OAuthError when not signed in. */
62
+ export declare function withHostedMcp<T>(fn: (client: HostedClient) => Promise<T>, deps?: HostedConnectDependencies): Promise<T>;
63
+ /** The text of a tool result, parsed as JSON when it is JSON. */
64
+ export declare function hostedResultPayload(result: Record<string, unknown>): {
65
+ isError: boolean;
66
+ text: string;
67
+ json: Record<string, unknown> | null;
68
+ };
69
+ export type StoreAccessResult = {
70
+ status: "not_signed_in";
71
+ message: string;
72
+ } | {
73
+ status: "ok";
74
+ games: number | null;
75
+ } | {
76
+ status: "refused";
77
+ code: string | null;
78
+ message: string;
79
+ requestId?: string;
80
+ } | {
81
+ status: "unreachable";
82
+ message: string;
83
+ };
84
+ /**
85
+ * Ask the store for the creator's games through the hosted MCP
86
+ * (summer_store_list_games): proves the store accepts this machine's sign-in.
87
+ */
88
+ export declare function checkStoreAccess(timeoutMs?: number, deps?: HostedConnectDependencies): Promise<StoreAccessResult>;
89
+ /** The hosted tool a CLI name means: the exact name, or a slug ("store-list-games" -> summer_store_list_games). */
90
+ export declare function matchHostedTool(name: string, tools: readonly Tool[]): Tool | null;
91
+ export type HostedToolsListing = {
92
+ status: "listed";
93
+ tools: Tool[];
94
+ } | {
95
+ status: "not_signed_in";
96
+ } | {
97
+ status: "unavailable";
98
+ message: string;
99
+ };
100
+ /** The hosted store and publishing tools, when this machine has a store sign-in. */
101
+ export declare function listHostedToolsForCli(deps?: HostedConnectDependencies, signedIn?: () => Promise<boolean>): Promise<HostedToolsListing>;
102
+ export type HostedCallOutcome = {
103
+ status: "called";
104
+ tool: string;
105
+ result: Record<string, unknown>;
106
+ } | {
107
+ status: "not_found";
108
+ } | {
109
+ status: "not_signed_in";
110
+ } | {
111
+ status: "unavailable";
112
+ message: string;
113
+ };
114
+ /** Call a hosted tool by its name or slug with the store sign-in (one connection). */
115
+ export declare function callHostedToolForCli(name: string, args: Record<string, unknown>, deps?: HostedConnectDependencies, signedIn?: () => Promise<boolean>): Promise<HostedCallOutcome>;
@@ -0,0 +1,164 @@
1
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
2
+ import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
3
+ import { getStoreAccessToken, OAuthError, readStoredOAuthToken, resolveMcpResourceUrl } from "./oauth.js";
4
+ import { TOOLKIT_VERSION } from "./version.js";
5
+ /**
6
+ * A client for the hosted Summer Engine MCP (mcp.summerengine.com), signed in
7
+ * with the store sign-in ("summer login --store"). The local MCP mounts its
8
+ * tools (src/mcp/hosted-mount.ts); `summer tool` and `summer doctor` call it
9
+ * directly through the helpers below, so all three faces reach the same
10
+ * store and publishing tools.
11
+ */
12
+ const CALL_TIMEOUT_MS = 120_000;
13
+ export async function connectHostedMcp(url, token) {
14
+ const transport = new StreamableHTTPClientTransport(new URL(url), {
15
+ // A fresh (refreshed when near expiry) token on every request.
16
+ fetch: async (input, init) => {
17
+ const headers = new Headers(init?.headers);
18
+ headers.set("authorization", `Bearer ${await token()}`);
19
+ return fetch(input, { ...init, headers });
20
+ },
21
+ });
22
+ const client = new Client({ name: "summer-engine-local", version: TOOLKIT_VERSION });
23
+ await client.connect(transport);
24
+ const timeout = { timeout: CALL_TIMEOUT_MS };
25
+ return {
26
+ listTools: (params) => client.listTools(params),
27
+ callTool: (params) => client.callTool(params, undefined, timeout),
28
+ listPrompts: (params) => client.listPrompts(params),
29
+ getPrompt: (params) => client.getPrompt(params),
30
+ listResources: (params) => client.listResources(params),
31
+ readResource: (params) => client.readResource(params),
32
+ close: () => client.close(),
33
+ };
34
+ }
35
+ export const defaultHostedConnectDependencies = {
36
+ url: () => resolveMcpResourceUrl(),
37
+ token: () => getStoreAccessToken(),
38
+ connect: connectHostedMcp,
39
+ };
40
+ /** True when this machine has a store sign-in on disk (no network). */
41
+ export async function hasStoreSignIn() {
42
+ return (await readStoredOAuthToken()) !== null;
43
+ }
44
+ export async function listAllHostedTools(client) {
45
+ const out = [];
46
+ let cursor;
47
+ for (let pages = 0; pages < 20; pages++) {
48
+ const result = await client.listTools(cursor ? { cursor } : undefined);
49
+ out.push(...(result.tools ?? []));
50
+ if (!result.nextCursor)
51
+ break;
52
+ cursor = result.nextCursor;
53
+ }
54
+ return out;
55
+ }
56
+ /** Connect with the store sign-in, run fn, close. Throws OAuthError when not signed in. */
57
+ export async function withHostedMcp(fn, deps = defaultHostedConnectDependencies) {
58
+ const url = deps.url();
59
+ await deps.token();
60
+ const client = await deps.connect(url, deps.token);
61
+ try {
62
+ return await fn(client);
63
+ }
64
+ finally {
65
+ await client.close?.().catch(() => undefined);
66
+ }
67
+ }
68
+ /** The text of a tool result, parsed as JSON when it is JSON. */
69
+ export function hostedResultPayload(result) {
70
+ const content = Array.isArray(result.content) ? result.content : [];
71
+ const text = content
72
+ .filter((part) => part.type === "text" && typeof part.text === "string")
73
+ .map((part) => part.text)
74
+ .join("\n");
75
+ let json = null;
76
+ try {
77
+ const parsed = JSON.parse(text);
78
+ if (parsed && typeof parsed === "object" && !Array.isArray(parsed))
79
+ json = parsed;
80
+ }
81
+ catch {
82
+ json = null;
83
+ }
84
+ if (!json && result.structuredContent && typeof result.structuredContent === "object") {
85
+ json = result.structuredContent;
86
+ }
87
+ return { isError: result.isError === true, text, json };
88
+ }
89
+ /**
90
+ * Ask the store for the creator's games through the hosted MCP
91
+ * (summer_store_list_games): proves the store accepts this machine's sign-in.
92
+ */
93
+ export async function checkStoreAccess(timeoutMs = 8_000, deps = defaultHostedConnectDependencies) {
94
+ let timer;
95
+ const timeout = new Promise((resolve) => {
96
+ timer = setTimeout(() => resolve({ status: "unreachable", message: `no answer within ${Math.round(timeoutMs / 1000)} s` }), timeoutMs);
97
+ timer.unref?.();
98
+ });
99
+ const attempt = (async () => {
100
+ try {
101
+ const result = await withHostedMcp((client) => client.callTool({ name: "summer_store_list_games", arguments: {} }), deps);
102
+ const payload = hostedResultPayload(result);
103
+ if (payload.isError || payload.json?.ok === false) {
104
+ const code = typeof payload.json?.code === "string" ? payload.json.code : typeof payload.json?.error === "string" ? payload.json.error : null;
105
+ const message = typeof payload.json?.message === "string" ? payload.json.message : payload.text.slice(0, 300) || "the store refused the call";
106
+ const requestId = typeof payload.json?.requestId === "string" ? payload.json.requestId : undefined;
107
+ return { status: "refused", code, message, ...(requestId ? { requestId } : {}) };
108
+ }
109
+ const games = Array.isArray(payload.json?.games) ? payload.json.games.length : null;
110
+ return { status: "ok", games };
111
+ }
112
+ catch (error) {
113
+ if (error instanceof OAuthError && error.code === "store_login_required") {
114
+ return { status: "not_signed_in", message: error.message.replace(` ${error.recovery}`, "") };
115
+ }
116
+ if (error instanceof OAuthError)
117
+ return { status: "refused", code: error.code, message: error.message };
118
+ return { status: "unreachable", message: error instanceof Error ? error.message : String(error) };
119
+ }
120
+ })();
121
+ try {
122
+ return await Promise.race([attempt, timeout]);
123
+ }
124
+ finally {
125
+ clearTimeout(timer);
126
+ }
127
+ }
128
+ /** The hosted tool a CLI name means: the exact name, or a slug ("store-list-games" -> summer_store_list_games). */
129
+ export function matchHostedTool(name, tools) {
130
+ const needle = name.trim();
131
+ const asAlias = needle.startsWith("summer_") ? needle : `summer_${needle.replace(/-/g, "_")}`;
132
+ return tools.find((tool) => tool.name === needle) ?? tools.find((tool) => tool.name === asAlias) ?? null;
133
+ }
134
+ /** The hosted store and publishing tools, when this machine has a store sign-in. */
135
+ export async function listHostedToolsForCli(deps = defaultHostedConnectDependencies, signedIn = hasStoreSignIn) {
136
+ if (!(await signedIn()))
137
+ return { status: "not_signed_in" };
138
+ try {
139
+ return { status: "listed", tools: await withHostedMcp(listAllHostedTools, deps) };
140
+ }
141
+ catch (error) {
142
+ if (error instanceof OAuthError && error.code === "store_login_required")
143
+ return { status: "not_signed_in" };
144
+ return { status: "unavailable", message: error instanceof Error ? error.message : String(error) };
145
+ }
146
+ }
147
+ /** Call a hosted tool by its name or slug with the store sign-in (one connection). */
148
+ export async function callHostedToolForCli(name, args, deps = defaultHostedConnectDependencies, signedIn = hasStoreSignIn) {
149
+ if (!(await signedIn()))
150
+ return { status: "not_signed_in" };
151
+ try {
152
+ return await withHostedMcp(async (client) => {
153
+ const tool = matchHostedTool(name, await listAllHostedTools(client));
154
+ if (!tool)
155
+ return { status: "not_found" };
156
+ return { status: "called", tool: tool.name, result: await client.callTool({ name: tool.name, arguments: args }) };
157
+ }, deps);
158
+ }
159
+ catch (error) {
160
+ if (error instanceof OAuthError && error.code === "store_login_required")
161
+ return { status: "not_signed_in" };
162
+ return { status: "unavailable", message: error instanceof Error ? error.message : String(error) };
163
+ }
164
+ }
@@ -11,8 +11,8 @@
11
11
  * or takes focus until the user clicks it.
12
12
  * offscreen `--summer-offscreen` (also `--summer-verify`) — never
13
13
  * activates, never frontmost; on shipped engines an unfocusable
14
- * window pushed off-screen where a sliver may stay visible
15
- * (main.cpp says so), on the background-posture engine a
14
+ * window pushed off-screen where a sliver may stay visible;
15
+ * on the background-posture engine a
16
16
  * no-Dock-icon accessory process. Used by RunVerification /
17
17
  * offscreen play instances, never by `summer run`.
18
18
  *
@@ -96,6 +96,9 @@ export type BackgroundLaunchSupport = {
96
96
  reason: "version_unknown";
97
97
  version: null;
98
98
  };
99
+ /** Whether `version` is `minimum` or newer; null when either is missing or
100
+ * not x.y.z (an unknown version is never "too old" and never "new enough"). */
101
+ export declare function isVersionAtLeast(version: string | null | undefined, minimum: string): boolean | null;
99
102
  /**
100
103
  * Whether the installed engine honours the background flag. The `--help`
101
104
  * probe answer (true/false) is definitive when it ran; a probe that could not
@@ -136,7 +139,7 @@ export interface DetectBackgroundSupportOptions {
136
139
  export declare function detectBackgroundLaunchSupport(binary: string, options?: DetectBackgroundSupportOptions): Promise<BackgroundLaunchSupport>;
137
140
  /**
138
141
  * The running engine's own word, once it is up: /api/health
139
- * `capabilities.launchPostures` (engine tool_net_thread.cpp, newer builds;
142
+ * `capabilities.launchPostures` (newer engine builds;
140
143
  * "focus" always, "background" / "offscreen" only where enforced). true /
141
144
  * false when advertised, null when the engine predates the advert.
142
145
  */
@@ -11,8 +11,8 @@
11
11
  * or takes focus until the user clicks it.
12
12
  * offscreen `--summer-offscreen` (also `--summer-verify`) — never
13
13
  * activates, never frontmost; on shipped engines an unfocusable
14
- * window pushed off-screen where a sliver may stay visible
15
- * (main.cpp says so), on the background-posture engine a
14
+ * window pushed off-screen where a sliver may stay visible;
15
+ * on the background-posture engine a
16
16
  * no-Dock-icon accessory process. Used by RunVerification /
17
17
  * offscreen play instances, never by `summer run`.
18
18
  *
@@ -61,7 +61,7 @@
61
61
  * --help probe below runs against THAT binary (cache key: path + mtime + size).
62
62
  */
63
63
  import { spawn } from "node:child_process";
64
- import { mkdirSync, readFileSync, statSync, writeFileSync } from "node:fs";
64
+ import { existsSync, mkdirSync, readFileSync, statSync, writeFileSync } from "node:fs";
65
65
  import { basename, dirname, join } from "node:path";
66
66
  import { platform } from "node:os";
67
67
  import { getSummerDir } from "./auth.js";
@@ -100,6 +100,15 @@ function compareVersions(a, b) {
100
100
  return a.minor - b.minor;
101
101
  return a.patch - b.patch;
102
102
  }
103
+ /** Whether `version` is `minimum` or newer; null when either is missing or
104
+ * not x.y.z (an unknown version is never "too old" and never "new enough"). */
105
+ export function isVersionAtLeast(version, minimum) {
106
+ const parsed = version ? parseVersion(version) : null;
107
+ const min = parseVersion(minimum);
108
+ if (!parsed || !min)
109
+ return null;
110
+ return compareVersions(parsed, min) >= 0;
111
+ }
103
112
  /**
104
113
  * Whether the installed engine honours the background flag. The `--help`
105
114
  * probe answer (true/false) is definitive when it ran; a probe that could not
@@ -232,7 +241,7 @@ export async function detectBackgroundLaunchSupport(binary, options = {}) {
232
241
  }
233
242
  /**
234
243
  * The running engine's own word, once it is up: /api/health
235
- * `capabilities.launchPostures` (engine tool_net_thread.cpp, newer builds;
244
+ * `capabilities.launchPostures` (newer engine builds;
236
245
  * "focus" always, "background" / "offscreen" only where enforced). true /
237
246
  * false when advertised, null when the engine predates the advert.
238
247
  */
@@ -282,12 +291,16 @@ export function parseVelopackVersion(sqVersionText) {
282
291
  const match = sqVersionText.match(/<version>\s*([^<\s]+)\s*<\/version>/i);
283
292
  return match ? match[1].trim() : null;
284
293
  }
285
- /** Walk up from `.../Summer.app/Contents/MacOS/Summer` to the bundle. */
294
+ /** Walk up from `.../Summer.app/Contents/MacOS/Summer` to the bundle. A
295
+ * bundle unpacked without its `.app` folder (`<dir>/Contents/MacOS/Summer`)
296
+ * reads as `<dir>`. */
286
297
  function macBundlePathFor(binary) {
287
298
  let current = dirname(binary);
288
299
  for (let depth = 0; depth < 4; depth++) {
289
300
  if (basename(current).endsWith(".app"))
290
301
  return current;
302
+ if (basename(current) === "Contents" && existsSync(join(current, "Info.plist")))
303
+ return dirname(current);
291
304
  const parent = dirname(current);
292
305
  if (parent === current)
293
306
  break;
@@ -13,8 +13,7 @@
13
13
  * reference the markdown body
14
14
  * example / collection README.md / collection.yaml when present
15
15
  *
16
- * The LAST line of every load is the feedback footer
17
- * (SELF_IMPROVING_LIBRARY.md §3.1 "trigger placement"):
16
+ * The LAST line of every load is the feedback footer:
18
17
  * — entry_id: <id>@<content_hash first 12>. If this entry is wrong, stale,
19
18
  * or you deviate from it, report via summer_library_feedback.
20
19
  * The agent copies that entry_id verbatim into summer_library_feedback, so
@@ -53,8 +53,7 @@ export declare function getTemplateRegistry(): readonly TemplateEntry[];
53
53
  */
54
54
  export declare function resolveTemplate(query: string, entries: readonly TemplateEntry[]): TemplateResolution;
55
55
  /** Seconds a network git call (`fetch`) may take before it is killed.
56
- * `summer create` once hung 42 minutes inside a fetch
57
- * (docs/design/archive/TK-VS-FOLD-2026-09-07.md, gap 4). */
56
+ * `summer create` once hung 42 minutes inside a fetch. */
58
57
  export declare const FETCH_TIMEOUT_ENV = "SUMMER_FETCH_TIMEOUT_S";
59
58
  export declare const DEFAULT_FETCH_TIMEOUT_S = 120;
60
59
  /** The bound in force: FETCH_TIMEOUT_ENV when it is a positive number of
@@ -109,8 +109,7 @@ export function resolveTemplate(query, entries) {
109
109
  }
110
110
  // ---------- git ----------
111
111
  /** Seconds a network git call (`fetch`) may take before it is killed.
112
- * `summer create` once hung 42 minutes inside a fetch
113
- * (docs/design/archive/TK-VS-FOLD-2026-09-07.md, gap 4). */
112
+ * `summer create` once hung 42 minutes inside a fetch. */
114
113
  export const FETCH_TIMEOUT_ENV = "SUMMER_FETCH_TIMEOUT_S";
115
114
  export const DEFAULT_FETCH_TIMEOUT_S = 120;
116
115
  /** The bound in force: FETCH_TIMEOUT_ENV when it is a positive number of
@@ -1,5 +1,6 @@
1
1
  import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- import { type Tool } from "@modelcontextprotocol/sdk/types.js";
2
+ import { type HostedClient, type HostedConnectDependencies } from "../core/hosted-mcp.js";
3
+ export type { HostedClient };
3
4
  /**
4
5
  * One Summer Engine MCP. The cloud tools a creator's agent needs to publish
5
6
  * (projects, store page, build upload, submit for the owner's approval, the
@@ -11,65 +12,16 @@ import { type Tool } from "@modelcontextprotocol/sdk/types.js";
11
12
  * that server). A name the local MCP already has stays local (the engine and
12
13
  * generation tools keep their CLI-token path).
13
14
  *
14
- * Mounting is lazy: the server answers with the engine tools at once, and the
15
- * hosted tools appear when the mount finishes (tools/list_changed). Without a
16
- * store sign-in one tool, summer_store_tools, says how to sign in and mounts
17
- * on the next call.
15
+ * Mounting runs after connect. The first tools/list waits for a mount in
16
+ * progress (up to FIRST_LIST_WAIT_MS), so a host that lists tools once still
17
+ * sees the store tools; a slower mount adds them later (tools/list_changed).
18
+ * Without a store sign-in the mount fails at once, and one tool,
19
+ * summer_store_tools, says how to sign in and mounts on the next call.
18
20
  */
19
21
  export declare const STORE_TOOLS_STATUS = "summer_store_tools";
20
- /** The part of an MCP client the mount uses (a fake in tests). */
21
- export interface HostedClient {
22
- listTools(params?: {
23
- cursor?: string;
24
- }): Promise<{
25
- tools: Tool[];
26
- nextCursor?: string;
27
- }>;
28
- callTool(params: {
29
- name: string;
30
- arguments?: Record<string, unknown>;
31
- }): Promise<Record<string, unknown>>;
32
- listPrompts(params?: {
33
- cursor?: string;
34
- }): Promise<{
35
- prompts: Array<{
36
- name: string;
37
- title?: string;
38
- description?: string;
39
- arguments?: Array<{
40
- name: string;
41
- description?: string;
42
- required?: boolean;
43
- }>;
44
- }>;
45
- nextCursor?: string;
46
- }>;
47
- getPrompt(params: {
48
- name: string;
49
- arguments?: Record<string, string>;
50
- }): Promise<Record<string, unknown>>;
51
- listResources(params?: {
52
- cursor?: string;
53
- }): Promise<{
54
- resources: Array<{
55
- uri: string;
56
- name: string;
57
- title?: string;
58
- description?: string;
59
- mimeType?: string;
60
- }>;
61
- nextCursor?: string;
62
- }>;
63
- readResource(params: {
64
- uri: string;
65
- }): Promise<Record<string, unknown>>;
66
- }
67
- export interface HostedMountDependencies {
68
- /** The hosted Summer Engine MCP URL (the store sign-in's resource). */
69
- url: () => string;
70
- token: () => Promise<string>;
71
- connect: (url: string, token: () => Promise<string>) => Promise<HostedClient>;
72
- }
22
+ /** How long the first tools/list waits for a mount in progress, so hosts that list once see the store tools. */
23
+ export declare const FIRST_LIST_WAIT_MS = 5000;
24
+ export type HostedMountDependencies = HostedConnectDependencies;
73
25
  export declare const defaultHostedMountDependencies: HostedMountDependencies;
74
26
  export interface HostedMountState {
75
27
  status: "idle" | "mounting" | "mounted" | "unavailable";
@@ -90,7 +42,9 @@ export interface HostedMountState {
90
42
  * reports each mounted tool's own JSON Schema rather than the passthrough one.
91
43
  * Returns mount(), which callers run after connect without awaiting it.
92
44
  */
93
- export declare function prepareHostedMount(server: McpServer, deps?: HostedMountDependencies): {
45
+ export declare function prepareHostedMount(server: McpServer, deps?: HostedMountDependencies, options?: {
46
+ firstListWaitMs?: number;
47
+ }): {
94
48
  mount: () => Promise<HostedMountState>;
95
49
  state: HostedMountState;
96
50
  };