@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
@@ -0,0 +1,4 @@
1
+ /** Shrine LCD background colors — keep in sync with vessels/camina-shrine/tools/generate-shrine-faces.mjs */
2
+ export declare const SHRINE_STATE_COLORS: Record<string, string>;
3
+ export declare function shrineColorForState(state: string): string;
4
+ //# sourceMappingURL=shrine-state-colors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shrine-state-colors.d.ts","sourceRoot":"","sources":["../../src/shared/shrine-state-colors.ts"],"names":[],"mappings":"AAAA,6GAA6G;AAC7G,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAWtD,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEzD"}
@@ -0,0 +1,17 @@
1
+ /** Shrine LCD background colors — keep in sync with vessels/camina-shrine/tools/generate-shrine-faces.mjs */
2
+ export const SHRINE_STATE_COLORS = {
3
+ idle: '#c9a84c',
4
+ thinking: '#b29e58',
5
+ waiting: '#7896a8',
6
+ working: '#da8a3a',
7
+ searching: '#449eb2',
8
+ writing: '#76a862',
9
+ responding: '#eed04e',
10
+ success: '#a8c850',
11
+ error: '#9e76c6',
12
+ attention: '#da302a',
13
+ };
14
+ export function shrineColorForState(state) {
15
+ return SHRINE_STATE_COLORS[state] ?? SHRINE_STATE_COLORS.idle;
16
+ }
17
+ //# sourceMappingURL=shrine-state-colors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shrine-state-colors.js","sourceRoot":"","sources":["../../src/shared/shrine-state-colors.ts"],"names":[],"mappings":"AAAA,6GAA6G;AAC7G,MAAM,CAAC,MAAM,mBAAmB,GAA2B;IACzD,IAAI,EAAE,SAAS;IACf,QAAQ,EAAE,SAAS;IACnB,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;IAClB,SAAS,EAAE,SAAS;IACpB,OAAO,EAAE,SAAS;IAClB,UAAU,EAAE,SAAS;IACrB,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,SAAS;IAChB,SAAS,EAAE,SAAS;CACrB,CAAC;AAEF,MAAM,UAAU,mBAAmB,CAAC,KAAa;IAC/C,OAAO,mBAAmB,CAAC,KAAK,CAAC,IAAI,mBAAmB,CAAC,IAAI,CAAC;AAChE,CAAC"}
@@ -0,0 +1,32 @@
1
+ export type ShrineSurfacePresetId = 'ultrawide-4-1' | 'square-1-1' | 'widescreen-16-9' | 'kraken-elite-v2';
2
+ export type ShrineLayoutTier = 'ultrawide' | 'square' | 'widescreen';
3
+ export interface ShrineSurface {
4
+ preset: ShrineSurfacePresetId | 'custom';
5
+ width: number;
6
+ height: number;
7
+ /** Clip vessel stage to a circle (NZXT Kraken LCD). */
8
+ circularMask?: boolean;
9
+ /** Three.js layout tier; defaults from aspect ratio when omitted. */
10
+ layoutTier?: ShrineLayoutTier;
11
+ }
12
+ export declare const SHRINE_SURFACE_PRESETS: Record<ShrineSurfacePresetId, {
13
+ width: number;
14
+ height: number;
15
+ circularMask?: boolean;
16
+ layoutTier?: ShrineLayoutTier;
17
+ }>;
18
+ export declare const DEFAULT_SHRINE_SURFACE_PRESET: ShrineSurfacePresetId;
19
+ /** Default HTTP port for CAM Web Integration (state socket stays on 9742). */
20
+ export declare const DEFAULT_SHRINE_HTTP_PORT = 9743;
21
+ export interface ResolveShrineSurfaceInput {
22
+ surfaceEnv?: string | undefined;
23
+ widthEnv?: string | undefined;
24
+ heightEnv?: string | undefined;
25
+ configSurface?: string | undefined;
26
+ }
27
+ export declare function resolveShrineSurface(input?: ResolveShrineSurfaceInput): ShrineSurface;
28
+ /** All surfaces now run as HTTP — Electron removed in Phase 4.1. Always returns true. */
29
+ export declare function isHttpShrineSurface(_surface: ShrineSurface): boolean;
30
+ export declare function shrineHttpPort(): number;
31
+ export declare function shrineHttpUrl(port?: number): string;
32
+ //# sourceMappingURL=shrine-surface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shrine-surface.d.ts","sourceRoot":"","sources":["../../src/shared/shrine-surface.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,qBAAqB,GAC7B,eAAe,GACf,YAAY,GACZ,iBAAiB,GACjB,iBAAiB,CAAC;AAEtB,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG,QAAQ,GAAG,YAAY,CAAC;AAErE,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,qBAAqB,GAAG,QAAQ,CAAC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,uDAAuD;IACvD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,qEAAqE;IACrE,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC/B;AAED,eAAO,MAAM,sBAAsB,EAAE,MAAM,CACzC,qBAAqB,EACrB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,gBAAgB,CAAA;CAAE,CAWzF,CAAC;AAEF,eAAO,MAAM,6BAA6B,EAAE,qBAAuC,CAAC;AAEpF,8EAA8E;AAC9E,eAAO,MAAM,wBAAwB,OAAO,CAAC;AAE7C,MAAM,WAAW,yBAAyB;IACxC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAiBD,wBAAgB,oBAAoB,CAAC,KAAK,GAAE,yBAA8B,GAAG,aAAa,CA6BzF;AAED,yFAAyF;AACzF,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAEpE;AAED,wBAAgB,cAAc,IAAI,MAAM,CAOvC;AAED,wBAAgB,aAAa,CAAC,IAAI,GAAE,MAAyB,GAAG,MAAM,CAErE"}
@@ -0,0 +1,67 @@
1
+ export const SHRINE_SURFACE_PRESETS = {
2
+ 'ultrawide-4-1': { width: 1920, height: 480, layoutTier: 'ultrawide' },
3
+ 'square-1-1': { width: 640, height: 640, layoutTier: 'square' },
4
+ 'widescreen-16-9': { width: 1920, height: 1080, layoutTier: 'widescreen' },
5
+ 'kraken-elite-v2': {
6
+ width: 640,
7
+ height: 640,
8
+ circularMask: true,
9
+ layoutTier: 'square',
10
+ },
11
+ };
12
+ export const DEFAULT_SHRINE_SURFACE_PRESET = 'ultrawide-4-1';
13
+ /** Default HTTP port for CAM Web Integration (state socket stays on 9742). */
14
+ export const DEFAULT_SHRINE_HTTP_PORT = 9743;
15
+ function parseCustomDimensions(value) {
16
+ const match = value.trim().match(/^(\d+)\s*[x×]\s*(\d+)$/i);
17
+ if (!match) {
18
+ return null;
19
+ }
20
+ const width = Number.parseInt(match[1] ?? '', 10);
21
+ const height = Number.parseInt(match[2] ?? '', 10);
22
+ if (!Number.isFinite(width) || !Number.isFinite(height) || width <= 0 || height <= 0) {
23
+ return null;
24
+ }
25
+ return { preset: 'custom', width, height };
26
+ }
27
+ export function resolveShrineSurface(input = {}) {
28
+ const widthEnv = input.widthEnv ?? process.env.EIDOLA_SHRINE_WIDTH;
29
+ const heightEnv = input.heightEnv ?? process.env.EIDOLA_SHRINE_HEIGHT;
30
+ if (widthEnv?.trim() && heightEnv?.trim()) {
31
+ const width = Number.parseInt(widthEnv.trim(), 10);
32
+ const height = Number.parseInt(heightEnv.trim(), 10);
33
+ if (Number.isFinite(width) && Number.isFinite(height) && width > 0 && height > 0) {
34
+ return { preset: 'custom', width, height };
35
+ }
36
+ }
37
+ const surfaceRaw = input.surfaceEnv?.trim() ||
38
+ input.configSurface?.trim() ||
39
+ process.env.EIDOLA_SHRINE_SURFACE?.trim() ||
40
+ DEFAULT_SHRINE_SURFACE_PRESET;
41
+ const custom = parseCustomDimensions(surfaceRaw);
42
+ if (custom) {
43
+ return custom;
44
+ }
45
+ const preset = SHRINE_SURFACE_PRESETS[surfaceRaw];
46
+ if (preset) {
47
+ return { preset: surfaceRaw, ...preset };
48
+ }
49
+ const fallback = SHRINE_SURFACE_PRESETS[DEFAULT_SHRINE_SURFACE_PRESET];
50
+ return { preset: DEFAULT_SHRINE_SURFACE_PRESET, ...fallback };
51
+ }
52
+ /** All surfaces now run as HTTP — Electron removed in Phase 4.1. Always returns true. */
53
+ export function isHttpShrineSurface(_surface) {
54
+ return true;
55
+ }
56
+ export function shrineHttpPort() {
57
+ const raw = process.env.EIDOLA_SHRINE_HTTP_PORT?.trim();
58
+ if (!raw) {
59
+ return DEFAULT_SHRINE_HTTP_PORT;
60
+ }
61
+ const port = Number.parseInt(raw, 10);
62
+ return Number.isFinite(port) && port > 0 ? port : DEFAULT_SHRINE_HTTP_PORT;
63
+ }
64
+ export function shrineHttpUrl(port = shrineHttpPort()) {
65
+ return `http://127.0.0.1:${port}/shrine`;
66
+ }
67
+ //# sourceMappingURL=shrine-surface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shrine-surface.js","sourceRoot":"","sources":["../../src/shared/shrine-surface.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=shrine-surface.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shrine-surface.test.d.ts","sourceRoot":"","sources":["../../src/shared/shrine-surface.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,35 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { resolveShrineSurface, isHttpShrineSurface, shrineHttpUrl } from './shrine-surface.js';
3
+ describe('shrine surface presets', () => {
4
+ it('defaults to ultrawide-4-1', () => {
5
+ expect(resolveShrineSurface({})).toEqual({
6
+ preset: 'ultrawide-4-1',
7
+ width: 1920,
8
+ height: 480,
9
+ layoutTier: 'ultrawide',
10
+ });
11
+ });
12
+ it('resolves square preset', () => {
13
+ expect(resolveShrineSurface({ configSurface: 'square-1-1' })).toEqual({
14
+ preset: 'square-1-1',
15
+ width: 640,
16
+ height: 640,
17
+ layoutTier: 'square',
18
+ });
19
+ });
20
+ it('resolves kraken-elite-v2 preset', () => {
21
+ expect(resolveShrineSurface({ configSurface: 'kraken-elite-v2' })).toEqual({
22
+ preset: 'kraken-elite-v2',
23
+ width: 640,
24
+ height: 640,
25
+ circularMask: true,
26
+ layoutTier: 'square',
27
+ });
28
+ });
29
+ it('identifies kraken as HTTP shrine surface', () => {
30
+ const surface = resolveShrineSurface({ configSurface: 'kraken-elite-v2' });
31
+ expect(isHttpShrineSurface(surface)).toBe(true);
32
+ expect(shrineHttpUrl(9743)).toBe('http://127.0.0.1:9743/shrine');
33
+ });
34
+ });
35
+ //# sourceMappingURL=shrine-surface.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shrine-surface.test.js","sourceRoot":"","sources":["../../src/shared/shrine-surface.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAE/F,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YACvC,MAAM,EAAE,eAAe;YACvB,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,GAAG;YACX,UAAU,EAAE,WAAW;SACxB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,MAAM,CAAC,oBAAoB,CAAC,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YACpE,MAAM,EAAE,YAAY;YACpB,KAAK,EAAE,GAAG;YACV,MAAM,EAAE,GAAG;YACX,UAAU,EAAE,QAAQ;SACrB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,CAAC,oBAAoB,CAAC,EAAE,aAAa,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YACzE,MAAM,EAAE,iBAAiB;YACzB,KAAK,EAAE,GAAG;YACV,MAAM,EAAE,GAAG;YACX,YAAY,EAAE,IAAI;YAClB,UAAU,EAAE,QAAQ;SACrB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,OAAO,GAAG,oBAAoB,CAAC,EAAE,aAAa,EAAE,iBAAiB,EAAE,CAAC,CAAC;QAC3E,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChD,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,30 @@
1
+ import type { StateBroadcast } from '../vendor/mcp.js';
2
+ export type BroadcastHandler = (broadcast: StateBroadcast) => void;
3
+ export interface StateSocketClientOptions {
4
+ host?: string;
5
+ port: number;
6
+ onBroadcast: BroadcastHandler;
7
+ onConnect?: () => void;
8
+ onDisconnect?: () => void;
9
+ reconnectMs?: number;
10
+ }
11
+ export declare class StateSocketClient {
12
+ private readonly host;
13
+ private readonly port;
14
+ private readonly onBroadcast;
15
+ private readonly onConnect?;
16
+ private readonly onDisconnect?;
17
+ private readonly reconnectMs;
18
+ private socket;
19
+ private pending;
20
+ private reconnectTimer;
21
+ private closed;
22
+ constructor(options: StateSocketClientOptions);
23
+ start(): void;
24
+ stop(): void;
25
+ private connect;
26
+ private scheduleReconnect;
27
+ private handleData;
28
+ }
29
+ export declare function parseBroadcastLine(line: string): StateBroadcast | null;
30
+ //# sourceMappingURL=state-socket-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-socket-client.d.ts","sourceRoot":"","sources":["../../src/shared/state-socket-client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,MAAM,MAAM,gBAAgB,GAAG,CAAC,SAAS,EAAE,cAAc,KAAK,IAAI,CAAC;AAEnE,MAAM,WAAW,wBAAwB;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,gBAAgB,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAmB;IAC/C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAa;IACxC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAa;IAC3C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IAErC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,OAAO,CAAM;IACrB,OAAO,CAAC,cAAc,CAA8C;IACpE,OAAO,CAAC,MAAM,CAAS;gBAEX,OAAO,EAAE,wBAAwB;IAS7C,KAAK,IAAI,IAAI;IAKb,IAAI,IAAI,IAAI;IAUZ,OAAO,CAAC,OAAO;IA2Bf,OAAO,CAAC,iBAAiB;IAWzB,OAAO,CAAC,UAAU;CAYnB;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CA6BtE"}
@@ -0,0 +1,103 @@
1
+ import { connect } from 'node:net';
2
+ export class StateSocketClient {
3
+ host;
4
+ port;
5
+ onBroadcast;
6
+ onConnect;
7
+ onDisconnect;
8
+ reconnectMs;
9
+ socket = null;
10
+ pending = '';
11
+ reconnectTimer = null;
12
+ closed = false;
13
+ constructor(options) {
14
+ this.host = options.host ?? '127.0.0.1';
15
+ this.port = options.port;
16
+ this.onBroadcast = options.onBroadcast;
17
+ this.onConnect = options.onConnect;
18
+ this.onDisconnect = options.onDisconnect;
19
+ this.reconnectMs = options.reconnectMs ?? 2000;
20
+ }
21
+ start() {
22
+ this.closed = false;
23
+ this.connect();
24
+ }
25
+ stop() {
26
+ this.closed = true;
27
+ if (this.reconnectTimer) {
28
+ clearTimeout(this.reconnectTimer);
29
+ this.reconnectTimer = null;
30
+ }
31
+ this.socket?.destroy();
32
+ this.socket = null;
33
+ }
34
+ connect() {
35
+ if (this.closed) {
36
+ return;
37
+ }
38
+ const socket = connect({ host: this.host, port: this.port });
39
+ this.socket = socket;
40
+ socket.on('connect', () => {
41
+ this.onConnect?.();
42
+ });
43
+ socket.on('data', (chunk) => {
44
+ this.handleData(chunk.toString('utf8'));
45
+ });
46
+ socket.on('close', () => {
47
+ this.socket = null;
48
+ this.onDisconnect?.();
49
+ this.scheduleReconnect();
50
+ });
51
+ socket.on('error', () => {
52
+ socket.destroy();
53
+ });
54
+ }
55
+ scheduleReconnect() {
56
+ if (this.closed || this.reconnectTimer) {
57
+ return;
58
+ }
59
+ this.reconnectTimer = setTimeout(() => {
60
+ this.reconnectTimer = null;
61
+ this.connect();
62
+ }, this.reconnectMs);
63
+ }
64
+ handleData(chunk) {
65
+ this.pending += chunk;
66
+ const lines = this.pending.split('\n');
67
+ this.pending = lines.pop() ?? '';
68
+ for (const line of lines) {
69
+ const broadcast = parseBroadcastLine(line);
70
+ if (broadcast) {
71
+ this.onBroadcast(broadcast);
72
+ }
73
+ }
74
+ }
75
+ }
76
+ export function parseBroadcastLine(line) {
77
+ const trimmed = line.trim();
78
+ if (!trimmed) {
79
+ return null;
80
+ }
81
+ try {
82
+ const parsed = JSON.parse(trimmed);
83
+ if (typeof parsed.protocol_version !== 'string' ||
84
+ typeof parsed.ts !== 'number' ||
85
+ typeof parsed.state !== 'string' ||
86
+ typeof parsed.engram_id !== 'string' ||
87
+ typeof parsed.expression !== 'string') {
88
+ return null;
89
+ }
90
+ return {
91
+ protocol_version: parsed.protocol_version,
92
+ ts: parsed.ts,
93
+ state: parsed.state,
94
+ engram_id: parsed.engram_id,
95
+ expression: parsed.expression,
96
+ ...(typeof parsed.tool === 'string' ? { tool: parsed.tool } : {}),
97
+ };
98
+ }
99
+ catch {
100
+ return null;
101
+ }
102
+ }
103
+ //# sourceMappingURL=state-socket-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-socket-client.js","sourceRoot":"","sources":["../../src/shared/state-socket-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=state-socket-client.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-socket-client.test.d.ts","sourceRoot":"","sources":["../../src/shared/state-socket-client.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,20 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { parseBroadcastLine } from './state-socket-client.js';
3
+ describe('parseBroadcastLine', () => {
4
+ it('parses valid broadcast lines', () => {
5
+ const line = '{"protocol_version":"1.0","ts":1000,"state":"thinking","engram_id":"camina-drummer","expression":"thinking.json"}';
6
+ expect(parseBroadcastLine(line)).toEqual({
7
+ protocol_version: '1.0',
8
+ ts: 1000,
9
+ state: 'thinking',
10
+ engram_id: 'camina-drummer',
11
+ expression: 'thinking.json',
12
+ });
13
+ });
14
+ it('returns null for malformed lines', () => {
15
+ expect(parseBroadcastLine('')).toBeNull();
16
+ expect(parseBroadcastLine('not-json')).toBeNull();
17
+ expect(parseBroadcastLine('{"state":"thinking"}')).toBeNull();
18
+ });
19
+ });
20
+ //# sourceMappingURL=state-socket-client.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-socket-client.test.js","sourceRoot":"","sources":["../../src/shared/state-socket-client.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,IAAI,GACR,mHAAmH,CAAC;QACtH,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;YACvC,gBAAgB,EAAE,KAAK;YACvB,EAAE,EAAE,IAAI;YACR,KAAK,EAAE,UAAU;YACjB,SAAS,EAAE,gBAAgB;YAC3B,UAAU,EAAE,eAAe;SAC5B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC1C,MAAM,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QAClD,MAAM,CAAC,kBAAkB,CAAC,sBAAsB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAChE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,43 @@
1
+ import type { VesselConfig } from '../vendor/mcp.js';
2
+ import type { StateBroadcast } from '../vendor/mcp.js';
3
+ import type { ShrineSurface } from './shrine-surface.js';
4
+ export declare const SHRINE_CHANNELS: {
5
+ readonly state: "shrine:state";
6
+ readonly vesselConfig: "shrine:vessel-config";
7
+ readonly surface: "shrine:surface";
8
+ readonly ready: "shrine:ready";
9
+ readonly log: "shrine:log";
10
+ };
11
+ export type ShrineRendererType = 'lottie' | 'webm' | 'component';
12
+ export interface ShrineVesselConfig {
13
+ /** Clip format (lottie/webm) or component (Three.js pack) */
14
+ rendererType: ShrineRendererType;
15
+ pack: string;
16
+ idleClip: string;
17
+ crossfadeMs: number;
18
+ idleLoops: boolean;
19
+ approvalIdleMs: number;
20
+ successHoldMs: number;
21
+ }
22
+ export interface ShrineStatePayload {
23
+ broadcast: StateBroadcast & {
24
+ tool?: string;
25
+ };
26
+ clipUrl: string;
27
+ loop: boolean;
28
+ returnToIdle: boolean;
29
+ source: 'socket' | 'fallback' | 'approval-idle';
30
+ }
31
+ export interface ShrineSurfacePayload {
32
+ surface: ShrineSurface;
33
+ }
34
+ export declare function vesselConfigFromYaml(vessel: VesselConfig, pack: string): ShrineVesselConfig;
35
+ /** Busy states loop during hook silence; one-shot states play once then return to idle. */
36
+ export declare function shouldLoopExpression(state: string, idleLoops: boolean): boolean;
37
+ export declare function shouldReturnToIdle(state: string): boolean;
38
+ export declare function buildClipUrl(pack: string, clip: string): string;
39
+ /** HTTP shrine serves vessel assets under `/vessels/`. */
40
+ export declare function buildHttpClipUrl(pack: string, clip: string): string;
41
+ /** Rewrite an `eidola://` clip URL for browser HTTP mode. */
42
+ export declare function toHttpClipUrl(clipUrl: string): string;
43
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,eAAO,MAAM,eAAe;;;;;;CAMlB,CAAC;AAEX,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;AAEjE,MAAM,WAAW,kBAAkB;IACjC,6DAA6D;IAC7D,YAAY,EAAE,kBAAkB,CAAC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,cAAc,GAAG;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9C,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,OAAO,CAAC;IACtB,MAAM,EAAE,QAAQ,GAAG,UAAU,GAAG,eAAe,CAAC;CACjD;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,aAAa,CAAC;CACxB;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,kBAAkB,CAkB3F;AAED,2FAA2F;AAC3F,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,OAAO,CAU/E;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED,0DAA0D;AAC1D,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnE;AAED,6DAA6D;AAC7D,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAYrD"}
@@ -0,0 +1,58 @@
1
+ export const SHRINE_CHANNELS = {
2
+ state: 'shrine:state',
3
+ vesselConfig: 'shrine:vessel-config',
4
+ surface: 'shrine:surface',
5
+ ready: 'shrine:ready',
6
+ log: 'shrine:log',
7
+ };
8
+ export function vesselConfigFromYaml(vessel, pack) {
9
+ const rendererType = vessel.type === 'component'
10
+ ? 'component'
11
+ : vessel.type === 'webm' || vessel.type === 'mp4'
12
+ ? 'webm'
13
+ : 'lottie';
14
+ return {
15
+ rendererType,
16
+ pack,
17
+ idleClip: (vessel.type === 'component' ? vessel.fallback : vessel)?.expressions.idle ?? 'idle.json',
18
+ crossfadeMs: vessel.transitions.duration_ms,
19
+ idleLoops: vessel.playback.idle_loops,
20
+ approvalIdleMs: vessel.playback.approval_idle_ms ?? 3000,
21
+ successHoldMs: vessel.playback.success_hold_ms ?? 3000,
22
+ };
23
+ }
24
+ /** Busy states loop during hook silence; one-shot states play once then return to idle. */
25
+ export function shouldLoopExpression(state, idleLoops) {
26
+ if (state === 'idle') {
27
+ return idleLoops;
28
+ }
29
+ if (state === 'responding' || state === 'error' || state === 'attention' || state === 'success') {
30
+ return false;
31
+ }
32
+ return true;
33
+ }
34
+ export function shouldReturnToIdle(state) {
35
+ return state === 'responding' || state === 'error' || state === 'attention';
36
+ }
37
+ export function buildClipUrl(pack, clip) {
38
+ return `eidola://vessel/${encodeURIComponent(pack)}/${encodeURIComponent(clip)}`;
39
+ }
40
+ /** HTTP shrine serves vessel assets under `/vessels/`. */
41
+ export function buildHttpClipUrl(pack, clip) {
42
+ return `/vessels/${encodeURIComponent(pack)}/${clip.split('/').map(encodeURIComponent).join('/')}`;
43
+ }
44
+ /** Rewrite an `eidola://` clip URL for browser HTTP mode. */
45
+ export function toHttpClipUrl(clipUrl) {
46
+ if (!clipUrl.startsWith('eidola://vessel/')) {
47
+ return clipUrl;
48
+ }
49
+ const path = clipUrl.slice('eidola://vessel/'.length);
50
+ const segments = path.split('/').map((segment) => decodeURIComponent(segment));
51
+ if (segments.length < 2) {
52
+ return clipUrl;
53
+ }
54
+ const pack = segments[0] ?? '';
55
+ const clip = segments.slice(1).join('/');
56
+ return buildHttpClipUrl(pack, clip);
57
+ }
58
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.test.d.ts","sourceRoot":"","sources":["../../src/shared/types.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,26 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { shouldLoopExpression, shouldReturnToIdle } from './types.js';
3
+ describe('playback flags', () => {
4
+ it('loops idle when configured', () => {
5
+ expect(shouldLoopExpression('idle', true)).toBe(true);
6
+ expect(shouldLoopExpression('idle', false)).toBe(false);
7
+ });
8
+ it('does not loop one-shot states', () => {
9
+ expect(shouldLoopExpression('responding', true)).toBe(false);
10
+ expect(shouldLoopExpression('error', true)).toBe(false);
11
+ expect(shouldLoopExpression('success', true)).toBe(false);
12
+ });
13
+ it('loops sustained busy states during hook silence', () => {
14
+ expect(shouldLoopExpression('thinking', true)).toBe(true);
15
+ expect(shouldLoopExpression('working', true)).toBe(true);
16
+ expect(shouldLoopExpression('searching', true)).toBe(true);
17
+ expect(shouldLoopExpression('writing', true)).toBe(true);
18
+ });
19
+ it('marks return-to-idle states (success uses overlay hold timer)', () => {
20
+ expect(shouldReturnToIdle('responding')).toBe(true);
21
+ expect(shouldReturnToIdle('error')).toBe(true);
22
+ expect(shouldReturnToIdle('success')).toBe(false);
23
+ expect(shouldReturnToIdle('thinking')).toBe(false);
24
+ });
25
+ });
26
+ //# sourceMappingURL=types.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.test.js","sourceRoot":"","sources":["../../src/shared/types.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEtE,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,oBAAoB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtD,MAAM,CAAC,oBAAoB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,CAAC,oBAAoB,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7D,MAAM,CAAC,oBAAoB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxD,MAAM,CAAC,oBAAoB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,CAAC,oBAAoB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1D,MAAM,CAAC,oBAAoB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzD,MAAM,CAAC,oBAAoB,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3D,MAAM,CAAC,oBAAoB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpD,MAAM,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/C,MAAM,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClD,MAAM,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,37 @@
1
+ import { type LoadedEngram } from '../vendor/mcp.js';
2
+ import { type ShrineStatePayload, type ShrineVesselConfig } from './types.js';
3
+ export interface VesselResolverOptions {
4
+ engramsDir: string;
5
+ vesselsDir: string;
6
+ }
7
+ export declare class VesselResolver {
8
+ private readonly engramsDir;
9
+ private readonly vesselsDir;
10
+ private activeEngramId;
11
+ private loaded;
12
+ private shrineConfig;
13
+ private lastValidConfig;
14
+ constructor(options: VesselResolverOptions);
15
+ getConfig(): ShrineVesselConfig | null;
16
+ syncEngram(engramId: string): Promise<ShrineVesselConfig | null>;
17
+ buildStatePayload(broadcast: {
18
+ state: string;
19
+ engram_id: string;
20
+ expression: string;
21
+ ts: number;
22
+ protocol_version: string;
23
+ visual_state?: string;
24
+ tool?: string;
25
+ }, source?: ShrineStatePayload['source']): Promise<ShrineStatePayload | null>;
26
+ private defaultConfig;
27
+ buildIdlePayload(broadcast: {
28
+ protocol_version: string;
29
+ ts: number;
30
+ engram_id: string;
31
+ }): Promise<ShrineStatePayload | null>;
32
+ private resolveClipForConfig;
33
+ private resolveClip;
34
+ }
35
+ export declare function createDefaultResolver(): VesselResolver;
36
+ export type { LoadedEngram };
37
+ //# sourceMappingURL=vessel-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vessel-resolver.d.ts","sourceRoot":"","sources":["../../src/shared/vessel-resolver.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,YAAY,EAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAKL,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACxB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,cAAc,CAAM;IAC5B,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,YAAY,CAAmC;IACvD,OAAO,CAAC,eAAe,CAAmC;gBAE9C,OAAO,EAAE,qBAAqB;IAK1C,SAAS,IAAI,kBAAkB,GAAG,IAAI;IAIhC,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAuBhE,iBAAiB,CACrB,SAAS,EAAE;QACT,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,EAAE,EAAE,MAAM,CAAC;QACX,gBAAgB,EAAE,MAAM,CAAC;QACzB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,EACD,MAAM,GAAE,kBAAkB,CAAC,QAAQ,CAAY,GAC9C,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IA6BrC,OAAO,CAAC,aAAa;IAgBf,gBAAgB,CACpB,SAAS,EAAE;QACT,gBAAgB,EAAE,MAAM,CAAC;QACzB,EAAE,EAAE,MAAM,CAAC;QACX,SAAS,EAAE,MAAM,CAAC;KACnB,GACA,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;YAuBvB,oBAAoB;YAWpB,WAAW;CAc1B;AAWD,wBAAgB,qBAAqB,IAAI,cAAc,CAMtD;AAED,YAAY,EAAE,YAAY,EAAE,CAAC"}