@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 @@
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"}