planche 0.8.1 → 0.8.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/app/assets/AboutDialog-DuqxA9a9.js +1 -0
  2. package/app/assets/AiSettingsDialog-CgGNd3Oc.js +1 -0
  3. package/app/assets/ConnectDialog-H3vlQRP_.js +1 -0
  4. package/app/assets/CopyDatabaseDialog-CVoYRBig.js +1 -0
  5. package/app/assets/CopyTableDialog-DC1kxjD2.js +1 -0
  6. package/app/assets/CreateDatabaseDialog-BYwKAc5-.js +1 -0
  7. package/app/assets/CreateSchemaDialog-BhPRvUT-.js +1 -0
  8. package/app/assets/DataDiffDialog-CXMnUq1B.js +1 -0
  9. package/app/assets/DownloadToCSVDialog-Bc0PDZHm.js +3 -0
  10. package/app/assets/EditSchemaDialog-B4h1xWEz.js +2 -0
  11. package/app/assets/FindReplaceDialog-BkDPXuox.js +1 -0
  12. package/app/assets/{FlushDialog-Cu_3tGcK.js → FlushDialog-BlPJ6BTk.js} +1 -1
  13. package/app/assets/{GeneralSettingsDialog-xgxhF9Gn.js → GeneralSettingsDialog-ByNvtugk.js} +1 -1
  14. package/app/assets/GroupByDialog-B593U6zZ.js +1 -0
  15. package/app/assets/LicenseDialog-3TWjXiJM.js +1 -0
  16. package/app/assets/LinkColumnDialog-D3ygO1ut.js +1 -0
  17. package/app/assets/LocalHistoryDialog-DPgqYYkG.js +1 -0
  18. package/app/assets/McpSetupDialog-DOS0fPHQ.js +1 -0
  19. package/app/assets/ProcessListDialog-DNqFCxy7.js +1 -0
  20. package/app/assets/QuerySettingsDialog-BjD8gLmZ.js +1 -0
  21. package/app/assets/QuickCommandPalette-06i8D2JM.js +1 -0
  22. package/app/assets/RowFormDialog-pQYmxMrm.js +2 -0
  23. package/app/assets/{SafetySettingsDialog-D5yLNWsA.js → SafetySettingsDialog-a0Y03qEt.js} +1 -1
  24. package/app/assets/SchemaDiffDialog-DjuZiSux.js +7 -0
  25. package/app/assets/SchemaToHTMLDialog-NzNj1jXs.js +27 -0
  26. package/app/assets/StatusDialog-DVKcDDpl.js +1 -0
  27. package/app/assets/SyncDialog-CTyRxpKa.js +1 -0
  28. package/app/assets/TermsDialog-oo1J6DXC.js +1 -0
  29. package/app/assets/UserAddDialog-CtZpkft3.js +1 -0
  30. package/app/assets/UserManagerDialog-Dk1mzBsu.js +1 -0
  31. package/app/assets/VariablesDialog-Blu74K9P.js +1 -0
  32. package/app/assets/{connection-store-D-Lp5EFj.js → connection-store-B85kbJpB.js} +1 -1
  33. package/app/assets/{database-CfYjCIA2.js → database-BSXLJRzV.js} +1 -1
  34. package/app/assets/de-EBRzfz-s.js +2 -0
  35. package/app/assets/{engine-Ja9hkC7I.js → engine-DjP-Sw-S.js} +1 -1
  36. package/app/assets/{error-hints-9kGurk72.js → error-hints-BsG7qe62.js} +1 -1
  37. package/app/assets/fr-DERxGVO3.js +2 -0
  38. package/app/assets/{i18n-BQcNT-sS.js → i18n-C0aLwQ_k.js} +2 -2
  39. package/app/assets/index-Tw24-4of.js +959 -0
  40. package/app/assets/index-dwv2QL4R.css +2 -0
  41. package/app/assets/ja-C7vEFXh8.js +2 -0
  42. package/app/assets/ko-1oXH_x0o.js +2 -0
  43. package/app/assets/pro-upsell-DhbKIX46.js +1 -0
  44. package/app/assets/pro-usage-BxwRZwtM.js +1 -0
  45. package/app/assets/{query-execution-_bzhSmJm.js → query-execution-BeDEQ-3M.js} +2 -2
  46. package/app/assets/{query-store-Cf_KUo80.js → query-store-BqBiylGA.js} +1 -1
  47. package/app/assets/select-DEqoX1sU.js +1 -0
  48. package/app/assets/settings-controls-BepR6gzL.js +1 -0
  49. package/app/assets/tunneling-B7lL9I14.js +6 -0
  50. package/app/assets/zh-B-LYJHDx.js +2 -0
  51. package/app/index.html +24 -27
  52. package/app/landing.css +4 -2
  53. package/dist/index.js +49 -23
  54. package/package.json +1 -1
  55. package/app/assets/AboutDialog-3SX5EV22.js +0 -1
  56. package/app/assets/AiSettingsDialog-DIhTViGS.js +0 -1
  57. package/app/assets/ConnectDialog-B9B2pmBd.js +0 -1
  58. package/app/assets/CopyDatabaseDialog-DV7zQRd2.js +0 -1
  59. package/app/assets/CopyTableDialog-1A2wKslg.js +0 -1
  60. package/app/assets/CreateDatabaseDialog-CLiJJQgN.js +0 -1
  61. package/app/assets/CreateSchemaDialog-DD_28Eub.js +0 -1
  62. package/app/assets/DataDiffDialog-hIvWJqmh.js +0 -1
  63. package/app/assets/DownloadToCSVDialog-CLpJ8bDP.js +0 -3
  64. package/app/assets/EditSchemaDialog-B8ONt2sC.js +0 -2
  65. package/app/assets/FindReplaceDialog-H1fQsF0u.js +0 -1
  66. package/app/assets/GroupByDialog-BCDcazzJ.js +0 -1
  67. package/app/assets/LicenseDialog-DQHhxdtR.js +0 -1
  68. package/app/assets/LinkColumnDialog-V430TeVp.js +0 -1
  69. package/app/assets/LocalHistoryDialog-BA_7Fo9B.js +0 -1
  70. package/app/assets/McpSetupDialog-BFoqHq0W.js +0 -1
  71. package/app/assets/ProcessListDialog-C580troj.js +0 -1
  72. package/app/assets/QuerySettingsDialog-CxaKHHfo.js +0 -1
  73. package/app/assets/QuickCommandPalette-DI4_5uY6.js +0 -1
  74. package/app/assets/RowFormDialog-DXK8CWzh.js +0 -2
  75. package/app/assets/SchemaDiffDialog-DsXAMyhh.js +0 -7
  76. package/app/assets/SchemaToHTMLDialog-CDrt2YXj.js +0 -27
  77. package/app/assets/StatusDialog-CnIJeQpO.js +0 -1
  78. package/app/assets/SyncDialog-DXLRjtc3.js +0 -1
  79. package/app/assets/TermsDialog-D4K_QWCp.js +0 -1
  80. package/app/assets/UserAddDialog-DPBPQ90W.js +0 -1
  81. package/app/assets/UserManagerDialog-_slF5p1Y.js +0 -1
  82. package/app/assets/VariablesDialog-IdnBQyHZ.js +0 -1
  83. package/app/assets/de-U48bWKTK.js +0 -2
  84. package/app/assets/dist-BUXw8brT.js +0 -1
  85. package/app/assets/dist-BrzYmjQV.js +0 -1
  86. package/app/assets/dist-C2vlTGNz.js +0 -1
  87. package/app/assets/fr-B_almVyv.js +0 -2
  88. package/app/assets/ja-BS_mc_Gc.js +0 -2
  89. package/app/assets/ko-DgeKS5Bf.js +0 -2
  90. package/app/assets/main-BwM1zx0B.js +0 -959
  91. package/app/assets/main-D2x95iIF.css +0 -2
  92. package/app/assets/pro-upsell-BH-enstO.js +0 -1
  93. package/app/assets/pro-usage-D4Iv3hEs.js +0 -1
  94. package/app/assets/select-CtfiGpCP.js +0 -1
  95. package/app/assets/settings-controls-DyukG7E2.js +0 -1
  96. package/app/assets/table-copy-JytHH7NG.js +0 -1
  97. package/app/assets/tunneling-C--CCnwy.js +0 -6
  98. package/app/assets/zh-CoZStBZ6.js +0 -2
@@ -0,0 +1,2 @@
1
+ var e={reconnecting:`再接続中…`,dropSqlite:`ドロップして SQLite ファイルを開く`,dropSqliteHint:`WebAssembly でブラウザ内に開かれ、ファイルはお使いのコンピューターから出ません。-wal ファイルがあれば一緒にドロップしてください。`,dropFailedTitle:`ドロップしたファイルを開けませんでした`,dropNotSqlite:`{{name}} は SQLite データベースファイルではありません。`,crashTitle:`問題が発生しました`,crashBody:`予期しないエラーが発生しました。再読み込みすると接続とタブは復元されますが、保存していないグリッドの編集は失われます。`,crashReload:`再読み込み`},t={auto:`システムの言語({{name}})`,en:`English`,ko:`한국어`,zh:`中文(简体)`,ja:`日本語`,de:`Deutsch`,fr:`Français`},n={title:`安全設定`,description:`意図しないデータ損失を防ぐためのガードレールです。読み取り専用、環境カラー、トランザクションモードは接続ごとに設定します。`,language:`言語`,languageHint:`すぐに反映されます。「システム言語」はブラウザの設定に従います。`,resetDefaults:`デフォルトに戻す`,done:`完了`,analytics:`匿名の使用統計を送信する`,analyticsHint:`匿名の使用イベント(エンジン、機能、文の種類)を Google Analytics に送信します。SQL 本文、ホスト名、テーブル名やユーザー名は送信しません。`,analyticsUnavailableHint:`このビルドでは無効です(測定 ID 未設定)。`,persistHistory:`再読み込み後もクエリ履歴を保持`,persistHistoryHint:`文のテキストがこのブラウザに保存されます (パスワードのリテラルはマスク、開いているエディタタブ自体は常に保持)。オフにすると履歴とスナップショットはタブを閉じるまでのみ保持されます。`,ai:{intro:`失敗した文や遅いプランの理由をモデルに尋ねられます。質問はこのアプリで組み立てられ、ローカルエージェントが下記のプロバイダへ送ります — SQL やスキーマが planche.dev に届くことはありません。`,provider:`プロバイダ`,openaiCompatible:`OpenAI 互換`,model:`モデル`,baseUrl:`ベース URL`,baseUrlHint:`空欄ならプロバイダ既定のエンドポイントを使います。OpenAI 互換サーバーなら何でも動きます — Azure、OpenRouter、ローカルの Ollama。`,key:`API キー`,keyHint:`ローカルエージェントに渡され、そこで使われます。このブラウザには保存されず、planche.dev にも送られません。`,remember:`このマシンにキーを記憶する`,rememberHint:`{{path}} に本人だけが読める形で書き込みます。チェックしない場合、キーは実行中のエージェント内にのみ存在し、停止すると消えます。`,save:`保存`,forget:`キーを削除`,saved:`保存しました。`,none:`キーは未設定です。`,configuredSession:`今回のエージェントセッションのみ有効なキーが設定されています。`,configuredFile:`{{path}} にキーが保存されています。`,configuredEnv:`このエージェントの AI 設定は環境変数由来のため、ここでは変更できません。`,unreachable:`エージェントに接続できないため、AI 設定を変更できません。`,title:`AI による説明`,description:`失敗やプランをどのモデルが説明し、誰のキーで支払うか。`,cli:`ローカル CLI(キー不要)`,cliCommand:`コマンド`,cliHint:`このマシンに導入済みでサインイン済みのエージェント CLI を実行するため、入力するキーはありません。失敗やプランの説明に使えます。AI パネルにはツールを呼べる provider が必要です。`,cliNone:`このマシンにエージェント CLI が見つかりません。Claude Code か Codex を入れるか、別の provider を選んでください。`,profile:`Anthropic(このマシンのログイン)`,profileHint:"このマシンが既にサインイン済みの資格情報を使います。`ant auth login` の後は SDK が自動で見つけます。貼り付けるものはなく、ローカル CLI と違い本物の API なので AI パネルも動きます。",profileNone:"このマシンに Anthropic の資格情報が見つかりません。`ant auth login` を実行するか、キーを設定してください。",configuredChoice:`{{provider}} を使用中 — キーは保持せず、選択は {{path}} に保存されます。`},query:{title:`クエリ`,description:`文をどう実行するか: F9 が何を走らせ、何行返し、何を先に確認するか。`},general:{title:`一般`,description:`言語、再読み込みを越えて残るもの、そしてこのマシンを離れるもの。`}},r={settings:{safety:`安全設定…`,language:`言語`,title:`設定`,theme:`テーマ`,query:`クエリ…`,general:`一般…`,ai:`AI…`},help:{gettingStarted:`はじめに`,about:`Planche について`,title:`ヘルプ`,documentation:`ドキュメント`,learn:`SQL を学ぶ`,terms:`利用規約`,license:`ライセンス`,support:`お問い合わせ`,mcp:`AI エージェントを接続 (MCP)…`,privacy:`プライバシーポリシー`},connection:{title:`接続`,connect:`接続`,disconnect:`切断`,readOnly:`読み取り専用`,manualTransactions:`手動トランザクション`,saveDatabaseFile:`データベースファイルを保存`,saveDatabaseFileBlocked:`データベースファイルを保存(先に -wal を読み込んでください)`,exit:`終了`,sync:`接続の同期`},query:{title:`クエリ`,execute:`実行`,executeStatementAtCursor:`カーソル位置のステートメントを実行`,executeWholeScript:`スクリプト全体を実行`,newQueryTab:`新しいクエリタブ`,findReplace:`検索と置換`,localHistory:`ローカル履歴…`,explainPlan:`実行計画を表示`,explainAnalyze:`実行計画を実測 (文を実際に実行)`,structure:`クエリ構造`},edit:{title:`編集`,undo:`元に戻す`,redo:`やり直す`,cut:`切り取り`,copy:`コピー`,paste:`貼り付け`,selectAll:`すべて選択`},database:{title:`データベース`,create:`データベースを作成`,alter:`データベースを変更`,drop:`データベースを削除`,copy:`データベースをコピー`,compare:`スキーマを比較…`,truncate:`データベースを空にする`,compareData:`データを比較…`,groupBy:`グループ集計…`},table:{title:`テーブル`,create:`テーブルを作成`,alter:`テーブルを変更`,drop:`テーブルを削除`,rename:`テーブル名を変更`,truncate:`テーブルを空にする`,duplicateStructure:`テーブル構造を複製`},export:{title:`エクスポート`,csv:`CSV としてダウンロード`,tsv:`TSV でダウンロード`,schemaHtml:`スキーマを HTML に出力`,links:`列リンクをエクスポート…`,importLinks:`列リンクをインポート…`},tools:{title:`ツール`,userManager:`ユーザー管理`,processList:`プロセス一覧`,variables:`変数`,status:`ステータス`,flush:`フラッシュ`,quickCommand:`クイックコマンド`,viewErd:`ERD を表示`,scratchpad:`スクラッチパッド(ブラウザ内 SQLite)`,federated:`統合クエリ(接続をまたぐ結合)…`,federatedTab:`統合クエリ {{n}}`,ai:`AI アシスタント`},messages:{databaseFileSaved:`データベースファイルを保存しました`,databaseExported:`データベースをダウンロードとしてエクスポートしました`,databaseExportedWithReason:`データベースをダウンロードとしてエクスポートしました — {{reason}}`,errorSavingDatabase:`データベースの保存中にエラーが発生しました: {{message}}`,noDatabaseSelected:`データベースが選択されていません`,noTableSelected:`テーブルが選択されていません`,noActiveConnection:`アクティブな接続がありません`,databaseDropped:`データベース "{{database}}" を削除しました`,errorDroppingDatabase:`データベースの削除中にエラーが発生しました: {{message}}`,noTablesInDatabase:`データベース "{{database}}" にテーブルが見つかりません`,databaseTruncated_other:`"{{database}}" の {{count}} 個のテーブルをすべて空にしました`,errorTruncatingDatabase:`データベースを空にする際にエラーが発生しました: {{message}}`,tableDropped:`テーブル "{{table}}" を削除しました`,errorDroppingTable:`テーブルの削除中にエラーが発生しました: {{message}}`,tableTruncated:`テーブル "{{table}}" を空にしました`,errorTruncatingTable:`テーブルを空にする際にエラーが発生しました: {{message}}`,renameTablePrompt:`テーブル "{{table}}" の新しい名前:`,tableRenamed:`テーブル "{{table}}" の名前を "{{newName}}" に変更しました`,errorRenamingTable:`テーブル名の変更中にエラーが発生しました: {{message}}`,truncateDatabaseTitle:`"{{name}}" のすべてのテーブルを空にしますか?`,truncateDatabaseDescription:`"{{name}}" の {{count}} 個のテーブルのすべての行が削除されます。テーブル構造は保持されます。この操作は元に戻せません。`,truncateDatabaseConfirm:`すべてのテーブルを空にする`,renameTableTitle:`テーブル名の変更`,renameTableConfirm:`名前を変更`,noLinksToExport:`エクスポートする列リンクがありません。`,linksExported:`列リンク {{count}} 件をエクスポートしました。`,linksImported:`列リンク {{count}} 件をインポートしました。`,linksImportedPartial:`列リンク {{count}} 件をインポートしました。一致するプロファイルなし: {{profiles}}`,linksImportFailed:`列リンクをインポートできませんでした: {{reason}}`}},i={title:`Planche について`,tagline:`MySQL、MariaDB、PostgreSQL、SQLite 向けのデータベースクライアントです。`,version:`バージョン`,website:`ウェブサイト`,licenses:`ライセンス`,licensesLink:`サードパーティ通知`,disclaimer:`Planche は「現状のまま」提供され、いかなる保証もありません。作者は本ソフトウェアの使用によって生じた損害やデータ損失について一切の責任を負いません。破壊的なステートメントを実行する前にデータをバックアップしてください。`,rights:`All rights reserved.`,legal:`規約`,terms:`利用規約`,privacy:`プライバシー`,refund:`返金`},a=JSON.parse('{"dialog":{"title":"データベースに接続","firstQueryTab":"クエリ 1","colHostName":"接続名","colTarget":"接続先","colDbms":"DBMS","noSaved":"保存された接続はありません","unnamed":"(名前なし)","pickOnConnect":"(接続時に選択)","noFile":"(ファイルなし)","selectPrompt":"接続を選択するか、新しく追加してください","addNew":"新規追加","delete":"削除","testConnection":"接続テスト","connect":"接続","close":"閉じる","unknownError":"不明なエラー","browserTestHint":"ブラウザ内 SQLite 接続は、「接続」をクリックするとローカルファイルを開きます。","testSuccess":"接続に成功しました","restoredUnsaved":"{{file}}: キャッシュされたコピーから未保存の変更を復元しました","restoredUnsavedDiskChanged":"{{file}}: キャッシュされたコピーから未保存の変更を復元しました — ディスク上のファイルはその後変更されています","walPending":"{{file}} は WAL モードです: 最近の変更が -wal ファイルに残っている可能性があります。上の「-wal ファイルを読み込む」で取り込んでください。","walApplied":"{{file}} を -wal の変更を適用して開きました","connectFailedTitle":"接続に失敗しました","testSuccessDescription":"サーバーが認証情報を受け付けました。","testFailedTitle":"接続テストに失敗しました","privacy":"ここに入力した情報が planche.dev のサーバーに送信・保存されることはありません。接続プロファイルはこのブラウザのローカルストレージにのみ保存され、クエリはローカルエージェントからデータベースへ直接送られます。","hostKeyTitle":"不明な SSH ホスト鍵","hostKeyDescription":"{{host}}:{{port}} がフィンガープリント {{fingerprint}} の {{type}} 鍵を提示しました。サーバー管理者から受け取ったフィンガープリントと照合してください。誤った鍵を受け入れると攻撃者に通信を読まれます。","hostKeyAccept":"このホストを信頼する","gatewayTitle":"ゲートウェイのプロファイル","gatewayAdd":"追加","gatewayAdded":"ゲートウェイのプロファイル {{name}} を追加しました。","gatewayReadOnly":"読み取り専用","gatewayWritable":"書き込み可","gatewayProfileHint":"この接続はゲートウェイが保持するプロファイル「{{name}}」を使います。ここで設定するものはありません。","gatewayLoadFailed":"ゲートウェイのプロファイルを読み込めませんでした: {{error}}"},"form":{"hostName":"接続名","hostNamePlaceholder":"My Connection","dataSource":"データソース","openVia":"開く方法","viaBrowser":"ブラウザ(ローカルファイル)","viaAgent":"ローカルエージェント","viaBrowserHint":"インストール不要です。他のプログラムが使用していないファイルに最適です: ブラウザはメモリ上のコピーで作業し、ファイルをロックできないため、開いている間に他で行われた編集は反映されず、保存時に上書きされます。","viaAgentHint":"npx planche 経由で SQLite 自体がファイルを開きます — 適切なロックと WAL に対応し、同じデータベースを使う他のプログラムと安全に共存できます。","databaseFile":"データベースファイル","changeFile":"ファイルを変更","filePickerHint":"「接続」をクリックするとファイル選択ダイアログが開きます(ヒント: ⌘⇧. で隠しファイルを表示、⌘⇧G でパスを入力できます)。","fileRememberedHint":"選択したファイルは記憶される(Chromium)ため、再接続時は権限の確認のみ行われます。変更を書き戻すには「接続 > データベースファイルを保存」を使用してください。","authToken":"認証トークン","authTokenPlaceholder":"空欄でペアリング済みのエージェントトークンを使用","filePathPlaceholder":"/path/to/database.sqlite または :memory:","createIfMissing":"存在しない場合は作成","createIfMissingHint":"パスはトンネリングサーバーのホスト上で解決されます","host":"ホスト","port":"ポート","database":"データベース","serviceName":"サービス名","user":"ユーザー","password":"パスワード","savePassword":"パスワードを保存","savePasswordHint":"オフ: パスワードはこのブラウザセッションの間だけ保持され、ディスクには書き込まれません。","charset":"文字セット","autoConnection":"自動接続","safety":"安全設定","environment":"環境","environmentHint":"タブとワークスペースに色を付けます","readOnly":"読み取り専用","readOnlyHint":"データやスキーマを変更するステートメントを拒否します","transactions":"トランザクション","txAuto":"自動コミット","txManual":"手動 — ツールバーからコミット / ロールバック","ssh":"SSH","sshTunnel":"SSHトンネル","sshTunnelHint":"SSH踏み台ホスト経由でデータベースに接続します(ローカルエージェントがトンネルを開きます)","sshHost":"SSHホスト","sshPort":"SSHポート","sshUser":"SSHユーザー","sshAuth":"SSH認証","sshAuthKey":"秘密鍵","sshAuthPassword":"パスワード","sshAuthAgent":"ssh-agent","sshAuthAgentHint":"npx planche を実行しているマシンの ssh-agent に読み込まれた鍵を使用します(SSH_AUTH_SOCK)。","sshPassword":"SSHパスワード","sshKey":"秘密鍵","sshKeyPick":"鍵ファイルを選択…","sshKeyLoaded":"鍵を読み込み済み","sshKeyHint":"空ならエージェントのマシンの ~/.ssh/config の IdentityFile(または ~/.ssh/id_*)を使用します。選択した鍵はこのプロファイルと共に保存されます","sshPassphrase":"パスフレーズ","sshPassphrasePlaceholder":"鍵にパスフレーズがなければ空のまま","sshSecretsHint":"SSH のパスワード・秘密鍵・パスフレーズは上の「パスワードを保存」設定に従います。不明なホスト鍵は初回接続前に確認用に表示され、エージェントのマシンの ~/.planche/known_hosts に保存されます。","sshHostPlaceholder":"bastion.example.com または ~/.ssh/config の Host エイリアス","sshUserPlaceholder":"空なら ~/.ssh/config の User を使用","sshTargetHint":"DB のホスト/ポートは踏み台ホスト側で解決されます — localhost やローカルポートフォワードではなく、DB の実際のアドレス(例: RDS エンドポイント)を入力してください。","connectionString":"接続文字列","connectionStringApplied":"下のフィールドに反映しました。文字列自体は保存されず、フィールドのみ保存されます。","connectionStringInvalid":"PostgreSQL URI ではありません (postgresql://user:password@host/database の形式)。","neonHint":"Neon コンソール (Connect > Connection string) の URI を貼り付けると、下のフィールドが埋まります。","supabaseHint":"Supabase (Connect > Session pooler または Direct connection) の URI を貼り付けると、下のフィールドが埋まります。","supabasePoolerWarning":"ポート 6543 はトランザクションモードのプーラーです。文ごとに別のバックエンドで実行される可能性があるため、スキーマの切り替え、一時テーブル、プリペアドステートメント、手動トランザクションは動作しません。セッションプーラー (ポート 5432) か直接接続を使ってください。","managedTlsHint":"このサービスへは常に TLS で接続し、ローカルエージェントからサービスへ直接接続します (SSH トンネルなし)。","d1AccountId":"Account ID","d1DatabaseId":"Database ID","d1ApiToken":"API トークン","d1Hint":"Account ID: Cloudflare ダッシュボードのアカウントホーム右側。Database ID: Storage & Databases > D1 > データベース。トークン: My Profile > API Tokens > Create Token で \\"D1 Edit\\" 権限 (読み取り専用は \\"D1 Read\\")。ローカルエージェントがこのトークンで Cloudflare API を呼び出します。","d1LimitsHint":"D1 はリクエストごとに独立して実行され自動コミットされるため、手動トランザクションは使えません。データベースは \\"main\\" スキーマ 1 つとして表示されます。","doDevUrl":"wrangler dev URL","doHint":"Worker プロジェクトで `wrangler dev` を実行し、表示された URL を入力してください (既定のポートは 8787)。ローカルエージェントがそのセッションの Durable Object を読み取ります。同時に動作している他の `wrangler dev` セッションも表示されます。","doLimitsHint":"ローカル開発専用です。デプロイ済みの Durable Object は Worker からしかアクセスできず、Cloudflare は照会 API を提供していません。各オブジェクトは \\"<名前空間>/<オブジェクト>\\" というデータベースとして表示され、リクエストごとに自動コミットされるため手動トランザクションは使えません。","tls":"TLS","tlsEnable":"接続を暗号化","tlsVerify":"サーバー証明書を検証","tlsVerifyHint":"オフ: 自己署名証明書も受け入れます (暗号化はされますがサーバーは認証されません)。SSH トンネル経由では使えません。","d1DevUrl":"ローカル開発 URL","d1DevUrlHint":"空にすると Cloudflare アカウント経由で接続します。入力すると、このマシンで `wrangler dev` が動かしているデータベースを直接読みます — アカウントも API トークンも不要で、下のアカウント欄は無視されます。開発サーバーの D1 が 1 つだけなら Database ID は空のままで構いません。","d1PickDatabase":"データベースを選択"},"agent":{"copy":"コピー","looking":"Planche エージェントを探しています…","online":"エージェント <b>v{{version}}</b> が <mono>{{url}}</mono> で実行中です","outdated":"エージェント v{{version}} はプロトコル {{protocol}} を使用していますが、このアプリにはより新しいものが必要です。<cmd/> で再起動してください","unauthorized":"エージェント <b>v{{version}}</b> が <mono>{{url}}</mono> で実行中ですが、このアプリとペアリングされていません(トークンは起動のたびに変わります)。エージェントのターミナルに表示されたリンクを開くか、「設定」でトークンを貼り付けてください。","offline":"<mono>{{url}}</mono> にエージェントがありません。ターミナルで起動してください — ペアリング済みの状態でこのアプリが開きます。","close":"閉じる","configure":"設定","checkAgain":"再確認","urlLabel":"エージェント URL","urlPlaceholder":"http://127.0.0.1:8888(デフォルト)","tokenLabel":"トークン","tokenPlaceholder":"エージェントが表示したもの","reset":"リセット","save":"保存","remoteWarning":"このエージェントはお使いのコンピューター上にありません ({{host}}): すべての接続のパスワードと SSH 鍵がそこへ送られます。","remoteRefusedTitle":"リモートエージェントは使用できません","remoteRefused":"エージェントはこのコンピューター (127.0.0.1 または localhost) 上で実行する必要があります。別のマシンのエージェントを使うには `ssh -L 8888:127.0.0.1:8888 user@host` でポートを転送し、URL は http://127.0.0.1:8888 のままにしてください。","gateway":"ゲートウェイ「{{name}}」: サーバー側プロファイル {{count}} 件。認証情報はゲートウェイにのみあります。下からプロファイルを選んでください。"},"tab":{"noConnections":"開いている接続はありません。「接続」を押して始めてください。","theSqliteFile":"SQLite ファイル","reopened":"{{file}} を再度開きました","reopenFailed":"ファイルを再度開けませんでした: {{message}}","reopenPrompt":"<b>{{file}}</b> を読み取るには、ブラウザの許可が再度必要です。","reopenFile":"ファイルを再度開く","closeConnection":"接続を閉じる","reconnected":"{{file}} に再接続しました","accessNotGranted":"ファイルへのアクセスが許可されませんでした。保存時はダウンロードとしてエクスポートします。","detachedPrompt":"<b>{{file}}</b> のキャッシュされたコピーで作業しています。変更をその場で保存するにはファイルを再接続してください。","reconnectFile":"ファイルを再接続","detachedHide":"非表示(保存時に必要に応じてファイルを求めます)","walFramesApplied_other":"{{file}}-wal から {{count}} 個の WAL フレームを適用しました","walNoChanges":"-wal ファイルにコミット済みの変更はありませんでした","walLoadFailed":"-wal ファイルを読み込めませんでした: {{message}}","walPrompt":"<b>{{file}}</b> は WAL モードです: <mono>{{file}}-wal</mono> ファイルを読み込むまで最新のデータが表示されない場合があり、それまで保存は無効です。隣にそのようなファイルがない場合(データベースが正常に閉じられた場合)は、代わりにその旨を確認してください。他のプログラムがまだこのデータベースを使用している場合は、代わりにローカルエージェント(<mono>npx planche</mono>)経由で開いてください: ブラウザはファイルを安全に共有できません。","loadWal":"-wal ファイルを読み込む","noWalHint":"確認済み: データベースの隣に -wal ファイルはありません","noWal":"-wal ファイルなし","dismiss":"閉じる","walHide":"非表示(保存は無効のまま)","readOnlyBadge":"読み取り専用"}}'),o={connect:`接続 (Alt+N)`,disconnect:`切断`,newQueryTab:`新しいクエリタブ (Alt+T)`,execute:`実行 (F9)`,executeStatement:`カーソル位置 / 選択範囲のステートメントを実行 (Ctrl+Enter)`,commit:`コミット`,commitHint:`開いているトランザクションをコミットします`,noOpenTransaction:`開いているトランザクションはありません`,rollback:`ロールバック`,rollbackHint:`開いているトランザクションを破棄します`,readOnlyBadge:`読み取り専用`,readOnlyHint:`この接続はデータやスキーマを変更するステートメントを拒否します`,userManager:`ユーザー管理 (Alt+U)`,quickCommand:`クイックコマンド`,processList:`プロセス一覧`,variables:`変数`,status:`ステータス`,flush:`フラッシュ`,fullscreen:`全画面表示`},s={readOnly:`読み取り専用`,txOpen:`トランザクション中`,manualTx:`手動トランザクション`},c={title:`クイックコマンド`,description:`実行するコマンドを検索...`,inputPlaceholder:`コマンドを入力または検索...`,empty:`コマンドが見つかりません。`,groups:{connection:`接続`,query:`クエリ`,database:`データベース`,table:`テーブル`,tools:`ツール`},commands:{connect:`接続`,disconnect:`切断`,executeQuery:`クエリを実行`,newQueryTab:`新しいクエリタブ`,createDatabase:`データベースを作成`,dropDatabase:`データベースを削除`,createTable:`テーブルを作成`,alterTable:`テーブルを変更`,dropTable:`テーブルを削除`,processList:`プロセス一覧`,serverVariables:`サーバー変数`,serverStatus:`サーバーステータス`,flush:`フラッシュ`,userManager:`ユーザー管理`}},l={title:`Planche へようこそ`,intro:`ブラウザで動作する SQL クライアントです。データベースにはお使いのマシン上の小さなエージェントを通じてアクセスするため、認証情報やデータがコンピューターの外に出ることはありません。`,skip:`スキップ`,skipTitle:`この画面を非表示にします(「ヘルプ > はじめに」で再表示できます)`,copy:`コピー`,copied:`コピーしました`,sampleOpenFailed:`サンプルデータベースを開けませんでした: {{message}}`,steps:{agent:{title:`ローカルエージェントを実行する`,body:`ターミナルで次のいずれかを実行します。エージェントが起動し、このページとペアリングされます。`},connection:{title:`接続を追加する`,body:`データベースを選ぶと、適切なデフォルト値で接続フォームが開きます。`},sample:{title:`手元にデータベースがない場合はサンプルをお試しください`,body:`サンプルのウェブショップデータベース(24 テーブル、約 5 万行、ビューとトリガー)をブラウザに読み込み、エディター、グリッド、スキーマツリーを試せます。`,loading:`サンプルを読み込み中…`,button:`サンプルデータベースを試す`}},terms:{title:`はじめる前に`,local:`すべてローカルで動作します。認証情報、クエリ、結果はお使いのコンピュータにのみ保存され、当方へ送信されることはありません。`,asIs:`Planche は現状有姿で提供され、いかなる保証もありません。安全機能(破壊的操作の確認、読み取り専用モード)は補助的なものであり、保証ではありません。`,dataLoss:`Planche を通じて実行されるすべての文の責任はユーザーにあります。破壊的な操作を行う前に必ずデータをバックアップしてください。`,agree:`利用規約を読み、同意します。`,accepted:`利用規約に同意済みです。`,readFull:`規約の全文を読む`}},u={treeLabel:`スキーマ`,unreachableHint:`この接続に紐付いたデータベースではありません。閲覧するにはそのデータベース用のプロファイルを作成してください`,objectType:{table:`テーブル`,view:`ビュー`,procedure:`プロシージャ`,function:`関数`,trigger:`トリガー`,event:`イベント`},menu:{showCreate:`{{type}}の CREATE 文を表示`,alter:`{{type}}を変更`,drop:`{{type}}を削除`,create:`{{type}}を作成`,refresh:`更新`,unreachable:`このデータベースを閲覧するには、これに紐付いたプロファイルで接続してください`,openDatabase:`データベースを開く`,createSchema:`スキーマを作成…`,createTable:`テーブルを作成`,dropDatabase:`データベースを削除`,openSchema:`スキーマを開く`,dropSchema:`スキーマを削除`,newQueryTab:`新しいクエリタブ`,generateSql:`SQL を生成`,openTable:`テーブルを開く`,alterTable:`テーブルを変更`,showCreateTable:`CREATE TABLE 文を表示`,duplicateStructure:`構造を複製`,copyTable:`別の場所へテーブルをコピー…`,compare:`{{type}}を比較…`,truncateTable:`テーブルを空にする`,dropTable:`テーブルを削除`,exportCsv:`CSV にエクスポート`,exportTsv:`TSV でエクスポート…`,openView:`ビューを開く`,alterView:`ビューを変更`,showCreateView:`CREATE VIEW 文を表示`,dropView:`ビューを削除`,compareData:`データを比較…`,groupBy:`グループ集計…`},actions:{createStatementUnavailable:`-- {{type}} {{name}} の CREATE 文を取得できませんでした`,getCreateFailed:`CREATE {{type}} の取得に失敗しました: {{message}}`,createTabTitle:`{{type}}を作成`,createSchemaTabTitle:`スキーマを作成`,generateSqlFailed:`SQL を生成できませんでした: {{message}}`,dropTableTitle:`テーブル "{{name}}" を削除しますか?`,dropTableDescription:`{{from}}テーブルとそのすべての行が完全に削除されます。この操作は元に戻せません。`,dropTableConfirm:`テーブルを削除`,dropObjectTitle:`{{type}} "{{name}}" を削除しますか?`,dropObjectDescription:`{{from}}{{type}}の定義が削除されます。この操作は元に戻せません。`,dropObjectConfirm:`{{type}}を削除`,fromDatabase:`データベース "{{database}}" から`,dropped:`{{type}} {{name}} を削除しました`,dropFailed:`{{type}}の削除に失敗しました`,dropDatabaseTitle:`データベース "{{name}}" を削除しますか?`,dropDatabaseDescription:`データベースとそのすべてのテーブルおよびデータが完全に削除されます。この操作は元に戻せません。`,dropDatabaseConfirm:`データベースを削除`,droppedDatabase:`データベース {{name}} を削除しました`,dropDatabaseFailed:`データベースの削除に失敗しました`,dropSchemaTitle:`スキーマ "{{name}}" を削除しますか?`,dropSchemaDescription:`スキーマとそのすべてのテーブルおよびデータが完全に削除されます。この操作は元に戻せません。`,dropSchemaConfirm:`スキーマを削除`,droppedSchema:`スキーマ {{name}} を削除しました`,dropSchemaFailed:`スキーマの削除に失敗しました`,truncateTitle:`テーブル "{{name}}" を空にしますか?`,truncateDescription:`"{{name}}" のすべての行が削除されます。テーブル構造は保持されます。この操作は元に戻せません。`,truncateConfirm:`テーブルを空にする`,truncated:`{{name}} を空にしました`,truncateFailed:`テーブルを空にできませんでした`},tree:{loadDatabasesFailed:`データベースの読み込みに失敗しました: {{message}}`}},d={editor:{destructiveMarker:`破壊的操作: {{action}} {{names}}`,readOnlyMarker:`接続は読み取り専用です。このステートメントはデータまたはスキーマを変更します`,actionExecute:`実行(設定に従う)`,actionExecuteStatement:`カーソル位置 / 選択範囲のステートメントを実行`,actionExecuteScript:`スクリプト全体を実行`,actionExplainPlan:`実行計画を表示`,actionQueryStructure:`クエリ構造`},tabs:{newQuery:`新しいクエリ`,queryTitle:`クエリ {{n}}`,erdViewer:`ERD ビューアー`,close:`閉じる`,closeOthers:`他のタブを閉じる`,closeLeft:`左側のタブを閉じる`,closeRight:`右側のタブを閉じる`,closeAll:`すべて閉じる`},executor:{noActiveConnection:`アクティブな接続がありません`,uncommittedTitle:`未コミットのトランザクション`,uncommittedDescription:`この接続には開いているトランザクションがあります。切断するとその変更はロールバックされます。`,uncommittedConfirm:`ロールバックして切断`,unsavedTitle:`未保存の変更`,unsavedDescription:`{{file}} にはファイルに保存されていない変更があります。切断するとそれらは破棄されます(保持するには先に「接続 > データベースファイルを保存」を使用してください)。`,theSqliteDatabase:`SQLite データベース`,unsavedConfirm:`破棄して切断`}},f=JSON.parse('{"tabs":{"message":"メッセージ","info":"情報","history":"履歴","result":"結果","resultN":"結果 {{n}}","plan":"実行計画","structure":"構造","structureN":"構造 {{n}}"},"message":{"executing":"クエリを実行中...","error":"エラー: {{message}}","total":"(合計: {{ms}}ms)","ready":"準備完了。","log":"実行ログ","statementN":"文 {{n}}","limitedBadge":"上限到達","insertId":"insert id {{id}}","failed":"失敗","failedStatement":"失敗した文","summary":"成功 {{ok}} · 失敗 {{failed}} · 合計 {{ms}}","copy":"コピー","copied":"コピー済み","showSql":"SQL を表示","hideSql":"SQL を隠す"},"hints":{"title":"ヒント","unknownColumn":"{{name}} という列はありません。{{suggestions}} ではありませんか?","unknownTable":"{{name}} というテーブルはありません。{{suggestions}} ではありませんか?","syntaxSwap":"{{engine}} では {{found}} ではなく {{expected}} を使います。","doubleQuotedLiteral":"{{engine}} は \\"{{value}}\\" を文字列ではなく列名として読みます。文字列は \'{{value}}\' と書きます。"},"ai":{"title":"AI による説明","explain":"AI に説明してもらう","thinking":"失敗を読んでいます…","by":"{{model}}","applyFix":"修正文を新しいタブで開く","failed":"説明できませんでした: {{message}}","noFailure":"説明する失敗した文がありません。","noPack":"planche.dev からプロンプトを取得できませんでした。","badShape":"モデルが想定した形式で応答しませんでした。","noPlan":"説明するプランがまだありません。","explainPlan":"このプランを説明してもらう"},"info":{"empty":"クエリ情報はありません。","resultN":"結果 {{n}}","metadata":"クエリのメタデータ","executionTime":"実行時間","notAvailable":"N/A","affectedRows":"影響を受けた行数","fields":"フィールド","fieldDetails":"フィールドの詳細","colName":"名前","colType":"型","colTable":"テーブル","resultSets":"結果セット","rowsReturned":"返された行","insertId":"最後の Insert ID","lastQuery":"最後に実行した文","copy":"コピー","copied":"コピー済み","colOrigin":"元の名前","primaryKey":"主キー","rowsAndFields":"{{rows}}行 × {{fields}}列","noFields":"この文は列を返しませんでした。"},"rowForm":{"colColumn":"列","colValue":"値","insertTitle":"行を追加","editTitle":"行を編集","loading":"列情報を読み込み中...","preview":"実行される文","nothingToWrite":"書き込む内容がありません","insert":"挿入","update":"更新","stageInsert":"保留行として追加","stageEdit":"グリッドに反映","stageHint":"実行せずにグリッドへ値を置き、後で他の編集と一緒にコミットします。","inserted":"{{table}} に行を挿入しました","updated":"{{table}} の行を更新しました","confirmInsertTitle":"{{table}} に行を挿入しますか?","confirmUpdateTitle":"{{table}} の行を更新しますか?","inTransaction":"開いているトランザクション内で実行されます","pickDate":"日付を選択","now":"現在時刻","formatJson":"整形","binaryUnsupported":"バイナリ列はここでは編集できません。NULL/DEFAULT のままにするか SQL で設定してください。","generateUuid":"UUID を生成","defaultValue":"デフォルト値","clickToChange":"クリックして変更","empty":"(空)","autoHint":"サーバーが自動生成","mode":{"keep":"維持","auto":"自動","value":"値"},"invalid":{"integer":"整数を入力してください","unsigned":"この列は負の数を受け付けません","number":"数値を入力してください","json":"不正な JSON","date":"YYYY-MM-DD 形式で入力してください","datetime":"YYYY-MM-DD HH:MM:SS 形式で入力してください","time":"HH:MM:SS 形式で入力してください","length":"最大 {{max}} 文字"}},"history":{"copied":"クリップボードにコピーしました","searchPlaceholder":"履歴を検索...","all":"すべて","success":"成功","failed":"失敗","thisTab":"このタブのみ","noMatch":"一致する項目がありません。","count":"{{count}}件","clear":"消去","clearTitle":"クエリ履歴を消去しますか?","clearDescription":"この接続の {{count}} 件がすべて削除されます。元に戻せません。","clearConfirm":"履歴を消去","insert":"エディターに挿入","inserted":"エディターに挿入しました","copy":"コピー","rows":"{{count}}行","affected":"{{count}}行変更","today":"今日","yesterday":"昨日","empty":"クエリ履歴はありません。"},"json":{"arrayLength":"Array[{{count}}]","keys_other":"{{count}} 個のキー","invalid":"無効な JSON","clickToView":"クリックして JSON を表示","expandAll":"すべて展開","collapseAll":"すべて折りたたむ","edit":"編集","view":"表示","copied":"コピーしました","copy":"コピー","shortcutHint":"{{mod}}+Enter で保存 · Esc でキャンセル","cancel":"キャンセル","save":"保存"},"grid":{"readOnlyConnection":"読み取り専用の接続","readOnlyWal":"読み取り専用: -wal ファイルが読み込まれていません","readOnlyNoPk":"読み取り専用: テーブルに主キーがありません","commitTitle":"{{count}} 件の変更を {{table}} にコミットしますか?","commitDescription":"次のステートメントが実行されます。","commitConfirm":"コミット","rowPrefix":"行 {{row}}:","cancelled":"キャンセルされました","commitFailed":"コミットに失敗しました: {{message}}","executedInTransaction":"開いているトランザクション内で {{count}} 件の変更を実行しました — 確定するにはツールバーの「コミット」を押してください(再読み込みするとロールバックされます)","committed":"{{count}} 件の変更を {{table}} にコミットしました","noData":"表示するデータがありません。","commit":"コミット","discard":"破棄","addRow":"行を追加","removeNewRow":"この新しい行を取り消す","addRowForm":"フォームで追加","addRowFormHint":"列ごとの入力欄を持つフォームを開きます (INSERT としてコミット)","editRowForm":"この行をフォームで編集","addRowHint":"新しい行を追加します(INSERT としてコミット)","delete":"削除","deleteCount":"削除 ({{count}})","deleteHint":"選択した行を削除します(DELETE としてコミット)。行番号の列で行を選択してください。","field":"フィールド","searchPlaceholder":"検索...","orderBy":"並び順","none":"なし","refresh":"更新","dismiss":"閉じる","clearSelection":"選択を解除","columns":"列","showAllColumns":"すべて表示","hideAllColumns":"すべて非表示","resetWidths":"幅をリセット","selectAll":"すべての行を選択","emptyTable":"このテーブルには行がありません。","noRows":"行は返されませんでした。","addARow":"行を追加","markedForDeletion":"削除予定 — クリックで元に戻す","newRow":"新しい行","clickToSelect":"クリックで選択、Shift/Ctrl で複数選択","rows":"行数: {{count}}","rowsWithNew":"行数: {{count}} (+{{added}})","sortedBy":"並び順: {{column}} {{direction}}","pageRange":"{{from}}–{{to}} 行","firstPage":"最初のページ","prevPage":"前のページ","nextPage":"次のページ","lastPage":"最後のページ","pagingBlocked":"ページを移動する前に変更をコミットまたは破棄してください","selected":"{{count}} 件選択中","cellsModified":"{{count}} 個のセルを変更","newCount":"{{count}} 件追加","toDelete":"{{count}} 件削除予定","searchMode":"一致方法","contains":"含む","equals":"一致","followLink":"{{table}} を {{column}} = 値 で開く","linkColumn":"「{{column}}」を別のテーブルにリンク…","editLink":"「{{column}}」のリンクを編集…","removeLink":"リンクを削除","copyValue":"値をコピー","filterByValue":"フィルタ: {{column}} = この値","clearFilter":"フィルタを解除","copyColumnName":"列名をコピー","editCell":"セルを編集","setNull":"NULL に設定","setEmpty":"空文字列に設定","restoreRow":"行を復元","hideColumn":"列「{{column}}」を隠す","copyRowsTsv_other":"{{count}} 行を TSV としてコピー(ヘッダー付き)","copyRowsCsv_other":"{{count}} 行を CSV としてコピー","copyRowsJson_other":"{{count}} 行を JSON としてコピー","copyRowsInsert_other":"{{count}} 行を INSERT 文としてコピー","deleteRowsPending_other":"{{count}} 行を削除(コミットまで保留)","sendRowsToScratchpad_other":"{{count}} 行をスクラッチパッドへ送る","sendAllToScratchpad":"読み込み済みの {{count}} 行すべてをスクラッチパッドへ送る","sentToScratchpad":"{{count}} 行をスクラッチパッドのテーブル {{table}} にコピーしました。","changesSince":"前回の読み込み以降: 変更 {{changed}} · 新規 {{added}} · 消失 {{gone}}","changesToggle":"前回の読み込みからの変更のハイライトを切り替え","changesDismiss":"変更表示を消す","previousValue":"以前の値: {{value}}","groupByValue":"{{column}} でグループ集計"},"link":{"title":"列を別のテーブルにリンク","source":"列","hint":"この列の値がリンクになります。クリックすると対象テーブルが一致する行で絞り込まれて開きます。実際の外部キーは自動でリンクされます。","targetDatabase":"対象データベース","targetTable":"対象テーブル","targetColumn":"対象列","pickTable":"テーブルを選択","pickColumn":"列を選択","remove":"リンクを削除","cancel":"キャンセル","save":"リンクを保存","targetConnection":"対象の接続","targetNotConnected":"リンク先の接続が開いていません。先に接続してください。"},"running":{"label":"クエリ実行中…","elapsed":"{{seconds}}秒","stop":"中断","stopping":"中断中…","cannotCancel":"このエンジンは実行中の文を中断できません。","agentOutdated":"ローカルエージェントが古いためクエリを中断できません。`npx planche@latest`(または `planche upgrade`)で更新して再接続してください。","cancelFailed":"エージェントに接続できず、クエリを中断できませんでした。","abandoned":"リクエストの待機を中止しました。このエンジンには取り消し機能がないため、クエリはサーバー側で最後まで実行される場合があります。"},"plan":{"empty":"実行計画を表示 (Ctrl+Shift+E) を実行すると、カーソル位置の文をエンジンがどう処理するかを確認できます。","unreadable":"計画をツリーとして読み取れなかったため、エンジンの出力をそのまま表示します。","estimated":"推定値","analyzed":"実測値","estimatedHint":"オプティマイザの推定値です。文は実行されていません。","analyzedHint":"文を実際に実行しました。行数と時間は実測値です。","totalCost":"最大ノードコスト","totalTime":"最も遅いノード","rows":"推定行数","actualRows":"実際の行数","cost":"コスト","time":"時間","showRaw":"生の出力","showTree":"計画ツリー","selectNode":"ノードを選択すると、エンジンが報告した内容を確認できます。","noDetails":"このノードについて、エンジンからの追加情報はありません。","warnings":{"fullScan":"フルスキャン","noIndex":"インデックスなし","estimateOff":"推定のずれ","temporary":"一時テーブル","filesort":"ソート"},"hints":{"fullScan":"テーブルの全行を読みます。絞り込み列にインデックスがあれば回避できます。","noIndex":"このアクセスに使えるインデックスが見つかりませんでした。","estimateOff":"推定行数が大きく外れています。テーブル統計を更新すると改善することが多いです。","temporary":"次の処理に進む前に、行を一時テーブルに書き出します。","filesort":"インデックスを使わずに並べ替えています。ORDER BY に合うインデックスがあれば不要になります。"}},"structure":{"empty":"クエリ構造を表示 (Ctrl+Shift+G) すると、カーソル位置の文の行がどこから来るか分かります。","notQuery":"SELECT 文のみ構造グラフを描画できます。","unsupported":"{{engine}} の文は構造グラフとして読み取れません。","parseError":"文を解析できませんでした: {{message}}","columns_other":"{{count}} 列","columnsUnknown":"列数不明","fit":"全体に合わせる","reveal":"エディタでこの部分を選択","notDrawn":"未描画: {{what}}","kindTable":"テーブル","kindCte":"CTE","kindCteRef":"参照","kindDerived":"サブクエリ","kindScalar":"スカラー","kindSetop":"集合","kindResult":"結果","fullscreen":"全画面","exitFullscreen":"全画面を終了"}}'),p={defaultDescription:`この操作は元に戻せません。`,typeToConfirm:`確認のため <name/> を入力してください`,cancel:`キャンセル`,confirm:`確認`,ok:`OK`},m={dialog:{createTitle:`テーブルを作成`,alterTitle:`テーブルを変更`,duplicateTitle:`テーブル構造を複製`,create:`作成`,alter:`変更`,cancel:`キャンセル`,tableName:`テーブル名`,tableNamePlaceholder:`テーブル名を入力...`,loading:`テーブルスキーマを読み込み中...`,tabSchema:`スキーマ`,tabIndexes:`インデックス`,tabProperties:`プロパティ`,applying:`適用中…`,cannotAlterColumns:`{{engine}} は既存の列の定義を変更できません({{columns}})。列の追加・削除・名前変更とインデックスの変更は可能です。列の定義を変えるにはテーブルを作り直してください。`},schema:{colField:`フィールド名`,colType:`データ型`,colLength:`長さ`,colDefault:`デフォルト`,colPk:`PK`,colNotNull:`Not Null`,colUnsigned:`Unsigned`,colAutoIncrement:`Auto Incr`,colZerofill:`Zerofill`,colComment:`コメント`,empty:`カラムが定義されていません。「カラムを追加」をクリックして追加してください。`,add:`カラムを追加`,remove:`カラムを削除`},indexes:{colName:`インデックス名`,colType:`インデックスの種類`,colColumns:`カラム`,empty:`インデックスが定義されていません。「インデックスを追加」をクリックして追加してください。`,add:`インデックスを追加`,remove:`インデックスを削除`},index:{addTitle:`インデックスを追加`,editTitle:`インデックスを編集`,name:`インデックス名`,namePlaceholder:`インデックス名を入力`,type:`インデックスの種類`,columns:`カラム`,noColumns:`使用できるカラムがありません。先に「スキーマ」タブでカラムを定義してください。`,unnamed:`(名前なし)`,cancel:`キャンセル`,ok:`OK`},properties:{engine:`エンジン`,charset:`文字セット`,collation:`照合順序`,autoIncrement:`Auto Increment`,autoIncrementPlaceholder:`デフォルト`,comment:`コメント`},info:{engine:`エンジン`,version:`バージョン`,rowFormat:`行フォーマット`,rows:`行数`,avgRowLength:`平均行長`,dataLength:`データサイズ`,createTime:`作成日時`,updateTime:`更新日時`,collation:`照合順序`,comment:`コメント`},copy:{title:`テーブルをコピー`,source:`コピー元`,targetConnection:`コピー先の接続`,targetDatabase:`コピー先データベース`,targetTable:`コピー先テーブル名`,what:`コピー内容`,structureAndData:`構造とデータ`,structureOnly:`構造のみ`,ifExists:`コピー先にテーブルがある場合`,abort:`中止(既定)`,dropAndRecreate:`削除して再作成(名前の再入力で確認)`,preview:`コピー先で実行する CREATE TABLE(編集可)`,crossEngineHint:`コピー先は {{engine}} です。下の型を確認してください。MySQL 固有の属性は除外されました。`,readOnly:`読み取り専用`,loading:`読み込み中…`,progressCreate:`テーブルを作成中…`,progressCount:`行数を確認中…`,progressRows:`{{total}} 行中 {{copied}} 行をコピー済み`,progressDone:`完了`,doneTitle:`テーブルをコピーしました`,doneRows:`{{table}} に {{count}} 行をコピーしました。`,doneStructure:`{{table}} の構造を作成しました。`,noColumns:`コピー元テーブルに列がありません。`,exists:`コピー先に {{table}} が既に存在します。別の名前にするか「削除して再作成」を選んでください。`,dropTitle:`既存のテーブル {{table}} を削除しますか?`,dropDescription:`コピーの前にコピー先テーブルとすべての行が削除されます。元に戻せません。`,dropConfirm:`削除してコピー`,cancelled:`コピーを中止しました。`,stop:`停止`,cancel:`キャンセル`,copy:`コピー`}},h={copy:{title:`データベースをコピー`,source:`コピー元データベース`,target:`コピー先データベース名`,targetPlaceholder:`コピー先のデータベース名を入力`,options:`オプション`,structureAndData:`構造とデータ`,structureOnly:`構造のみ`,cancel:`キャンセル`,copy:`コピー`,creating:`{{database}} を作成中…`,copying:`{{table}} をコピー中 ({{index}}/{{total}})…`},diff:{title:`スキーマを比較`,source:`比較元`,target:`比較先`,pickConnection:`接続`,pickDatabase:`データベース`,crossEngineHint:`エンジンが異なります。型名は方言ごとに違うため、多くの列が型の変更として表示されます。`,sameSide:`比較元と比較先が同じデータベースです。`,summary:`変更 {{changed}}、比較先にない {{missingTarget}}、比較先のみ {{missingSource}}、同一 {{identical}}`,showIdentical:`同一のテーブルを表示`,identicalAll:`テーブルは同一です。`,column:`列`,index:`インデックス`,object:`オブジェクト`,selectTable:`差分を見るテーブルを選択してください。`,missingInTarget:`{{table}} は比較先にありません。スクリプトが作成します。`,missingInSource:`{{table}} は比較先にのみあります。スクリプトが削除します(DROP を含めない限りコメントアウト)。`,includeDrops:`DROP 文を実行可能な SQL として含める(既定: コメントアウト)`,tabTitle:`同期 {{database}}`,close:`閉じる`,compare:`比較`,comparing:`比較中…`,openScript:`スクリプトをエディタで開く`,noDefinition:`CREATE 文を取得できません`},create:{title:`データベースを作成`,name:`データベース名`,namePlaceholder:`データベース名を入力`,charset:`文字セット`,collation:`照合順序`,cancel:`キャンセル`,create:`作成`},csv:{title:`{{format}} でダウンロード`,target:`対象`,targetQueryResult:`現在のクエリ結果`,targetTableData:`テーブルデータ`,tableName:`テーブル名`,tableNamePlaceholder:`テーブル名を入力`,delimiter:`区切り文字`,delimiterComma:`カンマ (,)`,delimiterTab:`タブ (\\t)`,delimiterSemicolon:`セミコロン (;)`,delimiterPipe:`パイプ (|)`,includeHeaders:`ヘッダーを含める`,cancel:`キャンセル`,download:`ダウンロード`,downloading:`ダウンロード中...`,progress:`{{total}} 行中 {{loaded}} 行を書き込み`,progressUnknown:`{{loaded}} 行を書き込み`,stop:`停止`,done:`{{table}} の {{count}} 行を {{format}} にエクスポートしました。`,database:`データベース`,databasePlaceholder:`データベースを選択`},html:{title:`スキーマを HTML に出力`,database:`データベース`,selectDatabase:`データベースを選択`,tables:`含めるテーブル`,selectAll:`すべて選択`,deselectAll:`すべて解除`,noTables:`使用できるテーブルがありません。`,include:`含める項目`,includeColumns:`カラム`,includeIndexes:`インデックス`,includeProperties:`プロパティ`,cancel:`キャンセル`,generate:`生成`,generating:`生成中...`,sectionColumns:`カラム`,sectionIndexes:`インデックス`,sectionProperties:`プロパティ`,docTitle:`スキーマ: {{database}}`,heading:`データベース: {{database}}`,summary:`テーブル数: {{count}} | 生成日時: {{date}}`,footer:`Planche 2026 により生成`},dataDiff:{title:`データを比較`,pickTable:`テーブル`,hint:`比較元テーブルの主キーで行を対応付け、値をテキストとして比較します。片側あたり最大 {{cap}} 行を読み込むので、大きなテーブルは先にフィルタで絞ってください。`,sameSide:`比較元と比較先が同じテーブルです。`,noPrimaryKey:`{{table}} に主キーがないため、行を対応付けできません。`,keyMissingInTarget:`比較先テーブルにキー列がありません: {{columns}}`,summary:`キー: {{key}} — 比較先にない {{added}}、相違 {{changed}}、比較先のみ {{removed}}、同一 {{identical}}`,capped:`両側とも先頭 {{cap}} 行のみ比較しました。`,ignoredColumns:`比較から除外した列(片側のみ): {{columns}}`,added_other:`比較先にない {{count}}`,changed_other:`相違 {{count}}`,removed_other:`比較先のみ {{count}}`,none:`このグループには何もありません。`,more:`… 他 {{count}} 件`,includeDeletes:`DELETE 文を実行可能な SQL として含める(既定: コメントアウト)`,tabTitle:`データ同期 {{table}}`,loading:`行を読み込み中 — 比較元: {{source}}、比較先: {{target}}`},schema:{createTitle:`スキーマを作成`,name:`スキーマ名`,namePlaceholder:`スキーマ名を入力`,create:`作成`,cancel:`キャンセル`},groupBy:{title:`グループ集計`,description:`{{table}} の行を選択した列でまとめて数えます。`,columns:`グループ化する列`,aggregate:`追加の集計`,countOnly:`件数のみ`,column:`列`,minCount:`グループごとの最小行数`,useFilter:`グリッドの現在のフィルタを適用`,noIndexWarning:`選択した列にインデックスの先頭列がないため、テーブル全体を読み込んで並べ替えます。大きなテーブルでは時間がかかることがあります。`,preview:`クエリ`,pickColumn:`グループ化する列を 1 つ以上選択してください。`,openInTab:`新しいタブで開く`,run:`実行`,tabTitle:`{{table}} のグループ集計`,indexed:`インデックスの先頭列`,connection:`接続`,database:`データベース`,table:`テーブル`}},g={manager:{title:`ユーザー管理`,addUser:`ユーザーを追加`,removeUser:`ユーザーを削除`,noUsers:`ユーザーが読み込まれていません`,grantScope:`権限の範囲`,apply:`適用`,close:`閉じる`,removed:`ユーザー '{{user}}'@'{{host}}' を削除しました`,selectUserFirst:`先にユーザーを選択してください`,applied:`変更を適用しました`,noChanges:`適用する権限の変更はありません。`},add:{title:`ユーザーを追加`,username:`ユーザー名`,usernamePlaceholder:`ユーザー名を入力`,host:`ホスト`,password:`パスワード`,passwordPlaceholder:`パスワードを入力`,confirmPassword:`パスワードの確認`,confirmPasswordPlaceholder:`パスワードを再入力`,plugin:`プラグイン`,cancel:`キャンセル`,add:`追加`,usernameRequired:`ユーザー名は必須です`,passwordMismatch:`パスワードが一致しません`,added:`ユーザー '{{user}}'@'{{host}}' を追加しました`},privileges:{globalTitle:`グローバル権限`,databaseTitle:`データベース権限`,tableTitle:`テーブル権限`,checkAll:`すべてチェック`,uncheckAll:`すべて解除`,categoryData:`データ`,categoryStructure:`構造`,categoryAdministration:`管理`},grantTree:{globalPrivileges:`グローバル権限`}},_={close:`閉じる`,noActiveConnection:`アクティブな接続がありません`,variableName:`変数名`,value:`値`,scope:{session:`セッション`,global:`グローバル`},findReplace:{findPlaceholder:`検索`,replacePlaceholder:`置換`,found:`{{count}} 件見つかりました`,noResults:`結果なし`,previous:`前へ`,next:`次へ`,close:`閉じる`,replace:`置換`,all:`すべて`,caseSensitive:`大文字と小文字を区別`,regex:`正規表現`,wholeWord:`単語単位`},flush:{title:`フラッシュ`,executed:`実行しました: {{command}}`,executeError:`{{command}} の実行中にエラーが発生しました: {{message}}`},localHistory:{title:`ローカル履歴`,description:`この接続のエディタ内容のバージョンです。実行時、入力が止まったとき、タブを閉じたときに保存されます。`,empty:`保存されたバージョンはまだありません。`,noMatch:`検索に一致するバージョンがありません。`,notPersisted:`設定 > 安全 の「再読み込み後もクエリ履歴を保持」がオフのため、バージョンはこのセッション中のみ保持されます。`,searchPlaceholder:`バージョンを検索`,scopeTab:`このタブ`,scopeAll:`すべてのタブ`,compareCurrent:`現在と比較`,comparePrevious:`直前と比較`,diffAgainstCurrent:`現在のエディタ内容と比較`,diffAgainstPrevious:`{{time}} のバージョンと比較`,noPrevious:`比較できる以前のバージョンがありません`,restored:`ローカル履歴からエディタの内容を復元しました`,restore:`このバージョンを復元`,openInNewTab:`新しいタブで開く`,openedInTab:`新しいタブでバージョンを開きました`,delete:`このバージョンを削除`,clearAll:`履歴を消去`,chars:`{{count}}文字`,reason:{execute:`実行前`,edit:`編集中`,replaced:`上書き前`,restore:`復元前`,close:`閉じる前`}},processList:{title:`プロセス一覧`,refresh:`更新`,autoRefresh:`自動更新`,empty:`表示するプロセスがありません`,kill:`強制終了`,killProcess:`プロセスを強制終了`,selectToKill:`強制終了するプロセスを選択してください`,killed:`プロセス {{id}} を強制終了しました`,killError:`プロセスの強制終了中にエラーが発生しました: {{message}}`,loadError:`プロセス一覧の読み込み中にエラーが発生しました: {{message}}`,updatedAt:`{{time}} 更新`,filterPlaceholder:`ユーザー、ホスト、DB、SQL で絞り込み...`,hideIdle:`アイドルを隠す`,noMatch:`条件に一致するプロセスがありません`,self:`自分`,selfHint:`Planche 自身のセッションです`,statementOf:`#{{id}} の実行文`,noStatement:`実行中の文なし`,copy:`コピー`,copied:`コピー済み`,killConfirmTitle:`プロセス {{id}} を終了しますか?`,killConfirmDescription:`{{user}}@{{host}} のセッションが切断され、実行中の文は中断されます。開いているトランザクションはロールバックされます。`,stats:{total:`合計`,active:`アクティブ`,idle:`アイドル`,longest:`最長実行`},columns:{id:`Id`,user:`ユーザー`,host:`ホスト`,db:`db`,command:`コマンド`,time:`時間`,state:`状態`,info:`情報`,action:`操作`}},status:{title:`サーバーステータス`,filterPlaceholder:`ステータス変数を絞り込み...`,empty:`表示するステータス変数がありません`,loadError:`ステータスの読み込み中にエラーが発生しました: {{message}}`},variables:{title:`サーバー変数`,filterPlaceholder:`変数を絞り込み...`,empty:`表示する変数がありません`,loadError:`変数の読み込み中にエラーが発生しました: {{message}}`}},v={empty:{title:`Prisma スキーマファイル (.prisma) を開いて ERD を表示`,description:`モデル、enum、リレーションが自動的に解析されます`,openFile:`.prisma ファイルを開く`,dropHint:`またはこの領域にファイルをドラッグ&ドロップ`},entity:{enumBadge:`ENUM`,modelBadge:`MODEL`,columns:{value:`値`,comment:`コメント`,type:`型`,column:`カラム`},linkBadge:`リンク`,externalTitle:`{{location}} 上のリンク先テーブル(実際の外部キーではなく列リンク)`,nullable:`NULL を許可する列`},toolbar:{refresh:`更新`,zoomIn:`拡大`,zoomOut:`縮小`,resetView:`表示をリセット`,center:`中央に配置`,fitAll:`全体を表示`,spreadAll:`重なりを解消`,resetLayout:`レイアウトをリセット`,legendOneToMany:`1:N (FK)`,tables:`テーブル:`,relations:`リレーション:`,columns:`カラム:`,fullscreen:`全画面`,exitFullscreen:`全画面を終了`},viewer:{noServerConnection:`アクティブなサーバー接続がありません`,loading:`{{database}} からスキーマを読み込み中...`,loadFailed:`ERD の読み込みに失敗しました`,noDatabase:`データベースが選択されていません。`,selectDatabaseHint:`スキーマツリーでデータベースを選択してから、「ERD を表示」を開いてください。`}},y={runAnyway:`それでも実行`,query:{rowsReturned:`{{count}} 行を返しました`,rowsAffected:`{{count}} 行が影響を受けました`,rowsReturnedLimited:`{{count}} 行を返しました({{limit}} 行に制限。さらに取得するには LIMIT を追加してください)`,notConnected:`接続されていません`,fileNotOpen:`SQLite ファイルがまだ開かれていません — 上の「ファイルを再度開く」をクリックしてアクセスを再度許可してください。`,failed:`クエリが失敗しました`,nothingToExecute:`実行するものがありません`,dryRunMismatch:`ドライランは {{predicted}} 行を見込みましたが、実際に変更されたのは {{actual}} 行です。プレビュー後にデータが変わった可能性があり、そうでなければプレビューがこの文と一致していません。`},destructive:{title_other:`{{count}} 件の破壊的なステートメントを実行しますか?`,description:`次の操作はデータを完全に変更または削除します。この操作は元に戻せません。`,unknownTarget:`(不明)`,deleteAll:`{{target}} のすべての行を DELETE`,updateAll:`{{target}} のすべての行を UPDATE`,alterDrop:`{{target}} に対する DROP COLUMN/PARTITION`},readOnly:{refused:`接続 "{{label}}" は読み取り専用です。{{count}} 件のステートメントがデータまたはスキーマを変更しようとしました。`,title:`"{{label}}" は読み取り専用です`,description:`これらのステートメントはデータまたはスキーマを変更します。それでもこの接続で実行しますか?`},transaction:{startFailed:`トランザクションを開始できませんでした`,started:`トランザクションを開始しました — 終了時にコミットまたはロールバックしてください`,implicitCommit:`{{kind}} により、開いていたトランザクションが暗黙的に COMMIT されました`,committed:`トランザクションをコミットしました`,rolledBack:`トランザクションをロールバックしました`,commandFailed:`{{name}} に失敗しました`,commandFailedWith:`{{name}} に失敗しました: {{message}}`},save:{notBrowserSqlite:`ブラウザ SQLite 接続ではありません。`,inMemory:`インメモリデータベース: ダウンロードとしてのみエクスポートできます。`,noFileSystemAccess:`このブラウザには File System Access API がありません(Chrome/Edge のみ対応): データベースはその場に書き込む代わりにダウンロードとしてエクスポートされます。`,noWritableHandle:`ファイルは書き込み可能なハンドルなしで開かれました: ダウンロードとしてエクスポートされます。`},agent:{devProxyUrl:`{{url}}(開発用プロキシ経由)`,notPlanche:`応答はありましたが、Planche エージェントではありません`,unreachable:"{{url}} の Planche エージェントに到達できません — `npx planche` を実行してください({{message}})",httpError:`HTTP エラー: {{status}} {{statusText}}`,emptyResponse:`トンネリングサーバーが空の応答を返しました`,reconnected:`{{name}} に再接続しました — エージェントが接続を破棄していました (再起動またはアイドルタイムアウト)。`},sample:{profileName:`サンプルショップ(ブラウザ内)`,downloadFailed:`サンプルデータベースをダウンロードできませんでした({{status}})`,tabTitle:`クエリ 1`},sqliteFile:{tooSmall:`ファイルが小さすぎるため SQLite データベースではありません。`,notSqlite:`SQLite データベースではありません(または SQLCipher などで暗号化されています)。16 バイトのヘッダーが "SQLite format 3" ではありません。`,badPageSize:`SQLite ヘッダーが破損しています: 無効なページサイズ {{size}}。`,unreadable:`SQLite がファイルを読み取れませんでした: {{message}}`,pickerDescription:`SQLite データベース`,walNotLoaded:`このデータベースは WAL モードですが、-wal ファイルが読み込まれていません。保存する前に読み込むか、バナーで -wal ファイルが存在しないことを確認してください。`,changedOnDisk:`{{name}} は読み込み後にディスク上で変更されました(他のプログラムが書き込みました)。保存するとその変更が上書きされます — ファイルを再度開いて編集をやり直すか、トンネリングサーバーを使用してください。`,walHasChanges:`{{name}}-wal に新しい変更があります。保存する前に読み込んでください。`,walChangedOnDisk:`{{name}}-wal は読み込み後に他のプログラムによって書き込まれました。保存する前にファイルを再度開いてください。`,writeDenied:`{{name}} への書き込みアクセスが許可されませんでした。ブラウザのプロンプトで許可するか、代わりにダウンロードとしてエクスポートしてください。`},environment:{none:`なし`,green:`緑(開発)`,blue:`青`,yellow:`黄(ステージング)`,orange:`オレンジ`,red:`赤(本番)`,purple:`紫`},scratchpad:{profileName:`スクラッチパッド`,namePromptTitle:`スクラッチパッドのテーブル名`,namePromptDescription:`スクラッチパッドに {{table}} という名前のテーブルが既にあります。別の名前を入力してください。`,nameTaken:`テーブル {{table}} は既に存在します。`},federated:{pulling:`{{connection}} から {{table}} を取得中…`,capped:`{{table}}: 先頭 {{limit}} 行のみ取得しました。`,templateLine1:`開いている接続のテーブルを "接続名".database.table として参照します。文の実行前にこのスクラッチパッドへコピーされます。`,templateLine2:`テーブルごとに最大 {{limit}} 行。クエリ自体はブラウザ内の SQLite で実行されます。`,templateConnections:`開いている接続: {{names}}`,templateNone:`まだ他の接続が開いていません。接続してからここで参照してください。`,done:`リモートテーブル {{tables}} 個から {{rows}} 行をスクラッチパッドへ取得しました。`,pullingProgress:`{{connection}} から {{table}} を取得中: {{loaded}} / {{total}} 行…`},paged:{noColumns:`{{table}} に列がありません。`,cancelled:`キャンセルしました。`}},b={title:`利用規約`,version:`バージョン {{version}}`,englishOnly:`規約の全文は英語で提供されます。ようこそ画面の要約はお使いの言語で表示されます。`,privacyLink:`プライバシーポリシー`,refundLink:`返金ポリシー`,online:`planche.dev で読む`,updated:`最終更新 {{date}}`},x={title:`{{kind}} は {{count}} 行に影響します`,titleUnknown:`{{kind}} — 影響行数は不明`,description:`この文が今触れる行を SELECT で先に読んだものです。まだ何も書き込んでいません。`,previewFailed:`プレビュークエリが失敗しました: {{error}}
2
+ それでも文を実行できます。`,noRows:`一致する行がありません — この文は何も変更しません。`,truncated:`{{count}} 行のうち先頭 {{shown}} 行を表示しています。`,previewQuery:`プレビュークエリ`,run:`{{kind}} を実行({{count}} 行)`,runAnyway:`それでも実行`},S={badge:`PRO`,tooltip:`Pro ライセンスが必要です。`,noticeTitle:`Pro 機能`,notice:`PRO と表示された機能には Pro ライセンスが必要です。`,licenseTitle:`Planche Pro`,licenseDescription:`購入メールに記載されたライセンスキーを貼り付けてください。このコンピュータ上で確認し、どこにも送信しません。`,blocked:`{{feature}}には Pro ライセンスが必要です。`,keyLabel:`ライセンスキー`,activate:`有効化`,remove:`ライセンスを削除`,active:`Pro が有効です。`,licensedTo:`{{email}} 様のライセンス`,validUntil:`{{date}} まで有効`,expiredOn:`{{date}} に期限が切れました。Pro 機能を使い続けるには更新してください。`,invalidKey:`Planche のライセンスキーではありません。`,notConfigured:`このビルドはライセンスキーを確認できません。ご連絡ください。`,noWebcrypto:`このブラウザではライセンスキーを確認できません。`,pricing:`料金を見る`,features:{ssh_tunnel:`SSH トンネル`,compare_schemas:`スキーマ比較`,compare_data:`データ比較`,copy_table:`テーブルコピー`,dry_run:`ドライラン`,federated:`フェデレーテッドクエリ`,scratchpad:`スクラッチパッド`,column_link:`カラムリンク`,sync:`接続の同期`,ai_explain:`AI による説明`},included:`Pro に含まれる機能`,haveKey:`すでにライセンスキーをお持ちですか?`,perMonth:`/ 月`,priceNote:`年に 1 回 {{annual}} を請求。月払いは {{monthly}} です。`,featureDetails:{sync:`ブラウザで暗号化したプロファイルを、どのコンピュータでも`,ssh_tunnel:`踏み台の先のデータベースにパスワード・鍵・ssh-agent で接続`,compare_schemas:`開いている 2 つの接続を比較して ALTER スクリプトを取得`,compare_data:`2 つのテーブルの行を比較して INSERT・UPDATE スクリプトを取得`,copy_table:`別の接続へ、別のエンジンへテーブルを作り直す`,dry_run:`UPDATE・DELETE が何行をどう変えるのか実行前に確認`,federated:`異なる接続にあるテーブルを結合`,scratchpad:`作業データ用のローカル SQLite データベース`,column_link:`グリッドでたどれる仮想外部キー`,ai_explain:`失敗した文や遅いプランの理由をモデルに尋ねる — スキーマを添えて`}},C={npxNote:`Node.js 22 以上が必要です。恒久的にインストールされるものはなく、npx が npm レジストリから直接実行します。`,installNote:`Node.js は不要です。管理者権限なしでホームディレクトリの中だけにインストールされ、以後は planche コマンドでいつでも起動できます。`},w={unsupported:`{{engine}} は実行計画を提供しません。`,oneStatement:`実行計画は一度に 1 文だけ解析します。対象の文にカーソルを置くか選択してください。`},T={title:`AI アシスタント`,intro:`クエリを頼んだり、やることを指示してください — スキーマを読み、タブに SQL を書いて実行します。動くのは開いている接続だけで、会話は接続ごとに分かれています。`,privacy:`ツールが読んだ内容は、サンプル行を含めて利用中の provider に送信されます。planche.dev には何も送られません。`,placeholder:`例: デモ DB で月次売上のクエリを作って`,send:`送信`,stop:`停止`,clear:`新しい会話`,working:`実行中…`,tabTitle:`AI クエリ`,approvalTitle:`書き込みを伴います。実行しますか?`,approve:`実行`,reject:`スキップ`,rejected:`ユーザーが実行を拒否しました。`,notConfigured:`エージェントに AI キーがありません。設定 ▸ AI で追加してください。`,needsAgent:`このローカルエージェントはまだツールを実行できません。更新して再度ペアリングしてください。`,failed:`失敗`,empty:`まだ何も尋ねていません。`,steps:`{{count}} ステップ`,tooManySteps:`{{count}} ステップ進みましたが答えに至りませんでした。`,collapse:`折りたたむ`,planWarningTitle:`このクエリはフルスキャンです。実行しますか?`,interrupted:`リロードで中断されました。`,external:`Planche の外から要求された操作です`},E={title:`AI エージェントを接続 (MCP)`,description:`MCP に対応した AI エージェントから Planche のツールを使えるようにします。`,readsLabel:`読み取り`,reads:`開いているデータベースを読み、その結果は相手のプログラムに渡ります。`,writesLabel:`書き込み`,writes:`データを変更する文には承認が要ります。DROP と TRUNCATE は実行できません。`,needsLabel:`条件`,needs:`AI パネルが開いている必要があります。`,tokenLabel:`トークン`,token:`一つを複数のプログラムで共有します。失効させると全部切れます。`,command:`Claude Code に追加`,json:`手動で設定`,stored:`{{path}} に保存されます。`,revoke:`トークンを失効`,revoked:`失効しました。新しく発行するにはこの画面を開き直してください。`},D={title:`接続の同期`,description:`接続プロファイルをこのブラウザで暗号化し、planche.dev に保管します。ほかのコンピュータからもそのまま使えます。`,stored:`サーバーに置かれるのは暗号化された塊ひとつだけです。ホスト・ユーザー・パスワード・SSH 鍵を読むことはできません。`,unavailable:`同期は planche.dev でのみ動きます。この Planche はローカルエージェントが配信しており、エージェントは外部へ接続できないようにしてあります。`,signIn:`GitHub でログイン`,signedInAs:`{{email}} でログイン中`,signOut:`ログアウト`,createTitle:`パスフレーズを決める`,createHint:`このパスフレーズがプロファイルを暗号化します。サーバーには送られないため、失うと保管された控えは復元できません — プロファイルが残っているコンピュータから作り直すしかありません。`,passphrase:`パスフレーズ`,confirm:`パスフレーズの確認`,mismatch:`2 つのパスフレーズが一致しません。`,tooShort:`{{count}} 文字以上で入力してください。`,enable:`同期を有効にする`,unlockTitle:`プロファイルのロック解除`,unlockHint:`同期を有効にしたときに決めたパスフレーズを入力してください。`,unlock:`ロック解除`,wrongPassphrase:`パスフレーズが違うか、保管された控えが壊れています。`,syncNow:`今すぐ同期`,lastSynced:`最終同期 {{when}}`,neverSynced:`まだ同期していません`,profiles_one:`プロファイル {{count}} 件`,profiles_other:`プロファイル {{count}} 件`,changePassphrase:`パスフレーズを変更`,deleteVault:`サーバーから削除`,deleteVaultConfirm:`planche.dev にある暗号化された控えを削除しますか?このコンピュータのプロファイルはそのまま残ります。`,offline:`planche.dev に接続できません。`,working:`処理中…`,serverError:`planche.dev が処理を完了できませんでした。しばらくしてからお試しください。`,signInShort:`ログイン`,needsPro:`ログインしました。プロファイルの同期には Pro ライセンスが必要で、取得すればすぐに動きます。`,deleteAccount:`アカウントを削除`,deleteAccountConfirm:`アカウントを削除しますか?保管された控えとログイン情報も一緒に消えます。このコンピュータのプロファイルはそのまま残ります。`,notDeployed:`このサイトではまだ接続の同期が有効になっていません。`},O={app:e,language:t,settings:n,menu:r,about:i,connection:a,toolbar:o,footer:s,palette:c,welcome:l,schema:u,query:d,result:f,confirm:p,table:m,database:h,user:g,command:_,erd:v,services:y,terms:b,dryRun:x,pro:S,install:C,explain:w,ai:T,mcp:E,sync:D};export{i as about,T as ai,e as app,_ as command,p as confirm,a as connection,h as database,O as default,x as dryRun,v as erd,w as explain,s as footer,C as install,t as language,E as mcp,r as menu,c as palette,S as pro,d as query,f as result,u as schema,y as services,n as settings,D as sync,m as table,b as terms,o as toolbar,g as user,l as welcome};
@@ -0,0 +1,2 @@
1
+ var e={reconnecting:`다시 연결하는 중…`,dropSqlite:`놓으면 SQLite 파일이 열립니다`,dropSqliteHint:`WebAssembly로 브라우저 안에서 열리며 파일은 컴퓨터 밖으로 나가지 않습니다. -wal 파일이 있으면 함께 놓으세요.`,dropFailedTitle:`놓은 파일을 열 수 없습니다`,dropNotSqlite:`{{name}}은(는) SQLite 데이터베이스 파일이 아닙니다.`,crashTitle:`문제가 발생했습니다`,crashBody:`예상치 못한 오류가 발생했습니다. 새로고침하면 연결과 탭이 복원되며, 저장하지 않은 그리드 편집은 사라집니다.`,crashReload:`새로고침`},t={auto:`시스템 언어 ({{name}})`,en:`English`,ko:`한국어`,zh:`中文(简体)`,ja:`日本語`,de:`Deutsch`,fr:`Français`},n={title:`안전`,description:`실수로 데이터를 잃지 않도록 보호합니다. 읽기 전용, 환경 색상, 트랜잭션 모드는 연결별로 설정합니다.`,language:`언어`,languageHint:`즉시 적용됩니다. "시스템 언어"는 브라우저 설정을 따릅니다.`,resetDefaults:`기본값으로 재설정`,done:`완료`,analytics:`익명 사용 통계 보내기`,analyticsHint:`익명 사용 이벤트(엔진, 기능, 문장 종류)를 Google Analytics로 보냅니다. SQL 본문, 호스트명, 테이블·사용자 이름은 절대 보내지 않습니다.`,analyticsUnavailableHint:`이 빌드에서는 비활성입니다 (측정 ID 미설정).`,persistHistory:`새로고침 후에도 쿼리 히스토리 유지`,persistHistoryHint:`문장 텍스트가 이 브라우저에 저장됩니다(비밀번호 리터럴은 마스킹, 열려 있는 에디터 탭 자체는 항상 보존). 끄면 히스토리와 버전은 탭을 닫을 때까지만 유지됩니다.`,ai:{intro:`실패한 문장이나 느린 플랜의 이유를 모델에게 물어볼 수 있습니다. 질문은 이 앱에서 조립되어 로컬 에이전트가 아래 provider로 보냅니다 — SQL과 스키마는 planche.dev로 전혀 가지 않습니다.`,provider:`Provider`,openaiCompatible:`OpenAI 호환`,model:`모델`,baseUrl:`Base URL`,baseUrlHint:`비워 두면 provider 기본 엔드포인트를 씁니다. OpenAI 호환 서버면 무엇이든 됩니다 — Azure, OpenRouter, 로컬 Ollama.`,key:`API 키`,keyHint:`로컬 에이전트에 전달되어 거기서 쓰입니다. 이 브라우저에 저장되지 않고 planche.dev로도 보내지 않습니다.`,remember:`이 기계에 키를 기억`,rememberHint:`{{path}}에 본인만 읽을 수 있게 저장합니다. 체크하지 않으면 키는 실행 중인 에이전트 안에만 있고 종료하면 사라집니다.`,save:`저장`,forget:`키 삭제`,saved:`저장했습니다.`,none:`설정된 키가 없습니다.`,configuredSession:`이번 에이전트 세션에만 유효한 키가 설정되어 있습니다.`,configuredFile:`{{path}}에 키가 저장되어 있습니다.`,configuredEnv:`이 에이전트의 AI 설정은 환경변수에서 오므로 여기서 바꿀 수 없습니다.`,unreachable:`에이전트에 연결할 수 없어 AI 설정을 바꿀 수 없습니다.`,title:`AI 설명`,description:`실패나 플랜을 어느 모델이 설명하고, 누구의 키로 값을 치를지.`,cli:`로컬 CLI (키 없음)`,cliCommand:`명령`,cliHint:`이 기계에 이미 설치되고 로그인된 에이전트 CLI를 실행하므로 입력할 키가 없습니다. 실패와 플랜 설명에 쓰이며, AI 패널은 도구를 호출할 수 있는 provider가 필요합니다.`,cliNone:`이 기계에서 에이전트 CLI를 찾지 못했습니다. Claude Code나 Codex를 설치하거나 다른 provider를 고르세요.`,profile:`Anthropic (이 기계의 로그인)`,profileHint:"이 기계가 이미 로그인해 둔 자격증명을 씁니다 — `ant auth login` 이후 SDK가 알아서 찾습니다. 붙여 넣을 것이 없고, 로컬 CLI와 달리 진짜 API라서 AI 패널도 동작합니다.",profileNone:"이 기계에서 Anthropic 자격증명을 찾지 못했습니다. `ant auth login`을 실행하거나 키를 직접 입력하세요.",configuredChoice:`{{provider}} 사용 중 — 키는 보관하지 않으며, 선택은 {{path}}에 저장됩니다.`},query:{title:`쿼리`,description:`문장을 어떻게 실행할지: F9가 무엇을 돌리고, 몇 행을 받아오고, 무엇을 먼저 미리 보는지.`},general:{title:`일반`,description:`언어, 새로고침을 넘겨 남는 것, 그리고 이 기계를 떠나는 것.`}},r={settings:{safety:`안전…`,language:`언어`,title:`설정`,theme:`테마`,query:`쿼리…`,general:`일반…`,ai:`AI…`},help:{gettingStarted:`시작하기`,about:`Planche 정보`,title:`도움말`,documentation:`문서`,learn:`SQL 배우기`,terms:`이용약관`,license:`라이선스`,support:`문의하기`,mcp:`AI 에이전트 연결 (MCP)…`,privacy:`개인정보처리방침`},connection:{title:`연결`,connect:`연결`,disconnect:`연결 해제`,readOnly:`읽기 전용`,manualTransactions:`수동 트랜잭션`,saveDatabaseFile:`데이터베이스 파일 저장`,saveDatabaseFileBlocked:`데이터베이스 파일 저장 (-wal 파일을 먼저 불러오세요)`,exit:`종료`,sync:`연결 동기화`},query:{title:`쿼리`,execute:`실행`,executeStatementAtCursor:`커서 위치의 문장 실행`,executeWholeScript:`전체 스크립트 실행`,newQueryTab:`새 쿼리 탭`,findReplace:`찾기 및 바꾸기`,localHistory:`로컬 히스토리…`,explainPlan:`실행 계획 보기`,explainAnalyze:`실행 계획 측정 (문장을 실제로 실행)`,structure:`쿼리 구조`},edit:{title:`편집`,undo:`실행 취소`,redo:`다시 실행`,cut:`잘라내기`,copy:`복사`,paste:`붙여넣기`,selectAll:`모두 선택`},database:{title:`데이터베이스`,create:`데이터베이스 생성`,alter:`데이터베이스 변경`,drop:`데이터베이스 삭제`,copy:`데이터베이스 복사`,compare:`스키마 비교…`,truncate:`데이터베이스 비우기`,compareData:`데이터 비교…`,groupBy:`그룹 집계…`},table:{title:`테이블`,create:`테이블 생성`,alter:`테이블 변경`,drop:`테이블 삭제`,rename:`테이블 이름 변경`,truncate:`테이블 비우기`,duplicateStructure:`테이블 구조 복제`},export:{title:`내보내기`,csv:`CSV로 다운로드`,tsv:`TSV로 내려받기`,schemaHtml:`스키마를 HTML로`,links:`컬럼 링크 내보내기…`,importLinks:`컬럼 링크 가져오기…`},tools:{title:`도구`,userManager:`사용자 관리`,processList:`프로세스 목록`,variables:`변수`,status:`상태`,flush:`플러시`,quickCommand:`빠른 명령`,viewErd:`ERD 보기`,scratchpad:`스크래치패드 (브라우저 SQLite)`,federated:`Federated 쿼리 (연결 간 조인)…`,federatedTab:`Federated {{n}}`,ai:`AI 어시스턴트`},messages:{databaseFileSaved:`데이터베이스 파일을 저장했습니다`,databaseExported:`데이터베이스를 다운로드로 내보냈습니다`,databaseExportedWithReason:`데이터베이스를 다운로드로 내보냈습니다 — {{reason}}`,errorSavingDatabase:`데이터베이스 저장 오류: {{message}}`,noDatabaseSelected:`선택된 데이터베이스가 없습니다`,noTableSelected:`선택된 테이블이 없습니다`,noActiveConnection:`활성 연결이 없습니다`,databaseDropped:`데이터베이스 "{{database}}"을(를) 삭제했습니다`,errorDroppingDatabase:`데이터베이스 삭제 오류: {{message}}`,noTablesInDatabase:`데이터베이스 "{{database}}"에 테이블이 없습니다`,databaseTruncated_other:`"{{database}}"의 테이블 {{count}}개를 모두 비웠습니다`,errorTruncatingDatabase:`데이터베이스 비우기 오류: {{message}}`,tableDropped:`테이블 "{{table}}"을(를) 삭제했습니다`,errorDroppingTable:`테이블 삭제 오류: {{message}}`,tableTruncated:`테이블 "{{table}}"을(를) 비웠습니다`,errorTruncatingTable:`테이블 비우기 오류: {{message}}`,renameTablePrompt:`테이블 "{{table}}"의 새 이름:`,tableRenamed:`테이블 "{{table}}"의 이름을 "{{newName}}"(으)로 변경했습니다`,errorRenamingTable:`테이블 이름 변경 오류: {{message}}`,truncateDatabaseTitle:`"{{name}}"의 모든 테이블을 비우시겠습니까?`,truncateDatabaseDescription:`"{{name}}"의 테이블 {{count}}개에 있는 모든 행이 삭제됩니다. 테이블 구조는 유지됩니다. 이 작업은 되돌릴 수 없습니다.`,truncateDatabaseConfirm:`모든 테이블 비우기`,renameTableTitle:`테이블 이름 변경`,renameTableConfirm:`이름 변경`,noLinksToExport:`내보낼 컬럼 링크가 없습니다.`,linksExported:`컬럼 링크 {{count}}개를 내보냈습니다.`,linksImported:`컬럼 링크 {{count}}개를 가져왔습니다.`,linksImportedPartial:`컬럼 링크 {{count}}개를 가져왔습니다. 일치하는 프로필이 없음: {{profiles}}`,linksImportFailed:`컬럼 링크를 가져오지 못했습니다: {{reason}}`}},i={title:`Planche 정보`,tagline:`MySQL, MariaDB, PostgreSQL, SQLite용 데이터베이스 클라이언트.`,version:`버전`,website:`웹사이트`,licenses:`라이선스`,licensesLink:`서드파티 고지`,disclaimer:`Planche는 어떠한 보증도 없이 "있는 그대로" 제공됩니다. 사용 중 발생하는 손해나 데이터 손실에 대해 저작자는 책임지지 않습니다. 파괴적인 구문을 실행하기 전에 데이터를 백업하세요.`,rights:`All rights reserved.`,legal:`약관`,terms:`이용약관`,privacy:`개인정보`,refund:`환불`},a=JSON.parse('{"dialog":{"title":"데이터베이스에 연결","firstQueryTab":"쿼리 1","colHostName":"호스트 이름","colTarget":"대상","colDbms":"DBMS","noSaved":"저장된 연결이 없습니다","unnamed":"(이름 없음)","pickOnConnect":"(연결 시 선택)","noFile":"(파일 없음)","selectPrompt":"연결을 선택하거나 새로 추가하세요","addNew":"새로 추가","delete":"삭제","testConnection":"연결 테스트","connect":"연결","close":"닫기","unknownError":"알 수 없는 오류","browserTestHint":"브라우저 내 SQLite 연결은 연결 버튼을 누를 때 로컬 파일을 엽니다.","testSuccess":"연결 성공","restoredUnsaved":"{{file}}: 캐시된 사본에서 저장되지 않은 변경 사항을 복원했습니다","restoredUnsavedDiskChanged":"{{file}}: 캐시된 사본에서 저장되지 않은 변경 사항을 복원했습니다 — 그 사이 디스크의 파일이 변경되었습니다","walPending":"{{file}}은(는) WAL 모드입니다: 최근 변경 사항이 -wal 파일에 남아 있을 수 있습니다. 위의 \\"-wal 파일 불러오기\\"로 반영할 수 있습니다.","walApplied":"{{file}}을(를) -wal 변경 사항을 적용하여 열었습니다","connectFailedTitle":"연결 실패","testSuccessDescription":"서버가 접속 정보를 확인했습니다.","testFailedTitle":"연결 테스트 실패","privacy":"여기에 입력한 어떤 정보도 planche.dev 서버로 전송되거나 저장되지 않습니다. 연결 프로필은 오직 이 브라우저의 로컬 저장소에만 저장되며, 쿼리는 로컬 에이전트에서 데이터베이스로 직접 전달됩니다.","hostKeyTitle":"알 수 없는 SSH 호스트 키","hostKeyDescription":"{{host}}:{{port}}이(가) 지문 {{fingerprint}}의 {{type}} 키를 제시했습니다. 서버 관리자에게 받은 지문과 비교하세요. 잘못된 키를 수락하면 공격자가 트래픽을 읽을 수 있습니다.","hostKeyAccept":"이 호스트 신뢰","gatewayTitle":"게이트웨이 프로필","gatewayAdd":"추가","gatewayAdded":"게이트웨이 프로필 {{name}}을(를) 추가했습니다.","gatewayReadOnly":"읽기 전용","gatewayWritable":"쓰기 가능","gatewayProfileHint":"이 연결은 게이트웨이가 보관하는 \\"{{name}}\\" 프로필을 사용합니다. 여기서 설정할 것은 없습니다.","gatewayLoadFailed":"게이트웨이 프로필을 불러오지 못했습니다: {{error}}"},"form":{"hostName":"호스트 이름","hostNamePlaceholder":"내 연결","dataSource":"데이터 소스","openVia":"여는 방식","viaBrowser":"브라우저 (로컬 파일)","viaAgent":"로컬 에이전트","viaBrowserHint":"설치가 필요 없습니다. 다른 프로그램이 사용하지 않는 파일에 적합합니다: 브라우저는 메모리 사본으로 작업하며 파일을 잠글 수 없으므로, 열려 있는 동안 다른 곳에서 수정한 내용은 보이지 않고 저장 시 덮어씁니다.","viaAgentHint":"npx planche를 통해 SQLite로 직접 파일을 엽니다 — 제대로 된 잠금과 WAL을 지원하므로 같은 데이터베이스를 사용하는 다른 프로그램과 함께 써도 안전합니다.","databaseFile":"데이터베이스 파일","changeFile":"파일 변경","filePickerHint":"연결 버튼을 누르면 파일 선택 창이 열립니다 (팁: ⌘⇧. 는 숨김 파일 표시, ⌘⇧G 로 경로를 직접 입력할 수 있습니다).","fileRememberedHint":"선택한 파일은 기억되므로(Chromium) 다시 연결할 때는 권한만 요청합니다. 변경 사항을 파일에 쓰려면 연결 > 데이터베이스 파일 저장을 사용하세요.","authToken":"인증 토큰","authTokenPlaceholder":"비워 두면 페어링된 에이전트 토큰을 사용합니다","filePathPlaceholder":"/path/to/database.sqlite 또는 :memory:","createIfMissing":"없으면 생성","createIfMissingHint":"경로는 터널링 서버 호스트 기준으로 해석됩니다","host":"호스트","port":"포트","database":"데이터베이스","serviceName":"서비스 이름","user":"사용자","password":"비밀번호","savePassword":"비밀번호 저장","savePasswordHint":"끄면 비밀번호는 이 브라우저 세션 동안만 유지되며 디스크에 기록되지 않습니다.","charset":"문자셋","autoConnection":"자동 연결","safety":"안전","environment":"환경","environmentHint":"탭과 작업 공간에 색을 입힙니다","readOnly":"읽기 전용","readOnlyHint":"데이터나 스키마를 변경하는 구문을 거부합니다","transactions":"트랜잭션","txAuto":"자동 커밋","txManual":"수동 — 툴바에서 커밋 / 롤백","ssh":"SSH","sshTunnel":"SSH 터널","sshTunnelHint":"SSH 점프 호스트를 거쳐 데이터베이스에 접속합니다 (로컬 에이전트가 터널을 엽니다)","sshHost":"SSH 호스트","sshPort":"SSH 포트","sshUser":"SSH 사용자","sshAuth":"SSH 인증","sshAuthKey":"개인 키","sshAuthPassword":"비밀번호","sshAuthAgent":"ssh-agent","sshAuthAgentHint":"npx planche를 실행 중인 컴퓨터의 ssh-agent에 로드된 키를 사용합니다 (SSH_AUTH_SOCK).","sshPassword":"SSH 비밀번호","sshKey":"개인 키","sshKeyPick":"키 파일 선택…","sshKeyLoaded":"키 불러옴","sshKeyHint":"비우면 에이전트 컴퓨터의 ~/.ssh/config IdentityFile(또는 ~/.ssh/id_*)을 사용합니다. 선택한 키는 이 프로필과 함께 저장됩니다","sshPassphrase":"패스프레이즈","sshPassphrasePlaceholder":"키에 패스프레이즈가 없으면 비워 두세요","sshSecretsHint":"SSH 비밀번호, 개인 키, 패스프레이즈는 위의 \\"비밀번호 저장\\" 설정을 따릅니다. 알 수 없는 호스트 키는 첫 연결 전에 확인할 수 있게 표시되며 에이전트 컴퓨터의 ~/.planche/known_hosts에 저장됩니다.","sshHostPlaceholder":"bastion.example.com 또는 ~/.ssh/config의 Host 별칭","sshUserPlaceholder":"비우면 ~/.ssh/config의 User 사용","sshTargetHint":"DB 호스트/포트는 점프 호스트에서 해석됩니다 — localhost나 로컬 포트 포워드가 아니라 DB의 실제 주소(예: RDS 엔드포인트)를 넣으세요.","connectionString":"연결 문자열","connectionStringApplied":"아래 필드에 반영되었습니다. 문자열 자체는 저장되지 않고 필드만 저장됩니다.","connectionStringInvalid":"PostgreSQL URI가 아닙니다 (postgresql://user:password@host/database 형식).","neonHint":"Neon 콘솔(Connect > Connection string)의 URI를 붙여넣으면 아래 필드가 채워집니다.","supabaseHint":"Supabase(Connect > Session pooler 또는 Direct connection)의 URI를 붙여넣으면 아래 필드가 채워집니다.","supabasePoolerWarning":"6543 포트는 트랜잭션 모드 풀러입니다. 문장마다 다른 백엔드에서 실행될 수 있어 스키마 전환, 임시 테이블, prepared statement, 수동 트랜잭션이 동작하지 않습니다. 세션 풀러(5432 포트)나 직접 연결을 사용하세요.","managedTlsHint":"이 서비스는 항상 TLS로 연결되며, 로컬 에이전트에서 서비스로 직접 접속합니다 (SSH 터널 없음).","d1AccountId":"Account ID","d1DatabaseId":"Database ID","d1ApiToken":"API 토큰","d1Hint":"Account ID: Cloudflare 대시보드 계정 홈 오른쪽. Database ID: Storage & Databases > D1 > 데이터베이스. 토큰: My Profile > API Tokens > Create Token에서 \\"D1 Edit\\" 권한(읽기 전용은 \\"D1 Read\\"). 로컬 에이전트가 이 토큰으로 Cloudflare API를 호출합니다.","d1LimitsHint":"D1은 요청마다 독립적으로 실행되고 자동 커밋되므로 수동 트랜잭션을 쓸 수 없습니다. 데이터베이스는 \\"main\\" 스키마 하나로 표시됩니다.","doDevUrl":"wrangler dev URL","doHint":"Worker 프로젝트에서 `wrangler dev`를 실행하고 출력된 URL을 넣으세요(기본 포트 8787). 로컬 에이전트가 해당 세션의 Durable Object를 읽으며, 동시에 실행 중인 다른 `wrangler dev` 세션도 함께 보입니다.","doLimitsHint":"로컬 개발 전용입니다. 배포된 Durable Object는 Worker 안에서만 접근할 수 있어 Cloudflare가 조회 API를 제공하지 않습니다. 각 오브젝트는 \\"<네임스페이스>/<오브젝트>\\" 이름의 데이터베이스로 표시되고, 요청마다 자동 커밋되므로 수동 트랜잭션은 쓸 수 없습니다.","tls":"TLS","tlsEnable":"연결 암호화","tlsVerify":"서버 인증서 검증","tlsVerifyHint":"끄면 자체 서명 인증서도 허용됩니다(암호화는 되지만 서버 신원은 확인하지 않음). SSH 터널에서는 사용할 수 없습니다.","d1DevUrl":"로컬 개발 URL","d1DevUrlHint":"비워두면 Cloudflare 계정으로 접속합니다. 입력하면 이 컴퓨터에서 `wrangler dev`가 띄운 데이터베이스를 직접 읽습니다 — 계정도 API 토큰도 필요 없고 아래 계정 항목은 무시됩니다. 개발 서버에 D1이 하나뿐이면 Database ID는 비워두세요.","d1PickDatabase":"데이터베이스 선택"},"agent":{"copy":"복사","looking":"Planche 에이전트를 찾는 중…","online":"에이전트 <b>v{{version}}</b>이(가) <mono>{{url}}</mono>에서 실행 중입니다","outdated":"에이전트 v{{version}}은(는) 프로토콜 {{protocol}}을(를) 사용하지만 이 앱에는 더 새로운 버전이 필요합니다. <cmd/> 로 다시 시작하세요","unauthorized":"에이전트 <b>v{{version}}</b>이(가) <mono>{{url}}</mono>에서 실행 중이지만 이 앱과 페어링되어 있지 않습니다(토큰은 시작할 때마다 바뀝니다). 에이전트 터미널에 출력된 링크를 열거나, 설정에서 토큰을 붙여 넣으세요.","offline":"<mono>{{url}}</mono>에 에이전트가 없습니다. 터미널에서 실행하세요 — 페어링된 상태로 이 앱이 열립니다.","close":"닫기","configure":"설정","checkAgain":"다시 확인","urlLabel":"에이전트 URL","urlPlaceholder":"http://127.0.0.1:8888 (기본값)","tokenLabel":"토큰","tokenPlaceholder":"에이전트가 출력한 값","reset":"초기화","save":"저장","remoteWarning":"이 에이전트는 내 컴퓨터에 있지 않습니다({{host}}): 모든 연결의 비밀번호와 SSH 키가 그곳으로 전송됩니다.","remoteRefusedTitle":"원격 에이전트를 사용할 수 없습니다","remoteRefused":"에이전트는 이 컴퓨터(127.0.0.1 또는 localhost)에서 실행되어야 합니다. 다른 컴퓨터의 에이전트를 쓰려면 `ssh -L 8888:127.0.0.1:8888 user@host`로 포트를 포워딩하고 URL은 http://127.0.0.1:8888 그대로 두세요.","gateway":"게이트웨이 \\"{{name}}\\": 서버 측 프로필 {{count}}개. 자격 증명은 게이트웨이에만 있으며 아래에서 프로필을 고르세요."},"tab":{"noConnections":"열린 연결이 없습니다. 연결 버튼을 눌러 시작하세요.","theSqliteFile":"SQLite 파일","reopened":"{{file}}을(를) 다시 열었습니다","reopenFailed":"파일을 다시 열 수 없습니다: {{message}}","reopenPrompt":"<b>{{file}}</b>을(를) 읽으려면 브라우저 권한이 다시 필요합니다.","reopenFile":"파일 다시 열기","closeConnection":"연결 닫기","reconnected":"{{file}}을(를) 다시 연결했습니다","accessNotGranted":"파일 접근 권한이 허용되지 않았습니다. 저장 시 다운로드로 내보냅니다.","detachedPrompt":"<b>{{file}}</b>의 캐시된 사본으로 작업 중입니다. 변경 사항을 파일에 직접 저장하려면 파일을 다시 연결하세요.","reconnectFile":"파일 다시 연결","detachedHide":"숨기기 (저장 시 필요하면 파일을 요청합니다)","walFramesApplied_one":"{{file}}-wal 에서 WAL 프레임 {{count}}개를 적용했습니다","walFramesApplied_other":"{{file}}-wal 에서 WAL 프레임 {{count}}개를 적용했습니다","walNoChanges":"-wal 파일에 커밋된 변경 사항이 없습니다","walLoadFailed":"-wal 파일을 불러올 수 없습니다: {{message}}","walPrompt":"<b>{{file}}</b>은(는) WAL 모드입니다: <mono>{{file}}-wal</mono> 파일을 불러오기 전에는 최신 데이터가 보이지 않을 수 있으며, 그때까지 저장이 비활성화됩니다. 옆에 그런 파일이 없다면(데이터베이스가 정상적으로 닫힌 경우) 없음을 확인해 주세요. 다른 프로그램이 이 데이터베이스를 아직 사용 중이라면 로컬 에이전트(<mono>npx planche</mono>)를 통해 여세요: 브라우저는 파일을 안전하게 공유할 수 없습니다.","loadWal":"-wal 파일 불러오기","noWalHint":"확인했습니다: 데이터베이스 옆에 -wal 파일이 없습니다","noWal":"-wal 파일 없음","dismiss":"닫기","walHide":"숨기기 (저장은 계속 비활성화됩니다)","readOnlyBadge":"읽기 전용"}}'),o={connect:`연결 (Alt+N)`,disconnect:`연결 해제`,newQueryTab:`새 쿼리 탭 (Alt+T)`,execute:`실행 (F9)`,executeStatement:`커서 위치 / 선택 영역의 문장 실행 (Ctrl+Enter)`,commit:`커밋`,commitHint:`열린 트랜잭션을 커밋합니다`,noOpenTransaction:`열린 트랜잭션이 없습니다`,rollback:`롤백`,rollbackHint:`열린 트랜잭션을 취소합니다`,readOnlyBadge:`읽기 전용`,readOnlyHint:`이 연결은 데이터나 스키마를 변경하는 문장을 거부합니다`,userManager:`사용자 관리 (Alt+U)`,quickCommand:`빠른 명령`,processList:`프로세스 목록`,variables:`변수`,status:`상태`,flush:`플러시`,fullscreen:`전체 화면`},s={readOnly:`읽기 전용`,txOpen:`트랜잭션 열림`,manualTx:`수동 트랜잭션`},c={title:`빠른 명령`,description:`실행할 명령을 검색합니다...`,inputPlaceholder:`명령을 입력하거나 검색하세요...`,empty:`일치하는 명령이 없습니다.`,groups:{connection:`연결`,query:`쿼리`,database:`데이터베이스`,table:`테이블`,tools:`도구`},commands:{connect:`연결`,disconnect:`연결 해제`,executeQuery:`쿼리 실행`,newQueryTab:`새 쿼리 탭`,createDatabase:`데이터베이스 생성`,dropDatabase:`데이터베이스 삭제`,createTable:`테이블 생성`,alterTable:`테이블 변경`,dropTable:`테이블 삭제`,processList:`프로세스 목록`,serverVariables:`서버 변수`,serverStatus:`서버 상태`,flush:`Flush`,userManager:`사용자 관리`}},l={title:`Planche에 오신 것을 환영합니다`,intro:`브라우저에서 실행되는 SQL 클라이언트입니다. 데이터베이스에는 내 컴퓨터에서 실행되는 작은 에이전트를 통해 접속하므로, 인증 정보와 데이터가 컴퓨터 밖으로 나가지 않습니다.`,skip:`건너뛰기`,skipTitle:`이 화면을 숨깁니다 (도움말 > 시작하기에서 다시 열 수 있습니다)`,copy:`복사`,copied:`복사됨`,sampleOpenFailed:`샘플 데이터베이스를 열 수 없습니다: {{message}}`,steps:{agent:{title:`로컬 에이전트 실행`,body:`터미널에서 아래 중 하나를 실행합니다. 에이전트가 시작되고 이 페이지와 페어링됩니다.`},connection:{title:`연결 추가`,body:`사용할 데이터베이스를 선택하면 알맞은 기본값이 채워진 연결 폼이 열립니다.`},sample:{title:`사용할 데이터베이스가 없다면 샘플을 사용해 보세요`,body:`샘플 웹숍 데이터베이스(테이블 24개, 약 5만 행, 뷰와 트리거 포함)를 브라우저에 불러와 에디터, 그리드, 스키마 트리를 사용해 볼 수 있습니다.`,loading:`샘플 불러오는 중…`,button:`샘플 데이터베이스 사용해 보기`}},terms:{title:`시작하기 전에`,local:`모든 작업은 로컬에서 실행됩니다. 접속 정보, 쿼리, 결과는 사용자의 컴퓨터에만 남고 저희에게 전송되지 않습니다.`,asIs:`Planche는 있는 그대로 제공되며 어떠한 보증도 하지 않습니다. 안전장치(위험 작업 확인, 읽기 전용 모드)는 편의 기능이지 보장이 아닙니다.`,dataLoss:`Planche를 통해 실행되는 모든 구문의 책임은 사용자에게 있습니다. 데이터를 변경하거나 삭제하기 전에 반드시 백업하세요.`,agree:`이용약관을 읽었으며 이에 동의합니다.`,accepted:`이용약관에 동의하셨습니다.`,readFull:`약관 전문 보기`}},u={treeLabel:`스키마`,unreachableHint:`이 연결이 바인딩된 데이터베이스가 아닙니다. 탐색하려면 해당 데이터베이스용 프로필을 만드십시오`,objectType:{table:`테이블`,view:`뷰`,procedure:`프로시저`,function:`함수`,trigger:`트리거`,event:`이벤트`},menu:{showCreate:`{{type}} 생성문 보기`,alter:`{{type}} 수정`,drop:`{{type}} 삭제`,create:`{{type}} 생성`,refresh:`새로 고침`,unreachable:`이 데이터베이스를 탐색하려면 해당 데이터베이스에 바인딩된 프로필로 연결하십시오`,openDatabase:`데이터베이스 열기`,createSchema:`스키마 생성…`,createTable:`테이블 생성`,dropDatabase:`데이터베이스 삭제`,openSchema:`스키마 열기`,dropSchema:`스키마 삭제`,newQueryTab:`새 쿼리 탭`,generateSql:`SQL 생성`,openTable:`테이블 열기`,alterTable:`테이블 수정`,showCreateTable:`테이블 생성문 보기`,duplicateStructure:`구조 복제`,copyTable:`다른 위치로 테이블 복사…`,compare:`{{type}} 비교…`,truncateTable:`테이블 비우기 (TRUNCATE)`,dropTable:`테이블 삭제`,exportCsv:`CSV로 내보내기`,exportTsv:`TSV로 내보내기…`,openView:`뷰 열기`,alterView:`뷰 수정`,showCreateView:`뷰 생성문 보기`,dropView:`뷰 삭제`,compareData:`데이터 비교…`,groupBy:`그룹 집계…`},actions:{createStatementUnavailable:`-- {{type}} {{name}}의 CREATE 문을 가져올 수 없습니다`,getCreateFailed:`CREATE {{type}} 조회에 실패했습니다: {{message}}`,createTabTitle:`{{type}} 생성`,createSchemaTabTitle:`스키마 생성`,generateSqlFailed:`SQL을 생성하지 못했습니다: {{message}}`,dropTableTitle:`테이블 "{{name}}"을(를) 삭제하시겠습니까?`,dropTableDescription:`{{from}}테이블과 그 안의 모든 행이 영구적으로 삭제됩니다. 이 작업은 되돌릴 수 없습니다.`,dropTableConfirm:`테이블 삭제`,dropObjectTitle:`{{type}} "{{name}}"을(를) 삭제하시겠습니까?`,dropObjectDescription:`{{from}}{{type}} 정의가 제거됩니다. 이 작업은 되돌릴 수 없습니다.`,dropObjectConfirm:`{{type}} 삭제`,fromDatabase:`데이터베이스 "{{database}}"에서 `,dropped:`{{type}} {{name}}을(를) 삭제했습니다`,dropFailed:`{{type}} 삭제에 실패했습니다`,dropDatabaseTitle:`데이터베이스 "{{name}}"을(를) 삭제하시겠습니까?`,dropDatabaseDescription:`데이터베이스와 그 안의 모든 테이블 및 데이터가 영구적으로 삭제됩니다. 이 작업은 되돌릴 수 없습니다.`,dropDatabaseConfirm:`데이터베이스 삭제`,droppedDatabase:`데이터베이스 {{name}}을(를) 삭제했습니다`,dropDatabaseFailed:`데이터베이스 삭제에 실패했습니다`,dropSchemaTitle:`스키마 "{{name}}"을(를) 삭제하시겠습니까?`,dropSchemaDescription:`스키마와 그 안의 모든 테이블 및 데이터가 영구적으로 삭제됩니다. 이 작업은 되돌릴 수 없습니다.`,dropSchemaConfirm:`스키마 삭제`,droppedSchema:`스키마 {{name}}을(를) 삭제했습니다`,dropSchemaFailed:`스키마 삭제에 실패했습니다`,truncateTitle:`테이블 "{{name}}"을(를) 비우시겠습니까?`,truncateDescription:`"{{name}}"의 모든 행이 삭제됩니다. 테이블 구조는 유지됩니다. 이 작업은 되돌릴 수 없습니다.`,truncateConfirm:`테이블 비우기`,truncated:`{{name}}을(를) 비웠습니다`,truncateFailed:`테이블 비우기에 실패했습니다`},tree:{loadDatabasesFailed:`데이터베이스 목록을 불러오지 못했습니다: {{message}}`}},d={editor:{destructiveMarker:`파괴적 구문: {{action}} {{names}}`,readOnlyMarker:`읽기 전용 연결입니다. 이 구문은 데이터 또는 스키마를 변경합니다`,actionExecute:`실행 (설정에 따라)`,actionExecuteStatement:`커서 위치 / 선택 영역의 구문 실행`,actionExecuteScript:`전체 스크립트 실행`,actionExplainPlan:`실행 계획 보기`,actionQueryStructure:`쿼리 구조`},tabs:{newQuery:`새 쿼리`,queryTitle:`쿼리 {{n}}`,erdViewer:`ERD 뷰어`,close:`닫기`,closeOthers:`다른 탭 닫기`,closeLeft:`왼쪽 탭 닫기`,closeRight:`오른쪽 탭 닫기`,closeAll:`모두 닫기`},executor:{noActiveConnection:`활성 연결이 없습니다`,uncommittedTitle:`커밋되지 않은 트랜잭션`,uncommittedDescription:`이 연결에 열린 트랜잭션이 있습니다. 연결을 끊으면 변경 사항이 롤백됩니다.`,uncommittedConfirm:`롤백 후 연결 끊기`,unsavedTitle:`저장되지 않은 변경 사항`,unsavedDescription:`{{file}}에 파일로 저장되지 않은 변경 사항이 있습니다. 연결을 끊으면 변경 사항이 사라집니다 (유지하려면 먼저 연결 > 데이터베이스 파일 저장을 사용하십시오).`,theSqliteDatabase:`SQLite 데이터베이스`,unsavedConfirm:`변경 사항 버리고 연결 끊기`}},f=JSON.parse('{"tabs":{"message":"메시지","info":"정보","history":"히스토리","result":"결과","resultN":"결과 {{n}}","plan":"실행 계획","structure":"구조","structureN":"구조 {{n}}"},"message":{"executing":"쿼리를 실행하는 중...","error":"오류: {{message}}","total":" (총 {{ms}}ms)","ready":"준비됨.","log":"실행 로그","statementN":"구문 {{n}}","limitedBadge":"제한 도달","insertId":"insert id {{id}}","failed":"실패","failedStatement":"실패한 구문","summary":"성공 {{ok}} · 실패 {{failed}} · 총 {{ms}}","copy":"복사","copied":"복사됨","showSql":"SQL 보기","hideSql":"SQL 숨기기"},"hints":{"title":"힌트","unknownColumn":"{{name}} 컬럼이 없습니다. {{suggestions}}을(를) 찾으셨나요?","unknownTable":"{{name}} 테이블이 없습니다. {{suggestions}}을(를) 찾으셨나요?","syntaxSwap":"{{engine}}에서는 {{found}} 대신 {{expected}}를 씁니다.","doubleQuotedLiteral":"{{engine}}는 \\"{{value}}\\"를 문자열이 아니라 컬럼 이름으로 읽습니다. 문자열은 \'{{value}}\'로 씁니다."},"ai":{"title":"AI 설명","explain":"AI로 설명 보기","thinking":"실패를 읽는 중…","by":"{{model}}","applyFix":"수정문을 새 탭에서 열기","failed":"설명하지 못했습니다: {{message}}","noFailure":"설명할 실패한 문장이 없습니다.","noPack":"planche.dev에서 프롬프트를 받아오지 못했습니다.","badShape":"모델이 예상한 형식으로 답하지 않았습니다.","noPlan":"설명할 플랜이 아직 없습니다.","explainPlan":"이 플랜 설명 보기"},"info":{"empty":"쿼리 정보가 없습니다.","resultN":"결과 {{n}}","metadata":"쿼리 메타데이터","executionTime":"실행 시간","notAvailable":"해당 없음","affectedRows":"영향받은 행","fields":"필드","fieldDetails":"필드 상세","colName":"이름","colType":"타입","colTable":"테이블","resultSets":"결과 집합","rowsReturned":"반환된 행","insertId":"마지막 Insert ID","lastQuery":"마지막 실행 구문","copy":"복사","copied":"복사됨","colOrigin":"원본 이름","primaryKey":"기본 키","rowsAndFields":"{{rows}}행 × {{fields}}필드","noFields":"이 구문은 컬럼을 반환하지 않았습니다."},"rowForm":{"colColumn":"컬럼","colValue":"값","insertTitle":"행 추가","editTitle":"행 편집","loading":"컬럼 정보를 불러오는 중...","preview":"실행될 구문","nothingToWrite":"변경할 내용이 없습니다","insert":"삽입","update":"수정","stageInsert":"대기 행으로 추가","stageEdit":"그리드에 반영","stageHint":"실행하지 않고 그리드에만 값을 넣어 두고, 나중에 다른 편집과 함께 커밋합니다.","inserted":"{{table}}에 행을 삽입했습니다","updated":"{{table}}의 행을 수정했습니다","confirmInsertTitle":"{{table}}에 행을 삽입할까요?","confirmUpdateTitle":"{{table}}의 행을 수정할까요?","inTransaction":"열린 트랜잭션 안에서 실행됩니다","pickDate":"날짜 선택","now":"현재 시각","formatJson":"정렬","binaryUnsupported":"바이너리 컬럼은 여기서 편집할 수 없습니다. NULL/DEFAULT로 두거나 SQL로 설정하세요.","generateUuid":"UUID 생성","defaultValue":"기본값","clickToChange":"클릭하여 변경","empty":"(비어 있음)","autoHint":"서버가 자동 생성","mode":{"keep":"유지","auto":"자동","value":"값"},"invalid":{"integer":"정수를 입력하세요","unsigned":"이 컬럼은 음수를 허용하지 않습니다","number":"숫자를 입력하세요","json":"올바르지 않은 JSON","date":"YYYY-MM-DD 형식으로 입력하세요","datetime":"YYYY-MM-DD HH:MM:SS 형식으로 입력하세요","time":"HH:MM:SS 형식으로 입력하세요","length":"최대 {{max}}자"}},"history":{"copied":"클립보드에 복사되었습니다","searchPlaceholder":"히스토리 검색...","all":"전체","success":"성공","failed":"실패","thisTab":"현재 탭만","noMatch":"일치하는 항목이 없습니다.","count":"{{count}}건","clear":"지우기","clearTitle":"쿼리 히스토리를 지울까요?","clearDescription":"이 연결의 {{count}}건이 모두 삭제됩니다. 되돌릴 수 없습니다.","clearConfirm":"히스토리 지우기","insert":"편집기에 삽입","inserted":"편집기에 삽입했습니다","copy":"복사","rows":"{{count}}행","affected":"{{count}}행 변경","today":"오늘","yesterday":"어제","empty":"쿼리 히스토리가 없습니다."},"json":{"arrayLength":"Array[{{count}}]","keys_one":"키 {{count}}개","keys_other":"키 {{count}}개","invalid":"잘못된 JSON입니다","clickToView":"클릭하여 JSON 보기","expandAll":"모두 펼치기","collapseAll":"모두 접기","edit":"편집","view":"보기","copied":"복사됨","copy":"복사","shortcutHint":"{{mod}}+Enter 저장 · Esc 취소","cancel":"취소","save":"저장"},"grid":{"readOnlyConnection":"읽기 전용 연결","readOnlyWal":"읽기 전용: -wal 파일이 로드되지 않음","readOnlyNoPk":"읽기 전용: 테이블에 기본 키가 없음","commitTitle":"{{table}}에 변경 사항 {{count}}건을 커밋하시겠습니까?","commitDescription":"다음 구문이 실행됩니다.","commitConfirm":"커밋","rowPrefix":"{{row}}행:","cancelled":"취소됨","commitFailed":"커밋 실패: {{message}}","executedInTransaction":"열린 트랜잭션 안에서 변경 사항 {{count}}건을 실행했습니다. 영구 반영하려면 툴바의 커밋을 누르십시오 (다시 불러오면 롤백됩니다)","committed":"{{table}}에 변경 사항 {{count}}건을 커밋했습니다","noData":"표시할 데이터가 없습니다.","commit":"커밋","discard":"취소","addRow":"행 추가","removeNewRow":"이 새 행 취소","addRowForm":"폼으로 추가","addRowFormHint":"컬럼별 입력란이 있는 폼을 엽니다 (INSERT로 커밋)","editRowForm":"이 행을 폼으로 편집","addRowHint":"새 행을 추가합니다 (INSERT로 커밋됨)","delete":"삭제","deleteCount":"삭제 ({{count}})","deleteHint":"선택한 행을 삭제합니다 (DELETE로 커밋됨). 행 번호 열에서 행을 선택하십시오.","field":"필드","searchPlaceholder":"검색...","orderBy":"정렬 기준","none":"없음","refresh":"새로 고침","dismiss":"닫기","clearSelection":"선택 해제","columns":"컬럼","showAllColumns":"전체 선택","hideAllColumns":"전체 해제","resetWidths":"너비 초기화","selectAll":"모든 행 선택","emptyTable":"이 테이블에는 행이 없습니다.","noRows":"반환된 행이 없습니다.","addARow":"행 추가","markedForDeletion":"삭제 예정 — 클릭하면 복원됩니다","newRow":"새 행","clickToSelect":"클릭하여 선택, Shift/Ctrl로 여러 행 선택","rows":"행: {{count}}","rowsWithNew":"행: {{count}} (+{{added}})","sortedBy":"정렬: {{column}} {{direction}}","pageRange":"{{from}}–{{to}}행","firstPage":"첫 페이지","prevPage":"이전 페이지","nextPage":"다음 페이지","lastPage":"마지막 페이지","pagingBlocked":"페이지를 넘기기 전에 변경사항을 커밋하거나 취소하세요","selected":"{{count}}개 선택됨","cellsModified":"셀 {{count}}개 수정됨","newCount":"새 행 {{count}}개","toDelete":"삭제 예정 {{count}}개","searchMode":"검색 방식","contains":"포함","equals":"일치","followLink":"{{table}}에서 {{column}} = 값 열기","linkColumn":"\\"{{column}}\\"을(를) 다른 테이블로 링크…","editLink":"\\"{{column}}\\" 링크 편집…","removeLink":"링크 제거","copyValue":"값 복사","filterByValue":"필터: {{column}} = 이 값","clearFilter":"필터 해제","copyColumnName":"컬럼 이름 복사","editCell":"셀 편집","setNull":"NULL로 설정","setEmpty":"빈 문자열로 설정","restoreRow":"행 복원","hideColumn":"\\"{{column}}\\" 컬럼 숨기기","copyRowsTsv_other":"행 {{count}}개를 TSV로 복사 (헤더 포함)","copyRowsCsv_other":"행 {{count}}개를 CSV로 복사","copyRowsJson_other":"행 {{count}}개를 JSON으로 복사","copyRowsInsert_other":"행 {{count}}개를 INSERT 문으로 복사","deleteRowsPending_other":"행 {{count}}개 삭제 (커밋 전까지 대기)","sendRowsToScratchpad_other":"행 {{count}}개를 스크래치패드로 보내기","sendAllToScratchpad":"불러온 행 {{count}}개 모두 스크래치패드로 보내기","sentToScratchpad":"행 {{count}}개를 스크래치패드 테이블 {{table}}에 복사했습니다.","changesSince":"지난 로드 이후: 변경 {{changed}} · 새 행 {{added}} · 사라짐 {{gone}}","changesToggle":"지난 로드 대비 변경 강조 켜기/끄기","changesDismiss":"변경 표시 지우기","previousValue":"이전 값: {{value}}","groupByValue":"{{column}} 기준으로 그룹 집계"},"link":{"title":"컬럼을 다른 테이블로 링크","source":"컬럼","hint":"이 컬럼의 값이 링크가 됩니다. 클릭하면 대상 테이블이 일치하는 행으로 필터되어 열립니다. 실제 외래키는 자동으로 링크됩니다.","targetDatabase":"대상 데이터베이스","targetTable":"대상 테이블","targetColumn":"대상 컬럼","pickTable":"테이블 선택","pickColumn":"컬럼 선택","remove":"링크 제거","cancel":"취소","save":"링크 저장","targetConnection":"대상 연결","targetNotConnected":"링크된 연결이 열려 있지 않습니다. 먼저 연결하세요."},"running":{"label":"쿼리 실행 중…","elapsed":"{{seconds}}초","stop":"중단","stopping":"중단 중…","cannotCancel":"이 엔진은 실행 중인 문장을 중단할 수 없습니다.","agentOutdated":"로컬 에이전트가 구버전이라 쿼리를 중단할 수 없습니다. `npx planche@latest`(또는 `planche upgrade`)로 갱신한 뒤 다시 연결하세요.","cancelFailed":"에이전트에 연결할 수 없어 쿼리를 중단하지 못했습니다.","abandoned":"요청 대기를 중단했습니다. 이 엔진에는 자체 취소 기능이 없어 쿼리는 서버에서 끝까지 실행될 수 있습니다."},"plan":{"empty":"실행 계획 보기(Ctrl+Shift+E)를 누르면 커서 위치의 문장을 엔진이 어떻게 처리할지 보여줍니다.","unreadable":"계획을 트리로 읽지 못해 엔진 출력을 그대로 표시합니다.","estimated":"예상치","analyzed":"실측치","estimatedHint":"옵티마이저의 예상값입니다. 문장은 실행되지 않았습니다.","analyzedHint":"문장을 실제로 실행했습니다. 행 수와 시간은 실측값입니다.","totalCost":"가장 높은 노드 비용","totalTime":"가장 느린 노드","rows":"예상 행 수","actualRows":"실제 행 수","cost":"비용","time":"시간","showRaw":"원본 출력","showTree":"계획 트리","selectNode":"노드를 선택하면 엔진이 보고한 내용을 볼 수 있습니다.","noDetails":"이 노드에 대해 엔진이 보고한 추가 정보가 없습니다.","warnings":{"fullScan":"전체 스캔","noIndex":"인덱스 없음","estimateOff":"예상 빗나감","temporary":"임시 테이블","filesort":"정렬"},"hints":{"fullScan":"테이블의 모든 행을 읽습니다. 필터 컬럼에 인덱스가 있으면 피할 수 있습니다.","noIndex":"이 접근에 쓸 수 있는 인덱스를 찾지 못했습니다.","estimateOff":"옵티마이저가 예상한 행 수가 크게 빗나갔습니다. 테이블 통계를 갱신하면 대개 해결됩니다.","temporary":"다음 단계로 넘어가기 전에 행을 임시 테이블에 담습니다.","filesort":"인덱스 없이 정렬합니다. ORDER BY에 맞는 인덱스가 있으면 정렬이 사라집니다."}},"structure":{"empty":"쿼리 구조 보기(Ctrl+Shift+G)를 실행하면 커서 위치 문장의 행이 어디서 오는지 볼 수 있습니다.","notQuery":"SELECT 문만 구조 그래프를 그릴 수 있습니다.","unsupported":"{{engine}} 문장은 구조 그래프로 읽을 수 없습니다.","parseError":"문장을 해석하지 못했습니다: {{message}}","columns_other":"{{count}}개 컬럼","columnsUnknown":"컬럼 수 모름","fit":"전체 맞춤","reveal":"에디터에서 이 부분 선택","notDrawn":"그리지 않음: {{what}}","kindTable":"테이블","kindCte":"CTE","kindCteRef":"참조","kindDerived":"서브쿼리","kindScalar":"스칼라","kindSetop":"집합","kindResult":"결과","fullscreen":"전체 화면","exitFullscreen":"전체화면 종료"}}'),p={defaultDescription:`이 작업은 되돌릴 수 없습니다.`,typeToConfirm:`확인하려면 <name/>을(를) 입력하십시오`,cancel:`취소`,confirm:`확인`,ok:`확인`},m={dialog:{createTitle:`테이블 생성`,alterTitle:`테이블 변경`,duplicateTitle:`테이블 구조 복제`,create:`생성`,alter:`변경`,cancel:`취소`,tableName:`테이블 이름`,tableNamePlaceholder:`테이블 이름을 입력하세요...`,loading:`테이블 스키마를 불러오는 중...`,tabSchema:`스키마`,tabIndexes:`인덱스`,tabProperties:`속성`,applying:`적용 중…`,cannotAlterColumns:`{{engine}}는 이미 있는 컬럼의 정의를 바꿀 수 없습니다({{columns}}). 컬럼 추가·삭제·이름 변경과 인덱스 변경은 됩니다. 컬럼 정의를 바꾸려면 테이블을 다시 만들어야 합니다.`},schema:{colField:`필드 이름`,colType:`데이터 타입`,colLength:`길이`,colDefault:`기본값`,colPk:`PK`,colNotNull:`Not Null`,colUnsigned:`Unsigned`,colAutoIncrement:`Auto Incr`,colZerofill:`Zerofill`,colComment:`설명`,empty:`정의된 컬럼이 없습니다. "컬럼 추가"를 클릭하여 추가하세요.`,add:`컬럼 추가`,remove:`컬럼 제거`},indexes:{colName:`인덱스 이름`,colType:`인덱스 유형`,colColumns:`컬럼`,empty:`정의된 인덱스가 없습니다. "인덱스 추가"를 클릭하여 추가하세요.`,add:`인덱스 추가`,remove:`인덱스 제거`},index:{addTitle:`인덱스 추가`,editTitle:`인덱스 편집`,name:`인덱스 이름`,namePlaceholder:`인덱스 이름을 입력하세요`,type:`인덱스 유형`,columns:`컬럼`,noColumns:`사용할 수 있는 컬럼이 없습니다. 먼저 스키마 탭에서 컬럼을 정의하세요.`,unnamed:`(이름 없음)`,cancel:`취소`,ok:`확인`},properties:{engine:`엔진`,charset:`문자셋`,collation:`콜레이션`,autoIncrement:`Auto Increment`,autoIncrementPlaceholder:`기본값`,comment:`설명`},info:{engine:`엔진`,version:`버전`,rowFormat:`행 형식`,rows:`행 수`,avgRowLength:`평균 행 길이`,dataLength:`데이터 크기`,createTime:`생성 시각`,updateTime:`수정 시각`,collation:`콜레이션`,comment:`설명`},copy:{title:`테이블 복사`,source:`원본`,targetConnection:`대상 연결`,targetDatabase:`대상 데이터베이스`,targetTable:`대상 테이블 이름`,what:`복사 범위`,structureAndData:`구조 및 데이터`,structureOnly:`구조만`,ifExists:`대상 테이블이 이미 있으면`,abort:`중단 (기본값)`,dropAndRecreate:`삭제 후 다시 생성 (이름 재입력 확인)`,preview:`대상에 실행할 CREATE TABLE (편집 가능)`,crossEngineHint:`대상이 {{engine}}입니다. 아래 타입을 검토하세요. MySQL 전용 속성은 제거되었습니다.`,readOnly:`읽기 전용`,loading:`불러오는 중…`,progressCreate:`테이블 생성 중…`,progressCount:`행 수 확인 중…`,progressRows:`{{total}}행 중 {{copied}}행 복사됨`,progressDone:`완료`,doneTitle:`테이블 복사 완료`,doneRows:`{{table}}에 {{count}}행을 복사했습니다.`,doneStructure:`{{table}} 구조를 생성했습니다.`,noColumns:`원본 테이블에 컬럼이 없습니다.`,exists:`대상에 {{table}} 테이블이 이미 있습니다. 다른 이름을 쓰거나 "삭제 후 다시 생성"을 선택하세요.`,dropTitle:`기존 테이블 {{table}}을(를) 삭제할까요?`,dropDescription:`복사 전에 대상 테이블과 모든 행이 삭제됩니다. 되돌릴 수 없습니다.`,dropConfirm:`삭제 후 복사`,cancelled:`복사가 취소되었습니다.`,stop:`중지`,cancel:`취소`,copy:`복사`}},h={copy:{title:`데이터베이스 복사`,source:`원본 데이터베이스`,target:`대상 데이터베이스 이름`,targetPlaceholder:`대상 데이터베이스 이름을 입력하세요`,options:`옵션`,structureAndData:`구조 및 데이터`,structureOnly:`구조만`,cancel:`취소`,copy:`복사`,creating:`{{database}} 생성 중…`,copying:`{{table}} 복사 중 ({{index}}/{{total}})…`},diff:{title:`스키마 비교`,source:`원본`,target:`대상`,pickConnection:`연결`,pickDatabase:`데이터베이스`,crossEngineHint:`엔진이 다릅니다. 타입 이름이 방언마다 달라 대부분의 컬럼이 타입 변경으로 표시됩니다.`,sameSide:`원본과 대상이 같은 데이터베이스입니다.`,summary:`변경 {{changed}}, 대상에 없음 {{missingTarget}}, 대상에만 있음 {{missingSource}}, 동일 {{identical}}`,showIdentical:`동일한 테이블 표시`,identicalAll:`테이블이 동일합니다.`,column:`컬럼`,index:`인덱스`,object:`객체`,selectTable:`차이를 볼 테이블을 선택하세요.`,missingInTarget:`{{table}}이(가) 대상에 없습니다. 스크립트가 생성합니다.`,missingInSource:`{{table}}이(가) 대상에만 있습니다. 스크립트가 삭제합니다 (DROP 포함을 켜지 않으면 주석 처리).`,includeDrops:`DROP 문을 실제 SQL로 포함 (기본: 주석 처리)`,tabTitle:`동기화 {{database}}`,close:`닫기`,compare:`비교`,comparing:`비교 중…`,openScript:`스크립트를 편집기에서 열기`,noDefinition:`CREATE 문을 가져올 수 없음`},create:{title:`데이터베이스 생성`,name:`데이터베이스 이름`,namePlaceholder:`데이터베이스 이름을 입력하세요`,charset:`문자셋`,collation:`콜레이션`,cancel:`취소`,create:`생성`},csv:{title:`{{format}}로 내려받기`,target:`대상`,targetQueryResult:`현재 쿼리 결과`,targetTableData:`테이블 데이터`,tableName:`테이블 이름`,tableNamePlaceholder:`테이블 이름을 입력하세요`,delimiter:`구분자`,delimiterComma:`쉼표 (,)`,delimiterTab:`탭 (\\t)`,delimiterSemicolon:`세미콜론 (;)`,delimiterPipe:`파이프 (|)`,includeHeaders:`헤더 포함`,cancel:`취소`,download:`다운로드`,downloading:`다운로드 중...`,progress:`{{total}}행 중 {{loaded}}행 기록`,progressUnknown:`{{loaded}}행 기록`,stop:`중지`,done:`{{table}}의 {{count}}행을 {{format}}로 내보냈습니다.`,database:`데이터베이스`,databasePlaceholder:`데이터베이스 선택`},html:{title:`스키마를 HTML로 내보내기`,database:`데이터베이스`,selectDatabase:`데이터베이스를 선택하세요`,tables:`포함할 테이블`,selectAll:`전체 선택`,deselectAll:`전체 해제`,noTables:`사용할 수 있는 테이블이 없습니다.`,include:`포함 항목`,includeColumns:`컬럼`,includeIndexes:`인덱스`,includeProperties:`속성`,cancel:`취소`,generate:`생성`,generating:`생성 중...`,sectionColumns:`컬럼`,sectionIndexes:`인덱스`,sectionProperties:`속성`,docTitle:`스키마: {{database}}`,heading:`데이터베이스: {{database}}`,summary:`테이블: {{count}}개 | 생성 시각: {{date}}`,footer:`Planche 2026으로 생성됨`},dataDiff:{title:`데이터 비교`,pickTable:`테이블`,hint:`원본 테이블의 기본키로 행을 매칭하고 값을 텍스트로 비교합니다. 한쪽당 최대 {{cap}}행을 읽으므로 큰 테이블은 먼저 필터로 줄이세요.`,sameSide:`원본과 대상이 같은 테이블입니다.`,noPrimaryKey:`{{table}}에 기본키가 없어 행을 매칭할 수 없습니다.`,keyMissingInTarget:`대상 테이블에 키 컬럼이 없습니다: {{columns}}`,summary:`키: {{key}} — 대상에 없음 {{added}}, 다름 {{changed}}, 대상에만 있음 {{removed}}, 동일 {{identical}}`,capped:`양쪽 모두 처음 {{cap}}행만 비교했습니다.`,ignoredColumns:`비교에서 제외된 컬럼(한쪽에만 있음): {{columns}}`,added_other:`대상에 없음 {{count}}`,changed_other:`다름 {{count}}`,removed_other:`대상에만 있음 {{count}}`,none:`이 그룹에는 없습니다.`,more:`… {{count}}개 더 있음`,includeDeletes:`DELETE 문을 실제 SQL로 포함 (기본: 주석 처리)`,tabTitle:`데이터 동기화 {{table}}`,loading:`행 불러오는 중 — 원본: {{source}}, 대상: {{target}}`},schema:{createTitle:`스키마 생성`,name:`스키마 이름`,namePlaceholder:`스키마 이름을 입력하세요`,create:`생성`,cancel:`취소`},groupBy:{title:`그룹 집계`,description:`{{table}}의 행을 선택한 컬럼으로 묶어 셉니다.`,columns:`그룹 기준`,aggregate:`추가 집계`,countOnly:`건수만`,column:`컬럼`,minCount:`그룹당 최소 행 수`,useFilter:`그리드의 현재 필터 적용`,noIndexWarning:`선택한 컬럼 중 인덱스의 선두 컬럼이 없어 테이블 전체를 읽고 정렬합니다. 큰 테이블에서는 오래 걸릴 수 있습니다.`,preview:`쿼리`,pickColumn:`그룹 기준 컬럼을 하나 이상 선택하세요.`,openInTab:`새 탭에서 열기`,run:`실행`,tabTitle:`{{table}} 그룹 집계`,indexed:`인덱스 선두 컬럼`,connection:`연결`,database:`데이터베이스`,table:`테이블`}},g={manager:{title:`사용자 관리`,addUser:`사용자 추가`,removeUser:`사용자 제거`,noUsers:`불러온 사용자가 없습니다`,grantScope:`권한 범위`,apply:`적용`,close:`닫기`,removed:`사용자 '{{user}}'@'{{host}}'을(를) 제거했습니다`,selectUserFirst:`먼저 사용자를 선택하세요`,applied:`변경 사항을 적용했습니다`,noChanges:`적용할 권한 변경이 없습니다.`},add:{title:`사용자 추가`,username:`사용자 이름`,usernamePlaceholder:`사용자 이름을 입력하세요`,host:`호스트`,password:`비밀번호`,passwordPlaceholder:`비밀번호를 입력하세요`,confirmPassword:`비밀번호 확인`,confirmPasswordPlaceholder:`비밀번호를 다시 입력하세요`,plugin:`인증 플러그인`,cancel:`취소`,add:`추가`,usernameRequired:`사용자 이름을 입력해야 합니다`,passwordMismatch:`비밀번호가 일치하지 않습니다`,added:`사용자 '{{user}}'@'{{host}}'을(를) 추가했습니다`},privileges:{globalTitle:`전역 권한`,databaseTitle:`데이터베이스 권한`,tableTitle:`테이블 권한`,checkAll:`전체 선택`,uncheckAll:`전체 해제`,categoryData:`데이터`,categoryStructure:`구조`,categoryAdministration:`관리`},grantTree:{globalPrivileges:`전역 권한`}},_={close:`닫기`,noActiveConnection:`활성 연결이 없습니다`,variableName:`변수 이름`,value:`값`,scope:{session:`세션`,global:`전역`},findReplace:{findPlaceholder:`찾기`,replacePlaceholder:`바꾸기`,found:`{{count}}개 찾음`,noResults:`결과 없음`,previous:`이전`,next:`다음`,close:`닫기`,replace:`바꾸기`,all:`모두`,caseSensitive:`대소문자 구분`,regex:`정규식`,wholeWord:`단어 단위`},flush:{title:`Flush`,executed:`실행됨: {{command}}`,executeError:`{{command}} 실행 중 오류: {{message}}`},localHistory:{title:`로컬 히스토리`,description:`이 연결의 편집기 텍스트 버전입니다. 실행할 때, 타이핑이 멈췄을 때, 탭을 닫을 때 저장됩니다.`,empty:`저장된 버전이 아직 없습니다.`,noMatch:`검색과 일치하는 버전이 없습니다.`,notPersisted:`설정 > 안전에서 “새로고침 후에도 쿼리 히스토리 유지”가 꺼져 있어 버전이 이번 세션에만 보관됩니다.`,searchPlaceholder:`버전 검색`,scopeTab:`이 탭`,scopeAll:`전체 탭`,compareCurrent:`현재와 비교`,comparePrevious:`이전과 비교`,diffAgainstCurrent:`현재 편집기 내용과 비교`,diffAgainstPrevious:`{{time}} 버전과 비교`,noPrevious:`비교할 이전 버전이 없습니다`,restored:`로컬 히스토리에서 편집기 내용을 복원했습니다`,restore:`이 버전 복원`,openInNewTab:`새 탭에서 열기`,openedInTab:`새 탭에서 버전을 열었습니다`,delete:`이 버전 삭제`,clearAll:`히스토리 지우기`,chars:`{{count}}자`,reason:{execute:`실행 전`,edit:`편집 중`,replaced:`덮어쓰기 전`,restore:`복원 전`,close:`닫기 전`}},processList:{title:`프로세스 목록`,refresh:`새로 고침`,autoRefresh:`자동 새로 고침`,empty:`표시할 프로세스가 없습니다`,kill:`종료`,killProcess:`프로세스 종료`,selectToKill:`종료할 프로세스를 선택하세요`,killed:`프로세스 {{id}}을(를) 종료했습니다`,killError:`프로세스 종료 중 오류: {{message}}`,loadError:`프로세스 목록을 불러오는 중 오류: {{message}}`,updatedAt:`{{time}} 갱신`,filterPlaceholder:`사용자, 호스트, DB, SQL로 필터...`,hideIdle:`유휴 숨기기`,noMatch:`필터에 맞는 프로세스가 없습니다`,self:`나`,selfHint:`Planche 자신의 세션입니다`,statementOf:`#{{id}}의 실행 구문`,noStatement:`실행 중인 구문 없음`,copy:`복사`,copied:`복사됨`,killConfirmTitle:`프로세스 {{id}}을(를) 종료할까요?`,killConfirmDescription:`{{user}}@{{host}} 세션이 끊기고 실행 중인 구문이 중단됩니다. 열린 트랜잭션은 롤백됩니다.`,stats:{total:`전체`,active:`활성`,idle:`유휴`,longest:`최장 실행`},columns:{id:`Id`,user:`사용자`,host:`호스트`,db:`db`,command:`명령`,time:`시간`,state:`상태`,info:`정보`,action:`작업`}},status:{title:`서버 상태`,filterPlaceholder:`상태 변수 필터...`,empty:`표시할 상태 변수가 없습니다`,loadError:`상태를 불러오는 중 오류: {{message}}`},variables:{title:`서버 변수`,filterPlaceholder:`변수 필터...`,empty:`표시할 변수가 없습니다`,loadError:`변수를 불러오는 중 오류: {{message}}`}},v={empty:{title:`ERD를 보려면 Prisma 스키마 파일(.prisma)을 여세요`,description:`모델, enum, 관계가 자동으로 분석됩니다`,openFile:`.prisma 파일 열기`,dropHint:`또는 파일을 이 영역으로 드래그 앤 드롭하세요`},entity:{enumBadge:`ENUM`,modelBadge:`MODEL`,columns:{value:`값`,comment:`설명`,type:`타입`,column:`컬럼`},linkBadge:`링크`,externalTitle:`{{location}}의 링크된 테이블 (실제 외래키가 아닌 컬럼 링크)`,nullable:`NULL을 허용하는 컬럼`},toolbar:{refresh:`새로 고침`,zoomIn:`확대`,zoomOut:`축소`,resetView:`보기 초기화`,center:`가운데로`,fitAll:`전체 맞춤`,spreadAll:`겹침 정리`,resetLayout:`레이아웃 초기화`,legendOneToMany:`1:N (FK)`,tables:`테이블:`,relations:`관계:`,columns:`컬럼:`,fullscreen:`전체화면`,exitFullscreen:`전체화면 종료`},viewer:{noServerConnection:`활성 서버 연결이 없습니다`,loading:`{{database}}에서 스키마를 불러오는 중...`,loadFailed:`ERD를 불러오지 못했습니다`,noDatabase:`선택된 데이터베이스가 없습니다.`,selectDatabaseHint:`스키마 트리에서 데이터베이스를 선택한 뒤 ERD 보기를 여세요.`}},y={runAnyway:`그래도 실행`,query:{rowsReturned:`{{count}}개 행 반환됨`,rowsAffected:`{{count}}개 행 영향받음`,rowsReturnedLimited:`{{count}}개 행 반환됨 ({{limit}}개로 제한됨; 더 가져오려면 LIMIT을 추가하세요)`,notConnected:`연결되지 않았습니다`,fileNotOpen:`SQLite 파일이 아직 열려 있지 않습니다 — 위의 "파일 다시 열기"를 클릭해 접근 권한을 다시 부여하세요.`,failed:`쿼리 실패`,nothingToExecute:`실행할 내용이 없습니다`,dryRunMismatch:`미리보기는 {{predicted}}행을 예상했지만 실제로는 {{actual}}행이 바뀌었습니다. 미리보기를 읽은 뒤 데이터가 바뀌었을 수 있고, 그렇지 않다면 미리보기가 이 문장과 맞지 않은 것입니다.`},destructive:{title_one:`파괴적인 구문을 실행하시겠습니까?`,title_other:`파괴적인 구문 {{count}}개를 실행하시겠습니까?`,description:`다음 구문은 데이터를 영구적으로 변경하거나 삭제합니다. 되돌릴 수 없습니다.`,unknownTarget:`(알 수 없음)`,deleteAll:`{{target}}의 모든 행 DELETE`,updateAll:`{{target}}의 모든 행 UPDATE`,alterDrop:`{{target}}의 DROP COLUMN/PARTITION`},readOnly:{refused:`"{{label}}" 연결은 읽기 전용입니다. {{count}}개 구문이 데이터 또는 스키마를 변경합니다.`,title:`"{{label}}"은(는) 읽기 전용입니다`,description:`이 구문들은 데이터 또는 스키마를 변경합니다. 그래도 이 연결에서 실행하시겠습니까?`},transaction:{startFailed:`트랜잭션을 시작할 수 없습니다`,started:`트랜잭션이 시작되었습니다 — 완료되면 Commit 또는 Rollback 하세요`,implicitCommit:`{{kind}} 구문으로 인해 열린 트랜잭션이 암시적으로 COMMIT 되었습니다`,committed:`트랜잭션이 커밋되었습니다`,rolledBack:`트랜잭션이 롤백되었습니다`,commandFailed:`{{name}} 실패`,commandFailedWith:`{{name}} 실패: {{message}}`},save:{notBrowserSqlite:`브라우저 SQLite 연결이 아닙니다.`,inMemory:`인메모리 데이터베이스입니다: 다운로드로만 내보낼 수 있습니다.`,noFileSystemAccess:`이 브라우저에는 File System Access API가 없습니다 (Chrome/Edge 전용): 데이터베이스를 제자리에 쓰는 대신 다운로드로 내보냅니다.`,noWritableHandle:`파일이 쓰기 가능한 핸들 없이 열렸습니다: 다운로드로 내보냅니다.`},agent:{devProxyUrl:`{{url}} (개발 프록시 경유)`,notPlanche:`응답은 있었지만 Planche 에이전트가 아닙니다`,unreachable:"{{url}}에서 Planche 에이전트에 연결할 수 없습니다 — `npx planche`를 실행하세요 ({{message}})",httpError:`HTTP 오류: {{status}} {{statusText}}`,emptyResponse:`터널링 서버가 빈 응답을 반환했습니다`,reconnected:`{{name}}에 다시 연결했습니다 — 에이전트가 연결을 끊었었습니다 (재시작 또는 유휴 시간 초과).`},sample:{profileName:`샘플 쇼핑몰 (브라우저 내)`,downloadFailed:`샘플 데이터베이스를 다운로드할 수 없습니다 ({{status}})`,tabTitle:`쿼리 1`},sqliteFile:{tooSmall:`파일이 너무 작아 SQLite 데이터베이스가 아닙니다.`,notSqlite:`SQLite 데이터베이스가 아닙니다 (또는 SQLCipher 등으로 암호화된 파일입니다). 16바이트 헤더가 "SQLite format 3"이 아닙니다.`,badPageSize:`손상된 SQLite 헤더: 잘못된 페이지 크기 {{size}}.`,unreadable:`SQLite가 파일을 읽을 수 없습니다: {{message}}`,pickerDescription:`SQLite 데이터베이스`,walNotLoaded:`이 데이터베이스는 WAL 모드이며 -wal 파일이 로드되지 않았습니다. 저장하기 전에 -wal 파일을 로드하거나, 배너에서 -wal 파일이 없음을 확인하세요.`,changedOnDisk:`{{name}} 파일이 로드된 후 디스크에서 변경되었습니다 (다른 프로그램이 썼습니다). 저장하면 그 변경 사항을 덮어쓰게 됩니다 — 파일을 다시 열고 편집을 다시 하거나, 터널링 서버를 사용하세요.`,walHasChanges:`{{name}}-wal에 새로운 변경 사항이 있습니다; 저장하기 전에 로드하세요.`,walChangedOnDisk:`{{name}}-wal 파일이 로드된 후 다른 프로그램에 의해 기록되었습니다; 저장하기 전에 파일을 다시 여세요.`,writeDenied:`{{name}}에 대한 쓰기 권한이 부여되지 않았습니다. 브라우저 프롬프트에서 허용하거나, 대신 다운로드로 내보내세요.`},environment:{none:`없음`,green:`녹색 (개발)`,blue:`파랑`,yellow:`노랑 (스테이징)`,orange:`주황`,red:`빨강 (운영)`,purple:`보라`},scratchpad:{profileName:`스크래치패드`,namePromptTitle:`스크래치패드 테이블 이름`,namePromptDescription:`스크래치패드에 {{table}} 테이블이 이미 있습니다. 다른 이름을 입력하세요.`,nameTaken:`{{table}} 테이블이 이미 있습니다.`},federated:{pulling:`{{connection}}에서 {{table}} 가져오는 중…`,capped:`{{table}}: 처음 {{limit}}행만 가져왔습니다.`,templateLine1:`열려 있는 연결의 테이블을 "연결 이름".database.table 로 참조하세요. 실행 전에 이 스크래치패드로 복사됩니다.`,templateLine2:`테이블당 최대 {{limit}}행. 쿼리 자체는 브라우저의 SQLite에서 실행됩니다.`,templateConnections:`열린 연결: {{names}}`,templateNone:`아직 열린 다른 연결이 없습니다. 연결한 뒤 여기서 참조하세요.`,done:`원격 테이블 {{tables}}개에서 {{rows}}행을 스크래치패드로 가져왔습니다.`,pullingProgress:`{{connection}}에서 {{table}} 가져오는 중: {{loaded}} / {{total}}행…`},paged:{noColumns:`{{table}}에 컬럼이 없습니다.`,cancelled:`취소되었습니다.`}},b={title:`이용약관`,version:`버전 {{version}}`,englishOnly:`약관 전문은 영어로 제공됩니다. 시작 화면의 요약은 사용 중인 언어로 표시됩니다.`,privacyLink:`개인정보처리방침`,refundLink:`환불 정책`,online:`planche.dev에서 읽기`,updated:`최종 수정 {{date}}`},x={title:`{{kind}} 실행 시 {{count}}행이 영향받습니다`,titleUnknown:`{{kind}} — 영향 행 수를 알 수 없음`,description:`지금 이 문장이 건드릴 행을 SELECT로 미리 읽은 것입니다. 아직 아무것도 쓰지 않았습니다.`,previewFailed:`미리보기 쿼리가 실패했습니다: {{error}}
2
+ 그래도 문장을 실행할 수는 있습니다.`,noRows:`일치하는 행이 없습니다 — 이 문장은 아무것도 바꾸지 않습니다.`,truncated:`{{count}}행 중 처음 {{shown}}행만 표시합니다.`,previewQuery:`미리보기 쿼리`,run:`{{kind}} 실행 ({{count}}행)`,runAnyway:`그래도 실행`},S={badge:`PRO`,tooltip:`Pro 라이선스가 필요합니다.`,noticeTitle:`Pro 기능`,notice:`PRO 표시가 있는 기능은 Pro 라이선스가 필요합니다.`,licenseTitle:`Planche Pro`,licenseDescription:`구매 메일에 담긴 라이선스 키를 붙여 넣으세요. 이 컴퓨터에서 확인하며 아무 데도 전송하지 않습니다.`,blocked:`{{feature}}에는 Pro 라이선스가 필요합니다.`,keyLabel:`라이선스 키`,activate:`활성화`,remove:`라이선스 삭제`,active:`Pro가 활성화되어 있습니다.`,licensedTo:`{{email}} 님의 라이선스`,validUntil:`{{date}}까지 유효`,expiredOn:`{{date}}에 만료되었습니다. Pro 기능을 계속 쓰려면 갱신하세요.`,invalidKey:`Planche 라이선스 키가 아닙니다.`,notConfigured:`이 빌드는 라이선스 키를 확인할 수 없습니다. 제보해 주세요.`,noWebcrypto:`이 브라우저는 라이선스 키를 확인할 수 없습니다.`,pricing:`가격 보기`,features:{ssh_tunnel:`SSH 터널`,compare_schemas:`스키마 비교`,compare_data:`데이터 비교`,copy_table:`테이블 복사`,dry_run:`Dry run`,federated:`페더레이티드 쿼리`,scratchpad:`스크래치패드`,column_link:`컬럼 링크`,sync:`연결 동기화`,ai_explain:`AI 설명`},included:`Pro에 포함된 기능`,haveKey:`이미 라이선스 키가 있나요?`,perMonth:`/ 월`,priceNote:`1년에 한 번 {{annual}} 청구. 월간 결제는 {{monthly}}입니다.`,featureDetails:{sync:`브라우저에서 암호화한 프로필을 모든 컴퓨터에서`,ssh_tunnel:`점프 호스트 뒤의 데이터베이스에 비밀번호·키·ssh-agent로 접속`,compare_schemas:`열려 있는 두 연결을 비교하고 ALTER 스크립트 받기`,compare_data:`두 테이블의 행을 비교하고 INSERT·UPDATE 스크립트 받기`,copy_table:`다른 연결로, 다른 엔진으로 테이블을 다시 만들기`,dry_run:`UPDATE·DELETE가 몇 행을 어떻게 바꾸는지 실행 전에 확인`,federated:`서로 다른 연결에 있는 테이블을 조인`,scratchpad:`작업용 데이터를 담는 로컬 SQLite 데이터베이스`,column_link:`그리드에서 따라갈 수 있는 가상 외래키`,ai_explain:`실패한 문장이나 느린 플랜의 이유를 모델에게 묻는다 — 스키마까지 붙여서`}},C={npxNote:`Node.js 22 이상이 필요합니다. 영구적으로 설치되는 것은 없고, npx가 npm 레지스트리에서 바로 받아 실행합니다.`,installNote:`Node.js가 없어도 됩니다. 관리자 권한 없이 홈 디렉터리 안에만 설치되며, 이후에는 planche 명령으로 언제든 실행합니다.`},w={unsupported:`{{engine}}은(는) 실행 계획을 제공하지 않습니다.`,oneStatement:`실행 계획은 한 번에 한 문장만 분석합니다. 분석할 문장에 커서를 두거나 선택하세요.`},T={title:`AI 어시스턴트`,intro:`쿼리를 만들어 달라고 하거나 할 일을 시키세요 — 스키마를 읽고, 탭에 SQL을 쓰고, 실행합니다. 지금 열려 있는 연결에서만 동작하며, 대화는 연결마다 따로 남습니다.`,privacy:`도구가 읽은 것은 샘플 행을 포함해 사용자의 provider로 전송됩니다. planche.dev로는 아무것도 가지 않습니다.`,placeholder:`예: 데모 데이터베이스에서 월별 매출 쿼리 만들어줘`,send:`보내기`,stop:`중지`,clear:`새 대화`,working:`작업 중…`,tabTitle:`AI 쿼리`,approvalTitle:`쓰기 작업입니다. 실행할까요?`,approve:`실행`,reject:`건너뛰기`,rejected:`사용자가 실행을 거부했습니다.`,notConfigured:`에이전트에 AI 키가 없습니다. 설정 ▸ AI에서 추가하세요.`,needsAgent:`이 로컬 에이전트는 아직 도구를 실행할 수 없습니다. 업데이트 후 다시 페어링하세요.`,failed:`실패`,empty:`아직 물어본 것이 없습니다.`,steps:`{{count}}단계`,tooManySteps:`{{count}}단계까지 진행했지만 답에 이르지 못했습니다.`,collapse:`접기`,planWarningTitle:`이 쿼리는 풀스캔입니다. 그래도 실행할까요?`,interrupted:`새로고침으로 중단됨.`,external:`Planche 밖에서 요청한 작업입니다`},E={title:`AI 에이전트 연결 (MCP)`,description:`MCP를 지원하는 AI 에이전트에서 Planche의 도구를 쓸 수 있게 합니다.`,readsLabel:`읽기`,reads:`열려 있는 데이터베이스를 읽고, 그 결과가 상대 프로그램으로 갑니다.`,writesLabel:`쓰기`,writes:`데이터를 바꾸는 문장은 승인을 받아야 합니다. DROP·TRUNCATE는 못 합니다.`,needsLabel:`조건`,needs:`AI 패널이 열려 있어야 합니다.`,tokenLabel:`토큰`,token:`하나를 여러 프로그램이 같이 씁니다. 폐기하면 전부 끊깁니다.`,command:`Claude Code에 추가`,json:`직접 설정하기`,stored:`{{path}}에 저장됩니다.`,revoke:`토큰 폐기`,revoked:`폐기했습니다. 새로 발급하려면 이 창을 다시 여세요.`},D={title:`연결 동기화`,description:`연결 프로필을 이 브라우저에서 암호화해 planche.dev에 보관합니다. 다른 컴퓨터에서 그대로 쓸 수 있습니다.`,stored:`서버에는 암호화된 덩어리 하나만 저장됩니다. 호스트·사용자·비밀번호·SSH 키를 읽을 수 없습니다.`,unavailable:`동기화는 planche.dev에서만 동작합니다. 지금 이 Planche는 로컬 에이전트가 서빙하고 있고, 에이전트는 외부로 나가지 못하게 막혀 있습니다.`,signIn:`GitHub으로 로그인`,signedInAs:`{{email}}로 로그인됨`,signOut:`로그아웃`,createTitle:`패스프레이즈 정하기`,createHint:`이 패스프레이즈가 프로필을 암호화합니다. 서버로 전송되지 않으므로, 잃어버리면 저장된 사본은 복구할 수 없습니다 — 프로필이 남아 있는 컴퓨터에서 다시 만드는 수밖에 없습니다.`,passphrase:`패스프레이즈`,confirm:`패스프레이즈 확인`,mismatch:`두 패스프레이즈가 다릅니다.`,tooShort:`{{count}}자 이상 입력하세요.`,enable:`동기화 켜기`,unlockTitle:`프로필 잠금 해제`,unlockHint:`동기화를 켤 때 정한 패스프레이즈를 입력하세요.`,unlock:`잠금 해제`,wrongPassphrase:`패스프레이즈가 틀렸거나 저장된 사본이 손상되었습니다.`,syncNow:`지금 동기화`,lastSynced:`마지막 동기화 {{when}}`,neverSynced:`아직 동기화하지 않음`,profiles_one:`프로필 {{count}}개`,profiles_other:`프로필 {{count}}개`,changePassphrase:`패스프레이즈 변경`,deleteVault:`서버에서 삭제`,deleteVaultConfirm:`planche.dev에 저장된 암호화 사본을 지울까요? 이 컴퓨터의 프로필은 그대로 남습니다.`,offline:`planche.dev에 연결할 수 없습니다.`,working:`처리 중…`,serverError:`planche.dev가 요청을 끝내지 못했습니다. 잠시 후 다시 시도하세요.`,signInShort:`로그인`,needsPro:`로그인되었습니다. 프로필 동기화에는 Pro 라이선스가 필요하며, 라이선스가 생기면 바로 동작합니다.`,deleteAccount:`계정 삭제`,deleteAccountConfirm:`계정을 삭제할까요? 저장된 사본과 로그인 정보가 함께 지워집니다. 이 컴퓨터의 프로필은 그대로 남습니다.`,notDeployed:`이 사이트에는 연결 동기화가 아직 켜져 있지 않습니다.`},O={app:e,language:t,settings:n,menu:r,about:i,connection:a,toolbar:o,footer:s,palette:c,welcome:l,schema:u,query:d,result:f,confirm:p,table:m,database:h,user:g,command:_,erd:v,services:y,terms:b,dryRun:x,pro:S,install:C,explain:w,ai:T,mcp:E,sync:D};export{i as about,T as ai,e as app,_ as command,p as confirm,a as connection,h as database,O as default,x as dryRun,v as erd,w as explain,s as footer,C as install,t as language,E as mcp,r as menu,c as palette,S as pro,d as query,f as result,u as schema,y as services,n as settings,D as sync,m as table,b as terms,o as toolbar,g as user,l as welcome};
@@ -0,0 +1 @@
1
+ import{l as e,m as t}from"./button-B2EsmMJs.js";import{t as n}from"./contract-neLPq0_M.js";import{Lt as r}from"./index-Tw24-4of.js";var i={currency:`USD`,annualPerMonth:8,annualTotal:96,monthly:10},a=e=>`$${e}`,o=e(),s=`https://planche.dev/pricing/`;function c({highlight:e,innerRef:c}){let{t:l}=t(),u=e?[e,...n.filter(t=>t!==e)]:[...n];return(0,o.jsxs)(`div`,{className:`grid gap-3 rounded-xl border border-primary/50 bg-muted/20 p-4 shadow-[inset_0_0_0_1px_hsl(var(--primary)/0.15)]`,children:[(0,o.jsx)(`p`,{className:`text-[0.7rem] font-semibold uppercase tracking-[0.09em] text-muted-foreground`,children:`Pro`}),(0,o.jsxs)(`div`,{className:`grid gap-1`,children:[(0,o.jsxs)(`p`,{className:`flex items-baseline gap-1.5`,children:[(0,o.jsx)(`span`,{className:`text-3xl font-semibold leading-none text-foreground`,children:a(i.annualPerMonth)}),(0,o.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:l(`pro.perMonth`)})]}),(0,o.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:l(`pro.priceNote`,{annual:a(i.annualTotal),monthly:a(i.monthly)})})]}),(0,o.jsx)(`ul`,{className:`grid gap-2 text-xs`,children:u.map(t=>(0,o.jsxs)(`li`,{className:`flex gap-2`,children:[(0,o.jsx)(r,{className:`mt-0.5 size-3 shrink-0 ${t===e?`text-primary`:`text-emerald-500/80`}`}),(0,o.jsxs)(`span`,{className:`grid gap-0.5`,children:[(0,o.jsx)(`span`,{className:t===e?`font-medium text-foreground`:`text-foreground/90`,children:l(`pro.features.${t}`)}),(0,o.jsx)(`span`,{className:`text-muted-foreground`,children:l(`pro.featureDetails.${t}`)})]})]},t))}),(0,o.jsx)(`a`,{ref:c,href:s,target:`_blank`,rel:`noreferrer`,className:`rounded-md bg-primary px-4 py-2 text-center text-sm font-medium text-primary-foreground hover:opacity-90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring`,children:l(`pro.pricing`)})]})}export{c as t};
@@ -0,0 +1 @@
1
+ import{c as e}from"./connection-store-B85kbJpB.js";import{y as t}from"./tunneling-B7lL9I14.js";function n(n){t(n),e(n)}export{n as t};
@@ -1,2 +1,2 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/main-BwM1zx0B.js","assets/rolldown-runtime-hePW80VL.js","assets/ui-store-5IssrgmG.js","assets/button-B2EsmMJs.js","assets/i18n-BQcNT-sS.js","assets/dist-C2vlTGNz.js","assets/dist-BYhFWvmC.js","assets/dist-BrzYmjQV.js","assets/dist-BUXw8brT.js","assets/app-storage-C_1RLCyI.js","assets/connection-store-D-Lp5EFj.js","assets/settings-store-DzQ3BP5e.js","assets/tunneling-C--CCnwy.js","assets/hmr-singleton-Bit0Kfog.js","assets/query-store-Cf_KUo80.js","assets/database-CfYjCIA2.js","assets/dbms-BwnatOMe.js","assets/engine-Ja9hkC7I.js","assets/editor-registry-ukUyoekH.js","assets/error-hints-9kGurk72.js","assets/schema-nodes-MgIiKfpG.js","assets/pro-usage-D4Iv3hEs.js","assets/table-copy-JytHH7NG.js","assets/table-definition-Bs5VSn0X.js","assets/main-D2x95iIF.css"])))=>i.map(i=>d[i]);
2
- import{r as e}from"./rolldown-runtime-hePW80VL.js";import{c as t,h as n,n as r}from"./ui-store-5IssrgmG.js";import{a as i,i as a}from"./i18n-BQcNT-sS.js";import{s as o,t as s}from"./connection-store-D-Lp5EFj.js";import{n as c}from"./settings-store-DzQ3BP5e.js";import{D as l}from"./tunneling-C--CCnwy.js";import{t as u}from"./hmr-singleton-Bit0Kfog.js";import{n as d}from"./query-store-Cf_KUo80.js";import{S as f,a as p,c as m}from"./database-CfYjCIA2.js";import{a as h,o as g}from"./dbms-BwnatOMe.js";import{n as _,r as v}from"./engine-Ja9hkC7I.js";import{i as y}from"./editor-registry-ukUyoekH.js";import{c as b,d as x,f as S,l as C,p as ee,t as w}from"./error-hints-9kGurk72.js";import{n as T,t as te}from"./schema-nodes-MgIiKfpG.js";function E(e){return s.getState().activeConnections.find(t=>t.id===e)?.database||te(f.getState().trees[e]??[])}function ne(e,t,n,r){return _(e).tree.objectPath(t,n,r,E(e))}function D(e,t){return _(e).tree.namespacePath(t,E(e))}function O(e,t){for(let n of e){if(n.id===t)return n;let e=O(n.children,t);if(e)return e}return null}async function re(e,t,n){let r=f.getState;for(let i=0;i<t.length;i++){let a=r().trees[e];if(!a)return!1;let o=O(a,t[i]);if(!o)return!1;if(i===t.length-1)return r().setSelected(e,o.id),!0;o.children.length===0&&!o.isLeaf?await n(e,o):o.isExpanded||r().setExpanded(e,o.id,!0)}return!1}function k(e,t){for(let n of e){if(n.id===t)return n;let e=k(n.children,t);if(e)return e}return null}function A(e,t){let n=f.getState(),r=n.trees[e];if(!r||!t)return;let i=D(e,t),a=null;for(let t of i){let i=k(r,t);if(!i||(a=i,i.isLeaf))break;!i.isExpanded&&i.children.length>0&&n.setExpanded(e,i.id,!0)}!a||a.id!==i[i.length-1]||(n.setSelected(e,a.id),!a.isExpanded&&a.children.length>0&&n.setExpanded(e,a.id,!0))}var j=e(n(),1);function ie(e,t,n){let r=[];function i(e){for(let n of e){if(r.push(n),n.id===t||n.children.length>0&&i(n.children))return!0;r.pop()}return!1}i(e);for(let e=r.length-1;e>=0;e--)if(r[e].type===n)return r[e];return null}function M(e,t){for(let n of e){if(n.id===t)return n;if(n.children.length>0){let e=M(n.children,t);if(e)return e}}return null}var N=u(`schemaTreeLoadingRoots`,()=>new Set);function P(e){let t=s.getState().activeConnections.find(t=>t.id===e);return t?.serverConnectionId?{engine:_(e),run:p(t.serverConnectionId),database:t.database||void 0}:null}function ae(){let{setTree:e,setChildren:t,setNodeMetadata:n,setLoading:a}=f(),o=(0,j.useCallback)(async t=>{let n=P(t);if(n&&!N.has(t)){N.add(t);try{e(t,await n.engine.tree.loadRoot(n))}catch(n){let a=n instanceof Error?n.message:String(n);console.error(`Failed to load databases:`,n),r.getState().setFooterMessage(i.t(`schema.tree.loadDatabasesFailed`,{message:a})),e(t,[])}finally{N.delete(t)}}},[e]),s=(0,j.useCallback)(async(e,r)=>{if(!f.getState().trees[e])return;let i=P(e);if(i&&!r.isLeaf){a(e,r.id,!0);try{let a=await i.engine.tree.loadChildren(i,r);t(e,r.id,a),Promise.all(a.filter(e=>e.type===g.FOLDER&&e.metadata?.countable).map(async t=>{try{let r=await i.engine.tree.loadChildren(i,t);n(e,t.id,{count:r.length})}catch(e){console.error(`Failed to count ${t.text}:`,e)}}))}catch(t){console.error(`Failed to load children:`,t),a(e,r.id,!1)}}},[t,n,a]);return{loadDatabases:o,loadChildren:s,refreshNode:(0,j.useCallback)(async(e,t)=>{await s(e,t)},[s]),createNode:h,findNode:M,findAncestor:ie}}async function F(e,t){w(e,t);let n=f.getState().trees[e];if(!n||!t)return;let r=P(e);if(!r)return;let i=D(e,t),a=T(n,i[i.length-1]);!a||a.children.length===0||await Promise.all(a.children.filter(e=>e.type===g.FOLDER).map(async t=>{try{let n=await r.engine.tree.loadChildren(r,t),i=f.getState();(t.children.length>0||t.isExpanded)&&i.setChildren(e,t.id,n),t.metadata?.countable&&i.setNodeMetadata(e,t.id,{count:n.length})}catch(e){console.error(`Failed to refresh ${t.text}:`,e)}}))}async function oe(e){w(e);let t=P(e);t&&f.getState().setTree(e,await t.engine.tree.loadRoot(t))}var I=class extends Error{sql;constructor(e,t){super(e),this.name=`QueryError`,this.sql=t}},L=class extends Error{constructor(e=`Cancelled`){super(e),this.name=`ExecutionCancelled`}};function se(e){let t=e.fields??[],n=e.records??[];return{fields:t.map(e=>({name:e.name,type:e.type,orgTable:e.orgTable??e.table??``,orgName:e.orgName??e.name,db:e.db??``})),rows:n.map(e=>{let n={};return t.forEach((t,r)=>{n[t.name]=e[r]}),n}),affectedRows:e.affectedRows??0,insertId:e.insertId??0,message:e.message??(n.length>0?i.t(`services.query.rowsReturned`,{count:n.length}):i.t(`services.query.rowsAffected`,{count:e.affectedRows??0}))}}async function R(e,t,n,r=v(t)){let i=new Set(e.fields.map(e=>e.orgTable).filter(Boolean));if(i.size!==1)return e;let a=[...i][0];try{let i=await r.introspect.getPrimaryKeys(p(t),n,a);i.length>0&&(e.primaryKeys=i)}catch{}return!e.primaryKeys?.length&&e.fields.some(e=>e.name===`_rowid_`)&&(e.primaryKeys=[l]),e}var z=new Set([`SELECT`,`SHOW`,`EXPLAIN`,`DESCRIBE`,`DESC`,`HELP`,`VALUES`,`TABLE`,`WITH`,`USE`,`SET`,`CHECK`,`CHECKSUM`]);function B(e){return e.kind===`PRAGMA`?!e.sql.includes(`=`):!(!z.has(e.kind)||e.destructive||e.kind===`SELECT`&&x(e,`INTO`))}var V=new Set([`INSERT`,`UPDATE`,`DELETE`,`REPLACE`,`MERGE`,`LOAD`]),H=new Set([`CREATE`,`ALTER`,`DROP`,`TRUNCATE`,`RENAME`,`GRANT`,`REVOKE`,`FLUSH`,`LOCK`,`UNLOCK`]),U=new Set([`CREATE`,`ALTER`,`DROP`,`RENAME`]);function W(e){return V.has(e.kind)||!!e.destructive?.dataLoss}function G(e,t,n=`limit`){if(t<=0||e.kind!==`SELECT`||e.limit!==null||x(e,`LIMIT`)||x(e,`INTO`)||x(e,`FOR`)||x(e,`LOCK`))return{sql:e.sql,limited:!1};if(n===`top`){if(x(e,`TOP`)||x(e,`OFFSET`))return{sql:e.sql,limited:!1};let n=ee(e);return n===-1?{sql:e.sql,limited:!1}:{sql:`${e.sql.slice(0,n)} TOP ${t}${e.sql.slice(n)}`,limited:!0}}return n===`fetch`?x(e,`FETCH`)||/\bROWNUM\b/i.test(e.sql)?{sql:e.sql,limited:!1}:{sql:`${e.sql} FETCH FIRST ${t} ROWS ONLY`,limited:!0}:{sql:`${e.sql} LIMIT ${t}`,limited:!0}}function ce(e,t=0){let n=K();return n<=0?``:e.limitClause(n,t)}function K(){return c.getState().resultRowLimit}function le(e){let t=e.destructive,n=t.names.length?t.names.join(`, `):i.t(`services.destructive.unknownTarget`);switch(t.action){case`DROP`:return`DROP ${t.objectType} ${n}`;case`TRUNCATE`:return`TRUNCATE ${n}`;case`DELETE_ALL`:return i.t(`services.destructive.deleteAll`,{target:n});case`UPDATE_ALL`:return i.t(`services.destructive.updateAll`,{target:n});case`ALTER_DROP`:return i.t(`services.destructive.alterDrop`,{target:n})}}async function ue(e){if(!c.getState().confirmDestructive)return!0;let t=e.filter(e=>e.destructive?.dataLoss);return t.length===0||r.getState().requestDestructiveConfirm({title:i.t(`services.destructive.title`,{count:t.length}),description:i.t(`services.destructive.description`),statements:t.map(le),confirmLabel:i.t(`services.runAnyway`)})}async function de(e,t){if(!e.readOnly)return;let n=t.filter(e=>!B(e));if(n.length===0)return;let a=`${e.hostName||e.host}`;if(!c.getState().allowReadOnlyOverride)throw new I(i.t(`services.readOnly.refused`,{label:a,count:n.length}));if(!await r.getState().requestDestructiveConfirm({title:i.t(`services.readOnly.title`,{label:a}),description:i.t(`services.readOnly.description`),statements:n.map(e=>e.sql.length>120?e.sql.slice(0,117)+`...`:e.sql),confirmLabel:i.t(`services.runAnyway`)}))throw new L(`Cancelled: connection is read-only.`)}function q(e,t){let n=s.getState(),r=n.activeConnections.find(t=>t.id===e);if(!r?.serverConnectionId)throw new I(i.t(`services.query.notConnected`));if(n.pendingReopen[e])throw new I(i.t(`services.query.fileNotOpen`));return{connId:e,serverConnId:r.serverConnectionId,conn:r,engine:_(e),tabId:t}}async function J(e,t,n){let r=new b(e.engine).statements(t);if(e.conn.scratchpad){let{materializeFederated:t}=await a(async()=>{let{materializeFederated:e}=await import(`./main-BwM1zx0B.js`).then(e=>e.V);return{materializeFederated:e}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]));for(let n of r)n.sql=await t(e.connId,n.sql)}if(await de(e.conn,r),!n.skipDestructiveConfirm&&!await ue(r))throw new L;return r}async function Y(e,n,a){let{connId:o,serverConnId:c,engine:l,tabId:u}=e,f=n.stmt?.kind??``,p=()=>s.getState();if(e.conn.transactionMode===`manual`&&l.capabilities.transactions&&n.stmt&&W(n.stmt)&&!p().transactionOpen[o]){let e=await m(c,l.getQuery(`START_TRANSACTION`),a||void 0);if(!e.success)throw new I(e.message??i.t(`services.transaction.startFailed`));p().setTransactionOpen(o,!0),r.getState().setFooterMessage(i.t(`services.transaction.started`))}let h=await m(c,n.sql,a||void 0);if(!h.success){let r=h.message??i.t(`services.query.failed`);throw d.getState().recordExecution({connectionId:o,tabId:u,query:n.sql,database:a,executionTime:h.execTime,error:r,kind:f||void 0}),t(`query_execute`,{dbms:e.conn.dbms,kind:f||`unknown`,source:u?`editor`:`app`,success:!1}),new I(r,n.sql)}let g=se(h);return f===`COMMIT`||f===`ROLLBACK`?p().setTransactionOpen(o,!1):f===`START`||f===`BEGIN`?p().setTransactionOpen(o,!0):H.has(f)&&p().transactionOpen[o]&&l.capabilities.implicitCommitDdl&&(p().setTransactionOpen(o,!1),r.getState().setFooterMessage(i.t(`services.transaction.implicitCommit`,{kind:f}))),U.has(f)&&F(o,a),e.skipHistory||d.getState().recordExecution({connectionId:o,tabId:u,query:n.sql,database:a,executionTime:h.execTime,kind:f||void 0,...g.fields.length>0?{rowCount:g.rows.length}:{affectedRows:g.affectedRows}}),t(`query_execute`,{dbms:e.conn.dbms,kind:f||`unknown`,source:u?`editor`:`app`,success:!0,exec_time_ms:Math.round(h.execTime??0)}),{qr:g,execTime:h.execTime}}async function fe(e,t,n={}){let r=q(e,n.tabId??null);r.skipHistory=n.skipHistory;let a=t.trim();if(!a)throw new I(i.t(`services.query.nothingToExecute`));let o=await J(r,a,n),s=n.database??``;n.previewWrites&&c.getState().previewAffectedRows&&await Q(r,o,s);let l=o.length>0?o.map(e=>({sql:e.sql,stmt:e})):[{sql:a,stmt:null}],u=null;for(let e of l){let{qr:t}=await Y(r,e,s);n.primaryKeys&&t.fields.length>0&&s&&await R(t,r.serverConnId,s,r.engine),u=t}return u}function pe(e,t){return X(e,t)?.sql??null}function X(e,t){let n=d.getState().tabs[e]?.find(e=>e.id===t);if(!n)return null;let r=y(e,t);if(r&&`selection`in r)return{sql:r.selection,start:r.start};let i=r&&`cursorOffset`in r?r.cursorOffset:n.query.length,a=new b(_(e)).statements(n.query);if(a.length===0)return null;let o=a.find(e=>i>=S(e)&&i<=e.end)??[...a].reverse().find(e=>e.end<=i)??a[0];return{sql:o.sql,start:S(o)}}async function me(e,n,r={}){let s=()=>d.getState(),l=s().tabs[e]?.find(e=>e.id===n);if(!l)return;let u=(r.sql??l.query)?.trim();if(!u)return;let f,p;try{f=q(e,n),p=await J(f,u,{})}catch(t){if(t instanceof L){t.message!==`Cancelled`&&s().setError(e,n,t.message);return}s().setError(e,n,t instanceof Error?t.message:String(t));return}let m=c.getState(),h=new Map;if(m.previewAffectedRows)try{h=await Q(f,p,l.database||``)}catch(e){if(e instanceof L)return;throw e}let g=h.size===1,_=p.length>0?p.map(e=>({...G(e,m.resultRowLimit,f.engine.syntax.limitStyle),stmt:e})):[{sql:u,limited:!1,stmt:null}],v=r.sql?r.sqlOffset??null:0;a(async()=>{let{readStructures:e}=await import(`./main-BwM1zx0B.js`).then(e=>e.Q);return{readStructures:e}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24])).then(({readStructures:t})=>t(e,n,p.length>0?p.map(e=>({sql:e.sql,start:v===null?null:v+S(e)})):[{sql:u,start:v}])),s().captureRevision(e,n,`execute`),s().setExecuting(e,n,!0),s().setError(e,n,null);let y=[],b=l.database||``;try{for(let r of _){let{qr:a,execTime:o}=await Y(f,r,b);if(a.sql=r.stmt?.sql??r.sql,a.executionTime=o,r.limited&&a.rows.length>=m.resultRowLimit&&(a.limited=!0,a.message=i.t(`services.query.rowsReturnedLimited`,{count:a.rows.length,limit:m.resultRowLimit})),!b&&a.fields.length>0){let t=a.fields.find(e=>e.db)?.db;t&&(b=t,s().setDatabase(e,n,b),A(e,b))}a.fields.length>0&&b&&await R(a,f.serverConnId,b,f.engine);let c=g&&r.stmt?h.get(r.stmt):void 0;c!==void 0&&Number.isFinite(a.affectedRows)&&a.affectedRows!==c&&(a.warning=i.t(`services.query.dryRunMismatch`,{predicted:c,actual:a.affectedRows}),t(`dry_run_mismatch`,{dbms:f.conn.dbms,kind:r.stmt?.kind??`unknown`})),y.push(a)}s().setResults(e,n,y)}catch(t){y.length>0&&s().setResults(e,n,y),s().setError(e,n,t instanceof Error?t.message:String(t),t instanceof I?t.sql:null),t instanceof I&&o(`query_error`)}finally{s().setExecuting(e,n,!1)}}var he=50;function Z(e,t,n){return e.syntax.limitStyle===`top`?t.replace(/^SELECT\b/i,`SELECT TOP ${n}`):`${t} ${e.limitClause(n)}`}async function Q(e,t,n){let i=new Map;for(let a of t){if(a.kind!==`UPDATE`&&a.kind!==`DELETE`)continue;let t=C(a);if(!t)continue;let o=null,s=[],c=[],l,u=await m(e.serverConnId,t.count,n||void 0);if(u.success){let r=Number(u.records[0]?.[0]);o=Number.isFinite(r)?r:null;let i=await m(e.serverConnId,t.limited?t.select:Z(e.engine,t.select,he),n||void 0);i.success?(s=i.fields.map(e=>e.name),c=i.records):l=i.message}else l=u.message;if(!await r.getState().requestDryRun({statement:a.sql,previewSql:t.select,count:o,fields:s,rows:c,truncated:o!==null&&c.length<o,error:l}))throw new L;o!==null&&i.set(a,o)}return i}async function $(e,t){let n=s.getState(),a=n.activeConnections.find(t=>t.id===e);if(!a?.serverConnectionId)return;let o=_(e);try{let e=await m(a.serverConnectionId,o.getQuery(t));if(!e.success)throw new I(e.message??i.t(`services.transaction.commandFailed`,{name:t}));r.getState().setFooterMessage(t===`COMMIT`?i.t(`services.transaction.committed`):i.t(`services.transaction.rolledBack`))}catch(e){r.getState().setFooterMessage(i.t(`services.transaction.commandFailedWith`,{name:t,message:e instanceof Error?e.message:String(e)}))}finally{n.setTransactionOpen(e,!1)}}var ge=e=>$(e,`COMMIT`),_e=e=>$(e,`ROLLBACK`);export{re as _,me as a,_e as c,K as d,ce as f,A as g,ae as h,ge as i,fe as l,oe as m,I as n,pe as o,F as p,G as r,B as s,L as t,X as u,ne as v};
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/index-Tw24-4of.js","assets/rolldown-runtime-hePW80VL.js","assets/ui-store-5IssrgmG.js","assets/button-B2EsmMJs.js","assets/i18n-C0aLwQ_k.js","assets/dist-BYhFWvmC.js","assets/app-storage-C_1RLCyI.js","assets/connection-store-B85kbJpB.js","assets/settings-store-DzQ3BP5e.js","assets/tunneling-B7lL9I14.js","assets/hmr-singleton-Bit0Kfog.js","assets/query-store-BqBiylGA.js","assets/database-BSXLJRzV.js","assets/dbms-BwnatOMe.js","assets/engine-DjP-Sw-S.js","assets/editor-registry-ukUyoekH.js","assets/error-hints-BsG7qe62.js","assets/schema-nodes-MgIiKfpG.js","assets/pro-usage-BxwRZwtM.js","assets/table-definition-Bs5VSn0X.js","assets/index-dwv2QL4R.css"])))=>i.map(i=>d[i]);
2
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{c as t,h as n,n as r}from"./ui-store-5IssrgmG.js";import{a as i,i as a}from"./i18n-C0aLwQ_k.js";import{s as o,t as s}from"./connection-store-B85kbJpB.js";import{n as c}from"./settings-store-DzQ3BP5e.js";import{D as l}from"./tunneling-B7lL9I14.js";import{t as u}from"./hmr-singleton-Bit0Kfog.js";import{n as d}from"./query-store-BqBiylGA.js";import{S as f,a as p,c as m}from"./database-BSXLJRzV.js";import{a as h,o as g}from"./dbms-BwnatOMe.js";import{n as _,r as v}from"./engine-DjP-Sw-S.js";import{i as y}from"./editor-registry-ukUyoekH.js";import{c as b,d as x,f as S,l as C,p as ee,t as w}from"./error-hints-BsG7qe62.js";import{n as T,t as te}from"./schema-nodes-MgIiKfpG.js";function E(e){return s.getState().activeConnections.find(t=>t.id===e)?.database||te(f.getState().trees[e]??[])}function ne(e,t,n,r){return _(e).tree.objectPath(t,n,r,E(e))}function D(e,t){return _(e).tree.namespacePath(t,E(e))}function O(e,t){for(let n of e){if(n.id===t)return n;let e=O(n.children,t);if(e)return e}return null}async function re(e,t,n){let r=f.getState;for(let i=0;i<t.length;i++){let a=r().trees[e];if(!a)return!1;let o=O(a,t[i]);if(!o)return!1;if(i===t.length-1)return r().setSelected(e,o.id),!0;o.children.length===0&&!o.isLeaf?await n(e,o):o.isExpanded||r().setExpanded(e,o.id,!0)}return!1}function k(e,t){for(let n of e){if(n.id===t)return n;let e=k(n.children,t);if(e)return e}return null}function A(e,t){let n=f.getState(),r=n.trees[e];if(!r||!t)return;let i=D(e,t),a=null;for(let t of i){let i=k(r,t);if(!i||(a=i,i.isLeaf))break;!i.isExpanded&&i.children.length>0&&n.setExpanded(e,i.id,!0)}!a||a.id!==i[i.length-1]||(n.setSelected(e,a.id),!a.isExpanded&&a.children.length>0&&n.setExpanded(e,a.id,!0))}var j=e(n(),1);function ie(e,t,n){let r=[];function i(e){for(let n of e){if(r.push(n),n.id===t||n.children.length>0&&i(n.children))return!0;r.pop()}return!1}i(e);for(let e=r.length-1;e>=0;e--)if(r[e].type===n)return r[e];return null}function M(e,t){for(let n of e){if(n.id===t)return n;if(n.children.length>0){let e=M(n.children,t);if(e)return e}}return null}var N=u(`schemaTreeLoadingRoots`,()=>new Set);function P(e){let t=s.getState().activeConnections.find(t=>t.id===e);return t?.serverConnectionId?{engine:_(e),run:p(t.serverConnectionId),database:t.database||void 0}:null}function ae(){let{setTree:e,setChildren:t,setNodeMetadata:n,setLoading:a}=f(),o=(0,j.useCallback)(async t=>{let n=P(t);if(n&&!N.has(t)){N.add(t);try{e(t,await n.engine.tree.loadRoot(n))}catch(n){let a=n instanceof Error?n.message:String(n);console.error(`Failed to load databases:`,n),r.getState().setFooterMessage(i.t(`schema.tree.loadDatabasesFailed`,{message:a})),e(t,[])}finally{N.delete(t)}}},[e]),s=(0,j.useCallback)(async(e,r)=>{if(!f.getState().trees[e])return;let i=P(e);if(i&&!r.isLeaf){a(e,r.id,!0);try{let a=await i.engine.tree.loadChildren(i,r);t(e,r.id,a),Promise.all(a.filter(e=>e.type===g.FOLDER&&e.metadata?.countable).map(async t=>{try{let r=await i.engine.tree.loadChildren(i,t);n(e,t.id,{count:r.length})}catch(e){console.error(`Failed to count ${t.text}:`,e)}}))}catch(t){console.error(`Failed to load children:`,t),a(e,r.id,!1)}}},[t,n,a]);return{loadDatabases:o,loadChildren:s,refreshNode:(0,j.useCallback)(async(e,t)=>{await s(e,t)},[s]),createNode:h,findNode:M,findAncestor:ie}}async function F(e,t){w(e,t);let n=f.getState().trees[e];if(!n||!t)return;let r=P(e);if(!r)return;let i=D(e,t),a=T(n,i[i.length-1]);!a||a.children.length===0||await Promise.all(a.children.filter(e=>e.type===g.FOLDER).map(async t=>{try{let n=await r.engine.tree.loadChildren(r,t),i=f.getState();(t.children.length>0||t.isExpanded)&&i.setChildren(e,t.id,n),t.metadata?.countable&&i.setNodeMetadata(e,t.id,{count:n.length})}catch(e){console.error(`Failed to refresh ${t.text}:`,e)}}))}async function oe(e){w(e);let t=P(e);t&&f.getState().setTree(e,await t.engine.tree.loadRoot(t))}var I=class extends Error{sql;constructor(e,t){super(e),this.name=`QueryError`,this.sql=t}},L=class extends Error{constructor(e=`Cancelled`){super(e),this.name=`ExecutionCancelled`}};function se(e){let t=e.fields??[],n=e.records??[];return{fields:t.map(e=>({name:e.name,type:e.type,orgTable:e.orgTable??e.table??``,orgName:e.orgName??e.name,db:e.db??``})),rows:n.map(e=>{let n={};return t.forEach((t,r)=>{n[t.name]=e[r]}),n}),affectedRows:e.affectedRows??0,insertId:e.insertId??0,message:e.message??(n.length>0?i.t(`services.query.rowsReturned`,{count:n.length}):i.t(`services.query.rowsAffected`,{count:e.affectedRows??0}))}}async function R(e,t,n,r=v(t)){let i=new Set(e.fields.map(e=>e.orgTable).filter(Boolean));if(i.size!==1)return e;let a=[...i][0];try{let i=await r.introspect.getPrimaryKeys(p(t),n,a);i.length>0&&(e.primaryKeys=i)}catch{}return!e.primaryKeys?.length&&e.fields.some(e=>e.name===`_rowid_`)&&(e.primaryKeys=[l]),e}var z=new Set([`SELECT`,`SHOW`,`EXPLAIN`,`DESCRIBE`,`DESC`,`HELP`,`VALUES`,`TABLE`,`WITH`,`USE`,`SET`,`CHECK`,`CHECKSUM`]);function B(e){return e.kind===`PRAGMA`?!e.sql.includes(`=`):!(!z.has(e.kind)||e.destructive||e.kind===`SELECT`&&x(e,`INTO`))}var V=new Set([`INSERT`,`UPDATE`,`DELETE`,`REPLACE`,`MERGE`,`LOAD`]),H=new Set([`CREATE`,`ALTER`,`DROP`,`TRUNCATE`,`RENAME`,`GRANT`,`REVOKE`,`FLUSH`,`LOCK`,`UNLOCK`]),U=new Set([`CREATE`,`ALTER`,`DROP`,`RENAME`]);function W(e){return V.has(e.kind)||!!e.destructive?.dataLoss}function G(e,t,n=`limit`){if(t<=0||e.kind!==`SELECT`||e.limit!==null||x(e,`LIMIT`)||x(e,`INTO`)||x(e,`FOR`)||x(e,`LOCK`))return{sql:e.sql,limited:!1};if(n===`top`){if(x(e,`TOP`)||x(e,`OFFSET`))return{sql:e.sql,limited:!1};let n=ee(e);return n===-1?{sql:e.sql,limited:!1}:{sql:`${e.sql.slice(0,n)} TOP ${t}${e.sql.slice(n)}`,limited:!0}}return n===`fetch`?x(e,`FETCH`)||/\bROWNUM\b/i.test(e.sql)?{sql:e.sql,limited:!1}:{sql:`${e.sql} FETCH FIRST ${t} ROWS ONLY`,limited:!0}:{sql:`${e.sql} LIMIT ${t}`,limited:!0}}function ce(e,t=0){let n=K();return n<=0?``:e.limitClause(n,t)}function K(){return c.getState().resultRowLimit}function le(e){let t=e.destructive,n=t.names.length?t.names.join(`, `):i.t(`services.destructive.unknownTarget`);switch(t.action){case`DROP`:return`DROP ${t.objectType} ${n}`;case`TRUNCATE`:return`TRUNCATE ${n}`;case`DELETE_ALL`:return i.t(`services.destructive.deleteAll`,{target:n});case`UPDATE_ALL`:return i.t(`services.destructive.updateAll`,{target:n});case`ALTER_DROP`:return i.t(`services.destructive.alterDrop`,{target:n})}}async function ue(e){if(!c.getState().confirmDestructive)return!0;let t=e.filter(e=>e.destructive?.dataLoss);return t.length===0||r.getState().requestDestructiveConfirm({title:i.t(`services.destructive.title`,{count:t.length}),description:i.t(`services.destructive.description`),statements:t.map(le),confirmLabel:i.t(`services.runAnyway`)})}async function de(e,t){if(!e.readOnly)return;let n=t.filter(e=>!B(e));if(n.length===0)return;let a=`${e.hostName||e.host}`;if(!c.getState().allowReadOnlyOverride)throw new I(i.t(`services.readOnly.refused`,{label:a,count:n.length}));if(!await r.getState().requestDestructiveConfirm({title:i.t(`services.readOnly.title`,{label:a}),description:i.t(`services.readOnly.description`),statements:n.map(e=>e.sql.length>120?e.sql.slice(0,117)+`...`:e.sql),confirmLabel:i.t(`services.runAnyway`)}))throw new L(`Cancelled: connection is read-only.`)}function q(e,t){let n=s.getState(),r=n.activeConnections.find(t=>t.id===e);if(!r?.serverConnectionId)throw new I(i.t(`services.query.notConnected`));if(n.pendingReopen[e])throw new I(i.t(`services.query.fileNotOpen`));return{connId:e,serverConnId:r.serverConnectionId,conn:r,engine:_(e),tabId:t}}async function J(e,t,n){let r=new b(e.engine).statements(t);if(e.conn.scratchpad){let{materializeFederated:t}=await a(async()=>{let{materializeFederated:e}=await import(`./index-Tw24-4of.js`).then(e=>e.V);return{materializeFederated:e}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]));for(let n of r)n.sql=await t(e.connId,n.sql)}if(await de(e.conn,r),!n.skipDestructiveConfirm&&!await ue(r))throw new L;return r}async function Y(e,n,a){let{connId:o,serverConnId:c,engine:l,tabId:u}=e,f=n.stmt?.kind??``,p=()=>s.getState();if(e.conn.transactionMode===`manual`&&l.capabilities.transactions&&n.stmt&&W(n.stmt)&&!p().transactionOpen[o]){let e=await m(c,l.getQuery(`START_TRANSACTION`),a||void 0);if(!e.success)throw new I(e.message??i.t(`services.transaction.startFailed`));p().setTransactionOpen(o,!0),r.getState().setFooterMessage(i.t(`services.transaction.started`))}let h=await m(c,n.sql,a||void 0);if(!h.success){let r=h.message??i.t(`services.query.failed`);throw d.getState().recordExecution({connectionId:o,tabId:u,query:n.sql,database:a,executionTime:h.execTime,error:r,kind:f||void 0}),t(`query_execute`,{dbms:e.conn.dbms,kind:f||`unknown`,source:u?`editor`:`app`,success:!1}),new I(r,n.sql)}let g=se(h);return f===`COMMIT`||f===`ROLLBACK`?p().setTransactionOpen(o,!1):f===`START`||f===`BEGIN`?p().setTransactionOpen(o,!0):H.has(f)&&p().transactionOpen[o]&&l.capabilities.implicitCommitDdl&&(p().setTransactionOpen(o,!1),r.getState().setFooterMessage(i.t(`services.transaction.implicitCommit`,{kind:f}))),U.has(f)&&F(o,a),e.skipHistory||d.getState().recordExecution({connectionId:o,tabId:u,query:n.sql,database:a,executionTime:h.execTime,kind:f||void 0,...g.fields.length>0?{rowCount:g.rows.length}:{affectedRows:g.affectedRows}}),t(`query_execute`,{dbms:e.conn.dbms,kind:f||`unknown`,source:u?`editor`:`app`,success:!0,exec_time_ms:Math.round(h.execTime??0)}),{qr:g,execTime:h.execTime}}async function fe(e,t,n={}){let r=q(e,n.tabId??null);r.skipHistory=n.skipHistory;let a=t.trim();if(!a)throw new I(i.t(`services.query.nothingToExecute`));let o=await J(r,a,n),s=n.database??``;n.previewWrites&&c.getState().previewAffectedRows&&await Q(r,o,s);let l=o.length>0?o.map(e=>({sql:e.sql,stmt:e})):[{sql:a,stmt:null}],u=null;for(let e of l){let{qr:t}=await Y(r,e,s);n.primaryKeys&&t.fields.length>0&&s&&await R(t,r.serverConnId,s,r.engine),u=t}return u}function pe(e,t){return X(e,t)?.sql??null}function X(e,t){let n=d.getState().tabs[e]?.find(e=>e.id===t);if(!n)return null;let r=y(e,t);if(r&&`selection`in r)return{sql:r.selection,start:r.start};let i=r&&`cursorOffset`in r?r.cursorOffset:n.query.length,a=new b(_(e)).statements(n.query);if(a.length===0)return null;let o=a.find(e=>i>=S(e)&&i<=e.end)??[...a].reverse().find(e=>e.end<=i)??a[0];return{sql:o.sql,start:S(o)}}async function me(e,n,r={}){let s=()=>d.getState(),l=s().tabs[e]?.find(e=>e.id===n);if(!l)return;let u=(r.sql??l.query)?.trim();if(!u)return;let f,p;try{f=q(e,n),p=await J(f,u,{})}catch(t){if(t instanceof L){t.message!==`Cancelled`&&s().setError(e,n,t.message);return}s().setError(e,n,t instanceof Error?t.message:String(t));return}let m=c.getState(),h=new Map;if(m.previewAffectedRows)try{h=await Q(f,p,l.database||``)}catch(e){if(e instanceof L)return;throw e}let g=h.size===1,_=p.length>0?p.map(e=>({...G(e,m.resultRowLimit,f.engine.syntax.limitStyle),stmt:e})):[{sql:u,limited:!1,stmt:null}],v=r.sql?r.sqlOffset??null:0;a(async()=>{let{readStructures:e}=await import(`./index-Tw24-4of.js`).then(e=>e.nt);return{readStructures:e}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20])).then(({readStructures:t})=>t(e,n,p.length>0?p.map(e=>({sql:e.sql,start:v===null?null:v+S(e)})):[{sql:u,start:v}])),s().captureRevision(e,n,`execute`),s().setExecuting(e,n,!0),s().setError(e,n,null);let y=[],b=l.database||``;try{for(let r of _){let{qr:a,execTime:o}=await Y(f,r,b);if(a.sql=r.stmt?.sql??r.sql,a.executionTime=o,r.limited&&a.rows.length>=m.resultRowLimit&&(a.limited=!0,a.message=i.t(`services.query.rowsReturnedLimited`,{count:a.rows.length,limit:m.resultRowLimit})),!b&&a.fields.length>0){let t=a.fields.find(e=>e.db)?.db;t&&(b=t,s().setDatabase(e,n,b),A(e,b))}a.fields.length>0&&b&&await R(a,f.serverConnId,b,f.engine);let c=g&&r.stmt?h.get(r.stmt):void 0;c!==void 0&&Number.isFinite(a.affectedRows)&&a.affectedRows!==c&&(a.warning=i.t(`services.query.dryRunMismatch`,{predicted:c,actual:a.affectedRows}),t(`dry_run_mismatch`,{dbms:f.conn.dbms,kind:r.stmt?.kind??`unknown`})),y.push(a)}s().setResults(e,n,y)}catch(t){y.length>0&&s().setResults(e,n,y),s().setError(e,n,t instanceof Error?t.message:String(t),t instanceof I?t.sql:null),t instanceof I&&o(`query_error`)}finally{s().setExecuting(e,n,!1)}}var he=50;function Z(e,t,n){return e.syntax.limitStyle===`top`?t.replace(/^SELECT\b/i,`SELECT TOP ${n}`):`${t} ${e.limitClause(n)}`}async function Q(e,t,n){let i=new Map;for(let a of t){if(a.kind!==`UPDATE`&&a.kind!==`DELETE`)continue;let t=C(a);if(!t)continue;let o=null,s=[],c=[],l,u=await m(e.serverConnId,t.count,n||void 0);if(u.success){let r=Number(u.records[0]?.[0]);o=Number.isFinite(r)?r:null;let i=await m(e.serverConnId,t.limited?t.select:Z(e.engine,t.select,he),n||void 0);i.success?(s=i.fields.map(e=>e.name),c=i.records):l=i.message}else l=u.message;if(!await r.getState().requestDryRun({statement:a.sql,previewSql:t.select,count:o,fields:s,rows:c,truncated:o!==null&&c.length<o,error:l}))throw new L;o!==null&&i.set(a,o)}return i}async function $(e,t){let n=s.getState(),a=n.activeConnections.find(t=>t.id===e);if(!a?.serverConnectionId)return;let o=_(e);try{let e=await m(a.serverConnectionId,o.getQuery(t));if(!e.success)throw new I(e.message??i.t(`services.transaction.commandFailed`,{name:t}));r.getState().setFooterMessage(t===`COMMIT`?i.t(`services.transaction.committed`):i.t(`services.transaction.rolledBack`))}catch(e){r.getState().setFooterMessage(i.t(`services.transaction.commandFailedWith`,{name:t,message:e instanceof Error?e.message:String(e)}))}finally{n.setTransactionOpen(e,!1)}}var ge=e=>$(e,`COMMIT`),_e=e=>$(e,`ROLLBACK`);export{re as _,me as a,_e as c,K as d,ce as f,A as g,ae as h,ge as i,fe as l,oe as m,I as n,pe as o,F as p,G as r,B as s,L as t,X as u,ne as v};
@@ -1 +1 @@
1
- import{r as e}from"./ui-store-5IssrgmG.js";import{i as t,t as n}from"./app-storage-C_1RLCyI.js";import{S as r,a as i,i as a,n as o,r as s}from"./connection-store-D-Lp5EFj.js";import{n as c}from"./settings-store-DzQ3BP5e.js";var l=200,u=Object.freeze([]);function d(e,t,n){return e.map(e=>e.id===t?{...e,...n}:e)}function f(e){let t=e;if(delete t.erdOpen,delete t.erdDatabase,t.tabs&&typeof t.tabs==`object`){let e=t.tabs;for(let t of Object.keys(e))e[t]=e[t].map(e=>{if(!Array.isArray(e.results)){let t={...e};return delete t.result,{...t,results:[]}}return e})}return t}var p=e()(t((e,t)=>({tabs:{},activeTabId:{},history:[],addQueryTab:(t,n)=>e(e=>{let r=e.tabs[t]??[];return{tabs:{...e.tabs,[t]:[...r,n]},activeTabId:{...e.activeTabId,[t]:n.id}}}),removeQueryTab:(e,n)=>t().removeQueryTabs(e,[n]),removeQueryTabs:(n,r)=>{for(let e of r)t().captureRevision(n,e,`close`);e(e=>{let t=new Set(r),i=(e.tabs[n]??[]).filter(e=>!t.has(e.id)),a=e.activeTabId[n],o=a&&t.has(a)?i.length>0?i[i.length-1].id:null:a;return{tabs:{...e.tabs,[n]:i},activeTabId:{...e.activeTabId,[n]:o}}})},reorderQueryTab:(t,n,r)=>e(e=>({tabs:{...e.tabs,[t]:i(e.tabs[t]??[],n,r)}})),setActiveQueryTab:(t,n)=>e(e=>({activeTabId:{...e.activeTabId,[t]:n}})),setEditorContent:(n,r,i)=>{e(e=>{let t=e.tabs[n]??[];return{tabs:{...e.tabs,[n]:d(t,r,{query:i})}}});let a=t().tabs[n]?.find(e=>e.id===r);a&&s(n,{docId:r,title:a.title,text:i,database:a.database,reason:`edit`})},setResults:(t,n,r)=>e(e=>{let i=e.tabs[t]??[];return{tabs:{...e.tabs,[t]:d(i,n,{results:r,isExecuting:!1,error:null})}}}),setExecuting:(t,n,r)=>e(e=>{let i=e.tabs[t]??[];return{tabs:{...e.tabs,[t]:d(i,n,{isExecuting:r})}}}),setPlan:(t,n,r)=>e(e=>{let i=e.tabs[t]??[];return{tabs:{...e.tabs,[t]:d(i,n,{plan:r})}}}),setGraphs:(t,n,r)=>e(e=>{let i=e.tabs[t];return i?{tabs:{...e.tabs,[t]:d(i,n,{graphs:r})}}:e}),setError:(t,n,r,i=null)=>e(e=>{let a=e.tabs[t]??[];return{tabs:{...e.tabs,[t]:d(a,n,{error:r,errorSql:r?i:null,...r?{isExecuting:!1}:{}})}}}),setDatabase:(t,n,r)=>e(e=>{let i=e.tabs[t]??[];return{tabs:{...e.tabs,[t]:d(i,n,{database:r})}}}),setExecutionTime:(t,n,r)=>e(e=>{let i=e.tabs[t]??[];return{tabs:{...e.tabs,[t]:d(i,n,{executionTime:r})}}}),addHistory:t=>e(e=>({history:[t,...e.history].slice(0,500)})),recordExecution:({connectionId:e,tabId:n,query:i,database:a,executionTime:o,error:s,kind:c,rowCount:l,affectedRows:u})=>t().addHistory({id:crypto.randomUUID(),query:r(i),database:a,timestamp:Date.now(),executionTime:o,success:!s,connectionId:e,tabId:n??void 0,...s?{error:s}:{},...c?{kind:c}:{},...l==null?{}:{rowCount:l},...u==null?{}:{affectedRows:u}}),clearHistory:()=>e({history:[]}),captureRevision:(e,n,r)=>{let i=t().tabs[e]?.find(e=>e.id===n);i&&(o(e,n),a.getState().capture(e,{docId:n,title:i.title,text:i.query,database:i.database,reason:r}))}}),{name:`planche-query`,storage:n(),version:2,migrate:f,partialize:e=>({tabs:Object.fromEntries(Object.entries(e.tabs).map(([e,t])=>[e,t.map(e=>({...e,isExecuting:!1,results:[],plan:null,graphs:null,error:null,errorSql:null,executionTime:null}))])),activeTabId:e.activeTabId,history:c.getState().persistQueryHistory?e.history.slice(0,l):[]})}));export{p as n,u as t};
1
+ import{r as e}from"./ui-store-5IssrgmG.js";import{i as t,t as n}from"./app-storage-C_1RLCyI.js";import{S as r,a as i,i as a,n as o,r as s}from"./connection-store-B85kbJpB.js";import{n as c}from"./settings-store-DzQ3BP5e.js";var l=200,u=Object.freeze([]);function d(e,t,n){return e.map(e=>e.id===t?{...e,...n}:e)}function f(e){let t=e;if(delete t.erdOpen,delete t.erdDatabase,t.tabs&&typeof t.tabs==`object`){let e=t.tabs;for(let t of Object.keys(e))e[t]=e[t].map(e=>{if(!Array.isArray(e.results)){let t={...e};return delete t.result,{...t,results:[]}}return e})}return t}var p=e()(t((e,t)=>({tabs:{},activeTabId:{},history:[],addQueryTab:(t,n)=>e(e=>{let r=e.tabs[t]??[];return{tabs:{...e.tabs,[t]:[...r,n]},activeTabId:{...e.activeTabId,[t]:n.id}}}),removeQueryTab:(e,n)=>t().removeQueryTabs(e,[n]),removeQueryTabs:(n,r)=>{for(let e of r)t().captureRevision(n,e,`close`);e(e=>{let t=new Set(r),i=(e.tabs[n]??[]).filter(e=>!t.has(e.id)),a=e.activeTabId[n],o=a&&t.has(a)?i.length>0?i[i.length-1].id:null:a;return{tabs:{...e.tabs,[n]:i},activeTabId:{...e.activeTabId,[n]:o}}})},reorderQueryTab:(t,n,r)=>e(e=>({tabs:{...e.tabs,[t]:i(e.tabs[t]??[],n,r)}})),setActiveQueryTab:(t,n)=>e(e=>({activeTabId:{...e.activeTabId,[t]:n}})),setEditorContent:(n,r,i)=>{e(e=>{let t=e.tabs[n]??[];return{tabs:{...e.tabs,[n]:d(t,r,{query:i})}}});let a=t().tabs[n]?.find(e=>e.id===r);a&&s(n,{docId:r,title:a.title,text:i,database:a.database,reason:`edit`})},setResults:(t,n,r)=>e(e=>{let i=e.tabs[t]??[];return{tabs:{...e.tabs,[t]:d(i,n,{results:r,isExecuting:!1,error:null})}}}),setExecuting:(t,n,r)=>e(e=>{let i=e.tabs[t]??[];return{tabs:{...e.tabs,[t]:d(i,n,{isExecuting:r})}}}),setPlan:(t,n,r)=>e(e=>{let i=e.tabs[t]??[];return{tabs:{...e.tabs,[t]:d(i,n,{plan:r})}}}),setGraphs:(t,n,r)=>e(e=>{let i=e.tabs[t];return i?{tabs:{...e.tabs,[t]:d(i,n,{graphs:r})}}:e}),setError:(t,n,r,i=null)=>e(e=>{let a=e.tabs[t]??[];return{tabs:{...e.tabs,[t]:d(a,n,{error:r,errorSql:r?i:null,...r?{isExecuting:!1}:{}})}}}),setDatabase:(t,n,r)=>e(e=>{let i=e.tabs[t]??[];return{tabs:{...e.tabs,[t]:d(i,n,{database:r})}}}),setExecutionTime:(t,n,r)=>e(e=>{let i=e.tabs[t]??[];return{tabs:{...e.tabs,[t]:d(i,n,{executionTime:r})}}}),addHistory:t=>e(e=>({history:[t,...e.history].slice(0,500)})),recordExecution:({connectionId:e,tabId:n,query:i,database:a,executionTime:o,error:s,kind:c,rowCount:l,affectedRows:u})=>t().addHistory({id:crypto.randomUUID(),query:r(i),database:a,timestamp:Date.now(),executionTime:o,success:!s,connectionId:e,tabId:n??void 0,...s?{error:s}:{},...c?{kind:c}:{},...l==null?{}:{rowCount:l},...u==null?{}:{affectedRows:u}}),clearHistory:()=>e({history:[]}),captureRevision:(e,n,r)=>{let i=t().tabs[e]?.find(e=>e.id===n);i&&(o(e,n),a.getState().capture(e,{docId:n,title:i.title,text:i.query,database:i.database,reason:r}))}}),{name:`planche-query`,storage:n(),version:2,migrate:f,partialize:e=>({tabs:Object.fromEntries(Object.entries(e.tabs).map(([e,t])=>[e,t.map(e=>({...e,isExecuting:!1,results:[],plan:null,graphs:null,error:null,errorSql:null,executionTime:null}))])),activeTabId:e.activeTabId,history:c.getState().persistQueryHistory?e.history.slice(0,l):[]})}));export{p as n,u as t};
@@ -0,0 +1 @@
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{h as t}from"./ui-store-5IssrgmG.js";import{b as n,l as r,o as i,p as a,s as o,u as s}from"./button-B2EsmMJs.js";import{S as c,_ as l,b as u,d,f,g as p,h as m,m as h,p as g,u as _,v,x as y,y as b}from"./dist-BYhFWvmC.js";import{t as x}from"./chevron-up-CBnVjNE1.js";import{Gt as S,Ht as C,It as w,Jt as T,Kt as E,Lt as D,Ut as O,Wt as k,Yt as A,qt as j}from"./index-Tw24-4of.js";var M=e(n(),1),N=e(t(),1),P=Object.defineProperty,ee=(e,t)=>P(e,`name`,{value:t,configurable:!0});function F(e){let t=N.useRef({value:e,previous:e});return N.useMemo(()=>(t.current.value!==e&&(t.current.previous=t.current.value,t.current.value=e),t.current.previous),[e])}ee(F,`usePrevious`);var I=r(),L=Object.defineProperty,R=(e,t)=>L(e,`name`,{value:t,configurable:!0}),z=[` `,`Enter`,`ArrowUp`,`ArrowDown`],B=[` `,`Enter`],V=`Select`,[H,U,W]=T(V),[G,te]=c(V,[W,E]),K=E(),[ne,q]=G(V),[re,ie]=G(V);function J(e){let{__scopeSelect:t,children:n,open:r,defaultOpen:i,onOpenChange:a,value:o,defaultValue:s,onValueChange:c,dir:u,name:d,autoComplete:f,disabled:p,required:m,form:h,internal_do_not_use_render:g}=e,_=K(t),[v,y]=N.useState(null),[x,C]=N.useState(null),[w,T]=N.useState(!1),E=j(u),[D,O]=b({prop:r,defaultProp:i??!1,onChange:a,caller:V}),[k,A]=b({prop:o,defaultProp:s,onChange:c,caller:V}),M=N.useRef(null),P=N.useRef(k);N.useEffect(()=>{let e=h?v?.ownerDocument.getElementById(h):v?.form;if(e instanceof HTMLFormElement){let t=R(()=>A(P.current),`reset`);return e.addEventListener(`reset`,t),()=>e.removeEventListener(`reset`,t)}},[h,v,A]);let ee=!v||!!h||!!v.closest(`form`),[F,L]=N.useState(new Set),z=l(),B=Array.from(F).map(e=>e.props.value).join(`;`),U=N.useCallback(e=>{L(t=>new Set(t).add(e))},[]),W=N.useCallback(e=>{L(t=>{let n=new Set(t);return n.delete(e),n})},[]),G={required:m,trigger:v,onTriggerChange:y,valueNode:x,onValueNodeChange:C,valueNodeHasChildren:w,onValueNodeHasChildrenChange:T,contentId:z,value:k,onValueChange:A,open:D,onOpenChange:O,dir:E,triggerPointerDownPosRef:M,disabled:p,name:d,autoComplete:f,form:h,nativeOptions:F,nativeSelectKey:B,isFormControl:ee};return(0,I.jsx)(S,{..._,children:(0,I.jsx)(ne,{scope:t,...G,children:(0,I.jsx)(H.Provider,{scope:t,children:(0,I.jsx)(re,{scope:t,onNativeOptionAdd:U,onNativeOptionRemove:W,children:Ve(g)?g(G):n})})})})}R(J,`SelectProvider`);var ae=R(e=>{let{__scopeSelect:t,children:n,...r}=e;return(0,I.jsx)(J,{__scopeSelect:t,...r,internal_do_not_use_render:({isFormControl:e})=>(0,I.jsxs)(I.Fragment,{children:[n,e?(0,I.jsx)(Be,{__scopeSelect:t}):null]})})},`Select`),oe=`SelectTrigger`,se=N.forwardRef(R(function(e,t){let{__scopeSelect:n,disabled:r=!1,...i}=e,s=K(n),c=q(oe,n),l=c.disabled||r,u=a(t,c.onTriggerChange),d=U(n),f=N.useRef(`touch`),[p,m,h]=He(e=>{let t=d().filter(e=>!e.disabled),n=Ue(t,e,t.find(e=>e.value===c.value));n!==void 0&&c.onValueChange(n.value)}),g=R(e=>{l||(c.onOpenChange(!0),h()),e&&(c.triggerPointerDownPosRef.current={x:Math.round(e.pageX),y:Math.round(e.pageY)})},`handleOpen`);return(0,I.jsx)(O,{asChild:!0,...s,children:(0,I.jsx)(o.button,{type:`button`,role:`combobox`,"aria-controls":c.open?c.contentId:void 0,"aria-expanded":c.open,"aria-required":c.required,"aria-autocomplete":`none`,dir:c.dir,"data-state":c.open?`open`:`closed`,disabled:l,"data-disabled":l?``:void 0,"data-placeholder":$(c.value)?``:void 0,...i,ref:u,onClick:y(i.onClick,e=>{e.currentTarget.focus(),f.current!==`mouse`&&g(e)}),onPointerDown:y(i.onPointerDown,e=>{f.current=e.pointerType;let t=e.target;t.hasPointerCapture(e.pointerId)&&t.releasePointerCapture(e.pointerId),e.button===0&&e.ctrlKey===!1&&e.pointerType===`mouse`&&(g(e),e.preventDefault())}),onKeyDown:y(i.onKeyDown,e=>{let t=p.current!==``;!(e.ctrlKey||e.altKey||e.metaKey)&&e.key.length===1&&m(e.key),!(t&&e.key===` `)&&z.includes(e.key)&&(g(),e.preventDefault())})})})},`SelectTrigger`)),ce=`SelectValue`,le=N.forwardRef(R(function(e,t){let{__scopeSelect:n,className:r,style:i,children:s,placeholder:c=``,...l}=e,d=q(ce,n),{onValueNodeHasChildrenChange:f}=d,p=s!==void 0,m=a(t,d.onValueNodeChange);u(()=>{f(p)},[f,p]);let h=$(d.value);return(0,I.jsx)(o.span,{...l,asChild:!h&&l.asChild,ref:m,style:{pointerEvents:`none`},children:(0,I.jsx)(N.Fragment,{children:h?c:s},h?`placeholder`:`value`)})},`SelectValue`)),ue=N.forwardRef(R(function(e,t){let{__scopeSelect:n,children:r,...i}=e;return(0,I.jsx)(o.span,{"aria-hidden":!0,...i,ref:t,children:r||`▼`})},`SelectIcon`)),[de,fe]=G(`SelectPortal`,{forceMount:void 0}),pe=R(e=>{let{__scopeSelect:t,forceMount:n,...r}=e;return(0,I.jsx)(de,{scope:e.__scopeSelect,forceMount:n,children:(0,I.jsx)(g,{asChild:!0,...r})})},`SelectPortal`),Y=`SelectContent`,me=N.forwardRef(R(function(e,t){let n=fe(Y,e.__scopeSelect),{forceMount:r=n.forceMount,...i}=e,a=q(Y,e.__scopeSelect),[o,s]=N.useState();return u(()=>{s(new DocumentFragment)},[]),(0,I.jsx)(v,{present:r||a.open,children:({present:e})=>e?(0,I.jsx)(ve,{...i,ref:t}):(0,I.jsx)(he,{...i,fragment:o})})},`SelectContent`)),he=N.forwardRef(R(function(e,t){let{__scopeSelect:n,children:r,fragment:i}=e;return i?M.createPortal((0,I.jsx)(ge,{scope:n,children:(0,I.jsx)(H.Slot,{scope:n,children:(0,I.jsx)(`div`,{ref:t,children:r})})}),i):null},`SelectContentFragment`)),X=10,[ge,Z]=G(Y),_e=s(`SelectContent.RemoveScroll`),ve=N.forwardRef(R(function(e,t){let{__scopeSelect:n}=e,{position:r=`item-aligned`,onCloseAutoFocus:i,onEscapeKeyDown:o,onPointerDownOutside:s,side:c,sideOffset:l,align:u,alignOffset:p,arrowPadding:g,collisionBoundary:v,collisionPadding:b,sticky:x,hideWhenDetached:S,avoidCollisions:C,...w}=e,T=q(Y,n),[E,D]=N.useState(null),[O,k]=N.useState(null),A=a(t,D),[j,M]=N.useState(null),[P,ee]=N.useState(null),F=U(n),[L,z]=N.useState(!1),B=N.useRef(!1);N.useEffect(()=>{if(E)return _(E)},[E]),f();let V=N.useCallback(e=>{let[t,...n]=F().map(e=>e.ref.current),[r]=n.slice(-1),i=document.activeElement;for(let n of e)if(n===i||(n?.scrollIntoView({block:`nearest`}),n===t&&O&&(O.scrollTop=0),n===r&&O&&(O.scrollTop=O.scrollHeight),n?.focus(),document.activeElement!==i))return},[F,O]),H=N.useCallback(()=>V([j,E]),[V,j,E]);N.useEffect(()=>{L&&H()},[L,H]);let{onOpenChange:W,triggerPointerDownPosRef:G}=T;N.useEffect(()=>{if(E){let e={x:0,y:0},t=R(t=>{e={x:Math.abs(Math.round(t.pageX)-(G.current?.x??0)),y:Math.abs(Math.round(t.pageY)-(G.current?.y??0))}},`handlePointerMove`),n=R(n=>{e.x<=10&&e.y<=10?n.preventDefault():n.composedPath().includes(E)||W(!1),document.removeEventListener(`pointermove`,t),G.current=null},`handlePointerUp`);return G.current!==null&&(document.addEventListener(`pointermove`,t),document.addEventListener(`pointerup`,n,{capture:!0,once:!0})),()=>{document.removeEventListener(`pointermove`,t),document.removeEventListener(`pointerup`,n,{capture:!0})}}},[E,W,G]),N.useEffect(()=>{let e=R(()=>W(!1),`close`);return window.addEventListener(`blur`,e),window.addEventListener(`resize`,e),()=>{window.removeEventListener(`blur`,e),window.removeEventListener(`resize`,e)}},[W]);let[te,K]=He(e=>{let t=F().filter(e=>!e.disabled),n=Ue(t,e,t.find(e=>e.ref.current===document.activeElement));n&&setTimeout(()=>n.ref.current?.focus())}),ne=N.useCallback((e,t,n)=>{let r=!B.current&&!n;(T.value!==void 0&&T.value===t||r)&&(M(e),r&&(B.current=!0))},[T.value]),re=N.useCallback(()=>E?.focus(),[E]),ie=N.useCallback((e,t,n)=>{let r=!B.current&&!n;(T.value!==void 0&&T.value===t||r)&&ee(e)},[T.value]),J=r===`popper`?be:ye,ae=J===be?{side:c,sideOffset:l,align:u,alignOffset:p,arrowPadding:g,collisionBoundary:v,collisionPadding:b,sticky:x,hideWhenDetached:S,avoidCollisions:C}:{};return(0,I.jsx)(ge,{scope:n,content:E,viewport:O,onViewportChange:k,itemRefCallback:ne,selectedItem:j,onItemLeave:re,itemTextRefCallback:ie,focusSelectedItem:H,selectedItemText:P,position:r,isPositioned:L,searchRef:te,children:(0,I.jsx)(d,{as:_e,allowPinchZoom:!0,children:(0,I.jsx)(h,{asChild:!0,trapped:T.open,onMountAutoFocus:e=>{e.preventDefault()},onUnmountAutoFocus:y(i,e=>{T.trigger?.focus({preventScroll:!0}),e.preventDefault()}),children:(0,I.jsx)(m,{asChild:!0,disableOutsidePointerEvents:!0,onEscapeKeyDown:o,onPointerDownOutside:s,onFocusOutside:e=>e.preventDefault(),onDismiss:()=>T.onOpenChange(!1),children:(0,I.jsx)(J,{role:`listbox`,id:T.contentId,"data-state":T.open?`open`:`closed`,dir:T.dir,onContextMenu:e=>e.preventDefault(),...w,...ae,onPlaced:()=>z(!0),ref:A,style:{display:`flex`,flexDirection:`column`,outline:`none`,...w.style},onKeyDown:y(w.onKeyDown,e=>{let t=e.ctrlKey||e.altKey||e.metaKey;if(e.key===`Tab`&&e.preventDefault(),!t&&e.key.length===1&&K(e.key),[`ArrowUp`,`ArrowDown`,`Home`,`End`].includes(e.key)){let t=F().filter(e=>!e.disabled).map(e=>e.ref.current);if([`ArrowUp`,`End`].includes(e.key)&&(t=t.slice().reverse()),[`ArrowUp`,`ArrowDown`].includes(e.key)){let n=e.target,r=t.indexOf(n);t=t.slice(r+1)}setTimeout(()=>V(t)),e.preventDefault()}})})})})})})},`SelectContentImpl`)),ye=N.forwardRef(R(function(e,t){let{__scopeSelect:n,onPlaced:r,...i}=e,s=q(Y,n),c=Z(Y,n),[l,d]=N.useState(null),[f,p]=N.useState(null),m=a(t,p),h=U(n),g=N.useRef(!1),_=N.useRef(!0),{viewport:v,selectedItem:y,selectedItemText:b,focusSelectedItem:x}=c,S=N.useCallback(()=>{if(s.trigger&&s.valueNode&&l&&f&&v&&y&&b){let e=s.trigger.getBoundingClientRect(),t=f.getBoundingClientRect(),n=s.valueNode.getBoundingClientRect(),i=b.getBoundingClientRect();if(s.dir!==`rtl`){let r=i.left-t.left,a=n.left-r,o=e.left-a,s=e.width+o,c=Math.max(s,t.width),u=window.innerWidth-X,d=C(a,[X,Math.max(X,u-c)]);l.style.minWidth=s+`px`,l.style.left=d+`px`}else{let r=t.right-i.right,a=window.innerWidth-n.right-r,o=window.innerWidth-e.right-a,s=e.width+o,c=Math.max(s,t.width),u=window.innerWidth-X,d=C(a,[X,Math.max(X,u-c)]);l.style.minWidth=s+`px`,l.style.right=d+`px`}let a=h(),o=window.innerHeight-X*2,c=v.scrollHeight,u=window.getComputedStyle(f),d=parseInt(u.borderTopWidth,10),p=parseInt(u.paddingTop,10),m=parseInt(u.borderBottomWidth,10),_=parseInt(u.paddingBottom,10),x=d+p+c+_+m,S=Math.min(y.offsetHeight*5,x),w=window.getComputedStyle(v),T=parseInt(w.paddingTop,10),E=parseInt(w.paddingBottom,10),D=e.top+e.height/2-X,O=o-D,k=y.offsetHeight/2,A=y.offsetTop+k,j=d+p+A,M=x-j;if(j<=D){let e=a.length>0&&y===a[a.length-1].ref.current;l.style.bottom=`0px`;let t=f.clientHeight-v.offsetTop-v.offsetHeight,n=j+Math.max(O,k+(e?E:0)+t+m);l.style.height=n+`px`}else{let e=a.length>0&&y===a[0].ref.current;l.style.top=`0px`;let t=Math.max(D,d+v.offsetTop+(e?T:0)+k)+M;l.style.height=t+`px`,v.scrollTop=j-D+v.offsetTop}l.style.margin=`${X}px 0`,l.style.minHeight=S+`px`,l.style.maxHeight=o+`px`,r?.(),requestAnimationFrame(()=>g.current=!0)}},[h,s.trigger,s.valueNode,l,f,v,y,b,s.dir,r]);u(()=>S(),[S]);let[w,T]=N.useState();u(()=>{f&&T(window.getComputedStyle(f).zIndex)},[f]);let E=N.useCallback(e=>{e&&_.current===!0&&(S(),x?.(),_.current=!1)},[S,x]);return(0,I.jsx)(xe,{scope:n,contentWrapper:l,shouldExpandOnScrollRef:g,onScrollButtonChange:E,children:(0,I.jsx)(`div`,{ref:d,style:{display:`flex`,flexDirection:`column`,position:`fixed`,zIndex:w},children:(0,I.jsx)(o.div,{...i,ref:m,style:{boxSizing:`border-box`,maxHeight:`100%`,...i.style}})})})},`SelectItemAlignedPosition`)),be=N.forwardRef(R(function(e,t){let{__scopeSelect:n,align:r=`start`,collisionPadding:i=X,...a}=e,o=K(n);return(0,I.jsx)(k,{...o,...a,ref:t,align:r,collisionPadding:i,style:{boxSizing:`border-box`,...a.style,"--radix-select-content-transform-origin":`var(--radix-popper-transform-origin)`,"--radix-select-content-available-width":`var(--radix-popper-available-width)`,"--radix-select-content-available-height":`var(--radix-popper-available-height)`,"--radix-select-trigger-width":`var(--radix-popper-anchor-width)`,"--radix-select-trigger-height":`var(--radix-popper-anchor-height)`}})},`SelectPopperPosition`)),[xe,Se]=G(Y,{}),Ce=`SelectViewport`,we=N.forwardRef(R(function(e,t){let{__scopeSelect:n,nonce:r,...i}=e,s=Z(Ce,n),c=Se(Ce,n),l=a(t,s.onViewportChange),u=N.useRef(0);return(0,I.jsxs)(I.Fragment,{children:[(0,I.jsx)(`style`,{dangerouslySetInnerHTML:{__html:`[data-radix-select-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-select-viewport]::-webkit-scrollbar{display:none}`},nonce:r}),(0,I.jsx)(H.Slot,{scope:n,children:(0,I.jsx)(o.div,{"data-radix-select-viewport":``,role:`presentation`,...i,ref:l,style:{position:`relative`,flex:1,overflow:`hidden auto`,...i.style},onScroll:y(i.onScroll,e=>{let t=e.currentTarget,{contentWrapper:n,shouldExpandOnScrollRef:r}=c;if(r?.current&&n){let e=Math.abs(u.current-t.scrollTop);if(e>0){let r=window.innerHeight-X*2,i=parseFloat(n.style.minHeight),a=parseFloat(n.style.height),o=Math.max(i,a);if(o<r){let i=o+e,a=Math.min(r,i),s=i-a;n.style.height=a+`px`,n.style.bottom===`0px`&&(t.scrollTop=s>0?s:0,n.style.justifyContent=`flex-end`)}}}u.current=t.scrollTop})})})]})},`SelectViewport`)),[Te,Ee]=G(`SelectGroup`),De=`SelectItem`,[Oe,ke]=G(De),Ae=N.forwardRef(R(function(e,t){let{__scopeSelect:n,value:r,disabled:i=!1,textValue:s,...c}=e,u=q(De,n),d=Z(De,n),f=u.value===r,[m,h]=N.useState(s??``),[g,_]=N.useState(!1),v=p(e=>d.itemRefCallback?.(e,r,i)),b=a(t,v),x=l(),S=N.useRef(`touch`),C=R(()=>{i||(u.onValueChange(r),u.onOpenChange(!1))},`handleSelect`);return(0,I.jsx)(Oe,{scope:n,value:r,disabled:i,textId:x,isSelected:f,onItemTextChange:N.useCallback(e=>{h(t=>t||(e?.textContent??``).trim())},[]),children:(0,I.jsx)(H.ItemSlot,{scope:n,value:r,disabled:i,textValue:m,children:(0,I.jsx)(o.div,{role:`option`,"aria-labelledby":x,"data-highlighted":g?``:void 0,"aria-selected":f&&g,"data-state":f?`checked`:`unchecked`,"aria-disabled":i||void 0,"data-disabled":i?``:void 0,tabIndex:i?void 0:-1,...c,ref:b,onFocus:y(c.onFocus,()=>_(!0)),onBlur:y(c.onBlur,()=>_(!1)),onClick:y(c.onClick,()=>{S.current!==`mouse`&&C()}),onPointerUp:y(c.onPointerUp,()=>{S.current===`mouse`&&C()}),onPointerDown:y(c.onPointerDown,e=>{S.current=e.pointerType}),onPointerMove:y(c.onPointerMove,e=>{S.current=e.pointerType,i?d.onItemLeave?.():S.current===`mouse`&&e.currentTarget.focus({preventScroll:!0})}),onPointerLeave:y(c.onPointerLeave,e=>{e.currentTarget===document.activeElement&&d.onItemLeave?.()}),onKeyDown:y(c.onKeyDown,e=>{i||e.target!==e.currentTarget||(d.searchRef?.current===``||e.key!==` `)&&(B.includes(e.key)&&C(),e.key===` `&&e.preventDefault())})})})})},`SelectItem`)),Q=`SelectItemText`,je=N.forwardRef(R(function(e,t){let{__scopeSelect:n,className:r,style:i,...s}=e,c=q(Q,n),l=Z(Q,n),d=ke(Q,n),f=ie(Q,n),[m,h]=N.useState(null),g=p(e=>l.itemTextRefCallback?.(e,d.value,d.disabled)),_=a(t,h,d.onItemTextChange,g),v=m?.textContent,y=N.useMemo(()=>(0,I.jsx)(`option`,{value:d.value,disabled:d.disabled,children:v},d.value),[d.disabled,d.value,v]),{onNativeOptionAdd:b,onNativeOptionRemove:x}=f;return u(()=>(b(y),()=>x(y)),[b,x,y]),(0,I.jsxs)(I.Fragment,{children:[(0,I.jsx)(o.span,{id:d.textId,...s,ref:_}),d.isSelected&&c.valueNode&&!c.valueNodeHasChildren&&!$(c.value)?M.createPortal(s.children,c.valueNode):null]})},`SelectItemText`)),Me=`SelectItemIndicator`,Ne=N.forwardRef(R(function(e,t){let{__scopeSelect:n,...r}=e;return ke(Me,n).isSelected?(0,I.jsx)(o.span,{"aria-hidden":!0,...r,ref:t}):null},`SelectItemIndicator`)),Pe=`SelectScrollUpButton`,Fe=N.forwardRef(R(function(e,t){let n=Z(Pe,e.__scopeSelect),r=Se(Pe,e.__scopeSelect),[i,o]=N.useState(!1),s=a(t,r.onScrollButtonChange);return u(()=>{if(n.viewport&&n.isPositioned){let e=function(){let e=t.scrollTop>0;o(e)};R(e,`handleScroll`);let t=n.viewport;return e(),t.addEventListener(`scroll`,e),()=>t.removeEventListener(`scroll`,e)}},[n.viewport,n.isPositioned]),i?(0,I.jsx)(Re,{...e,ref:s,onAutoScroll:()=>{let{viewport:e,selectedItem:t}=n;e&&t&&(e.scrollTop-=t.offsetHeight)}}):null},`SelectScrollUpButton`)),Ie=`SelectScrollDownButton`,Le=N.forwardRef(R(function(e,t){let n=Z(Ie,e.__scopeSelect),r=Se(Ie,e.__scopeSelect),[i,o]=N.useState(!1),s=a(t,r.onScrollButtonChange);return u(()=>{if(n.viewport&&n.isPositioned){let e=function(){let e=t.scrollHeight-t.clientHeight,n=Math.ceil(t.scrollTop)<e;o(n)};R(e,`handleScroll`);let t=n.viewport;return e(),t.addEventListener(`scroll`,e),()=>t.removeEventListener(`scroll`,e)}},[n.viewport,n.isPositioned]),i?(0,I.jsx)(Re,{...e,ref:s,onAutoScroll:()=>{let{viewport:e,selectedItem:t}=n;e&&t&&(e.scrollTop+=t.offsetHeight)}}):null},`SelectScrollDownButton`)),Re=N.forwardRef(R(function(e,t){let{__scopeSelect:n,onAutoScroll:r,...i}=e,a=Z(`SelectScrollButton`,n),s=N.useRef(null),c=U(n),l=N.useCallback(()=>{s.current!==null&&(window.clearInterval(s.current),s.current=null)},[]);return N.useEffect(()=>()=>l(),[l]),u(()=>{c().find(e=>e.ref.current===document.activeElement)?.ref.current?.scrollIntoView({block:`nearest`})},[c]),(0,I.jsx)(o.div,{"aria-hidden":!0,...i,ref:t,style:{flexShrink:0,...i.style},onPointerDown:y(i.onPointerDown,()=>{s.current===null&&(s.current=window.setInterval(r,50))}),onPointerMove:y(i.onPointerMove,()=>{a.onItemLeave?.(),s.current===null&&(s.current=window.setInterval(r,50))}),onPointerLeave:y(i.onPointerLeave,()=>{l()})})},`SelectScrollButtonImpl`)),ze=`SelectBubbleInput`,Be=N.forwardRef(R(function({__scopeSelect:e,...t},n){let r=q(ze,e),{value:i,onValueChange:s,required:c,disabled:l,name:u,autoComplete:d,form:f}=r,{nativeOptions:p,nativeSelectKey:m}=r,h=N.useRef(null),g=a(n,h),_=i??``,v=F(_),y=Array.from(p).some(e=>(e.props.value??``)===``);return N.useEffect(()=>{let e=h.current;if(!e)return;let t=window.HTMLSelectElement.prototype,n=Object.getOwnPropertyDescriptor(t,`value`).set;if(v!==_&&n){let t=new Event(`change`,{bubbles:!0});n.call(e,_),e.dispatchEvent(t)}},[v,_]),(0,I.jsxs)(o.select,{"aria-hidden":!0,required:c,tabIndex:-1,name:u,autoComplete:d,disabled:l,form:f,onChange:e=>s(e.target.value),...t,style:{...A,...t.style},ref:g,defaultValue:_,children:[$(i)&&!y?(0,I.jsx)(`option`,{value:``}):null,Array.from(p)]},m)},`SelectBubbleInput`));function Ve(e){return typeof e==`function`}R(Ve,`isFunction`);function $(e){return e===``||e===void 0}R($,`shouldShowPlaceholder`);function He(e){let t=p(e),n=N.useRef(``),r=N.useRef(0),i=N.useCallback(e=>{let i=n.current+e;t(i),R((function e(t){n.current=t,window.clearTimeout(r.current),t!==``&&(r.current=window.setTimeout(()=>e(``),1e3))}),`updateSearch`)(i)},[t]),a=N.useCallback(()=>{n.current=``,window.clearTimeout(r.current)},[]);return N.useEffect(()=>()=>window.clearTimeout(r.current),[]),[n,i,a]}R(He,`useTypeaheadSearch`);function Ue(e,t,n){let r=t.length>1&&Array.from(t).every(e=>e===t[0])?t[0]:t,i=n?e.indexOf(n):-1,a=We(e,Math.max(i,0));r.length===1&&(a=a.filter(e=>e!==n));let o=a.find(e=>e.textValue.toLowerCase().startsWith(r.toLowerCase()));return o===n?void 0:o}R(Ue,`findNextItem`);function We(e,t){return e.map((n,r)=>e[(t+r)%e.length])}R(We,`wrapArray`);function Ge({...e}){return(0,I.jsx)(ae,{"data-slot":`select`,...e})}function Ke({...e}){return(0,I.jsx)(le,{"data-slot":`select-value`,...e})}function qe({className:e,size:t=`default`,children:n,...r}){return(0,I.jsxs)(se,{"data-slot":`select-trigger`,"data-size":t,className:i(`flex w-fit items-center justify-between gap-2 rounded-md border border-input bg-transparent px-3 py-2 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 data-[placeholder]:text-muted-foreground data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 dark:bg-input/30 dark:hover:bg-input/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground`,e),...r,children:[n,(0,I.jsx)(ue,{asChild:!0,children:(0,I.jsx)(w,{className:`size-4 opacity-50`})})]})}function Je({className:e,children:t,position:n=`item-aligned`,align:r=`center`,...a}){return(0,I.jsx)(pe,{children:(0,I.jsxs)(me,{"data-slot":`select-content`,className:i(`relative z-50 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border bg-popover text-popover-foreground shadow-md data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95`,n===`popper`&&`data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1`,e),position:n,align:r,...a,children:[(0,I.jsx)(Xe,{}),(0,I.jsx)(we,{className:i(`p-1`,n===`popper`&&`h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1`),children:t}),(0,I.jsx)(Ze,{})]})})}function Ye({className:e,children:t,...n}){return(0,I.jsxs)(Ae,{"data-slot":`select-item`,className:i(`relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2`,e),...n,children:[(0,I.jsx)(`span`,{"data-slot":`select-item-indicator`,className:`absolute right-2 flex size-3.5 items-center justify-center`,children:(0,I.jsx)(Ne,{children:(0,I.jsx)(D,{className:`size-4`})})}),(0,I.jsx)(je,{children:t})]})}function Xe({className:e,...t}){return(0,I.jsx)(Fe,{"data-slot":`select-scroll-up-button`,className:i(`flex cursor-default items-center justify-center py-1`,e),...t,children:(0,I.jsx)(x,{className:`size-4`})})}function Ze({className:e,...t}){return(0,I.jsx)(Le,{"data-slot":`select-scroll-down-button`,className:i(`flex cursor-default items-center justify-center py-1`,e),...t,children:(0,I.jsx)(w,{className:`size-4`})})}export{Ke as a,qe as i,Je as n,Ye as r,Ge as t};
@@ -0,0 +1 @@
1
+ import{l as e}from"./button-B2EsmMJs.js";import{B as t}from"./index-Tw24-4of.js";var n=e();function r({id:e,checked:r,onChange:i,label:a,hint:o,pro:s}){return(0,n.jsxs)(`label`,{htmlFor:e,className:`flex cursor-pointer items-start gap-3 rounded-md border p-3 hover:bg-accent/40`,children:[(0,n.jsx)(`input`,{id:e,type:`checkbox`,checked:r,onChange:e=>i(e.target.checked),className:`mt-0.5 size-4 accent-primary`}),(0,n.jsxs)(`span`,{className:`grid flex-1 gap-0.5`,children:[(0,n.jsxs)(`span`,{className:`flex items-center text-sm font-medium`,children:[a,s?(0,n.jsx)(t,{}):null]}),(0,n.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:o})]})]})}export{r as t};