@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 @@
|
|
|
1
|
+
:root{--color-void: #06060a;--color-obsidian: #0c0c14;--color-input: #1f1f1f;--color-input-focus: #282828;--color-gold: #c9a84c;--color-gold-light: #e3c96e;--color-gold-dim: #8a7333;--color-halo: rgba(201, 168, 76, .15);--color-frost: #e8e4dc;--color-eidola-mist: #a09a8c;--color-eidola-stone: #6b6558;--color-border: rgba(201, 168, 76, .1);--font-display: "Cinzel", Georgia, serif;--font-heading: "Cormorant Garamond", Georgia, serif;--font-body: Inter, system-ui, sans-serif;--font-code: "JetBrains Mono", ui-monospace, monospace;--font-pixel: "Press Start 2P", monospace}*,*:before,*:after{box-sizing:border-box}html,body{margin:0;width:100%;height:100%;overflow:hidden;background-color:var(--color-void);color:var(--color-frost);font-family:var(--font-code);transition:background-color var(--crossfade-ms, .3s) ease-in-out}.hidden{display:none!important}.normal-case,.\!normal-case{text-transform:none!important}.ui-panel{border:1px solid rgba(201,168,76,.1);border-radius:12px;background:var(--color-input)}.type-overline{margin:0 0 12px;font-family:var(--font-display);font-size:.8125rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--color-gold-dim)}.shrine-chrome{display:none}.shrine-setup{position:relative;z-index:3;width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:24px;overflow-y:auto}.shrine-setup-stack{width:min(100%,520px);display:flex;flex-direction:column;align-items:center;gap:16px}.shrine-setup-hero{width:100%;margin-bottom:8px;text-align:center}.shrine-setup-brand{margin:0 0 8px;font-family:var(--font-pixel);font-size:clamp(1.5rem,6vw,2.5rem);line-height:1.2;image-rendering:pixelated}.shrine-setup-tagline{margin:0;font-family:var(--font-code);font-size:.875rem;line-height:1;color:var(--color-eidola-mist)}.shrine-awaken-btn{width:min(100%,280px);margin-top:4px}.shrine-setup-hint{margin:0;font-family:var(--font-code);font-size:.75rem;color:var(--color-eidola-stone);text-align:center}.shrine-setup-hint kbd{display:inline-block;padding:.1em .45em;border:1px solid rgba(201,168,76,.2);border-radius:4px;font-family:inherit;font-size:.85em;color:var(--color-eidola-mist);background:#0c0c1499}html.shrine-awakened .shrine-setup,html.shrine-kraken .shrine-setup,html.shrine-awakened .shrine-atmosphere{display:none}html.shrine-awakened .shrine-root,html.shrine-kraken .shrine-root{display:flex}html:not(.shrine-awakened):not(.shrine-kraken) [data-shrine-vessel]{display:none}.shrine-atmosphere{position:fixed;inset:0;pointer-events:none;overflow:hidden;z-index:0}.god-rays{position:absolute;inset:0;pointer-events:none;overflow:hidden}.god-rays:before{content:"";position:absolute;top:-40%;left:50%;width:200%;height:180%;transform:translate(-50%);transform-origin:50% 0%;background:conic-gradient(from 180deg at 50% 0%,transparent 0deg,rgba(201,168,76,.04) 30deg,transparent 60deg,rgba(201,168,76,.03) 120deg,transparent 180deg,rgba(201,168,76,.04) 240deg,transparent 300deg);animation:god-ray-drift 240s linear infinite}.god-rays:after{content:"";position:absolute;top:0;left:50%;width:100%;height:100%;transform:translate(-50%);background:radial-gradient(ellipse 70% 50% at 50% 0%,rgba(201,168,76,.12) 0%,rgba(201,168,76,.04) 35%,transparent 70%);animation:rayPulse 8s ease-in-out infinite alternate}@keyframes god-ray-drift{to{transform:translate(-50%) rotate(360deg)}}@keyframes rayPulse{0%{opacity:.65}to{opacity:1}}.particle-field{position:absolute;inset:0;pointer-events:none;overflow:hidden}.particle{position:absolute;width:2px;height:2px;background:#c9a84c;image-rendering:pixelated;animation:particleFloat linear infinite backwards}@keyframes particleFloat{0%{transform:translateY(100vh);opacity:0}8%{opacity:1}to{transform:translateY(-8vh);opacity:0}}.landing-vignette{position:absolute;inset:0;background:radial-gradient(ellipse 80% 70% at 50% 40%,transparent 0%,rgba(6,6,10,.3) 55%,rgba(6,6,10,.7) 100%)}.noise-overlay{position:absolute;inset:0;opacity:.015;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='1'/%3E%3C/svg%3E");background-repeat:repeat;background-size:256px 256px}.text-gold-gradient{background:linear-gradient(105deg,#7a5c1e,#c9a84c 18%,#f0d080,#e8923a 46%,#c9a84c 58%,#f0d080 72%,#7a5c1e);background-size:200% auto;-webkit-background-clip:text;background-clip:text;color:transparent;animation:goldShimmer 8s linear infinite}@keyframes goldShimmer{to{background-position:200% center}}.btn-divine,.btn-ignite{display:inline-flex;align-items:center;justify-content:center;gap:.35rem;padding:.75rem 1.5rem;border-radius:.5rem;font-family:var(--font-code);font-size:.75rem;font-weight:600;letter-spacing:.08em;text-transform:uppercase;cursor:pointer;text-decoration:none;transition:box-shadow .16s ease,background .16s ease,color .16s ease,border-color .16s ease}.btn-divine{border:1px solid transparent;background:linear-gradient(135deg,#8a7333,#c9a84c,#a88a3a);color:var(--color-obsidian)}.btn-divine:hover:not(:disabled){box-shadow:0 0 30px -5px #c9a84c4d,0 0 60px -10px #c9a84c26}.btn-ignite{border:1px solid rgba(201,168,76,.35);background:var(--color-void);color:var(--color-gold)}.btn-ignite:hover{color:var(--color-void);border-color:#e3c96e99;background:linear-gradient(135deg,#8a7333,#c9a84c,#a88a3a)}.btn-nav{min-height:44px}.btn-nav-pair{width:9.5rem}.shrine-root{position:relative;z-index:2;width:100%;height:100%;display:flex;flex-direction:column;background:transparent;overflow:hidden;cursor:default}.vessel-stage{position:relative;flex:1 1 auto;width:100%;min-height:0;display:flex;align-items:center;justify-content:center;padding:0;background-color:var(--shrine-bg, var(--color-input));transition:background-color var(--crossfade-ms, .3s) ease-in-out}html:not(.shrine-kraken)[data-aspect-ratio=widescreen-16-9] .shrine-root,html:not(.shrine-kraken)[data-aspect-ratio=square-1-1] .shrine-root{align-items:center;justify-content:center;padding:72px 24px 24px}html:not(.shrine-kraken)[data-aspect-ratio=widescreen-16-9] .vessel-stage{flex:0 0 auto;aspect-ratio:16 / 9;width:min(calc(100vw - 48px),calc((100vh - 96px) * 16 / 9));max-width:calc(100vw - 48px);max-height:calc(100vh - 96px);border:1px solid rgba(201,168,76,.1);border-radius:12px;overflow:hidden;box-shadow:0 0 40px -10px #c9a84c1f}html:not(.shrine-kraken)[data-aspect-ratio=square-1-1] .vessel-stage{flex:0 0 auto;aspect-ratio:1 / 1;width:min(calc(100vw - 48px),calc(100vh - 96px));max-width:calc(100vw - 48px);max-height:calc(100vh - 96px);border:1px solid rgba(201,168,76,.1);border-radius:12px;overflow:hidden;box-shadow:0 0 40px -10px #c9a84c1f}.vessel-layers{position:relative;width:100%;height:100%;margin:0;display:flex;align-items:center;justify-content:center;pointer-events:none}.vessel-layer{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;transition:opacity .01s linear;pointer-events:none}.vessel-layer svg,.vessel-layer canvas{display:block;width:100%!important;height:100%!important;max-width:100%;max-height:100%;object-fit:fill}.shrine-dev-flag{position:absolute;right:14px;bottom:10px;z-index:10;font-family:var(--font-code);font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:lowercase;color:#e8e4dc73;pointer-events:none;-webkit-user-select:none;user-select:none}.shrine-control-panel{width:100%;padding:20px}.shrine-settings-options{display:flex;flex-wrap:wrap;gap:12px}.shrine-option-btn{flex-direction:column}.shrine-option-label{font-size:.875rem}.shrine-option-hint{font-family:var(--font-body);font-size:.6875rem;letter-spacing:.02em;opacity:.8;text-transform:none;font-weight:400}html.shrine-kraken,html.shrine-kraken body{background-color:#000}html.shrine-kraken .shrine-chrome,html.shrine-kraken .shrine-atmosphere{display:none}html.shrine-kraken .shrine-root{width:100%;height:100%;align-items:center;justify-content:center;padding:0}html.shrine-kraken .vessel-stage{flex:0 0 auto;width:min(100vw,100vh);height:min(100vw,100vh);max-width:640px;max-height:640px;aspect-ratio:1 / 1;border-radius:50%;clip-path:circle(50%);overflow:hidden;background-color:var(--shrine-bg, #000000)}html.shrine-kraken .vessel-layers,html.shrine-kraken .vessel-layer{border-radius:50%}.kraken-setup-field{display:grid;gap:8px;margin-bottom:16px}.kraken-setup-field span{font-family:var(--font-display);font-size:.8125rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--color-gold-dim)}.kraken-setup-field input{width:100%;padding:10px 12px;border:1px solid rgba(201,168,76,.1);border-radius:8px;background:var(--color-input-focus);color:var(--color-frost);font-family:var(--font-code);font-size:.8125rem}.kraken-setup-actions{display:flex;flex-wrap:wrap;gap:12px;margin-top:8px}.kraken-setup-actions a{text-decoration:none}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
+
<meta
|
|
7
|
+
http-equiv="Content-Security-Policy"
|
|
8
|
+
content="default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com; connect-src 'self'; img-src 'self' data:;"
|
|
9
|
+
/>
|
|
10
|
+
<title>Eidola Shrine</title>
|
|
11
|
+
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
12
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
|
13
|
+
<link
|
|
14
|
+
href="https://fonts.googleapis.com/css2?family=Cinzel:wght@500;600&family=Cormorant+Garamond:ital,wght@0,500;0,600;1,500&family=Inter:wght@400;500&family=JetBrains+Mono:wght@500;600;700&family=Press+Start+2P&display=swap"
|
|
15
|
+
rel="stylesheet"
|
|
16
|
+
/>
|
|
17
|
+
<script type="module" crossorigin src="./assets/index-C44XsM0B.js"></script>
|
|
18
|
+
<link rel="stylesheet" crossorigin href="./assets/index-DeRYP3aH.css">
|
|
19
|
+
</head>
|
|
20
|
+
<body>
|
|
21
|
+
<div class="shrine-setup" data-shrine-setup></div>
|
|
22
|
+
<div class="shrine-root hidden" data-shrine-vessel>
|
|
23
|
+
<div class="vessel-stage">
|
|
24
|
+
<div class="vessel-layers">
|
|
25
|
+
<div class="vessel-layer vessel-layer-a"></div>
|
|
26
|
+
<div class="vessel-layer vessel-layer-b"></div>
|
|
27
|
+
</div>
|
|
28
|
+
<span class="shrine-dev-flag" aria-hidden="true">—</span>
|
|
29
|
+
</div>
|
|
30
|
+
</div>
|
|
31
|
+
</body>
|
|
32
|
+
</html>
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { EidolaRuntimeConfig } from '@eidola/mcp';
|
|
2
|
+
import { type ShrineAspectRatioId, type ShrineSurfaceModeId } from '../shared/shrine-display-config.js';
|
|
3
|
+
import type { ShrineSurface } from '../shared/shrine-surface.js';
|
|
4
|
+
export interface ShrineDisplayState {
|
|
5
|
+
aspectRatio: ShrineAspectRatioId;
|
|
6
|
+
surfaceMode: ShrineSurfaceModeId;
|
|
7
|
+
width: number;
|
|
8
|
+
height: number;
|
|
9
|
+
surface: ShrineSurface;
|
|
10
|
+
}
|
|
11
|
+
export declare function loadDisplayState(runtime: EidolaRuntimeConfig): ShrineDisplayState;
|
|
12
|
+
export declare function loadDisplayStateAsync(runtime: EidolaRuntimeConfig): Promise<ShrineDisplayState>;
|
|
13
|
+
export declare function persistDisplayState(runtime: EidolaRuntimeConfig, patch: {
|
|
14
|
+
aspectRatio?: string;
|
|
15
|
+
surfaceMode?: string;
|
|
16
|
+
}): Promise<ShrineDisplayState | {
|
|
17
|
+
error: string;
|
|
18
|
+
}>;
|
|
19
|
+
export declare function displayStateToJson(state: ShrineDisplayState): Record<string, unknown>;
|
|
20
|
+
//# sourceMappingURL=display-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"display-config.d.ts","sourceRoot":"","sources":["../../src/server/display-config.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAML,KAAK,mBAAmB,EAExB,KAAK,mBAAmB,EACzB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAEjE,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,mBAAmB,CAAC;IACjC,WAAW,EAAE,mBAAmB,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,aAAa,CAAC;CACxB;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,mBAAmB,GAAG,kBAAkB,CAEjF;AAED,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAiBrG;AAmBD,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,mBAAmB,EAC5B,KAAK,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GACpD,OAAO,CAAC,kBAAkB,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAwDjD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAUrF"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { readWorkspaceConfig, writeWorkspaceConfig } from '@eidola/mcp';
|
|
2
|
+
import { composeShrineSurface, legacyShrineSurfaceValue, normalizeAspectRatioInput, normalizeSurfaceModeInput, resolveDisplayConfig, } from '../shared/shrine-display-config.js';
|
|
3
|
+
export function loadDisplayState(runtime) {
|
|
4
|
+
return loadDisplayStateSync(runtime);
|
|
5
|
+
}
|
|
6
|
+
export async function loadDisplayStateAsync(runtime) {
|
|
7
|
+
let workspaceConfig = null;
|
|
8
|
+
if (runtime.workspaceRoot) {
|
|
9
|
+
try {
|
|
10
|
+
workspaceConfig = await readWorkspaceConfig(runtime.workspaceRoot);
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
workspaceConfig = null;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
const config = resolveDisplayConfig({
|
|
17
|
+
aspectRatio: workspaceConfig?.shrine_aspect_ratio,
|
|
18
|
+
surfaceMode: workspaceConfig?.shrine_surface_mode,
|
|
19
|
+
legacySurface: workspaceConfig?.shrine_surface,
|
|
20
|
+
});
|
|
21
|
+
return toDisplayState(config);
|
|
22
|
+
}
|
|
23
|
+
function loadDisplayStateSync(runtime) {
|
|
24
|
+
const config = resolveDisplayConfig({});
|
|
25
|
+
void runtime;
|
|
26
|
+
return toDisplayState(config);
|
|
27
|
+
}
|
|
28
|
+
function toDisplayState(config) {
|
|
29
|
+
const surface = composeShrineSurface(config);
|
|
30
|
+
return {
|
|
31
|
+
aspectRatio: config.aspectRatio,
|
|
32
|
+
surfaceMode: config.surfaceMode,
|
|
33
|
+
width: config.width,
|
|
34
|
+
height: config.height,
|
|
35
|
+
surface,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
export async function persistDisplayState(runtime, patch) {
|
|
39
|
+
const existing = runtime.workspaceRoot ? await readWorkspaceConfig(runtime.workspaceRoot) : null;
|
|
40
|
+
const current = resolveDisplayConfig({
|
|
41
|
+
aspectRatio: existing?.shrine_aspect_ratio,
|
|
42
|
+
surfaceMode: existing?.shrine_surface_mode,
|
|
43
|
+
legacySurface: existing?.shrine_surface,
|
|
44
|
+
});
|
|
45
|
+
const aspectRatio = patch.aspectRatio !== undefined
|
|
46
|
+
? normalizeAspectRatioInput(patch.aspectRatio)
|
|
47
|
+
: current.aspectRatio;
|
|
48
|
+
const surfaceMode = patch.surfaceMode !== undefined
|
|
49
|
+
? normalizeSurfaceModeInput(patch.surfaceMode)
|
|
50
|
+
: current.surfaceMode;
|
|
51
|
+
if (!aspectRatio) {
|
|
52
|
+
return { error: 'invalid_aspect_ratio' };
|
|
53
|
+
}
|
|
54
|
+
if (!surfaceMode) {
|
|
55
|
+
return { error: 'invalid_surface_mode' };
|
|
56
|
+
}
|
|
57
|
+
const preset = resolveDisplayConfig({
|
|
58
|
+
aspectRatio,
|
|
59
|
+
surfaceMode,
|
|
60
|
+
});
|
|
61
|
+
const nextConfig = {
|
|
62
|
+
aspectRatio,
|
|
63
|
+
surfaceMode,
|
|
64
|
+
width: preset.width,
|
|
65
|
+
height: preset.height,
|
|
66
|
+
};
|
|
67
|
+
if (runtime.workspaceRoot) {
|
|
68
|
+
const merged = {
|
|
69
|
+
...(existing ?? {
|
|
70
|
+
active_engram_id: 'camina-drummer',
|
|
71
|
+
soul_hash: '',
|
|
72
|
+
compiled_at: new Date().toISOString(),
|
|
73
|
+
}),
|
|
74
|
+
shrine_aspect_ratio: nextConfig.aspectRatio,
|
|
75
|
+
shrine_surface_mode: nextConfig.surfaceMode,
|
|
76
|
+
shrine_surface: legacyShrineSurfaceValue(nextConfig),
|
|
77
|
+
};
|
|
78
|
+
try {
|
|
79
|
+
await writeWorkspaceConfig(runtime.workspaceRoot, merged);
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
return { error: 'write_failed' };
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return toDisplayState(nextConfig);
|
|
86
|
+
}
|
|
87
|
+
export function displayStateToJson(state) {
|
|
88
|
+
return {
|
|
89
|
+
aspectRatio: state.aspectRatio,
|
|
90
|
+
surfaceMode: state.surfaceMode,
|
|
91
|
+
width: state.width,
|
|
92
|
+
height: state.height,
|
|
93
|
+
surface: state.surface.preset,
|
|
94
|
+
circularMask: Boolean(state.surface.circularMask),
|
|
95
|
+
layoutTier: state.surface.layoutTier ?? null,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=display-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"display-config.js","sourceRoot":"","sources":["../../src/server/display-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { type ShrineSurface } from '../shared/shrine-surface.js';
|
|
2
|
+
export interface ShrineHttpServerOptions {
|
|
3
|
+
port?: number;
|
|
4
|
+
surface?: ShrineSurface;
|
|
5
|
+
rendererDir?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare class ShrineHttpServer {
|
|
8
|
+
private readonly port;
|
|
9
|
+
private readonly surface;
|
|
10
|
+
private readonly rendererDir;
|
|
11
|
+
private readonly runtime;
|
|
12
|
+
private readonly resolver;
|
|
13
|
+
private session;
|
|
14
|
+
private stateSocketServer;
|
|
15
|
+
private socketClient;
|
|
16
|
+
private sseClients;
|
|
17
|
+
private nextClientId;
|
|
18
|
+
private server;
|
|
19
|
+
constructor(options?: ShrineHttpServerOptions);
|
|
20
|
+
start(): Promise<void>;
|
|
21
|
+
stop(): void;
|
|
22
|
+
private startStateBridge;
|
|
23
|
+
private handleBroadcast;
|
|
24
|
+
private buildHttpStatePayload;
|
|
25
|
+
private sendReadyPayloads;
|
|
26
|
+
private broadcastSse;
|
|
27
|
+
private handleRequest;
|
|
28
|
+
private handleListEidolons;
|
|
29
|
+
private handleAwaken;
|
|
30
|
+
private handleSse;
|
|
31
|
+
private serveVessel;
|
|
32
|
+
private serveFile;
|
|
33
|
+
}
|
|
34
|
+
export declare function startShrineHttpServer(options?: ShrineHttpServerOptions): Promise<ShrineHttpServer>;
|
|
35
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAwC,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAwBvG,MAAM,WAAW,uBAAuB;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IACxC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgC;IACxD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiB;IAC1C,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,iBAAiB,CAAkC;IAC3D,OAAO,CAAC,YAAY,CAAkC;IACtD,OAAO,CAAC,UAAU,CAAgC;IAClD,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,MAAM,CAEX;gBAES,OAAO,GAAE,uBAA4B;IAO3C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAe5B,IAAI,IAAI,IAAI;YAWE,gBAAgB;YAyChB,eAAe;YAYf,qBAAqB;YAerB,iBAAiB;IAwB/B,OAAO,CAAC,YAAY;YAON,aAAa;YA0Db,kBAAkB;YAelB,YAAY;IAkE1B,OAAO,CAAC,SAAS;YAgBH,WAAW;YAWX,SAAS;CAkBxB;AAcD,wBAAsB,qBAAqB,CAAC,OAAO,CAAC,EAAE,uBAAuB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAIxG"}
|
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
import { createServer } from 'node:http';
|
|
2
|
+
import { createReadStream } from 'node:fs';
|
|
3
|
+
import { access, stat } from 'node:fs/promises';
|
|
4
|
+
import { join, extname, normalize, dirname } from 'node:path';
|
|
5
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
6
|
+
import { resolveEidolaRuntimeConfig, createStateSocketServer, SessionState, autoActivateFromWorkspace, listEngramDirectories, resolveEngramDirectory } from '../../index.js';
|
|
7
|
+
import { resolveShrineSurface, shrineHttpPort } from '../shared/shrine-surface.js';
|
|
8
|
+
import { toHttpClipUrl } from '../shared/types.js';
|
|
9
|
+
import { StateSocketClient } from '../shared/state-socket-client.js';
|
|
10
|
+
import { createDefaultResolver } from '../shared/vessel-resolver.js';
|
|
11
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
12
|
+
const MIME = {
|
|
13
|
+
'.html': 'text/html; charset=utf-8',
|
|
14
|
+
'.js': 'text/javascript; charset=utf-8',
|
|
15
|
+
'.css': 'text/css; charset=utf-8',
|
|
16
|
+
'.json': 'application/json',
|
|
17
|
+
'.png': 'image/png',
|
|
18
|
+
'.webp': 'image/webp',
|
|
19
|
+
'.gif': 'image/gif',
|
|
20
|
+
'.svg': 'image/svg+xml',
|
|
21
|
+
'.woff2': 'font/woff2',
|
|
22
|
+
};
|
|
23
|
+
export class ShrineHttpServer {
|
|
24
|
+
port;
|
|
25
|
+
surface;
|
|
26
|
+
rendererDir;
|
|
27
|
+
runtime = resolveEidolaRuntimeConfig();
|
|
28
|
+
resolver;
|
|
29
|
+
session = null;
|
|
30
|
+
stateSocketServer = null;
|
|
31
|
+
socketClient = null;
|
|
32
|
+
sseClients = new Map();
|
|
33
|
+
nextClientId = 1;
|
|
34
|
+
server = createServer((req, res) => {
|
|
35
|
+
void this.handleRequest(req, res);
|
|
36
|
+
});
|
|
37
|
+
constructor(options = {}) {
|
|
38
|
+
this.port = options.port ?? shrineHttpPort();
|
|
39
|
+
this.surface = options.surface ?? resolveShrineSurface();
|
|
40
|
+
this.rendererDir = options.rendererDir ?? join(__dirname, '../renderer');
|
|
41
|
+
this.resolver = createDefaultResolver();
|
|
42
|
+
}
|
|
43
|
+
async start() {
|
|
44
|
+
await new Promise((resolve, reject) => {
|
|
45
|
+
this.server.once('error', reject);
|
|
46
|
+
this.server.listen(this.port, '127.0.0.1', () => {
|
|
47
|
+
this.server.off('error', reject);
|
|
48
|
+
resolve();
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
await this.startStateBridge();
|
|
52
|
+
console.log(`[eidola-shrine:http] ${this.surface.preset} ${this.surface.width}×${this.surface.height} at http://127.0.0.1:${this.port}/shrine`);
|
|
53
|
+
}
|
|
54
|
+
stop() {
|
|
55
|
+
this.socketClient?.stop();
|
|
56
|
+
void this.stateSocketServer?.close();
|
|
57
|
+
this.stateSocketServer = null;
|
|
58
|
+
for (const client of this.sseClients.values()) {
|
|
59
|
+
client.res.end();
|
|
60
|
+
}
|
|
61
|
+
this.sseClients.clear();
|
|
62
|
+
this.server.close();
|
|
63
|
+
}
|
|
64
|
+
async startStateBridge() {
|
|
65
|
+
const session = new SessionState();
|
|
66
|
+
this.session = session;
|
|
67
|
+
this.stateSocketServer = createStateSocketServer(session, {
|
|
68
|
+
host: this.runtime.stateSocketHost,
|
|
69
|
+
port: this.runtime.stateSocketPort,
|
|
70
|
+
bufferSize: this.runtime.stateBufferSize,
|
|
71
|
+
onWarn: (message) => {
|
|
72
|
+
console.error('[eidola-shrine:state-socket]', message);
|
|
73
|
+
},
|
|
74
|
+
onReassertVessel: async () => {
|
|
75
|
+
await session.reloadActive();
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
const address = await this.stateSocketServer.start();
|
|
79
|
+
if (address.listening) {
|
|
80
|
+
const activation = await autoActivateFromWorkspace(this.runtime, session, this.stateSocketServer);
|
|
81
|
+
if (activation.activated) {
|
|
82
|
+
console.log(`[eidola-shrine:state-socket] ${address.host}:${address.port} · ${activation.engramId ?? 'engram'}`);
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
console.log(`[eidola-shrine:state-socket] ${address.host}:${address.port}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
console.warn(`[eidola-shrine:state-socket] port ${this.runtime.stateSocketPort} in use — subscribing only`);
|
|
90
|
+
}
|
|
91
|
+
this.socketClient = new StateSocketClient({
|
|
92
|
+
host: this.runtime.stateSocketHost,
|
|
93
|
+
port: address.port,
|
|
94
|
+
onBroadcast: (broadcast) => {
|
|
95
|
+
void this.handleBroadcast(broadcast);
|
|
96
|
+
},
|
|
97
|
+
});
|
|
98
|
+
this.socketClient.start();
|
|
99
|
+
}
|
|
100
|
+
async handleBroadcast(broadcast) {
|
|
101
|
+
const config = await this.resolver.syncEngram(broadcast.engram_id);
|
|
102
|
+
if (config) {
|
|
103
|
+
this.broadcastSse('vessel-config', config);
|
|
104
|
+
}
|
|
105
|
+
const payload = await this.buildHttpStatePayload(broadcast, 'socket');
|
|
106
|
+
if (payload) {
|
|
107
|
+
this.broadcastSse('state', payload);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
async buildHttpStatePayload(broadcast, source) {
|
|
111
|
+
const payload = await this.resolver.buildStatePayload(broadcast, source);
|
|
112
|
+
if (!payload) {
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
...payload,
|
|
117
|
+
clipUrl: toHttpClipUrl(payload.clipUrl),
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
async sendReadyPayloads() {
|
|
121
|
+
this.broadcastSse('surface', { surface: this.surface });
|
|
122
|
+
const active = this.session?.getActive();
|
|
123
|
+
if (!active) {
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
const config = this.resolver.getConfig() ?? (await this.resolver.syncEngram(active.engram.id));
|
|
127
|
+
if (config) {
|
|
128
|
+
this.broadcastSse('vessel-config', config);
|
|
129
|
+
}
|
|
130
|
+
const idleRaw = await this.resolver.buildIdlePayload({
|
|
131
|
+
protocol_version: '1.0',
|
|
132
|
+
ts: Date.now(),
|
|
133
|
+
engram_id: active.engram.id,
|
|
134
|
+
});
|
|
135
|
+
if (idleRaw) {
|
|
136
|
+
this.broadcastSse('state', { ...idleRaw, clipUrl: toHttpClipUrl(idleRaw.clipUrl) });
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
broadcastSse(type, payload) {
|
|
140
|
+
const data = JSON.stringify({ type, payload });
|
|
141
|
+
for (const client of this.sseClients.values()) {
|
|
142
|
+
client.res.write(`data: ${data}\n\n`);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
async handleRequest(req, res) {
|
|
146
|
+
const url = new URL(req.url ?? '/', `http://127.0.0.1:${this.port}`);
|
|
147
|
+
const pathname = decodeURIComponent(url.pathname);
|
|
148
|
+
if (req.method === 'GET' && pathname === '/shrine/api/eidolons') {
|
|
149
|
+
await this.handleListEidolons(res);
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
if (req.method === 'POST' && pathname === '/shrine/api/awaken') {
|
|
153
|
+
await this.handleAwaken(req, res);
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
if (req.method === 'GET' && pathname === '/shrine/events') {
|
|
157
|
+
this.handleSse(res);
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
if (req.method === 'POST' && pathname === '/shrine/ready') {
|
|
161
|
+
await this.sendReadyPayloads();
|
|
162
|
+
res.writeHead(204);
|
|
163
|
+
res.end();
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
if (req.method === 'GET' && pathname.startsWith('/vessels/')) {
|
|
167
|
+
await this.serveVessel(pathname.slice('/vessels/'.length), res);
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
if (req.method === 'GET' && pathname === '/shrine') {
|
|
171
|
+
res.writeHead(301, { Location: `/shrine/${url.search}` });
|
|
172
|
+
res.end();
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
if (req.method === 'GET' && pathname === '/shrine/') {
|
|
176
|
+
await this.serveFile(join(this.rendererDir, 'index.html'), res);
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
if (req.method === 'GET' && pathname.startsWith('/shrine/')) {
|
|
180
|
+
const assetPath = pathname.slice('/shrine/'.length);
|
|
181
|
+
await this.serveFile(join(this.rendererDir, assetPath), res);
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
if (req.method === 'GET' && pathname === '/health') {
|
|
185
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
186
|
+
res.end(JSON.stringify({ ok: true, surface: this.surface.preset }));
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
res.writeHead(404);
|
|
190
|
+
res.end('Not found');
|
|
191
|
+
}
|
|
192
|
+
async handleListEidolons(res) {
|
|
193
|
+
const entries = await listEngramDirectories(this.runtime.engramsDir);
|
|
194
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
195
|
+
res.end(JSON.stringify({
|
|
196
|
+
ok: true,
|
|
197
|
+
eidolons: entries.map((entry) => ({
|
|
198
|
+
id: entry.id,
|
|
199
|
+
name: entry.name ?? entry.id,
|
|
200
|
+
description: entry.description,
|
|
201
|
+
})),
|
|
202
|
+
}));
|
|
203
|
+
}
|
|
204
|
+
async handleAwaken(req, res) {
|
|
205
|
+
let body;
|
|
206
|
+
try {
|
|
207
|
+
body = JSON.parse(await readRequestBody(req));
|
|
208
|
+
}
|
|
209
|
+
catch {
|
|
210
|
+
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
211
|
+
res.end(JSON.stringify({ ok: false, error: 'Invalid JSON body.' }));
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
const engramId = body.engram_id?.trim();
|
|
215
|
+
if (!engramId) {
|
|
216
|
+
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
217
|
+
res.end(JSON.stringify({ ok: false, error: 'engram_id is required.' }));
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
if (!this.session) {
|
|
221
|
+
res.writeHead(503, { 'Content-Type': 'application/json' });
|
|
222
|
+
res.end(JSON.stringify({ ok: false, error: 'Session not ready.' }));
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
if (body.aspect?.trim()) {
|
|
226
|
+
process.env.EIDOLA_SHRINE_SURFACE = body.aspect.trim();
|
|
227
|
+
}
|
|
228
|
+
let directory;
|
|
229
|
+
try {
|
|
230
|
+
directory = resolveEngramDirectory(this.runtime.engramsDir, engramId);
|
|
231
|
+
}
|
|
232
|
+
catch (error) {
|
|
233
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
234
|
+
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
235
|
+
res.end(JSON.stringify({ ok: false, error: message }));
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
try {
|
|
239
|
+
await this.session.load(directory, 'injection');
|
|
240
|
+
}
|
|
241
|
+
catch (error) {
|
|
242
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
243
|
+
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
244
|
+
res.end(JSON.stringify({ ok: false, error: message }));
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
const config = await this.resolver.syncEngram(engramId);
|
|
248
|
+
if (config) {
|
|
249
|
+
this.broadcastSse('vessel-config', config);
|
|
250
|
+
}
|
|
251
|
+
this.stateSocketServer?.broadcastState({ state: 'idle', surface: 'manual' });
|
|
252
|
+
const idleRaw = await this.resolver.buildIdlePayload({
|
|
253
|
+
protocol_version: '1.0',
|
|
254
|
+
ts: Date.now(),
|
|
255
|
+
engram_id: engramId,
|
|
256
|
+
});
|
|
257
|
+
if (idleRaw) {
|
|
258
|
+
this.broadcastSse('state', { ...idleRaw, clipUrl: toHttpClipUrl(idleRaw.clipUrl) });
|
|
259
|
+
}
|
|
260
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
261
|
+
res.end(JSON.stringify({ ok: true, engram_id: engramId }));
|
|
262
|
+
}
|
|
263
|
+
handleSse(res) {
|
|
264
|
+
res.writeHead(200, {
|
|
265
|
+
'Content-Type': 'text/event-stream',
|
|
266
|
+
'Cache-Control': 'no-cache',
|
|
267
|
+
Connection: 'keep-alive',
|
|
268
|
+
});
|
|
269
|
+
res.write('\n');
|
|
270
|
+
const id = this.nextClientId++;
|
|
271
|
+
this.sseClients.set(id, { id, res });
|
|
272
|
+
reqOnClose(res, () => {
|
|
273
|
+
this.sseClients.delete(id);
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
async serveVessel(relativePath, res) {
|
|
277
|
+
const safe = normalize(relativePath).replace(/^(\.\.(\/|\\|$))+/, '');
|
|
278
|
+
const filePath = join(this.runtime.vesselsDir, safe);
|
|
279
|
+
if (!filePath.startsWith(this.runtime.vesselsDir)) {
|
|
280
|
+
res.writeHead(403);
|
|
281
|
+
res.end('Forbidden');
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
await this.serveFile(filePath, res);
|
|
285
|
+
}
|
|
286
|
+
async serveFile(filePath, res) {
|
|
287
|
+
try {
|
|
288
|
+
await access(filePath);
|
|
289
|
+
const fileStat = await stat(filePath);
|
|
290
|
+
if (fileStat.isDirectory()) {
|
|
291
|
+
res.writeHead(404);
|
|
292
|
+
res.end('Not found');
|
|
293
|
+
return;
|
|
294
|
+
}
|
|
295
|
+
const ext = extname(filePath).toLowerCase();
|
|
296
|
+
res.writeHead(200, { 'Content-Type': MIME[ext] ?? 'application/octet-stream' });
|
|
297
|
+
createReadStream(filePath).pipe(res);
|
|
298
|
+
}
|
|
299
|
+
catch {
|
|
300
|
+
res.writeHead(404);
|
|
301
|
+
res.end('Not found');
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
function reqOnClose(res, onClose) {
|
|
306
|
+
res.on('close', onClose);
|
|
307
|
+
}
|
|
308
|
+
async function readRequestBody(req) {
|
|
309
|
+
const chunks = [];
|
|
310
|
+
for await (const chunk of req) {
|
|
311
|
+
chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
|
|
312
|
+
}
|
|
313
|
+
return Buffer.concat(chunks).toString('utf8');
|
|
314
|
+
}
|
|
315
|
+
export async function startShrineHttpServer(options) {
|
|
316
|
+
const server = new ShrineHttpServer(options);
|
|
317
|
+
await server.start();
|
|
318
|
+
return server;
|
|
319
|
+
}
|
|
320
|
+
async function main() {
|
|
321
|
+
const server = await startShrineHttpServer();
|
|
322
|
+
const shutdown = () => {
|
|
323
|
+
server.stop();
|
|
324
|
+
process.exit(0);
|
|
325
|
+
};
|
|
326
|
+
process.on('SIGINT', shutdown);
|
|
327
|
+
process.on('SIGTERM', shutdown);
|
|
328
|
+
}
|
|
329
|
+
const isDirectRun = typeof process.argv[1] === 'string' &&
|
|
330
|
+
import.meta.url === pathToFileURL(process.argv[1]).href;
|
|
331
|
+
if (isDirectRun) {
|
|
332
|
+
main().catch((error) => {
|
|
333
|
+
console.error('[eidola-shrine:http] failed to start', error);
|
|
334
|
+
process.exit(1);
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/** Shell / MCP tools that may block on Shaper approval — arms approval-idle timer. */
|
|
2
|
+
export declare function isGatedApprovalTool(tool?: string): boolean;
|
|
3
|
+
export declare function isTurnEndState(state: string, inTurn: boolean): boolean;
|
|
4
|
+
export declare function shouldArmApprovalIdleTimer(inTurn: boolean, state: string, tool?: string): boolean;
|
|
5
|
+
export interface ApprovalIdleEvent {
|
|
6
|
+
atMs: number;
|
|
7
|
+
state: string;
|
|
8
|
+
tool?: string;
|
|
9
|
+
source?: string;
|
|
10
|
+
}
|
|
11
|
+
/** Pure timeline: when silence after gated working exceeds threshold → waiting. */
|
|
12
|
+
export declare function simulateApprovalIdleTimeline(events: readonly ApprovalIdleEvent[], approvalIdleMs: number): Array<{
|
|
13
|
+
state: string;
|
|
14
|
+
source: string;
|
|
15
|
+
atMs: number;
|
|
16
|
+
}>;
|
|
17
|
+
//# sourceMappingURL=approval-idle-logic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approval-idle-logic.d.ts","sourceRoot":"","sources":["../../src/shared/approval-idle-logic.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF,wBAAgB,mBAAmB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAU1D;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAMtE;AAED,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,OAAO,EACf,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAMT;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,mFAAmF;AACnF,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,SAAS,iBAAiB,EAAE,EACpC,cAAc,EAAE,MAAM,GACrB,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CA+CxD"}
|