@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,190 @@
1
+ import { normalizeExpressionKeys } from '../vendor/tool-state.js';
2
+ import { EngramLoadError } from './types.js';
3
+ import { validateEngramVersion } from './validate.js';
4
+ function requireString(value, field) {
5
+ if (typeof value !== 'string' || value.trim().length === 0) {
6
+ throw new EngramLoadError(`Missing or invalid required field "${field}".`, 'INVALID_FIELD');
7
+ }
8
+ return value;
9
+ }
10
+ function requireNumber(value, field) {
11
+ if (typeof value !== 'number' || Number.isNaN(value)) {
12
+ throw new EngramLoadError(`Missing or invalid required field "${field}".`, 'INVALID_FIELD');
13
+ }
14
+ return value;
15
+ }
16
+ function requireObject(value, field) {
17
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
18
+ throw new EngramLoadError(`Missing or invalid required field "${field}".`, 'INVALID_FIELD');
19
+ }
20
+ return value;
21
+ }
22
+ export function parseEngramYaml(raw) {
23
+ const data = requireObject(raw, 'engram.yaml root');
24
+ const engramVersion = requireString(data.engram_version, 'engram_version');
25
+ validateEngramVersion(engramVersion);
26
+ const metaRaw = requireObject(data.meta, 'meta');
27
+ const extensionsRaw = data.extensions;
28
+ if (extensionsRaw === undefined) {
29
+ throw new EngramLoadError('Missing or invalid required field "extensions".', 'INVALID_FIELD');
30
+ }
31
+ if (!extensionsRaw || typeof extensionsRaw !== 'object' || Array.isArray(extensionsRaw)) {
32
+ throw new EngramLoadError('Missing or invalid required field "extensions".', 'INVALID_FIELD');
33
+ }
34
+ const voiceId = data.voice_id;
35
+ if (voiceId !== null && typeof voiceId !== 'string') {
36
+ throw new EngramLoadError('Field "voice_id" must be a string or null.', 'INVALID_FIELD');
37
+ }
38
+ const tagsRaw = metaRaw.tags;
39
+ let tags;
40
+ if (tagsRaw !== undefined) {
41
+ if (!Array.isArray(tagsRaw) || tagsRaw.some((tag) => typeof tag !== 'string')) {
42
+ throw new EngramLoadError('Field "meta.tags" must be an array of strings.', 'INVALID_FIELD');
43
+ }
44
+ tags = tagsRaw;
45
+ }
46
+ const descriptionRaw = metaRaw.description;
47
+ const description = descriptionRaw === undefined
48
+ ? undefined
49
+ : typeof descriptionRaw === 'string'
50
+ ? descriptionRaw
51
+ : (() => {
52
+ throw new EngramLoadError('Field "meta.description" must be a string.', 'INVALID_FIELD');
53
+ })();
54
+ return {
55
+ engram_version: engramVersion,
56
+ id: requireString(data.id, 'id'),
57
+ name: requireString(data.name, 'name'),
58
+ reinject_interval: requireNumber(data.reinject_interval, 'reinject_interval'),
59
+ voice_id: voiceId ?? null,
60
+ meta: {
61
+ author: requireString(metaRaw.author, 'meta.author'),
62
+ created: requireString(metaRaw.created, 'meta.created'),
63
+ ...(description !== undefined ? { description } : {}),
64
+ ...(tags !== undefined ? { tags } : {}),
65
+ },
66
+ extensions: { ...extensionsRaw },
67
+ };
68
+ }
69
+ function parseExpressions(data, required) {
70
+ const expressions = {};
71
+ if (!data.expressions) {
72
+ if (required) {
73
+ requireObject(data.expressions, 'expressions'); // throws
74
+ }
75
+ return expressions;
76
+ }
77
+ const expressionsRaw = requireObject(data.expressions, 'expressions');
78
+ for (const [state, clip] of Object.entries(expressionsRaw)) {
79
+ if (typeof clip !== 'string' || clip.trim().length === 0) {
80
+ if (required) {
81
+ throw new EngramLoadError(`Expression "${state}" must map to a clip filename.`, 'INVALID_FIELD');
82
+ }
83
+ continue;
84
+ }
85
+ expressions[state] = clip;
86
+ }
87
+ return normalizeExpressionKeys(expressions);
88
+ }
89
+ function parseTransitionsAndPlayback(data) {
90
+ const transitionsRaw = data.transitions && typeof data.transitions === 'object' && !Array.isArray(data.transitions)
91
+ ? data.transitions
92
+ : {};
93
+ // For component renderers, transitions.default may be an object; treat as crossfade
94
+ const transitionDefaultRaw = transitionsRaw.default;
95
+ const transitionDefaultStr = typeof transitionDefaultRaw === 'object' ? 'crossfade' : transitionDefaultRaw;
96
+ const defaultTransition = transitionDefaultStr === undefined
97
+ ? 'crossfade'
98
+ : transitionDefaultStr === 'crossfade' || transitionDefaultStr === 'cut'
99
+ ? transitionDefaultStr
100
+ : (() => {
101
+ throw new EngramLoadError('Field "transitions.default" must be "crossfade" or "cut".', 'INVALID_FIELD');
102
+ })();
103
+ const durationRaw = transitionsRaw.duration_ms;
104
+ const durationMs = durationRaw === undefined
105
+ ? 300
106
+ : typeof durationRaw === 'number' && !Number.isNaN(durationRaw)
107
+ ? durationRaw
108
+ : (() => {
109
+ throw new EngramLoadError('Field "transitions.duration_ms" must be a number.', 'INVALID_FIELD');
110
+ })();
111
+ const playbackRaw = data.playback && typeof data.playback === 'object' && !Array.isArray(data.playback)
112
+ ? data.playback
113
+ : {};
114
+ const idleLoopsRaw = playbackRaw.idle_loops;
115
+ const idleLoops = idleLoopsRaw === undefined
116
+ ? true
117
+ : typeof idleLoopsRaw === 'boolean'
118
+ ? idleLoopsRaw
119
+ : (() => {
120
+ throw new EngramLoadError('Field "playback.idle_loops" must be a boolean.', 'INVALID_FIELD');
121
+ })();
122
+ const approvalIdleMsRaw = playbackRaw.approval_idle_ms;
123
+ const approvalIdleMs = approvalIdleMsRaw === undefined
124
+ ? 3000
125
+ : typeof approvalIdleMsRaw === 'number' && !Number.isNaN(approvalIdleMsRaw)
126
+ ? approvalIdleMsRaw
127
+ : (() => {
128
+ throw new EngramLoadError('Field "playback.approval_idle_ms" must be a number.', 'INVALID_FIELD');
129
+ })();
130
+ const successHoldMsRaw = playbackRaw.success_hold_ms ?? playbackRaw.completed_hold_ms;
131
+ const successHoldMs = successHoldMsRaw === undefined
132
+ ? 3000
133
+ : typeof successHoldMsRaw === 'number' && !Number.isNaN(successHoldMsRaw)
134
+ ? successHoldMsRaw
135
+ : (() => {
136
+ throw new EngramLoadError('Field "playback.success_hold_ms" must be a number.', 'INVALID_FIELD');
137
+ })();
138
+ return {
139
+ transitions: { default: defaultTransition, duration_ms: durationMs },
140
+ playback: {
141
+ idle_loops: idleLoops,
142
+ approval_idle_ms: approvalIdleMs,
143
+ success_hold_ms: successHoldMs,
144
+ },
145
+ };
146
+ }
147
+ export function parseVesselYaml(raw) {
148
+ const data = requireObject(raw, 'vessel.yaml root');
149
+ const type = data.type;
150
+ if (type !== 'lottie' &&
151
+ type !== 'webm' &&
152
+ type !== 'mp4' &&
153
+ type !== 'gif' &&
154
+ type !== 'component') {
155
+ throw new EngramLoadError('Field "type" must be "lottie", "webm", "mp4", "gif", or "component".', 'INVALID_FIELD');
156
+ }
157
+ // component renderers manage expressions internally; lottie/webm require them
158
+ const expressions = parseExpressions(data, type !== 'component');
159
+ // Parse optional fallback block (present when type === 'component')
160
+ let fallback;
161
+ if (type === 'component' &&
162
+ data.fallback &&
163
+ typeof data.fallback === 'object' &&
164
+ !Array.isArray(data.fallback)) {
165
+ const fb = data.fallback;
166
+ const fbExpressions = parseExpressions(fb, true);
167
+ const { transitions: fbTransitions, playback: fbPlayback } = parseTransitionsAndPlayback(fb);
168
+ const fbType = fb.type;
169
+ if (fbType !== 'lottie' && fbType !== 'webm' && fbType !== 'mp4' && fbType !== 'gif') {
170
+ throw new EngramLoadError('Field "fallback.type" must be "lottie", "webm", "mp4", or "gif".', 'INVALID_FIELD');
171
+ }
172
+ fallback = {
173
+ type: fbType,
174
+ pack: requireString(fb.pack, 'fallback.pack'),
175
+ expressions: fbExpressions,
176
+ transitions: fbTransitions,
177
+ playback: fbPlayback,
178
+ };
179
+ }
180
+ const { transitions, playback } = parseTransitionsAndPlayback(data);
181
+ return {
182
+ type,
183
+ pack: requireString(data.pack, 'pack'),
184
+ expressions,
185
+ transitions,
186
+ playback,
187
+ ...(fallback !== undefined ? { fallback } : {}),
188
+ };
189
+ }
190
+ //# sourceMappingURL=parse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/engram/parse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export interface EngramListEntry {
2
+ id: string;
3
+ name?: string;
4
+ description?: string;
5
+ directory: string;
6
+ }
7
+ export declare function listEngramDirectories(engramsDir: string): Promise<EngramListEntry[]>;
8
+ export declare function resolveEngramDirectory(engramsDir: string, engramId: string): string;
9
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/engram/registry.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CA+B1F;AAiBD,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAOnF"}
@@ -0,0 +1,54 @@
1
+ import { readFile, readdir, stat } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import yaml from 'js-yaml';
4
+ import { parseEngramYaml } from './parse.js';
5
+ export async function listEngramDirectories(engramsDir) {
6
+ let entries;
7
+ try {
8
+ entries = await readdir(engramsDir);
9
+ }
10
+ catch (error) {
11
+ const code = error.code;
12
+ if (code === 'ENOENT') {
13
+ return [];
14
+ }
15
+ throw error;
16
+ }
17
+ const results = [];
18
+ for (const entry of entries) {
19
+ const directory = join(engramsDir, entry);
20
+ const info = await stat(directory);
21
+ if (!info.isDirectory()) {
22
+ continue;
23
+ }
24
+ const metadata = await readEngramListMetadata(directory);
25
+ results.push({
26
+ id: entry,
27
+ name: metadata?.name,
28
+ description: metadata?.description,
29
+ directory,
30
+ });
31
+ }
32
+ return results.sort((a, b) => a.id.localeCompare(b.id));
33
+ }
34
+ async function readEngramListMetadata(directory) {
35
+ try {
36
+ const raw = yaml.load(await readFile(join(directory, 'engram.yaml'), 'utf8'));
37
+ const config = parseEngramYaml(raw);
38
+ return {
39
+ name: config.name,
40
+ description: config.meta.description,
41
+ };
42
+ }
43
+ catch {
44
+ return null;
45
+ }
46
+ }
47
+ export function resolveEngramDirectory(engramsDir, engramId) {
48
+ const normalized = engramId.trim();
49
+ if (!normalized || normalized.includes('..') || /[/\\]/.test(normalized)) {
50
+ throw new Error(`Invalid engram_id "${engramId}".`);
51
+ }
52
+ return join(engramsDir, normalized);
53
+ }
54
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/engram/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,IAAI,MAAM,SAAS,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAS7C,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,UAAkB;IAC5D,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,GAAI,KAA+B,CAAC,IAAI,CAAC;QACnD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IAED,MAAM,OAAO,GAAsB,EAAE,CAAC;IAEtC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAC1C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,SAAS;QACX,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,sBAAsB,CAAC,SAAS,CAAC,CAAC;QACzD,OAAO,CAAC,IAAI,CAAC;YACX,EAAE,EAAE,KAAK;YACT,IAAI,EAAE,QAAQ,EAAE,IAAI;YACpB,WAAW,EAAE,QAAQ,EAAE,WAAW;YAClC,SAAS;SACV,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,KAAK,UAAU,sBAAsB,CACnC,SAAiB;IAEjB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QAC9E,MAAM,MAAM,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;QACpC,OAAO;YACL,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW;SACrC,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,UAAkB,EAAE,QAAgB;IACzE,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;IACnC,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACzE,MAAM,IAAI,KAAK,CAAC,sBAAsB,QAAQ,IAAI,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;AACtC,CAAC"}
@@ -0,0 +1,58 @@
1
+ export declare const SUPPORTED_ENGRAM_MAJOR = 1;
2
+ export interface EngramMeta {
3
+ author: string;
4
+ created: string;
5
+ description?: string;
6
+ tags?: string[];
7
+ }
8
+ export interface EngramConfig {
9
+ engram_version: string;
10
+ id: string;
11
+ name: string;
12
+ reinject_interval: number;
13
+ voice_id: string | null;
14
+ meta: EngramMeta;
15
+ extensions: Record<string, unknown>;
16
+ }
17
+ export type VesselType = 'lottie' | 'webm' | 'mp4' | 'gif' | 'component';
18
+ export interface VesselTransitions {
19
+ default: 'crossfade' | 'cut';
20
+ duration_ms: number;
21
+ }
22
+ export interface VesselPlayback {
23
+ idle_loops: boolean;
24
+ /** Mid-turn approval idle timer (ms). Overlay-only; default 3000. */
25
+ approval_idle_ms?: number;
26
+ /** How long overlay holds `success` before returning to idle. Overlay-only; default 3000. */
27
+ success_hold_ms?: number;
28
+ }
29
+ export interface VesselConfig {
30
+ type: VesselType;
31
+ pack: string;
32
+ /** Expression map — required for lottie/webm, omitted for component renderers */
33
+ expressions: Record<string, string>;
34
+ transitions: VesselTransitions;
35
+ playback: VesselPlayback;
36
+ /**
37
+ * Lottie fallback for overlays that don't support component renderers.
38
+ * Present when type === 'component'.
39
+ */
40
+ fallback?: Omit<VesselConfig, 'fallback'>;
41
+ }
42
+ export interface LoadedEngram {
43
+ directory: string;
44
+ soul: string;
45
+ engram: EngramConfig;
46
+ vessel: VesselConfig;
47
+ }
48
+ export interface EngramDirectoryOutput {
49
+ soul: string;
50
+ vessel: VesselConfig;
51
+ engram: EngramConfig;
52
+ }
53
+ export declare class EngramLoadError extends Error {
54
+ readonly code: string;
55
+ readonly directory?: string;
56
+ constructor(message: string, code: string, directory?: string);
57
+ }
58
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/engram/types.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAExC,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,EAAE,UAAU,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC;AAED,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,WAAW,CAAC;AAEzE,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,WAAW,GAAG,KAAK,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,OAAO,CAAC;IACpB,qEAAqE;IACrE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,6FAA6F;IAC7F,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,iFAAiF;IACjF,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,WAAW,EAAE,iBAAiB,CAAC;IAC/B,QAAQ,EAAE,cAAc,CAAC;IACzB;;;OAGG;IACH,QAAQ,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,YAAY,CAAC;CACtB;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,YAAY,CAAC;CACtB;AAED,qBAAa,eAAgB,SAAQ,KAAK;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;gBAEhB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;CAM9D"}
@@ -0,0 +1,12 @@
1
+ export const SUPPORTED_ENGRAM_MAJOR = 1;
2
+ export class EngramLoadError extends Error {
3
+ code;
4
+ directory;
5
+ constructor(message, code, directory) {
6
+ super(message);
7
+ this.name = 'EngramLoadError';
8
+ this.code = code;
9
+ this.directory = directory;
10
+ }
11
+ }
12
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/engram/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC;AA6DxC,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAC/B,IAAI,CAAS;IACb,SAAS,CAAU;IAE5B,YAAY,OAAe,EAAE,IAAY,EAAE,SAAkB;QAC3D,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;QAC9B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;CACF"}
@@ -0,0 +1,7 @@
1
+ export declare function parseSemver(version: string): {
2
+ major: number;
3
+ minor: number;
4
+ patch: number;
5
+ } | null;
6
+ export declare function validateEngramVersion(version: string): void;
7
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/engram/validate.ts"],"names":[],"mappings":"AAIA,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAQnG;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAe3D"}
@@ -0,0 +1,22 @@
1
+ import { SUPPORTED_ENGRAM_MAJOR, EngramLoadError } from './types.js';
2
+ const SEMVER_PATTERN = /^(\d+)\.(\d+)\.(\d+)$/;
3
+ export function parseSemver(version) {
4
+ const match = SEMVER_PATTERN.exec(version.trim());
5
+ if (!match)
6
+ return null;
7
+ return {
8
+ major: Number(match[1]),
9
+ minor: Number(match[2]),
10
+ patch: Number(match[3]),
11
+ };
12
+ }
13
+ export function validateEngramVersion(version) {
14
+ const parsed = parseSemver(version);
15
+ if (!parsed) {
16
+ throw new EngramLoadError(`Unrecognised engram_version "${version}". Expected semver (e.g. "1.0.0").`, 'INVALID_ENGRAM_VERSION');
17
+ }
18
+ if (parsed.major !== SUPPORTED_ENGRAM_MAJOR) {
19
+ throw new EngramLoadError(`Unsupported engram_version "${version}". This runtime supports major version ${SUPPORTED_ENGRAM_MAJOR}.x.x only.`, 'UNSUPPORTED_ENGRAM_VERSION');
20
+ }
21
+ }
22
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/engram/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAErE,MAAM,cAAc,GAAG,uBAAuB,CAAC;AAE/C,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAClD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACvB,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACvB,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;KACxB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAe;IACnD,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACpC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,eAAe,CACvB,gCAAgC,OAAO,oCAAoC,EAC3E,wBAAwB,CACzB,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,CAAC,KAAK,KAAK,sBAAsB,EAAE,CAAC;QAC5C,MAAM,IAAI,eAAe,CACvB,+BAA+B,OAAO,0CAA0C,sBAAsB,YAAY,EAClH,4BAA4B,CAC7B,CAAC;IACJ,CAAC;AACH,CAAC"}
package/index.d.ts ADDED
@@ -0,0 +1,30 @@
1
+ export { loadEngramFromDirectory } from './engram/loader.js';
2
+ export { listEngramDirectories, resolveEngramDirectory } from './engram/registry.js';
3
+ export { parseEngramYaml, parseVesselYaml } from './engram/parse.js';
4
+ export { validateEngramVersion, parseSemver } from './engram/validate.js';
5
+ export { EngramLoadError, SUPPORTED_ENGRAM_MAJOR, type EngramConfig, type EngramDirectoryOutput, type EngramMeta, type LoadedEngram, type VesselConfig, type VesselPlayback, type VesselTransitions, type VesselType, } from './engram/types.js';
6
+ export { migrateJsonToDirectory } from './migrations/json-to-directory.js';
7
+ export type { LegacyEngramJson } from './migrations/types.js';
8
+ export { resolveEidolaPaths, resolveEidolaRuntimeConfig, type EidolaPaths, type EidolaRuntimeConfig, } from './config.js';
9
+ export { STATE_PROTOCOL_VERSION, STATE_SOCKET_HOST, DEFAULT_STATE_SOCKET_PORT, DEFAULT_STATE_BUFFER_SIZE, SURFACES, VESSEL_STATES, type Surface, type StateBroadcast, type StateInboundEvent, type StateSocketConfig, type VesselState, } from './socket/types.js';
10
+ export { createBroadcast, isKnownVesselState, normalizeInbound, parseInboundLine, serializeBroadcast, } from './socket/protocol.js';
11
+ export { resolveExpressionClip } from './socket/expression.js';
12
+ export { resolveVisualState, WORKING_CLUSTER, isWorkingClusterState } from './vendor/tool-state.js';
13
+ export type { ResolveVisualStateInput, WorkingClusterState } from './vendor/tool-state.js';
14
+ export { createStateSocketServer, type StateSocketServer } from './socket/server.js';
15
+ export { SessionState, type ActiveEidolonSnapshot } from './session/state.js';
16
+ export { buildSoulInjectionPayload, isValidSoulInjectionPayload, wrapSoulAsSystemReminder, type SoulInjectionPayload, } from './soul/injection.js';
17
+ export { ReinjectTracker, type ReinjectStatus } from './soul/reinject.js';
18
+ export { createToolHandlers, type EidolaToolHandlers, type ToolTextResult } from './tools/handlers.js';
19
+ export { startEidolaMcpServer } from './server.js';
20
+ export { autoActivateFromWorkspace, type AutoActivateResult } from './cursor/auto-activate.js';
21
+ export { launchShrine, ensureShrineRunning, type LaunchShrineResult, type LaunchShrineOptions, type EnsureShrineResult, } from './cursor/ensure-shrine.js';
22
+ export { isShrineRunning, isProcessAlive, shrineLockPath, readShrineLock, removeShrineLock, stopShrine, writeShrineLock, type ShrineLockFile, } from './cursor/shrine-lock.js';
23
+ export { resolveShrineSurface, normalizeShrineSurfaceInput, shrineSurfaceEnv, isHttpShrineSurface, shrineHttpPort, shrineHttpUrl, SHRINE_SURFACE_PRESETS, DEFAULT_SHRINE_SURFACE_PRESET, DEFAULT_SHRINE_HTTP_PORT, type ShrineSurface, type ShrineSurfacePresetId, type ShrineLayoutTier, } from './cursor/shrine-surface.js';
24
+ export { compileSoulToCursorRule, parseCompiledCursorRule, } from './cursor/compile.js';
25
+ export { detectSoulSource, type SoulSource } from './cursor/soul-source.js';
26
+ export { computeSoulHash } from './cursor/hash.js';
27
+ export { warnIfStaleSoulCompile, type StaleSoulCompileCheck } from './cursor/stale.js';
28
+ export { buildWorkspaceConfig, cursorRulePath, EIDOLA_WORKSPACE_CONFIG_FILENAME, readWorkspaceConfig, workspaceConfigPath, writeWorkspaceConfig, } from './cursor/workspace-config.js';
29
+ export type { CompiledCursorRule, EidolaWorkspaceConfig } from './cursor/types.js';
30
+ //# sourceMappingURL=index.d.ts.map
package/index.d.ts.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/index.js ADDED
@@ -0,0 +1,27 @@
1
+ export { loadEngramFromDirectory } from './engram/loader.js';
2
+ export { listEngramDirectories, resolveEngramDirectory } from './engram/registry.js';
3
+ export { parseEngramYaml, parseVesselYaml } from './engram/parse.js';
4
+ export { validateEngramVersion, parseSemver } from './engram/validate.js';
5
+ export { EngramLoadError, SUPPORTED_ENGRAM_MAJOR, } from './engram/types.js';
6
+ export { migrateJsonToDirectory } from './migrations/json-to-directory.js';
7
+ export { resolveEidolaPaths, resolveEidolaRuntimeConfig, } from './config.js';
8
+ export { STATE_PROTOCOL_VERSION, STATE_SOCKET_HOST, DEFAULT_STATE_SOCKET_PORT, DEFAULT_STATE_BUFFER_SIZE, SURFACES, VESSEL_STATES, } from './socket/types.js';
9
+ export { createBroadcast, isKnownVesselState, normalizeInbound, parseInboundLine, serializeBroadcast, } from './socket/protocol.js';
10
+ export { resolveExpressionClip } from './socket/expression.js';
11
+ export { resolveVisualState, WORKING_CLUSTER, isWorkingClusterState } from './vendor/tool-state.js';
12
+ export { createStateSocketServer } from './socket/server.js';
13
+ export { SessionState } from './session/state.js';
14
+ export { buildSoulInjectionPayload, isValidSoulInjectionPayload, wrapSoulAsSystemReminder, } from './soul/injection.js';
15
+ export { ReinjectTracker } from './soul/reinject.js';
16
+ export { createToolHandlers } from './tools/handlers.js';
17
+ export { startEidolaMcpServer } from './server.js';
18
+ export { autoActivateFromWorkspace } from './cursor/auto-activate.js';
19
+ export { launchShrine, ensureShrineRunning, } from './cursor/ensure-shrine.js';
20
+ export { isShrineRunning, isProcessAlive, shrineLockPath, readShrineLock, removeShrineLock, stopShrine, writeShrineLock, } from './cursor/shrine-lock.js';
21
+ export { resolveShrineSurface, normalizeShrineSurfaceInput, shrineSurfaceEnv, isHttpShrineSurface, shrineHttpPort, shrineHttpUrl, SHRINE_SURFACE_PRESETS, DEFAULT_SHRINE_SURFACE_PRESET, DEFAULT_SHRINE_HTTP_PORT, } from './cursor/shrine-surface.js';
22
+ export { compileSoulToCursorRule, parseCompiledCursorRule, } from './cursor/compile.js';
23
+ export { detectSoulSource } from './cursor/soul-source.js';
24
+ export { computeSoulHash } from './cursor/hash.js';
25
+ export { warnIfStaleSoulCompile } from './cursor/stale.js';
26
+ export { buildWorkspaceConfig, cursorRulePath, EIDOLA_WORKSPACE_CONFIG_FILENAME, readWorkspaceConfig, workspaceConfigPath, writeWorkspaceConfig, } from './cursor/workspace-config.js';
27
+ //# sourceMappingURL=index.js.map
package/index.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AACrF,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EACL,eAAe,EACf,sBAAsB,GASvB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAE3E,OAAO,EACL,kBAAkB,EAClB,0BAA0B,GAG3B,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,yBAAyB,EACzB,yBAAyB,EACzB,QAAQ,EACR,aAAa,GAMd,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAEpG,OAAO,EAAE,uBAAuB,EAA0B,MAAM,oBAAoB,CAAC;AACrF,OAAO,EAAE,YAAY,EAA8B,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EACL,yBAAyB,EACzB,2BAA2B,EAC3B,wBAAwB,GAEzB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAuB,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAgD,MAAM,qBAAqB,CAAC;AACvG,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,yBAAyB,EAA2B,MAAM,2BAA2B,CAAC;AAC/F,OAAO,EACL,YAAY,EACZ,mBAAmB,GAIpB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,eAAe,EACf,cAAc,EACd,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,eAAe,GAEhB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,oBAAoB,EACpB,2BAA2B,EAC3B,gBAAgB,EAChB,mBAAmB,EACnB,cAAc,EACd,aAAa,EACb,sBAAsB,EACtB,6BAA6B,EAC7B,wBAAwB,GAIzB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAmB,MAAM,yBAAyB,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAA8B,MAAM,mBAAmB,CAAC;AACvF,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,gCAAgC,EAChC,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,8BAA8B,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { EngramDirectoryOutput } from '../engram/types.js';
2
+ import type { LegacyEngramJson } from './types.js';
3
+ /**
4
+ * Pure migration from legacy `.engram.json` to directory package fields.
5
+ * Never mutates the input object.
6
+ */
7
+ export declare function migrateJsonToDirectory(legacy: LegacyEngramJson): EngramDirectoryOutput;
8
+ //# sourceMappingURL=json-to-directory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-to-directory.d.ts","sourceRoot":"","sources":["../../src/migrations/json-to-directory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAgB,MAAM,oBAAoB,CAAC;AAC9E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AA0InD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,gBAAgB,GAAG,qBAAqB,CA0BtF"}
@@ -0,0 +1,151 @@
1
+ const CURRENT_ENGRAM_VERSION = '1.0.0';
2
+ /** Old persona/pack state names → Phase 1 expression keys. */
3
+ const LEGACY_STATE_TO_EXPRESSION = {
4
+ idle: 'idle',
5
+ thinking: 'thinking',
6
+ debug: 'working',
7
+ working: 'working',
8
+ warn: 'attention',
9
+ alerting: 'attention',
10
+ attention: 'attention',
11
+ shipit: 'writing',
12
+ writing: 'writing',
13
+ searching: 'searching',
14
+ result: 'responding',
15
+ responding: 'responding',
16
+ speaking: 'responding',
17
+ confused: 'error',
18
+ error: 'error',
19
+ completed: 'success',
20
+ success: 'success',
21
+ };
22
+ const DEFAULT_EXPRESSIONS = {
23
+ idle: 'idle.json',
24
+ thinking: 'thinking.json',
25
+ working: 'working.json',
26
+ searching: 'searching.json',
27
+ writing: 'writing.json',
28
+ responding: 'responding.json',
29
+ success: 'responding.json',
30
+ error: 'error.json',
31
+ attention: 'attention.json',
32
+ };
33
+ function slugify(value) {
34
+ return value
35
+ .trim()
36
+ .toLowerCase()
37
+ .replace(/[^a-z0-9]+/g, '-')
38
+ .replace(/^-+|-+$/g, '');
39
+ }
40
+ function toIsoDate(value) {
41
+ if (!value)
42
+ return new Date().toISOString().slice(0, 10);
43
+ const parsed = new Date(value);
44
+ if (Number.isNaN(parsed.getTime()))
45
+ return new Date().toISOString().slice(0, 10);
46
+ return parsed.toISOString().slice(0, 10);
47
+ }
48
+ function resolvePackId(legacy) {
49
+ if (typeof legacy.packId === 'string' && legacy.packId.trim().length > 0) {
50
+ return legacy.packId.trim();
51
+ }
52
+ const vessel = legacy.vessel;
53
+ if (vessel && typeof vessel === 'object' && 'packId' in vessel) {
54
+ const packId = vessel.packId;
55
+ if (typeof packId === 'string' && packId.trim().length > 0) {
56
+ return packId.trim();
57
+ }
58
+ }
59
+ const id = legacy.id?.trim() || slugify(legacy.name);
60
+ return id ? `${id}-v1` : 'default-v1';
61
+ }
62
+ function resolveVesselType(legacy) {
63
+ const vessel = legacy.vessel;
64
+ if (vessel && typeof vessel === 'object' && 'sourceType' in vessel) {
65
+ const sourceType = vessel.sourceType;
66
+ if (sourceType === 'webm')
67
+ return 'webm';
68
+ }
69
+ return 'lottie';
70
+ }
71
+ function buildSoul(legacy) {
72
+ if (typeof legacy.soulMd === 'string' && legacy.soulMd.trim().length > 0) {
73
+ return legacy.soulMd.replace(/\r\n/g, '\n').trimEnd() + '\n';
74
+ }
75
+ const sections = [`# ${legacy.name.trim()}`];
76
+ if (legacy.description?.trim()) {
77
+ sections.push('', legacy.description.trim());
78
+ }
79
+ if (legacy.systemPrompt?.trim()) {
80
+ sections.push('', legacy.systemPrompt.trim());
81
+ }
82
+ if (legacy.styleRules?.length) {
83
+ sections.push('', '## Style', ...legacy.styleRules.map((rule) => `- ${rule}`));
84
+ }
85
+ if (legacy.behaviorRules?.length) {
86
+ sections.push('', '## Rules', ...legacy.behaviorRules.map((rule) => `- ${rule}`));
87
+ }
88
+ return sections.join('\n').trimEnd() + '\n';
89
+ }
90
+ function expressionFilename(key) {
91
+ return `${key}.json`;
92
+ }
93
+ function buildExpressions(legacy) {
94
+ if (legacy.expressions && Object.keys(legacy.expressions).length > 0) {
95
+ return { ...legacy.expressions };
96
+ }
97
+ const expressions = { ...DEFAULT_EXPRESSIONS };
98
+ const states = legacy.states ?? Object.keys(LEGACY_STATE_TO_EXPRESSION);
99
+ for (const state of states) {
100
+ const mapped = LEGACY_STATE_TO_EXPRESSION[state.toLowerCase()];
101
+ if (!mapped)
102
+ continue;
103
+ expressions[mapped] = expressionFilename(mapped);
104
+ }
105
+ expressions.success ??= 'responding.json';
106
+ return expressions;
107
+ }
108
+ function buildVesselConfig(legacy) {
109
+ return {
110
+ type: resolveVesselType(legacy),
111
+ pack: resolvePackId(legacy),
112
+ expressions: buildExpressions(legacy),
113
+ transitions: {
114
+ default: 'crossfade',
115
+ duration_ms: 300,
116
+ },
117
+ playback: {
118
+ idle_loops: true,
119
+ approval_idle_ms: 3000,
120
+ },
121
+ };
122
+ }
123
+ /**
124
+ * Pure migration from legacy `.engram.json` to directory package fields.
125
+ * Never mutates the input object.
126
+ */
127
+ export function migrateJsonToDirectory(legacy) {
128
+ const source = structuredClone(legacy);
129
+ const id = source.id?.trim() || slugify(source.name);
130
+ return {
131
+ soul: buildSoul(source),
132
+ vessel: buildVesselConfig(source),
133
+ engram: {
134
+ engram_version: CURRENT_ENGRAM_VERSION,
135
+ id,
136
+ name: source.name.trim(),
137
+ reinject_interval: typeof source.reinject_interval === 'number' ? source.reinject_interval : 3,
138
+ voice_id: source.voice && typeof source.voice.voiceId === 'string' ? source.voice.voiceId : null,
139
+ meta: {
140
+ author: source.metadata?.author?.trim() || 'unknown',
141
+ created: toIsoDate(source.metadata?.createdAt),
142
+ ...(source.description?.trim() ? { description: source.description.trim() } : {}),
143
+ ...(source.metadata?.tags?.length ? { tags: [...source.metadata.tags] } : {}),
144
+ },
145
+ extensions: source.extensions && typeof source.extensions === 'object' && !Array.isArray(source.extensions)
146
+ ? structuredClone(source.extensions)
147
+ : {},
148
+ },
149
+ };
150
+ }
151
+ //# sourceMappingURL=json-to-directory.js.map