@eidola.app/cli 0.2.0

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 (212) hide show
  1. package/cli.d.ts +3 -0
  2. package/cli.d.ts.map +1 -0
  3. package/cli.js +46 -0
  4. package/cli.js.map +1 -0
  5. package/config.d.ts +16 -0
  6. package/config.d.ts.map +1 -0
  7. package/config.js +62 -0
  8. package/config.js.map +1 -0
  9. package/cursor/auto-activate.d.ts +16 -0
  10. package/cursor/auto-activate.d.ts.map +1 -0
  11. package/cursor/auto-activate.js +79 -0
  12. package/cursor/auto-activate.js.map +1 -0
  13. package/cursor/compile.d.ts +13 -0
  14. package/cursor/compile.d.ts.map +1 -0
  15. package/cursor/compile.js +47 -0
  16. package/cursor/compile.js.map +1 -0
  17. package/cursor/ensure-shrine.d.ts +25 -0
  18. package/cursor/ensure-shrine.d.ts.map +1 -0
  19. package/cursor/ensure-shrine.js +168 -0
  20. package/cursor/ensure-shrine.js.map +1 -0
  21. package/cursor/hash.d.ts +3 -0
  22. package/cursor/hash.d.ts.map +1 -0
  23. package/cursor/hash.js +7 -0
  24. package/cursor/hash.js.map +1 -0
  25. package/cursor/shrine-lock.d.ts +17 -0
  26. package/cursor/shrine-lock.d.ts.map +1 -0
  27. package/cursor/shrine-lock.js +82 -0
  28. package/cursor/shrine-lock.js.map +1 -0
  29. package/cursor/shrine-surface.d.ts +40 -0
  30. package/cursor/shrine-surface.d.ts.map +1 -0
  31. package/cursor/shrine-surface.js +152 -0
  32. package/cursor/shrine-surface.js.map +1 -0
  33. package/cursor/soul-source.d.ts +3 -0
  34. package/cursor/soul-source.d.ts.map +1 -0
  35. package/cursor/soul-source.js +15 -0
  36. package/cursor/soul-source.js.map +1 -0
  37. package/cursor/stale.d.ts +12 -0
  38. package/cursor/stale.d.ts.map +1 -0
  39. package/cursor/stale.js +41 -0
  40. package/cursor/stale.js.map +1 -0
  41. package/cursor/types.d.ts +24 -0
  42. package/cursor/types.d.ts.map +1 -0
  43. package/cursor/types.js +2 -0
  44. package/cursor/types.js.map +1 -0
  45. package/cursor/workspace-config.d.ts +13 -0
  46. package/cursor/workspace-config.d.ts.map +1 -0
  47. package/cursor/workspace-config.js +44 -0
  48. package/cursor/workspace-config.js.map +1 -0
  49. package/engram/loader.d.ts +3 -0
  50. package/engram/loader.d.ts.map +1 -0
  51. package/engram/loader.js +60 -0
  52. package/engram/loader.js.map +1 -0
  53. package/engram/parse.d.ts +4 -0
  54. package/engram/parse.d.ts.map +1 -0
  55. package/engram/parse.js +190 -0
  56. package/engram/parse.js.map +1 -0
  57. package/engram/registry.d.ts +9 -0
  58. package/engram/registry.d.ts.map +1 -0
  59. package/engram/registry.js +54 -0
  60. package/engram/registry.js.map +1 -0
  61. package/engram/types.d.ts +58 -0
  62. package/engram/types.d.ts.map +1 -0
  63. package/engram/types.js +12 -0
  64. package/engram/types.js.map +1 -0
  65. package/engram/validate.d.ts +7 -0
  66. package/engram/validate.d.ts.map +1 -0
  67. package/engram/validate.js +22 -0
  68. package/engram/validate.js.map +1 -0
  69. package/index.d.ts +30 -0
  70. package/index.d.ts.map +1 -0
  71. package/index.js +27 -0
  72. package/index.js.map +1 -0
  73. package/migrations/json-to-directory.d.ts +8 -0
  74. package/migrations/json-to-directory.d.ts.map +1 -0
  75. package/migrations/json-to-directory.js +151 -0
  76. package/migrations/json-to-directory.js.map +1 -0
  77. package/migrations/types.d.ts +46 -0
  78. package/migrations/types.d.ts.map +1 -0
  79. package/migrations/types.js +2 -0
  80. package/migrations/types.js.map +1 -0
  81. package/package.json +42 -0
  82. package/server.d.ts +5 -0
  83. package/server.d.ts.map +1 -0
  84. package/server.js +95 -0
  85. package/server.js.map +1 -0
  86. package/session/state.d.ts +29 -0
  87. package/session/state.d.ts.map +1 -0
  88. package/session/state.js +69 -0
  89. package/session/state.js.map +1 -0
  90. package/shrine/renderer/assets/index-C44XsM0B.js +4083 -0
  91. package/shrine/renderer/assets/index-DeRYP3aH.css +1 -0
  92. package/shrine/renderer/index.html +32 -0
  93. package/shrine/server/display-config.d.ts +20 -0
  94. package/shrine/server/display-config.d.ts.map +1 -0
  95. package/shrine/server/display-config.js +98 -0
  96. package/shrine/server/display-config.js.map +1 -0
  97. package/shrine/server/index.d.ts +35 -0
  98. package/shrine/server/index.d.ts.map +1 -0
  99. package/shrine/server/index.js +337 -0
  100. package/shrine/server/index.js.map +1 -0
  101. package/shrine/shared/approval-idle-logic.d.ts +17 -0
  102. package/shrine/shared/approval-idle-logic.d.ts.map +1 -0
  103. package/shrine/shared/approval-idle-logic.js +63 -0
  104. package/shrine/shared/approval-idle-logic.js.map +1 -0
  105. package/shrine/shared/approval-idle-logic.test.d.ts +2 -0
  106. package/shrine/shared/approval-idle-logic.test.d.ts.map +1 -0
  107. package/shrine/shared/approval-idle-logic.test.js +49 -0
  108. package/shrine/shared/approval-idle-logic.test.js.map +1 -0
  109. package/shrine/shared/kraken-detect.d.ts +36 -0
  110. package/shrine/shared/kraken-detect.d.ts.map +1 -0
  111. package/shrine/shared/kraken-detect.js +61 -0
  112. package/shrine/shared/kraken-detect.js.map +1 -0
  113. package/shrine/shared/kraken-detect.test.d.ts +2 -0
  114. package/shrine/shared/kraken-detect.test.d.ts.map +1 -0
  115. package/shrine/shared/kraken-detect.test.js +35 -0
  116. package/shrine/shared/kraken-detect.test.js.map +1 -0
  117. package/shrine/shared/shrine-api.d.ts +15 -0
  118. package/shrine/shared/shrine-api.d.ts.map +1 -0
  119. package/shrine/shared/shrine-api.js +2 -0
  120. package/shrine/shared/shrine-api.js.map +1 -0
  121. package/shrine/shared/shrine-display-config.d.ts +34 -0
  122. package/shrine/shared/shrine-display-config.d.ts.map +1 -0
  123. package/shrine/shared/shrine-display-config.js +197 -0
  124. package/shrine/shared/shrine-display-config.js.map +1 -0
  125. package/shrine/shared/shrine-display-config.test.d.ts +2 -0
  126. package/shrine/shared/shrine-display-config.test.d.ts.map +1 -0
  127. package/shrine/shared/shrine-display-config.test.js +53 -0
  128. package/shrine/shared/shrine-display-config.test.js.map +1 -0
  129. package/shrine/shared/shrine-state-colors.d.ts +4 -0
  130. package/shrine/shared/shrine-state-colors.d.ts.map +1 -0
  131. package/shrine/shared/shrine-state-colors.js +17 -0
  132. package/shrine/shared/shrine-state-colors.js.map +1 -0
  133. package/shrine/shared/shrine-surface.d.ts +32 -0
  134. package/shrine/shared/shrine-surface.d.ts.map +1 -0
  135. package/shrine/shared/shrine-surface.js +67 -0
  136. package/shrine/shared/shrine-surface.js.map +1 -0
  137. package/shrine/shared/shrine-surface.test.d.ts +2 -0
  138. package/shrine/shared/shrine-surface.test.d.ts.map +1 -0
  139. package/shrine/shared/shrine-surface.test.js +35 -0
  140. package/shrine/shared/shrine-surface.test.js.map +1 -0
  141. package/shrine/shared/state-socket-client.d.ts +30 -0
  142. package/shrine/shared/state-socket-client.d.ts.map +1 -0
  143. package/shrine/shared/state-socket-client.js +103 -0
  144. package/shrine/shared/state-socket-client.js.map +1 -0
  145. package/shrine/shared/state-socket-client.test.d.ts +2 -0
  146. package/shrine/shared/state-socket-client.test.d.ts.map +1 -0
  147. package/shrine/shared/state-socket-client.test.js +20 -0
  148. package/shrine/shared/state-socket-client.test.js.map +1 -0
  149. package/shrine/shared/types.d.ts +43 -0
  150. package/shrine/shared/types.d.ts.map +1 -0
  151. package/shrine/shared/types.js +58 -0
  152. package/shrine/shared/types.js.map +1 -0
  153. package/shrine/shared/types.test.d.ts +2 -0
  154. package/shrine/shared/types.test.d.ts.map +1 -0
  155. package/shrine/shared/types.test.js +26 -0
  156. package/shrine/shared/types.test.js.map +1 -0
  157. package/shrine/shared/vessel-resolver.d.ts +37 -0
  158. package/shrine/shared/vessel-resolver.d.ts.map +1 -0
  159. package/shrine/shared/vessel-resolver.js +135 -0
  160. package/shrine/shared/vessel-resolver.js.map +1 -0
  161. package/shrine/vendor/mcp.d.ts +3 -0
  162. package/shrine/vendor/mcp.d.ts.map +1 -0
  163. package/shrine/vendor/mcp.js +3 -0
  164. package/shrine/vendor/mcp.js.map +1 -0
  165. package/socket/expression.d.ts +3 -0
  166. package/socket/expression.d.ts.map +1 -0
  167. package/socket/expression.js +28 -0
  168. package/socket/expression.js.map +1 -0
  169. package/socket/protocol.d.ts +16 -0
  170. package/socket/protocol.d.ts.map +1 -0
  171. package/socket/protocol.js +75 -0
  172. package/socket/protocol.js.map +1 -0
  173. package/socket/server.d.ts +22 -0
  174. package/socket/server.d.ts.map +1 -0
  175. package/socket/server.js +184 -0
  176. package/socket/server.js.map +1 -0
  177. package/socket/types.d.ts +35 -0
  178. package/socket/types.d.ts.map +1 -0
  179. package/socket/types.js +18 -0
  180. package/socket/types.js.map +1 -0
  181. package/socket/visual-turn.d.ts +8 -0
  182. package/socket/visual-turn.d.ts.map +1 -0
  183. package/socket/visual-turn.js +27 -0
  184. package/socket/visual-turn.js.map +1 -0
  185. package/soul/injection.d.ts +13 -0
  186. package/soul/injection.d.ts.map +1 -0
  187. package/soul/injection.js +36 -0
  188. package/soul/injection.js.map +1 -0
  189. package/soul/reinject.d.ts +13 -0
  190. package/soul/reinject.d.ts.map +1 -0
  191. package/soul/reinject.js +28 -0
  192. package/soul/reinject.js.map +1 -0
  193. package/tools/handlers.d.ts +20 -0
  194. package/tools/handlers.d.ts.map +1 -0
  195. package/tools/handlers.js +148 -0
  196. package/tools/handlers.js.map +1 -0
  197. package/tools/register.d.ts +4 -0
  198. package/tools/register.d.ts.map +1 -0
  199. package/tools/register.js +48 -0
  200. package/tools/register.js.map +1 -0
  201. package/vendor/tool-state-pkg/index.d.ts +23 -0
  202. package/vendor/tool-state-pkg/index.d.ts.map +1 -0
  203. package/vendor/tool-state-pkg/index.js +140 -0
  204. package/vendor/tool-state-pkg/index.js.map +1 -0
  205. package/vendor/tool-state.d.ts +3 -0
  206. package/vendor/tool-state.d.ts.map +1 -0
  207. package/vendor/tool-state.js +3 -0
  208. package/vendor/tool-state.js.map +1 -0
  209. package/watch/filesystem.d.ts +7 -0
  210. package/watch/filesystem.d.ts.map +1 -0
  211. package/watch/filesystem.js +66 -0
  212. package/watch/filesystem.js.map +1 -0
package/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
package/cli.d.ts.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/cli.js ADDED
@@ -0,0 +1,46 @@
1
+ #!/usr/bin/env node
2
+ const USAGE = `eidola — Eidola MCP server and Shrine display runtime
3
+
4
+ Usage:
5
+ eidola mcp Start MCP server (stdio)
6
+ eidola shrine Start Shrine HTTP server
7
+ `;
8
+ async function main() {
9
+ const subcommand = process.argv[2];
10
+ if (subcommand === 'mcp') {
11
+ const { startEidolaMcpServer } = await import('./server.js');
12
+ const { close } = await startEidolaMcpServer();
13
+ const shutdown = async (signal) => {
14
+ console.error('[eidola]', `${signal} received, shutting down...`);
15
+ await close();
16
+ process.exit(0);
17
+ };
18
+ process.on('SIGINT', () => void shutdown('SIGINT'));
19
+ process.on('SIGTERM', () => void shutdown('SIGTERM'));
20
+ return;
21
+ }
22
+ if (subcommand === 'shrine') {
23
+ const shrineUrl = new URL('./shrine/server/index.js', import.meta.url).href;
24
+ const { startShrineHttpServer } = (await import(shrineUrl));
25
+ const server = await startShrineHttpServer();
26
+ const shutdown = () => {
27
+ server.stop();
28
+ process.exit(0);
29
+ };
30
+ process.on('SIGINT', shutdown);
31
+ process.on('SIGTERM', shutdown);
32
+ return;
33
+ }
34
+ if (!subcommand) {
35
+ console.error(USAGE);
36
+ process.exit(1);
37
+ }
38
+ console.error(`Unknown subcommand: ${subcommand}\n${USAGE}`);
39
+ process.exit(1);
40
+ }
41
+ main().catch((error) => {
42
+ console.error('[eidola] failed:', error);
43
+ process.exit(1);
44
+ });
45
+ export {};
46
+ //# sourceMappingURL=cli.js.map
package/cli.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,MAAM,KAAK,GAAG;;;;;CAKb,CAAC;AAEF,KAAK,UAAU,IAAI;IACjB,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAEnC,IAAI,UAAU,KAAK,KAAK,EAAE,CAAC;QACzB,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QAC7D,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,oBAAoB,EAAE,CAAC;QAE/C,MAAM,QAAQ,GAAG,KAAK,EAAE,MAAc,EAAE,EAAE;YACxC,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,GAAG,MAAM,6BAA6B,CAAC,CAAC;YAClE,MAAM,KAAK,EAAE,CAAC;YACd,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC;QAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;QACpD,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;QACtD,OAAO;IACT,CAAC;IAED,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,0BAA0B,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;QAC5E,MAAM,EAAE,qBAAqB,EAAE,GAAG,CAAC,MAAM,MAAM,CAAC,SAAS,CAAC,CAEzD,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,qBAAqB,EAAE,CAAC;QAE7C,MAAM,QAAQ,GAAG,GAAG,EAAE;YACpB,MAAM,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC;QAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAChC,OAAO;IACT,CAAC;IAED,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,uBAAuB,UAAU,KAAK,KAAK,EAAE,CAAC,CAAC;IAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;IACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
package/config.d.ts ADDED
@@ -0,0 +1,16 @@
1
+ export interface EidolaPaths {
2
+ repoRoot: string;
3
+ engramsDir: string;
4
+ vesselsDir: string;
5
+ }
6
+ export interface EidolaRuntimeConfig extends EidolaPaths {
7
+ /** Cursor workspace root — where `.cursor/eidola.json` lives. Set via EIDOLA_WORKSPACE. */
8
+ workspaceRoot?: string;
9
+ stateSocketHost: string;
10
+ stateSocketPort: number;
11
+ stateBufferSize: number;
12
+ }
13
+ export declare function resolveEidolaPaths(env?: NodeJS.ProcessEnv): EidolaPaths;
14
+ export declare function inferWorkspaceRoot(repoRoot: string, env?: NodeJS.ProcessEnv): string | undefined;
15
+ export declare function resolveEidolaRuntimeConfig(env?: NodeJS.ProcessEnv): EidolaRuntimeConfig;
16
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAuBA,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAoB,SAAQ,WAAW;IACtD,2FAA2F;IAC3F,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,kBAAkB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,WAAW,CAgBpF;AAED,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,GAAG,SAAS,CAWpB;AAED,wBAAgB,0BAA0B,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,mBAAmB,CAUpG"}
package/config.js ADDED
@@ -0,0 +1,62 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { dirname, join, resolve } from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { DEFAULT_STATE_BUFFER_SIZE, DEFAULT_STATE_SOCKET_PORT, STATE_SOCKET_HOST, } from './socket/types.js';
5
+ const moduleDir = dirname(fileURLToPath(import.meta.url));
6
+ /** packages/mcp/dist → eidola-repo root in monorepo dev */
7
+ const defaultMonorepoRoot = resolve(moduleDir, '../../..');
8
+ function resolvePackageRoot() {
9
+ return resolve(moduleDir, '..');
10
+ }
11
+ function isPublishedInstall() {
12
+ const normalized = resolvePackageRoot().replace(/\\/g, '/');
13
+ return normalized.includes('/node_modules/');
14
+ }
15
+ export function resolveEidolaPaths(env = process.env) {
16
+ const published = isPublishedInstall();
17
+ const repoRoot = resolve(env.EIDOLA_ROOT ?? (published ? process.cwd() : defaultMonorepoRoot));
18
+ const monorepoEngrams = join(repoRoot, 'engrams');
19
+ const defaultEngramsDir = env.EIDOLA_ENGRAMS_DIR === undefined && !published && existsSync(monorepoEngrams)
20
+ ? monorepoEngrams
21
+ : repoRoot;
22
+ return {
23
+ repoRoot,
24
+ engramsDir: resolve(env.EIDOLA_ENGRAMS_DIR ?? defaultEngramsDir),
25
+ vesselsDir: resolve(env.EIDOLA_VESSELS_DIR ?? joinPath(repoRoot, 'vessels')),
26
+ };
27
+ }
28
+ export function inferWorkspaceRoot(repoRoot, env = process.env) {
29
+ const explicit = env.EIDOLA_WORKSPACE?.trim();
30
+ if (explicit) {
31
+ return resolve(explicit);
32
+ }
33
+ if (existsSync(join(repoRoot, '.cursor', 'eidola.json'))) {
34
+ return repoRoot;
35
+ }
36
+ return undefined;
37
+ }
38
+ export function resolveEidolaRuntimeConfig(env = process.env) {
39
+ const paths = resolveEidolaPaths(env);
40
+ const workspaceRoot = inferWorkspaceRoot(paths.repoRoot, env);
41
+ return {
42
+ ...paths,
43
+ workspaceRoot,
44
+ stateSocketHost: STATE_SOCKET_HOST,
45
+ stateSocketPort: parsePositiveInt(env.EIDOLA_STATE_SOCKET_PORT, DEFAULT_STATE_SOCKET_PORT),
46
+ stateBufferSize: parsePositiveInt(env.EIDOLA_STATE_BUFFER_SIZE, DEFAULT_STATE_BUFFER_SIZE),
47
+ };
48
+ }
49
+ function parsePositiveInt(raw, fallback) {
50
+ if (!raw) {
51
+ return fallback;
52
+ }
53
+ const parsed = Number.parseInt(raw, 10);
54
+ if (!Number.isFinite(parsed) || parsed <= 0) {
55
+ return fallback;
56
+ }
57
+ return parsed;
58
+ }
59
+ function joinPath(base, segment) {
60
+ return resolve(base, segment);
61
+ }
62
+ //# sourceMappingURL=config.js.map
package/config.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { EidolaRuntimeConfig } from '../config.js';
2
+ import type { SessionState } from '../session/state.js';
3
+ import type { StateSocketServer } from '../socket/server.js';
4
+ export interface AutoActivateResult {
5
+ activated: boolean;
6
+ engramId?: string;
7
+ alreadyActive?: boolean;
8
+ error?: string;
9
+ code?: string;
10
+ }
11
+ /**
12
+ * Load active Engram from `.cursor/eidola.json` and broadcast idle to the Shrine.
13
+ * Idempotent when the same Engram is already bound in session.
14
+ */
15
+ export declare function autoActivateFromWorkspace(config: EidolaRuntimeConfig, session: SessionState, stateSocket: StateSocketServer | undefined, onWarn?: (message: string) => void): Promise<AutoActivateResult>;
16
+ //# sourceMappingURL=auto-activate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-activate.d.ts","sourceRoot":"","sources":["../../src/cursor/auto-activate.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAGxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAM7D,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAaD;;;GAGG;AACH,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,mBAAmB,EAC3B,OAAO,EAAE,YAAY,EACrB,WAAW,EAAE,iBAAiB,GAAG,SAAS,EAC1C,MAAM,GAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAkB,GAC9C,OAAO,CAAC,kBAAkB,CAAC,CA+D7B"}
@@ -0,0 +1,79 @@
1
+ import { resolve } from 'node:path';
2
+ import { resolveEngramDirectory } from '../engram/registry.js';
3
+ import { EngramLoadError } from '../engram/types.js';
4
+ import { detectSoulSource } from './soul-source.js';
5
+ import { warnIfStaleSoulCompile } from './stale.js';
6
+ import { cursorRulePath, readWorkspaceConfig } from './workspace-config.js';
7
+ function resolveEngramsDir(config, workspaceConfig) {
8
+ if (workspaceConfig?.engrams_dir) {
9
+ return resolve(workspaceConfig.engrams_dir);
10
+ }
11
+ return config.engramsDir;
12
+ }
13
+ /**
14
+ * Load active Engram from `.cursor/eidola.json` and broadcast idle to the Shrine.
15
+ * Idempotent when the same Engram is already bound in session.
16
+ */
17
+ export async function autoActivateFromWorkspace(config, session, stateSocket, onWarn = defaultWarn) {
18
+ const workspaceRoot = config.workspaceRoot;
19
+ if (!workspaceRoot) {
20
+ return { activated: false };
21
+ }
22
+ let workspaceConfig;
23
+ try {
24
+ workspaceConfig = await readWorkspaceConfig(workspaceRoot);
25
+ }
26
+ catch (error) {
27
+ const message = error instanceof Error ? error.message : String(error);
28
+ onWarn(`failed to read workspace config: ${message}`);
29
+ return { activated: false, error: message, code: 'WORKSPACE_CONFIG_ERROR' };
30
+ }
31
+ if (!workspaceConfig?.active_engram_id) {
32
+ return { activated: false };
33
+ }
34
+ const engramId = workspaceConfig.active_engram_id;
35
+ const active = session.getActive();
36
+ if (active?.engram.id === engramId) {
37
+ stateSocket?.broadcastState({ state: 'idle', surface: 'manual' });
38
+ return { activated: true, engramId, alreadyActive: true };
39
+ }
40
+ const engramsDir = resolveEngramsDir(config, workspaceConfig);
41
+ let directory;
42
+ try {
43
+ directory = resolveEngramDirectory(engramsDir, engramId);
44
+ }
45
+ catch (error) {
46
+ const message = error instanceof Error ? error.message : String(error);
47
+ onWarn(`auto-activate: Engram "${engramId}" not found (${message})`);
48
+ return { activated: false, engramId, error: message, code: 'MISSING_ENGRAM' };
49
+ }
50
+ try {
51
+ const soulSource = await detectSoulSource(workspaceRoot, engramId);
52
+ await session.load(directory, soulSource);
53
+ stateSocket?.broadcastState({ state: 'idle', surface: 'manual' });
54
+ await warnIfStaleSoulCompile({
55
+ engramDirectory: directory,
56
+ mdcPath: cursorRulePath(workspaceRoot, engramId),
57
+ workspaceConfig,
58
+ });
59
+ return { activated: true, engramId };
60
+ }
61
+ catch (error) {
62
+ if (error instanceof EngramLoadError) {
63
+ onWarn(`auto-activate: ${error.message}`);
64
+ return {
65
+ activated: false,
66
+ engramId,
67
+ error: error.message,
68
+ code: error.code,
69
+ };
70
+ }
71
+ const message = error instanceof Error ? error.message : String(error);
72
+ onWarn(`auto-activate failed: ${message}`);
73
+ return { activated: false, engramId, error: message, code: 'INTERNAL_ERROR' };
74
+ }
75
+ }
76
+ function defaultWarn(message) {
77
+ console.error('[eidola-mcp]', message);
78
+ }
79
+ //# sourceMappingURL=auto-activate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-activate.js","sourceRoot":"","sources":["../../src/cursor/auto-activate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { LoadedEngram } from '../engram/types.js';
2
+ import type { CompiledCursorRule } from './types.js';
3
+ /** Split compiled `.mdc` into frontmatter block and Soul body. */
4
+ export declare function parseCompiledCursorRule(content: string): {
5
+ frontmatter: string;
6
+ body: string;
7
+ };
8
+ /**
9
+ * Compile Engram Soul prose into a Cursor always-on rule (`.mdc`).
10
+ * Body is SOUL.md verbatim — no YAML or frontmatter leakage into Soul prose.
11
+ */
12
+ export declare function compileSoulToCursorRule(engram: LoadedEngram): CompiledCursorRule;
13
+ //# sourceMappingURL=compile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../src/cursor/compile.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAmBrD,kEAAkE;AAClE,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAe9F;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,YAAY,GAAG,kBAAkB,CAYhF"}
@@ -0,0 +1,47 @@
1
+ import { computeSoulHash } from './hash.js';
2
+ function escapeYamlDoubleQuoted(value) {
3
+ return value.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
4
+ }
5
+ const FRONTMATTER_DELIMITER = '---';
6
+ function buildFrontmatter(description) {
7
+ const safeDescription = escapeYamlDoubleQuoted(description);
8
+ return [
9
+ FRONTMATTER_DELIMITER,
10
+ 'alwaysApply: true',
11
+ `description: "${safeDescription}"`,
12
+ FRONTMATTER_DELIMITER,
13
+ '',
14
+ ].join('\n');
15
+ }
16
+ /** Split compiled `.mdc` into frontmatter block and Soul body. */
17
+ export function parseCompiledCursorRule(content) {
18
+ if (!content.startsWith(`${FRONTMATTER_DELIMITER}\n`)) {
19
+ throw new Error('Compiled Cursor rule is missing YAML frontmatter.');
20
+ }
21
+ const closeIndex = content.indexOf(`\n${FRONTMATTER_DELIMITER}\n`, FRONTMATTER_DELIMITER.length + 1);
22
+ if (closeIndex === -1) {
23
+ throw new Error('Compiled Cursor rule frontmatter is not closed.');
24
+ }
25
+ const frontmatterEnd = closeIndex + 1 + `${FRONTMATTER_DELIMITER}\n`.length;
26
+ return {
27
+ frontmatter: content.slice(0, frontmatterEnd),
28
+ body: content.slice(frontmatterEnd),
29
+ };
30
+ }
31
+ /**
32
+ * Compile Engram Soul prose into a Cursor always-on rule (`.mdc`).
33
+ * Body is SOUL.md verbatim — no YAML or frontmatter leakage into Soul prose.
34
+ */
35
+ export function compileSoulToCursorRule(engram) {
36
+ const soul = engram.soul.replace(/\r\n/g, '\n');
37
+ const soulHash = computeSoulHash(soul);
38
+ const frontmatter = buildFrontmatter(engram.engram.name);
39
+ const content = `${frontmatter}${soul}`;
40
+ return {
41
+ engramId: engram.engram.id,
42
+ name: engram.engram.name,
43
+ soulHash,
44
+ content,
45
+ };
46
+ }
47
+ //# sourceMappingURL=compile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compile.js","sourceRoot":"","sources":["../../src/cursor/compile.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAG5C,SAAS,sBAAsB,CAAC,KAAa;IAC3C,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,qBAAqB,GAAG,KAAK,CAAC;AAEpC,SAAS,gBAAgB,CAAC,WAAmB;IAC3C,MAAM,eAAe,GAAG,sBAAsB,CAAC,WAAW,CAAC,CAAC;IAC5D,OAAO;QACL,qBAAqB;QACrB,mBAAmB;QACnB,iBAAiB,eAAe,GAAG;QACnC,qBAAqB;QACrB,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,uBAAuB,CAAC,OAAe;IACrD,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,qBAAqB,IAAI,CAAC,EAAE,CAAC;QACtD,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,qBAAqB,IAAI,EAAE,qBAAqB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACrG,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,cAAc,GAAG,UAAU,GAAG,CAAC,GAAG,GAAG,qBAAqB,IAAI,CAAC,MAAM,CAAC;IAC5E,OAAO;QACL,WAAW,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC;QAC7C,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC;KACpC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,MAAoB;IAC1D,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,WAAW,GAAG,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACzD,MAAM,OAAO,GAAG,GAAG,WAAW,GAAG,IAAI,EAAE,CAAC;IAExC,OAAO;QACL,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE;QAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI;QACxB,QAAQ;QACR,OAAO;KACR,CAAC;AACJ,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { EidolaRuntimeConfig } from '../config.js';
2
+ export interface LaunchShrineResult {
3
+ launched: boolean;
4
+ alreadyRunning: boolean;
5
+ surface?: string;
6
+ pid?: number;
7
+ skipped?: boolean;
8
+ reason?: string;
9
+ mode?: 'http';
10
+ url?: string;
11
+ restarted?: boolean;
12
+ }
13
+ export interface LaunchShrineOptions {
14
+ requestedSurface?: string;
15
+ }
16
+ /**
17
+ * Spawn Shrine — HTTP server for browser-based display surfaces.
18
+ * Invoked via MCP `awaken` or `pnpm ensure:shrine`.
19
+ */
20
+ export declare function launchShrine(config: EidolaRuntimeConfig, onLog?: (message: string) => void, options?: LaunchShrineOptions): Promise<LaunchShrineResult>;
21
+ /** @deprecated Use launchShrine */
22
+ export declare const ensureShrineRunning: typeof launchShrine;
23
+ /** @deprecated Use LaunchShrineResult */
24
+ export type EnsureShrineResult = LaunchShrineResult;
25
+ //# sourceMappingURL=ensure-shrine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ensure-shrine.d.ts","sourceRoot":"","sources":["../../src/cursor/ensure-shrine.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAqBxD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,OAAO,CAAC;IAClB,cAAc,EAAE,OAAO,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AA2ED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,mBAAmB,EAC3B,KAAK,GAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAiB,EAC7C,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,kBAAkB,CAAC,CA4G7B;AAED,mCAAmC;AACnC,eAAO,MAAM,mBAAmB,qBAAe,CAAC;AAEhD,yCAAyC;AACzC,MAAM,MAAM,kBAAkB,GAAG,kBAAkB,CAAC"}
@@ -0,0 +1,168 @@
1
+ import { access } from 'node:fs/promises';
2
+ import { existsSync } from 'node:fs';
3
+ import { spawn } from 'node:child_process';
4
+ import { dirname, join, resolve } from 'node:path';
5
+ import { fileURLToPath } from 'node:url';
6
+ import { isShrineRunning, readShrineLock, removeShrineLock, stopShrine, writeShrineLock, } from './shrine-lock.js';
7
+ import { isHttpShrineSurface, normalizeShrineSurfaceInput, resolveShrineSurface, shrineHttpPort, shrineHttpUrl, shrineSurfaceEnv, decomposeLegacySurface, } from './shrine-surface.js';
8
+ import { readWorkspaceConfig, writeWorkspaceConfig } from './workspace-config.js';
9
+ async function pathExists(path) {
10
+ try {
11
+ await access(path);
12
+ return true;
13
+ }
14
+ catch {
15
+ return false;
16
+ }
17
+ }
18
+ function isPublishedInstall(packageRoot) {
19
+ return packageRoot.replace(/\\/g, '/').includes('/node_modules/');
20
+ }
21
+ function resolveMcpPackageRoot() {
22
+ return resolve(dirname(fileURLToPath(import.meta.url)), '..');
23
+ }
24
+ function shrineHttpEntryCandidates(appRoot) {
25
+ const packageRoot = resolveMcpPackageRoot();
26
+ const candidates = [join(packageRoot, 'shrine', 'server', 'index.js')];
27
+ if (!isPublishedInstall(packageRoot)) {
28
+ candidates.push(join(appRoot, 'packages', 'shrine', 'dist', 'server', 'index.js'));
29
+ }
30
+ return candidates;
31
+ }
32
+ function shrineHttpStartCommand(appRoot, envOverrides) {
33
+ const env = { ...process.env, ...envOverrides };
34
+ if (process.env.EIDOLA_WORKSPACE) {
35
+ env.EIDOLA_WORKSPACE = process.env.EIDOLA_WORKSPACE;
36
+ }
37
+ const packageRoot = resolveMcpPackageRoot();
38
+ const shrineEntry = shrineHttpEntryCandidates(appRoot).find((path) => existsSync(path));
39
+ if (shrineEntry) {
40
+ return {
41
+ command: process.execPath,
42
+ args: [shrineEntry],
43
+ cwd: dirname(shrineEntry),
44
+ env,
45
+ };
46
+ }
47
+ if (isPublishedInstall(packageRoot)) {
48
+ return {
49
+ command: process.execPath,
50
+ args: [join(packageRoot, 'cli.js'), 'shrine'],
51
+ cwd: packageRoot,
52
+ env,
53
+ };
54
+ }
55
+ return {
56
+ command: process.execPath,
57
+ args: [join(appRoot, 'packages', 'shrine', 'dist', 'server', 'index.js')],
58
+ cwd: join(appRoot, 'packages', 'shrine'),
59
+ env,
60
+ };
61
+ }
62
+ async function shrineHttpBuildReady(appRoot) {
63
+ return shrineHttpEntryCandidates(appRoot).some((path) => existsSync(path));
64
+ }
65
+ /**
66
+ * Spawn Shrine — HTTP server for browser-based display surfaces.
67
+ * Invoked via MCP `awaken` or `pnpm ensure:shrine`.
68
+ */
69
+ export async function launchShrine(config, onLog = defaultLog, options = {}) {
70
+ const workspaceRoot = config.workspaceRoot;
71
+ if (!workspaceRoot) {
72
+ return { launched: false, alreadyRunning: false, skipped: true, reason: 'no_workspace' };
73
+ }
74
+ let workspaceConfig = null;
75
+ try {
76
+ workspaceConfig = await readWorkspaceConfig(workspaceRoot);
77
+ }
78
+ catch (error) {
79
+ const message = error instanceof Error ? error.message : String(error);
80
+ onLog(`launch-shrine: workspace config error: ${message}`);
81
+ return { launched: false, alreadyRunning: false, skipped: true, reason: 'config_error' };
82
+ }
83
+ if (options.requestedSurface?.trim()) {
84
+ const normalizedSurface = normalizeShrineSurfaceInput(options.requestedSurface);
85
+ const decomposed = decomposeLegacySurface(normalizedSurface);
86
+ const mergedConfig = {
87
+ ...(workspaceConfig ?? {}),
88
+ shrine_surface: decomposed.legacyValue,
89
+ shrine_aspect_ratio: decomposed.aspectRatio,
90
+ shrine_surface_mode: decomposed.surfaceMode,
91
+ };
92
+ await writeWorkspaceConfig(workspaceRoot, mergedConfig);
93
+ workspaceConfig = mergedConfig;
94
+ }
95
+ if (process.env.EIDOLA_SKIP_SHRINE_LAUNCH === '1') {
96
+ return { launched: false, alreadyRunning: false, skipped: true, reason: 'disabled_env' };
97
+ }
98
+ const surface = resolveShrineSurface({
99
+ configSurface: workspaceConfig?.shrine_surface,
100
+ aspectRatio: workspaceConfig?.shrine_aspect_ratio,
101
+ surfaceMode: workspaceConfig?.shrine_surface_mode,
102
+ });
103
+ const httpMode = isHttpShrineSurface(surface);
104
+ const targetSurface = surface.preset === 'custom' ? `${surface.width}x${surface.height}` : surface.preset;
105
+ if (!httpMode) {
106
+ onLog(`launch-shrine: surface "${targetSurface}" requires Electron, which has been removed — use a browser-compatible surface`);
107
+ return { launched: false, alreadyRunning: false, skipped: true, reason: 'electron_removed' };
108
+ }
109
+ let restarted = false;
110
+ if (await isShrineRunning(workspaceRoot)) {
111
+ const lock = await readShrineLock(workspaceRoot);
112
+ if (lock?.surface === targetSurface) {
113
+ return {
114
+ launched: false,
115
+ alreadyRunning: true,
116
+ surface: surface.preset,
117
+ mode: 'http',
118
+ url: shrineHttpUrl(shrineHttpPort()),
119
+ };
120
+ }
121
+ await stopShrine(workspaceRoot);
122
+ restarted = true;
123
+ }
124
+ else {
125
+ const staleLock = await readShrineLock(workspaceRoot);
126
+ if (staleLock) {
127
+ await removeShrineLock(workspaceRoot);
128
+ }
129
+ }
130
+ if (!(await shrineHttpBuildReady(config.repoRoot))) {
131
+ onLog('launch-shrine: shrine HTTP server not built — run pnpm build in eidola-repo first');
132
+ return { launched: false, alreadyRunning: false, skipped: true, reason: 'not_built' };
133
+ }
134
+ const { command, args, cwd, env } = shrineHttpStartCommand(config.repoRoot, shrineSurfaceEnv(surface));
135
+ const child = spawn(command, args, {
136
+ cwd,
137
+ detached: true,
138
+ stdio: 'ignore',
139
+ env,
140
+ });
141
+ child.unref();
142
+ const port = shrineHttpPort();
143
+ const url = shrineHttpUrl(port);
144
+ const lock = {
145
+ pid: child.pid ?? 0,
146
+ surface: surface.preset,
147
+ started_at: new Date().toISOString(),
148
+ };
149
+ if (lock.pid > 0) {
150
+ await writeShrineLock(workspaceRoot, lock);
151
+ }
152
+ onLog(`launch-shrine: HTTP ${surface.preset} at ${url} (pid ${lock.pid || 'unknown'})`);
153
+ return {
154
+ launched: true,
155
+ alreadyRunning: false,
156
+ surface: surface.preset,
157
+ pid: lock.pid > 0 ? lock.pid : undefined,
158
+ mode: 'http',
159
+ url,
160
+ restarted: restarted || undefined,
161
+ };
162
+ }
163
+ /** @deprecated Use launchShrine */
164
+ export const ensureShrineRunning = launchShrine;
165
+ function defaultLog(message) {
166
+ console.error('[eidola]', message);
167
+ }
168
+ //# sourceMappingURL=ensure-shrine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ensure-shrine.js","sourceRoot":"","sources":["../../src/cursor/ensure-shrine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** SHA-256 hex digest of normalized Soul prose (LF line endings). */
2
+ export declare function computeSoulHash(soul: string): string;
3
+ //# sourceMappingURL=hash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../../src/cursor/hash.ts"],"names":[],"mappings":"AAEA,qEAAqE;AACrE,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGpD"}
package/cursor/hash.js ADDED
@@ -0,0 +1,7 @@
1
+ import { createHash } from 'node:crypto';
2
+ /** SHA-256 hex digest of normalized Soul prose (LF line endings). */
3
+ export function computeSoulHash(soul) {
4
+ const normalized = soul.replace(/\r\n/g, '\n');
5
+ return createHash('sha256').update(normalized, 'utf8').digest('hex');
6
+ }
7
+ //# sourceMappingURL=hash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.js","sourceRoot":"","sources":["../../src/cursor/hash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,qEAAqE;AACrE,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC/C,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACvE,CAAC"}
@@ -0,0 +1,17 @@
1
+ export declare const SHRINE_LOCK_FILENAME = "eidola-shrine.lock";
2
+ export interface ShrineLockFile {
3
+ pid: number;
4
+ surface: string;
5
+ started_at: string;
6
+ }
7
+ export declare function shrineLockPath(workspaceRoot: string): string;
8
+ export declare function isProcessAlive(pid: number): boolean;
9
+ export declare function readShrineLock(workspaceRoot: string): Promise<ShrineLockFile | null>;
10
+ export declare function writeShrineLock(workspaceRoot: string, lock: ShrineLockFile): Promise<void>;
11
+ export declare function removeShrineLock(workspaceRoot: string): Promise<void>;
12
+ export declare function isShrineRunning(workspaceRoot: string): Promise<boolean>;
13
+ export declare function stopShrine(workspaceRoot: string): Promise<{
14
+ stopped: boolean;
15
+ pid?: number;
16
+ }>;
17
+ //# sourceMappingURL=shrine-lock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shrine-lock.d.ts","sourceRoot":"","sources":["../../src/cursor/shrine-lock.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,oBAAoB,uBAAuB,CAAC;AAEzD,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAYnD;AAED,wBAAsB,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAmB1F;AAED,wBAAsB,eAAe,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAGhG;AAED,wBAAsB,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAS3E;AAED,wBAAsB,eAAe,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO7E;AAED,wBAAsB,UAAU,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAoBnG"}