miki-moni 0.3.1

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 (53) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +283 -0
  3. package/README.zh-CN.md +275 -0
  4. package/README.zh-TW.md +275 -0
  5. package/bin/miki.mjs +49 -0
  6. package/dist/web/assets/favicon-DFpLtP36.svg +13 -0
  7. package/dist/web/assets/index--89DkyV1.css +1 -0
  8. package/dist/web/assets/index-CyPlxvOn.js +64 -0
  9. package/dist/web/index.html +20 -0
  10. package/dist/web/pair-info.html +138 -0
  11. package/dist/web-phone/assets/app-CyQWCdKZ.js +64 -0
  12. package/dist/web-phone/assets/index-D5BUh7Uf.js +1 -0
  13. package/dist/web-phone/assets/index-D8vY_9ld.css +1 -0
  14. package/dist/web-phone/index.html +20 -0
  15. package/hooks/miki-emit.ps1 +56 -0
  16. package/package.json +89 -0
  17. package/shared/i18n.ts +915 -0
  18. package/src/cli/i18n-cli.ts +149 -0
  19. package/src/cli/miki.ts +168 -0
  20. package/src/cli/pair.ts +534 -0
  21. package/src/cli/prompt.ts +6 -0
  22. package/src/cli/pushable-iter.ts +45 -0
  23. package/src/cli/setup-self-host.ts +292 -0
  24. package/src/cli/setup-wizard.ts +130 -0
  25. package/src/cli/wrap.ts +742 -0
  26. package/src/config.ts +121 -0
  27. package/src/crypto.ts +66 -0
  28. package/src/data-dir.ts +31 -0
  29. package/src/ext-registry.ts +47 -0
  30. package/src/hook-handler.ts +86 -0
  31. package/src/index.ts +279 -0
  32. package/src/install-hooks.ts +107 -0
  33. package/src/notifier.ts +21 -0
  34. package/src/pairing.ts +100 -0
  35. package/src/protocol-ext.ts +46 -0
  36. package/src/relay-client.ts +468 -0
  37. package/src/relay-protocol.ts +57 -0
  38. package/src/server.ts +1134 -0
  39. package/src/session-resolver.ts +437 -0
  40. package/src/session-store.ts +131 -0
  41. package/src/types.ts +33 -0
  42. package/src/vscode-bridge.ts +407 -0
  43. package/src/wrap-process.ts +183 -0
  44. package/tools/tray.ps1 +286 -0
  45. package/worker/package.json +24 -0
  46. package/worker/src/daemon-relay.ts +348 -0
  47. package/worker/src/env.ts +11 -0
  48. package/worker/src/handshake.ts +63 -0
  49. package/worker/src/index.ts +81 -0
  50. package/worker/src/pairing-code.ts +39 -0
  51. package/worker/src/pairing-coordinator.ts +145 -0
  52. package/worker/wrangler-selfhost.toml +36 -0
  53. package/worker/wrangler.toml +29 -0
@@ -0,0 +1 @@
1
+ *,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.static{position:static}.sticky{position:sticky}.top-0{top:0}.mx-auto{margin-left:auto;margin-right:auto}.mb-2{margin-bottom:.5rem}.mb-6{margin-bottom:1.5rem}.ml-3{margin-left:.75rem}.ml-auto{margin-left:auto}.mt-1{margin-top:.25rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.flex{display:flex}.h-2\.5{height:.625rem}.h-3{height:.75rem}.h-px{height:1px}.max-h-64{max-height:16rem}.min-h-screen{min-height:100vh}.w-2\.5{width:.625rem}.w-3{width:.75rem}.w-full{width:100%}.max-w-2xl{max-width:42rem}.max-w-md{max-width:28rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.flex-shrink-0{flex-shrink:0}.resize-none{resize:none}.list-inside{list-style-position:inside}.list-disc{list-style-type:disc}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-red-800{--tw-border-opacity: 1;border-color:rgb(153 27 27 / var(--tw-border-opacity, 1))}.border-slate-700{--tw-border-opacity: 1;border-color:rgb(51 65 85 / var(--tw-border-opacity, 1))}.border-slate-800{--tw-border-opacity: 1;border-color:rgb(30 41 59 / var(--tw-border-opacity, 1))}.bg-amber-500{--tw-bg-opacity: 1;background-color:rgb(245 158 11 / var(--tw-bg-opacity, 1))}.bg-emerald-500{--tw-bg-opacity: 1;background-color:rgb(16 185 129 / var(--tw-bg-opacity, 1))}.bg-indigo-600{--tw-bg-opacity: 1;background-color:rgb(79 70 229 / var(--tw-bg-opacity, 1))}.bg-red-500{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.bg-red-950{--tw-bg-opacity: 1;background-color:rgb(69 10 10 / var(--tw-bg-opacity, 1))}.bg-slate-500{--tw-bg-opacity: 1;background-color:rgb(100 116 139 / var(--tw-bg-opacity, 1))}.bg-slate-700{--tw-bg-opacity: 1;background-color:rgb(51 65 85 / var(--tw-bg-opacity, 1))}.bg-slate-800{--tw-bg-opacity: 1;background-color:rgb(30 41 59 / var(--tw-bg-opacity, 1))}.bg-slate-900{--tw-bg-opacity: 1;background-color:rgb(15 23 42 / var(--tw-bg-opacity, 1))}.bg-slate-900\/50{background-color:#0f172a80}.bg-slate-950{--tw-bg-opacity: 1;background-color:rgb(2 6 23 / var(--tw-bg-opacity, 1))}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.text-left{text-align:left}.text-center{text-align:center}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.tracking-widest{letter-spacing:.1em}.text-amber-400{--tw-text-opacity: 1;color:rgb(251 191 36 / var(--tw-text-opacity, 1))}.text-indigo-400{--tw-text-opacity: 1;color:rgb(129 140 248 / var(--tw-text-opacity, 1))}.text-red-300{--tw-text-opacity: 1;color:rgb(252 165 165 / var(--tw-text-opacity, 1))}.text-red-400{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.text-slate-100{--tw-text-opacity: 1;color:rgb(241 245 249 / var(--tw-text-opacity, 1))}.text-slate-200{--tw-text-opacity: 1;color:rgb(226 232 240 / var(--tw-text-opacity, 1))}.text-slate-300{--tw-text-opacity: 1;color:rgb(203 213 225 / var(--tw-text-opacity, 1))}.text-slate-400{--tw-text-opacity: 1;color:rgb(148 163 184 / var(--tw-text-opacity, 1))}.text-slate-500{--tw-text-opacity: 1;color:rgb(100 116 139 / var(--tw-text-opacity, 1))}.text-slate-600{--tw-text-opacity: 1;color:rgb(71 85 105 / var(--tw-text-opacity, 1))}.text-slate-700{--tw-text-opacity: 1;color:rgb(51 65 85 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}:root{--sl1: #fcfcfd;--sl2: #f9f9fb;--sl3: #f0f0f3;--sl4: #e8e8ec;--sl5: #e0e1e6;--sl6: #d9d9e0;--sl7: #cdced6;--sl8: #b9bbc6;--sl9: #8b8d98;--sl10: #80828d;--sl11: #60646c;--sl12: #1c2024;--bg: #ffffff;--bg-elev: var(--sl1);--card: var(--sl2);--border: var(--sl4);--border-hi: var(--sl7);--fg: var(--sl12);--fg-muted: var(--sl11);--fg-subtle: var(--sl9);--btn-bg: var(--sl3);--cell-bg: rgba(255, 255, 255, .7);--cell-bg-hover: rgba(255, 255, 255, .95);--cell-bg-stale: rgba(252, 220, 230, .85);--cell-bg-stale-hover: rgba(248, 205, 220, .95);--pass: #1f7a4d;--warn: #a3661f;--neutral: #4b556a;--accent: #b3261e}[data-theme=dark]{--sl1: #000000;--sl2: #161618;--sl3: #1f2024;--sl4: #292a2f;--sl5: #3a3b40;--sl6: #4a4a4f;--sl7: #585860;--sl8: #6f6f76;--sl9: #858589;--sl10: #9f9fa3;--sl11: #c8c8c8;--sl12: #e6e6e6;--bg: var(--sl1);--bg-elev: var(--sl2);--card: var(--sl2);--border: var(--sl5);--border-hi: var(--sl6);--fg: var(--sl12);--fg-muted: var(--sl11);--fg-subtle: var(--sl9);--btn-bg: var(--sl3);--cell-bg: var(--sl2);--cell-bg-hover: var(--sl3);--cell-bg-stale: rgba(244, 71, 71, .1);--cell-bg-stale-hover: rgba(244, 71, 71, .16);--pass: #4ec9b0;--warn: #ce9178;--neutral: #569cd6;--accent: #f44747}*{box-sizing:border-box}html,body{margin:0;padding:0;background:var(--bg);color:var(--fg);font-family:Inter,Noto Sans TC,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-size:14px;line-height:1.5;font-feature-settings:"tnum" 1,"cv11" 1;-webkit-font-smoothing:antialiased}a{color:inherit;text-decoration:none}a:hover{color:var(--fg)}::-webkit-scrollbar{width:4px;height:4px}::-webkit-scrollbar-thumb{background:var(--sl7);border-radius:2px}::-webkit-scrollbar-thumb:hover{background:var(--sl9)}button{font-family:inherit;cursor:pointer}button:disabled{cursor:not-allowed;opacity:.5}input,textarea,select{font-family:inherit;font-size:13px;color:var(--fg);background:var(--bg);border:1px solid var(--border);border-radius:6px;padding:6px 10px;outline:none;transition:border-color .12s ease}input:hover,textarea:hover,select:hover{border-color:var(--border-hi)}input:focus,textarea:focus,select:focus{border-color:var(--sl8);box-shadow:0 0 0 2px var(--sl3)}textarea{resize:vertical}@media (pointer: coarse){input,textarea,select{font-size:16px!important}}.btn-ghost{display:inline-flex;align-items:center;gap:6px;background:transparent;color:var(--fg-muted);border:none;border-radius:6px;padding:5px 10px;font-size:13px;transition:background .12s ease,color .12s ease}.btn-ghost:hover{background:var(--sl3);color:var(--fg)}.btn-outline{display:inline-flex;align-items:center;gap:6px;height:34px;padding:0 12px;background:var(--bg);color:var(--fg);border:1px solid var(--border);border-radius:7px;font-size:13px;transition:border-color .12s ease,background .12s ease}.btn-outline:hover{border-color:var(--border-hi);background:var(--sl2)}.btn-primary{display:inline-flex;align-items:center;gap:6px;height:34px;padding:0 14px;background:var(--fg);color:var(--bg);border:none;border-radius:7px;font-size:13px;font-weight:500;transition:opacity .12s ease}.btn-primary:hover{opacity:.88}.btn-warn{display:inline-flex;align-items:center;gap:6px;height:34px;padding:0 14px;background:var(--accent);color:#fff;border:none;border-radius:7px;font-size:13px;font-weight:500;transition:opacity .12s ease}.btn-warn:hover{opacity:.9}.header-stat{display:inline-flex;align-items:center;gap:5px;padding:4px 9px;font-size:12px;color:var(--fg-muted);background:transparent;border:1px solid transparent;border-radius:6px;font-family:inherit;cursor:pointer;transition:background .12s ease,color .12s ease}.header-stat:hover,.header-stat.is-active{background:var(--sl3);color:var(--fg)}.header-stat strong{font-weight:600;font-variant-numeric:tabular-nums;color:var(--fg)}.header-stat .dot{width:6px;height:6px}.section-label{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.08em;color:var(--fg-subtle)}.card{background:var(--bg);border:1px solid var(--border);border-radius:8px;transition:border-color .12s ease}.card:hover{border-color:var(--border-hi)}.dot{display:inline-block;width:8px;height:8px;border-radius:50%;flex-shrink:0}.dot-active{background:var(--pass)}.dot-waiting{background:var(--warn)}.dot-idle{background:var(--neutral)}.dot-stale{background:var(--accent)}.toolbox{border:1px solid rgba(180,130,40,.22);border-radius:6px;overflow:hidden;background:transparent;font-size:12px}.toolbox-head{display:flex;align-items:center;gap:8px;padding:6px 10px;background:transparent;border-bottom:1px solid rgba(180,130,40,.18);font-weight:500;color:var(--fg-muted)}.toolbox-row{display:grid;grid-template-columns:36px 1fr;align-items:start}.toolbox-row+.toolbox-row{border-top:1px solid rgba(180,130,40,.18)}.toolbox-label{padding:6px 8px;background:transparent;border-right:1px solid rgba(180,130,40,.18);font-size:10px;font-weight:600;color:var(--fg-subtle);text-transform:uppercase;letter-spacing:.08em;text-align:center}.toolbox-content{padding:6px 10px;font-family:ui-monospace,SF Mono,Menlo,Consolas,monospace;font-size:12px;white-space:pre-wrap;word-break:break-word;color:var(--fg);max-height:260px;overflow-y:auto}.toolbox-content.is-error{color:var(--accent)}.md{color:var(--fg);font-size:13px}.md>*{margin:0 0 6px}.md>*:last-child{margin-bottom:0}.md h1,.md h2,.md h3,.md h4{margin:10px 0 4px;font-weight:600;color:var(--fg);line-height:1.3}.md h1{font-size:17px}.md h2{font-size:15px}.md h3{font-size:14px}.md h4{font-size:13px;color:var(--fg-muted)}.md code{font-family:ui-monospace,SF Mono,Menlo,Consolas,monospace;font-size:.875em;padding:1px 5px;background:var(--sl3);border-radius:3px}.md pre{padding:10px 12px;background:var(--sl2);border:1px solid var(--border);border-radius:6px;overflow-x:auto}.md pre code{background:none;padding:0;font-size:12px;color:var(--fg)}.md ul,.md ol{padding-left:20px}.md li{margin:2px 0}.md blockquote{padding:4px 0 4px 12px;border-left:3px solid var(--border-hi);color:var(--fg-muted)}.md a{color:var(--neutral);text-decoration:underline;text-decoration-color:var(--border-hi)}.md a:hover{text-decoration-color:var(--neutral)}.md table{width:100%;border-collapse:collapse;font-size:12px}.md th,.md td{padding:6px 10px;border:1px solid var(--border);text-align:left}.md th{background:var(--sl2);font-weight:600}.md hr{border:0;border-top:1px solid var(--border)}.tabbar{display:flex;align-items:stretch;gap:2px;border-bottom:1px solid var(--border);overflow-x:auto;scrollbar-width:thin}.tab{display:inline-flex;align-items:center;gap:6px;padding:8px 14px;font-size:13px;color:var(--fg-muted);border:1px solid transparent;border-bottom:none;border-top-left-radius:6px;border-top-right-radius:6px;margin-bottom:-1px;white-space:nowrap;transition:background .12s ease,color .12s ease;cursor:pointer;background:transparent}.tab:hover{background:var(--sl2);color:var(--fg)}.tab.active{background:var(--bg);color:var(--fg);font-weight:500;border-color:var(--border);border-bottom-color:var(--bg)}.tab .tab-close{margin-left:4px;width:16px;height:16px;display:inline-flex;align-items:center;justify-content:center;border-radius:3px;color:var(--fg-subtle);font-size:14px;line-height:1}.tab .tab-close:hover{background:var(--sl4);color:var(--accent)}.cwd-group{border-radius:10px;padding:12px;margin-bottom:16px;border:1px solid var(--border)}.cwd-group-header{display:flex;align-items:center;gap:8px;margin-bottom:10px;font-size:12px;color:var(--fg-muted);font-family:ui-monospace,SF Mono,Menlo,Consolas,monospace}.cwd-group-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;align-items:stretch}.cwd-group-grid>.cell{height:100%}@media (max-width: 720px){.cwd-group-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (max-width: 480px){.cwd-group-grid{grid-template-columns:1fr}.cwd-group-grid>.cell{height:auto}.cell-turn-assistant .cell-turn-body{-webkit-line-clamp:3}.cell-preview{overflow:visible}}html,body{overflow-x:hidden;max-width:100vw}.app-shell{max-width:1280px;margin:0 auto;padding:16px 24px 64px}@media (max-width: 480px){.app-shell{padding:10px 10px 48px}}.cell{min-width:0;overflow:hidden}.cell-preview,.cell-convo,.cell-head,.cell-cwd,.cell-foot,.cell-turn{min-width:0}.cell-turn-body{min-width:0;overflow-wrap:anywhere}.cell-title{min-width:0}.md,.md *{overflow-wrap:anywhere;max-width:100%}.md pre,.md code{white-space:pre-wrap;word-break:break-all}.cell{background:var(--cell-bg);border:1px solid var(--border);border-radius:0;padding:10px 12px;cursor:default;transition:border-color .12s ease,background .12s ease,transform .06s ease;position:relative;display:flex;flex-direction:column;min-height:130px}.cell:hover{border-color:var(--border-hi);background:var(--cell-bg-hover)}.cell:active{transform:scale(.995)}.cell-head{display:flex;align-items:center;gap:6px;margin-bottom:4px}.cell-title{font-weight:500;font-size:13px;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cell-status{font-size:10px;color:var(--fg-subtle);text-transform:uppercase;letter-spacing:.06em}.cell-cwd{font-size:10px;font-family:ui-monospace,SF Mono,Menlo,Consolas,monospace;margin-bottom:4px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cell-preview{flex:1;margin-top:4px;color:var(--fg-muted);font-size:12px;line-height:1.4;overflow:hidden;display:-webkit-box;-webkit-line-clamp:4;-webkit-box-orient:vertical}.cell-empty{color:var(--fg-subtle);font-style:italic}.cell-convo{display:flex;flex-direction:column;gap:6px;-webkit-line-clamp:unset;-webkit-box-orient:unset;overflow:hidden}.cell-turn{display:grid;grid-template-columns:56px 1fr;gap:6px;align-items:start;padding:4px 6px;border-radius:4px;font-size:11.5px;line-height:1.45}.cell-turn-role{font-size:9.5px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;padding-top:1px;display:flex;flex-direction:column;gap:2px}.cell-turn-ts{font-size:9px;font-weight:400;text-transform:none;letter-spacing:0;color:var(--fg-subtle);font-family:ui-monospace,monospace}.streaming-cursor{display:inline-block;margin-left:2px;color:var(--pass);font-weight:600;animation:stream-blink 1s steps(2,start) infinite}@keyframes stream-blink{to{visibility:hidden}}.cell-turn-body{color:var(--fg);overflow:hidden;display:-webkit-box;-webkit-line-clamp:4;-webkit-box-orient:vertical;word-break:break-word}.cell-turn-user{background:var(--turn-bg-user)}.cell-turn-user .cell-turn-role{color:var(--neutral, #607080)}.cell-turn-assistant{background:var(--turn-bg-assistant)}.cell-turn-assistant .cell-turn-role{color:var(--pass, #1f8a5a)}.cell-turn-assistant,.cell-turn-user{min-height:76px}.cell-turn-tool{background:#b4822812;padding:2px 6px;font-size:11px}.cell-turn-tool .cell-turn-role{color:#a8740d}.cell-tool-inline{display:flex;align-items:baseline;gap:3px;font-size:10px;color:var(--fg-muted);min-width:0;white-space:nowrap;flex:1 1 auto}.cell-tool-inline .cell-tool-icon{color:#a8740d;flex-shrink:0}.cell-tool-inline strong{font-weight:600;color:var(--fg);flex-shrink:0}.cell-tool-inline .cell-tool-desc{color:var(--fg-subtle);flex:1 1 0;min-width:0;overflow:hidden;text-overflow:ellipsis}.cell-tool-inline .cell-tool-ts{color:var(--fg-subtle);font-family:ui-monospace,monospace;flex-shrink:0;margin-left:2px}.cell-turn-tool .cell-turn-body{-webkit-line-clamp:1;display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}@keyframes cell-flash-yellow{0%,to{background:transparent;box-shadow:none}50%{background:#ffe16e52;box-shadow:0 0 0 2px #dcaa1e59}}.cell-flash{animation:cell-flash-yellow 1s ease-in-out infinite}.cell-activity{display:inline-flex;align-items:center;gap:4px;margin-left:6px;padding:0;font-size:10px;font-weight:500;color:#3b82f6;background:transparent;border:none;white-space:nowrap;animation:cell-activity-text-blink 1.4s ease-in-out infinite}.cell-activity-dot{width:6px;height:6px;border-radius:50%;background:#3b82f6}@keyframes cell-activity-text-blink{0%,to{opacity:.45}50%{opacity:1}}@keyframes cell-flash-update{0%,to{background:transparent;box-shadow:none}20%{background:#5096ff38;box-shadow:0 0 0 2px #3c82eb52}60%{background:#5096ff1a;box-shadow:0 0 0 2px #3c82eb29}}.cell-flash-update{animation:cell-flash-update 1.2s ease-in-out 1}.client-badge{display:inline-flex;align-items:center;font-size:10px;font-weight:600;line-height:1;padding:2px 6px;border-radius:10px;border:1px solid transparent;cursor:pointer;white-space:nowrap;-webkit-user-select:none;-moz-user-select:none;user-select:none;font-family:inherit;transition:filter .15s}.client-badge:hover{filter:brightness(.95)}.client-badge-md{font-size:11px;padding:3px 8px}.client-badge-vscode{background:#286ec81f;color:#2c5fa8;border-color:#286ec840}.client-badge-cli{background:#b4822829;color:#8a5d0a;border-color:#b4822859}.client-badge-wrap{background:#6e3cc824;color:#5a2db8;border-color:#6e3cc852;cursor:default}.ask-modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1000;background:#0000002e}.ask-modal{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:min(560px,90vw);max-height:80vh;overflow-y:auto;background:var(--bg);border:1px solid var(--border-hi);border-radius:10px;box-shadow:0 12px 40px #00000047;padding:16px;z-index:1001}.ask-tab{font-size:11px;padding:4px 10px;border-radius:999px;border:1px solid var(--border);background:transparent;color:var(--fg-muted);cursor:pointer}.ask-tab:hover{background:var(--sl3)}.ask-tab-active{background:var(--sl3);color:var(--fg);border-color:var(--border-hi);font-weight:500}.ask-tab-done{color:var(--pass)}.ask-option{display:grid;grid-template-columns:22px 1fr;gap:8px;align-items:start;padding:8px 10px;border:1px solid var(--border);border-radius:6px;cursor:pointer;background:var(--bg);transition:background .12s,border-color .12s}.ask-option:hover{background:var(--sl2)}.ask-option-checked{background:#286ec80f;border-color:#286ec866}.ask-option input{margin-top:3px}@keyframes cell-ask-pulse{0%,to{background:transparent;box-shadow:0 0 #dc323200}50%{background:#dc323214;box-shadow:0 0 0 2px #dc323273}}.cell-ask-pending{animation:cell-ask-pulse 1.4s ease-in-out infinite}.cell-waiting-stale{background:var(--cell-bg-stale)}.cell-waiting-stale:hover{background:var(--cell-bg-stale-hover)}.cell-ask-bell{font-size:10px;font-weight:600;padding:2px 8px;border-radius:999px;border:1px solid rgba(220,50,50,.45);background:#dc32321a;color:#b3261e;cursor:pointer;white-space:nowrap;margin-left:4px;animation:cell-ask-bell-pulse 1.2s ease-in-out infinite}.cell-ask-bell:hover{background:#dc32322e}@keyframes cell-ask-bell-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.06)}}.cell-modal-ask-banner{display:flex;align-items:center;gap:12px;padding:10px 16px;background:#dc32321a;border-bottom:1px solid rgba(220,50,50,.35);font-size:12px;color:#b3261e;flex-shrink:0}.cell-modal-ask-banner>span{flex:1;font-weight:500}.pmode-badge-auto{background:#288c6424;color:#1f7a4d;border-color:#288c6459;cursor:default}.pmode-badge-bypass{background:#c8322824;color:#b3261e;border-color:#c8322861;cursor:default}.pmode-badge-plan{background:#286ec824;color:#2c5fa8;border-color:#286ec852;cursor:default}.pmode-chip-wrap{position:relative;display:inline-flex;align-items:center}.pmode-chip{display:inline-flex;align-items:center;gap:4px;padding:1px 6px;font-size:9.5px;font-weight:600;letter-spacing:.02em;border-radius:3px;border:1px solid transparent;font-family:ui-monospace,monospace;white-space:nowrap;cursor:pointer;transition:filter .15s}.pmode-chip svg{flex-shrink:0}.pmode-chip:hover:not(:disabled){filter:brightness(.94)}.pmode-chip:disabled{cursor:default;opacity:.6}.pmode-menu{position:absolute;bottom:calc(100% + 4px);right:0;z-index:30;min-width:260px;max-width:calc(100vw - 16px);background:var(--bg);border:1px solid var(--border);border-radius:6px;box-shadow:0 8px 24px #00000029;padding:6px;display:flex;flex-direction:column;gap:1px;font-family:inherit}.pmode-menu.pmode-menu-left{right:auto;left:0;min-width:220px}.pmode-menu-head{font-size:11px;font-weight:600;color:var(--fg-subtle);letter-spacing:.04em;padding:4px 8px 6px;border-bottom:1px solid var(--border);margin-bottom:2px}.pmode-menu-item{display:flex;align-items:center;gap:10px;padding:7px 8px;color:var(--fg);background:transparent;border:1px solid transparent;border-radius:4px;text-align:left;cursor:pointer;font-family:inherit;width:100%}.pmode-menu-item:hover:not(:disabled){background:var(--sl3)}.pmode-menu-item:disabled{cursor:default;opacity:.5}.pmode-menu-item.is-current{background:var(--sl3)}.pmode-menu-icon{flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px}.pmode-menu-item.pmode-chip-default .pmode-menu-icon{color:#60646c}.pmode-menu-item.pmode-chip-auto .pmode-menu-icon{color:#1f7a4d}.pmode-menu-item.pmode-chip-plan .pmode-menu-icon{color:#2c5fa8}.pmode-menu-item.pmode-chip-autopick .pmode-menu-icon{color:#7b3fb8}.pmode-menu-item.pmode-chip-bypass .pmode-menu-icon{color:#b3261e}[data-theme=dark] .pmode-menu-item.pmode-chip-default .pmode-menu-icon{color:#c8c8c8}[data-theme=dark] .pmode-menu-item.pmode-chip-auto .pmode-menu-icon{color:#4ec9b0}[data-theme=dark] .pmode-menu-item.pmode-chip-plan .pmode-menu-icon{color:#569cd6}[data-theme=dark] .pmode-menu-item.pmode-chip-autopick .pmode-menu-icon{color:#c586c0}[data-theme=dark] .pmode-menu-item.pmode-chip-bypass .pmode-menu-icon{color:#f44747}.pmode-menu-text{flex:1;min-width:0}.pmode-menu-label{font-size:12px;font-weight:600;color:var(--fg);line-height:1.2}.pmode-menu-desc{font-size:10.5px;color:var(--fg-subtle);margin-top:1px;line-height:1.3}.pmode-check{margin-left:6px;color:var(--pass);font-weight:700;flex-shrink:0}.pmode-err{font-size:10px;color:var(--accent);padding:4px 8px;border-top:1px solid var(--border);margin-top:4px}.pmode-chip-default{background:#7882961a;color:#60646c;border-color:#78829640}.pmode-chip-auto{background:#288c641f;color:#1f7a4d;border-color:#288c6452}.pmode-chip-bypass{background:#c832281f;color:#b3261e;border-color:#c832285c}.pmode-chip-plan{background:#286ec81f;color:#2c5fa8;border-color:#286ec84d}.pmode-chip-autopick{background:#aa6edc1f;color:#7b3fb8;border-color:#aa6edc4d}.pmode-chip-neutral{background:var(--sl2);color:var(--fg-muted);border-color:var(--border)}.pmode-chip-neutral:hover:not(:disabled){background:var(--sl3);border-color:var(--border-hi);color:var(--fg);filter:none}:root{--turn-bg-user: rgba(120, 130, 150, .08);--turn-bg-assistant: rgba(40, 140, 100, .06);--turn-bg-tool: rgba(200, 160, 50, .1)}[data-theme=dark]{--turn-bg-user: transparent;--turn-bg-assistant: transparent;--turn-bg-tool: transparent}.turn-bg-user{background:var(--turn-bg-user)}.turn-bg-assistant{background:var(--turn-bg-assistant)}.turn-bg-tool{background:var(--turn-bg-tool)}.turn-row{display:flex;padding:5px 12px}.turn-row.turn-row-user{justify-content:flex-end}.turn-row.turn-row-other{justify-content:flex-start}.turn-bubble{max-width:85%;min-width:0;padding:8px 12px;border:1px solid var(--border);border-radius:14px}.turn-row-user .turn-bubble{border-top-right-radius:4px}.turn-row-other .turn-bubble{border-top-left-radius:4px}.turn-bubble.turn-bubble-tool{padding:4px 8px}.turn-bubble.turn-bg-user{background:var(--turn-bg-user)}.turn-bubble.turn-bg-assistant{background:var(--turn-bg-assistant)}.turn-bubble.turn-bg-tool{background:var(--turn-bg-tool)}[data-theme=dark] .turn-bubble.turn-bg-user{background:#1f2937}[data-theme=dark] .turn-bubble.turn-bg-assistant{background:#0f1f1a}[data-theme=dark] .turn-bubble.turn-bg-tool{background:#1f1b12}@media (max-width: 640px){.turn-row{padding:4px 8px}.turn-bubble{max-width:92%;padding:7px 11px}}.cell-foot{display:flex;align-items:center;gap:6px;font-size:10px;color:var(--fg-subtle);font-family:ui-monospace,monospace;margin:6px -12px -10px;padding:6px 12px 10px}@keyframes cell-status-pulse{0%,to{opacity:1}50%{opacity:.4}}.cell-foot-active .cell-status{color:var(--pass);animation:cell-status-pulse 1.4s ease-in-out infinite}.cell-foot-waiting .cell-status{color:var(--accent);font-weight:600}.cell-open-tab{margin-left:auto;padding:2px 6px;font-size:10px;color:var(--fg-subtle);border:1px solid var(--border);border-radius:4px;background:var(--bg)}.cell-open-tab:hover{color:var(--fg);border-color:var(--border-hi)}.icon-btn{display:inline-flex;align-items:center;justify-content:center;line-height:1}.icon-btn svg{display:block}.cell-send-btn{margin-left:auto;padding:2px 8px;font-size:10px;color:var(--fg);border:1px solid var(--border);border-radius:4px;background:var(--bg);cursor:pointer;font-family:inherit}.cell-send-btn:hover{border-color:var(--pass, #1f8a5a);color:var(--pass, #1f8a5a);background:var(--bg)}.cell-wrap-btn-icon{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;padding:0;font-size:12px;line-height:1;color:var(--fg);border:1px solid var(--border);border-radius:4px;background:var(--bg);cursor:pointer;font-family:inherit;transition:border-color .12s ease,color .12s ease,transform .08s ease}.cell-wrap-btn-icon:hover:not(:disabled){border-color:var(--pass, #1f7a4d);transform:scale(1.06)}.cell-wrap-btn-icon:disabled{opacity:.6;cursor:progress}.cell-clickable{cursor:pointer}@keyframes miki-toast-in{0%{opacity:0;transform:translate(-50%,-8px)}to{opacity:1;transform:translate(-50%)}}.spawn-pending-spinner{display:inline-block;font-size:14px;margin-top:1px;color:var(--pass);animation:miki-spin 1.1s linear infinite}@keyframes miki-spin{to{transform:rotate(360deg)}}.settings-popover::-webkit-scrollbar{width:8px}.settings-popover::-webkit-scrollbar-thumb{background:var(--sl8);border-radius:4px}.settings-popover::-webkit-scrollbar-thumb:hover{background:var(--sl10)}.settings-popover{scrollbar-width:thin}.cell-modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:60;background:#00000052;display:flex;align-items:center;justify-content:center;padding:24px;animation:cell-modal-fade-in .12s ease-out}@keyframes cell-modal-fade-in{0%{opacity:0}to{opacity:1}}.cell-modal{position:relative;width:min(760px,100%);height:min(85vh,900px);background:var(--bg);border:1px solid var(--border);border-radius:8px;box-shadow:0 20px 60px #00000047;display:flex;flex-direction:column;overflow:hidden;overscroll-behavior:contain}.cell-modal-backdrop{overscroll-behavior:contain}@media (max-width: 640px){.cell-modal-backdrop{padding:0}.cell-modal{width:100%;height:100vh;height:100dvh;max-width:100vw;max-height:100vh;max-height:100dvh;border:none;border-radius:0;box-shadow:none}}.cell-modal-close{position:absolute;top:8px;right:8px;z-index:1;width:28px;height:28px;display:flex;align-items:center;justify-content:center;font-size:18px;line-height:1;color:var(--fg-subtle);background:transparent;border:1px solid transparent;border-radius:4px;cursor:pointer}@media (max-width: 640px){.cell-modal-close{top:4px;right:4px;width:24px;height:24px;font-size:16px}}.cell-modal-close:hover{color:var(--fg);background:var(--bg-subtle);border-color:var(--border)}.popover-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:50;background:#0000000a}.popover{position:fixed;z-index:51;background:var(--bg);border:1px solid var(--border-hi);border-radius:8px;box-shadow:0 8px 24px #0000001a,0 2px 6px #0000000d;padding:12px;width:360px;max-width:calc(100vw - 16px)}@media (max-width: 560px){.popover-backdrop{background:#00000052}.popover{width:calc(100vw - 16px)}}.log-entry{padding:4px 12px;font-size:12px;font-family:ui-monospace,SF Mono,Menlo,Consolas,monospace}.log-entry-info{color:var(--fg-muted)}.log-entry-warn{color:var(--warn)}.log-entry-error{color:var(--accent)}.log-time,.log-ctx{color:var(--fg-subtle)}@keyframes mm-spin{to{transform:rotate(360deg)}}.hover\:bg-indigo-500:hover{--tw-bg-opacity: 1;background-color:rgb(99 102 241 / var(--tw-bg-opacity, 1))}.hover\:bg-slate-600:hover{--tw-bg-opacity: 1;background-color:rgb(71 85 105 / var(--tw-bg-opacity, 1))}.hover\:text-slate-300:hover{--tw-text-opacity: 1;color:rgb(203 213 225 / var(--tw-text-opacity, 1))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-1:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-indigo-500:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(99 102 241 / var(--tw-ring-opacity, 1))}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-60:disabled{opacity:.6}
@@ -0,0 +1,20 @@
1
+ <!doctype html>
2
+ <html lang="zh-Hant-TW">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width,initial-scale=1" />
6
+ <title>miki-moni</title>
7
+ <link rel="preconnect" href="https://fonts.googleapis.com" />
8
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
9
+ <link
10
+ href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Noto+Sans+TC:wght@400;500;600&display=swap"
11
+ rel="stylesheet"
12
+ />
13
+ <!-- Stylesheets are imported via main-tunnel.tsx so Vite bundles them. -->
14
+ <script type="module" crossorigin src="/assets/index-D5BUh7Uf.js"></script>
15
+ <link rel="stylesheet" crossorigin href="/assets/index-D8vY_9ld.css">
16
+ </head>
17
+ <body>
18
+ <div id="app"></div>
19
+ </body>
20
+ </html>
@@ -0,0 +1,56 @@
1
+ # miki-moni hook emitter — invoked by ~/.claude/settings.json hooks
2
+ # Usage: miki-emit.ps1 <event_type>
3
+ # Reads hook payload from stdin (Claude Code convention).
4
+ # Fails silently on any error to never block Claude.
5
+
6
+ param([Parameter(Mandatory)][string]$EventType)
7
+
8
+ $ErrorActionPreference = "SilentlyContinue"
9
+
10
+ try {
11
+ $stdin = [Console]::In.ReadToEnd()
12
+ $payload = $null
13
+ if ($stdin) { $payload = $stdin | ConvertFrom-Json }
14
+
15
+ # Resolve port (falls back to 8765 if port file missing)
16
+ $portFile = Join-Path $HOME ".miki-moni\port"
17
+ $port = 8765
18
+ if (Test-Path $portFile) {
19
+ $portFromFile = Get-Content $portFile -ErrorAction SilentlyContinue
20
+ if ($portFromFile -match '^\d+$') { $port = [int]$portFromFile }
21
+ }
22
+
23
+ # Map Claude's event_type names to ours (validated in Task 3 spike)
24
+ $typeMap = @{
25
+ "SessionStart" = "session_start"
26
+ "Stop" = "stop"
27
+ "UserPromptSubmit" = "user_prompt"
28
+ "PreToolUse" = "pre_tool_use"
29
+ "PostToolUse" = "post_tool_use"
30
+ }
31
+ $ourType = $typeMap[$EventType]
32
+ if (-not $ourType) { return }
33
+
34
+ # Best-effort extraction — exact field names confirmed in spike doc
35
+ $cwd = $payload.cwd
36
+ if (-not $cwd) { $cwd = $env:CLAUDE_PROJECT_DIR }
37
+ if (-not $cwd) { $cwd = (Get-Location).Path }
38
+
39
+ $sessionId = $payload.session_id
40
+ if (-not $sessionId) { $sessionId = $env:CLAUDE_SESSION_ID }
41
+
42
+ $body = @{
43
+ event_type = $ourType
44
+ cwd = $cwd
45
+ session_uuid = $sessionId
46
+ timestamp = [DateTimeOffset]::Now.ToUnixTimeMilliseconds()
47
+ } | ConvertTo-Json -Compress
48
+
49
+ Invoke-RestMethod -Uri "http://127.0.0.1:$port/event" `
50
+ -Method Post -Body $body -ContentType "application/json" `
51
+ -TimeoutSec 2 | Out-Null
52
+ } catch {
53
+ # swallow — never block Claude
54
+ }
55
+
56
+ exit 0
package/package.json ADDED
@@ -0,0 +1,89 @@
1
+ {
2
+ "name": "miki-moni",
3
+ "version": "0.3.1",
4
+ "license": "MIT",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "git+https://github.com/WarmBed/Miki-Moni.git"
8
+ },
9
+ "homepage": "https://github.com/WarmBed/Miki-Moni",
10
+ "bugs": "https://github.com/WarmBed/Miki-Moni/issues",
11
+ "type": "module",
12
+ "description": "Miki-Moni / 巫女 — weave multiple VSCode Claude Code panel sessions into one local dashboard, with optional encrypted relay to a phone client. See docs/naming.md.",
13
+ "engines": {
14
+ "node": ">=20"
15
+ },
16
+ "bin": {
17
+ "miki": "./bin/miki.mjs"
18
+ },
19
+ "files": [
20
+ "bin",
21
+ "src",
22
+ "shared",
23
+ "hooks/miki-emit.ps1",
24
+ "tools/tray.ps1",
25
+ "dist/web",
26
+ "dist/web-phone",
27
+ "worker/src",
28
+ "worker/wrangler.toml",
29
+ "worker/wrangler-selfhost.toml",
30
+ "worker/package.json",
31
+ "README.md",
32
+ "README.zh-TW.md",
33
+ "README.zh-CN.md",
34
+ "LICENSE"
35
+ ],
36
+ "scripts": {
37
+ "dev": "tsx watch src/index.ts",
38
+ "start": "tsx src/index.ts",
39
+ "build:web": "vite build",
40
+ "build:phone": "vite build --config vite-phone.config.ts",
41
+ "build:all": "pnpm build:web && pnpm build:phone",
42
+ "test": "vitest run",
43
+ "test:watch": "vitest",
44
+ "typecheck": "tsc --noEmit",
45
+ "install:hooks": "tsx src/install-hooks.ts",
46
+ "install-helper": "node scripts/install-helper.mjs",
47
+ "pair": "tsx src/cli/pair.ts",
48
+ "miki": "tsx src/cli/miki.ts",
49
+ "wrap": "tsx src/cli/wrap.ts",
50
+ "mock-worker": "tsx tools/mock-worker/server.ts",
51
+ "dev:all": "tsx tools/dev/start-all.ts",
52
+ "verify": "tsx tools/dev/verify-relay.ts",
53
+ "prepublishOnly": "pnpm build:web"
54
+ },
55
+ "dependencies": {
56
+ "@anthropic-ai/claude-agent-sdk": "^0.3.143",
57
+ "@inquirer/prompts": "^8.4.3",
58
+ "better-sqlite3": "^11.3.0",
59
+ "express": "^5.0.0",
60
+ "jsqr": "^1.4.0",
61
+ "marked": "^18.0.3",
62
+ "node-notifier": "^10.0.1",
63
+ "pino": "^9.4.0",
64
+ "qrcode-terminal": "^0.12.0",
65
+ "tsx": "^4.19.1",
66
+ "tweetnacl": "^1.0.3",
67
+ "tweetnacl-util": "^0.15.1",
68
+ "ws": "^8.18.0"
69
+ },
70
+ "devDependencies": {
71
+ "@types/better-sqlite3": "^7.6.11",
72
+ "@types/express": "^5.0.0",
73
+ "@types/node": "^20.16.0",
74
+ "@types/node-notifier": "^8.0.5",
75
+ "@types/qrcode-terminal": "^0.12.2",
76
+ "@types/supertest": "^6.0.2",
77
+ "@types/ws": "^8.5.12",
78
+ "autoprefixer": "^10.5.0",
79
+ "fake-indexeddb": "^6.2.5",
80
+ "playwright": "^1.60.0",
81
+ "postcss": "^8.5.14",
82
+ "preact": "^10.24.0",
83
+ "supertest": "^7.0.0",
84
+ "tailwindcss": "^3.4.13",
85
+ "typescript": "^5.6.2",
86
+ "vite": "^5.4.8",
87
+ "vitest": "^2.1.1"
88
+ }
89
+ }