@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,135 @@
1
+ import { join } from 'node:path';
2
+ import { access } from 'node:fs/promises';
3
+ import { loadEngramFromDirectory, resolveEidolaRuntimeConfig, } from '../../index.js';
4
+ import { buildClipUrl, shouldLoopExpression, shouldReturnToIdle, vesselConfigFromYaml, } from './types.js';
5
+ export class VesselResolver {
6
+ engramsDir;
7
+ vesselsDir;
8
+ activeEngramId = '';
9
+ loaded = null;
10
+ shrineConfig = null;
11
+ lastValidConfig = null;
12
+ constructor(options) {
13
+ this.engramsDir = options.engramsDir;
14
+ this.vesselsDir = options.vesselsDir;
15
+ }
16
+ getConfig() {
17
+ return this.shrineConfig ?? this.lastValidConfig;
18
+ }
19
+ async syncEngram(engramId) {
20
+ if (!engramId) {
21
+ return this.shrineConfig ?? this.lastValidConfig;
22
+ }
23
+ if (engramId === this.activeEngramId && this.shrineConfig) {
24
+ return this.shrineConfig;
25
+ }
26
+ try {
27
+ const directory = join(this.engramsDir, engramId);
28
+ const loaded = await loadEngramFromDirectory(directory);
29
+ this.loaded = loaded;
30
+ this.activeEngramId = engramId;
31
+ this.shrineConfig = vesselConfigFromYaml(loaded.vessel, loaded.vessel.pack);
32
+ this.lastValidConfig = this.shrineConfig;
33
+ return this.shrineConfig;
34
+ }
35
+ catch (error) {
36
+ console.error('[eidola-shrine] invalid engram; keeping last valid vessel', error);
37
+ return this.lastValidConfig;
38
+ }
39
+ }
40
+ async buildStatePayload(broadcast, source = 'socket') {
41
+ const config = (await this.syncEngram(broadcast.engram_id)) ?? this.defaultConfig();
42
+ if (!config) {
43
+ return null;
44
+ }
45
+ const clip = await this.resolveClipForConfig(config, broadcast.expression);
46
+ const loop = shouldLoopExpression(broadcast.state, config.idleLoops);
47
+ const returnToIdle = shouldReturnToIdle(broadcast.state);
48
+ return {
49
+ broadcast: {
50
+ protocol_version: broadcast.protocol_version,
51
+ ts: broadcast.ts,
52
+ state: broadcast.state,
53
+ engram_id: broadcast.engram_id,
54
+ expression: broadcast.expression,
55
+ ...(broadcast.visual_state !== undefined
56
+ ? { visual_state: broadcast.visual_state }
57
+ : {}),
58
+ ...(broadcast.tool !== undefined ? { tool: broadcast.tool } : {}),
59
+ },
60
+ clipUrl: buildClipUrl(config.pack, clip),
61
+ loop,
62
+ returnToIdle,
63
+ source,
64
+ };
65
+ }
66
+ defaultConfig() {
67
+ if (this.lastValidConfig) {
68
+ return this.lastValidConfig;
69
+ }
70
+ return {
71
+ rendererType: 'lottie',
72
+ pack: 'camina-v1',
73
+ idleClip: 'idle.json',
74
+ crossfadeMs: 300,
75
+ idleLoops: true,
76
+ approvalIdleMs: 3000,
77
+ successHoldMs: 3000,
78
+ };
79
+ }
80
+ async buildIdlePayload(broadcast) {
81
+ const config = (await this.syncEngram(broadcast.engram_id)) ?? this.defaultConfig();
82
+ if (!config) {
83
+ return null;
84
+ }
85
+ const clip = await this.resolveClipForConfig(config, config.idleClip);
86
+ return {
87
+ broadcast: {
88
+ protocol_version: broadcast.protocol_version,
89
+ ts: broadcast.ts,
90
+ state: 'idle',
91
+ engram_id: broadcast.engram_id,
92
+ expression: clip,
93
+ },
94
+ clipUrl: buildClipUrl(config.pack, clip),
95
+ loop: config.idleLoops,
96
+ returnToIdle: false,
97
+ source: 'fallback',
98
+ };
99
+ }
100
+ async resolveClipForConfig(config, clip) {
101
+ if (config.rendererType === 'component') {
102
+ return clip;
103
+ }
104
+ return this.resolveClip(config.pack, clip, config.idleClip);
105
+ }
106
+ async resolveClip(pack, clip, idleClip) {
107
+ const primary = join(this.vesselsDir, pack, clip);
108
+ if (await fileExists(primary)) {
109
+ return clip;
110
+ }
111
+ console.error(`[eidola-shrine] missing clip "${clip}"; falling back to idle`);
112
+ const fallback = join(this.vesselsDir, pack, idleClip);
113
+ if (await fileExists(fallback)) {
114
+ return idleClip;
115
+ }
116
+ return idleClip;
117
+ }
118
+ }
119
+ async function fileExists(path) {
120
+ try {
121
+ await access(path);
122
+ return true;
123
+ }
124
+ catch {
125
+ return false;
126
+ }
127
+ }
128
+ export function createDefaultResolver() {
129
+ const runtime = resolveEidolaRuntimeConfig();
130
+ return new VesselResolver({
131
+ engramsDir: runtime.engramsDir,
132
+ vesselsDir: runtime.vesselsDir,
133
+ });
134
+ }
135
+ //# sourceMappingURL=vessel-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vessel-resolver.js","sourceRoot":"","sources":["../../src/shared/vessel-resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** Published eidola package resolves MCP from dist/index.js; dev uses workspace eidola. */
2
+ export * from '@eidola.app/cli';
3
+ //# sourceMappingURL=mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/vendor/mcp.ts"],"names":[],"mappings":"AAAA,2FAA2F;AAC3F,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Published eidola package resolves MCP from dist/index.js; dev uses workspace eidola. */
2
+ export * from '@eidola.app/cli';
3
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/vendor/mcp.ts"],"names":[],"mappings":"AAAA,2FAA2F;AAC3F,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { VesselConfig } from '../engram/types.js';
2
+ export declare function resolveExpressionClip(state: string, vessel: VesselConfig | null): string;
3
+ //# sourceMappingURL=expression.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expression.d.ts","sourceRoot":"","sources":["../../src/socket/expression.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAYvD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,GAAG,MAAM,CAsBxF"}
@@ -0,0 +1,28 @@
1
+ import { isWorkingClusterState } from '../vendor/tool-state.js';
2
+ const IDLE_CLIP = 'idle.json';
3
+ function lookupExpression(state, vessel) {
4
+ if (vessel.type === 'component' && vessel.fallback) {
5
+ return vessel.fallback.expressions[state];
6
+ }
7
+ return vessel.expressions[state];
8
+ }
9
+ export function resolveExpressionClip(state, vessel) {
10
+ if (!vessel) {
11
+ return IDLE_CLIP;
12
+ }
13
+ const direct = lookupExpression(state, vessel);
14
+ if (direct) {
15
+ return direct;
16
+ }
17
+ if (isWorkingClusterState(state) && state !== 'thinking') {
18
+ const workingClip = lookupExpression('working', vessel);
19
+ if (workingClip) {
20
+ return workingClip;
21
+ }
22
+ }
23
+ if (vessel.type === 'component' && vessel.fallback) {
24
+ return vessel.fallback.expressions.idle ?? IDLE_CLIP;
25
+ }
26
+ return vessel.expressions.idle ?? IDLE_CLIP;
27
+ }
28
+ //# sourceMappingURL=expression.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expression.js","sourceRoot":"","sources":["../../src/socket/expression.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,MAAM,SAAS,GAAG,WAAW,CAAC;AAE9B,SAAS,gBAAgB,CAAC,KAAa,EAAE,MAAoB;IAC3D,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACnD,OAAO,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAa,EAAE,MAA2B;IAC9E,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC/C,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,qBAAqB,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,UAAU,EAAE,CAAC;QACzD,MAAM,WAAW,GAAG,gBAAgB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACxD,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,WAAW,CAAC;QACrB,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACnD,OAAO,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,IAAI,SAAS,CAAC;IACvD,CAAC;IAED,OAAO,MAAM,CAAC,WAAW,CAAC,IAAI,IAAI,SAAS,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { type StateBroadcast, type StateInboundEvent, type Surface, VESSEL_STATES } from './types.js';
2
+ export interface NormalizedInbound {
3
+ event: StateInboundEvent;
4
+ protocolMismatch: boolean;
5
+ unknownState: boolean;
6
+ normalizedState: string;
7
+ }
8
+ export declare function parseInboundLine(line: string): StateInboundEvent | null;
9
+ export declare function normalizeInbound(event: StateInboundEvent): NormalizedInbound;
10
+ export declare function isKnownVesselState(state: string): state is (typeof VESSEL_STATES)[number];
11
+ export declare function createBroadcast(state: string, engramId: string, expression: string, ts?: number, tool?: string, visualState?: string): StateBroadcast;
12
+ export declare function serializeBroadcast(broadcast: StateBroadcast): string;
13
+ export declare function createInboundEvent(state: string, surface: Surface, ts?: number): StateInboundEvent;
14
+ export declare function serializeInbound(event: StateInboundEvent): string;
15
+ export declare function isValidSurface(value: string): value is Surface;
16
+ //# sourceMappingURL=protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/socket/protocol.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,OAAO,EACZ,aAAa,EACd,MAAM,YAAY,CAAC;AAapB,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,iBAAiB,CAAC;IACzB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,YAAY,EAAE,OAAO,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAmBvE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,iBAAiB,GAAG,iBAAiB,CAe5E;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAEzF;AAED,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,EAAE,GAAE,MAAmB,EACvB,IAAI,CAAC,EAAE,MAAM,EACb,WAAW,CAAC,EAAE,MAAM,GACnB,cAAc,CAUhB;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,cAAc,GAAG,MAAM,CAEpE;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,OAAO,EAChB,EAAE,GAAE,MAAmB,GACtB,iBAAiB,CAOnB;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CAEjE;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,OAAO,CAE9D"}
@@ -0,0 +1,75 @@
1
+ import { normalizeVesselState, refineGenericWorkingState } from '../vendor/tool-state.js';
2
+ import { z } from 'zod';
3
+ import { STATE_PROTOCOL_VERSION, SURFACES, VESSEL_STATES, } from './types.js';
4
+ const surfaceSchema = z.enum(SURFACES);
5
+ const inboundSchema = z.object({
6
+ protocol_version: z.string(),
7
+ ts: z.number(),
8
+ surface: surfaceSchema,
9
+ state: z.string(),
10
+ tool: z.string().optional(),
11
+ metadata: z.record(z.string(), z.unknown()).optional(),
12
+ });
13
+ export function parseInboundLine(line) {
14
+ const trimmed = line.trim();
15
+ if (!trimmed) {
16
+ return null;
17
+ }
18
+ let parsed;
19
+ try {
20
+ parsed = JSON.parse(trimmed);
21
+ }
22
+ catch {
23
+ return null;
24
+ }
25
+ const result = inboundSchema.safeParse(parsed);
26
+ if (!result.success) {
27
+ return null;
28
+ }
29
+ return result.data;
30
+ }
31
+ export function normalizeInbound(event) {
32
+ const protocolMismatch = event.protocol_version !== STATE_PROTOCOL_VERSION;
33
+ const refinedState = normalizeVesselState(refineGenericWorkingState(event.state, event.tool));
34
+ const knownState = isKnownVesselState(refinedState);
35
+ const unknownState = !knownState;
36
+ const normalizedState = protocolMismatch || unknownState ? 'idle' : refinedState;
37
+ return {
38
+ event,
39
+ protocolMismatch,
40
+ unknownState,
41
+ normalizedState,
42
+ };
43
+ }
44
+ export function isKnownVesselState(state) {
45
+ return VESSEL_STATES.includes(state);
46
+ }
47
+ export function createBroadcast(state, engramId, expression, ts = Date.now(), tool, visualState) {
48
+ return {
49
+ protocol_version: STATE_PROTOCOL_VERSION,
50
+ ts,
51
+ state,
52
+ engram_id: engramId,
53
+ expression,
54
+ ...(visualState !== undefined && visualState !== state ? { visual_state: visualState } : {}),
55
+ ...(tool !== undefined ? { tool } : {}),
56
+ };
57
+ }
58
+ export function serializeBroadcast(broadcast) {
59
+ return `${JSON.stringify(broadcast)}\n`;
60
+ }
61
+ export function createInboundEvent(state, surface, ts = Date.now()) {
62
+ return {
63
+ protocol_version: STATE_PROTOCOL_VERSION,
64
+ ts,
65
+ surface,
66
+ state,
67
+ };
68
+ }
69
+ export function serializeInbound(event) {
70
+ return `${JSON.stringify(event)}\n`;
71
+ }
72
+ export function isValidSurface(value) {
73
+ return SURFACES.includes(value);
74
+ }
75
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/socket/protocol.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { SessionState } from '../session/state.js';
2
+ import { type StateBroadcast, type StateSocketConfig, type Surface } from './types.js';
3
+ export interface StateSocketListenResult {
4
+ host: string;
5
+ port: number;
6
+ /** False when port already owned (e.g. another eidola-mcp instance). MCP tools still run. */
7
+ listening: boolean;
8
+ }
9
+ export interface StateSocketServer {
10
+ start(): Promise<StateSocketListenResult>;
11
+ close(): Promise<void>;
12
+ isListening(): boolean;
13
+ broadcastState(input: {
14
+ state: string;
15
+ surface?: Surface;
16
+ tool?: string;
17
+ metadata?: Record<string, unknown>;
18
+ }): StateBroadcast;
19
+ getBuffer(): readonly StateBroadcast[];
20
+ }
21
+ export declare function createStateSocketServer(session: SessionState, config?: StateSocketConfig): StateSocketServer;
22
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/socket/server.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAUxD,OAAO,EAIL,KAAK,cAAc,EAEnB,KAAK,iBAAiB,EACtB,KAAK,OAAO,EACb,MAAM,YAAY,CAAC;AAGpB,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,6FAA6F;IAC7F,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,IAAI,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAC1C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,WAAW,IAAI,OAAO,CAAC;IACvB,cAAc,CAAC,KAAK,EAAE;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACpC,GAAG,cAAc,CAAC;IACnB,SAAS,IAAI,SAAS,cAAc,EAAE,CAAC;CACxC;AAED,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,YAAY,EACrB,MAAM,GAAE,iBAAsB,GAC7B,iBAAiB,CAkOnB"}
@@ -0,0 +1,184 @@
1
+ import { connect, createServer } from 'node:net';
2
+ import { resolveVisualState } from '../vendor/tool-state.js';
3
+ import { resolveExpressionClip } from './expression.js';
4
+ import { createBroadcast, createInboundEvent, normalizeInbound, parseInboundLine, serializeBroadcast, serializeInbound, } from './protocol.js';
5
+ import { DEFAULT_STATE_BUFFER_SIZE, DEFAULT_STATE_SOCKET_PORT, STATE_SOCKET_HOST, } from './types.js';
6
+ import { VisualTurnTracker } from './visual-turn.js';
7
+ export function createStateSocketServer(session, config = {}) {
8
+ const host = config.host ?? STATE_SOCKET_HOST;
9
+ const requestedPort = config.port ?? DEFAULT_STATE_SOCKET_PORT;
10
+ const bufferSize = config.bufferSize ?? DEFAULT_STATE_BUFFER_SIZE;
11
+ const warn = config.onWarn ?? defaultWarn;
12
+ const onReassertVessel = config.onReassertVessel;
13
+ let server = null;
14
+ let listening = false;
15
+ const clients = new Set();
16
+ const buffer = [];
17
+ const pendingLines = new WeakMap();
18
+ const visualTurn = new VisualTurnTracker();
19
+ const pushBuffer = (broadcast) => {
20
+ buffer.push(broadcast);
21
+ while (buffer.length > bufferSize) {
22
+ buffer.shift();
23
+ }
24
+ };
25
+ const writeBroadcast = (socket, broadcast) => {
26
+ if (socket.destroyed || !socket.writable) {
27
+ return;
28
+ }
29
+ socket.write(serializeBroadcast(broadcast));
30
+ };
31
+ const emitBroadcast = (broadcast) => {
32
+ pushBuffer(broadcast);
33
+ for (const client of clients) {
34
+ writeBroadcast(client, broadcast);
35
+ }
36
+ };
37
+ const buildBroadcast = (state, ts, tool, firstToolStarted = false) => {
38
+ const active = session.getActive();
39
+ const engramId = active?.engram.id ?? '';
40
+ const visualState = resolveVisualState({ state, firstToolStarted });
41
+ const expression = resolveExpressionClip(visualState, active?.vessel ?? null);
42
+ return createBroadcast(state, engramId, expression, ts ?? Date.now(), tool, visualState);
43
+ };
44
+ const processInbound = (event) => {
45
+ const normalized = normalizeInbound(event);
46
+ if (normalized.protocolMismatch) {
47
+ warn(`state socket protocol_version mismatch: expected ${event.protocol_version}; falling back to idle`);
48
+ }
49
+ if (normalized.unknownState) {
50
+ warn(`state socket unknown state: ${event.state}; falling back to idle`);
51
+ }
52
+ if (normalized.normalizedState === 'responding' || normalized.normalizedState === 'success') {
53
+ session.recordAssistantTurn();
54
+ }
55
+ const firstToolStarted = visualTurn.update(normalized.normalizedState, event.metadata);
56
+ return buildBroadcast(normalized.normalizedState, event.ts, event.tool, firstToolStarted);
57
+ };
58
+ const shouldReassertVessel = (event) => {
59
+ return event.metadata?.reassert_vessel === true && session.getActive() !== null;
60
+ };
61
+ const handleClientData = (socket, chunk) => {
62
+ const existing = pendingLines.get(socket) ?? '';
63
+ const combined = existing + chunk.toString('utf8');
64
+ const lines = combined.split('\n');
65
+ const pending = lines.pop() ?? '';
66
+ pendingLines.set(socket, pending);
67
+ for (const line of lines) {
68
+ const event = parseInboundLine(line);
69
+ if (!event) {
70
+ if (line.trim()) {
71
+ warn('state socket ignored malformed inbound line');
72
+ }
73
+ continue;
74
+ }
75
+ void (async () => {
76
+ if (onReassertVessel && shouldReassertVessel(event)) {
77
+ try {
78
+ await onReassertVessel();
79
+ }
80
+ catch (error) {
81
+ const message = error instanceof Error ? error.message : String(error);
82
+ warn(`vessel reassert failed: ${message}`);
83
+ }
84
+ }
85
+ const broadcast = processInbound(event);
86
+ emitBroadcast(broadcast);
87
+ })();
88
+ }
89
+ };
90
+ const attachClient = (socket) => {
91
+ clients.add(socket);
92
+ for (const replay of buffer) {
93
+ writeBroadcast(socket, replay);
94
+ }
95
+ socket.on('data', (chunk) => handleClientData(socket, chunk));
96
+ socket.on('close', () => clients.delete(socket));
97
+ socket.on('error', () => clients.delete(socket));
98
+ };
99
+ const forwardStateToExistingSocket = (state, surface = 'manual') => {
100
+ const event = createInboundEvent(state, surface);
101
+ const socket = connect({ host, port: requestedPort }, () => {
102
+ socket.write(serializeInbound(event));
103
+ socket.end();
104
+ });
105
+ socket.on('error', () => {
106
+ /* silent — overlay bridge degrades without socket */
107
+ });
108
+ };
109
+ return {
110
+ isListening() {
111
+ return listening;
112
+ },
113
+ async start() {
114
+ if (server && listening) {
115
+ const address = server.address();
116
+ if (address && typeof address === 'object') {
117
+ return { host: address.address, port: address.port, listening: true };
118
+ }
119
+ }
120
+ server = createServer((socket) => attachClient(socket));
121
+ let addrInUse = false;
122
+ await new Promise((resolve, reject) => {
123
+ server.once('error', (error) => {
124
+ if (error.code === 'EADDRINUSE') {
125
+ addrInUse = true;
126
+ server?.close();
127
+ server = null;
128
+ listening = false;
129
+ resolve();
130
+ return;
131
+ }
132
+ reject(error);
133
+ });
134
+ server.listen(requestedPort, host, () => resolve());
135
+ });
136
+ if (addrInUse) {
137
+ warn(`state socket ${host}:${requestedPort} already in use — MCP tools active; ` +
138
+ 'stop other eidola-mcp processes so one instance owns the socket and overlay sync.');
139
+ return { host, port: requestedPort, listening: false };
140
+ }
141
+ const address = server.address();
142
+ if (!address || typeof address !== 'object') {
143
+ throw new Error('State socket failed to bind');
144
+ }
145
+ if (address.address !== '127.0.0.1' && address.address !== '::1') {
146
+ throw new Error(`State socket must bind localhost only; got ${address.address}`);
147
+ }
148
+ listening = true;
149
+ return { host: address.address, port: address.port, listening: true };
150
+ },
151
+ async close() {
152
+ for (const client of clients) {
153
+ client.destroy();
154
+ }
155
+ clients.clear();
156
+ if (!server) {
157
+ return;
158
+ }
159
+ await new Promise((resolve, reject) => {
160
+ server.close((error) => (error ? reject(error) : resolve()));
161
+ });
162
+ server = null;
163
+ listening = false;
164
+ },
165
+ broadcastState(input) {
166
+ const firstToolStarted = visualTurn.update(input.state, input.metadata);
167
+ const broadcast = buildBroadcast(input.state, undefined, input.tool, firstToolStarted);
168
+ if (listening) {
169
+ emitBroadcast(broadcast);
170
+ }
171
+ else {
172
+ forwardStateToExistingSocket(input.state, input.surface ?? 'manual');
173
+ }
174
+ return broadcast;
175
+ },
176
+ getBuffer() {
177
+ return [...buffer];
178
+ },
179
+ };
180
+ }
181
+ function defaultWarn(message) {
182
+ console.error('[eidola-state-socket]', message);
183
+ }
184
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/socket/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ export declare const STATE_PROTOCOL_VERSION = "1.0";
2
+ export declare const STATE_SOCKET_HOST = "127.0.0.1";
3
+ export declare const DEFAULT_STATE_SOCKET_PORT = 9742;
4
+ export declare const DEFAULT_STATE_BUFFER_SIZE = 32;
5
+ export declare const SURFACES: readonly ["cursor", "claude-code", "claude-chat", "cowork", "manual"];
6
+ export type Surface = (typeof SURFACES)[number];
7
+ export declare const VESSEL_STATES: readonly ["idle", "thinking", "waiting", "working", "searching", "writing", "responding", "success", "error", "attention"];
8
+ export type VesselState = (typeof VESSEL_STATES)[number];
9
+ export interface StateInboundEvent {
10
+ protocol_version: string;
11
+ ts: number;
12
+ surface: Surface;
13
+ state: string;
14
+ tool?: string;
15
+ metadata?: Record<string, unknown>;
16
+ }
17
+ export interface StateBroadcast {
18
+ protocol_version: string;
19
+ ts: number;
20
+ state: string;
21
+ engram_id: string;
22
+ expression: string;
23
+ /** Visual tier for renderer playback when it differs from semantic `state`. */
24
+ visual_state?: string;
25
+ tool?: string;
26
+ }
27
+ export interface StateSocketConfig {
28
+ host?: string;
29
+ port?: number;
30
+ bufferSize?: number;
31
+ onWarn?: (message: string) => void;
32
+ /** Reload the active Engram when hooks request reassert and a session is already bound. */
33
+ onReassertVessel?: () => Promise<void>;
34
+ }
35
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/socket/types.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,sBAAsB,QAAQ,CAAC;AAE5C,eAAO,MAAM,iBAAiB,cAAc,CAAC;AAE7C,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAE9C,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAE5C,eAAO,MAAM,QAAQ,uEAAwE,CAAC;AAE9F,MAAM,MAAM,OAAO,GAAG,CAAC,OAAO,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC;AAEhD,eAAO,MAAM,aAAa,4HAWhB,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzD,MAAM,WAAW,iBAAiB;IAChC,gBAAgB,EAAE,MAAM,CAAC;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,cAAc;IAC7B,gBAAgB,EAAE,MAAM,CAAC;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,+EAA+E;IAC/E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,2FAA2F;IAC3F,gBAAgB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACxC"}
@@ -0,0 +1,18 @@
1
+ export const STATE_PROTOCOL_VERSION = '1.0';
2
+ export const STATE_SOCKET_HOST = '127.0.0.1';
3
+ export const DEFAULT_STATE_SOCKET_PORT = 9742;
4
+ export const DEFAULT_STATE_BUFFER_SIZE = 32;
5
+ export const SURFACES = ['cursor', 'claude-code', 'claude-chat', 'cowork', 'manual'];
6
+ export const VESSEL_STATES = [
7
+ 'idle',
8
+ 'thinking',
9
+ 'waiting',
10
+ 'working',
11
+ 'searching',
12
+ 'writing',
13
+ 'responding',
14
+ 'success',
15
+ 'error',
16
+ 'attention',
17
+ ];
18
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/socket/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,sBAAsB,GAAG,KAAK,CAAC;AAE5C,MAAM,CAAC,MAAM,iBAAiB,GAAG,WAAW,CAAC;AAE7C,MAAM,CAAC,MAAM,yBAAyB,GAAG,IAAI,CAAC;AAE9C,MAAM,CAAC,MAAM,yBAAyB,GAAG,EAAE,CAAC;AAE5C,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,CAAU,CAAC;AAI9F,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,MAAM;IACN,UAAU;IACV,SAAS;IACT,SAAS;IACT,WAAW;IACX,SAAS;IACT,YAAY;IACZ,SAAS;IACT,OAAO;IACP,WAAW;CACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ /** Tracks `firstToolStarted` for visual tier resolution on the state socket. */
2
+ export declare class VisualTurnTracker {
3
+ private firstToolStarted;
4
+ getFirstToolStarted(): boolean;
5
+ reset(): void;
6
+ update(state: string, metadata?: Record<string, unknown>): boolean;
7
+ }
8
+ //# sourceMappingURL=visual-turn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visual-turn.d.ts","sourceRoot":"","sources":["../../src/socket/visual-turn.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAIhF,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,gBAAgB,CAAS;IAEjC,mBAAmB,IAAI,OAAO;IAI9B,KAAK,IAAI,IAAI;IAIb,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO;CAanE"}
@@ -0,0 +1,27 @@
1
+ /** Tracks `firstToolStarted` for visual tier resolution on the state socket. */
2
+ const TOOL_CLUSTER_STATES = new Set(['searching', 'writing', 'working']);
3
+ export class VisualTurnTracker {
4
+ firstToolStarted = false;
5
+ getFirstToolStarted() {
6
+ return this.firstToolStarted;
7
+ }
8
+ reset() {
9
+ this.firstToolStarted = false;
10
+ }
11
+ update(state, metadata) {
12
+ if (metadata?.first_tool_started === true) {
13
+ this.firstToolStarted = true;
14
+ }
15
+ else if (metadata?.first_tool_started === false) {
16
+ this.firstToolStarted = false;
17
+ }
18
+ else if (state === 'idle' || state === 'success') {
19
+ this.firstToolStarted = false;
20
+ }
21
+ else if (TOOL_CLUSTER_STATES.has(state)) {
22
+ this.firstToolStarted = true;
23
+ }
24
+ return this.firstToolStarted;
25
+ }
26
+ }
27
+ //# sourceMappingURL=visual-turn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visual-turn.js","sourceRoot":"","sources":["../../src/socket/visual-turn.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAEhF,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;AAEzE,MAAM,OAAO,iBAAiB;IACpB,gBAAgB,GAAG,KAAK,CAAC;IAEjC,mBAAmB;QACjB,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAC/B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;IAChC,CAAC;IAED,MAAM,CAAC,KAAa,EAAE,QAAkC;QACtD,IAAI,QAAQ,EAAE,kBAAkB,KAAK,IAAI,EAAE,CAAC;YAC1C,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC/B,CAAC;aAAM,IAAI,QAAQ,EAAE,kBAAkB,KAAK,KAAK,EAAE,CAAC;YAClD,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;QAChC,CAAC;aAAM,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACnD,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;QAChC,CAAC;aAAM,IAAI,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1C,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC/B,CAAC;QAED,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAC/B,CAAC;CACF"}