@minimalcorp/tsunagi 0.1.23 → 0.1.24

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 (109) hide show
  1. package/.next/standalone/apps/web/.next/BUILD_ID +1 -1
  2. package/.next/standalone/apps/web/.next/build-manifest.json +3 -3
  3. package/.next/standalone/apps/web/.next/prerender-manifest.json +3 -3
  4. package/.next/standalone/apps/web/.next/server/app/_global-error.html +1 -1
  5. package/.next/standalone/apps/web/.next/server/app/_global-error.rsc +1 -1
  6. package/.next/standalone/apps/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  7. package/.next/standalone/apps/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  8. package/.next/standalone/apps/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  9. package/.next/standalone/apps/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  10. package/.next/standalone/apps/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  11. package/.next/standalone/apps/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  12. package/.next/standalone/apps/web/.next/server/app/_not-found.html +1 -1
  13. package/.next/standalone/apps/web/.next/server/app/_not-found.rsc +2 -2
  14. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  15. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  16. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  17. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  18. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  19. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  20. package/.next/standalone/apps/web/.next/server/app/index.html +1 -1
  21. package/.next/standalone/apps/web/.next/server/app/index.rsc +3 -3
  22. package/.next/standalone/apps/web/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  23. package/.next/standalone/apps/web/.next/server/app/index.segments/_full.segment.rsc +3 -3
  24. package/.next/standalone/apps/web/.next/server/app/index.segments/_head.segment.rsc +1 -1
  25. package/.next/standalone/apps/web/.next/server/app/index.segments/_index.segment.rsc +2 -2
  26. package/.next/standalone/apps/web/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  27. package/.next/standalone/apps/web/.next/server/app/page.js.nft.json +1 -1
  28. package/.next/standalone/apps/web/.next/server/app/page_client-reference-manifest.js +1 -1
  29. package/.next/standalone/apps/web/.next/server/app/settings/page.js.nft.json +1 -1
  30. package/.next/standalone/apps/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  31. package/.next/standalone/apps/web/.next/server/app/settings.html +1 -1
  32. package/.next/standalone/apps/web/.next/server/app/settings.rsc +3 -3
  33. package/.next/standalone/apps/web/.next/server/app/settings.segments/_full.segment.rsc +3 -3
  34. package/.next/standalone/apps/web/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  35. package/.next/standalone/apps/web/.next/server/app/settings.segments/_index.segment.rsc +2 -2
  36. package/.next/standalone/apps/web/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  37. package/.next/standalone/apps/web/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +2 -2
  38. package/.next/standalone/apps/web/.next/server/app/settings.segments/settings.segment.rsc +1 -1
  39. package/.next/standalone/apps/web/.next/server/app/tasks/[id]/page.js.nft.json +1 -1
  40. package/.next/standalone/apps/web/.next/server/app/tasks/[id]/page_client-reference-manifest.js +1 -1
  41. package/.next/standalone/apps/web/.next/server/chunks/ssr/{[root-of-the-server]__0cwejmp._.js → [root-of-the-server]__053-iaj._.js} +2 -2
  42. package/.next/standalone/apps/web/.next/server/chunks/ssr/[root-of-the-server]__07kf5h-._.js +13 -13
  43. package/.next/standalone/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0_gamc9._.js +13 -13
  44. package/.next/standalone/apps/web/.next/server/chunks/ssr/{[root-of-the-server]__0a7t~wn._.js → [root-of-the-server]__0tq9wv6._.js} +2 -2
  45. package/.next/standalone/apps/web/.next/server/chunks/ssr/{_0ie-fls._.js → _03hz06e._.js} +2 -2
  46. package/.next/standalone/apps/web/.next/server/chunks/ssr/{_0gpi5iq._.js → _0836rl_._.js} +2 -2
  47. package/.next/standalone/apps/web/.next/server/chunks/ssr/{_06gug4~._.js → _0amxree._.js} +2 -2
  48. package/.next/standalone/apps/web/.next/server/chunks/ssr/_0g.cd6a._.js +17 -17
  49. package/.next/standalone/apps/web/.next/server/chunks/ssr/apps_web_src_app_settings_page_tsx_0i6itlb._.js +1 -1
  50. package/.next/standalone/apps/web/.next/server/chunks/ssr/{node_modules_0s64~o2._.js → node_modules_00b-qxe._.js} +1 -1
  51. package/.next/standalone/apps/web/.next/server/chunks/ssr/{node_modules_0-dhyl6._.js → node_modules_046ca89._.js} +1 -1
  52. package/.next/standalone/apps/web/.next/server/chunks/ssr/{node_modules_0w5pf1p._.js → node_modules_065xsw3._.js} +1 -1
  53. package/.next/standalone/apps/web/.next/server/chunks/ssr/{node_modules_0-ecrjy._.js → node_modules_0b547kr._.js} +1 -1
  54. package/.next/standalone/apps/web/.next/server/chunks/ssr/{node_modules_0.7pxhy._.js → node_modules_0c_-8tt._.js} +1 -1
  55. package/.next/standalone/apps/web/.next/server/chunks/ssr/{node_modules_0efb87~._.js → node_modules_0dmu62y._.js} +1 -1
  56. package/.next/standalone/apps/web/.next/server/chunks/ssr/{node_modules_0of7.-5._.js → node_modules_0gs4d2e._.js} +1 -1
  57. package/.next/standalone/apps/web/.next/server/chunks/ssr/{node_modules_0j3gfu0._.js → node_modules_0jcrj-2._.js} +1 -1
  58. package/.next/standalone/apps/web/.next/server/chunks/ssr/{node_modules_0uwlz8.._.js → node_modules_0kmpnnk._.js} +1 -1
  59. package/.next/standalone/apps/web/.next/server/chunks/ssr/{node_modules_0126g83._.js → node_modules_0llz_9l._.js} +1 -1
  60. package/.next/standalone/apps/web/.next/server/chunks/ssr/{node_modules_0zmomoe._.js → node_modules_0pi.005._.js} +1 -1
  61. package/.next/standalone/apps/web/.next/server/chunks/ssr/{node_modules_0.6~k__._.js → node_modules_0v86kpj._.js} +1 -1
  62. package/.next/standalone/apps/web/.next/server/chunks/ssr/{node_modules_0ybihhp._.js → node_modules_0vm.f2d._.js} +1 -1
  63. package/.next/standalone/apps/web/.next/server/chunks/ssr/{node_modules_11gk90a._.js → node_modules_0y3g5lf._.js} +1 -1
  64. package/.next/standalone/apps/web/.next/server/chunks/ssr/{node_modules_0r6ewmn._.js → node_modules_0z0orm9._.js} +1 -1
  65. package/.next/standalone/apps/web/.next/server/chunks/ssr/{node_modules_06iewnh._.js → node_modules_0~n91z-._.js} +1 -1
  66. package/.next/standalone/apps/web/.next/server/middleware-build-manifest.js +3 -3
  67. package/.next/standalone/apps/web/.next/server/pages/404.html +1 -1
  68. package/.next/standalone/apps/web/.next/server/pages/500.html +1 -1
  69. package/.next/standalone/apps/web/.next/server/server-reference-manifest.js +1 -1
  70. package/.next/standalone/apps/web/.next/server/server-reference-manifest.json +1 -1
  71. package/.next/standalone/apps/web/.next/static/chunks/08dtfekvxgpfu.js +1 -0
  72. package/.next/standalone/apps/web/.next/static/chunks/{0e9140l311w8t.js → 0dpeys_k2-mrk.js} +15 -15
  73. package/.next/standalone/apps/web/.next/static/chunks/0hvtxos.brr01.js +1 -0
  74. package/.next/standalone/apps/web/.next/static/chunks/{0kw1z8z_ld6s0.js → 0nh1-0lee-1pk.js} +15 -15
  75. package/.next/standalone/apps/web/.next/static/chunks/0wxrfu5la_s94.js +64 -0
  76. package/.next/standalone/apps/web/.next/static/chunks/{10ildl1-mw9ez.js → 0y9ehkcn04ljq.js} +2 -2
  77. package/.next/standalone/apps/web/.next/static/chunks/0zu48yvkl8pyj.css +4 -0
  78. package/.next/standalone/apps/web/.next/static/chunks/0~0s04z6h.rs..js +1 -0
  79. package/.next/standalone/apps/web/.next/static/chunks/12dmkv54xstku.js +1 -0
  80. package/.next/standalone/apps/web/.next/static/chunks/13ohhwsmmfexn.js +1 -0
  81. package/.next/standalone/apps/web/.next/static/chunks/13twvr.qg3khh.js +1 -0
  82. package/dist/server/index.js +8 -1
  83. package/dist/server/lib/claude-config-guard.d.ts +9 -0
  84. package/dist/server/lib/claude-config-guard.js +43 -0
  85. package/dist/server/lib/llm-process.d.ts +29 -0
  86. package/dist/server/lib/llm-process.js +235 -0
  87. package/dist/server/lib/process-port.d.ts +1 -0
  88. package/dist/server/lib/process-port.js +28 -0
  89. package/dist/server/lib/whisper-process.d.ts +2 -2
  90. package/dist/server/lib/whisper-process.js +19 -5
  91. package/dist/server/routes/llm.d.ts +2 -0
  92. package/dist/server/routes/llm.js +23 -0
  93. package/dist/server/routes/terminal.js +5 -0
  94. package/dist/server/routes/whisper.js +36 -2
  95. package/llm-server/README.md +27 -0
  96. package/llm-server/download_model.py +14 -0
  97. package/llm-server/requirements.txt +1 -0
  98. package/llm-server/run.sh +26 -0
  99. package/npm-shrinkwrap.json +24 -40
  100. package/package.json +2 -1
  101. package/whisper-server/server.py +25 -4
  102. package/.next/standalone/apps/web/.next/static/chunks/0-nditm2kmxy3.js +0 -1
  103. package/.next/standalone/apps/web/.next/static/chunks/00vlzdkbq6_w3.js +0 -64
  104. package/.next/standalone/apps/web/.next/static/chunks/0krkukgs6hg9c.js +0 -1
  105. package/.next/standalone/apps/web/.next/static/chunks/0sy8tzk6r-pb~.js +0 -1
  106. package/.next/standalone/apps/web/.next/static/chunks/0vfrsmi1vl53y.css +0 -4
  107. /package/.next/standalone/apps/web/.next/static/{S24zAyBAidp_ISALDwbn4 → gWwRKXTSig4Dz-gNeqxJy}/_buildManifest.js +0 -0
  108. /package/.next/standalone/apps/web/.next/static/{S24zAyBAidp_ISALDwbn4 → gWwRKXTSig4Dz-gNeqxJy}/_clientMiddlewareManifest.js +0 -0
  109. /package/.next/standalone/apps/web/.next/static/{S24zAyBAidp_ISALDwbn4 → gWwRKXTSig4Dz-gNeqxJy}/_ssgManifest.js +0 -0
@@ -0,0 +1,2 @@
1
+ import type { FastifyInstance } from 'fastify';
2
+ export declare function llmRoutes(fastify: FastifyInstance): Promise<void>;
@@ -0,0 +1,23 @@
1
+ import { getLlmServerStatus, startLlmServer, stopLlmServer } from '../lib/llm-process.js';
2
+ export async function llmRoutes(fastify) {
3
+ // GET /llm/server/status
4
+ fastify.get('/llm/server/status', async (_request, reply) => {
5
+ return reply.status(200).send(await getLlmServerStatus());
6
+ });
7
+ // POST /llm/server/start
8
+ fastify.post('/llm/server/start', async (_request, reply) => {
9
+ const result = startLlmServer();
10
+ if (!result.started) {
11
+ return reply.status(409).send({ error: result.error });
12
+ }
13
+ return reply.status(202).send(await getLlmServerStatus());
14
+ });
15
+ // POST /llm/server/stop
16
+ fastify.post('/llm/server/stop', async (_request, reply) => {
17
+ const result = await stopLlmServer();
18
+ if (!result.stopped) {
19
+ return reply.status(409).send({ error: result.error });
20
+ }
21
+ return reply.status(200).send(await getLlmServerStatus());
22
+ });
23
+ }
@@ -4,6 +4,7 @@ import * as path from 'path';
4
4
  import { ptyManager } from '../pty-manager.js';
5
5
  import { prisma } from '../lib/db.js';
6
6
  import { getEnv } from '../lib/repositories/environment.js';
7
+ import { ensureClaudeOnboardingCompleted } from '../lib/claude-config-guard.js';
7
8
  // サーバーはプロジェクトルートから起動されるため process.cwd() でルートを取得
8
9
  const TSUNAGI_EDITOR_PATH = path.resolve(process.cwd(), 'scripts/monaco-editor.sh');
9
10
  // Fastify(API) の公開ポート。index.ts と同じ既定値。monaco-editor.sh など PTY 内の
@@ -230,6 +231,10 @@ export async function terminalRoutes(fastify) {
230
231
  // コマンドが指定されていればPTY起動後にシェルへ書き込む
231
232
  if (command) {
232
233
  const cmd = command.endsWith('\n') ? command : command + '\n';
234
+ // claude logout で ~/.claude.json の hasCompletedOnboarding がリセットされて
235
+ // いると、次回 claude 起動時にオンボーディングウィザードが表示され --resume/
236
+ // --session-id を前提にした自動起動フローが止まるため、起動前に補正する。
237
+ await ensureClaudeOnboardingCompleted();
233
238
  // シェルの初期化(プロンプト表示)を待つため少し遅延させて書き込む
234
239
  setTimeout(() => {
235
240
  session.pty.write(cmd);
@@ -1,8 +1,12 @@
1
1
  import { getWhisperServerStatus, startWhisperServer, stopWhisperServer, } from '../lib/whisper-process.js';
2
+ import { generateLlmCompletion } from '../lib/llm-process.js';
2
3
  // ユーザーが依存関係(pipパッケージ)をセットアップ済みのローカル常駐サーバー
3
4
  // (apps/whisper-server)を指す。依存関係のインストール自体はtsunagi側では行わず、
4
5
  // プロセスの起動・停止のみ管理する。
5
6
  const WHISPER_SERVER_URL = process.env.TSUNAGI_WHISPER_SERVER_URL || 'http://127.0.0.1:8765';
7
+ // 文字起こし結果のLLM整形に使うシステムプロンプト。検証で
8
+ // 「原文の言葉遣いを維持しつつ句読点・誤字だけ直す」設定が有効と確認できたもの。
9
+ const TRANSCRIPTION_CORRECTION_SYSTEM_PROMPT = '以下は音声認識による文字起こし結果です。元の言葉遣いや言い回し、文章構成はできるだけそのまま維持してください。行ってよいのは句読点の追加と、明らかな誤字(音声認識の誤変換)の修正のみです。要約・言い換え・フィラーの除去・文の並び替えなどは行わないでください。修正後の文章のみを出力し、前置きや説明は不要です。';
6
10
  export async function whisperRoutes(fastify) {
7
11
  // GET /whisper/server/status
8
12
  fastify.get('/whisper/server/status', async (_request, reply) => {
@@ -18,7 +22,7 @@ export async function whisperRoutes(fastify) {
18
22
  });
19
23
  // POST /whisper/server/stop
20
24
  fastify.post('/whisper/server/stop', async (_request, reply) => {
21
- const result = stopWhisperServer();
25
+ const result = await stopWhisperServer();
22
26
  if (!result.stopped) {
23
27
  return reply.status(409).send({ error: result.error });
24
28
  }
@@ -30,9 +34,19 @@ export async function whisperRoutes(fastify) {
30
34
  if (!file) {
31
35
  return reply.status(400).send({ error: 'No audio file provided' });
32
36
  }
37
+ // 音声ファイルと同じmultipartペイロード内の`prompt`フィールド(あれば)を
38
+ // whisper-serverのinitial_promptとしてそのまま転送する。
39
+ const promptField = file.fields.prompt;
40
+ const prompt = typeof promptField?.value === 'string' ? promptField.value : undefined;
41
+ // ローカルLLMによる整形を使うかどうかはクライアント(Settingsの有効/無効フラグ)から渡される。
42
+ const useLlmField = file.fields.useLlm;
43
+ const useLlm = useLlmField?.value === 'true';
33
44
  const buffer = await file.toBuffer();
34
45
  const body = new FormData();
35
46
  body.append('file', new Blob([buffer]), file.filename);
47
+ if (prompt)
48
+ body.append('prompt', prompt);
49
+ let whisperText;
36
50
  try {
37
51
  const response = await fetch(`${WHISPER_SERVER_URL}/transcribe`, {
38
52
  method: 'POST',
@@ -42,7 +56,7 @@ export async function whisperRoutes(fastify) {
42
56
  throw new Error(`whisper-server responded with ${response.status}`);
43
57
  }
44
58
  const result = (await response.json());
45
- return reply.status(200).send({ text: result.text });
59
+ whisperText = result.text;
46
60
  }
47
61
  catch (error) {
48
62
  fastify.log.error(error, 'Whisper transcription error');
@@ -52,5 +66,25 @@ export async function whisperRoutes(fastify) {
52
66
  : 'Transcription failed. Is apps/whisper-server running?',
53
67
  });
54
68
  }
69
+ if (!useLlm || !whisperText) {
70
+ return reply.status(200).send({ text: whisperText });
71
+ }
72
+ // LLMによる整形が有効な場合のみ追加で問い合わせる。文字起こし自体は既に
73
+ // 成功しているため、ここで失敗しても文字起こし結果はそのまま返す
74
+ // (ユーザーの発話内容を無駄にしないことを、整形の成否より優先する)。
75
+ try {
76
+ const corrected = await generateLlmCompletion([
77
+ { role: 'system', content: TRANSCRIPTION_CORRECTION_SYSTEM_PROMPT },
78
+ { role: 'user', content: whisperText },
79
+ ], Math.min(4096, Math.max(512, whisperText.length * 4)));
80
+ return reply.status(200).send({ text: corrected.trim() });
81
+ }
82
+ catch (error) {
83
+ fastify.log.error(error, 'LLM correction failed, falling back to raw transcription');
84
+ return reply.status(200).send({
85
+ text: whisperText,
86
+ warning: 'ローカルLLMによる整形に失敗したため、文字起こし結果をそのまま使用しました',
87
+ });
88
+ }
55
89
  });
56
90
  }
@@ -0,0 +1,27 @@
1
+ # llm-server
2
+
3
+ 音声入力の文字起こし結果をローカルLLMで整形するためのサーバー。mlx-lm (Apple Silicon GPU) で応答を生成する。
4
+ tsunagi本体はこのサーバーにHTTPでプロキシするだけで、セットアップ・起動は行わない。
5
+
6
+ ## 要件
7
+
8
+ - macOS (Apple Silicon: M1/M2/M3/M4)
9
+ - Python 3.9+ (Xcode Command Line Tools または Homebrew 経由で入手可能)
10
+ - 空きディスク容量 約18GB(モデル本体)
11
+
12
+ ## セットアップ・起動
13
+
14
+ ```bash
15
+ cd apps/llm-server
16
+ ./run.sh
17
+ ```
18
+
19
+ 初回は`venv`を作成し`requirements.txt`の依存関係(mlx-lm)をインストールしてから起動する。
20
+ `http://127.0.0.1:8766`で待受。初回起動時にモデル(mlx-community/Qwen3-30B-A3B-Instruct-2507-4bit,
21
+ 約17.2GB)を自動ダウンロードする。MoE構成(総30B・実計算に使うアクティブパラメータは約3B)で、
22
+ denseな32B級モデルよりメモリ帯域あたりの生成速度が出やすい。
23
+
24
+ `mlx_lm.server`が提供するOpenAI互換の`/v1/chat/completions`をそのまま公開する。
25
+
26
+ 起動している間、tsunagiのSettingsでローカルLLMを有効にすると、音声入力の文字起こし結果がこの
27
+ サーバーで自動整形されるようになる。停止すると文字起こし結果はそのまま(未整形)で返る。
@@ -0,0 +1,14 @@
1
+ """LLMモデルの重みを事前ダウンロードするだけのスクリプト。
2
+
3
+ サーバー起動(mlx_lm.server)より前に呼ぶことで、初回のチャットリクエストで
4
+ 突然数分〜数十分待たされる、という事態を避ける。tsunagi(Node)側からはこの
5
+ プロセスの実行中、キャッシュディレクトリ内の.incompleteファイルのサイズを
6
+ 定期的に見て進捗を計算する想定なので、ここでは特別な進捗出力はしない。
7
+ """
8
+
9
+ from huggingface_hub import snapshot_download
10
+
11
+ MODEL_REPO = "mlx-community/Qwen3-30B-A3B-Instruct-2507-4bit"
12
+
13
+ if __name__ == "__main__":
14
+ snapshot_download(repo_id=MODEL_REPO)
@@ -0,0 +1 @@
1
+ mlx-lm
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ cd "$(dirname "${BASH_SOURCE[0]}")"
4
+
5
+ # venv・モデルキャッシュとも ~/.tsunagi/llm 配下にまとめる。
6
+ # npmインストール先(apps/llm-server自体)が書き込み不可な場所でも動くようにする狙いもある。
7
+ TSUNAGI_LLM_DIR="${HOME}/.tsunagi/llm"
8
+ VENV_DIR="${TSUNAGI_LLM_DIR}/venv"
9
+ export HF_HOME="${TSUNAGI_LLM_DIR}/cache"
10
+ # xet転送は進捗の観測が難しい独自プロトコルのため無効化し、素直なHTTPダウンロードに固定する。
11
+ export HF_HUB_DISABLE_XET=1
12
+
13
+ MODEL="mlx-community/Qwen3-30B-A3B-Instruct-2507-4bit"
14
+
15
+ if [ ! -d "$VENV_DIR" ]; then
16
+ mkdir -p "$TSUNAGI_LLM_DIR"
17
+ python3 -m venv "$VENV_DIR"
18
+ "$VENV_DIR/bin/python3" -m pip install -r requirements.txt
19
+ fi
20
+
21
+ # サーバー起動前にモデルを予めダウンロードしておく(初回チャットで待たされないように)。
22
+ "$VENV_DIR/bin/python3" download_model.py
23
+
24
+ # venvを ~/.tsunagi 配下へ移設する場合があるため、絶対パスが焼き込まれる
25
+ # コンソールスクリプト(bin/mlx_lm.server)ではなく `python3 -m` 経由で呼び出す。
26
+ exec "$VENV_DIR/bin/python3" -m mlx_lm.server --model "$MODEL" --host 127.0.0.1 --port 8766
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@minimalcorp/tsunagi",
3
- "version": "0.1.23",
3
+ "version": "0.1.24",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@minimalcorp/tsunagi",
9
- "version": "0.1.23",
9
+ "version": "0.1.24",
10
10
  "license": "SEE LICENSE IN LICENSE",
11
11
  "os": [
12
12
  "darwin",
@@ -277,9 +277,9 @@
277
277
  }
278
278
  },
279
279
  "node_modules/@fastify/reply-from": {
280
- "version": "12.6.2",
281
- "resolved": "https://registry.npmjs.org/@fastify/reply-from/-/reply-from-12.6.2.tgz",
282
- "integrity": "sha512-FhMvsRJa4HMG0q0/Yi06sgwVFd/Wc8E/+RbHsqB0Q+883C66RPrS6qwZKBPje2mVzsyEb9sjq7wlyvi35zRW0A==",
280
+ "version": "12.6.3",
281
+ "resolved": "https://registry.npmjs.org/@fastify/reply-from/-/reply-from-12.6.3.tgz",
282
+ "integrity": "sha512-oP8V1jo1SVL2MtagitoOGK7voP88VID0sGsm2Ob1lEzD0h9GBWq36zAe8JmYjllj0ybdHcMTQEhE/EQzVAjWsQ==",
283
283
  "funding": [
284
284
  {
285
285
  "type": "github",
@@ -296,27 +296,11 @@
296
296
  "end-of-stream": "^1.4.4",
297
297
  "fast-content-type-parse": "^3.0.0",
298
298
  "fast-querystring": "^1.1.2",
299
- "fastify-plugin": "^5.0.1",
299
+ "fastify-plugin": "^6.0.0",
300
300
  "toad-cache": "^3.7.0",
301
301
  "undici": "^7.0.0"
302
302
  }
303
303
  },
304
- "node_modules/@fastify/reply-from/node_modules/fastify-plugin": {
305
- "version": "5.1.0",
306
- "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-5.1.0.tgz",
307
- "integrity": "sha512-FAIDA8eovSt5qcDgcBvDuX/v0Cjz0ohGhENZ/wpc3y+oZCY2afZ9Baqql3g/lC+OHRnciQol4ww7tuthOb9idw==",
308
- "funding": [
309
- {
310
- "type": "github",
311
- "url": "https://github.com/sponsors/fastify"
312
- },
313
- {
314
- "type": "opencollective",
315
- "url": "https://opencollective.com/fastify"
316
- }
317
- ],
318
- "license": "MIT"
319
- },
320
304
  "node_modules/@hono/node-server": {
321
305
  "version": "1.19.14",
322
306
  "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.14.tgz",
@@ -1200,9 +1184,9 @@
1200
1184
  }
1201
1185
  },
1202
1186
  "node_modules/avvio": {
1203
- "version": "9.2.0",
1204
- "resolved": "https://registry.npmjs.org/avvio/-/avvio-9.2.0.tgz",
1205
- "integrity": "sha512-2t/sy01ArdHHE0vRH5Hsay+RtCZt3dLPji7W7/MMOCEgze5b7SNDC4j5H6FnVgPkI1MTNFGzHdHrVXDDl7QSSQ==",
1187
+ "version": "9.3.0",
1188
+ "resolved": "https://registry.npmjs.org/avvio/-/avvio-9.3.0.tgz",
1189
+ "integrity": "sha512-g2tQ7LE7oOSqDfwEm3M+ZCMTJc7KiZCdJ4UwyZJb5ckTKyYu50OYmvv0mCFXPuYXoM4zkSt8zM9XQ9KCvxA74A==",
1206
1190
  "funding": [
1207
1191
  {
1208
1192
  "type": "github",
@@ -2186,9 +2170,9 @@
2186
2170
  "license": "ISC"
2187
2171
  },
2188
2172
  "node_modules/grammex": {
2189
- "version": "3.1.12",
2190
- "resolved": "https://registry.npmjs.org/grammex/-/grammex-3.1.12.tgz",
2191
- "integrity": "sha512-6ufJOsSA7LcQehIJNCO7HIBykfM7DXQual0Ny780/DEcJIpBlHRvcqEBWGPYd7hrXL2GJ3oJI1MIhaXjWmLQOQ==",
2173
+ "version": "3.1.13",
2174
+ "resolved": "https://registry.npmjs.org/grammex/-/grammex-3.1.13.tgz",
2175
+ "integrity": "sha512-LnPnhOBLEJEVKS8WFDVaA397L9Kq55Q9oSITJiVLHVdhAclfUkWzQv74KhvZHKL2Q09Pb1XdsrOsZ4LfTFFTEg==",
2192
2176
  "license": "MIT"
2193
2177
  },
2194
2178
  "node_modules/graphmatch": {
@@ -2222,9 +2206,9 @@
2222
2206
  }
2223
2207
  },
2224
2208
  "node_modules/hono": {
2225
- "version": "4.12.29",
2226
- "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.29.tgz",
2227
- "integrity": "sha512-1hNiRjawYrLq/4m3DQQjPGFg0VZkk4RjQJDff/excI6Dm9BiL75qxGrd7/c6YOxPdq6AscP3LiXhQ6fKFC1Waw==",
2209
+ "version": "4.12.30",
2210
+ "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.30.tgz",
2211
+ "integrity": "sha512-emn+JoJjrN9YTpRDS5it/UI2SO9BAE37T6I3d963RxcZ81G9A4pr2SZTEiiaiKbzx+NKRg5BZ89fCL7gCJCUog==",
2228
2212
  "license": "MIT",
2229
2213
  "engines": {
2230
2214
  "node": ">=16.9.0"
@@ -2333,9 +2317,9 @@
2333
2317
  }
2334
2318
  },
2335
2319
  "node_modules/js-base64": {
2336
- "version": "3.8.1",
2337
- "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.8.1.tgz",
2338
- "integrity": "sha512-5xVjhUZlHHeuO2W7w2rDFj/Kl1xLX+HjZxdOQwCsUOifl6UaoH1o1wsbsTMz+r0aeC7gCijvru02j6TfKZWzKg==",
2320
+ "version": "3.9.1",
2321
+ "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.9.1.tgz",
2322
+ "integrity": "sha512-U73qptcvf/HIOauFOmqT3a0mDUp0MYlfd15oqoe9kqZt5XhiXVb+HG09sLvI9PQ9tZIBFS4nlErai8zbWazP0g==",
2339
2323
  "license": "BSD-3-Clause"
2340
2324
  },
2341
2325
  "node_modules/json-schema-ref-resolver": {
@@ -3331,9 +3315,9 @@
3331
3315
  }
3332
3316
  },
3333
3317
  "node_modules/socket.io-parser": {
3334
- "version": "4.2.6",
3335
- "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.6.tgz",
3336
- "integrity": "sha512-asJqbVBDsBCJx0pTqw3WfesSY0iRX+2xzWEWzrpcH7L6fLzrhyF8WPI8UaeM4YCuDfpwA/cgsdugMsmtz8EJeg==",
3318
+ "version": "4.2.7",
3319
+ "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.7.tgz",
3320
+ "integrity": "sha512-IH/iSeO9T6gz1KkFleGDWkG9N3dl4jXVYUtMhIqH10Md0ttMer8nUNWiP1DKuNrybD2xBrixLJdCC9J6ECoYkg==",
3337
3321
  "license": "MIT",
3338
3322
  "dependencies": {
3339
3323
  "@socket.io/component-emitter": "~3.1.0",
@@ -3592,9 +3576,9 @@
3592
3576
  "license": "ISC"
3593
3577
  },
3594
3578
  "node_modules/ws": {
3595
- "version": "8.21.0",
3596
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz",
3597
- "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==",
3579
+ "version": "8.21.1",
3580
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.1.tgz",
3581
+ "integrity": "sha512-+0NTnW77fFN/DjQi6k/Sq/Yvk4Sgajw7urW8V+asjXnRgDs9gyGkdb7EzgfhA4goXsRIZKE28fzIXBHEzhuiWw==",
3598
3582
  "license": "MIT",
3599
3583
  "engines": {
3600
3584
  "node": ">=10.0.0"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@minimalcorp/tsunagi",
3
- "version": "0.1.23",
3
+ "version": "0.1.24",
4
4
  "description": "Multi-repo GitHub project management with Claude AI integration, designed for visualizing and controlling AI-driven development locally.",
5
5
  "keywords": [
6
6
  "tsunagi",
@@ -46,6 +46,7 @@
46
46
  "scripts/monaco-editor.sh",
47
47
  "tsunagi-marketplace/**/*",
48
48
  "whisper-server/**/*",
49
+ "llm-server/**/*",
49
50
  "LICENSE",
50
51
  "README.md"
51
52
  ],
@@ -14,10 +14,14 @@ import io
14
14
 
15
15
  import av
16
16
  import numpy as np
17
- from fastapi import FastAPI, File, UploadFile
17
+ from fastapi import FastAPI, File, Form, UploadFile
18
18
  import mlx_whisper
19
19
 
20
20
  MODEL = "mlx-community/whisper-large-v3-turbo"
21
+ # 無音・雑音区間で「ご視聴ありがとうございました」等の無関係な文章を自信満々に
22
+ # 生成してしまう(Whisper系モデルで知られたハルシネーション挙動)ことがあるため、
23
+ # no_speech_prob(無音である確率)がこの値を超えるセグメントは出力から除外する。
24
+ NO_SPEECH_THRESHOLD = 0.6
21
25
 
22
26
  app = FastAPI()
23
27
 
@@ -45,8 +49,25 @@ def decode_to_16k_mono(data: bytes) -> np.ndarray:
45
49
 
46
50
 
47
51
  @app.post("/transcribe")
48
- async def transcribe(file: UploadFile = File(...)) -> dict:
52
+ async def transcribe(file: UploadFile = File(...), prompt: str | None = Form(None)) -> dict:
49
53
  data = await file.read()
50
54
  audio = decode_to_16k_mono(data)
51
- result = mlx_whisper.transcribe(audio, path_or_hf_repo=MODEL, language="ja")
52
- return {"text": result["text"].strip()}
55
+ # initial_promptは文字起こしのスタイル(表記ゆれ・句読点・固有名詞など)
56
+ # 誘導するヒントで、tsunagiのSettingsからユーザーが自由に設定できる。
57
+ result = mlx_whisper.transcribe(
58
+ audio, path_or_hf_repo=MODEL, language="ja", initial_prompt=prompt or None
59
+ )
60
+
61
+ # result["text"]はno_speech_prob等のフィルタを経ずに全セグメントを結合した
62
+ # ものなので使わず、セグメント単位でno_speech_probを見て自前で組み立て直す。
63
+ segments = result.get("segments")
64
+ if segments:
65
+ text = "".join(
66
+ seg["text"]
67
+ for seg in segments
68
+ if seg.get("no_speech_prob", 0.0) <= NO_SPEECH_THRESHOLD
69
+ )
70
+ else:
71
+ text = result.get("text", "")
72
+
73
+ return {"text": text.strip()}
@@ -1 +0,0 @@
1
- (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,41241,19556,9752,20486,e=>{"use strict";var t=e.i(49915),a=(0,e.i(65485).default)(Object.keys,Object),r=Object.prototype.hasOwnProperty;let i=function(e){if(!(0,t.default)(e))return a(e);var i=[];for(var s in Object(e))r.call(e,s)&&"constructor"!=s&&i.push(s);return i};e.s(["default",0,i],19556);var s=e.i(47244),l=e.i(56176),n=(0,s.default)(l.default,"DataView"),u=e.i(44483),o=(0,s.default)(l.default,"Promise"),d=(0,s.default)(l.default,"Set");e.s(["default",0,d],9752);var c=(0,s.default)(l.default,"WeakMap"),f=e.i(35287),m=e.i(66762),v="[object Map]",p="[object Promise]",h="[object Set]",g="[object WeakMap]",b="[object DataView]",k=(0,m.default)(n),y=(0,m.default)(u.default),j=(0,m.default)(o),x=(0,m.default)(d),w=(0,m.default)(c),P=f.default;(n&&P(new n(new ArrayBuffer(1)))!=b||u.default&&P(new u.default)!=v||o&&P(o.resolve())!=p||d&&P(new d)!=h||c&&P(new c)!=g)&&(P=function(e){var t=(0,f.default)(e),a="[object Object]"==t?e.constructor:void 0,r=a?(0,m.default)(a):"";if(r)switch(r){case k:return b;case y:return v;case j:return p;case x:return h;case w:return g}return t});let C=P;e.s(["default",0,C],20486);var M=e.i(15300),E=e.i(44071),R=e.i(41338),I=e.i(3745),O=e.i(1645),S=Object.prototype.hasOwnProperty;e.s(["default",0,function(e){if(null==e)return!0;if((0,R.default)(e)&&((0,E.default)(e)||"string"==typeof e||"function"==typeof e.splice||(0,I.default)(e)||(0,O.default)(e)||(0,M.default)(e)))return!e.length;var a=C(e);if("[object Map]"==a||"[object Set]"==a)return!e.size;if((0,t.default)(e))return!i(e).length;for(var r in e)if(S.call(e,r))return!1;return!0}],41241)},44917,e=>{"use strict";var t=e.i(96977),a=e.i(71206);e.i(47716);var r=e.i(23685),i=(0,a.__name)(e=>{let{securityLevel:a}=(0,t.getConfig2)(),i=(0,r.select)("body");if("sandbox"===a){let t=(0,r.select)(`#i${e}`),a=t.node()?.contentDocument??document;i=(0,r.select)(a.body)}return i.select(`#${e}`)},"selectSvgElement");e.s(["selectSvgElement",0,i])},3262,e=>{"use strict";var t=e.i(31360),a=e.i(60884),r=e.i(29432),i=e.i(96977),s=e.i(71206),l={common:i.common_default,getConfig:i.getConfig,insertCluster:a.insertCluster,insertEdge:t.insertEdge,insertEdgeLabel:t.insertEdgeLabel,insertMarkers:t.markers_default,insertNode:a.insertNode,interpolateToCurve:r.interpolateToCurve,labelHelper:a.labelHelper,log:s.log,positionEdgeLabel:t.positionEdgeLabel},n={},u=(0,s.__name)(e=>{for(let t of e)n[t.name]=t},"registerLayoutLoaders");(0,s.__name)(()=>{u([{name:"dagre",loader:(0,s.__name)(async()=>await e.A(92568),"loader")},{name:"cose-bilkent",loader:(0,s.__name)(async()=>await e.A(62369),"loader")}])},"registerDefaultLayoutLoaders")();var o=(0,s.__name)(async(e,t)=>{if(!(e.layoutAlgorithm in n))throw Error(`Unknown layout algorithm: ${e.layoutAlgorithm}`);if(e.diagramId)for(let t of e.nodes){let a=t.domId||t.id;t.domId=`${e.diagramId}-${a}`}let a=n[e.layoutAlgorithm],r=await a.loader(),{theme:i,themeVariables:s}=e.config,{useGradient:u,gradientStart:o,gradientStop:d}=s,c=t.attr("id");if(t.append("defs").append("filter").attr("id",`${c}-drop-shadow`).attr("height","130%").attr("width","130%").append("feDropShadow").attr("dx","4").attr("dy","4").attr("stdDeviation",0).attr("flood-opacity","0.06").attr("flood-color",`${i?.includes("dark")?"#FFFFFF":"#000000"}`),t.append("defs").append("filter").attr("id",`${c}-drop-shadow-small`).attr("height","150%").attr("width","150%").append("feDropShadow").attr("dx","2").attr("dy","2").attr("stdDeviation",0).attr("flood-opacity","0.06").attr("flood-color",`${i?.includes("dark")?"#FFFFFF":"#000000"}`),u){let e=t.append("linearGradient").attr("id",t.attr("id")+"-gradient").attr("gradientUnits","objectBoundingBox").attr("x1","0%").attr("y1","0%").attr("x2","100%").attr("y2","0%");e.append("svg:stop").attr("offset","0%").attr("stop-color",o).attr("stop-opacity",1),e.append("svg:stop").attr("offset","100%").attr("stop-color",d).attr("stop-opacity",1)}return r.render(e,t,l,{algorithm:a.algorithm})},"render"),d=(0,s.__name)((e="",{fallback:t="dagre"}={})=>{if(e in n)return e;if(t in n)return s.log.warn(`Layout algorithm ${e} is not registered. Using ${t} as fallback.`),t;throw Error(`Both layout algorithms ${e} and ${t} are not registered.`)},"getRegisteredLayoutAlgorithm");e.s(["getRegisteredLayoutAlgorithm",0,d,"registerLayoutLoaders",0,u,"render",0,o])},50160,e=>{e.q("/_next/static/media/icon.0fkix7.hkmsz4.png")},18566,(e,t,a)=>{t.exports=e.r(76562)},43531,78745,e=>{"use strict";let t=(0,e.i(75254).default)("check",[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]]);e.s(["default",0,t],78745),e.s(["Check",0,t],43531)},37870,31278,e=>{"use strict";var t=e.i(18050),a=e.i(17521);e.s(["Loader2",()=>a.default],31278);var a=a;e.s(["LoadingSpinner",0,function({size:e="md",message:r}){return(0,t.jsxs)("div",{className:"flex flex-col items-center justify-center gap-3",children:[(0,t.jsx)(a.default,{className:`${{sm:"w-4 h-4",md:"w-8 h-8",lg:"w-12 h-12"}[e]} text-primary animate-spin`}),r&&(0,t.jsx)("p",{className:"text-sm text-muted-foreground",children:r})]})}],37870)},10012,24564,94349,e=>{"use strict";var t,a=e.i(18050);e.i(47167);var r=e.i(71645);e.s([],19485),e.i(19485);var i=e.i(76477),s=e.i(67805),l=e.i(17514);let n=((t={}).disabled="data-disabled",t.valid="data-valid",t.invalid="data-invalid",t.touched="data-touched",t.dirty="data-dirty",t.filled="data-filled",t.focused="data-focused",t),u={badInput:!1,customError:!1,patternMismatch:!1,rangeOverflow:!1,rangeUnderflow:!1,stepMismatch:!1,tooLong:!1,tooShort:!1,typeMismatch:!1,valid:null,valueMissing:!1},o={valid:null,touched:!1,dirty:!1,filled:!1,focused:!1},d={disabled:!1,...o},c={valid:e=>null===e?null:e?{[n.valid]:""}:{[n.invalid]:""}},f=r.createContext({invalid:void 0,name:void 0,validityData:{state:u,errors:[],error:"",value:"",initialValue:null},setValidityData:l.NOOP,disabled:void 0,touched:o.touched,setTouched:l.NOOP,dirty:o.dirty,setDirty:l.NOOP,filled:o.filled,setFilled:l.NOOP,focused:o.focused,setFocused:l.NOOP,validate:()=>null,validationMode:"onSubmit",validationDebounceTime:0,shouldValidateOnChange:()=>!1,state:d,markedDirtyRef:{current:!1},validation:{getValidationProps:(e=l.EMPTY_OBJECT)=>e,getInputValidationProps:(e=l.EMPTY_OBJECT)=>e,inputRef:{current:null},commit:async()=>{}}});function m(e=!0){let t=r.useContext(f);if(t.setValidityData===l.NOOP&&!e)throw Error((0,s.default)(28));return t}let v=r.createContext({legendId:void 0,setLegendId:()=>{},disabled:void 0}),p=r.createContext({formRef:{current:{fields:new Map}},errors:{},clearErrors:l.NOOP,validationMode:"onSubmit",submitAttemptedRef:{current:!1}});function h(){return r.useContext(p)}var g=e.i(30628),b=e.i(19805),k=e.i(89879);let y=r.createContext({controlId:void 0,registerControlId:l.NOOP,labelId:void 0,setLabelId:l.NOOP,messageIds:[],setMessageIds:l.NOOP,getDescriptionProps:e=>e});function j(){return r.useContext(y)}let x=function(e){let t=(0,k.useBaseUiId)(),s=void 0===e.controlId?t:e.controlId,[l,n]=r.useState(s),[u,o]=r.useState(e.labelId),[d,c]=r.useState([]),f=(0,g.useRefWithInit)(()=>new Map),{messageIds:m}=j(),v=(0,i.useStableCallback)((e,t)=>{let a=f.current;void 0===t?a.delete(e):(a.set(e,t),n(e=>{let t;if(0!==a.size){for(let r of a.values()){if(void 0!==e&&r===e)return e;void 0===t&&(t=r)}return t}}))}),p=r.useCallback(e=>(0,b.mergeProps)({"aria-describedby":m.concat(d).join(" ")||void 0},e),[m,d]),h=r.useMemo(()=>({controlId:l,registerControlId:v,labelId:u,setLabelId:o,messageIds:d,setMessageIds:c,getDescriptionProps:p}),[l,v,u,o,d,c,p]);return(0,a.jsx)(y.Provider,{value:h,children:e.children})};var w=e.i(27601),P=e.i(66745);function C(e,t){return{...e,state:{...e.state,valid:!t&&e.state.valid}}}let M=Object.keys(u),E=r.forwardRef(function(e,t){let{errors:n,validationMode:o,submitAttemptedRef:d}=h(),{render:m,className:p,validate:g,validationDebounceTime:k=0,validationMode:y=o,name:x,disabled:E=!1,invalid:R,dirty:I,touched:O,actionsRef:S,...q}=e,{disabled:_}=function(e=!1){let t=r.useContext(v);if(!t&&!e)throw Error((0,s.default)(86));return t}(),L=(0,i.useStableCallback)(g||(()=>null)),A=_||E,[T,V]=r.useState(!1),[N,D]=r.useState(!1),[F,z]=r.useState(!1),[$,B]=r.useState(!1),U=I??N,H=O??T,J=r.useRef(!1),W=(0,i.useStableCallback)(e=>{void 0===I&&(e&&(J.current=!0),D(e))}),K=(0,i.useStableCallback)(e=>{void 0===O&&V(e)}),Y=(0,i.useStableCallback)(()=>"onChange"===y||"onSubmit"===y&&d.current),G=!!x&&Object.hasOwn(n,x)&&void 0!==n[x],Q=!0===R||G,[X,Z]=r.useState({state:u,error:"",errors:[],value:null,initialValue:null}),ee=!Q&&X.state.valid,et=r.useMemo(()=>({disabled:A,touched:H,dirty:U,valid:ee,filled:F,focused:$}),[A,H,U,ee,F,$]),ea=function(e){let{formRef:t,clearErrors:a}=h(),{setValidityData:s,validate:n,validityData:o,validationDebounceTime:d,invalid:c,markedDirtyRef:f,state:m,name:v,shouldValidateOnChange:p}=e,{controlId:g,getDescriptionProps:k}=j(),y=(0,P.useTimeout)(),x=r.useRef(null),w=(0,i.useStableCallback)(async(e,a=!1)=>{let r,i=x.current;if(!i)return;if(a){if(!1!==m.valid)return;let a=i.validity;if(!a.valueMissing){let a={value:e,state:{...u,valid:!0},error:"",errors:[],initialValue:o.initialValue};if(i.setCustomValidity(""),g){let e=t.current.fields.get(g);e&&t.current.fields.set(g,{...e,...C(a,!1)})}s(a);return}let r=M.reduce((e,t)=>(e[t]=a[t],e),{});if(!r.valid&&!function(e){if(!e||e.valid||!e.valueMissing)return!1;let t=!1;for(let a of M)"valid"!==a&&("valueMissing"===a&&(t=e[a]),e[a]&&(t=!1));return t}(r))return}y.clear();let l=null,d=[],v=function(e){let t=M.reduce((t,a)=>(t[a]=e.validity[a],t),{}),a=!1;for(let e of M)if("valid"!==e){if("valueMissing"===e&&t[e])a=!0;else if(t[e])return t}return a&&!f.current&&(t.valid=!0,t.valueMissing=!1),t}(i),h=p();if(i.validationMessage&&!h)r=i.validationMessage,d=[i.validationMessage];else{let a=n(e,Array.from(t.current.fields.values()).reduce((e,t)=>(t.name&&(e[t.name]=t.getValue()),e),{}));null!==(l="object"==typeof a&&null!==a&&"then"in a?await a:a)?(v.valid=!1,v.customError=!0,Array.isArray(l)?(d=l,i.setCustomValidity(l.join("\n"))):l&&(d=[l],i.setCustomValidity(l))):h&&(i.setCustomValidity(""),v.customError=!1,i.validationMessage?(r=i.validationMessage,d=[i.validationMessage]):i.validity.valid&&!v.valid&&(v.valid=!0))}let b={value:e,state:v,error:r??(Array.isArray(l)?l[0]:l??""),errors:d,initialValue:o.initialValue};if(g){let e=t.current.fields.get(g);e&&t.current.fields.set(g,{...e,...C(b,c)})}s(b)}),E=r.useCallback((e={})=>(0,b.mergeProps)(k,!1===m.valid?{"aria-invalid":!0}:l.EMPTY_OBJECT,e),[k,m.valid]),R=r.useCallback((e={})=>(0,b.mergeProps)({onChange(e){if(e.nativeEvent.defaultPrevented)return;if(a(v),!p())return void w(e.currentTarget.value,!0);let t=e.currentTarget;""===t.value?w(t.value):(y.clear(),d?y.start(d,()=>{w(t.value)}):w(t.value))}},E(e)),[E,a,v,y,w,d,p]);return r.useMemo(()=>({getValidationProps:E,getInputValidationProps:R,inputRef:x,commit:w}),[E,R,w])}({setValidityData:Z,validate:L,validityData:X,validationDebounceTime:k,invalid:Q,markedDirtyRef:J,state:et,name:x,shouldValidateOnChange:Y}),er=r.useCallback(()=>{J.current=!0,ea.commit(X.value)},[ea,X]);r.useImperativeHandle(S,()=>({validate:er}),[er]);let ei=r.useMemo(()=>({invalid:Q,name:x,validityData:X,setValidityData:Z,disabled:A,touched:H,setTouched:K,dirty:U,setDirty:W,filled:F,setFilled:z,focused:$,setFocused:B,validate:L,validationMode:y,validationDebounceTime:k,shouldValidateOnChange:Y,state:et,markedDirtyRef:J,validation:ea}),[Q,x,X,A,H,K,U,W,F,z,$,B,L,y,k,Y,et,ea]),es=(0,w.useRenderElement)("div",e,{ref:t,state:et,props:q,stateAttributesMapping:c});return(0,a.jsx)(f.Provider,{value:ei,children:es})}),R=r.forwardRef(function(e,t){return(0,a.jsx)(x,{children:(0,a.jsx)(E,{...e,ref:t})})});var I=e.i(29315),O=e.i(90219),S=e.i(47857),q=e.i(977);function _(e,t){let a=(0,k.useBaseUiId)(e);return(0,q.useIsoLayoutEffect)(()=>(t(a),()=>{t(void 0)}),[a,t]),a}e.s(["useRegisteredLabelId",0,_],24564);let L=r.forwardRef(function(e,t){let{render:a,className:s,id:l,nativeLabel:n=!0,...u}=e,o=m(!1),{labelId:d}=j(),f=r.useRef(null),v=function(e={}){let{id:t,fallbackControlId:a,native:r=!1,setLabelId:s,focusControl:l}=e,{controlId:n,setLabelId:u}=j(),o=_(t,(0,i.useStableCallback)(e=>{u(e),s?.(e)})),d=n??a;function c(e){let t=(0,S.getTarget)(e.nativeEvent);t?.closest("button,input,select,textarea")||(!e.defaultPrevented&&e.detail>1&&e.preventDefault(),r||function(e){if(l)return l(e,d);if(!d)return;let t=(0,O.ownerDocument)(e.currentTarget).getElementById(d);(0,I.isHTMLElement)(t)&&t.focus({focusVisible:!0})}(e))}return r?{id:o,htmlFor:d??void 0,onMouseDown:c}:{id:o,onClick:c,onPointerDown(e){e.preventDefault()}}}({id:d??l,native:n});return(0,w.useRenderElement)("label",e,{ref:[t,f],state:o.state,props:[v,u],stateAttributesMapping:c})});var A=e.i(89269),T=e.i(84759),V=e.i(88841);let N={...c,...T.transitionStatusMapping},D=r.forwardRef(function(e,t){let{render:i,id:s,className:l,match:n,...u}=e,o=(0,k.useBaseUiId)(s),{validityData:d,state:c,name:f}=m(!1),{setMessageIds:v}=j(),{errors:p}=h(),g=f?p[f]:null,b=!1;b=!!g||!0===n||(n?!!d.state[n]:!1===d.state.valid);let{mounted:y,transitionStatus:x,setMounted:P}=(0,V.useTransitionStatus)(b);(0,q.useIsoLayoutEffect)(()=>{if(b&&o)return v(e=>e.concat(o)),()=>{v(e=>e.filter(e=>e!==o))}},[b,o,v]);let C=r.useRef(null),[M,E]=r.useState(null),[R,I]=r.useState(null),O=g||(d.errors.length>1?(0,a.jsx)("ul",{children:d.errors.map(e=>(0,a.jsx)("li",{children:e},e))}):d.error),S=d.error;null!=g?S=Array.isArray(g)?JSON.stringify(g):g:d.errors.length>1&&(S=JSON.stringify(d.errors)),b&&S!==R&&(I(S),E(O)),(0,A.useOpenChangeComplete)({open:b,ref:C,onComplete(){b||P(!1)}});let _={...c,transitionStatus:x},L=(0,w.useRenderElement)("div",e,{ref:[t,C],state:_,props:[{id:o,children:b?O:M},u],stateAttributesMapping:N,enabled:y});return y?L:null}),F=r.forwardRef(function(e,t){let{render:a,id:r,className:i,...s}=e,l=(0,k.useBaseUiId)(r),n=m(!1),{setMessageIds:u}=j();return(0,q.useIsoLayoutEffect)(()=>{if(l)return u(e=>e.concat(l)),()=>{u(e=>e.filter(e=>e!==l))}},[l,u]),(0,w.useRenderElement)("p",e,{ref:t,state:n.state,props:[{id:l},s],stateAttributesMapping:c})});function z({controlled:e,default:t,name:a,state:i="value"}){let{current:s}=r.useRef(void 0!==e),[l,n]=r.useState(t),u=r.useCallback(e=>{s||n(e)},[]);return[s?e:l,u]}e.s(["useControlled",0,z],94349);var $=e.i(74080),B=e.i(5963),U=e.i(3404);let H=r.forwardRef(function(e,t){let{render:a,className:s,id:n,name:u,value:o,disabled:d=!1,onValueChange:f,defaultValue:v,autoFocus:p=!1,...b}=e,{state:y,name:x,disabled:P,setTouched:M,setDirty:E,validityData:R,setFocused:_,setFilled:L,validationMode:A,validation:T}=m(),V=P||d,N=x??u,D={...y,disabled:V},{labelId:F}=j(),H=function(e={}){let{id:t,implicit:a=!1,controlRef:s}=e,{controlId:n,registerControlId:u}=j(),o=(0,k.useBaseUiId)(t),d=a?n:void 0,c=(0,g.useRefWithInit)(()=>Symbol("labelable-control")),f=r.useRef(!1),m=r.useRef(null!=t),v=(0,i.useStableCallback)(()=>{f.current&&u!==l.NOOP&&(f.current=!1,u(c.current,void 0))});return(0,q.useIsoLayoutEffect)(()=>{let e;if(u!==l.NOOP){if(a){let a=s?.current;e=(0,I.isElement)(a)&&null!=a.closest("label")?t??null:d??o}else if(null!=t)m.current=!0,e=t;else{if(!m.current)return void v();e=o}if(void 0===e)return void v();f.current=!0,u(c.current,e)}},[t,s,d,u,a,o,c,v]),r.useEffect(()=>v,[v]),n??o}({id:n});(0,q.useIsoLayoutEffect)(()=>{let e=null!=o;T.inputRef.current?.value||e&&""!==o?L(!0):e&&""===o&&L(!1)},[T.inputRef,L,o]);let J=r.useRef(null);(0,q.useIsoLayoutEffect)(()=>{p&&J.current===(0,S.activeElement)((0,O.ownerDocument)(J.current))&&_(!0)},[p,_]);let[W]=z({controlled:o,default:v,name:"FieldControl",state:"value"}),K=void 0!==o,Y=K?W:void 0;return!function(e){let{enabled:t=!0,value:a,id:r,name:s,controlRef:l,commit:n}=e,{formRef:u}=h(),{invalid:o,markedDirtyRef:d,validityData:c,setValidityData:f}=m(),v=(0,i.useStableCallback)(e.getValue);(0,q.useIsoLayoutEffect)(()=>{if(!t)return;let e=a;void 0===e&&(e=v()),null===c.initialValue&&null!==e&&f(t=>({...t,initialValue:e}))},[t,f,a,c.initialValue,v]),(0,q.useIsoLayoutEffect)(()=>{t&&r&&u.current.fields.set(r,{getValue:v,name:s,controlRef:l,validityData:C(c,o),validate(e=!0){let t=a;void 0===t&&(t=v()),d.current=!0,e?$.flushSync(()=>n(t)):n(t)}})},[n,l,t,u,v,r,o,d,s,c,a]),(0,q.useIsoLayoutEffect)(()=>{let e=u.current.fields;return()=>{r&&e.delete(r)}},[u,r])}({id:H,name:N,commit:T.commit,value:Y,getValue:()=>T.inputRef.current?.value,controlRef:T.inputRef}),(0,w.useRenderElement)("input",e,{ref:[t,J],state:D,props:[{id:H,disabled:V,name:N,ref:T.inputRef,"aria-labelledby":F,autoFocus:p,...K?{value:Y}:{defaultValue:v},onChange(e){let t=e.currentTarget.value;f?.(t,(0,B.createChangeEventDetails)(U.REASONS.none,e.nativeEvent)),E(t!==R.initialValue),L(""!==t)},onFocus(){_(!0)},onBlur(e){M(!0),_(!1),"onBlur"===A&&T.commit(e.currentTarget.value)},onKeyDown(e){"INPUT"===e.currentTarget.tagName&&"Enter"===e.key&&(M(!0),T.commit(e.currentTarget.value))}},T.getInputValidationProps(),b],stateAttributesMapping:c})}),J=r.createContext({disabled:!1}),W=r.createContext(void 0),K=r.forwardRef(function(e,t){let{render:i,className:l,disabled:n=!1,...u}=e,{state:o,disabled:d}=m(!1),f=d||n,v=function(e=!0){let t=r.useContext(W);if(void 0===t&&!e)throw Error((0,s.default)(3));return t}(),p=v?.parent.id,h=v?.allValues!==void 0,g=r.useMemo(()=>({disabled:f}),[f]),b=(0,w.useRenderElement)("div",e,{ref:t,state:o,props:u,stateAttributesMapping:c});return(0,a.jsx)(x,{controlId:h?p:void 0,children:(0,a.jsx)(J.Provider,{value:g,children:b})})});e.s(["Control",0,H,"Description",0,F,"Error",0,D,"Item",0,K,"Label",0,L,"Root",0,R,"Validity",0,function(e){let{children:t}=e,{validityData:i,invalid:s}=m(!1),l=r.useMemo(()=>C(i,s),[i,s]),n=!1===l.state.valid,{transitionStatus:u}=(0,V.useTransitionStatus)(n),o=r.useMemo(()=>({...l,validity:l.state,transitionStatus:u}),[l,u]);return(0,a.jsx)(r.Fragment,{children:t(o)})}],71975);var Y=e.i(71975),Y=Y;let G=r.forwardRef(function(e,t){return(0,a.jsx)(Y.Control,{ref:t,...e})});var Q=e.i(52088);e.s(["Input",0,function({className:e,type:t,...r}){return(0,a.jsx)(G,{type:t,"data-slot":"input",className:(0,Q.cn)("h-9 w-full min-w-0 rounded-md border border-input bg-input/20 px-3 py-1 text-sm transition-colors outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-2 focus-visible:ring-ring/30 disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-2 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40",e),...r})}],10012)},86536,e=>{"use strict";let t=(0,e.i(75254).default)("eye",[["path",{d:"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0",key:"1nclc0"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]]);e.s(["Eye",0,t],86536)},27612,e=>{"use strict";let t=(0,e.i(75254).default)("trash-2",[["path",{d:"M10 11v6",key:"nco0om"}],["path",{d:"M14 11v6",key:"outv1u"}],["path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6",key:"miytrc"}],["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2",key:"e791ji"}]]);e.s(["Trash2",0,t],27612)},95468,e=>{"use strict";var t=e.i(23287);e.s(["CheckCircle2",()=>t.default])},77814,e=>{"use strict";var t,a=e.i(18050);e.s([],33847),e.i(33847),e.i(47167);var r=e.i(71645),i=e.i(231),s=e.i(62372);let l=new Map;function n(e,t,a){return null==e?"":(function(e,t){let a=JSON.stringify({locale:e,options:t}),r=l.get(a);if(r)return r;let i=new Intl.NumberFormat(e,t);return l.set(a,i),i})(t,a).format(e)}var u=e.i(27601),o=e.i(67805);let d=r.createContext(void 0);function c(){let e=r.useContext(d);if(void 0===e)throw Error((0,o.default)(51));return e}let f=((t={}).complete="data-complete",t.indeterminate="data-indeterminate",t.progressing="data-progressing",t),m={status:e=>"progressing"===e?{[f.progressing]:""}:"complete"===e?{[f.complete]:""}:"indeterminate"===e?{[f.indeterminate]:""}:null};function v(e,t){return null==t?"indeterminate progress":e||`${t}%`}let p=r.forwardRef(function(e,t){var l;let{format:o,getAriaValueText:c=v,locale:f,max:p=100,min:h=0,value:g,render:b,className:k,children:y,...j}=e,[x,w]=r.useState(),P=(0,i.useValueAsRef)(o),C="indeterminate";Number.isFinite(g)&&(C=g===p?"complete":"progressing");let M=(l=P.current,null==g?"":l?n(g,f,l):n(g/100,f,{style:"percent"})),E=r.useMemo(()=>({status:C}),[C]),R={"aria-labelledby":x,"aria-valuemax":p,"aria-valuemin":h,"aria-valuenow":g??void 0,"aria-valuetext":c(M,g),role:"progressbar",children:(0,a.jsxs)(r.Fragment,{children:[y,(0,a.jsx)("span",{role:"presentation",style:s.visuallyHidden,children:"x"})]})},I=r.useMemo(()=>({formattedValue:M,max:p,min:h,setLabelId:w,state:E,status:C,value:g}),[M,p,h,w,E,C,g]),O=(0,u.useRenderElement)("div",e,{state:E,ref:t,props:[R,j],stateAttributesMapping:m});return(0,a.jsx)(d.Provider,{value:I,children:O})}),h=r.forwardRef(function(e,t){let{render:a,className:r,...i}=e,{state:s}=c();return(0,u.useRenderElement)("div",e,{state:s,ref:t,props:i,stateAttributesMapping:m})}),g=r.forwardRef(function(e,t){let{render:a,className:i,...s}=e,{max:l,min:n,value:o,state:d}=c(),f=Number.isFinite(o)&&null!==o?(o-n)*100/(l-n):null,v=r.useCallback(()=>null==f?{}:{insetInlineStart:0,height:"inherit",width:`${f}%`},[f]);return(0,u.useRenderElement)("div",e,{state:d,ref:t,props:[{style:v()},s],stateAttributesMapping:m})}),b=r.forwardRef(function(e,t){let{className:a,render:r,children:i,...s}=e,{value:l,formattedValue:n,state:o}=c(),d=null==l?"indeterminate":n,f=null==l?null:n;return(0,u.useRenderElement)("span",e,{state:o,ref:t,props:[{"aria-hidden":!0,children:"function"==typeof i?i(d,l):f},s],stateAttributesMapping:m})});var k=e.i(24564);let y=r.forwardRef(function(e,t){let{render:a,className:r,id:i,...s}=e,{setLabelId:l,state:n}=c(),o=(0,k.useRegisteredLabelId)(i,l);return(0,u.useRenderElement)("span",e,{state:n,ref:t,props:[{id:o,role:"presentation"},s],stateAttributesMapping:m})});e.s(["Indicator",0,g,"Label",0,y,"Root",0,p,"Track",0,h,"Value",0,b],45929);var j=e.i(45929),j=j,x=e.i(52088);function w({className:e,...t}){return(0,a.jsx)(j.Track,{className:(0,x.cn)("relative flex h-1 w-full items-center overflow-x-hidden rounded-md bg-muted",e),"data-slot":"progress-track",...t})}function P({className:e,...t}){return(0,a.jsx)(j.Indicator,{"data-slot":"progress-indicator",className:(0,x.cn)("h-full bg-primary",e),style:{transition:"width 500ms ease-in-out"},...t})}e.s(["Progress",0,function({className:e,children:t,value:r,...i}){return(0,a.jsxs)(j.Root,{value:r,"data-slot":"progress",className:(0,x.cn)("flex flex-wrap gap-3",e),...i,children:[t,(0,a.jsx)(w,{children:(0,a.jsx)(P,{})})]})}],77814)},63209,e=>{"use strict";let t=(0,e.i(75254).default)("circle-alert",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["line",{x1:"12",x2:"12",y1:"8",y2:"12",key:"1pkeuh"}],["line",{x1:"12",x2:"12.01",y1:"16",y2:"16",key:"4dfq90"}]]);e.s(["AlertCircle",0,t],63209)},87951,52044,e=>{"use strict";var t=e.i(75254);let a=(0,t.default)("mic",[["path",{d:"M12 19v3",key:"npa21l"}],["path",{d:"M19 10v2a7 7 0 0 1-14 0v-2",key:"1vc78b"}],["rect",{x:"9",y:"2",width:"6",height:"13",rx:"3",key:"s6n7sd"}]]);e.s(["Mic",0,a],87951);let r=(0,t.default)("square",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}]]);e.s(["Square",0,r],52044)},57024,e=>{"use strict";var t=e.i(85699);function a(e){let{type:a,title:r,description:i,duration:s}=e,l=e.id??crypto.randomUUID(),n={id:l,description:i,duration:s};switch(a){case"loading":t.toast.loading(r,n);break;case"success":t.toast.success(r,n);break;case"error":t.toast.error(r,n);break;case"warning":t.toast.warning(r,n);break;case"info":t.toast.info(r,n);break;default:(0,t.toast)(r,n)}return l}e.s(["toaster",0,{create:e=>a(e),update:(e,t)=>{a({...t,id:e})},dismiss:e=>{t.toast.dismiss(e)}}])},51846,e=>{"use strict";var t=e.i(71645);e.s(["useDocumentTitle",0,function(e){(0,t.useEffect)(()=>{let t=e?`繋 | ${e}`:"繋",a=document.title;return document.title=t,()=>{document.title=a}},[e])}])},7233,5352,e=>{"use strict";let t=(0,e.i(75254).default)("plus",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]]);e.s(["Plus",0,t],7233);let a=[{bg:"bg-blue-100 dark:bg-blue-900/30",text:"text-blue-700 dark:text-blue-300"},{bg:"bg-emerald-100 dark:bg-emerald-900/30",text:"text-emerald-700 dark:text-emerald-300"},{bg:"bg-violet-100 dark:bg-violet-900/30",text:"text-violet-700 dark:text-violet-300"},{bg:"bg-amber-100 dark:bg-amber-900/30",text:"text-amber-700 dark:text-amber-300"},{bg:"bg-rose-100 dark:bg-rose-900/30",text:"text-rose-700 dark:text-rose-300"},{bg:"bg-cyan-100 dark:bg-cyan-900/30",text:"text-cyan-700 dark:text-cyan-300"},{bg:"bg-orange-100 dark:bg-orange-900/30",text:"text-orange-700 dark:text-orange-300"},{bg:"bg-teal-100 dark:bg-teal-900/30",text:"text-teal-700 dark:text-teal-300"},{bg:"bg-indigo-100 dark:bg-indigo-900/30",text:"text-indigo-700 dark:text-indigo-300"},{bg:"bg-pink-100 dark:bg-pink-900/30",text:"text-pink-700 dark:text-pink-300"},{bg:"bg-lime-100 dark:bg-lime-900/30",text:"text-lime-700 dark:text-lime-300"},{bg:"bg-fuchsia-100 dark:bg-fuchsia-900/30",text:"text-fuchsia-700 dark:text-fuchsia-300"}];e.s(["getRepoColor",0,function(e,t){let r=function(e){let t=5381;for(let a=0;a<e.length;a++)t=33*t^e.charCodeAt(a);return t>>>0}(`${e}/${t}`)%a.length;return a[r]}],5352)},55716,e=>{"use strict";let t=(0,e.i(75254).default)("git-branch",[["line",{x1:"6",x2:"6",y1:"3",y2:"15",key:"17qcm7"}],["circle",{cx:"18",cy:"6",r:"3",key:"1h7g24"}],["circle",{cx:"6",cy:"18",r:"3",key:"fqmcym"}],["path",{d:"M18 9a9 9 0 0 1-9 9",key:"n2h4wq"}]]);e.s(["GitBranch",0,t],55716)},39484,e=>{e.v(t=>Promise.all(["static/chunks/002jt~~cq5_aa.js"].map(t=>e.l(t))).then(()=>t(16400)))},92568,e=>{e.v(t=>Promise.all(["static/chunks/0bew-tpzkv4a6.js","static/chunks/0hc31lz26e0bj.js","static/chunks/156lsa3n_7-g1.js"].map(t=>e.l(t))).then(()=>t(68053)))},62369,e=>{e.v(t=>Promise.all(["static/chunks/0t-ecot2ot8jq.js","static/chunks/0s2ei~z99yg.7.js"].map(t=>e.l(t))).then(()=>t(97810)))},78997,e=>{e.v(t=>Promise.all(["static/chunks/0w4h2u4jedq4..js","static/chunks/0v8zy131j2_sl.js"].map(t=>e.l(t))).then(()=>t(77010)))},28146,e=>{e.v(t=>Promise.all(["static/chunks/179i-blt6kp34.js","static/chunks/004q74ucr0rud.js"].map(t=>e.l(t))).then(()=>t(26067)))},80472,e=>{e.v(t=>Promise.all(["static/chunks/0-whcx~709zzu.js"].map(t=>e.l(t))).then(()=>t(50032)))},83305,e=>{e.v(t=>Promise.all(["static/chunks/00h5q76-kypod.js","static/chunks/0f6mqg1npiv.t.js","static/chunks/0g7ov558axacn.js"].map(t=>e.l(t))).then(()=>t(8709)))},34606,e=>{e.v(t=>Promise.all(["static/chunks/0t-7~zw5_oj33.js","static/chunks/0t1nhjmm.2-8-.js"].map(t=>e.l(t))).then(()=>t(13976)))},23526,e=>{e.v(t=>Promise.all(["static/chunks/0zz1c.5ttlw75.js","static/chunks/0f6mqg1npiv.t.js","static/chunks/00h5q76-kypod.js"].map(t=>e.l(t))).then(()=>t(60498)))},3931,e=>{e.v(t=>Promise.all(["static/chunks/0egss2l0vp3iv.js","static/chunks/0f6mqg1npiv.t.js","static/chunks/00h5q76-kypod.js"].map(t=>e.l(t))).then(()=>t(79567)))},67051,e=>{e.v(t=>Promise.all(["static/chunks/0v~puv980n2mn.js"].map(t=>e.l(t))).then(()=>t(51778)))},36080,e=>{e.v(t=>Promise.all(["static/chunks/0_u58hj44ucg2.js","static/chunks/0coux02phyasu.js"].map(t=>e.l(t))).then(()=>t(79003)))},3156,e=>{e.v(t=>Promise.all(["static/chunks/0~fjlnit~fkey.js"].map(t=>e.l(t))).then(()=>t(91739)))},71209,e=>{e.v(t=>Promise.all(["static/chunks/0njmix7y_6miv.js","static/chunks/0z9df3ijvbr8h.js"].map(t=>e.l(t))).then(()=>t(94614)))},78922,e=>{e.v(t=>Promise.all(["static/chunks/0nt-wtu-~b7hv.js","static/chunks/0nwbvs~t8m~k6.js"].map(t=>e.l(t))).then(()=>t(99223)))},10404,e=>{e.v(t=>Promise.all(["static/chunks/0puq-xa16mucw.js","static/chunks/0nwbvs~t8m~k6.js"].map(t=>e.l(t))).then(()=>t(25730)))},81283,e=>{e.v(t=>Promise.all(["static/chunks/0bew-tpzkv4a6.js","static/chunks/104dsd7mk1jyt.js","static/chunks/0.fiftciismd2.js","static/chunks/0hc31lz26e0bj.js"].map(t=>e.l(t))).then(()=>t(24924)))},41605,e=>{e.v(t=>Promise.all(["static/chunks/0vj43fihkfmqz.js","static/chunks/0.fiftciismd2.js"].map(t=>e.l(t))).then(()=>t(32579)))},78877,e=>{e.v(t=>Promise.all(["static/chunks/0lmm~3cjla0c9.js"].map(t=>e.l(t))).then(()=>t(21392)))},27415,e=>{e.v(t=>Promise.all(["static/chunks/0rr4nl_auvf0b.js"].map(t=>e.l(t))).then(()=>t(92280)))},44319,e=>{e.v(t=>Promise.all(["static/chunks/0l_tj98f_5ot-.js"].map(t=>e.l(t))).then(()=>t(84201)))},31376,e=>{e.v(t=>Promise.all(["static/chunks/0-_x27yxy_uq_.js"].map(t=>e.l(t))).then(()=>t(3054)))},34215,e=>{e.v(t=>Promise.all(["static/chunks/0kx.ki.9u_0dy.js"].map(t=>e.l(t))).then(()=>t(30770)))},11980,e=>{e.v(t=>Promise.all(["static/chunks/0bb.y5mii27l0.js","static/chunks/0f6mqg1npiv.t.js","static/chunks/00h5q76-kypod.js"].map(t=>e.l(t))).then(()=>t(39342)))},70234,e=>{e.v(t=>Promise.all(["static/chunks/0g8qw208n3i89.js","static/chunks/0f6mqg1npiv.t.js","static/chunks/00h5q76-kypod.js"].map(t=>e.l(t))).then(()=>t(43020)))},44243,e=>{e.v(t=>Promise.all(["static/chunks/06x~dj4kp-z9f.js","static/chunks/11905-quym2vs.js","static/chunks/043yk9d-7bl43.js"].map(t=>e.l(t))).then(()=>t(15508)))},51365,e=>{e.v(t=>Promise.all(["static/chunks/0r4wgiv_kwiro.js","static/chunks/0f6mqg1npiv.t.js","static/chunks/00h5q76-kypod.js"].map(t=>e.l(t))).then(()=>t(78730)))},46201,e=>{e.v(t=>Promise.all(["static/chunks/1158vq~dpuyl-.js","static/chunks/00h5q76-kypod.js","static/chunks/0f6mqg1npiv.t.js","static/chunks/0s2ei~z99yg.7.js","static/chunks/0lr2ip~4h2o.z.js"].map(t=>e.l(t))).then(()=>t(38206)))},48926,e=>{e.v(t=>Promise.all(["static/chunks/0kl8vyx5367.j.js"].map(t=>e.l(t))).then(()=>t(90158)))},81291,e=>{e.v(t=>Promise.all(["static/chunks/17me7gnh4-..3.js"].map(t=>e.l(t))).then(()=>t(4447)))},31656,e=>{e.v(t=>Promise.all(["static/chunks/00h5q76-kypod.js","static/chunks/0f6mqg1npiv.t.js","static/chunks/0_7ef.hja3s4s.js"].map(t=>e.l(t))).then(()=>t(68025)))},22654,e=>{e.v(t=>Promise.all(["static/chunks/00h5q76-kypod.js","static/chunks/0f6mqg1npiv.t.js","static/chunks/0oryo.isv4jwb.js"].map(t=>e.l(t))).then(()=>t(67933)))}]);