@minimalcorp/tsunagi 0.1.37 → 0.1.39
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 +5 -5
- package/.next/standalone/apps/web/.next/prerender-manifest.json +3 -3
- package/.next/standalone/apps/web/.next/server/app/_global-error/page/build-manifest.json +2 -2
- 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/build-manifest.json +2 -2
- 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/build-manifest.json +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/build-manifest.json +2 -2
- 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/build-manifest.json +2 -2
- 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]__0nhzci6._.js +4 -8
- package/.next/standalone/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0vi01rl._.js +4 -8
- package/.next/standalone/apps/web/.next/server/chunks/ssr/{[root-of-the-server]__04g~n~m._.js → [root-of-the-server]__0zf09ry._.js} +2 -2
- package/.next/standalone/apps/web/.next/server/chunks/ssr/_04l3mh~._.js +10 -0
- package/.next/standalone/apps/web/.next/server/chunks/ssr/_0bt-4.4._.js +3 -0
- package/.next/standalone/apps/web/.next/server/chunks/ssr/_0e3431w._.js +10 -0
- package/.next/standalone/apps/web/.next/server/chunks/ssr/_0g.cd6a._.js +1 -1
- package/.next/standalone/apps/web/.next/server/chunks/ssr/_0lirkqp._.js +10 -0
- package/.next/standalone/apps/web/.next/server/chunks/ssr/_0soxqr.._.js +3 -0
- 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/apps_web_src_app_tasks_[id]_page_tsx_0jshsm2._.js +4 -5
- package/.next/standalone/apps/web/.next/server/chunks/ssr/{node_modules_0h0imx2._.js → node_modules_0_4__2k._.js} +1 -1
- package/.next/standalone/apps/web/.next/server/chunks/ssr/{node_modules_0pbr55t._.js → node_modules_0bqsyfk._.js} +1 -1
- package/.next/standalone/apps/web/.next/server/chunks/ssr/{node_modules_06vr-0a._.js → node_modules_0bzw~9d._.js} +1 -1
- package/.next/standalone/apps/web/.next/server/chunks/ssr/{node_modules_0k7u4.c._.js → node_modules_0fsewd2._.js} +1 -1
- package/.next/standalone/apps/web/.next/server/chunks/ssr/{node_modules_0c6z_cw._.js → node_modules_0l~40og._.js} +1 -1
- package/.next/standalone/apps/web/.next/server/chunks/ssr/{node_modules_0jo-w3s._.js → node_modules_0pk6e0.._.js} +1 -1
- package/.next/standalone/apps/web/.next/server/chunks/ssr/{node_modules_0zkg-x0._.js → node_modules_0smdx~2._.js} +1 -1
- package/.next/standalone/apps/web/.next/server/chunks/ssr/{node_modules_0fcqekz._.js → node_modules_0uej915._.js} +1 -1
- package/.next/standalone/apps/web/.next/server/middleware-build-manifest.js +5 -5
- 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/{094hkpbli0k9s.js → 02.u6zk77a338.js} +10 -11
- package/.next/standalone/apps/web/.next/static/chunks/05n6~h_wwg.jj.js +5 -0
- package/.next/standalone/apps/web/.next/static/chunks/0_ygv4z~5c_9z.js +5 -0
- package/.next/standalone/apps/web/.next/static/chunks/0g5hoj5w-z.~6.js +1 -0
- package/.next/standalone/apps/web/.next/static/chunks/0nhcl~svhi_26.js +7 -0
- package/.next/standalone/apps/web/.next/static/chunks/0p4dfdgz~3qt3.js +5 -0
- package/.next/standalone/apps/web/.next/static/chunks/0p9~lk406udl5.css +4 -0
- package/.next/standalone/apps/web/.next/static/chunks/0q-u7bl7oa42n.js +1 -0
- package/.next/standalone/apps/web/.next/static/chunks/0q_j4~6_etj_q.js +7 -0
- package/.next/standalone/apps/web/.next/static/chunks/0zjymvayyxt-d.js +5 -0
- package/.next/standalone/apps/web/.next/static/chunks/{0lp.2eizum8y~.js → 11rs2-0jl1rzr.js} +1 -1
- package/.next/standalone/apps/web/.next/static/chunks/{15~pc9ql1ab38.js → 158q94mo2-6sx.js} +7 -7
- package/.next/standalone/apps/web/.next/static/chunks/167xa3jy_0g.u.js +1 -0
- package/.next/standalone/apps/web/.next/static/chunks/{turbopack-0079niub0zo4u.js → turbopack-07pr2uza0.4cp.js} +1 -1
- package/dist/server/basic-auth.js +9 -1
- package/dist/server/generated/prisma/internal/class.js +1 -1
- package/dist/server/index.js +20 -0
- package/dist/server/lib/claude-command.d.ts +6 -0
- package/dist/server/lib/claude-command.js +85 -0
- package/dist/server/lib/claude-config-guard.d.ts +12 -0
- package/dist/server/lib/claude-config-guard.js +49 -0
- package/dist/server/lib/lmstudio.d.ts +24 -0
- package/dist/server/lib/lmstudio.js +198 -0
- package/dist/server/lib/local-llm-env.d.ts +28 -0
- package/dist/server/lib/local-llm-env.js +91 -0
- package/dist/server/lib/local-llm.d.ts +56 -0
- package/dist/server/lib/local-llm.js +366 -0
- package/dist/server/lib/ollama-settings.d.ts +16 -10
- package/dist/server/lib/ollama-settings.js +104 -91
- package/dist/server/lib/repositories/task.js +3 -0
- package/dist/server/lib/searxng.d.ts +26 -0
- package/dist/server/lib/searxng.js +308 -0
- package/dist/server/lib/services/task-service.js +1 -3
- package/dist/server/routes/local-llm.d.ts +2 -0
- package/dist/server/routes/local-llm.js +192 -0
- package/dist/server/routes/mcp-web.d.ts +2 -0
- package/dist/server/routes/mcp-web.js +107 -0
- package/dist/server/routes/onboarding.js +4 -4
- package/dist/server/routes/settings.js +100 -26
- package/dist/server/routes/tasks.js +5 -1
- package/dist/server/routes/terminal.js +77 -28
- package/npm-shrinkwrap.json +5 -5
- package/package.json +1 -1
- package/prisma/schema.prisma +1 -1
- package/.next/standalone/apps/web/.next/server/chunks/ssr/_016-lxb._.js +0 -3
- package/.next/standalone/apps/web/.next/server/chunks/ssr/_0hh~0f6._.js +0 -3
- package/.next/standalone/apps/web/.next/server/chunks/ssr/_0r0xwce._.js +0 -6
- package/.next/standalone/apps/web/.next/server/chunks/ssr/_0sbp1da._.js +0 -6
- package/.next/standalone/apps/web/.next/server/chunks/ssr/_12c1w~~._.js +0 -6
- package/.next/standalone/apps/web/.next/static/chunks/0229rjr88pv9k.js +0 -1
- package/.next/standalone/apps/web/.next/static/chunks/04l9g6rg7~-d5.js +0 -1
- package/.next/standalone/apps/web/.next/static/chunks/0citvl2medd0s.js +0 -11
- package/.next/standalone/apps/web/.next/static/chunks/0e8u7rqrqfiiy.js +0 -1
- package/.next/standalone/apps/web/.next/static/chunks/0pg---_6a_4ls.css +0 -4
- package/.next/standalone/apps/web/.next/static/chunks/0uv~zl3--e3wo.js +0 -11
- package/.next/standalone/apps/web/.next/static/chunks/11rpr3..poyv8.js +0 -5
- package/.next/standalone/apps/web/.next/static/chunks/1200zkjn5n2w7.js +0 -1
- /package/.next/standalone/apps/web/.next/static/{otC3BXpS9D6HI8k0EQ2ZH → C1cjF-gU-snY_atxJbn1v}/_buildManifest.js +0 -0
- /package/.next/standalone/apps/web/.next/static/{otC3BXpS9D6HI8k0EQ2ZH → C1cjF-gU-snY_atxJbn1v}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/apps/web/.next/static/{otC3BXpS9D6HI8k0EQ2ZH → C1cjF-gU-snY_atxJbn1v}/_ssgManifest.js +0 -0
|
@@ -3,9 +3,12 @@ import * as os from 'os';
|
|
|
3
3
|
import * as path from 'path';
|
|
4
4
|
import { ptyManager } from '../pty-manager.js';
|
|
5
5
|
import { prisma } from '../lib/db.js';
|
|
6
|
+
import { getWorktreePath } from '../lib/worktree-manager.js';
|
|
6
7
|
import { getEnv } from '../lib/repositories/environment.js';
|
|
7
|
-
import { ensureClaudeOnboardingCompleted } from '../lib/claude-config-guard.js';
|
|
8
|
-
import {
|
|
8
|
+
import { ensureClaudeOnboardingCompleted, removeLocalModelFromUserSettings, } from '../lib/claude-config-guard.js';
|
|
9
|
+
import { LOCAL_LLM_UNSET_ENV_KEYS, LOCAL_MODEL_ALIAS, buildLocalLlmEnv, } from '../lib/local-llm-env.js';
|
|
10
|
+
import { ensureActiveLoaded, getLocalLlmSettings } from '../lib/local-llm.js';
|
|
11
|
+
import { LOCAL_LLM_PROXY_URL, buildClaudeCommand, isLocalLlmMode } from '../lib/claude-command.js';
|
|
9
12
|
// サーバーはプロジェクトルートから起動されるため process.cwd() でルートを取得
|
|
10
13
|
const TSUNAGI_EDITOR_PATH = path.resolve(process.cwd(), 'scripts/monaco-editor.sh');
|
|
11
14
|
// Fastify(API) の公開ポート。index.ts と同じ既定値・同じ環境変数(TSUNAGI_SERVER_PORT)を見る。
|
|
@@ -34,6 +37,22 @@ function stripTerminalQueries(s) {
|
|
|
34
37
|
.replace(/\x1b\[[?>]?[0-9;]*n/g, '') // DSR: ESC[?6n(主犯) / ESC[6n / ESC[5n など
|
|
35
38
|
.replace(/\x1b\[[?>=]?[0-9;]*c/g, ''); // DA: ESC[c / ESC[0c / ESC[>c / ESC[=c
|
|
36
39
|
}
|
|
40
|
+
/**
|
|
41
|
+
* ローカルLLMタブで注入する環境変数を返す。Claude Code は tsunagi の中継口に接続し、
|
|
42
|
+
* 中継口が使用中のモデルへ転送する。最初の発言を待たせないよう、読み込みはここで始めておく(完了は待たない)
|
|
43
|
+
*/
|
|
44
|
+
async function prepareLocalLlm() {
|
|
45
|
+
const { active, extraEnv } = await getLocalLlmSettings();
|
|
46
|
+
if (!active) {
|
|
47
|
+
throw new Error('ローカルLLMのモデルが未設定です。Settings で使用するモデルを選んでください');
|
|
48
|
+
}
|
|
49
|
+
ensureActiveLoaded().catch(() => undefined);
|
|
50
|
+
return buildLocalLlmEnv({
|
|
51
|
+
proxyUrl: LOCAL_LLM_PROXY_URL,
|
|
52
|
+
contextTokens: active.contextTokens,
|
|
53
|
+
extraEnv,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
37
56
|
export async function terminalRoutes(fastify) {
|
|
38
57
|
const io = fastify.io;
|
|
39
58
|
// socket.io イベントハンドラ
|
|
@@ -181,59 +200,70 @@ export async function terminalRoutes(fastify) {
|
|
|
181
200
|
});
|
|
182
201
|
// POST /terminal/sessions - セッション作成(または既存セッション再利用)
|
|
183
202
|
fastify.post('/terminal/sessions', async (request, reply) => {
|
|
184
|
-
const { cwd, env, sessionId: requestedSessionId,
|
|
203
|
+
const { cwd, env, sessionId: requestedSessionId, claude } = request.body ?? {};
|
|
204
|
+
let { command } = request.body ?? {};
|
|
185
205
|
const sessionId = requestedSessionId ?? crypto.randomUUID();
|
|
206
|
+
// 既存セッションが生きていれば再利用
|
|
207
|
+
const existing = ptyManager.getSession(sessionId);
|
|
208
|
+
if (existing) {
|
|
209
|
+
fastify.log.info({ sessionId }, 'Reusing existing PTY session');
|
|
210
|
+
return reply.status(200).send({ sessionId, reused: true });
|
|
211
|
+
}
|
|
212
|
+
// sessionId(=tab_id) から Task を解決する。cwd / env の決定に使う。
|
|
213
|
+
// Taskに紐づかないタブは Tab レコードが存在しないため null になる。
|
|
214
|
+
const tab = await prisma.tab
|
|
215
|
+
.findUnique({ where: { tabId: sessionId }, include: { task: true } })
|
|
216
|
+
.catch((err) => {
|
|
217
|
+
fastify.log.warn({ err, sessionId }, 'Failed to load tab');
|
|
218
|
+
return null;
|
|
219
|
+
});
|
|
220
|
+
// cwd は Task があればサーバー側で worktree パスを導出する(クライアントの state に依存しない)。
|
|
221
|
+
// クライアント指定の cwd は Task に紐づかないタブのフォールバックとしてのみ使う。
|
|
186
222
|
const defaultDir = path.join(os.homedir(), '.tsunagi', 'workspaces');
|
|
187
|
-
let workingDir =
|
|
223
|
+
let workingDir = tab
|
|
224
|
+
? getWorktreePath(tab.task.owner, tab.task.repo, tab.task.branch)
|
|
225
|
+
: (cwd ?? defaultDir);
|
|
188
226
|
// cwd が存在するか確認、なければデフォルトにフォールバック
|
|
189
227
|
try {
|
|
190
228
|
await fs.access(workingDir);
|
|
191
229
|
}
|
|
192
230
|
catch {
|
|
193
|
-
fastify.log.warn({ workingDir }, 'cwd does not exist, falling back to default');
|
|
231
|
+
fastify.log.warn({ sessionId, workingDir }, 'cwd does not exist, falling back to default');
|
|
194
232
|
workingDir = defaultDir;
|
|
195
233
|
}
|
|
196
234
|
// デフォルトディレクトリが存在しない場合も作成する
|
|
197
235
|
await fs.mkdir(workingDir, { recursive: true });
|
|
198
|
-
// 既存セッションが生きていれば再利用
|
|
199
|
-
const existing = ptyManager.getSession(sessionId);
|
|
200
|
-
if (existing) {
|
|
201
|
-
fastify.log.info({ sessionId }, 'Reusing existing PTY session');
|
|
202
|
-
return reply.status(200).send({ sessionId, reused: true });
|
|
203
|
-
}
|
|
204
236
|
try {
|
|
205
|
-
//
|
|
206
|
-
//
|
|
207
|
-
// Plannerタブ等、Taskに紐づかないタブは Tab レコードが存在しないため global のみになる。
|
|
237
|
+
// repo スコープまで階層マージした環境変数を取得する(global → owner → repo、後勝ちで上書き)。
|
|
238
|
+
// Taskに紐づかないタブは global のみになる。
|
|
208
239
|
let dbEnv = {};
|
|
209
|
-
|
|
240
|
+
const tabMode = tab?.mode;
|
|
210
241
|
try {
|
|
211
|
-
const tab = await prisma.tab.findUnique({
|
|
212
|
-
where: { tabId: sessionId },
|
|
213
|
-
include: { task: true },
|
|
214
|
-
});
|
|
215
|
-
tabMode = tab?.mode;
|
|
216
242
|
dbEnv = tab ? await getEnv('repo', tab.task.owner, tab.task.repo) : await getEnv('global');
|
|
217
243
|
fastify.log.info({ count: Object.keys(dbEnv).length, owner: tab?.task.owner, repo: tab?.task.repo }, 'Loaded env vars');
|
|
218
244
|
}
|
|
219
245
|
catch (err) {
|
|
220
246
|
fastify.log.warn({ err }, 'Failed to load env vars');
|
|
221
247
|
}
|
|
222
|
-
//
|
|
248
|
+
// ローカルLLMタブ: Anthropic の代わりに tsunagi の中継口(→ Ollama / LM Studio)で claude を動かす。
|
|
223
249
|
// DB の環境変数より後に適用し、Anthropic の認証トークンは環境変数ごと取り除く。
|
|
224
250
|
let providerEnv = {};
|
|
225
251
|
let unsetKeys = [];
|
|
226
|
-
if (tabMode
|
|
227
|
-
|
|
228
|
-
|
|
252
|
+
if (isLocalLlmMode(tabMode)) {
|
|
253
|
+
try {
|
|
254
|
+
providerEnv = await prepareLocalLlm();
|
|
255
|
+
}
|
|
256
|
+
catch (err) {
|
|
229
257
|
return reply
|
|
230
258
|
.status(400)
|
|
231
|
-
.send({ error:
|
|
259
|
+
.send({ error: err instanceof Error ? err.message : String(err) });
|
|
232
260
|
}
|
|
233
|
-
|
|
234
|
-
|
|
261
|
+
unsetKeys = LOCAL_LLM_UNSET_ENV_KEYS;
|
|
262
|
+
}
|
|
263
|
+
if (claude) {
|
|
264
|
+
command = await buildClaudeCommand(sessionId, (tabMode ?? 'claude'));
|
|
235
265
|
}
|
|
236
|
-
// 優先順位: リクエストで渡されたenv >
|
|
266
|
+
// 優先順位: リクエストで渡されたenv > ローカルLLMのprovider env > DB env(global/owner/repo) > tsunagi独自のEDITOR設定
|
|
237
267
|
// tsunagi-editor.sh をデフォルトにすることで Ctrl+G が Monaco Modal を開く。
|
|
238
268
|
// DB / リクエストで EDITOR が明示設定されている場合はそちらが優先される。
|
|
239
269
|
const tsunagiDefaultEnv = {
|
|
@@ -252,6 +282,8 @@ export async function terminalRoutes(fastify) {
|
|
|
252
282
|
// いると、次回 claude 起動時にオンボーディングウィザードが表示され --resume/
|
|
253
283
|
// --session-id を前提にした自動起動フローが止まるため、起動前に補正する。
|
|
254
284
|
await ensureClaudeOnboardingCompleted();
|
|
285
|
+
// 監視の取りこぼしに備え、起動前にも中継口の名前が既定モデルに残っていないか補正する
|
|
286
|
+
await removeLocalModelFromUserSettings(LOCAL_MODEL_ALIAS);
|
|
255
287
|
// シェルの初期化(プロンプト表示)を待つため少し遅延させて書き込む
|
|
256
288
|
setTimeout(() => {
|
|
257
289
|
session.pty.write(cmd);
|
|
@@ -264,6 +296,23 @@ export async function terminalRoutes(fastify) {
|
|
|
264
296
|
return reply.status(500).send({ error: message });
|
|
265
297
|
}
|
|
266
298
|
});
|
|
299
|
+
// POST /terminal/sessions/:sessionId/claude - 既存 PTY で claude を(再)起動する
|
|
300
|
+
// コマンドはタブの mode に応じてサーバーで組み立てる(ローカルLLMタブは引数が付くため)
|
|
301
|
+
fastify.post('/terminal/sessions/:sessionId/claude', async (request, reply) => {
|
|
302
|
+
const { sessionId } = request.params;
|
|
303
|
+
const session = ptyManager.getSession(sessionId);
|
|
304
|
+
if (!session) {
|
|
305
|
+
return reply.status(404).send({ error: 'Session not found' });
|
|
306
|
+
}
|
|
307
|
+
const tab = await prisma.tab.findUnique({ where: { tabId: sessionId } }).catch(() => null);
|
|
308
|
+
const mode = (tab?.mode ?? 'claude');
|
|
309
|
+
if (isLocalLlmMode(mode)) {
|
|
310
|
+
// 最初の発言を待たせないよう読み込みを始めておく(未設定等のエラーは中継口がタブに返す)
|
|
311
|
+
ensureActiveLoaded().catch(() => undefined);
|
|
312
|
+
}
|
|
313
|
+
session.pty.write(`${await buildClaudeCommand(sessionId, mode)}\n`);
|
|
314
|
+
return reply.status(204).send();
|
|
315
|
+
});
|
|
267
316
|
// DELETE /terminal/sessions/:sessionId - セッション明示削除(PTY kill)
|
|
268
317
|
fastify.delete('/terminal/sessions/:sessionId', async (request, reply) => {
|
|
269
318
|
const { sessionId } = request.params;
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@minimalcorp/tsunagi",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.39",
|
|
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.39",
|
|
10
10
|
"license": "SEE LICENSE IN LICENSE",
|
|
11
11
|
"os": [
|
|
12
12
|
"darwin",
|
|
@@ -234,9 +234,9 @@
|
|
|
234
234
|
}
|
|
235
235
|
},
|
|
236
236
|
"node_modules/@fastify/multipart": {
|
|
237
|
-
"version": "10.1.
|
|
238
|
-
"resolved": "https://registry.npmjs.org/@fastify/multipart/-/multipart-10.1.
|
|
239
|
-
"integrity": "sha512-
|
|
237
|
+
"version": "10.1.2",
|
|
238
|
+
"resolved": "https://registry.npmjs.org/@fastify/multipart/-/multipart-10.1.2.tgz",
|
|
239
|
+
"integrity": "sha512-WHsqW5ffDXCbXXtdBQDryxu58fQvFPVGh4E4MlCO6hwCLNm0lYTCS6GKXUw2P64REDoECUNpMVvtMMstdIyBjQ==",
|
|
240
240
|
"funding": [
|
|
241
241
|
{
|
|
242
242
|
"type": "github",
|
package/package.json
CHANGED
package/prisma/schema.prisma
CHANGED
|
@@ -60,7 +60,7 @@ model Tab {
|
|
|
60
60
|
taskId String @map("task_id")
|
|
61
61
|
order Int // タブ表示用の連番
|
|
62
62
|
status String // 'idle' | 'running' | 'success' | 'error'
|
|
63
|
-
mode String @default("claude") // 'terminal' | 'claude' | '
|
|
63
|
+
mode String @default("claude") // 'terminal' | 'claude' | 'local'(local: ローカルLLMで起動するclaude。旧 'ollama' / 'lmstudio' も local 扱い)
|
|
64
64
|
createdAt DateTime @default(now()) @map("created_at")
|
|
65
65
|
startedAt DateTime @map("started_at")
|
|
66
66
|
completedAt DateTime? @map("completed_at")
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
module.exports=[210,a=>{"use strict";let b=(0,a.i(60137).default)("arrow-left",[["path",{d:"m12 19-7-7 7-7",key:"1l729n"}],["path",{d:"M19 12H5",key:"x3x0zl"}]]);a.s(["ArrowLeft",0,b],210)},11989,a=>{"use strict";let b=(0,a.i(60137).default)("chevron-right",[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]]);a.s(["default",0,b])},99464,92e3,a=>{"use strict";var b=a.i(60137);let c=(0,b.default)("pencil",[["path",{d:"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z",key:"1a8usu"}],["path",{d:"m15 5 4 4",key:"1mk7zo"}]]);a.s(["Pencil",0,c],99464);let d=(0,b.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"}]]);a.s(["AlertCircle",0,d],92e3)},36620,a=>{"use strict";let b=(0,a.i(60137).default)("circle-question-mark",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3",key:"1u773s"}],["path",{d:"M12 17h.01",key:"p32p05"}]]);a.s(["CircleHelp",0,b],36620)},4975,48124,a=>{"use strict";var b=a.i(60137);let c=(0,b.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"}]]);a.s(["Mic",0,c],4975);let d=(0,b.default)("square",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}]]);a.s(["Square",0,d],48124)},92552,a=>{"use strict";var b=a.i(87924),c=a.i(760);a.s(["Card",0,function({className:a,size:d="default",...e}){return(0,b.jsx)("div",{"data-slot":"card","data-size":d,className:(0,c.cn)("group/card flex flex-col gap-4 overflow-hidden rounded-lg bg-card py-4 text-xs/relaxed text-card-foreground ring-1 ring-foreground/10 has-[>img:first-child]:pt-0 data-[size=sm]:gap-3 data-[size=sm]:py-3 *:[img:first-child]:rounded-t-lg *:[img:last-child]:rounded-b-lg",a),...e})},"CardContent",0,function({className:a,...d}){return(0,b.jsx)("div",{"data-slot":"card-content",className:(0,c.cn)("px-4 group-data-[size=sm]/card:px-3",a),...d})},"CardDescription",0,function({className:a,...d}){return(0,b.jsx)("div",{"data-slot":"card-description",className:(0,c.cn)("text-xs/relaxed text-muted-foreground",a),...d})},"CardHeader",0,function({className:a,...d}){return(0,b.jsx)("div",{"data-slot":"card-header",className:(0,c.cn)("group/card-header @container/card-header grid auto-rows-min items-start gap-1 rounded-t-lg px-4 group-data-[size=sm]/card:px-3 has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto] [.border-b]:pb-4 group-data-[size=sm]/card:[.border-b]:pb-3",a),...d})},"CardTitle",0,function({className:a,...d}){return(0,b.jsx)("div",{"data-slot":"card-title",className:(0,c.cn)("font-heading text-sm font-medium",a),...d})}])},82434,a=>{"use strict";let b=(0,a.i(60137).default)("bot",[["path",{d:"M12 8V4H8",key:"hb8ula"}],["rect",{width:"16",height:"12",x:"4",y:"8",rx:"2",key:"enze0r"}],["path",{d:"M2 14h2",key:"vft8re"}],["path",{d:"M20 14h2",key:"4cs60a"}],["path",{d:"M15 13v2",key:"1xurst"}],["path",{d:"M9 13v2",key:"rq6x2g"}]]);a.s(["Bot",0,b],82434)},56026,19768,1464,72047,a=>{"use strict";a.s(["LLM_SYSTEM_PROMPT_STORAGE_KEY",()=>z,"VoiceInputButton",()=>B,"WHISPER_PROMPT_STORAGE_KEY",()=>y],56026);var b=a.i(87924),c=a.i(72131),d=a.i(96221),e=a.i(4975),f=a.i(48124),g=a.i(39524),h=a.i(91399),i=a.i(6828);a.s(["LOCAL_LLM_ENABLED_STORAGE_KEY",()=>s,"LocalLlmSection",()=>x],19768);var j=a.i(92e3),k=a.i(82434),l=a.i(67453),m=a.i(36620),n=a.i(92552),o=a.i(90002),p=a.i(65025),q=a.i(97463);let r="tsunagi:local-llm-enabled",s=r,t={not_running:"停止中",installing_deps:"依存関係をインストール中...",downloading_model:"モデルをダウンロード中...",starting_server:"サーバーを起動中... (モデルのロードに数十秒かかる場合があります)",running:"実行中",running_external:"実行中 (tsunagi外で起動)",error:"エラー"},u=["installing_deps","downloading_model","starting_server"],v=["running","running_external"];function w(a){let b=a/0x40000000;return b>=.1?`${b.toFixed(2)} GB`:`${(a/1048576).toFixed(0)} MB`}function x(){let[a,e]=(0,c.useState)(!1),[s,x]=(0,c.useState)(!1),[y,A]=(0,c.useState)(null),[B,C]=(0,c.useState)(""),D=(0,c.useRef)(null),E=(0,c.useCallback)(a=>{e(a),localStorage.setItem(r,String(a))},[]),F=(0,c.useCallback)(a=>{C(a),localStorage.setItem(z,a)},[]),G=(0,c.useCallback)(async()=>{let a=await fetch((0,h.apiUrl)("/api/llm/server/status")),b=await a.json();return A(b),b},[]);(0,c.useEffect)(()=>{e("true"===localStorage.getItem(r)),C(localStorage.getItem(z)??""),G()},[G]),(0,c.useEffect)(()=>{y&&v.includes(y.step)&&!a&&(E(!0),i.toaster.create({type:"success",title:"ローカルLLMが有効化されました"}))},[y,a,E]),(0,c.useEffect)(()=>(y&&u.includes(y.step)&&!D.current&&(D.current=setInterval(()=>{G().then(a=>{!u.includes(a.step)&&D.current&&(clearInterval(D.current),D.current=null)})},1e3)),()=>{D.current&&(clearInterval(D.current),D.current=null)}),[y,G]);let H=(0,c.useCallback)(()=>{G(),x(!0)},[G]),I=(0,c.useCallback)(async()=>{try{let a=await fetch((0,h.apiUrl)("/api/llm/server/start"),{method:"POST"});if(!a.ok){let b=await a.json().catch(()=>null);throw Error(b?.error||`HTTPエラー: ${a.status}`)}A(await a.json())}catch(a){i.toaster.create({type:"error",title:"サーバーの起動に失敗しました",description:a instanceof Error?a.message:String(a)})}},[]),J=(0,c.useCallback)(async()=>{try{let a=await fetch((0,h.apiUrl)("/api/llm/server/stop"),{method:"POST"});if(!a.ok){let b=await a.json().catch(()=>null);throw Error(b?.error||`HTTPエラー: ${a.status}`)}A(await a.json())}catch(a){i.toaster.create({type:"error",title:"サーバーの停止に失敗しました",description:a instanceof Error?a.message:String(a)})}},[]),K=(0,c.useCallback)(()=>{E(!1),y&&v.includes(y.step)&&J()},[E,J,y]),L=y?.serverDir,M=y?.downloadProgress,N=M?M.downloadedBytes/M.totalBytes*100:0,O=null!==y,P=O&&v.includes(y.step);return(0,b.jsxs)(n.Card,{children:[(0,b.jsxs)(n.CardHeader,{children:[(0,b.jsxs)("div",{className:"flex items-center gap-1",children:[(0,b.jsx)(n.CardTitle,{children:"ローカルLLM (実験的機能)"}),(0,b.jsx)(g.Button,{variant:"ghost",size:"icon-sm",onClick:H,title:"ローカルLLMについて",children:(0,b.jsx)(m.CircleHelp,{})})]}),(0,b.jsxs)(n.CardDescription,{children:["ローカルで動作するLLM(Qwen3-30B-A3B, MoE)を利用します。",(0,b.jsx)("strong",{className:"font-medium text-foreground",children:"有効にすると、音声入力の文字起こし結果がこのLLMで自動整形されるようになります"}),"(無効時は文字起こし結果をそのまま使用)。"]})]}),(0,b.jsx)(n.CardContent,{className:"flex flex-col gap-3",children:a?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[O?P?(0,b.jsxs)("span",{className:"flex items-center gap-2 text-success",children:[(0,b.jsx)(l.CheckCircle2,{className:"size-4"}),"ローカルLLM: 有効"]}):(0,b.jsxs)("span",{className:"flex items-center gap-2 text-warning",children:[(0,b.jsx)(j.AlertCircle,{className:"size-4"}),"ローカルLLM: 有効化済み(サーバー停止中)"]}):(0,b.jsxs)("span",{className:"flex items-center gap-2 text-muted-foreground",children:[(0,b.jsx)(d.Loader2,{className:"size-4 animate-spin"}),"状態を確認中..."]}),y&&(0,b.jsxs)("span",{className:"text-xs/relaxed text-muted-foreground",children:["(",t[y.step],")"]}),O&&!P&&(0,b.jsxs)(g.Button,{size:"default",onClick:H,children:[(0,b.jsx)(k.Bot,{}),"サーバーを起動"]}),(0,b.jsx)(g.Button,{size:"default",variant:"outline",onClick:K,children:"無効にする"})]}),(0,b.jsxs)("div",{children:[(0,b.jsx)("label",{className:"mb-1 block text-xs font-medium text-muted-foreground",children:"整形システムプロンプト (任意)"}),(0,b.jsx)(q.Textarea,{value:B,onChange:a=>F(a.target.value),placeholder:"例: 句読点の追加と誤字修正のみ行い、言い回しは変えないでください。",className:"min-h-16 text-xs"}),(0,b.jsx)("p",{className:"mt-1 text-[0.65rem] text-muted-foreground",children:"文字起こし結果をLLMで整形する際の指示です。空欄の場合は既定のプロンプト(句読点の追加・誤字修正のみを行う指示)を使用します。"})]})]}):(0,b.jsxs)(g.Button,{size:"default",onClick:H,children:[(0,b.jsx)(k.Bot,{}),"ローカルLLMを有効化する"]})}),(0,b.jsx)(o.Dialog,{open:s,onOpenChange:({open:a})=>x(a),title:"ローカルLLMについて",maxWidth:"2xl",children:(0,b.jsxs)("div",{className:"space-y-4 text-sm",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("p",{className:"font-medium text-foreground",children:"実験的機能です"}),(0,b.jsx)("p",{className:"text-muted-foreground",children:"音声入力の文字起こし結果を、ローカルで動作するLLM(mlx-lm / Qwen3-30B-A3B, MoE構成)で整形します。MoE構成のため実計算に使うアクティブパラメータは約3Bで、denseな同規模モデルより高速に動作します。精度・速度は環境に依存し、今後変更される可能性があります。"})]}),(0,b.jsxs)("div",{children:[(0,b.jsx)("p",{className:"font-medium text-foreground",children:"対応環境"}),(0,b.jsx)("p",{className:"text-muted-foreground",children:"Apple Silicon Mac (M1/M2/M3/M4) のみ対応。Windows/Linuxでは利用できません。メモリ32GB以上を推奨します。"})]}),(0,b.jsxs)("div",{children:[(0,b.jsx)("p",{className:"font-medium text-foreground",children:"必要なもの(事前に手動でインストール)"}),(0,b.jsx)("ul",{className:"list-disc pl-5 text-muted-foreground",children:(0,b.jsx)("li",{children:"Python 3.9以降(Xcode Command Line Tools または Homebrew経由で入手可能)"})})]}),(0,b.jsxs)("div",{children:[(0,b.jsx)("p",{className:"mb-1 font-medium text-foreground",children:"セットアップ・起動"}),(0,b.jsx)("p",{className:"text-muted-foreground",children:"下のボタンから、依存関係のインストール・モデルのダウンロード・サーバー起動まで自動で行われます(初回はモデルサイズが大きく数分〜数十分かかります)。"}),y&&!L&&(0,b.jsx)("p",{className:"mt-1 text-destructive",children:"llm-serverが見つかりませんでした。インストールが壊れている可能性があります。"})]}),(0,b.jsxs)("div",{children:[(0,b.jsx)("p",{className:"mb-1 font-medium text-foreground",children:"アンインストール"}),(0,b.jsxs)("p",{className:"text-muted-foreground",children:["ローカルLLMのためにダウンロードされるもの(Pythonの依存関係・LLMモデル、合計約17GB)は全て",(0,b.jsx)("code",{className:"rounded bg-muted px-1",children:"~/.tsunagi/llm"}),"に保存されます。不要になった場合はこのディレクトリを削除するだけで、関連リソースを完全に削除できます。"]})]}),(0,b.jsxs)("div",{className:"border-t border-border pt-4",children:[(!y||"not_running"===y.step||"error"===y.step)&&(0,b.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,b.jsxs)(g.Button,{size:"default",onClick:()=>void I(),disabled:!y,children:[y?(0,b.jsx)(k.Bot,{}):(0,b.jsx)(d.Loader2,{className:"animate-spin"}),"LLMサーバーを起動"]}),y?.step==="error"&&y.error&&(0,b.jsx)("p",{className:"text-xs/relaxed text-destructive",children:y.error})]}),y?.step==="installing_deps"&&(0,b.jsxs)(g.Button,{size:"default",disabled:!0,children:[(0,b.jsx)(d.Loader2,{className:"animate-spin"}),"依存関係をインストール中... (数分かかる場合があります)"]}),y?.step==="downloading_model"&&(0,b.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,b.jsxs)("div",{className:"flex items-center gap-2 text-xs/relaxed text-muted-foreground",children:[(0,b.jsx)(d.Loader2,{className:"size-4 animate-spin"}),"モデルをダウンロード中... (約17GB)"]}),M&&(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(p.Progress,{value:N}),(0,b.jsxs)("p",{className:"text-xs/relaxed text-muted-foreground",children:[w(M.downloadedBytes)," / ",w(M.totalBytes)," (",N.toFixed(0),"%) ・ ",function(a){if(null===a)return"残り時間を計算中...";if(a<60)return`残り約${a}秒`;let b=Math.floor(a/60);return`残り約${b}分${a%60}秒`}(M.etaSeconds)]})]})]}),y?.step==="starting_server"&&(0,b.jsxs)(g.Button,{size:"default",disabled:!0,children:[(0,b.jsx)(d.Loader2,{className:"animate-spin"}),"サーバーを起動中... (モデルのロードに数十秒かかる場合があります)"]}),y&&v.includes(y.step)&&(0,b.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,b.jsxs)("span",{className:"flex items-center gap-2 text-success",children:[(0,b.jsx)(l.CheckCircle2,{className:"size-4"}),"サーバーは起動しています"]}),(0,b.jsxs)(g.Button,{size:"default",variant:"outline",onClick:()=>void J(),children:[(0,b.jsx)(f.Square,{}),"サーバーを停止"]})]})]})]})})]})}let y="tsunagi:whisper-prompt",z="tsunagi:llm-system-prompt",A=["running","running_external"];function B({onTranscribed:a}){let[j,k]=(0,c.useState)(!1),[l,m]=(0,c.useState)("idle"),[n,o]=(0,c.useState)(0),[p,q]=(0,c.useState)(null),r=(0,c.useRef)(null),t=(0,c.useRef)([]),u=(0,c.useRef)(null),v=(0,c.useRef)(null),w=(0,c.useRef)(null),x=(0,c.useRef)(0),C=(0,c.useRef)(0);(0,c.useEffect)(()=>{k("true"===localStorage.getItem("tsunagi:voice-input-enabled"))},[]),(0,c.useEffect)(()=>{if(!j)return;let a=!1,b=async()=>{try{let b=await fetch((0,h.apiUrl)("/api/whisper/server/status")),c=await b.json();a||q(c.step)}catch{a||q("not_running")}};b();let c=setInterval(b,5e3);return()=>{a=!0,clearInterval(c)}},[j]);let D=(0,c.useCallback)(()=>{w.current&&(clearInterval(w.current),w.current=null),v.current?.close(),v.current=null,o(0)},[]);(0,c.useEffect)(()=>()=>{D()},[D]);let E=(0,c.useCallback)(a=>{let b=new AudioContext,c=b.createMediaStreamSource(a),d=b.createAnalyser();d.fftSize=2048,c.connect(d),v.current=b,x.current=0,C.current=0;let e=new Float32Array(d.fftSize);w.current=setInterval(()=>{d.getFloatTimeDomainData(e);let a=0;for(let b=0;b<e.length;b++)a+=e[b]*e[b];let b=Math.sqrt(a/e.length),c=Math.min(1,Math.max(0,((b>0?20*Math.log10(b):-60)- -60)/50));C.current=Math.max(C.current,c),x.current=.3*x.current+.7*c,o(x.current)},50)},[]),F=(0,c.useCallback)(async b=>{m("transcribing");try{let c=new FormData,d=localStorage.getItem(y);d&&c.append("prompt",d);let e="true"===localStorage.getItem(s);c.append("useLlm",String(e));let f=localStorage.getItem(z);f&&c.append("systemPrompt",f),c.append("file",b,"recording.webm");let g=await fetch((0,h.apiUrl)("/api/whisper/transcribe"),{method:"POST",body:c});if(!g.ok){let a=await g.json().catch(()=>null);throw Error(a?.error||`HTTPエラー: ${g.status}`)}let j=await g.json();j.warning&&i.toaster.create({type:"error",title:"LLM整形をスキップしました",description:j.warning}),j.text&&a(j.text)}catch(a){i.toaster.create({type:"error",title:"文字起こしに失敗しました",description:a instanceof Error?a.message:String(a)})}finally{m("idle")}},[a]),G=(0,c.useCallback)(async()=>{try{let a=await navigator.mediaDevices.getUserMedia({audio:!0});u.current=a,t.current=[],E(a);let b=new MediaRecorder(a,{audioBitsPerSecond:128e3});b.ondataavailable=a=>{a.data.size>0&&t.current.push(a.data)},b.onstop=()=>{u.current?.getTracks().forEach(a=>a.stop()),u.current=null;let a=C.current;if(D(),a<.15){i.toaster.create({type:"error",title:"音声が検出されませんでした",description:"マイクに向かって話してから、もう一度お試しください。"}),m("idle");return}let b=new Blob(t.current,{type:"audio/webm"});F(b)},r.current=b,b.start(),m("recording")}catch(a){i.toaster.create({type:"error",title:"マイクにアクセスできませんでした",description:a instanceof Error?a.message:String(a)})}},[F,E,D]),H=(0,c.useCallback)(()=>{r.current?.stop()},[]);if(!j)return null;let I=null!==p&&A.includes(p);return(0,b.jsxs)("div",{className:"recording"===l?"inline-flex items-center gap-2 rounded-md bg-destructive/10 p-1":"inline-flex",children:[(0,b.jsx)(g.Button,{size:"icon",variant:"recording"===l?"destructive":"default",onClick:"recording"===l?H:()=>void G(),disabled:"transcribing"===l||"idle"===l&&!I,title:"recording"===l?"停止して入力":"idle"!==l||I?"音声入力":"Whisperサーバーが起動していません(Settingsから起動してください)",children:"transcribing"===l?(0,b.jsx)(d.Loader2,{className:"w-4 h-4 animate-spin"}):"recording"===l?(0,b.jsx)(f.Square,{className:"w-4 h-4"}):(0,b.jsx)(e.Mic,{className:"w-4 h-4"})}),"recording"===l&&(0,b.jsx)("div",{"aria-hidden":!0,className:"h-1.5 w-16 overflow-hidden rounded-full bg-background/60",children:(0,b.jsx)("div",{className:"h-full rounded-full bg-destructive",style:{width:`${Math.round(100*n)}%`}})})]})}a.s(["ClaudeIcon",0,function(a){return(0,b.jsx)("svg",{viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true",...a,children:(0,b.jsx)("path",{d:"m4.7144 15.9555 4.7174-2.6471.079-.2307-.079-.1275h-.2307l-.7893-.0486-2.6956-.0729-2.3375-.0971-2.2646-.1214-.5707-.1215-.5343-.7042.0546-.3522.4797-.3218.686.0608 1.5179.1032 2.2767.1578 1.6514.0972 2.4468.255h.3886l.0546-.1579-.1336-.0971-.1032-.0972L6.973 9.8356l-2.55-1.6879-1.3356-.9714-.7225-.4918-.3643-.4614-.1578-1.0078.6557-.7225.8803.0607.2246.0607.8925.686 1.9064 1.4754 2.4893 1.8336.3643.3035.1457-.1032.0182-.0728-.164-.2733-1.3539-2.4467-1.445-2.4893-.6435-1.032-.17-.6194c-.0607-.255-.1032-.4674-.1032-.7285L6.287.1335 6.6997 0l.9957.1336.419.3642.6192 1.4147 1.0018 2.2282 1.5543 3.0296.4553.8985.2429.8318.091.255h.1579v-.1457l.1275-1.706.2368-2.0947.2307-2.6957.0789-.7589.3764-.9107.7468-.4918.5828.2793.4797.686-.0668.4433-.2853 1.8517-.5586 2.9021-.3643 1.9429h.2125l.2429-.2429.9835-1.3053 1.6514-2.0643.7286-.8196.85-.9046.5464-.4311h1.0321l.759 1.1293-.34 1.1657-1.0625 1.3478-.8804 1.1414-1.2628 1.7-.7893 1.36.0729.1093.1882-.0183 2.8535-.607 1.5421-.2794 1.8396-.3157.8318.3886.091.3946-.3278.8075-1.967.4857-2.3072.4614-3.4364.8136-.0425.0304.0486.0607 1.5482.1457.6618.0364h1.621l3.0175.2247.7892.522.4736.6376-.079.4857-1.2142.6193-1.6393-.3886-3.825-.9107-1.3113-.3279h-.1822v.1093l1.0929 1.0686 2.0035 1.8092 2.5075 2.3314.1275.5768-.3218.4554-.34-.0486-2.2039-1.6575-.85-.7468-1.9246-1.621h-.1275v.17l.4432.6496 2.3436 3.5214.1214 1.0807-.17.3521-.6071.2125-.6679-.1214-1.3721-1.9246L14.38 17.959l-1.1414-1.9428-.1397.079-.674 7.2552-.3156.3703-.7286.2793-.6071-.4614-.3218-.7468.3218-1.4753.3886-1.9246.3157-1.53.2853-1.9004.17-.6314-.0121-.0425-.1397.0182-1.4328 1.9672-2.1796 2.9446-1.7243 1.8456-.4128.164-.7164-.3704.0667-.6618.4008-.5889 2.386-3.0357 1.4389-1.882.929-1.0868-.0062-.1579h-.0546l-6.3385 4.1164-1.1293.1457-.4857-.4554.0608-.7467.2307-.2429 1.9064-1.3114Z"})})},"OllamaIcon",0,function(a){return(0,b.jsx)("svg",{viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true",...a,children:(0,b.jsx)("path",{d:"M16.361 10.26a.894.894 0 0 0-.558.47l-.072.148.001.207c0 .193.004.217.059.353.076.193.152.312.291.448.24.238.51.3.872.205a.86.86 0 0 0 .517-.436.752.752 0 0 0 .08-.498c-.064-.453-.33-.782-.724-.897a1.06 1.06 0 0 0-.466 0zm-9.203.005c-.305.096-.533.32-.65.639a1.187 1.187 0 0 0-.06.52c.057.309.31.59.598.667.362.095.632.033.872-.205.14-.136.215-.255.291-.448.055-.136.059-.16.059-.353l.001-.207-.072-.148a.894.894 0 0 0-.565-.472 1.02 1.02 0 0 0-.474.007Zm4.184 2c-.131.071-.223.25-.195.383.031.143.157.288.353.407.105.063.112.072.117.136.004.038-.01.146-.029.243-.02.094-.036.194-.036.222.002.074.07.195.143.253.064.052.076.054.255.059.164.005.198.001.264-.03.169-.082.212-.234.15-.525-.052-.243-.042-.28.087-.355.137-.08.281-.219.324-.314a.365.365 0 0 0-.175-.48.394.394 0 0 0-.181-.033c-.126 0-.207.03-.355.124l-.085.053-.053-.032c-.219-.13-.259-.145-.391-.143a.396.396 0 0 0-.193.032zm.39-2.195c-.373.036-.475.05-.654.086-.291.06-.68.195-.951.328-.94.46-1.589 1.226-1.787 2.114-.04.176-.045.234-.045.53 0 .294.005.357.043.524.264 1.16 1.332 2.017 2.714 2.173.3.033 1.596.033 1.896 0 1.11-.125 2.064-.727 2.493-1.571.114-.226.169-.372.22-.602.039-.167.044-.23.044-.523 0-.297-.005-.355-.045-.531-.288-1.29-1.539-2.304-3.072-2.497a6.873 6.873 0 0 0-.855-.031zm.645.937a3.283 3.283 0 0 1 1.44.514c.223.148.537.458.671.662.166.251.26.508.303.82.02.143.01.251-.043.482-.08.345-.332.705-.672.957a3.115 3.115 0 0 1-.689.348c-.382.122-.632.144-1.525.138-.582-.006-.686-.01-.853-.042-.57-.107-1.022-.334-1.35-.68-.264-.28-.385-.535-.45-.946-.03-.192.025-.509.137-.776.136-.326.488-.73.836-.963.403-.269.934-.46 1.422-.512.187-.02.586-.02.773-.002zm-5.503-11a1.653 1.653 0 0 0-.683.298C5.617.74 5.173 1.666 4.985 2.819c-.07.436-.119 1.04-.119 1.503 0 .544.064 1.24.155 1.721.02.107.031.202.023.208a8.12 8.12 0 0 1-.187.152 5.324 5.324 0 0 0-.949 1.02 5.49 5.49 0 0 0-.94 2.339 6.625 6.625 0 0 0-.023 1.357c.091.78.325 1.438.727 2.04l.13.195-.037.064c-.269.452-.498 1.105-.605 1.732-.084.496-.095.629-.095 1.294 0 .67.009.803.088 1.266.095.555.288 1.143.503 1.534.071.128.243.393.264.407.007.003-.014.067-.046.141a7.405 7.405 0 0 0-.548 1.873c-.062.417-.071.552-.071.991 0 .56.031.832.148 1.279L3.42 24h1.478l-.05-.091c-.297-.552-.325-1.575-.068-2.597.117-.472.25-.819.498-1.296l.148-.29v-.177c0-.165-.003-.184-.057-.293a.915.915 0 0 0-.194-.25 1.74 1.74 0 0 1-.385-.543c-.424-.92-.506-2.286-.208-3.451.124-.486.329-.918.544-1.154a.787.787 0 0 0 .223-.531c0-.195-.07-.355-.224-.522a3.136 3.136 0 0 1-.817-1.729c-.14-.96.114-2.005.69-2.834.563-.814 1.353-1.336 2.237-1.475.199-.033.57-.028.776.01.226.04.367.028.512-.041.179-.085.268-.19.374-.431.093-.215.165-.333.36-.576.234-.29.46-.489.822-.729.413-.27.884-.467 1.352-.561.17-.035.25-.04.569-.04.319 0 .398.005.569.04a4.07 4.07 0 0 1 1.914.997c.117.109.398.457.488.602.034.057.095.177.132.267.105.241.195.346.374.43.14.068.286.082.503.045.343-.058.607-.053.943.016 1.144.23 2.14 1.173 2.581 2.437.385 1.108.276 2.267-.296 3.153-.097.15-.193.27-.333.419-.301.322-.301.722-.001 1.053.493.539.801 1.866.708 3.036-.062.772-.26 1.463-.533 1.854a2.096 2.096 0 0 1-.224.258.916.916 0 0 0-.194.25c-.054.109-.057.128-.057.293v.178l.148.29c.248.476.38.823.498 1.295.253 1.008.231 2.01-.059 2.581a.845.845 0 0 0-.044.098c0 .006.329.009.732.009h.73l.02-.074.036-.134c.019-.076.057-.3.088-.516.029-.217.029-1.016 0-1.258-.11-.875-.295-1.57-.597-2.226-.032-.074-.053-.138-.046-.141.008-.005.057-.074.108-.152.376-.569.607-1.284.724-2.228.031-.26.031-1.378 0-1.628-.083-.645-.182-1.082-.348-1.525a6.083 6.083 0 0 0-.329-.7l-.038-.064.131-.194c.402-.604.636-1.262.727-2.04a6.625 6.625 0 0 0-.024-1.358 5.512 5.512 0 0 0-.939-2.339 5.325 5.325 0 0 0-.95-1.02 8.097 8.097 0 0 1-.186-.152.692.692 0 0 1 .023-.208c.208-1.087.201-2.443-.017-3.503-.19-.924-.535-1.658-.98-2.082-.354-.338-.716-.482-1.15-.455-.996.059-1.8 1.205-2.116 3.01a6.805 6.805 0 0 0-.097.726c0 .036-.007.066-.015.066a.96.96 0 0 1-.149-.078A4.857 4.857 0 0 0 12 3.03c-.832 0-1.687.243-2.456.698a.958.958 0 0 1-.148.078c-.008 0-.015-.03-.015-.066a6.71 6.71 0 0 0-.097-.725C8.997 1.392 8.337.319 7.46.048a2.096 2.096 0 0 0-.585-.041Zm.293 1.402c.248.197.523.759.682 1.388.03.113.06.244.069.292.007.047.026.152.041.233.067.365.098.76.102 1.24l.002.475-.12.175-.118.178h-.278c-.324 0-.646.041-.954.124l-.238.06c-.033.007-.038-.003-.057-.144a8.438 8.438 0 0 1 .016-2.323c.124-.788.413-1.501.696-1.711.067-.05.079-.049.157.013zm9.825-.012c.17.126.358.46.498.888.28.854.36 2.028.212 3.145-.019.14-.024.151-.057.144l-.238-.06a3.693 3.693 0 0 0-.954-.124h-.278l-.119-.178-.119-.175.002-.474c.004-.669.066-1.19.214-1.772.157-.623.434-1.185.68-1.382.078-.062.09-.063.159-.012z"})})}],1464),a.s(["useOllamaSettings",0,function(){let[a,b]=(0,c.useState)(null),d=(0,c.useCallback)(async()=>{try{let a=await fetch((0,h.apiUrl)("/api/settings/ollama"));if(!a.ok)throw Error(`HTTP ${a.status}`);let c=await a.json();b(c.data)}catch(a){console.error("Failed to fetch ollama settings:",a),b(null)}},[]);return(0,c.useEffect)(()=>{d()},[d]),{settings:a,setSettings:b,reload:d}}],72047)}];
|
|
2
|
-
|
|
3
|
-
//# sourceMappingURL=_016-lxb._.js.map
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
module.exports=[210,a=>{"use strict";let b=(0,a.i(60137).default)("arrow-left",[["path",{d:"m12 19-7-7 7-7",key:"1l729n"}],["path",{d:"M19 12H5",key:"x3x0zl"}]]);a.s(["ArrowLeft",0,b],210)},99464,92e3,a=>{"use strict";var b=a.i(60137);let c=(0,b.default)("pencil",[["path",{d:"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z",key:"1a8usu"}],["path",{d:"m15 5 4 4",key:"1mk7zo"}]]);a.s(["Pencil",0,c],99464);let d=(0,b.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"}]]);a.s(["AlertCircle",0,d],92e3)},4975,48124,a=>{"use strict";var b=a.i(60137);let c=(0,b.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"}]]);a.s(["Mic",0,c],4975);let d=(0,b.default)("square",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}]]);a.s(["Square",0,d],48124)},82434,a=>{"use strict";let b=(0,a.i(60137).default)("bot",[["path",{d:"M12 8V4H8",key:"hb8ula"}],["rect",{width:"16",height:"12",x:"4",y:"8",rx:"2",key:"enze0r"}],["path",{d:"M2 14h2",key:"vft8re"}],["path",{d:"M20 14h2",key:"4cs60a"}],["path",{d:"M15 13v2",key:"1xurst"}],["path",{d:"M9 13v2",key:"rq6x2g"}]]);a.s(["Bot",0,b],82434)},36620,a=>{"use strict";let b=(0,a.i(60137).default)("circle-question-mark",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3",key:"1u773s"}],["path",{d:"M12 17h.01",key:"p32p05"}]]);a.s(["CircleHelp",0,b],36620)},92552,a=>{"use strict";var b=a.i(87924),c=a.i(760);a.s(["Card",0,function({className:a,size:d="default",...e}){return(0,b.jsx)("div",{"data-slot":"card","data-size":d,className:(0,c.cn)("group/card flex flex-col gap-4 overflow-hidden rounded-lg bg-card py-4 text-xs/relaxed text-card-foreground ring-1 ring-foreground/10 has-[>img:first-child]:pt-0 data-[size=sm]:gap-3 data-[size=sm]:py-3 *:[img:first-child]:rounded-t-lg *:[img:last-child]:rounded-b-lg",a),...e})},"CardContent",0,function({className:a,...d}){return(0,b.jsx)("div",{"data-slot":"card-content",className:(0,c.cn)("px-4 group-data-[size=sm]/card:px-3",a),...d})},"CardDescription",0,function({className:a,...d}){return(0,b.jsx)("div",{"data-slot":"card-description",className:(0,c.cn)("text-xs/relaxed text-muted-foreground",a),...d})},"CardHeader",0,function({className:a,...d}){return(0,b.jsx)("div",{"data-slot":"card-header",className:(0,c.cn)("group/card-header @container/card-header grid auto-rows-min items-start gap-1 rounded-t-lg px-4 group-data-[size=sm]/card:px-3 has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto] [.border-b]:pb-4 group-data-[size=sm]/card:[.border-b]:pb-3",a),...d})},"CardTitle",0,function({className:a,...d}){return(0,b.jsx)("div",{"data-slot":"card-title",className:(0,c.cn)("font-heading text-sm font-medium",a),...d})}])},56026,19768,1464,72047,a=>{"use strict";a.s(["LLM_SYSTEM_PROMPT_STORAGE_KEY",()=>z,"VoiceInputButton",()=>B,"WHISPER_PROMPT_STORAGE_KEY",()=>y],56026);var b=a.i(87924),c=a.i(72131),d=a.i(96221),e=a.i(4975),f=a.i(48124),g=a.i(39524),h=a.i(91399),i=a.i(6828);a.s(["LOCAL_LLM_ENABLED_STORAGE_KEY",()=>s,"LocalLlmSection",()=>x],19768);var j=a.i(92e3),k=a.i(82434),l=a.i(67453),m=a.i(36620),n=a.i(92552),o=a.i(90002),p=a.i(65025),q=a.i(97463);let r="tsunagi:local-llm-enabled",s=r,t={not_running:"停止中",installing_deps:"依存関係をインストール中...",downloading_model:"モデルをダウンロード中...",starting_server:"サーバーを起動中... (モデルのロードに数十秒かかる場合があります)",running:"実行中",running_external:"実行中 (tsunagi外で起動)",error:"エラー"},u=["installing_deps","downloading_model","starting_server"],v=["running","running_external"];function w(a){let b=a/0x40000000;return b>=.1?`${b.toFixed(2)} GB`:`${(a/1048576).toFixed(0)} MB`}function x(){let[a,e]=(0,c.useState)(!1),[s,x]=(0,c.useState)(!1),[y,A]=(0,c.useState)(null),[B,C]=(0,c.useState)(""),D=(0,c.useRef)(null),E=(0,c.useCallback)(a=>{e(a),localStorage.setItem(r,String(a))},[]),F=(0,c.useCallback)(a=>{C(a),localStorage.setItem(z,a)},[]),G=(0,c.useCallback)(async()=>{let a=await fetch((0,h.apiUrl)("/api/llm/server/status")),b=await a.json();return A(b),b},[]);(0,c.useEffect)(()=>{e("true"===localStorage.getItem(r)),C(localStorage.getItem(z)??""),G()},[G]),(0,c.useEffect)(()=>{y&&v.includes(y.step)&&!a&&(E(!0),i.toaster.create({type:"success",title:"ローカルLLMが有効化されました"}))},[y,a,E]),(0,c.useEffect)(()=>(y&&u.includes(y.step)&&!D.current&&(D.current=setInterval(()=>{G().then(a=>{!u.includes(a.step)&&D.current&&(clearInterval(D.current),D.current=null)})},1e3)),()=>{D.current&&(clearInterval(D.current),D.current=null)}),[y,G]);let H=(0,c.useCallback)(()=>{G(),x(!0)},[G]),I=(0,c.useCallback)(async()=>{try{let a=await fetch((0,h.apiUrl)("/api/llm/server/start"),{method:"POST"});if(!a.ok){let b=await a.json().catch(()=>null);throw Error(b?.error||`HTTPエラー: ${a.status}`)}A(await a.json())}catch(a){i.toaster.create({type:"error",title:"サーバーの起動に失敗しました",description:a instanceof Error?a.message:String(a)})}},[]),J=(0,c.useCallback)(async()=>{try{let a=await fetch((0,h.apiUrl)("/api/llm/server/stop"),{method:"POST"});if(!a.ok){let b=await a.json().catch(()=>null);throw Error(b?.error||`HTTPエラー: ${a.status}`)}A(await a.json())}catch(a){i.toaster.create({type:"error",title:"サーバーの停止に失敗しました",description:a instanceof Error?a.message:String(a)})}},[]),K=(0,c.useCallback)(()=>{E(!1),y&&v.includes(y.step)&&J()},[E,J,y]),L=y?.serverDir,M=y?.downloadProgress,N=M?M.downloadedBytes/M.totalBytes*100:0,O=null!==y,P=O&&v.includes(y.step);return(0,b.jsxs)(n.Card,{children:[(0,b.jsxs)(n.CardHeader,{children:[(0,b.jsxs)("div",{className:"flex items-center gap-1",children:[(0,b.jsx)(n.CardTitle,{children:"ローカルLLM (実験的機能)"}),(0,b.jsx)(g.Button,{variant:"ghost",size:"icon-sm",onClick:H,title:"ローカルLLMについて",children:(0,b.jsx)(m.CircleHelp,{})})]}),(0,b.jsxs)(n.CardDescription,{children:["ローカルで動作するLLM(Qwen3-30B-A3B, MoE)を利用します。",(0,b.jsx)("strong",{className:"font-medium text-foreground",children:"有効にすると、音声入力の文字起こし結果がこのLLMで自動整形されるようになります"}),"(無効時は文字起こし結果をそのまま使用)。"]})]}),(0,b.jsx)(n.CardContent,{className:"flex flex-col gap-3",children:a?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[O?P?(0,b.jsxs)("span",{className:"flex items-center gap-2 text-success",children:[(0,b.jsx)(l.CheckCircle2,{className:"size-4"}),"ローカルLLM: 有効"]}):(0,b.jsxs)("span",{className:"flex items-center gap-2 text-warning",children:[(0,b.jsx)(j.AlertCircle,{className:"size-4"}),"ローカルLLM: 有効化済み(サーバー停止中)"]}):(0,b.jsxs)("span",{className:"flex items-center gap-2 text-muted-foreground",children:[(0,b.jsx)(d.Loader2,{className:"size-4 animate-spin"}),"状態を確認中..."]}),y&&(0,b.jsxs)("span",{className:"text-xs/relaxed text-muted-foreground",children:["(",t[y.step],")"]}),O&&!P&&(0,b.jsxs)(g.Button,{size:"default",onClick:H,children:[(0,b.jsx)(k.Bot,{}),"サーバーを起動"]}),(0,b.jsx)(g.Button,{size:"default",variant:"outline",onClick:K,children:"無効にする"})]}),(0,b.jsxs)("div",{children:[(0,b.jsx)("label",{className:"mb-1 block text-xs font-medium text-muted-foreground",children:"整形システムプロンプト (任意)"}),(0,b.jsx)(q.Textarea,{value:B,onChange:a=>F(a.target.value),placeholder:"例: 句読点の追加と誤字修正のみ行い、言い回しは変えないでください。",className:"min-h-16 text-xs"}),(0,b.jsx)("p",{className:"mt-1 text-[0.65rem] text-muted-foreground",children:"文字起こし結果をLLMで整形する際の指示です。空欄の場合は既定のプロンプト(句読点の追加・誤字修正のみを行う指示)を使用します。"})]})]}):(0,b.jsxs)(g.Button,{size:"default",onClick:H,children:[(0,b.jsx)(k.Bot,{}),"ローカルLLMを有効化する"]})}),(0,b.jsx)(o.Dialog,{open:s,onOpenChange:({open:a})=>x(a),title:"ローカルLLMについて",maxWidth:"2xl",children:(0,b.jsxs)("div",{className:"space-y-4 text-sm",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("p",{className:"font-medium text-foreground",children:"実験的機能です"}),(0,b.jsx)("p",{className:"text-muted-foreground",children:"音声入力の文字起こし結果を、ローカルで動作するLLM(mlx-lm / Qwen3-30B-A3B, MoE構成)で整形します。MoE構成のため実計算に使うアクティブパラメータは約3Bで、denseな同規模モデルより高速に動作します。精度・速度は環境に依存し、今後変更される可能性があります。"})]}),(0,b.jsxs)("div",{children:[(0,b.jsx)("p",{className:"font-medium text-foreground",children:"対応環境"}),(0,b.jsx)("p",{className:"text-muted-foreground",children:"Apple Silicon Mac (M1/M2/M3/M4) のみ対応。Windows/Linuxでは利用できません。メモリ32GB以上を推奨します。"})]}),(0,b.jsxs)("div",{children:[(0,b.jsx)("p",{className:"font-medium text-foreground",children:"必要なもの(事前に手動でインストール)"}),(0,b.jsx)("ul",{className:"list-disc pl-5 text-muted-foreground",children:(0,b.jsx)("li",{children:"Python 3.9以降(Xcode Command Line Tools または Homebrew経由で入手可能)"})})]}),(0,b.jsxs)("div",{children:[(0,b.jsx)("p",{className:"mb-1 font-medium text-foreground",children:"セットアップ・起動"}),(0,b.jsx)("p",{className:"text-muted-foreground",children:"下のボタンから、依存関係のインストール・モデルのダウンロード・サーバー起動まで自動で行われます(初回はモデルサイズが大きく数分〜数十分かかります)。"}),y&&!L&&(0,b.jsx)("p",{className:"mt-1 text-destructive",children:"llm-serverが見つかりませんでした。インストールが壊れている可能性があります。"})]}),(0,b.jsxs)("div",{children:[(0,b.jsx)("p",{className:"mb-1 font-medium text-foreground",children:"アンインストール"}),(0,b.jsxs)("p",{className:"text-muted-foreground",children:["ローカルLLMのためにダウンロードされるもの(Pythonの依存関係・LLMモデル、合計約17GB)は全て",(0,b.jsx)("code",{className:"rounded bg-muted px-1",children:"~/.tsunagi/llm"}),"に保存されます。不要になった場合はこのディレクトリを削除するだけで、関連リソースを完全に削除できます。"]})]}),(0,b.jsxs)("div",{className:"border-t border-border pt-4",children:[(!y||"not_running"===y.step||"error"===y.step)&&(0,b.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,b.jsxs)(g.Button,{size:"default",onClick:()=>void I(),disabled:!y,children:[y?(0,b.jsx)(k.Bot,{}):(0,b.jsx)(d.Loader2,{className:"animate-spin"}),"LLMサーバーを起動"]}),y?.step==="error"&&y.error&&(0,b.jsx)("p",{className:"text-xs/relaxed text-destructive",children:y.error})]}),y?.step==="installing_deps"&&(0,b.jsxs)(g.Button,{size:"default",disabled:!0,children:[(0,b.jsx)(d.Loader2,{className:"animate-spin"}),"依存関係をインストール中... (数分かかる場合があります)"]}),y?.step==="downloading_model"&&(0,b.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,b.jsxs)("div",{className:"flex items-center gap-2 text-xs/relaxed text-muted-foreground",children:[(0,b.jsx)(d.Loader2,{className:"size-4 animate-spin"}),"モデルをダウンロード中... (約17GB)"]}),M&&(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(p.Progress,{value:N}),(0,b.jsxs)("p",{className:"text-xs/relaxed text-muted-foreground",children:[w(M.downloadedBytes)," / ",w(M.totalBytes)," (",N.toFixed(0),"%) ・ ",function(a){if(null===a)return"残り時間を計算中...";if(a<60)return`残り約${a}秒`;let b=Math.floor(a/60);return`残り約${b}分${a%60}秒`}(M.etaSeconds)]})]})]}),y?.step==="starting_server"&&(0,b.jsxs)(g.Button,{size:"default",disabled:!0,children:[(0,b.jsx)(d.Loader2,{className:"animate-spin"}),"サーバーを起動中... (モデルのロードに数十秒かかる場合があります)"]}),y&&v.includes(y.step)&&(0,b.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,b.jsxs)("span",{className:"flex items-center gap-2 text-success",children:[(0,b.jsx)(l.CheckCircle2,{className:"size-4"}),"サーバーは起動しています"]}),(0,b.jsxs)(g.Button,{size:"default",variant:"outline",onClick:()=>void J(),children:[(0,b.jsx)(f.Square,{}),"サーバーを停止"]})]})]})]})})]})}let y="tsunagi:whisper-prompt",z="tsunagi:llm-system-prompt",A=["running","running_external"];function B({onTranscribed:a}){let[j,k]=(0,c.useState)(!1),[l,m]=(0,c.useState)("idle"),[n,o]=(0,c.useState)(0),[p,q]=(0,c.useState)(null),r=(0,c.useRef)(null),t=(0,c.useRef)([]),u=(0,c.useRef)(null),v=(0,c.useRef)(null),w=(0,c.useRef)(null),x=(0,c.useRef)(0),C=(0,c.useRef)(0);(0,c.useEffect)(()=>{k("true"===localStorage.getItem("tsunagi:voice-input-enabled"))},[]),(0,c.useEffect)(()=>{if(!j)return;let a=!1,b=async()=>{try{let b=await fetch((0,h.apiUrl)("/api/whisper/server/status")),c=await b.json();a||q(c.step)}catch{a||q("not_running")}};b();let c=setInterval(b,5e3);return()=>{a=!0,clearInterval(c)}},[j]);let D=(0,c.useCallback)(()=>{w.current&&(clearInterval(w.current),w.current=null),v.current?.close(),v.current=null,o(0)},[]);(0,c.useEffect)(()=>()=>{D()},[D]);let E=(0,c.useCallback)(a=>{let b=new AudioContext,c=b.createMediaStreamSource(a),d=b.createAnalyser();d.fftSize=2048,c.connect(d),v.current=b,x.current=0,C.current=0;let e=new Float32Array(d.fftSize);w.current=setInterval(()=>{d.getFloatTimeDomainData(e);let a=0;for(let b=0;b<e.length;b++)a+=e[b]*e[b];let b=Math.sqrt(a/e.length),c=Math.min(1,Math.max(0,((b>0?20*Math.log10(b):-60)- -60)/50));C.current=Math.max(C.current,c),x.current=.3*x.current+.7*c,o(x.current)},50)},[]),F=(0,c.useCallback)(async b=>{m("transcribing");try{let c=new FormData,d=localStorage.getItem(y);d&&c.append("prompt",d);let e="true"===localStorage.getItem(s);c.append("useLlm",String(e));let f=localStorage.getItem(z);f&&c.append("systemPrompt",f),c.append("file",b,"recording.webm");let g=await fetch((0,h.apiUrl)("/api/whisper/transcribe"),{method:"POST",body:c});if(!g.ok){let a=await g.json().catch(()=>null);throw Error(a?.error||`HTTPエラー: ${g.status}`)}let j=await g.json();j.warning&&i.toaster.create({type:"error",title:"LLM整形をスキップしました",description:j.warning}),j.text&&a(j.text)}catch(a){i.toaster.create({type:"error",title:"文字起こしに失敗しました",description:a instanceof Error?a.message:String(a)})}finally{m("idle")}},[a]),G=(0,c.useCallback)(async()=>{try{let a=await navigator.mediaDevices.getUserMedia({audio:!0});u.current=a,t.current=[],E(a);let b=new MediaRecorder(a,{audioBitsPerSecond:128e3});b.ondataavailable=a=>{a.data.size>0&&t.current.push(a.data)},b.onstop=()=>{u.current?.getTracks().forEach(a=>a.stop()),u.current=null;let a=C.current;if(D(),a<.15){i.toaster.create({type:"error",title:"音声が検出されませんでした",description:"マイクに向かって話してから、もう一度お試しください。"}),m("idle");return}let b=new Blob(t.current,{type:"audio/webm"});F(b)},r.current=b,b.start(),m("recording")}catch(a){i.toaster.create({type:"error",title:"マイクにアクセスできませんでした",description:a instanceof Error?a.message:String(a)})}},[F,E,D]),H=(0,c.useCallback)(()=>{r.current?.stop()},[]);if(!j)return null;let I=null!==p&&A.includes(p);return(0,b.jsxs)("div",{className:"recording"===l?"inline-flex items-center gap-2 rounded-md bg-destructive/10 p-1":"inline-flex",children:[(0,b.jsx)(g.Button,{size:"icon",variant:"recording"===l?"destructive":"default",onClick:"recording"===l?H:()=>void G(),disabled:"transcribing"===l||"idle"===l&&!I,title:"recording"===l?"停止して入力":"idle"!==l||I?"音声入力":"Whisperサーバーが起動していません(Settingsから起動してください)",children:"transcribing"===l?(0,b.jsx)(d.Loader2,{className:"w-4 h-4 animate-spin"}):"recording"===l?(0,b.jsx)(f.Square,{className:"w-4 h-4"}):(0,b.jsx)(e.Mic,{className:"w-4 h-4"})}),"recording"===l&&(0,b.jsx)("div",{"aria-hidden":!0,className:"h-1.5 w-16 overflow-hidden rounded-full bg-background/60",children:(0,b.jsx)("div",{className:"h-full rounded-full bg-destructive",style:{width:`${Math.round(100*n)}%`}})})]})}a.s(["ClaudeIcon",0,function(a){return(0,b.jsx)("svg",{viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true",...a,children:(0,b.jsx)("path",{d:"m4.7144 15.9555 4.7174-2.6471.079-.2307-.079-.1275h-.2307l-.7893-.0486-2.6956-.0729-2.3375-.0971-2.2646-.1214-.5707-.1215-.5343-.7042.0546-.3522.4797-.3218.686.0608 1.5179.1032 2.2767.1578 1.6514.0972 2.4468.255h.3886l.0546-.1579-.1336-.0971-.1032-.0972L6.973 9.8356l-2.55-1.6879-1.3356-.9714-.7225-.4918-.3643-.4614-.1578-1.0078.6557-.7225.8803.0607.2246.0607.8925.686 1.9064 1.4754 2.4893 1.8336.3643.3035.1457-.1032.0182-.0728-.164-.2733-1.3539-2.4467-1.445-2.4893-.6435-1.032-.17-.6194c-.0607-.255-.1032-.4674-.1032-.7285L6.287.1335 6.6997 0l.9957.1336.419.3642.6192 1.4147 1.0018 2.2282 1.5543 3.0296.4553.8985.2429.8318.091.255h.1579v-.1457l.1275-1.706.2368-2.0947.2307-2.6957.0789-.7589.3764-.9107.7468-.4918.5828.2793.4797.686-.0668.4433-.2853 1.8517-.5586 2.9021-.3643 1.9429h.2125l.2429-.2429.9835-1.3053 1.6514-2.0643.7286-.8196.85-.9046.5464-.4311h1.0321l.759 1.1293-.34 1.1657-1.0625 1.3478-.8804 1.1414-1.2628 1.7-.7893 1.36.0729.1093.1882-.0183 2.8535-.607 1.5421-.2794 1.8396-.3157.8318.3886.091.3946-.3278.8075-1.967.4857-2.3072.4614-3.4364.8136-.0425.0304.0486.0607 1.5482.1457.6618.0364h1.621l3.0175.2247.7892.522.4736.6376-.079.4857-1.2142.6193-1.6393-.3886-3.825-.9107-1.3113-.3279h-.1822v.1093l1.0929 1.0686 2.0035 1.8092 2.5075 2.3314.1275.5768-.3218.4554-.34-.0486-2.2039-1.6575-.85-.7468-1.9246-1.621h-.1275v.17l.4432.6496 2.3436 3.5214.1214 1.0807-.17.3521-.6071.2125-.6679-.1214-1.3721-1.9246L14.38 17.959l-1.1414-1.9428-.1397.079-.674 7.2552-.3156.3703-.7286.2793-.6071-.4614-.3218-.7468.3218-1.4753.3886-1.9246.3157-1.53.2853-1.9004.17-.6314-.0121-.0425-.1397.0182-1.4328 1.9672-2.1796 2.9446-1.7243 1.8456-.4128.164-.7164-.3704.0667-.6618.4008-.5889 2.386-3.0357 1.4389-1.882.929-1.0868-.0062-.1579h-.0546l-6.3385 4.1164-1.1293.1457-.4857-.4554.0608-.7467.2307-.2429 1.9064-1.3114Z"})})},"OllamaIcon",0,function(a){return(0,b.jsx)("svg",{viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true",...a,children:(0,b.jsx)("path",{d:"M16.361 10.26a.894.894 0 0 0-.558.47l-.072.148.001.207c0 .193.004.217.059.353.076.193.152.312.291.448.24.238.51.3.872.205a.86.86 0 0 0 .517-.436.752.752 0 0 0 .08-.498c-.064-.453-.33-.782-.724-.897a1.06 1.06 0 0 0-.466 0zm-9.203.005c-.305.096-.533.32-.65.639a1.187 1.187 0 0 0-.06.52c.057.309.31.59.598.667.362.095.632.033.872-.205.14-.136.215-.255.291-.448.055-.136.059-.16.059-.353l.001-.207-.072-.148a.894.894 0 0 0-.565-.472 1.02 1.02 0 0 0-.474.007Zm4.184 2c-.131.071-.223.25-.195.383.031.143.157.288.353.407.105.063.112.072.117.136.004.038-.01.146-.029.243-.02.094-.036.194-.036.222.002.074.07.195.143.253.064.052.076.054.255.059.164.005.198.001.264-.03.169-.082.212-.234.15-.525-.052-.243-.042-.28.087-.355.137-.08.281-.219.324-.314a.365.365 0 0 0-.175-.48.394.394 0 0 0-.181-.033c-.126 0-.207.03-.355.124l-.085.053-.053-.032c-.219-.13-.259-.145-.391-.143a.396.396 0 0 0-.193.032zm.39-2.195c-.373.036-.475.05-.654.086-.291.06-.68.195-.951.328-.94.46-1.589 1.226-1.787 2.114-.04.176-.045.234-.045.53 0 .294.005.357.043.524.264 1.16 1.332 2.017 2.714 2.173.3.033 1.596.033 1.896 0 1.11-.125 2.064-.727 2.493-1.571.114-.226.169-.372.22-.602.039-.167.044-.23.044-.523 0-.297-.005-.355-.045-.531-.288-1.29-1.539-2.304-3.072-2.497a6.873 6.873 0 0 0-.855-.031zm.645.937a3.283 3.283 0 0 1 1.44.514c.223.148.537.458.671.662.166.251.26.508.303.82.02.143.01.251-.043.482-.08.345-.332.705-.672.957a3.115 3.115 0 0 1-.689.348c-.382.122-.632.144-1.525.138-.582-.006-.686-.01-.853-.042-.57-.107-1.022-.334-1.35-.68-.264-.28-.385-.535-.45-.946-.03-.192.025-.509.137-.776.136-.326.488-.73.836-.963.403-.269.934-.46 1.422-.512.187-.02.586-.02.773-.002zm-5.503-11a1.653 1.653 0 0 0-.683.298C5.617.74 5.173 1.666 4.985 2.819c-.07.436-.119 1.04-.119 1.503 0 .544.064 1.24.155 1.721.02.107.031.202.023.208a8.12 8.12 0 0 1-.187.152 5.324 5.324 0 0 0-.949 1.02 5.49 5.49 0 0 0-.94 2.339 6.625 6.625 0 0 0-.023 1.357c.091.78.325 1.438.727 2.04l.13.195-.037.064c-.269.452-.498 1.105-.605 1.732-.084.496-.095.629-.095 1.294 0 .67.009.803.088 1.266.095.555.288 1.143.503 1.534.071.128.243.393.264.407.007.003-.014.067-.046.141a7.405 7.405 0 0 0-.548 1.873c-.062.417-.071.552-.071.991 0 .56.031.832.148 1.279L3.42 24h1.478l-.05-.091c-.297-.552-.325-1.575-.068-2.597.117-.472.25-.819.498-1.296l.148-.29v-.177c0-.165-.003-.184-.057-.293a.915.915 0 0 0-.194-.25 1.74 1.74 0 0 1-.385-.543c-.424-.92-.506-2.286-.208-3.451.124-.486.329-.918.544-1.154a.787.787 0 0 0 .223-.531c0-.195-.07-.355-.224-.522a3.136 3.136 0 0 1-.817-1.729c-.14-.96.114-2.005.69-2.834.563-.814 1.353-1.336 2.237-1.475.199-.033.57-.028.776.01.226.04.367.028.512-.041.179-.085.268-.19.374-.431.093-.215.165-.333.36-.576.234-.29.46-.489.822-.729.413-.27.884-.467 1.352-.561.17-.035.25-.04.569-.04.319 0 .398.005.569.04a4.07 4.07 0 0 1 1.914.997c.117.109.398.457.488.602.034.057.095.177.132.267.105.241.195.346.374.43.14.068.286.082.503.045.343-.058.607-.053.943.016 1.144.23 2.14 1.173 2.581 2.437.385 1.108.276 2.267-.296 3.153-.097.15-.193.27-.333.419-.301.322-.301.722-.001 1.053.493.539.801 1.866.708 3.036-.062.772-.26 1.463-.533 1.854a2.096 2.096 0 0 1-.224.258.916.916 0 0 0-.194.25c-.054.109-.057.128-.057.293v.178l.148.29c.248.476.38.823.498 1.295.253 1.008.231 2.01-.059 2.581a.845.845 0 0 0-.044.098c0 .006.329.009.732.009h.73l.02-.074.036-.134c.019-.076.057-.3.088-.516.029-.217.029-1.016 0-1.258-.11-.875-.295-1.57-.597-2.226-.032-.074-.053-.138-.046-.141.008-.005.057-.074.108-.152.376-.569.607-1.284.724-2.228.031-.26.031-1.378 0-1.628-.083-.645-.182-1.082-.348-1.525a6.083 6.083 0 0 0-.329-.7l-.038-.064.131-.194c.402-.604.636-1.262.727-2.04a6.625 6.625 0 0 0-.024-1.358 5.512 5.512 0 0 0-.939-2.339 5.325 5.325 0 0 0-.95-1.02 8.097 8.097 0 0 1-.186-.152.692.692 0 0 1 .023-.208c.208-1.087.201-2.443-.017-3.503-.19-.924-.535-1.658-.98-2.082-.354-.338-.716-.482-1.15-.455-.996.059-1.8 1.205-2.116 3.01a6.805 6.805 0 0 0-.097.726c0 .036-.007.066-.015.066a.96.96 0 0 1-.149-.078A4.857 4.857 0 0 0 12 3.03c-.832 0-1.687.243-2.456.698a.958.958 0 0 1-.148.078c-.008 0-.015-.03-.015-.066a6.71 6.71 0 0 0-.097-.725C8.997 1.392 8.337.319 7.46.048a2.096 2.096 0 0 0-.585-.041Zm.293 1.402c.248.197.523.759.682 1.388.03.113.06.244.069.292.007.047.026.152.041.233.067.365.098.76.102 1.24l.002.475-.12.175-.118.178h-.278c-.324 0-.646.041-.954.124l-.238.06c-.033.007-.038-.003-.057-.144a8.438 8.438 0 0 1 .016-2.323c.124-.788.413-1.501.696-1.711.067-.05.079-.049.157.013zm9.825-.012c.17.126.358.46.498.888.28.854.36 2.028.212 3.145-.019.14-.024.151-.057.144l-.238-.06a3.693 3.693 0 0 0-.954-.124h-.278l-.119-.178-.119-.175.002-.474c.004-.669.066-1.19.214-1.772.157-.623.434-1.185.68-1.382.078-.062.09-.063.159-.012z"})})}],1464),a.s(["useOllamaSettings",0,function(){let[a,b]=(0,c.useState)(null),d=(0,c.useCallback)(async()=>{try{let a=await fetch((0,h.apiUrl)("/api/settings/ollama"));if(!a.ok)throw Error(`HTTP ${a.status}`);let c=await a.json();b(c.data)}catch(a){console.error("Failed to fetch ollama settings:",a),b(null)}},[]);return(0,c.useEffect)(()=>{d()},[d]),{settings:a,setSettings:b,reload:d}}],72047)},11989,a=>{"use strict";let b=(0,a.i(60137).default)("chevron-right",[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]]);a.s(["default",0,b])}];
|
|
2
|
-
|
|
3
|
-
//# sourceMappingURL=_0hh~0f6._.js.map
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
module.exports=[46058,(a,b,c)=>{"use strict";function d(a){if("function"!=typeof WeakMap)return null;var b=new WeakMap,c=new WeakMap;return(d=function(a){return a?c:b})(a)}c._=function(a,b){if(!b&&a&&a.__esModule)return a;if(null===a||"object"!=typeof a&&"function"!=typeof a)return{default:a};var c=d(b);if(c&&c.has(a))return c.get(a);var e={__proto__:null},f=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var g in a)if("default"!==g&&Object.prototype.hasOwnProperty.call(a,g)){var h=f?Object.getOwnPropertyDescriptor(a,g):null;h&&(h.get||h.set)?Object.defineProperty(e,g,h):e[g]=a[g]}return e.default=a,c&&c.set(a,e),e}},39118,(a,b,c)=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0});var d={DEFAULT_SEGMENT_KEY:function(){return l},NOT_FOUND_SEGMENT_KEY:function(){return m},PAGE_SEGMENT_KEY:function(){return k},addSearchParamsIfPageSegment:function(){return i},computeSelectedLayoutSegment:function(){return j},getSegmentValue:function(){return f},getSelectedLayoutSegmentPath:function(){return function a(b,c,d=!0,e=[]){let g;if(d)g=b[1][c];else{let a=b[1];g=a.children??Object.values(a)[0]}if(!g)return e;let h=f(g[0]);return!h||h.startsWith(k)?e:(e.push(h),a(g,c,!1,e))}},isGroupSegment:function(){return g},isParallelRouteSegment:function(){return h}};for(var e in d)Object.defineProperty(c,e,{enumerable:!0,get:d[e]});function f(a){return Array.isArray(a)?a[1]:a}function g(a){return"("===a[0]&&a.endsWith(")")}function h(a){return a.startsWith("@")&&"@children"!==a}function i(a,b){if(a.includes(k)){let a=JSON.stringify(b);return"{}"!==a?k+"?"+a:k}return a}function j(a,b){if(!a||0===a.length)return null;let c="children"===b?a[0]:a[a.length-1];return c===l?null:c}let k="__PAGE__",l="__DEFAULT__",m="/_not-found"},57997,(a,b,c)=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0});var d={UnrecognizedActionError:function(){return f},unstable_isUnrecognizedActionError:function(){return g}};for(var e in d)Object.defineProperty(c,e,{enumerable:!0,get:d[e]});class f extends Error{constructor(...a){super(...a),this.name="UnrecognizedActionError"}}function g(a){return!!(a&&"object"==typeof a&&a instanceof f)}("function"==typeof c.default||"object"==typeof c.default&&null!==c.default)&&void 0===c.default.__esModule&&(Object.defineProperty(c.default,"__esModule",{value:!0}),Object.assign(c.default,c),b.exports=c.default)},75718,(a,b,c)=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0}),Object.defineProperty(c,"ReadonlyURLSearchParams",{enumerable:!0,get:function(){return e}});class d extends Error{constructor(){super("Method unavailable on `ReadonlyURLSearchParams`. Read more: https://nextjs.org/docs/app/api-reference/functions/use-search-params#updating-searchparams")}}class e extends URLSearchParams{append(){throw new d}delete(){throw new d}set(){throw new d}sort(){throw new d}}("function"==typeof c.default||"object"==typeof c.default&&null!==c.default)&&void 0===c.default.__esModule&&(Object.defineProperty(c.default,"__esModule",{value:!0}),Object.assign(c.default,c),b.exports=c.default)},15128,(a,b,c)=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0}),Object.defineProperty(c,"RedirectStatusCode",{enumerable:!0,get:function(){return e}});var d,e=((d={})[d.SeeOther=303]="SeeOther",d[d.TemporaryRedirect=307]="TemporaryRedirect",d[d.PermanentRedirect=308]="PermanentRedirect",d);("function"==typeof c.default||"object"==typeof c.default&&null!==c.default)&&void 0===c.default.__esModule&&(Object.defineProperty(c.default,"__esModule",{value:!0}),Object.assign(c.default,c),b.exports=c.default)},11026,(a,b,c)=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0});var d={REDIRECT_ERROR_CODE:function(){return g},isRedirectError:function(){return h}};for(var e in d)Object.defineProperty(c,e,{enumerable:!0,get:d[e]});let f=a.r(15128),g="NEXT_REDIRECT";function h(a){if("object"!=typeof a||null===a||!("digest"in a)||"string"!=typeof a.digest)return!1;let b=a.digest.split(";"),[c,d]=b,e=b.slice(2,-2).join(";"),h=Number(b.at(-2));return c===g&&("replace"===d||"push"===d)&&"string"==typeof e&&!isNaN(h)&&h in f.RedirectStatusCode}("function"==typeof c.default||"object"==typeof c.default&&null!==c.default)&&void 0===c.default.__esModule&&(Object.defineProperty(c.default,"__esModule",{value:!0}),Object.assign(c.default,c),b.exports=c.default)},48685,(a,b,c)=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0});var d={getRedirectError:function(){return i},getRedirectStatusCodeFromError:function(){return n},getRedirectTypeFromError:function(){return m},getURLFromRedirectError:function(){return l},permanentRedirect:function(){return k},redirect:function(){return j}};for(var e in d)Object.defineProperty(c,e,{enumerable:!0,get:d[e]});let f=a.r(15128),g=a.r(11026),h=a.r(20635).actionAsyncStorage;function i(a,b,c=f.RedirectStatusCode.TemporaryRedirect){let d=Object.defineProperty(Error(g.REDIRECT_ERROR_CODE),"__NEXT_ERROR_CODE",{value:"E394",enumerable:!1,configurable:!0});return d.digest=`${g.REDIRECT_ERROR_CODE};${b};${a};${c};`,d}function j(a,b){throw i(a,b??=h?.getStore()?.isAction?"push":"replace",f.RedirectStatusCode.TemporaryRedirect)}function k(a,b="replace"){throw i(a,b,f.RedirectStatusCode.PermanentRedirect)}function l(a){return(0,g.isRedirectError)(a)?a.digest.split(";").slice(2,-2).join(";"):null}function m(a){if(!(0,g.isRedirectError)(a))throw Object.defineProperty(Error("Not a redirect error"),"__NEXT_ERROR_CODE",{value:"E260",enumerable:!1,configurable:!0});return a.digest.split(";",2)[1]}function n(a){if(!(0,g.isRedirectError)(a))throw Object.defineProperty(Error("Not a redirect error"),"__NEXT_ERROR_CODE",{value:"E260",enumerable:!1,configurable:!0});return Number(a.digest.split(";").at(-2))}("function"==typeof c.default||"object"==typeof c.default&&null!==c.default)&&void 0===c.default.__esModule&&(Object.defineProperty(c.default,"__esModule",{value:!0}),Object.assign(c.default,c),b.exports=c.default)},8535,(a,b,c)=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0});var d={HTTPAccessErrorStatus:function(){return f},HTTP_ERROR_FALLBACK_ERROR_CODE:function(){return h},getAccessFallbackErrorTypeByStatus:function(){return k},getAccessFallbackHTTPStatus:function(){return j},isHTTPAccessFallbackError:function(){return i}};for(var e in d)Object.defineProperty(c,e,{enumerable:!0,get:d[e]});let f={NOT_FOUND:404,FORBIDDEN:403,UNAUTHORIZED:401},g=new Set(Object.values(f)),h="NEXT_HTTP_ERROR_FALLBACK";function i(a){if("object"!=typeof a||null===a||!("digest"in a)||"string"!=typeof a.digest)return!1;let[b,c]=a.digest.split(";");return b===h&&g.has(Number(c))}function j(a){return Number(a.digest.split(";")[1])}function k(a){switch(a){case 401:return"unauthorized";case 403:return"forbidden";case 404:return"not-found";default:return}}("function"==typeof c.default||"object"==typeof c.default&&null!==c.default)&&void 0===c.default.__esModule&&(Object.defineProperty(c.default,"__esModule",{value:!0}),Object.assign(c.default,c),b.exports=c.default)},28102,(a,b,c)=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0}),Object.defineProperty(c,"notFound",{enumerable:!0,get:function(){return f}});let d=a.r(8535),e=`${d.HTTP_ERROR_FALLBACK_ERROR_CODE};404`;function f(){let a=Object.defineProperty(Error(e),"__NEXT_ERROR_CODE",{value:"E1041",enumerable:!1,configurable:!0});throw a.digest=e,a}("function"==typeof c.default||"object"==typeof c.default&&null!==c.default)&&void 0===c.default.__esModule&&(Object.defineProperty(c.default,"__esModule",{value:!0}),Object.assign(c.default,c),b.exports=c.default)},64177,(a,b,c)=>{"use strict";function d(){throw Object.defineProperty(Error("`forbidden()` is experimental and only allowed to be enabled when `experimental.authInterrupts` is enabled."),"__NEXT_ERROR_CODE",{value:"E488",enumerable:!1,configurable:!0})}Object.defineProperty(c,"__esModule",{value:!0}),Object.defineProperty(c,"forbidden",{enumerable:!0,get:function(){return d}}),a.r(8535).HTTP_ERROR_FALLBACK_ERROR_CODE,("function"==typeof c.default||"object"==typeof c.default&&null!==c.default)&&void 0===c.default.__esModule&&(Object.defineProperty(c.default,"__esModule",{value:!0}),Object.assign(c.default,c),b.exports=c.default)},88213,(a,b,c)=>{"use strict";function d(){throw Object.defineProperty(Error("`unauthorized()` is experimental and only allowed to be used when `experimental.authInterrupts` is enabled."),"__NEXT_ERROR_CODE",{value:"E411",enumerable:!1,configurable:!0})}Object.defineProperty(c,"__esModule",{value:!0}),Object.defineProperty(c,"unauthorized",{enumerable:!0,get:function(){return d}}),a.r(8535).HTTP_ERROR_FALLBACK_ERROR_CODE,("function"==typeof c.default||"object"==typeof c.default&&null!==c.default)&&void 0===c.default.__esModule&&(Object.defineProperty(c.default,"__esModule",{value:!0}),Object.assign(c.default,c),b.exports=c.default)},88644,(a,b,c)=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0}),Object.defineProperty(c,"InvariantError",{enumerable:!0,get:function(){return d}});class d extends Error{constructor(a,b){super(`Invariant: ${a.endsWith(".")?a:a+"."} This is a bug in Next.js.`,b),this.name="InvariantError"}}},54427,(a,b,c)=>{"use strict";function d(){let a,b,c=new Promise((c,d)=>{a=c,b=d});return{resolve:a,reject:b,promise:c}}Object.defineProperty(c,"__esModule",{value:!0}),Object.defineProperty(c,"createPromiseWithResolvers",{enumerable:!0,get:function(){return d}})},40656,(a,b,c)=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0});var d,e={RenderStage:function(){return i},StagedRenderingController:function(){return j}};for(var f in e)Object.defineProperty(c,f,{enumerable:!0,get:e[f]});let g=a.r(88644),h=a.r(54427);var i=((d={})[d.Before=1]="Before",d[d.EarlyStatic=2]="EarlyStatic",d[d.Static=3]="Static",d[d.EarlyRuntime=4]="EarlyRuntime",d[d.Runtime=5]="Runtime",d[d.Dynamic=6]="Dynamic",d[d.Abandoned=7]="Abandoned",d);class j{constructor(a,b,c){this.abortSignal=a,this.abandonController=b,this.shouldTrackSyncIO=c,this.currentStage=1,this.syncInterruptReason=null,this.staticStageEndTime=1/0,this.runtimeStageEndTime=1/0,this.staticStageListeners=[],this.earlyRuntimeStageListeners=[],this.runtimeStageListeners=[],this.dynamicStageListeners=[],this.staticStagePromise=(0,h.createPromiseWithResolvers)(),this.earlyRuntimeStagePromise=(0,h.createPromiseWithResolvers)(),this.runtimeStagePromise=(0,h.createPromiseWithResolvers)(),this.dynamicStagePromise=(0,h.createPromiseWithResolvers)(),a&&a.addEventListener("abort",()=>{let{reason:b}=a;this.staticStagePromise.promise.catch(k),this.staticStagePromise.reject(b),this.earlyRuntimeStagePromise.promise.catch(k),this.earlyRuntimeStagePromise.reject(b),this.runtimeStagePromise.promise.catch(k),this.runtimeStagePromise.reject(b),this.dynamicStagePromise.promise.catch(k),this.dynamicStagePromise.reject(b)},{once:!0}),b&&b.signal.addEventListener("abort",()=>{this.abandonRender()},{once:!0})}onStage(a,b){if(this.currentStage>=a)b();else if(3===a)this.staticStageListeners.push(b);else if(4===a)this.earlyRuntimeStageListeners.push(b);else if(5===a)this.runtimeStageListeners.push(b);else if(6===a)this.dynamicStageListeners.push(b);else throw Object.defineProperty(new g.InvariantError(`Invalid render stage: ${a}`),"__NEXT_ERROR_CODE",{value:"E881",enumerable:!1,configurable:!0})}shouldTrackSyncInterrupt(){if(!this.shouldTrackSyncIO)return!1;switch(this.currentStage){case 1:case 5:case 6:case 7:default:return!1;case 2:case 3:case 4:return!0}}syncInterruptCurrentStageWithReason(a){if(1!==this.currentStage&&7!==this.currentStage){if(this.abandonController)return void this.abandonController.abort();if(this.abortSignal){this.syncInterruptReason=a,this.currentStage=7;return}switch(this.currentStage){case 2:case 3:case 4:this.syncInterruptReason=a,this.advanceStage(6);return;case 5:return}}}getSyncInterruptReason(){return this.syncInterruptReason}getStaticStageEndTime(){return this.staticStageEndTime}getRuntimeStageEndTime(){return this.runtimeStageEndTime}abandonRender(){let{currentStage:a}=this;switch(a){case 2:this.resolveStaticStage();case 3:this.resolveEarlyRuntimeStage();case 4:this.resolveRuntimeStage();case 5:this.currentStage=7;return}}advanceStage(a){if(a<=this.currentStage)return;let b=this.currentStage;if(this.currentStage=a,b<3&&a>=3&&this.resolveStaticStage(),b<4&&a>=4&&this.resolveEarlyRuntimeStage(),b<5&&a>=5&&(this.staticStageEndTime=performance.now()+performance.timeOrigin,this.resolveRuntimeStage()),b<6&&a>=6){this.runtimeStageEndTime=performance.now()+performance.timeOrigin,this.resolveDynamicStage();return}}resolveStaticStage(){let a=this.staticStageListeners;for(let b=0;b<a.length;b++)a[b]();a.length=0,this.staticStagePromise.resolve()}resolveEarlyRuntimeStage(){let a=this.earlyRuntimeStageListeners;for(let b=0;b<a.length;b++)a[b]();a.length=0,this.earlyRuntimeStagePromise.resolve()}resolveRuntimeStage(){let a=this.runtimeStageListeners;for(let b=0;b<a.length;b++)a[b]();a.length=0,this.runtimeStagePromise.resolve()}resolveDynamicStage(){let a=this.dynamicStageListeners;for(let b=0;b<a.length;b++)a[b]();a.length=0,this.dynamicStagePromise.resolve()}getStagePromise(a){switch(a){case 3:return this.staticStagePromise.promise;case 4:return this.earlyRuntimeStagePromise.promise;case 5:return this.runtimeStagePromise.promise;case 6:return this.dynamicStagePromise.promise;default:throw Object.defineProperty(new g.InvariantError(`Invalid render stage: ${a}`),"__NEXT_ERROR_CODE",{value:"E881",enumerable:!1,configurable:!0})}}waitForStage(a){return this.getStagePromise(a)}delayUntilStage(a,b,c){var d,e,f;let g,h=(d=this.getStagePromise(a),e=b,f=c,g=new Promise((a,b)=>{d.then(a.bind(null,f),b)}),void 0!==e&&(g.displayName=e),g);return this.abortSignal&&h.catch(k),h}}function k(){}},35710,(a,b,c)=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0});var d={delayUntilRuntimeStage:function(){return o},getRuntimeStage:function(){return n},isHangingPromiseRejectionError:function(){return g},makeDevtoolsIOAwarePromise:function(){return m},makeHangingPromise:function(){return k}};for(var e in d)Object.defineProperty(c,e,{enumerable:!0,get:d[e]});let f=a.r(40656);function g(a){return"object"==typeof a&&null!==a&&"digest"in a&&a.digest===h}let h="HANGING_PROMISE_REJECTION";class i extends Error{constructor(a,b){super(`During prerendering, ${b} rejects when the prerender is complete. Typically these errors are handled by React but if you move ${b} to a different context by using \`setTimeout\`, \`after\`, or similar functions you may observe this error and you should handle it in that context. This occurred at route "${a}".`),this.route=a,this.expression=b,this.digest=h}}let j=new WeakMap;function k(a,b,c){if(a.aborted)return Promise.reject(new i(b,c));{let d=new Promise((d,e)=>{let f=e.bind(null,new i(b,c)),g=j.get(a);if(g)g.push(f);else{let b=[f];j.set(a,b),a.addEventListener("abort",()=>{for(let a=0;a<b.length;a++)b[a]()},{once:!0})}});return d.catch(l),d}}function l(){}function m(a,b,c){return b.stagedRendering?b.stagedRendering.delayUntilStage(c,void 0,a):new Promise(b=>{setTimeout(()=>{b(a)},0)})}function n(a){return a.currentStage===f.RenderStage.EarlyStatic||a.currentStage===f.RenderStage.EarlyRuntime?f.RenderStage.EarlyRuntime:f.RenderStage.Runtime}function o(a,b){let{stagedRendering:c}=a;return c?c.waitForStage(n(c)).then(()=>b):b}},31101,(a,b,c)=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0}),Object.defineProperty(c,"isPostpone",{enumerable:!0,get:function(){return e}});let d=Symbol.for("react.postpone");function e(a){return"object"==typeof a&&null!==a&&a.$$typeof===d}},41997,(a,b,c)=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0});var d={BailoutToCSRError:function(){return g},isBailoutToCSRError:function(){return h}};for(var e in d)Object.defineProperty(c,e,{enumerable:!0,get:d[e]});let f="BAILOUT_TO_CLIENT_SIDE_RENDERING";class g extends Error{constructor(a){super(`Bail out to client-side rendering: ${a}`),this.reason=a,this.digest=f}}function h(a){return"object"==typeof a&&null!==a&&"digest"in a&&a.digest===f}},77747,(a,b,c)=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0}),Object.defineProperty(c,"isNextRouterError",{enumerable:!0,get:function(){return f}});let d=a.r(8535),e=a.r(11026);function f(a){return(0,e.isRedirectError)(a)||(0,d.isHTTPAccessFallbackError)(a)}("function"==typeof c.default||"object"==typeof c.default&&null!==c.default)&&void 0===c.default.__esModule&&(Object.defineProperty(c.default,"__esModule",{value:!0}),Object.assign(c.default,c),b.exports=c.default)},3326,(a,b,c)=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0});var d={DynamicServerError:function(){return g},isDynamicServerError:function(){return h}};for(var e in d)Object.defineProperty(c,e,{enumerable:!0,get:d[e]});let f="DYNAMIC_SERVER_USAGE";class g extends Error{constructor(a){super(`Dynamic server usage: ${a}`),this.description=a,this.digest=f}}function h(a){return"object"==typeof a&&null!==a&&"digest"in a&&"string"==typeof a.digest&&a.digest===f}("function"==typeof c.default||"object"==typeof c.default&&null!==c.default)&&void 0===c.default.__esModule&&(Object.defineProperty(c.default,"__esModule",{value:!0}),Object.assign(c.default,c),b.exports=c.default)},99392,(a,b,c)=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0});var d={StaticGenBailoutError:function(){return g},isStaticGenBailoutError:function(){return h}};for(var e in d)Object.defineProperty(c,e,{enumerable:!0,get:d[e]});let f="NEXT_STATIC_GEN_BAILOUT";class g extends Error{constructor(...a){super(...a),this.code=f}}function h(a){return"object"==typeof a&&null!==a&&"code"in a&&a.code===f}("function"==typeof c.default||"object"==typeof c.default&&null!==c.default)&&void 0===c.default.__esModule&&(Object.defineProperty(c.default,"__esModule",{value:!0}),Object.assign(c.default,c),b.exports=c.default)},86389,(a,b,c)=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0});var d={METADATA_BOUNDARY_NAME:function(){return f},OUTLET_BOUNDARY_NAME:function(){return h},ROOT_LAYOUT_BOUNDARY_NAME:function(){return i},VIEWPORT_BOUNDARY_NAME:function(){return g}};for(var e in d)Object.defineProperty(c,e,{enumerable:!0,get:d[e]});let f="__next_metadata_boundary__",g="__next_viewport_boundary__",h="__next_outlet_boundary__",i="__next_root_layout_boundary__"},76383,(a,b,c)=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0});var d={atLeastOneTask:function(){return h},scheduleImmediate:function(){return g},scheduleOnNextTick:function(){return f},waitAtLeastOneReactRenderTask:function(){return i}};for(var e in d)Object.defineProperty(c,e,{enumerable:!0,get:d[e]});let f=a=>{Promise.resolve().then(()=>{process.nextTick(a)})},g=a=>{setImmediate(a)};function h(){return new Promise(a=>g(a))}function i(){return new Promise(a=>setImmediate(a))}},21177,(a,b,c)=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0}),Object.defineProperty(c,"INSTANT_VALIDATION_BOUNDARY_NAME",{enumerable:!0,get:function(){return d}});let d="__next_instant_validation_boundary__"},54110,(a,b,c)=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0});var d,e,f,g={DynamicHoleKind:function(){return $},Postpone:function(){return D},PreludeState:function(){return af},abortAndThrowOnSynchronousRequestDataAccess:function(){return C},abortOnSynchronousPlatformIOAccess:function(){return B},accessedDynamicData:function(){return L},annotateDynamicAccess:function(){return Q},consumeDynamicAccess:function(){return M},createDynamicTrackingState:function(){return u},createDynamicValidationState:function(){return v},createHangingInputAbortSignal:function(){return P},createInstantValidationState:function(){return _},createRenderInBrowserAbortSignal:function(){return O},formatDynamicAPIAccesses:function(){return N},getFirstDynamicReason:function(){return w},getNavigationDisallowedDynamicReasons:function(){return aj},getStaticShellDisallowedDynamicReasons:function(){return ai},isDynamicPostpone:function(){return G},isPrerenderInterruptedError:function(){return K},logDisallowedDynamicError:function(){return ag},markCurrentScopeAsDynamic:function(){return x},postponeWithTracking:function(){return E},throwIfDisallowedDynamic:function(){return ah},throwToInterruptStaticGeneration:function(){return y},trackAllowedDynamicAccess:function(){return Z},trackDynamicDataInDynamicRender:function(){return z},trackDynamicHoleInNavigation:function(){return aa},trackDynamicHoleInRuntimeShell:function(){return ac},trackDynamicHoleInStaticShell:function(){return ad},trackThrownErrorInNavigation:function(){return ab},useDynamicRouteParams:function(){return R},useDynamicSearchParams:function(){return S}};for(var h in g)Object.defineProperty(c,h,{enumerable:!0,get:g[h]});let i=(d=a.r(72131))&&d.__esModule?d:{default:d},j=a.r(3326),k=a.r(99392),l=a.r(32319),m=a.r(56704),n=a.r(35710),o=a.r(86389),p=a.r(76383),q=a.r(41997),r=a.r(88644),s=a.r(21177),t="function"==typeof i.default.unstable_postpone;function u(a){return{isDebugDynamicAccesses:a,dynamicAccesses:[],syncDynamicErrorWithStack:null}}function v(){return{hasSuspenseAboveBody:!1,hasDynamicMetadata:!1,dynamicMetadata:null,hasDynamicViewport:!1,hasAllowedDynamic:!1,dynamicErrors:[]}}function w(a){var b;return null==(b=a.dynamicAccesses[0])?void 0:b.expression}function x(a,b,c){if(b)switch(b.type){case"cache":case"unstable-cache":case"private-cache":return}if(!a.forceDynamic&&!a.forceStatic){if(a.dynamicShouldError)throw Object.defineProperty(new k.StaticGenBailoutError(`Route ${a.route} with \`dynamic = "error"\` couldn't be rendered statically because it used \`${c}\`. See more info here: https://nextjs.org/docs/app/building-your-application/rendering/static-and-dynamic#dynamic-rendering`),"__NEXT_ERROR_CODE",{value:"E553",enumerable:!1,configurable:!0});if(b)switch(b.type){case"prerender-ppr":return E(a.route,c,b.dynamicTracking);case"prerender-legacy":b.revalidate=0;let d=Object.defineProperty(new j.DynamicServerError(`Route ${a.route} couldn't be rendered statically because it used ${c}. See more info here: https://nextjs.org/docs/messages/dynamic-server-error`),"__NEXT_ERROR_CODE",{value:"E550",enumerable:!1,configurable:!0});throw a.dynamicUsageDescription=c,a.dynamicUsageStack=d.stack,d}}}function y(a,b,c){let d=Object.defineProperty(new j.DynamicServerError(`Route ${b.route} couldn't be rendered statically because it used \`${a}\`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error`),"__NEXT_ERROR_CODE",{value:"E558",enumerable:!1,configurable:!0});throw c.revalidate=0,b.dynamicUsageDescription=a,b.dynamicUsageStack=d.stack,d}function z(a){switch(a.type){case"cache":case"unstable-cache":case"private-cache":return}}function A(a,b,c){let d=J(`Route ${a} needs to bail out of prerendering at this point because it used ${b}.`);c.controller.abort(d);let e=c.dynamicTracking;e&&e.dynamicAccesses.push({stack:e.isDebugDynamicAccesses?Error().stack:void 0,expression:b})}function B(a,b,c,d){let e=d.dynamicTracking;A(a,b,d),e&&null===e.syncDynamicErrorWithStack&&(e.syncDynamicErrorWithStack=c)}function C(a,b,c,d){if(!1===d.controller.signal.aborted){A(a,b,d);let e=d.dynamicTracking;e&&null===e.syncDynamicErrorWithStack&&(e.syncDynamicErrorWithStack=c)}throw J(`Route ${a} needs to bail out of prerendering at this point because it used ${b}.`)}function D({reason:a,route:b}){let c=l.workUnitAsyncStorage.getStore();E(b,a,c&&"prerender-ppr"===c.type?c.dynamicTracking:null)}function E(a,b,c){(function(){if(!t)throw Object.defineProperty(Error("Invariant: React.unstable_postpone is not defined. This suggests the wrong version of React was loaded. This is a bug in Next.js"),"__NEXT_ERROR_CODE",{value:"E224",enumerable:!1,configurable:!0})})(),c&&c.dynamicAccesses.push({stack:c.isDebugDynamicAccesses?Error().stack:void 0,expression:b}),i.default.unstable_postpone(F(a,b))}function F(a,b){return`Route ${a} needs to bail out of prerendering at this point because it used ${b}. React throws this special object to indicate where. It should not be caught by your own try/catch. Learn more: https://nextjs.org/docs/messages/ppr-caught-error`}function G(a){return"object"==typeof a&&null!==a&&"string"==typeof a.message&&H(a.message)}function H(a){return a.includes("needs to bail out of prerendering at this point because it used")&&a.includes("Learn more: https://nextjs.org/docs/messages/ppr-caught-error")}if(!1===H(F("%%%","^^^")))throw Object.defineProperty(Error("Invariant: isDynamicPostpone misidentified a postpone reason. This is a bug in Next.js"),"__NEXT_ERROR_CODE",{value:"E296",enumerable:!1,configurable:!0});let I="NEXT_PRERENDER_INTERRUPTED";function J(a){let b=Object.defineProperty(Error(a),"__NEXT_ERROR_CODE",{value:"E394",enumerable:!1,configurable:!0});return b.digest=I,b}function K(a){return"object"==typeof a&&null!==a&&a.digest===I&&"name"in a&&"message"in a&&a instanceof Error}function L(a){return a.length>0}function M(a,b){return a.dynamicAccesses.push(...b.dynamicAccesses),a.dynamicAccesses}function N(a){return a.filter(a=>"string"==typeof a.stack&&a.stack.length>0).map(({expression:a,stack:b})=>(b=b.split("\n").slice(4).filter(a=>!(a.includes("node_modules/next/")||a.includes(" (<anonymous>)")||a.includes(" (node:"))).join("\n"),`Dynamic API Usage Debug - ${a}:
|
|
2
|
-
${b}`))}function O(){let a=new AbortController;return a.abort(Object.defineProperty(new q.BailoutToCSRError("Render in Browser"),"__NEXT_ERROR_CODE",{value:"E721",enumerable:!1,configurable:!0})),a.signal}function P(a){switch(a.type){case"prerender":case"prerender-runtime":let b=new AbortController;if(a.cacheSignal)a.cacheSignal.inputReady().then(()=>{b.abort()});else if("prerender-runtime"===a.type&&a.stagedRendering){let{stagedRendering:c}=a;c.waitForStage((0,n.getRuntimeStage)(c)).then(()=>(0,p.scheduleOnNextTick)(()=>b.abort()))}else(0,p.scheduleOnNextTick)(()=>b.abort());return b.signal;case"prerender-client":case"validation-client":case"prerender-ppr":case"prerender-legacy":case"request":case"cache":case"private-cache":case"unstable-cache":case"generate-static-params":return}}function Q(a,b){let c=b.dynamicTracking;c&&c.dynamicAccesses.push({stack:c.isDebugDynamicAccesses?Error().stack:void 0,expression:a})}function R(a){let b=m.workAsyncStorage.getStore(),c=l.workUnitAsyncStorage.getStore();if(b&&c)switch(c.type){case"prerender-client":case"prerender":{let d=c.fallbackRouteParams;d&&d.size>0&&i.default.use((0,n.makeHangingPromise)(c.renderSignal,b.route,a));break}case"prerender-ppr":{let d=c.fallbackRouteParams;if(d&&d.size>0)return E(b.route,a,c.dynamicTracking);break}case"validation-client":case"prerender-legacy":case"request":case"unstable-cache":break;case"prerender-runtime":throw Object.defineProperty(new r.InvariantError(`\`${a}\` was called during a runtime prerender. Next.js should be preventing ${a} from being included in server components statically, but did not in this case.`),"__NEXT_ERROR_CODE",{value:"E771",enumerable:!1,configurable:!0});case"cache":case"private-cache":throw Object.defineProperty(new r.InvariantError(`\`${a}\` was called inside a cache scope. Next.js should be preventing ${a} from being included in server components statically, but did not in this case.`),"__NEXT_ERROR_CODE",{value:"E745",enumerable:!1,configurable:!0});case"generate-static-params":throw Object.defineProperty(new r.InvariantError(`\`${a}\` was called in \`generateStaticParams\`. Next.js should be preventing ${a} from being included in server component files statically, but did not in this case.`),"__NEXT_ERROR_CODE",{value:"E1130",enumerable:!1,configurable:!0})}}function S(a){let b=m.workAsyncStorage.getStore(),c=l.workUnitAsyncStorage.getStore();if(b)switch(!c&&(0,l.throwForMissingRequestStore)(a),c.type){case"validation-client":case"request":return;case"prerender-client":i.default.use((0,n.makeHangingPromise)(c.renderSignal,b.route,a));break;case"prerender-legacy":case"prerender-ppr":if(b.forceStatic)return;throw Object.defineProperty(new q.BailoutToCSRError(a),"__NEXT_ERROR_CODE",{value:"E394",enumerable:!1,configurable:!0});case"prerender":case"prerender-runtime":throw Object.defineProperty(new r.InvariantError(`\`${a}\` was called from a Server Component. Next.js should be preventing ${a} from being included in server components statically, but did not in this case.`),"__NEXT_ERROR_CODE",{value:"E795",enumerable:!1,configurable:!0});case"cache":case"unstable-cache":case"private-cache":throw Object.defineProperty(new r.InvariantError(`\`${a}\` was called inside a cache scope. Next.js should be preventing ${a} from being included in server components statically, but did not in this case.`),"__NEXT_ERROR_CODE",{value:"E745",enumerable:!1,configurable:!0});case"generate-static-params":throw Object.defineProperty(new r.InvariantError(`\`${a}\` was called in \`generateStaticParams\`. Next.js should be preventing ${a} from being included in server component files statically, but did not in this case.`),"__NEXT_ERROR_CODE",{value:"E1130",enumerable:!1,configurable:!0})}}let T=/\n\s+at Suspense \(<anonymous>\)/,U=RegExp(`\\n\\s+at Suspense \\(<anonymous>\\)(?:(?!\\n\\s+at (?:body|div|main|section|article|aside|header|footer|nav|form|p|span|h1|h2|h3|h4|h5|h6) \\(<anonymous>\\))[\\s\\S])*?\\n\\s+at ${o.ROOT_LAYOUT_BOUNDARY_NAME} \\([^\\n]*\\)`),V=RegExp(`\\n\\s+at ${o.METADATA_BOUNDARY_NAME}[\\n\\s]`),W=RegExp(`\\n\\s+at ${o.VIEWPORT_BOUNDARY_NAME}[\\n\\s]`),X=RegExp(`\\n\\s+at ${o.OUTLET_BOUNDARY_NAME}[\\n\\s]`),Y=RegExp(`\\n\\s+at ${s.INSTANT_VALIDATION_BOUNDARY_NAME}[\\n\\s]`);function Z(a,b,c,d){if(!X.test(b)){if(V.test(b)){c.hasDynamicMetadata=!0;return}if(W.test(b)){c.hasDynamicViewport=!0;return}if(U.test(b)){c.hasAllowedDynamic=!0,c.hasSuspenseAboveBody=!0;return}else if(T.test(b)){c.hasAllowedDynamic=!0;return}else{if(d.syncDynamicErrorWithStack)return void c.dynamicErrors.push(d.syncDynamicErrorWithStack);let e=ae(Object.defineProperty(Error(`Route "${a.route}": Uncached data was accessed outside of <Suspense>. This delays the entire page from rendering, resulting in a slow user experience. Learn more: https://nextjs.org/docs/messages/blocking-route`),"__NEXT_ERROR_CODE",{value:"E1079",enumerable:!1,configurable:!0}),b,null);return void c.dynamicErrors.push(e)}}}var $=((e={})[e.Runtime=1]="Runtime",e[e.Dynamic=2]="Dynamic",e);function _(a){return{hasDynamicMetadata:!1,hasAllowedClientDynamicAboveBoundary:!1,dynamicMetadata:null,hasDynamicViewport:!1,hasAllowedDynamic:!1,dynamicErrors:[],validationPreventingErrors:[],thrownErrorsOutsideBoundary:[],createInstantStack:a}}function aa(a,b,c,d,e,f){if(X.test(b))return;if(V.test(b)){let d=ae(Object.defineProperty(Error(`Route "${a.route}": ${1===e?"Runtime data such as `cookies()`, `headers()`, `params`, or `searchParams` was accessed inside `generateMetadata` or you have file-based metadata such as icons that depend on dynamic params segments.":"Uncached data or `connection()` was accessed inside `generateMetadata`."} Except for this instance, the page would have been entirely prerenderable which may have been the intended behavior. See more info here: https://nextjs.org/docs/messages/next-prerender-dynamic-metadata`),"__NEXT_ERROR_CODE",{value:"E1076",enumerable:!1,configurable:!0}),b,c.createInstantStack);c.dynamicMetadata=d;return}if(W.test(b)){let d=ae(Object.defineProperty(Error(`Route "${a.route}": ${1===e?"Runtime data such as `cookies()`, `headers()`, `params`, or `searchParams` was accessed inside `generateViewport`.":"Uncached data or `connection()` was accessed inside `generateViewport`."} This delays the entire page from rendering, resulting in a slow user experience. Learn more: https://nextjs.org/docs/messages/next-prerender-dynamic-viewport`),"__NEXT_ERROR_CODE",{value:"E1086",enumerable:!1,configurable:!0}),b,c.createInstantStack);c.dynamicErrors.push(d);return}let g=Y.exec(b);if(g){let a=T.exec(b);if(a&&a.index<g.index){c.hasAllowedDynamic=!0;return}}else if(f.expectedIds.size===f.renderedIds.size){c.hasAllowedClientDynamicAboveBoundary=!0,c.hasAllowedDynamic=!0;return}else{let d=ae(Object.defineProperty(Error(`Route "${a.route}": Could not validate \`unstable_instant\` because a Client Component in a parent segment prevented the page from rendering.`),"__NEXT_ERROR_CODE",{value:"E1082",enumerable:!1,configurable:!0}),b,c.createInstantStack);c.validationPreventingErrors.push(d);return}if(d.syncDynamicErrorWithStack){let a=d.syncDynamicErrorWithStack;null!==c.createInstantStack&&void 0===a.cause&&(a.cause=c.createInstantStack()),c.dynamicErrors.push(a);return}let h=ae(Object.defineProperty(Error(`Route "${a.route}": ${1===e?"Runtime data such as `cookies()`, `headers()`, `params`, or `searchParams` was accessed outside of `<Suspense>`.":"Uncached data or `connection()` was accessed outside of `<Suspense>`."} This delays the entire page from rendering, resulting in a slow user experience. Learn more: https://nextjs.org/docs/messages/blocking-route`),"__NEXT_ERROR_CODE",{value:"E1078",enumerable:!1,configurable:!0}),b,c.createInstantStack);c.dynamicErrors.push(h)}function ab(a,b,c,d){let e=Y.exec(d);if(e){let f=T.exec(d);if(f&&f.index<e.index)return;let g=ae(Object.defineProperty(Error(`Route "${a.route}": Could not validate \`unstable_instant\` because an error prevented the target segment from rendering.`,{cause:c}),"__NEXT_ERROR_CODE",{value:"E1112",enumerable:!1,configurable:!0}),d,null);b.validationPreventingErrors.push(g)}else{let a=ae(Object.defineProperty(Error("An error occurred while attempting to validate instant UI. This error may be preventing the validation from completing.",{cause:c}),"__NEXT_ERROR_CODE",{value:"E1118",enumerable:!1,configurable:!0}),d,null);b.thrownErrorsOutsideBoundary.push(a)}}function ac(a,b,c,d){if(X.test(b))return;if(V.test(b)){c.dynamicMetadata=ae(Object.defineProperty(Error(`Route "${a.route}": Uncached data or \`connection()\` was accessed inside \`generateMetadata\`. Except for this instance, the page would have been entirely prerenderable which may have been the intended behavior. See more info here: https://nextjs.org/docs/messages/next-prerender-dynamic-metadata`),"__NEXT_ERROR_CODE",{value:"E1080",enumerable:!1,configurable:!0}),b,null);return}if(W.test(b)){let d=ae(Object.defineProperty(Error(`Route "${a.route}": Uncached data or \`connection()\` was accessed inside \`generateViewport\`. This delays the entire page from rendering, resulting in a slow user experience. Learn more: https://nextjs.org/docs/messages/next-prerender-dynamic-viewport`),"__NEXT_ERROR_CODE",{value:"E1077",enumerable:!1,configurable:!0}),b,null);c.dynamicErrors.push(d);return}if(U.test(b)){c.hasAllowedDynamic=!0,c.hasSuspenseAboveBody=!0;return}if(T.test(b)){c.hasAllowedDynamic=!0;return}else if(d.syncDynamicErrorWithStack)return void c.dynamicErrors.push(d.syncDynamicErrorWithStack);let e=ae(Object.defineProperty(Error(`Route "${a.route}": Uncached data or \`connection()\` was accessed outside of \`<Suspense>\`. This delays the entire page from rendering, resulting in a slow user experience. Learn more: https://nextjs.org/docs/messages/blocking-route`),"__NEXT_ERROR_CODE",{value:"E1084",enumerable:!1,configurable:!0}),b,null);c.dynamicErrors.push(e)}function ad(a,b,c,d){if(!X.test(b)){if(V.test(b)){c.dynamicMetadata=ae(Object.defineProperty(Error(`Route "${a.route}": Runtime data such as \`cookies()\`, \`headers()\`, \`params\`, or \`searchParams\` was accessed inside \`generateMetadata\` or you have file-based metadata such as icons that depend on dynamic params segments. Except for this instance, the page would have been entirely prerenderable which may have been the intended behavior. See more info here: https://nextjs.org/docs/messages/next-prerender-dynamic-metadata`),"__NEXT_ERROR_CODE",{value:"E1085",enumerable:!1,configurable:!0}),b,null);return}if(W.test(b)){let d=ae(Object.defineProperty(Error(`Route "${a.route}": Runtime data such as \`cookies()\`, \`headers()\`, \`params\`, or \`searchParams\` was accessed inside \`generateViewport\`. This delays the entire page from rendering, resulting in a slow user experience. Learn more: https://nextjs.org/docs/messages/next-prerender-dynamic-viewport`),"__NEXT_ERROR_CODE",{value:"E1081",enumerable:!1,configurable:!0}),b,null);c.dynamicErrors.push(d);return}if(U.test(b)){c.hasAllowedDynamic=!0,c.hasSuspenseAboveBody=!0;return}else if(T.test(b)){c.hasAllowedDynamic=!0;return}else{if(d.syncDynamicErrorWithStack)return void c.dynamicErrors.push(d.syncDynamicErrorWithStack);let e=ae(Object.defineProperty(Error(`Route "${a.route}": Runtime data such as \`cookies()\`, \`headers()\`, \`params\`, or \`searchParams\` was accessed outside of \`<Suspense>\`. This delays the entire page from rendering, resulting in a slow user experience. Learn more: https://nextjs.org/docs/messages/blocking-route`),"__NEXT_ERROR_CODE",{value:"E1083",enumerable:!1,configurable:!0}),b,null);return void c.dynamicErrors.push(e)}}}function ae(a,b,c){return null!==c&&(a.cause=c()),a.stack=a.name+": "+a.message+b,a}var af=((f={})[f.Full=0]="Full",f[f.Empty=1]="Empty",f[f.Errored=2]="Errored",f);function ag(a,b){console.error(b),console.error(`To get a more detailed stack trace and pinpoint the issue, try one of the following:
|
|
3
|
-
- Start the app in development mode by running \`next dev\`, then open "${a.route}" in your browser to investigate the error.
|
|
4
|
-
- Rerun the production build with \`next build --debug-prerender\` to generate better stack traces.`)}function ah(a,b,c,d){if(d.syncDynamicErrorWithStack)throw ag(a,d.syncDynamicErrorWithStack),new k.StaticGenBailoutError;if(0!==b){if(c.hasSuspenseAboveBody)return;let d=c.dynamicErrors;if(d.length>0){for(let b=0;b<d.length;b++)ag(a,d[b]);throw new k.StaticGenBailoutError}if(c.hasDynamicViewport)throw console.error(`Route "${a.route}" has a \`generateViewport\` that depends on Request data (\`cookies()\`, etc...) or uncached external data (\`fetch(...)\`, etc...) without explicitly allowing fully dynamic rendering. See more info here: https://nextjs.org/docs/messages/next-prerender-dynamic-viewport`),new k.StaticGenBailoutError;if(1===b)throw console.error(`Route "${a.route}" did not produce a static shell and Next.js was unable to determine a reason. This is a bug in Next.js.`),new k.StaticGenBailoutError}else if(!1===c.hasAllowedDynamic&&c.hasDynamicMetadata)throw console.error(`Route "${a.route}" has a \`generateMetadata\` that depends on Request data (\`cookies()\`, etc...) or uncached external data (\`fetch(...)\`, etc...) when the rest of the route does not. See more info here: https://nextjs.org/docs/messages/next-prerender-dynamic-metadata`),new k.StaticGenBailoutError}function ai(a,b,c,d){if(d||c.hasSuspenseAboveBody)return[];if(0!==b){let d=c.dynamicErrors;if(d.length>0)return d;if(1===b)return[Object.defineProperty(new r.InvariantError(`Route "${a.route}" did not produce a static shell and Next.js was unable to determine a reason.`),"__NEXT_ERROR_CODE",{value:"E936",enumerable:!1,configurable:!0})]}else if(!1===c.hasAllowedDynamic&&0===c.dynamicErrors.length&&c.dynamicMetadata)return[c.dynamicMetadata];return[]}function aj(a,b,c,d,e){if(d){let{missingSampleErrors:a}=d;if(a.length>0)return a}let{validationPreventingErrors:f}=c;if(f.length>0)return f;if(e.renderedIds.size<e.expectedIds.size){let{thrownErrorsOutsideBoundary:b,createInstantStack:d}=c;if(0===b.length){let b=`Route "${a.route}": Could not validate \`unstable_instant\` because the target segment was prevented from rendering for an unknown reason.`,c=null!==d?d():Error();return c.name="Error",c.message=b,[c]}if(1===b.length){let c=`Route "${a.route}": Could not validate \`unstable_instant\` because the target segment was prevented from rendering, likely due to the following error.`,e=null!==d?d():Error();return e.name="Error",e.message=c,[e,b[0]]}{let c=`Route "${a.route}": Could not validate \`unstable_instant\` because the target segment was prevented from rendering, likely due to one of the following errors.`,e=null!==d?d():Error();return e.name="Error",e.message=c,[e,...b]}}if(0!==b){let d=c.dynamicErrors;if(d.length>0)return d;if(1===b)return c.hasAllowedClientDynamicAboveBoundary?[]:[Object.defineProperty(new r.InvariantError(`Route "${a.route}" failed to render during instant validation and Next.js was unable to determine a reason.`),"__NEXT_ERROR_CODE",{value:"E1055",enumerable:!1,configurable:!0})]}else{let a=c.dynamicErrors;if(a.length>0)return a;if(!1===c.hasAllowedDynamic&&c.dynamicMetadata)return[c.dynamicMetadata]}return[]}},44753,(a,b,c)=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0}),Object.defineProperty(c,"unstable_rethrow",{enumerable:!0,get:function(){return function a(b){if((0,g.isNextRouterError)(b)||(0,f.isBailoutToCSRError)(b)||(0,i.isDynamicServerError)(b)||(0,h.isDynamicPostpone)(b)||(0,e.isPostpone)(b)||(0,d.isHangingPromiseRejectionError)(b)||(0,h.isPrerenderInterruptedError)(b))throw b;b instanceof Error&&"cause"in b&&a(b.cause)}}});let d=a.r(35710),e=a.r(31101),f=a.r(41997),g=a.r(77747),h=a.r(54110),i=a.r(3326);("function"==typeof c.default||"object"==typeof c.default&&null!==c.default)&&void 0===c.default.__esModule&&(Object.defineProperty(c.default,"__esModule",{value:!0}),Object.assign(c.default,c),b.exports=c.default)},47083,(a,b,c)=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0}),Object.defineProperty(c,"unstable_rethrow",{enumerable:!0,get:function(){return d}});let d=a.r(44753).unstable_rethrow;("function"==typeof c.default||"object"==typeof c.default&&null!==c.default)&&void 0===c.default.__esModule&&(Object.defineProperty(c.default,"__esModule",{value:!0}),Object.assign(c.default,c),b.exports=c.default)},21066,(a,b,c)=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0});var d={ReadonlyURLSearchParams:function(){return f.ReadonlyURLSearchParams},RedirectType:function(){return m},forbidden:function(){return i.forbidden},notFound:function(){return h.notFound},permanentRedirect:function(){return g.permanentRedirect},redirect:function(){return g.redirect},unauthorized:function(){return j.unauthorized},unstable_isUnrecognizedActionError:function(){return l},unstable_rethrow:function(){return k.unstable_rethrow}};for(var e in d)Object.defineProperty(c,e,{enumerable:!0,get:d[e]});let f=a.r(75718),g=a.r(48685),h=a.r(28102),i=a.r(64177),j=a.r(88213),k=a.r(47083);function l(){throw Object.defineProperty(Error("`unstable_isUnrecognizedActionError` can only be used on the client."),"__NEXT_ERROR_CODE",{value:"E776",enumerable:!1,configurable:!0})}let m={push:"push",replace:"replace"};("function"==typeof c.default||"object"==typeof c.default&&null!==c.default)&&void 0===c.default.__esModule&&(Object.defineProperty(c.default,"__esModule",{value:!0}),Object.assign(c.default,c),b.exports=c.default)},74137,(a,b,c)=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0});var d={ReadonlyURLSearchParams:function(){return h.ReadonlyURLSearchParams},RedirectType:function(){return l.RedirectType},ServerInsertedHTMLContext:function(){return j.ServerInsertedHTMLContext},forbidden:function(){return l.forbidden},notFound:function(){return l.notFound},permanentRedirect:function(){return l.permanentRedirect},redirect:function(){return l.redirect},unauthorized:function(){return l.unauthorized},unstable_isUnrecognizedActionError:function(){return k.unstable_isUnrecognizedActionError},unstable_rethrow:function(){return l.unstable_rethrow},useParams:function(){return u},usePathname:function(){return s},useRouter:function(){return t},useSearchParams:function(){return r},useSelectedLayoutSegment:function(){return w},useSelectedLayoutSegments:function(){return v},useServerInsertedHTML:function(){return j.useServerInsertedHTML}};for(var e in d)Object.defineProperty(c,e,{enumerable:!0,get:d[e]});let f=a.r(46058)._(a.r(72131)),g=a.r(9270),h=a.r(36313),i=a.r(39118),j=a.r(79861),k=a.r(57997),l=a.r(21066),m=a.r(54110).useDynamicRouteParams,n=a.r(54110).useDynamicSearchParams,{instrumentParamsForClientValidation:o,instrumentSearchParamsForClientValidation:p,expectCompleteParamsInClientValidation:q}={};function r(){n?.("useSearchParams()");let a=(0,f.useContext)(h.SearchParamsContext);return(0,f.useMemo)(()=>a?new h.ReadonlyURLSearchParams(a):null,[a])}function s(){return m?.("usePathname()"),(0,f.useContext)(h.PathnameContext)}function t(){let a=(0,f.useContext)(g.AppRouterContext);if(null===a)throw Object.defineProperty(Error("invariant expected app router to be mounted"),"__NEXT_ERROR_CODE",{value:"E238",enumerable:!1,configurable:!0});return a}function u(){return m?.("useParams()"),(0,f.useContext)(h.PathParamsContext)}function v(a="children"){m?.("useSelectedLayoutSegments()");let b=(0,f.useContext)(g.LayoutRouterContext);return b?(0,i.getSelectedLayoutSegmentPath)(b.parentTree,a):null}function w(a="children"){m?.("useSelectedLayoutSegment()"),(0,f.useContext)(h.NavigationPromisesContext);let b=v(a);return(0,i.computeSelectedLayoutSegment)(b,a)}("function"==typeof c.default||"object"==typeof c.default&&null!==c.default)&&void 0===c.default.__esModule&&(Object.defineProperty(c.default,"__esModule",{value:!0}),Object.assign(c.default,c),b.exports=c.default)},50944,(a,b,c)=>{b.exports=a.r(74137)},33441,34157,a=>{"use strict";let b=(0,a.i(60137).default)("check",[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]]);a.s(["default",0,b],34157),a.s(["Check",0,b],33441)},52495,a=>{"use strict";let b=(0,a.i(60137).default)("external-link",[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"M10 14 21 3",key:"gplh6r"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",key:"a6xqqp"}]]);a.s(["ExternalLink",0,b],52495)},67060,96221,a=>{"use strict";var b=a.i(87924),c=a.i(4650);a.s(["Loader2",()=>c.default],96221);var c=c;a.s(["LoadingSpinner",0,function({size:a="md",message:d}){return(0,b.jsxs)("div",{className:"flex flex-col items-center justify-center gap-3",children:[(0,b.jsx)(c.default,{className:`${{sm:"w-4 h-4",md:"w-8 h-8",lg:"w-12 h-12"}[a]} text-primary animate-spin`}),d&&(0,b.jsx)("p",{className:"text-sm text-muted-foreground",children:d})]})}],67060)},28503,67669,52034,a=>{"use strict";var b,c=a.i(87924),d=a.i(72131);a.s([],7774),a.i(7774);var e=a.i(71812),f=a.i(21376),g=a.i(37388);let h=((b={}).disabled="data-disabled",b.valid="data-valid",b.invalid="data-invalid",b.touched="data-touched",b.dirty="data-dirty",b.filled="data-filled",b.focused="data-focused",b),i={badInput:!1,customError:!1,patternMismatch:!1,rangeOverflow:!1,rangeUnderflow:!1,stepMismatch:!1,tooLong:!1,tooShort:!1,typeMismatch:!1,valid:null,valueMissing:!1},j={valid:null,touched:!1,dirty:!1,filled:!1,focused:!1},k={disabled:!1,...j},l={valid:a=>null===a?null:a?{[h.valid]:""}:{[h.invalid]:""}},m=d.createContext({invalid:void 0,name:void 0,validityData:{state:i,errors:[],error:"",value:"",initialValue:null},setValidityData:g.NOOP,disabled:void 0,touched:j.touched,setTouched:g.NOOP,dirty:j.dirty,setDirty:g.NOOP,filled:j.filled,setFilled:g.NOOP,focused:j.focused,setFocused:g.NOOP,validate:()=>null,validationMode:"onSubmit",validationDebounceTime:0,shouldValidateOnChange:()=>!1,state:k,markedDirtyRef:{current:!1},validation:{getValidationProps:(a=g.EMPTY_OBJECT)=>a,getInputValidationProps:(a=g.EMPTY_OBJECT)=>a,inputRef:{current:null},commit:async()=>{}}});function n(a=!0){let b=d.useContext(m);if(b.setValidityData===g.NOOP&&!a)throw Error((0,f.default)(28));return b}let o=d.createContext({legendId:void 0,setLegendId:()=>{},disabled:void 0}),p=d.createContext({formRef:{current:{fields:new Map}},errors:{},clearErrors:g.NOOP,validationMode:"onSubmit",submitAttemptedRef:{current:!1}});function q(){return d.useContext(p)}var r=a.i(95337),s=a.i(84991),t=a.i(98134);let u=d.createContext({controlId:void 0,registerControlId:g.NOOP,labelId:void 0,setLabelId:g.NOOP,messageIds:[],setMessageIds:g.NOOP,getDescriptionProps:a=>a});function v(){return d.useContext(u)}let w=function(a){let b=(0,t.useBaseUiId)(),f=void 0===a.controlId?b:a.controlId,[g,h]=d.useState(f),[i,j]=d.useState(a.labelId),[k,l]=d.useState([]),m=(0,r.useRefWithInit)(()=>new Map),{messageIds:n}=v(),o=(0,e.useStableCallback)((a,b)=>{let c=m.current;void 0===b?c.delete(a):(c.set(a,b),h(a=>{let b;if(0!==c.size){for(let d of c.values()){if(void 0!==a&&d===a)return a;void 0===b&&(b=d)}return b}}))}),p=d.useCallback(a=>(0,s.mergeProps)({"aria-describedby":n.concat(k).join(" ")||void 0},a),[n,k]),q=d.useMemo(()=>({controlId:g,registerControlId:o,labelId:i,setLabelId:j,messageIds:k,setMessageIds:l,getDescriptionProps:p}),[g,o,i,j,k,l,p]);return(0,c.jsx)(u.Provider,{value:q,children:a.children})};var x=a.i(2840),y=a.i(76093);function z(a,b){return{...a,state:{...a.state,valid:!b&&a.state.valid}}}let A=Object.keys(i),B=d.forwardRef(function(a,b){let{errors:h,validationMode:j,submitAttemptedRef:k}=q(),{render:n,className:p,validate:r,validationDebounceTime:t=0,validationMode:u=j,name:w,disabled:B=!1,invalid:C,dirty:D,touched:E,actionsRef:F,...G}=a,{disabled:H}=function(a=!1){let b=d.useContext(o);if(!b&&!a)throw Error((0,f.default)(86));return b}(),I=(0,e.useStableCallback)(r||(()=>null)),J=H||B,[K,L]=d.useState(!1),[M,N]=d.useState(!1),[O,P]=d.useState(!1),[Q,R]=d.useState(!1),S=D??M,T=E??K,U=d.useRef(!1),V=(0,e.useStableCallback)(a=>{void 0===D&&(a&&(U.current=!0),N(a))}),W=(0,e.useStableCallback)(a=>{void 0===E&&L(a)}),X=(0,e.useStableCallback)(()=>"onChange"===u||"onSubmit"===u&&k.current),Y=!!w&&Object.hasOwn(h,w)&&void 0!==h[w],Z=!0===C||Y,[$,_]=d.useState({state:i,error:"",errors:[],value:null,initialValue:null}),aa=!Z&&$.state.valid,ab=d.useMemo(()=>({disabled:J,touched:T,dirty:S,valid:aa,filled:O,focused:Q}),[J,T,S,aa,O,Q]),ac=function(a){let{formRef:b,clearErrors:c}=q(),{setValidityData:f,validate:h,validityData:j,validationDebounceTime:k,invalid:l,markedDirtyRef:m,state:n,name:o,shouldValidateOnChange:p}=a,{controlId:r,getDescriptionProps:t}=v(),u=(0,y.useTimeout)(),w=d.useRef(null),x=(0,e.useStableCallback)(async(a,c=!1)=>{let d,e=w.current;if(!e)return;if(c){if(!1!==n.valid)return;let c=e.validity;if(!c.valueMissing){let c={value:a,state:{...i,valid:!0},error:"",errors:[],initialValue:j.initialValue};if(e.setCustomValidity(""),r){let a=b.current.fields.get(r);a&&b.current.fields.set(r,{...a,...z(c,!1)})}f(c);return}let d=A.reduce((a,b)=>(a[b]=c[b],a),{});if(!d.valid&&!function(a){if(!a||a.valid||!a.valueMissing)return!1;let b=!1;for(let c of A)"valid"!==c&&("valueMissing"===c&&(b=a[c]),a[c]&&(b=!1));return b}(d))return}u.clear();let g=null,k=[],o=function(a){let b=A.reduce((b,c)=>(b[c]=a.validity[c],b),{}),c=!1;for(let a of A)if("valid"!==a){if("valueMissing"===a&&b[a])c=!0;else if(b[a])return b}return c&&!m.current&&(b.valid=!0,b.valueMissing=!1),b}(e),q=p();if(e.validationMessage&&!q)d=e.validationMessage,k=[e.validationMessage];else{let c=h(a,Array.from(b.current.fields.values()).reduce((a,b)=>(b.name&&(a[b.name]=b.getValue()),a),{}));null!==(g="object"==typeof c&&null!==c&&"then"in c?await c:c)?(o.valid=!1,o.customError=!0,Array.isArray(g)?(k=g,e.setCustomValidity(g.join("\n"))):g&&(k=[g],e.setCustomValidity(g))):q&&(e.setCustomValidity(""),o.customError=!1,e.validationMessage?(d=e.validationMessage,k=[e.validationMessage]):e.validity.valid&&!o.valid&&(o.valid=!0))}let s={value:a,state:o,error:d??(Array.isArray(g)?g[0]:g??""),errors:k,initialValue:j.initialValue};if(r){let a=b.current.fields.get(r);a&&b.current.fields.set(r,{...a,...z(s,l)})}f(s)}),B=d.useCallback((a={})=>(0,s.mergeProps)(t,!1===n.valid?{"aria-invalid":!0}:g.EMPTY_OBJECT,a),[t,n.valid]),C=d.useCallback((a={})=>(0,s.mergeProps)({onChange(a){if(a.nativeEvent.defaultPrevented)return;if(c(o),!p())return void x(a.currentTarget.value,!0);let b=a.currentTarget;""===b.value?x(b.value):(u.clear(),k?u.start(k,()=>{x(b.value)}):x(b.value))}},B(a)),[B,c,o,u,x,k,p]);return d.useMemo(()=>({getValidationProps:B,getInputValidationProps:C,inputRef:w,commit:x}),[B,C,x])}({setValidityData:_,validate:I,validityData:$,validationDebounceTime:t,invalid:Z,markedDirtyRef:U,state:ab,name:w,shouldValidateOnChange:X}),ad=d.useCallback(()=>{U.current=!0,ac.commit($.value)},[ac,$]);d.useImperativeHandle(F,()=>({validate:ad}),[ad]);let ae=d.useMemo(()=>({invalid:Z,name:w,validityData:$,setValidityData:_,disabled:J,touched:T,setTouched:W,dirty:S,setDirty:V,filled:O,setFilled:P,focused:Q,setFocused:R,validate:I,validationMode:u,validationDebounceTime:t,shouldValidateOnChange:X,state:ab,markedDirtyRef:U,validation:ac}),[Z,w,$,J,T,W,S,V,O,P,Q,R,I,u,t,X,ab,ac]),af=(0,x.useRenderElement)("div",a,{ref:b,state:ab,props:G,stateAttributesMapping:l});return(0,c.jsx)(m.Provider,{value:ae,children:af})}),C=d.forwardRef(function(a,b){return(0,c.jsx)(w,{children:(0,c.jsx)(B,{...a,ref:b})})});var D=a.i(26476),E=a.i(632),F=a.i(6239),G=a.i(17585);function H(a,b){let c=(0,t.useBaseUiId)(a);return(0,G.useIsoLayoutEffect)(()=>(b(c),()=>{b(void 0)}),[c,b]),c}a.s(["useRegisteredLabelId",0,H],67669);let I=d.forwardRef(function(a,b){let{render:c,className:f,id:g,nativeLabel:h=!0,...i}=a,j=n(!1),{labelId:k}=v(),m=d.useRef(null),o=function(a={}){let{id:b,fallbackControlId:c,native:d=!1,setLabelId:f,focusControl:g}=a,{controlId:h,setLabelId:i}=v(),j=H(b,(0,e.useStableCallback)(a=>{i(a),f?.(a)})),k=h??c;function l(a){let b=(0,F.getTarget)(a.nativeEvent);b?.closest("button,input,select,textarea")||(!a.defaultPrevented&&a.detail>1&&a.preventDefault(),d||function(a){if(g)return g(a,k);if(!k)return;let b=(0,E.ownerDocument)(a.currentTarget).getElementById(k);(0,D.isHTMLElement)(b)&&b.focus({focusVisible:!0})}(a))}return d?{id:j,htmlFor:k??void 0,onMouseDown:l}:{id:j,onClick:l,onPointerDown(a){a.preventDefault()}}}({id:k??g,native:h});return(0,x.useRenderElement)("label",a,{ref:[b,m],state:j.state,props:[o,i],stateAttributesMapping:l})});var J=a.i(2471),K=a.i(58418),L=a.i(77717);let M={...l,...K.transitionStatusMapping},N=d.forwardRef(function(a,b){let{render:e,id:f,className:g,match:h,...i}=a,j=(0,t.useBaseUiId)(f),{validityData:k,state:l,name:m}=n(!1),{setMessageIds:o}=v(),{errors:p}=q(),r=m?p[m]:null,s=!1;s=!!r||!0===h||(h?!!k.state[h]:!1===k.state.valid);let{mounted:u,transitionStatus:w,setMounted:y}=(0,L.useTransitionStatus)(s);(0,G.useIsoLayoutEffect)(()=>{if(s&&j)return o(a=>a.concat(j)),()=>{o(a=>a.filter(a=>a!==j))}},[s,j,o]);let z=d.useRef(null),[A,B]=d.useState(null),[C,D]=d.useState(null),E=r||(k.errors.length>1?(0,c.jsx)("ul",{children:k.errors.map(a=>(0,c.jsx)("li",{children:a},a))}):k.error),F=k.error;null!=r?F=Array.isArray(r)?JSON.stringify(r):r:k.errors.length>1&&(F=JSON.stringify(k.errors)),s&&F!==C&&(D(F),B(E)),(0,J.useOpenChangeComplete)({open:s,ref:z,onComplete(){s||y(!1)}});let H={...l,transitionStatus:w},I=(0,x.useRenderElement)("div",a,{ref:[b,z],state:H,props:[{id:j,children:s?E:A},i],stateAttributesMapping:M,enabled:u});return u?I:null}),O=d.forwardRef(function(a,b){let{render:c,id:d,className:e,...f}=a,g=(0,t.useBaseUiId)(d),h=n(!1),{setMessageIds:i}=v();return(0,G.useIsoLayoutEffect)(()=>{if(g)return i(a=>a.concat(g)),()=>{i(a=>a.filter(a=>a!==g))}},[g,i]),(0,x.useRenderElement)("p",a,{ref:b,state:h.state,props:[{id:g},f],stateAttributesMapping:l})});function P({controlled:a,default:b,name:c,state:e="value"}){let{current:f}=d.useRef(void 0!==a),[g,h]=d.useState(b),i=d.useCallback(a=>{f||h(a)},[]);return[f?a:g,i]}a.s(["useControlled",0,P],52034);var Q=a.i(35112),R=a.i(62255),S=a.i(74348);let T=d.forwardRef(function(a,b){let{render:c,className:f,id:h,name:i,value:j,disabled:k=!1,onValueChange:m,defaultValue:o,autoFocus:p=!1,...s}=a,{state:u,name:w,disabled:y,setTouched:A,setDirty:B,validityData:C,setFocused:H,setFilled:I,validationMode:J,validation:K}=n(),L=y||k,M=w??i,N={...u,disabled:L},{labelId:O}=v(),T=function(a={}){let{id:b,implicit:c=!1,controlRef:f}=a,{controlId:h,registerControlId:i}=v(),j=(0,t.useBaseUiId)(b),k=c?h:void 0,l=(0,r.useRefWithInit)(()=>Symbol("labelable-control")),m=d.useRef(!1),n=d.useRef(null!=b),o=(0,e.useStableCallback)(()=>{m.current&&i!==g.NOOP&&(m.current=!1,i(l.current,void 0))});return(0,G.useIsoLayoutEffect)(()=>{let a;if(i!==g.NOOP){if(c){let c=f?.current;a=(0,D.isElement)(c)&&null!=c.closest("label")?b??null:k??j}else if(null!=b)n.current=!0,a=b;else{if(!n.current)return void o();a=j}if(void 0===a)return void o();m.current=!0,i(l.current,a)}},[b,f,k,i,c,j,l,o]),d.useEffect(()=>o,[o]),h??j}({id:h});(0,G.useIsoLayoutEffect)(()=>{let a=null!=j;K.inputRef.current?.value||a&&""!==j?I(!0):a&&""===j&&I(!1)},[K.inputRef,I,j]);let U=d.useRef(null);(0,G.useIsoLayoutEffect)(()=>{p&&U.current===(0,F.activeElement)((0,E.ownerDocument)(U.current))&&H(!0)},[p,H]);let[V]=P({controlled:j,default:o,name:"FieldControl",state:"value"}),W=void 0!==j,X=W?V:void 0;return!function(a){let{enabled:b=!0,value:c,id:d,name:f,controlRef:g,commit:h}=a,{formRef:i}=q(),{invalid:j,markedDirtyRef:k,validityData:l,setValidityData:m}=n(),o=(0,e.useStableCallback)(a.getValue);(0,G.useIsoLayoutEffect)(()=>{if(!b)return;let a=c;void 0===a&&(a=o()),null===l.initialValue&&null!==a&&m(b=>({...b,initialValue:a}))},[b,m,c,l.initialValue,o]),(0,G.useIsoLayoutEffect)(()=>{b&&d&&i.current.fields.set(d,{getValue:o,name:f,controlRef:g,validityData:z(l,j),validate(a=!0){let b=c;void 0===b&&(b=o()),k.current=!0,a?Q.flushSync(()=>h(b)):h(b)}})},[h,g,b,i,o,d,j,k,f,l,c]),(0,G.useIsoLayoutEffect)(()=>{let a=i.current.fields;return()=>{d&&a.delete(d)}},[i,d])}({id:T,name:M,commit:K.commit,value:X,getValue:()=>K.inputRef.current?.value,controlRef:K.inputRef}),(0,x.useRenderElement)("input",a,{ref:[b,U],state:N,props:[{id:T,disabled:L,name:M,ref:K.inputRef,"aria-labelledby":O,autoFocus:p,...W?{value:X}:{defaultValue:o},onChange(a){let b=a.currentTarget.value;m?.(b,(0,R.createChangeEventDetails)(S.REASONS.none,a.nativeEvent)),B(b!==C.initialValue),I(""!==b)},onFocus(){H(!0)},onBlur(a){A(!0),H(!1),"onBlur"===J&&K.commit(a.currentTarget.value)},onKeyDown(a){"INPUT"===a.currentTarget.tagName&&"Enter"===a.key&&(A(!0),K.commit(a.currentTarget.value))}},K.getInputValidationProps(),s],stateAttributesMapping:l})}),U=d.createContext({disabled:!1}),V=d.createContext(void 0),W=d.forwardRef(function(a,b){let{render:e,className:g,disabled:h=!1,...i}=a,{state:j,disabled:k}=n(!1),m=k||h,o=function(a=!0){let b=d.useContext(V);if(void 0===b&&!a)throw Error((0,f.default)(3));return b}(),p=o?.parent.id,q=o?.allValues!==void 0,r=d.useMemo(()=>({disabled:m}),[m]),s=(0,x.useRenderElement)("div",a,{ref:b,state:j,props:i,stateAttributesMapping:l});return(0,c.jsx)(w,{controlId:q?p:void 0,children:(0,c.jsx)(U.Provider,{value:r,children:s})})});a.s(["Control",0,T,"Description",0,O,"Error",0,N,"Item",0,W,"Label",0,I,"Root",0,C,"Validity",0,function(a){let{children:b}=a,{validityData:e,invalid:f}=n(!1),g=d.useMemo(()=>z(e,f),[e,f]),h=!1===g.state.valid,{transitionStatus:i}=(0,L.useTransitionStatus)(h),j=d.useMemo(()=>({...g,validity:g.state,transitionStatus:i}),[g,i]);return(0,c.jsx)(d.Fragment,{children:b(j)})}],12944);var X=a.i(12944),X=X;let Y=d.forwardRef(function(a,b){return(0,c.jsx)(X.Control,{ref:b,...a})});var Z=a.i(760);a.s(["Input",0,function({className:a,type:b,...d}){return(0,c.jsx)(Y,{type:b,"data-slot":"input",className:(0,Z.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",a),...d})}],28503)},97463,a=>{"use strict";var b=a.i(87924),c=a.i(760);a.s(["Textarea",0,function({className:a,...d}){return(0,b.jsx)("textarea",{"data-slot":"textarea",className:(0,c.cn)("flex field-sizing-content min-h-16 w-full resize-none rounded-md border border-input bg-input/20 px-2 py-2 text-sm transition-colors outline-none placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-2 focus-visible:ring-ring/30 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-2 aria-invalid:ring-destructive/20 md:text-xs/relaxed dark:bg-input/30 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40",a),...d})}])},77156,a=>{"use strict";let b=(0,a.i(60137).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"}]]);a.s(["Eye",0,b],77156)},81560,a=>{"use strict";let b=(0,a.i(60137).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"}]]);a.s(["Trash2",0,b],81560)},67453,a=>{"use strict";var b=a.i(67511);a.s(["CheckCircle2",()=>b.default])},65025,a=>{"use strict";var b,c=a.i(87924);a.s([],5993),a.i(5993);var d=a.i(72131),e=a.i(35850),f=a.i(49538);let g=new Map;function h(a,b,c){return null==a?"":(function(a,b){let c=JSON.stringify({locale:a,options:b}),d=g.get(c);if(d)return d;let e=new Intl.NumberFormat(a,b);return g.set(c,e),e})(b,c).format(a)}var i=a.i(2840),j=a.i(21376);let k=d.createContext(void 0);function l(){let a=d.useContext(k);if(void 0===a)throw Error((0,j.default)(51));return a}let m=((b={}).complete="data-complete",b.indeterminate="data-indeterminate",b.progressing="data-progressing",b),n={status:a=>"progressing"===a?{[m.progressing]:""}:"complete"===a?{[m.complete]:""}:"indeterminate"===a?{[m.indeterminate]:""}:null};function o(a,b){return null==b?"indeterminate progress":a||`${b}%`}let p=d.forwardRef(function(a,b){var g;let{format:j,getAriaValueText:l=o,locale:m,max:p=100,min:q=0,value:r,render:s,className:t,children:u,...v}=a,[w,x]=d.useState(),y=(0,e.useValueAsRef)(j),z="indeterminate";Number.isFinite(r)&&(z=r===p?"complete":"progressing");let A=(g=y.current,null==r?"":g?h(r,m,g):h(r/100,m,{style:"percent"})),B=d.useMemo(()=>({status:z}),[z]),C={"aria-labelledby":w,"aria-valuemax":p,"aria-valuemin":q,"aria-valuenow":r??void 0,"aria-valuetext":l(A,r),role:"progressbar",children:(0,c.jsxs)(d.Fragment,{children:[u,(0,c.jsx)("span",{role:"presentation",style:f.visuallyHidden,children:"x"})]})},D=d.useMemo(()=>({formattedValue:A,max:p,min:q,setLabelId:x,state:B,status:z,value:r}),[A,p,q,x,B,z,r]),E=(0,i.useRenderElement)("div",a,{state:B,ref:b,props:[C,v],stateAttributesMapping:n});return(0,c.jsx)(k.Provider,{value:D,children:E})}),q=d.forwardRef(function(a,b){let{render:c,className:d,...e}=a,{state:f}=l();return(0,i.useRenderElement)("div",a,{state:f,ref:b,props:e,stateAttributesMapping:n})}),r=d.forwardRef(function(a,b){let{render:c,className:e,...f}=a,{max:g,min:h,value:j,state:k}=l(),m=Number.isFinite(j)&&null!==j?(j-h)*100/(g-h):null,o=d.useCallback(()=>null==m?{}:{insetInlineStart:0,height:"inherit",width:`${m}%`},[m]);return(0,i.useRenderElement)("div",a,{state:k,ref:b,props:[{style:o()},f],stateAttributesMapping:n})}),s=d.forwardRef(function(a,b){let{className:c,render:d,children:e,...f}=a,{value:g,formattedValue:h,state:j}=l(),k=null==g?"indeterminate":h,m=null==g?null:h;return(0,i.useRenderElement)("span",a,{state:j,ref:b,props:[{"aria-hidden":!0,children:"function"==typeof e?e(k,g):m},f],stateAttributesMapping:n})});var t=a.i(67669);let u=d.forwardRef(function(a,b){let{render:c,className:d,id:e,...f}=a,{setLabelId:g,state:h}=l(),j=(0,t.useRegisteredLabelId)(e,g);return(0,i.useRenderElement)("span",a,{state:h,ref:b,props:[{id:j,role:"presentation"},f],stateAttributesMapping:n})});a.s(["Indicator",0,r,"Label",0,u,"Root",0,p,"Track",0,q,"Value",0,s],85806);var v=a.i(85806),v=v,w=a.i(760);function x({className:a,...b}){return(0,c.jsx)(v.Track,{className:(0,w.cn)("relative flex h-1 w-full items-center overflow-x-hidden rounded-md bg-muted",a),"data-slot":"progress-track",...b})}function y({className:a,...b}){return(0,c.jsx)(v.Indicator,{"data-slot":"progress-indicator",className:(0,w.cn)("h-full bg-primary",a),style:{transition:"width 500ms ease-in-out"},...b})}a.s(["Progress",0,function({className:a,children:b,value:d,...e}){return(0,c.jsxs)(v.Root,{value:d,"data-slot":"progress",className:(0,w.cn)("flex flex-wrap gap-3",a),...e,children:[b,(0,c.jsx)(x,{children:(0,c.jsx)(y,{})})]})}],65025)},78512,a=>{"use strict";var b=a.i(72131);a.s(["useDocumentTitle",0,function(a,c=0){(0,b.useEffect)(()=>{let b=c>0?`(${c}) 繋`:"繋",d=a?`${b} | ${a}`:b,e=document.title;return document.title=d,()=>{document.title=e}},[a,c])}])},6828,a=>{"use strict";var b=a.i(23292);function c(a){let{type:c,title:d,description:e,duration:f}=a,g=a.id??crypto.randomUUID(),h={id:g,description:e,duration:f};switch(c){case"loading":b.toast.loading(d,h);break;case"success":b.toast.success(d,h);break;case"error":b.toast.error(d,h);break;case"warning":b.toast.warning(d,h);break;case"info":b.toast.info(d,h);break;default:(0,b.toast)(d,h)}return g}a.s(["toaster",0,{create:a=>c(a),update:(a,b)=>{c({...b,id:a})},dismiss:a=>{b.toast.dismiss(a)}}])}];
|
|
5
|
-
|
|
6
|
-
//# sourceMappingURL=_0r0xwce._.js.map
|