@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.
- package/cli.d.ts +3 -0
- package/cli.d.ts.map +1 -0
- package/cli.js +46 -0
- package/cli.js.map +1 -0
- package/config.d.ts +16 -0
- package/config.d.ts.map +1 -0
- package/config.js +62 -0
- package/config.js.map +1 -0
- package/cursor/auto-activate.d.ts +16 -0
- package/cursor/auto-activate.d.ts.map +1 -0
- package/cursor/auto-activate.js +79 -0
- package/cursor/auto-activate.js.map +1 -0
- package/cursor/compile.d.ts +13 -0
- package/cursor/compile.d.ts.map +1 -0
- package/cursor/compile.js +47 -0
- package/cursor/compile.js.map +1 -0
- package/cursor/ensure-shrine.d.ts +25 -0
- package/cursor/ensure-shrine.d.ts.map +1 -0
- package/cursor/ensure-shrine.js +168 -0
- package/cursor/ensure-shrine.js.map +1 -0
- package/cursor/hash.d.ts +3 -0
- package/cursor/hash.d.ts.map +1 -0
- package/cursor/hash.js +7 -0
- package/cursor/hash.js.map +1 -0
- package/cursor/shrine-lock.d.ts +17 -0
- package/cursor/shrine-lock.d.ts.map +1 -0
- package/cursor/shrine-lock.js +82 -0
- package/cursor/shrine-lock.js.map +1 -0
- package/cursor/shrine-surface.d.ts +40 -0
- package/cursor/shrine-surface.d.ts.map +1 -0
- package/cursor/shrine-surface.js +152 -0
- package/cursor/shrine-surface.js.map +1 -0
- package/cursor/soul-source.d.ts +3 -0
- package/cursor/soul-source.d.ts.map +1 -0
- package/cursor/soul-source.js +15 -0
- package/cursor/soul-source.js.map +1 -0
- package/cursor/stale.d.ts +12 -0
- package/cursor/stale.d.ts.map +1 -0
- package/cursor/stale.js +41 -0
- package/cursor/stale.js.map +1 -0
- package/cursor/types.d.ts +24 -0
- package/cursor/types.d.ts.map +1 -0
- package/cursor/types.js +2 -0
- package/cursor/types.js.map +1 -0
- package/cursor/workspace-config.d.ts +13 -0
- package/cursor/workspace-config.d.ts.map +1 -0
- package/cursor/workspace-config.js +44 -0
- package/cursor/workspace-config.js.map +1 -0
- package/engram/loader.d.ts +3 -0
- package/engram/loader.d.ts.map +1 -0
- package/engram/loader.js +60 -0
- package/engram/loader.js.map +1 -0
- package/engram/parse.d.ts +4 -0
- package/engram/parse.d.ts.map +1 -0
- package/engram/parse.js +190 -0
- package/engram/parse.js.map +1 -0
- package/engram/registry.d.ts +9 -0
- package/engram/registry.d.ts.map +1 -0
- package/engram/registry.js +54 -0
- package/engram/registry.js.map +1 -0
- package/engram/types.d.ts +58 -0
- package/engram/types.d.ts.map +1 -0
- package/engram/types.js +12 -0
- package/engram/types.js.map +1 -0
- package/engram/validate.d.ts +7 -0
- package/engram/validate.d.ts.map +1 -0
- package/engram/validate.js +22 -0
- package/engram/validate.js.map +1 -0
- package/index.d.ts +30 -0
- package/index.d.ts.map +1 -0
- package/index.js +27 -0
- package/index.js.map +1 -0
- package/migrations/json-to-directory.d.ts +8 -0
- package/migrations/json-to-directory.d.ts.map +1 -0
- package/migrations/json-to-directory.js +151 -0
- package/migrations/json-to-directory.js.map +1 -0
- package/migrations/types.d.ts +46 -0
- package/migrations/types.d.ts.map +1 -0
- package/migrations/types.js +2 -0
- package/migrations/types.js.map +1 -0
- package/package.json +42 -0
- package/server.d.ts +5 -0
- package/server.d.ts.map +1 -0
- package/server.js +95 -0
- package/server.js.map +1 -0
- package/session/state.d.ts +29 -0
- package/session/state.d.ts.map +1 -0
- package/session/state.js +69 -0
- package/session/state.js.map +1 -0
- package/shrine/renderer/assets/index-C44XsM0B.js +4083 -0
- package/shrine/renderer/assets/index-DeRYP3aH.css +1 -0
- package/shrine/renderer/index.html +32 -0
- package/shrine/server/display-config.d.ts +20 -0
- package/shrine/server/display-config.d.ts.map +1 -0
- package/shrine/server/display-config.js +98 -0
- package/shrine/server/display-config.js.map +1 -0
- package/shrine/server/index.d.ts +35 -0
- package/shrine/server/index.d.ts.map +1 -0
- package/shrine/server/index.js +337 -0
- package/shrine/server/index.js.map +1 -0
- package/shrine/shared/approval-idle-logic.d.ts +17 -0
- package/shrine/shared/approval-idle-logic.d.ts.map +1 -0
- package/shrine/shared/approval-idle-logic.js +63 -0
- package/shrine/shared/approval-idle-logic.js.map +1 -0
- package/shrine/shared/approval-idle-logic.test.d.ts +2 -0
- package/shrine/shared/approval-idle-logic.test.d.ts.map +1 -0
- package/shrine/shared/approval-idle-logic.test.js +49 -0
- package/shrine/shared/approval-idle-logic.test.js.map +1 -0
- package/shrine/shared/kraken-detect.d.ts +36 -0
- package/shrine/shared/kraken-detect.d.ts.map +1 -0
- package/shrine/shared/kraken-detect.js +61 -0
- package/shrine/shared/kraken-detect.js.map +1 -0
- package/shrine/shared/kraken-detect.test.d.ts +2 -0
- package/shrine/shared/kraken-detect.test.d.ts.map +1 -0
- package/shrine/shared/kraken-detect.test.js +35 -0
- package/shrine/shared/kraken-detect.test.js.map +1 -0
- package/shrine/shared/shrine-api.d.ts +15 -0
- package/shrine/shared/shrine-api.d.ts.map +1 -0
- package/shrine/shared/shrine-api.js +2 -0
- package/shrine/shared/shrine-api.js.map +1 -0
- package/shrine/shared/shrine-display-config.d.ts +34 -0
- package/shrine/shared/shrine-display-config.d.ts.map +1 -0
- package/shrine/shared/shrine-display-config.js +197 -0
- package/shrine/shared/shrine-display-config.js.map +1 -0
- package/shrine/shared/shrine-display-config.test.d.ts +2 -0
- package/shrine/shared/shrine-display-config.test.d.ts.map +1 -0
- package/shrine/shared/shrine-display-config.test.js +53 -0
- package/shrine/shared/shrine-display-config.test.js.map +1 -0
- package/shrine/shared/shrine-state-colors.d.ts +4 -0
- package/shrine/shared/shrine-state-colors.d.ts.map +1 -0
- package/shrine/shared/shrine-state-colors.js +17 -0
- package/shrine/shared/shrine-state-colors.js.map +1 -0
- package/shrine/shared/shrine-surface.d.ts +32 -0
- package/shrine/shared/shrine-surface.d.ts.map +1 -0
- package/shrine/shared/shrine-surface.js +67 -0
- package/shrine/shared/shrine-surface.js.map +1 -0
- package/shrine/shared/shrine-surface.test.d.ts +2 -0
- package/shrine/shared/shrine-surface.test.d.ts.map +1 -0
- package/shrine/shared/shrine-surface.test.js +35 -0
- package/shrine/shared/shrine-surface.test.js.map +1 -0
- package/shrine/shared/state-socket-client.d.ts +30 -0
- package/shrine/shared/state-socket-client.d.ts.map +1 -0
- package/shrine/shared/state-socket-client.js +103 -0
- package/shrine/shared/state-socket-client.js.map +1 -0
- package/shrine/shared/state-socket-client.test.d.ts +2 -0
- package/shrine/shared/state-socket-client.test.d.ts.map +1 -0
- package/shrine/shared/state-socket-client.test.js +20 -0
- package/shrine/shared/state-socket-client.test.js.map +1 -0
- package/shrine/shared/types.d.ts +43 -0
- package/shrine/shared/types.d.ts.map +1 -0
- package/shrine/shared/types.js +58 -0
- package/shrine/shared/types.js.map +1 -0
- package/shrine/shared/types.test.d.ts +2 -0
- package/shrine/shared/types.test.d.ts.map +1 -0
- package/shrine/shared/types.test.js +26 -0
- package/shrine/shared/types.test.js.map +1 -0
- package/shrine/shared/vessel-resolver.d.ts +37 -0
- package/shrine/shared/vessel-resolver.d.ts.map +1 -0
- package/shrine/shared/vessel-resolver.js +135 -0
- package/shrine/shared/vessel-resolver.js.map +1 -0
- package/shrine/vendor/mcp.d.ts +3 -0
- package/shrine/vendor/mcp.d.ts.map +1 -0
- package/shrine/vendor/mcp.js +3 -0
- package/shrine/vendor/mcp.js.map +1 -0
- package/socket/expression.d.ts +3 -0
- package/socket/expression.d.ts.map +1 -0
- package/socket/expression.js +28 -0
- package/socket/expression.js.map +1 -0
- package/socket/protocol.d.ts +16 -0
- package/socket/protocol.d.ts.map +1 -0
- package/socket/protocol.js +75 -0
- package/socket/protocol.js.map +1 -0
- package/socket/server.d.ts +22 -0
- package/socket/server.d.ts.map +1 -0
- package/socket/server.js +184 -0
- package/socket/server.js.map +1 -0
- package/socket/types.d.ts +35 -0
- package/socket/types.d.ts.map +1 -0
- package/socket/types.js +18 -0
- package/socket/types.js.map +1 -0
- package/socket/visual-turn.d.ts +8 -0
- package/socket/visual-turn.d.ts.map +1 -0
- package/socket/visual-turn.js +27 -0
- package/socket/visual-turn.js.map +1 -0
- package/soul/injection.d.ts +13 -0
- package/soul/injection.d.ts.map +1 -0
- package/soul/injection.js +36 -0
- package/soul/injection.js.map +1 -0
- package/soul/reinject.d.ts +13 -0
- package/soul/reinject.d.ts.map +1 -0
- package/soul/reinject.js +28 -0
- package/soul/reinject.js.map +1 -0
- package/tools/handlers.d.ts +20 -0
- package/tools/handlers.d.ts.map +1 -0
- package/tools/handlers.js +148 -0
- package/tools/handlers.js.map +1 -0
- package/tools/register.d.ts +4 -0
- package/tools/register.d.ts.map +1 -0
- package/tools/register.js +48 -0
- package/tools/register.js.map +1 -0
- package/vendor/tool-state-pkg/index.d.ts +23 -0
- package/vendor/tool-state-pkg/index.d.ts.map +1 -0
- package/vendor/tool-state-pkg/index.js +140 -0
- package/vendor/tool-state-pkg/index.js.map +1 -0
- package/vendor/tool-state.d.ts +3 -0
- package/vendor/tool-state.d.ts.map +1 -0
- package/vendor/tool-state.js +3 -0
- package/vendor/tool-state.js.map +1 -0
- package/watch/filesystem.d.ts +7 -0
- package/watch/filesystem.d.ts.map +1 -0
- package/watch/filesystem.js +66 -0
- 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 @@
|
|
|
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":"AAAA,OAAO,EAAE,OAAO,EAAe,MAAM,UAAU,CAAC;AAchD,MAAM,OAAO,iBAAiB;IACX,IAAI,CAAS;IACb,IAAI,CAAS;IACb,WAAW,CAAmB;IAC9B,SAAS,CAAc;IACvB,YAAY,CAAc;IAC1B,WAAW,CAAS;IAE7B,MAAM,GAAkB,IAAI,CAAC;IAC7B,OAAO,GAAG,EAAE,CAAC;IACb,cAAc,GAAyC,IAAI,CAAC;IAC5D,MAAM,GAAG,KAAK,CAAC;IAEvB,YAAY,OAAiC;QAC3C,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,WAAW,CAAC;QACxC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;QACvC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QACnC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;QACzC,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC;IACjD,CAAC;IAED,KAAK;QACH,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;IAED,IAAI;QACF,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAClC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;QACD,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IACrB,CAAC;IAEO,OAAO;QACb,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7D,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QAErB,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;YACxB,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;QACrB,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YAC1B,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACtB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACnB,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;YACtB,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACtB,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,iBAAiB;QACvB,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACvC,OAAO;QACT,CAAC;QAED,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC,GAAG,EAAE;YACpC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;YAC3B,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IACvB,CAAC;IAEO,UAAU,CAAC,KAAa;QAC9B,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC;QACtB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;QAEjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,SAAS,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;YAC3C,IAAI,SAAS,EAAE,CAAC;gBACd,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA4B,CAAC;QAC9D,IACE,OAAO,MAAM,CAAC,gBAAgB,KAAK,QAAQ;YAC3C,OAAO,MAAM,CAAC,EAAE,KAAK,QAAQ;YAC7B,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ;YAChC,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ;YACpC,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ,EACrC,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO;YACL,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;YACzC,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,GAAG,CAAC,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAClE,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -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 @@
|
|
|
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"}
|