@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.
- package/.next/standalone/apps/web/.next/BUILD_ID +1 -1
- package/.next/standalone/apps/web/.next/build-manifest.json +3 -3
- package/.next/standalone/apps/web/.next/prerender-manifest.json +3 -3
- package/.next/standalone/apps/web/.next/server/app/_global-error.html +1 -1
- package/.next/standalone/apps/web/.next/server/app/_global-error.rsc +1 -1
- package/.next/standalone/apps/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/apps/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/standalone/apps/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/standalone/apps/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/standalone/apps/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/apps/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/apps/web/.next/server/app/_not-found.html +1 -1
- package/.next/standalone/apps/web/.next/server/app/_not-found.rsc +2 -2
- package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
- package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/apps/web/.next/server/app/index.html +1 -1
- package/.next/standalone/apps/web/.next/server/app/index.rsc +3 -3
- package/.next/standalone/apps/web/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/apps/web/.next/server/app/index.segments/_full.segment.rsc +3 -3
- package/.next/standalone/apps/web/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/.next/standalone/apps/web/.next/server/app/index.segments/_index.segment.rsc +2 -2
- package/.next/standalone/apps/web/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/apps/web/.next/server/app/page.js.nft.json +1 -1
- package/.next/standalone/apps/web/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/apps/web/.next/server/app/settings/page.js.nft.json +1 -1
- package/.next/standalone/apps/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/standalone/apps/web/.next/server/app/settings.html +1 -1
- package/.next/standalone/apps/web/.next/server/app/settings.rsc +3 -3
- package/.next/standalone/apps/web/.next/server/app/settings.segments/_full.segment.rsc +3 -3
- package/.next/standalone/apps/web/.next/server/app/settings.segments/_head.segment.rsc +1 -1
- package/.next/standalone/apps/web/.next/server/app/settings.segments/_index.segment.rsc +2 -2
- package/.next/standalone/apps/web/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/apps/web/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/apps/web/.next/server/app/settings.segments/settings.segment.rsc +1 -1
- package/.next/standalone/apps/web/.next/server/app/tasks/[id]/page.js.nft.json +1 -1
- package/.next/standalone/apps/web/.next/server/app/tasks/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/apps/web/.next/server/chunks/ssr/{[root-of-the-server]__0cwejmp._.js → [root-of-the-server]__053-iaj._.js} +2 -2
- package/.next/standalone/apps/web/.next/server/chunks/ssr/[root-of-the-server]__07kf5h-._.js +13 -13
- package/.next/standalone/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0_gamc9._.js +13 -13
- package/.next/standalone/apps/web/.next/server/chunks/ssr/{[root-of-the-server]__0a7t~wn._.js → [root-of-the-server]__0tq9wv6._.js} +2 -2
- package/.next/standalone/apps/web/.next/server/chunks/ssr/{_0ie-fls._.js → _03hz06e._.js} +2 -2
- package/.next/standalone/apps/web/.next/server/chunks/ssr/{_0gpi5iq._.js → _0836rl_._.js} +2 -2
- package/.next/standalone/apps/web/.next/server/chunks/ssr/{_06gug4~._.js → _0amxree._.js} +2 -2
- package/.next/standalone/apps/web/.next/server/chunks/ssr/_0g.cd6a._.js +17 -17
- package/.next/standalone/apps/web/.next/server/chunks/ssr/apps_web_src_app_settings_page_tsx_0i6itlb._.js +1 -1
- package/.next/standalone/apps/web/.next/server/chunks/ssr/{node_modules_0s64~o2._.js → node_modules_00b-qxe._.js} +1 -1
- package/.next/standalone/apps/web/.next/server/chunks/ssr/{node_modules_0-dhyl6._.js → node_modules_046ca89._.js} +1 -1
- package/.next/standalone/apps/web/.next/server/chunks/ssr/{node_modules_0w5pf1p._.js → node_modules_065xsw3._.js} +1 -1
- package/.next/standalone/apps/web/.next/server/chunks/ssr/{node_modules_0-ecrjy._.js → node_modules_0b547kr._.js} +1 -1
- package/.next/standalone/apps/web/.next/server/chunks/ssr/{node_modules_0.7pxhy._.js → node_modules_0c_-8tt._.js} +1 -1
- package/.next/standalone/apps/web/.next/server/chunks/ssr/{node_modules_0efb87~._.js → node_modules_0dmu62y._.js} +1 -1
- package/.next/standalone/apps/web/.next/server/chunks/ssr/{node_modules_0of7.-5._.js → node_modules_0gs4d2e._.js} +1 -1
- package/.next/standalone/apps/web/.next/server/chunks/ssr/{node_modules_0j3gfu0._.js → node_modules_0jcrj-2._.js} +1 -1
- package/.next/standalone/apps/web/.next/server/chunks/ssr/{node_modules_0uwlz8.._.js → node_modules_0kmpnnk._.js} +1 -1
- package/.next/standalone/apps/web/.next/server/chunks/ssr/{node_modules_0126g83._.js → node_modules_0llz_9l._.js} +1 -1
- package/.next/standalone/apps/web/.next/server/chunks/ssr/{node_modules_0zmomoe._.js → node_modules_0pi.005._.js} +1 -1
- package/.next/standalone/apps/web/.next/server/chunks/ssr/{node_modules_0.6~k__._.js → node_modules_0v86kpj._.js} +1 -1
- package/.next/standalone/apps/web/.next/server/chunks/ssr/{node_modules_0ybihhp._.js → node_modules_0vm.f2d._.js} +1 -1
- package/.next/standalone/apps/web/.next/server/chunks/ssr/{node_modules_11gk90a._.js → node_modules_0y3g5lf._.js} +1 -1
- package/.next/standalone/apps/web/.next/server/chunks/ssr/{node_modules_0r6ewmn._.js → node_modules_0z0orm9._.js} +1 -1
- package/.next/standalone/apps/web/.next/server/chunks/ssr/{node_modules_06iewnh._.js → node_modules_0~n91z-._.js} +1 -1
- package/.next/standalone/apps/web/.next/server/middleware-build-manifest.js +3 -3
- package/.next/standalone/apps/web/.next/server/pages/404.html +1 -1
- package/.next/standalone/apps/web/.next/server/pages/500.html +1 -1
- package/.next/standalone/apps/web/.next/server/server-reference-manifest.js +1 -1
- package/.next/standalone/apps/web/.next/server/server-reference-manifest.json +1 -1
- package/.next/standalone/apps/web/.next/static/chunks/08dtfekvxgpfu.js +1 -0
- package/.next/standalone/apps/web/.next/static/chunks/{0e9140l311w8t.js → 0dpeys_k2-mrk.js} +15 -15
- package/.next/standalone/apps/web/.next/static/chunks/0hvtxos.brr01.js +1 -0
- package/.next/standalone/apps/web/.next/static/chunks/{0kw1z8z_ld6s0.js → 0nh1-0lee-1pk.js} +15 -15
- package/.next/standalone/apps/web/.next/static/chunks/0wxrfu5la_s94.js +64 -0
- package/.next/standalone/apps/web/.next/static/chunks/{10ildl1-mw9ez.js → 0y9ehkcn04ljq.js} +2 -2
- package/.next/standalone/apps/web/.next/static/chunks/0zu48yvkl8pyj.css +4 -0
- package/.next/standalone/apps/web/.next/static/chunks/0~0s04z6h.rs..js +1 -0
- package/.next/standalone/apps/web/.next/static/chunks/12dmkv54xstku.js +1 -0
- package/.next/standalone/apps/web/.next/static/chunks/13ohhwsmmfexn.js +1 -0
- package/.next/standalone/apps/web/.next/static/chunks/13twvr.qg3khh.js +1 -0
- package/dist/server/index.js +8 -1
- package/dist/server/lib/claude-config-guard.d.ts +9 -0
- package/dist/server/lib/claude-config-guard.js +43 -0
- package/dist/server/lib/llm-process.d.ts +29 -0
- package/dist/server/lib/llm-process.js +235 -0
- package/dist/server/lib/process-port.d.ts +1 -0
- package/dist/server/lib/process-port.js +28 -0
- package/dist/server/lib/whisper-process.d.ts +2 -2
- package/dist/server/lib/whisper-process.js +19 -5
- package/dist/server/routes/llm.d.ts +2 -0
- package/dist/server/routes/llm.js +23 -0
- package/dist/server/routes/terminal.js +5 -0
- package/dist/server/routes/whisper.js +36 -2
- package/llm-server/README.md +27 -0
- package/llm-server/download_model.py +14 -0
- package/llm-server/requirements.txt +1 -0
- package/llm-server/run.sh +26 -0
- package/npm-shrinkwrap.json +24 -40
- package/package.json +2 -1
- package/whisper-server/server.py +25 -4
- package/.next/standalone/apps/web/.next/static/chunks/0-nditm2kmxy3.js +0 -1
- package/.next/standalone/apps/web/.next/static/chunks/00vlzdkbq6_w3.js +0 -64
- package/.next/standalone/apps/web/.next/static/chunks/0krkukgs6hg9c.js +0 -1
- package/.next/standalone/apps/web/.next/static/chunks/0sy8tzk6r-pb~.js +0 -1
- package/.next/standalone/apps/web/.next/static/chunks/0vfrsmi1vl53y.css +0 -4
- /package/.next/standalone/apps/web/.next/static/{S24zAyBAidp_ISALDwbn4 → gWwRKXTSig4Dz-gNeqxJy}/_buildManifest.js +0 -0
- /package/.next/standalone/apps/web/.next/static/{S24zAyBAidp_ISALDwbn4 → gWwRKXTSig4Dz-gNeqxJy}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/apps/web/.next/static/{S24zAyBAidp_ISALDwbn4 → gWwRKXTSig4Dz-gNeqxJy}/_ssgManifest.js +0 -0
|
@@ -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
|
-
|
|
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
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@minimalcorp/tsunagi",
|
|
3
|
-
"version": "0.1.
|
|
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.
|
|
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.
|
|
281
|
-
"resolved": "https://registry.npmjs.org/@fastify/reply-from/-/reply-from-12.6.
|
|
282
|
-
"integrity": "sha512-
|
|
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": "^
|
|
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.
|
|
1204
|
-
"resolved": "https://registry.npmjs.org/avvio/-/avvio-9.
|
|
1205
|
-
"integrity": "sha512-
|
|
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.
|
|
2190
|
-
"resolved": "https://registry.npmjs.org/grammex/-/grammex-3.1.
|
|
2191
|
-
"integrity": "sha512-
|
|
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.
|
|
2226
|
-
"resolved": "https://registry.npmjs.org/hono/-/hono-4.12.
|
|
2227
|
-
"integrity": "sha512-
|
|
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.
|
|
2337
|
-
"resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.
|
|
2338
|
-
"integrity": "sha512-
|
|
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.
|
|
3335
|
-
"resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.
|
|
3336
|
-
"integrity": "sha512-
|
|
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.
|
|
3596
|
-
"resolved": "https://registry.npmjs.org/ws/-/ws-8.21.
|
|
3597
|
-
"integrity": "sha512
|
|
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.
|
|
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
|
],
|
package/whisper-server/server.py
CHANGED
|
@@ -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
|
-
|
|
52
|
-
|
|
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)))}]);
|