specrails-desktop 2.25.0 → 2.26.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/client/dist/assets/{ActivityFeedPage-BGRTOOhT.js → ActivityFeedPage-C1LftFSE.js} +1 -1
  2. package/client/dist/assets/{AgentBrowserCapture-DvDLxsUy.js → AgentBrowserCapture-B5prW-V0.js} +1 -1
  3. package/client/dist/assets/{AgentModeCodePane-DfwctjzN.js → AgentModeCodePane-b6UmdjwB.js} +2 -2
  4. package/client/dist/assets/{AgentModeJobsPane-G3WrS-sE.js → AgentModeJobsPane-DW3Wj5oi.js} +1 -1
  5. package/client/dist/assets/{AgentsPage-DGFFijMC.js → AgentsPage-DBMnhdlq.js} +3 -3
  6. package/client/dist/assets/{AnalyticsPage-hoJmlEpk.js → AnalyticsPage-DjFf1OxU.js} +1 -1
  7. package/client/dist/assets/{BarChart-BEhAXVK-.js → BarChart-nmDbbUiR.js} +1 -1
  8. package/client/dist/assets/{CodePage-B4zB9DVC.js → CodePage-DHd46Sm7.js} +1 -1
  9. package/client/dist/assets/{DesktopAnalyticsPage-CBX-Qpxd.js → DesktopAnalyticsPage-ee0bpk-F.js} +1 -1
  10. package/client/dist/assets/{DocsDialog-lTsnNdAM.js → DocsDialog-CGUzB1zX.js} +1 -1
  11. package/client/dist/assets/{DocsPage-CkvdGroT.js → DocsPage-96iws84I.js} +1 -1
  12. package/client/dist/assets/{ExportDropdown-Da98gR-P.js → ExportDropdown-Dzk2Lkxw.js} +1 -1
  13. package/client/dist/assets/{IntegrationsPage-Cf9o4eZq.js → IntegrationsPage-Bta2lAhq.js} +1 -1
  14. package/client/dist/assets/{InteractiveJobComposer-C8N-Bbnn.js → InteractiveJobComposer-B9S_ZGJS.js} +5 -5
  15. package/client/dist/assets/{JobDetailModal-BZVwIIEx.js → JobDetailModal-DhrwU2z0.js} +1 -1
  16. package/client/dist/assets/{JobDetailPage-CQewQ1zy.js → JobDetailPage-BnhoXkql.js} +1 -1
  17. package/client/dist/assets/{JobsPage-CB4wOxmE.js → JobsPage-BBT9fyhg.js} +1 -1
  18. package/client/dist/assets/{LoopBuilderPage-B9Y5gt08.js → LoopBuilderPage-5ucN9Hq9.js} +2 -2
  19. package/client/dist/assets/{LoopPreviewModal-kxQ5kV1t.js → LoopPreviewModal-wKAts-Wf.js} +1 -1
  20. package/client/dist/assets/{LoopsPage-RysW-6sC.js → LoopsPage-COyxf6Pa.js} +1 -1
  21. package/client/dist/assets/{ProjectSettingsDialog-BHN5qsGT.js → ProjectSettingsDialog-CcToBI-Z.js} +1 -1
  22. package/client/dist/assets/{TemplatePreviewModal-DW6lZCIs.js → TemplatePreviewModal-_Dy6ceXg.js} +1 -1
  23. package/client/dist/assets/agent-BmH52J4j.js +1 -0
  24. package/client/dist/assets/agent-Bxb9RRNW.js +1 -0
  25. package/client/dist/assets/agent-Cg49-TGZ.js +1 -0
  26. package/client/dist/assets/agent-DgDtg-0Y2.js +1 -0
  27. package/client/dist/assets/agent-DolxzTol.js +1 -0
  28. package/client/dist/assets/agent-DwDR2Exf2.js +1 -0
  29. package/client/dist/assets/agent-_tfCgFUk.js +1 -0
  30. package/client/dist/assets/agent-gFi-qvxO2.js +1 -0
  31. package/client/dist/assets/{brain-B9dkGuAN.js → brain-BJ2Gd98j.js} +1 -1
  32. package/client/dist/assets/code-CwnBPPyA.js +1 -0
  33. package/client/dist/assets/dashboard-90r0QcUc2.js +1 -0
  34. package/client/dist/assets/dashboard-B0C6mJP-.js +1 -0
  35. package/client/dist/assets/dashboard-BOx0FR1L2.js +1 -0
  36. package/client/dist/assets/dashboard-BcjUOLJr.js +1 -0
  37. package/client/dist/assets/dashboard-C27kNpjn.js +1 -0
  38. package/client/dist/assets/dashboard-DJAj2EbH.js +1 -0
  39. package/client/dist/assets/dashboard-DNd1Gobs.js +1 -0
  40. package/client/dist/assets/dashboard-DZWrDAYm2.js +1 -0
  41. package/client/dist/assets/{dist-js-Bbd7Wzdw.js → dist-js-CXAsO0Z8.js} +1 -1
  42. package/client/dist/assets/{dist-js-BW5-IZTP.js → dist-js-D7smLA35.js} +1 -1
  43. package/client/dist/assets/index-B3ejvKSt.js +156 -0
  44. package/client/dist/assets/index-C695aPdV.css +2 -0
  45. package/client/dist/assets/{lib-EIkIPf26.js → lib-BIHmUkcn.js} +1 -1
  46. package/client/dist/assets/{loops-YYV2bwjd.js → loops-Brnx4Fji.js} +1 -1
  47. package/client/dist/assets/{loops-hXgncEpF2.js → loops-BvqQ-bHR2.js} +1 -1
  48. package/client/dist/assets/{loops-BvEenWBy.js → loops-CvOWsi5r.js} +1 -1
  49. package/client/dist/assets/{loops-DjOtVXRo.js → loops-D6D3XHjj.js} +1 -1
  50. package/client/dist/assets/{loops-HTHf-xu32.js → loops-DJNhp17p2.js} +1 -1
  51. package/client/dist/assets/{loops-kYbydDyN.js → loops-K5_HXfJa.js} +1 -1
  52. package/client/dist/assets/loops-LIgO_-eM.js +1 -0
  53. package/client/dist/assets/{loops-DNGiYKll2.js → loops-vhJdbcz92.js} +1 -1
  54. package/client/dist/assets/{settings-BsJMsWGc.js → settings-BHdPchJP.js} +1 -1
  55. package/client/dist/assets/{settings-lFoaYT-s2.js → settings-BeCczBFS2.js} +1 -1
  56. package/client/dist/assets/{settings-DZJeXoRV.js → settings-BlLi719f.js} +1 -1
  57. package/client/dist/assets/{settings-BOHOmHkb.js → settings-C_nY14Yz.js} +1 -1
  58. package/client/dist/assets/{settings-D6qY9_UI.js → settings-CaZ26a0S.js} +1 -1
  59. package/client/dist/assets/{settings-BlEA_7h02.js → settings-D54_cgl12.js} +1 -1
  60. package/client/dist/assets/settings-D9bDDe2O.js +1 -0
  61. package/client/dist/assets/{settings-TNga5gIF2.js → settings-cn0tbve62.js} +1 -1
  62. package/client/dist/assets/{setup-iY8vH8pB.js → setup-7J8TjG4O.js} +1 -1
  63. package/client/dist/assets/{setup-D674kWQH.js → setup-BXpw07r-.js} +1 -1
  64. package/client/dist/assets/{setup-B590KsTX.js → setup-BiduSX9d.js} +1 -1
  65. package/client/dist/assets/{setup-CmU6bTCV2.js → setup-BuQNKztt2.js} +1 -1
  66. package/client/dist/assets/{setup-CEj6uY3-2.js → setup-BwMovM9z2.js} +1 -1
  67. package/client/dist/assets/{setup-BkyGoby6.js → setup-D84y3wx-.js} +1 -1
  68. package/client/dist/assets/{setup-CbIerFGf2.js → setup-DU0ULX8q2.js} +1 -1
  69. package/client/dist/assets/{setup-VNqXyB6Y.js → setup-RiUHzq7E.js} +1 -1
  70. package/client/dist/assets/{upload-BCMl-nCg.js → upload-xdQuJvXN.js} +1 -1
  71. package/client/dist/assets/{value-CG-amSq1.js → value-Bk2f9AUg.js} +1 -1
  72. package/client/dist/index.html +22 -9
  73. package/docs/agy-cli-provider-study.md +1 -1
  74. package/docs/codex.md +2 -2
  75. package/docs/gemini-cli-provider-study.md +2 -2
  76. package/docs/guide/de/pipeline/3-batch-implement-and-multi-feature.md +1 -1
  77. package/docs/guide/en/pipeline/3-batch-implement-and-multi-feature.md +1 -1
  78. package/docs/guide/es/pipeline/3-batch-implement-and-multi-feature.md +1 -1
  79. package/docs/guide/fr/pipeline/3-batch-implement-and-multi-feature.md +1 -1
  80. package/docs/guide/it/pipeline/3-batch-implement-and-multi-feature.md +1 -1
  81. package/docs/guide/ja/pipeline/3-batch-implement-and-multi-feature.md +1 -1
  82. package/docs/guide/pt/pipeline/3-batch-implement-and-multi-feature.md +1 -1
  83. package/docs/guide/pt/pipeline/5-the-loop-builder.md +1 -1
  84. package/docs/guide/zh/pipeline/3-batch-implement-and-multi-feature.md +1 -1
  85. package/docs/internals/api-reference.md +3 -3
  86. package/docs/internals/companion-rails-as-loops-contract.md +6 -6
  87. package/docs/internals/configuration.md +1 -1
  88. package/docs/internals/interactive-jobs.md +3 -3
  89. package/docs/internals/safe-pr-review-flow.md +1 -1
  90. package/docs/internals/visual-design-audit.md +2 -2
  91. package/docs/running-pipelines.md +1 -1
  92. package/package.json +1 -1
  93. package/server/dist/agent-chat-manager.js +16 -2
  94. package/server/dist/agent-chat-router.js +66 -1
  95. package/server/dist/agent-context-resolver.js +301 -0
  96. package/server/dist/agent-operator-prompt.js +58 -11
  97. package/server/dist/agent-store.js +24 -12
  98. package/server/dist/db.js +17 -17
  99. package/server/dist/desktop-db.js +6 -0
  100. package/server/dist/desktop-router.js +9 -2
  101. package/server/dist/feature-flags.js +2 -2
  102. package/server/dist/index.js +1 -1
  103. package/server/dist/interactive-job-session.js +3 -3
  104. package/server/dist/loop-command-catalog.js +11 -11
  105. package/server/dist/loop-factory.js +7 -7
  106. package/server/dist/loop-graph.js +2 -2
  107. package/server/dist/loop-run-manager.js +1 -1
  108. package/server/dist/mcp/guide.js +41 -10
  109. package/server/dist/mcp/tools/app-settings.js +18 -2
  110. package/server/dist/mcp/tools/catalog.js +2 -0
  111. package/server/dist/mcp/tools/rails.js +29 -9
  112. package/server/dist/mcp/tools/support.js +324 -0
  113. package/server/dist/mobile/mobile-router.js +1 -1
  114. package/server/dist/project-router-jobs.js +1 -1
  115. package/server/dist/project-router-loop-runs.js +1 -1
  116. package/server/dist/project-router-settings.js +5 -5
  117. package/server/dist/queue-manager.js +27 -27
  118. package/server/dist/rail-isolated-launch.js +5 -1
  119. package/server/dist/rails-router.js +76 -27
  120. package/client/dist/assets/agent-4ARs0uac2.js +0 -1
  121. package/client/dist/assets/agent-C55wwsUX.js +0 -1
  122. package/client/dist/assets/agent-C_kqyrXo.js +0 -1
  123. package/client/dist/assets/agent-Df3lnHMu.js +0 -1
  124. package/client/dist/assets/agent-G6Zn2gpr.js +0 -1
  125. package/client/dist/assets/agent-MQhun7cv.js +0 -1
  126. package/client/dist/assets/agent-NqlER4Yh2.js +0 -1
  127. package/client/dist/assets/agent-OTGI6t7e2.js +0 -1
  128. package/client/dist/assets/code-CqCcRThR.js +0 -1
  129. package/client/dist/assets/dashboard-4WX7agHF2.js +0 -1
  130. package/client/dist/assets/dashboard-5Z_esXIB.js +0 -1
  131. package/client/dist/assets/dashboard-DQ-po1MG2.js +0 -1
  132. package/client/dist/assets/dashboard-IbEztmJ52.js +0 -1
  133. package/client/dist/assets/dashboard-nc-Raovv.js +0 -1
  134. package/client/dist/assets/dashboard-ojWdDq6S.js +0 -1
  135. package/client/dist/assets/dashboard-oqS7VRrK.js +0 -1
  136. package/client/dist/assets/dashboard-zfoJcdFW.js +0 -1
  137. package/client/dist/assets/index-BtAks9nm.css +0 -2
  138. package/client/dist/assets/index-DC-REAcL.js +0 -155
  139. package/client/dist/assets/loops-CBiWd9Hf.js +0 -1
  140. package/client/dist/assets/settings-Mr7MnJbf.js +0 -1
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.QueueManager = exports.ULTRACODE_COMMAND_RE = exports.JobAlreadyTerminalError = exports.JobNotFoundError = exports.CodexNotFoundError = exports.ClaudeNotFoundError = exports.DEFAULT_ZOMBIE_TIMEOUT_MS = void 0;
6
+ exports.QueueManager = exports.FREESTYLE_COMMAND_RE = exports.JobAlreadyTerminalError = exports.JobNotFoundError = exports.CodexNotFoundError = exports.ClaudeNotFoundError = exports.DEFAULT_ZOMBIE_TIMEOUT_MS = void 0;
7
7
  exports.buildTelemetryEnv = buildTelemetryEnv;
8
8
  exports.projectSupportsProfiles = projectSupportsProfiles;
9
9
  exports.distributeIntEvenly = distributeIntEvenly;
@@ -176,8 +176,8 @@ class JobAlreadyTerminalError extends Error {
176
176
  exports.JobAlreadyTerminalError = JobAlreadyTerminalError;
177
177
  // ─── Helpers ──────────────────────────────────────────────────────────────────
178
178
  const TERMINAL_STATUSES = new Set(['completed', 'failed', 'canceled', 'zombie_terminated', 'skipped']);
179
- /** Match an Ultracode rail command: `/specrails:ultracode #5 …` (or `/sr:…`). */
180
- exports.ULTRACODE_COMMAND_RE = /^\/(specrails|sr):ultracode\b/;
179
+ /** Match an Freestyle rail command: `/specrails:freestyle #5 …` (or `/sr:…`). */
180
+ exports.FREESTYLE_COMMAND_RE = /^\/(specrails|sr):freestyle\b/;
181
181
  // ─── QueueManager ─────────────────────────────────────────────────────────────
182
182
  class QueueManager {
183
183
  _queue;
@@ -550,7 +550,7 @@ class QueueManager {
550
550
  if (resolvedOpts?.provider) {
551
551
  this._jobProviderSelection.set(id, resolvedOpts.provider);
552
552
  }
553
- // Record per-job model override (e.g. ultracode model picker).
553
+ // Record per-job model override (e.g. freestyle model picker).
554
554
  if (resolvedOpts?.model) {
555
555
  this._jobModelSelection.set(id, resolvedOpts.model);
556
556
  }
@@ -710,7 +710,7 @@ class QueueManager {
710
710
  return this._interactiveSessions.has(jobId);
711
711
  }
712
712
  /** Settle mode of the LIVE interactive session for this job ('finalize' for
713
- * ultracode, 'auto' for everything else), or null when no session is
713
+ * freestyle, 'auto' for everything else), or null when no session is
714
714
  * resident (unknown / not interactive / already settled). Feeds the
715
715
  * `interactiveSettleMode` field on GET /jobs/:id. */
716
716
  getInteractiveSettleMode(jobId) {
@@ -938,14 +938,14 @@ class QueueManager {
938
938
  }
939
939
  }
940
940
  /**
941
- * Build the Claude prompt for an Ultracode job. Ultracode does NOT invoke
941
+ * Build the Claude prompt for an Freestyle job. Freestyle does NOT invoke
942
942
  * a slash command: it sends the resolved pre-prompt followed by the full spec
943
943
  * text of every ticket referenced in the command. Fully reconstructible from
944
- * the command (`/specrails:ultracode #<id> …`) + the local ticket store, so a
944
+ * the command (`/specrails:freestyle #<id> …`) + the local ticket store, so a
945
945
  * queued job survives a server restart without losing the prompt.
946
946
  */
947
- _buildUltracodePrompt(command) {
948
- const pre = this._db ? (0, db_1.getUltracodePrePrompt)(this._db) : db_1.DEFAULT_ULTRACODE_PRE_PROMPT;
947
+ _buildFreestylePrompt(command) {
948
+ const pre = this._db ? (0, db_1.getFreestylePrePrompt)(this._db) : db_1.DEFAULT_FREESTYLE_PRE_PROMPT;
949
949
  const ticketIds = this._extractTicketIds(command);
950
950
  const specs = [];
951
951
  if (this._cwd) {
@@ -960,7 +960,7 @@ class QueueManager {
960
960
  }
961
961
  }
962
962
  catch (err) {
963
- console.warn(`[queue-manager] failed to read specs for ultracode: ${err.message}`);
963
+ console.warn(`[queue-manager] failed to read specs for freestyle: ${err.message}`);
964
964
  }
965
965
  }
966
966
  const specBlock = specs.length > 0
@@ -989,7 +989,7 @@ class QueueManager {
989
989
  // A3: reserve the active slot SYNCHRONOUSLY, before _startJob's awaits
990
990
  // (plugin verify, profile snapshot). Otherwise a second _drainQueue triggered
991
991
  // during those awaits (a concurrent /spawn, or the synchronous N-job loop of
992
- // an Ultracode rail launch) still sees _activeJobId === null and starts a
992
+ // an Freestyle rail launch) still sees _activeJobId === null and starts a
993
993
  // second job in the same working tree, with _activeProcess/_activeJobId then
994
994
  // clobbered so cancel/zombie-kill hits the wrong child.
995
995
  this._activeJobId = nextJobId;
@@ -1195,7 +1195,7 @@ class QueueManager {
1195
1195
  }
1196
1196
  /**
1197
1197
  * Spawn an interactive session. The job row is created with the `interactive`
1198
- * flag set; the resident child runs the first turn (the ultracode prompt, or
1198
+ * flag set; the resident child runs the first turn (the freestyle prompt, or
1199
1199
  * the slash command itself — spike-verified to expand over stream-json stdin)
1200
1200
  * and stays alive for follow-up turns until settle. `_activeProcess` is left
1201
1201
  * null — the session owns the child; the active SLOT (`_activeJobId`,
@@ -1464,7 +1464,7 @@ class QueueManager {
1464
1464
  // Spike-verified (2026-07-03, claude 2.1.198): the claude CLI expands slash
1465
1465
  // commands arriving as stream-json stdin user frames exactly like the argv
1466
1466
  // `-p "/cmd"` path, so EVERY claude job (implement/batch/custom commands,
1467
- // not just ultracode prose) is prompt-compatible with the persistent-stdin
1467
+ // not just freestyle prose) is prompt-compatible with the persistent-stdin
1468
1468
  // transport. The default is therefore interactive whenever the kill-switch
1469
1469
  // is on and the resolved adapter supports persistent stdin (claude only
1470
1470
  // today); codex/gemini always take the legacy one-shot spawn below.
@@ -1472,16 +1472,16 @@ class QueueManager {
1472
1472
  // true forces interactive where capable, undefined = default ON. Derived
1473
1473
  // HERE (spawn time), not at enqueue, so a queued job that survives a server
1474
1474
  // restart (selection map lost) still spawns interactive.
1475
- const isUltracode = adapter.id === 'claude' && exports.ULTRACODE_COMMAND_RE.test(commandToRun);
1475
+ const isFreestyle = adapter.id === 'claude' && exports.FREESTYLE_COMMAND_RE.test(commandToRun);
1476
1476
  const interactiveOverride = this._jobInteractiveSelection.get(jobId);
1477
1477
  this._jobInteractiveSelection.delete(jobId);
1478
1478
  const spawnInteractive = (0, feature_flags_1.isInteractiveJobsEnabled)() &&
1479
1479
  adapter.capabilities.persistentStdin &&
1480
1480
  (interactiveOverride ?? true);
1481
- // Ultracode sessions idle awaiting the human (settle only on explicit
1481
+ // Freestyle sessions idle awaiting the human (settle only on explicit
1482
1482
  // Finalize — the pre-flip behaviour); every other command auto-settles the
1483
1483
  // moment a turn result lands with nothing queued behind it.
1484
- const interactiveSettleMode = isUltracode ? 'finalize' : 'auto';
1484
+ const interactiveSettleMode = isFreestyle ? 'finalize' : 'auto';
1485
1485
  // Build supplementary context (output chaining + headless mode) that goes
1486
1486
  // into --append-system-prompt, keeping the user prompt clean.
1487
1487
  let systemAppend = '';
@@ -1577,18 +1577,18 @@ class QueueManager {
1577
1577
  // claude slash command — propose-spec, implement, batch-implement,
1578
1578
  // explore-spec, retry, …). This is the rail equivalent of the
1579
1579
  // user typing `$implement #1 --yes` themselves in `codex`.
1580
- // Ultracode (Claude only): skip the slash command entirely and send the
1580
+ // Freestyle (Claude only): skip the slash command entirely and send the
1581
1581
  // pre-prompt + spec text directly as the prompt. The server route guards
1582
- // that ultracode never reaches a non-claude adapter; defensively, a codex
1582
+ // that freestyle never reaches a non-claude adapter; defensively, a codex
1583
1583
  // adapter still falls through to its skill-translation path below.
1584
- // (`isUltracode` itself is resolved above, before the systemAppend build.)
1585
- const railPrompt = isUltracode
1586
- ? this._buildUltracodePrompt(commandToRun)
1584
+ // (`isFreestyle` itself is resolved above, before the systemAppend build.)
1585
+ const railPrompt = isFreestyle
1586
+ ? this._buildFreestylePrompt(commandToRun)
1587
1587
  : adapter.id === 'codex'
1588
1588
  ? commandToRun.replace(/^\/(specrails|sr):([\w-]+)/, '$$$2')
1589
1589
  : commandToRun;
1590
1590
  // Per-job model override (consumed once) takes precedence — used by the
1591
- // ultracode model picker so the user can choose haiku/sonnet/opus per launch.
1591
+ // freestyle model picker so the user can choose haiku/sonnet/opus per launch.
1592
1592
  const modelOverride = this._jobModelSelection.get(jobId);
1593
1593
  this._jobModelSelection.delete(jobId);
1594
1594
  const railModel = modelOverride
@@ -1804,7 +1804,7 @@ class QueueManager {
1804
1804
  }
1805
1805
  // ─── Interactive branch (default for persistent-stdin providers) ───────
1806
1806
  // Hand off to a resident persistent-stdin session instead of the one-shot
1807
- // spawn below. Ultracode keeps 'finalize' settle-mode (idles until the
1807
+ // spawn below. Freestyle keeps 'finalize' settle-mode (idles until the
1808
1808
  // human Finalizes); every other command runs 'auto' (the session settles
1809
1809
  // itself the moment a turn result lands with nothing queued). Code-Explorer
1810
1810
  // provenance is captured around the SESSION lifecycle exactly like the
@@ -1823,14 +1823,14 @@ class QueueManager {
1823
1823
  // chat-stream feeds the prompt over stdin per-turn, so the argv `prompt`
1824
1824
  // is unused — pass empty to satisfy the shared SpawnOptions shape.
1825
1825
  prompt: '',
1826
- // Ultracode's prose prompt brings no system prompt of its own, so the
1826
+ // Freestyle's prose prompt brings no system prompt of its own, so the
1827
1827
  // supplementary context rides `--system-prompt` (byte-identical to the
1828
- // pre-flip interactive-ultracode spawn). A slash-command job's EXPANDED
1828
+ // pre-flip interactive-freestyle spawn). A slash-command job's EXPANDED
1829
1829
  // command brings its own system prompt — mirror the legacy rail-job
1830
1830
  // spawn and APPEND on top of the CLI default instead of replacing it.
1831
- systemPrompt: isUltracode ? (systemAppend || undefined) : undefined,
1831
+ systemPrompt: isFreestyle ? (systemAppend || undefined) : undefined,
1832
1832
  model: railModel,
1833
- extraArgs: !isUltracode && systemAppend
1833
+ extraArgs: !isFreestyle && systemAppend
1834
1834
  ? ['--append-system-prompt', systemAppend, ...(railExtraArgs ?? [])]
1835
1835
  : railExtraArgs,
1836
1836
  });
@@ -301,6 +301,7 @@ async function launchIsolatedRail(input, io = {}) {
301
301
  originSurface: input.originSurface ?? 'dashboard',
302
302
  originConversationId: input.originConversationId ?? null,
303
303
  }).id;
304
+ input.onPrDeliveryCreated?.(prDeliveryId);
304
305
  if (launchContinuation) {
305
306
  (0, rail_pr_store_1.transitionDecision)(ctx.db, prDeliveryId, 'building', 'building', {
306
307
  branch: launchContinuation.branch,
@@ -393,7 +394,10 @@ async function launchIsolatedRail(input, io = {}) {
393
394
  }
394
395
  // Close the just-inserted decision row (kept as 'discarded' for audit, never
395
396
  // deleted) so a wedged 'building' row can never block relaunching the slot.
396
- if (prDeliveryId && (0, rail_pr_store_1.transitionDecision)(ctx.db, prDeliveryId, 'building', 'discarded')) {
397
+ // Router-driven PR continuations may intentionally fall back to shared-cwd
398
+ // on the same PR branch; in that case the router preserves and updates the
399
+ // row as the live iteration card instead of showing a false discard.
400
+ if (!input.preservePrDeliveryOnAllocationFailure && prDeliveryId && (0, rail_pr_store_1.transitionDecision)(ctx.db, prDeliveryId, 'building', 'discarded')) {
397
401
  broadcastPrState();
398
402
  syncOriginCard('update');
399
403
  }
@@ -25,13 +25,32 @@ const rail_isolated_launch_1 = require("./rail-isolated-launch");
25
25
  const worktree_manager_1 = require("./worktree-manager");
26
26
  const pr_publisher_1 = require("./pr-publisher");
27
27
  const ids_1 = require("./ids");
28
- const VALID_MODES = new Set(['implement', 'batch-implement', 'ultracode', 'loop']);
29
- // Models the ultracode picker exposes (Claude aliases). Mirrors the client
28
+ const agent_chat_registry_1 = require("./agent-chat-registry");
29
+ const VALID_MODES = new Set(['implement', 'batch-implement', 'freestyle', 'loop']);
30
+ // Models the freestyle picker exposes (Claude aliases). Mirrors the client
30
31
  // RailModelSelector options and the project-router orchestrator-model allow-list.
31
- const VALID_ULTRACODE_MODELS = new Set(['haiku', 'sonnet', 'opus', 'fable']);
32
+ const VALID_FREESTYLE_MODELS = new Set(['haiku', 'sonnet', 'opus', 'fable']);
32
33
  // Reasoning-effort tiers a loop launch may request (mirrors the client selector
33
34
  // + the provider adapters' supported values).
34
35
  const VALID_REASONING_EFFORTS = new Set(['low', 'medium', 'high']);
36
+ function prDeliveryContinuesTickets(delivery, ticketIds) {
37
+ if (delivery.decision !== 'pr_draft' && delivery.decision !== 'pr_ready')
38
+ return false;
39
+ if (!delivery.prUrl || !delivery.branch)
40
+ return false;
41
+ const covered = new Set(delivery.ticketIds);
42
+ return ticketIds.length > 0 && ticketIds.every((id) => covered.has(id));
43
+ }
44
+ function emitPrDeliveryUpdate(c, prDeliveryId) {
45
+ const row = (0, rail_pr_store_1.getPrDelivery)(c.db, prDeliveryId);
46
+ if (!row)
47
+ return;
48
+ const snap = (0, rail_pr_store_1.toPrDeliverySnapshot)(row);
49
+ c.broadcast((0, rail_pr_store_1.toRailPrStateMessage)(c.project.id, snap));
50
+ if (row.origin_conversation_id) {
51
+ (0, agent_chat_registry_1.getAgentChatManager)()?.updatePrDecisionCard(row.origin_conversation_id, (0, rail_pr_store_1.toPrDecisionCardEnvelope)(c.project.id, snap));
52
+ }
53
+ }
35
54
  function createRailsRouter() {
36
55
  const router = (0, express_1.Router)({ mergeParams: true });
37
56
  function ctx(req) {
@@ -349,7 +368,7 @@ function createRailsRouter() {
349
368
  mode = fmode;
350
369
  }
351
370
  if (!VALID_MODES.has(mode)) {
352
- res.status(400).json({ error: 'mode must be "implement", "batch-implement", "ultracode" or "loop"' });
371
+ res.status(400).json({ error: 'mode must be "implement", "batch-implement", "freestyle" or "loop"' });
353
372
  return;
354
373
  }
355
374
  // A bare legacy mode (MCP tools, mobile, direct REST — no loopId) must run
@@ -365,10 +384,10 @@ function createRailsRouter() {
365
384
  res.status(403).json({ error: 'Loops are disabled on this server' });
366
385
  return;
367
386
  }
368
- // Ultracode model picker: optional, validated against the allow-list.
369
- // Ignored for non-ultracode modes (they use the orchestrator model).
370
- if (mode === 'ultracode' && model !== undefined && model !== null) {
371
- if (typeof model !== 'string' || !VALID_ULTRACODE_MODELS.has(model)) {
387
+ // Freestyle model picker: optional, validated against the allow-list.
388
+ // Ignored for non-freestyle modes (they use the orchestrator model).
389
+ if (mode === 'freestyle' && model !== undefined && model !== null) {
390
+ if (typeof model !== 'string' || !VALID_FREESTYLE_MODELS.has(model)) {
372
391
  res.status(400).json({ error: 'model must be one of: haiku, sonnet, opus, fable' });
373
392
  return;
374
393
  }
@@ -412,9 +431,9 @@ function createRailsRouter() {
412
431
  // Only pass a provider override when one was actually requested (keeps
413
432
  // single-provider rails on the legacy code path).
414
433
  const railProvider = requestedEngine ? engineCheck.provider : undefined;
415
- // Ultracode bypasses the OpenSpec pipeline and hands the raw spec to
434
+ // Freestyle bypasses the OpenSpec pipeline and hands the raw spec to
416
435
  // Claude. It is Claude-only — reject when the effective engine is not claude.
417
- if (mode === 'ultracode' && engineCheck.provider !== 'claude') {
436
+ if (mode === 'freestyle' && engineCheck.provider !== 'claude') {
418
437
  res.status(400).json({ error: 'Freestyle requires the Claude provider' });
419
438
  return;
420
439
  }
@@ -422,8 +441,8 @@ function createRailsRouter() {
422
441
  // `null` in the body explicitly forces legacy mode. Codex has no agent
423
442
  // profiles, so force legacy mode whenever the chosen engine is not claude.
424
443
  let resolvedProfile;
425
- if (mode === 'ultracode') {
426
- // Ultracode runs no agent pipeline, so profiles do not apply.
444
+ if (mode === 'freestyle') {
445
+ // Freestyle runs no agent pipeline, so profiles do not apply.
427
446
  resolvedProfile = null;
428
447
  }
429
448
  else if (railProvider && railProvider !== 'claude') {
@@ -443,7 +462,7 @@ function createRailsRouter() {
443
462
  }
444
463
  try {
445
464
  // Loop mode: run a published loop (the Loops feature) against each spec,
446
- // one app-driven LoopRun per ticket (mirrors ultracode's per-ticket model).
465
+ // one app-driven LoopRun per ticket (mirrors freestyle's per-ticket model).
447
466
  // Drives raw prompts via the LoopRunManager — NO queue job, NO slash command.
448
467
  // rails-as-loops: a chosen loop (factory OR custom) runs through the
449
468
  // LoopRunManager when Loops are enabled — so factory loops get their
@@ -516,21 +535,26 @@ function createRailsRouter() {
516
535
  // client so a silent fallback (no delivery row → no implementation
517
536
  // cards) is diagnosable from the UI, not just the server log.
518
537
  let isolationUnavailableDetail;
538
+ let continuablePrDeliveryForFallback = null;
539
+ let fallbackPrDeliveryId = null;
519
540
  // Read-only vs mutating is DERIVED from the loop's nodes (see loop-effect),
520
541
  // not a user flag — a content-read-only loop (no ai-step/shell) never writes,
521
542
  // so it is not isolated; anything that can write is.
522
543
  const loopReadOnly = (0, loop_effect_1.classifyLoopEffect)(loopGraph) === 'read-only';
523
544
  if ((0, rail_isolation_1.isolationApplies)({ loopsEnabled: (0, feature_flags_1.isLoopsEnabled)(), scope, ticketCount: rail.ticketIds.length, readOnly: loopReadOnly })) {
524
- // Relaunch collision (ask-first PR delivery): a still-undecided
525
- // delivery on this slot references the slot's ticket branches, and a
526
- // relaunch would append new commits to them (createWorktree resumes
527
- // existing branches). Block until the user resolves or discards it.
545
+ // Relaunch collision (ask-first PR delivery): a delivery that has not
546
+ // produced a real PR yet still needs a user decision before more work
547
+ // can safely append to its branches. Once a draft/published PR exists
548
+ // and covers this rail's tickets, relaunch is intentional continuation
549
+ // of that PR head branch (resolved inside launchIsolatedRail).
528
550
  if ((0, rail_isolation_1.isRailPrDeliveryEnabled)()) {
529
551
  const pending = (0, rail_pr_store_1.getActivePrDeliveryByRail)(c.db, railIndex);
530
- if (pending) {
531
- res.status(409).json({ error: 'pr_decision_pending', prDeliveryId: pending.id });
552
+ const pendingSnapshot = pending ? (0, rail_pr_store_1.toPrDeliverySnapshot)(pending) : null;
553
+ if (pendingSnapshot && !prDeliveryContinuesTickets(pendingSnapshot, rail.ticketIds)) {
554
+ res.status(409).json({ error: 'pr_decision_pending', prDeliveryId: pendingSnapshot.id });
532
555
  return;
533
556
  }
557
+ continuablePrDeliveryForFallback = pendingSnapshot;
534
558
  }
535
559
  // Worktree isolation needs a git repo WITH at least one commit (an
536
560
  // unborn HEAD can't be branched). Fall back (with a message) otherwise.
@@ -546,6 +570,8 @@ function createRailsRouter() {
546
570
  provider: loopProvider, model: loopModel, effort, scope,
547
571
  originSurface: originSurface ?? 'dashboard',
548
572
  originConversationId: originConversationId ?? null,
573
+ preservePrDeliveryOnAllocationFailure: Boolean(continuablePrDeliveryForFallback),
574
+ onPrDeliveryCreated: (id) => { fallbackPrDeliveryId = id; },
549
575
  });
550
576
  res.status(202).json({ loopRunIds: ids, railIndex, mode, isolated: true });
551
577
  return;
@@ -562,6 +588,7 @@ function createRailsRouter() {
562
588
  // via SPECRAILS_REPO_DIR + `--add-dir` exactly like QueueManager.
563
589
  const loopExec = (0, workspace_resolution_1.resolveProjectExecution)({ slug: c.project.slug, path: c.project.path });
564
590
  const loopRunIds = [];
591
+ const sharedRunSettles = [];
565
592
  const launchLoopRun = (runId, ticketIds, spec) => {
566
593
  c.railLoopRuns.set(runId, { railIndex, ticketIds });
567
594
  // Code-Explorer provenance for shared-cwd loop runs (isolated runs
@@ -594,7 +621,7 @@ function createRailsRouter() {
594
621
  broadcast: (msg) => c.broadcast(msg),
595
622
  });
596
623
  };
597
- c.loopRunManager
624
+ const runPromise = c.loopRunManager
598
625
  .run({
599
626
  runId,
600
627
  loopId,
@@ -614,12 +641,15 @@ function createRailsRouter() {
614
641
  .then((r) => {
615
642
  recordRunProvenance();
616
643
  c.onLoopRunFinished(r.runId, r.outcome);
644
+ return r.outcome === 'success';
617
645
  })
618
646
  .catch((err) => {
619
647
  console.error('[rails-router] loop run failed:', err);
620
648
  recordRunProvenance();
621
649
  c.onLoopRunFinished(runId, 'failed');
650
+ return false;
622
651
  });
652
+ sharedRunSettles.push(runPromise);
623
653
  loopRunIds.push(runId);
624
654
  try {
625
655
  c.jiraSyncManager.onRailLaunch(ticketIds, runId);
@@ -637,6 +667,25 @@ function createRailsRouter() {
637
667
  launchLoopRun((0, ids_1.newId)(), [ticketId], c.getTicketSpec(ticketId));
638
668
  }
639
669
  }
670
+ if (fallbackPrDeliveryId) {
671
+ const row = (0, rail_pr_store_1.getPrDelivery)(c.db, fallbackPrDeliveryId);
672
+ const isExistingPrIteration = row?.decision === 'building' && row.pr_state === 'pr-created' && Boolean(row.pr_url && row.branch);
673
+ if (isExistingPrIteration) {
674
+ if ((0, rail_pr_store_1.transitionDecision)(c.db, fallbackPrDeliveryId, 'building', 'building', { runIds: loopRunIds })) {
675
+ emitPrDeliveryUpdate(c, fallbackPrDeliveryId);
676
+ }
677
+ void Promise.allSettled(sharedRunSettles).then(() => {
678
+ const current = (0, rail_pr_store_1.getPrDelivery)(c.db, fallbackPrDeliveryId);
679
+ if (current?.decision !== 'building')
680
+ return;
681
+ if (current.pr_state === 'pr-created' && current.pr_url && current.branch) {
682
+ if ((0, rail_pr_store_1.transitionDecision)(c.db, fallbackPrDeliveryId, 'building', 'pr_ready')) {
683
+ emitPrDeliveryUpdate(c, fallbackPrDeliveryId);
684
+ }
685
+ }
686
+ });
687
+ }
688
+ }
640
689
  res.status(202).json({
641
690
  loopRunIds, railIndex, mode,
642
691
  ...(isolationUnavailable ? { isolationUnavailable } : {}),
@@ -645,29 +694,29 @@ function createRailsRouter() {
645
694
  return;
646
695
  }
647
696
  // A custom-loop launch (mode='loop') with no loopId is invalid — there is
648
- // no factory loop to fall back to (only implement/batch/ultracode do).
697
+ // no factory loop to fall back to (only implement/batch/freestyle do).
649
698
  if (mode === 'loop') {
650
699
  res.status(400).json({ error: 'loopId is required for loop mode' });
651
700
  return;
652
701
  }
653
702
  let jobId;
654
- if (mode === 'ultracode') {
655
- // Ultracode launches ONE independent Claude job per ticket — each gets
703
+ if (mode === 'freestyle') {
704
+ // Freestyle launches ONE independent Claude job per ticket — each gets
656
705
  // its own log and runs the spec autonomously (no pipeline). The rail UI
657
706
  // tracks the first job as its representative active job; every job is
658
707
  // registered so its ticket is marked done on completion.
659
708
  // `provider: 'claude'` is explicit so the spawn resolves the claude
660
709
  // adapter regardless of the project's primary.
661
- const ultracodeModel = mode === 'ultracode' && typeof model === 'string' && VALID_ULTRACODE_MODELS.has(model)
710
+ const freestyleModel = mode === 'freestyle' && typeof model === 'string' && VALID_FREESTYLE_MODELS.has(model)
662
711
  ? model
663
712
  : undefined;
664
713
  const jobIds = [];
665
714
  for (const ticketId of rail.ticketIds) {
666
- const command = `/specrails:ultracode #${ticketId} --yes`;
715
+ const command = `/specrails:freestyle #${ticketId} --yes`;
667
716
  const job = c.queueManager.enqueue(command, 'normal', {
668
717
  profileName: null,
669
718
  provider: 'claude',
670
- ...(ultracodeModel ? { model: ultracodeModel } : {}),
719
+ ...(freestyleModel ? { model: freestyleModel } : {}),
671
720
  // No explicit `interactive` — QueueManager's spawn-time default
672
721
  // (kill-switch + persistent-stdin capability) covers it, and the
673
722
  // decision survives a restart that way.
@@ -738,7 +787,7 @@ function createRailsRouter() {
738
787
  return;
739
788
  }
740
789
  const c = ctx(req);
741
- // M19: an Ultracode rail registers ONE queue job per ticket. The old code
790
+ // M19: an Freestyle rail registers ONE queue job per ticket. The old code
742
791
  // stopped only the FIRST matching job, so the remaining N-1 jobs kept running
743
792
  // and billing while the UI showed the rail stopped. Collect ALL jobs for this
744
793
  // rail index and cancel each (running → kill, queued → cancel).
@@ -1 +0,0 @@
1
- var e=`任务中心`,t=`通过对话操作 Specrails`,n=`任务中心`,r=`让智能体做任何事…`,i=`发送`,a=`停止`,o=`复制`,s=`最大化`,c=`还原`,l=`最小化`,u=`关闭`,d=`新任务`,f=`这次的任务是什么?`,p=`先选择一个项目,然后提问。智能体工作时看板会实时更新。`,m=`思考中…`,h=`连接中…`,g=`正在查询应用…`,_={compact:`紧凑`,comfortable:`舒适`,max:`最大化`},v={label:`模型`},y={hint:`浏览提示历史 — 输入以编辑,↑↓ 导航`},b={queued:`排队中`,send:`发送到队列`,sendHint:`智能体仍在工作——此消息将排队并在之后执行`,placeholder:`智能体工作时可继续输入——消息将排队…`},x={editing:`正在编辑排队消息 {{n}}/{{m}}`,hint:`↑↓ 导航 · 回车保存 · Esc 取消`,save:`保存排队消息`,cancel:`取消编辑`,dispatched:`该排队消息已发送——你的文本已保留为草稿`,saveFailed:`无法保存排队消息`},S={branch:`分支`,detached:`(分离头指针)`,dirty:`有未提交的更改`,switched:`已切换到 {{branch}}`,switchFailed:`无法切换分支`,lockedWhileWorking:`智能体工作时分支已锁定`,searchPlaceholder:`搜索分支…`,noMatches:`没有匹配的分支`,worktrees:`工作树`,worktreePathCopied:`已复制工作树路径`,copyWorktreePath:`复制工作树路径`},C={label:`提供方`,claude:`Claude`,codex:`Codex`,gemini:`Gemini`},w={cycleHint:`⇧⇥ 切换`,observe:{name:`观察`,desc:`只读 — 不做任何更改`},edit:{name:`编辑`,desc:`创建和编辑(可撤销)`},operate:{name:`操作`,desc:`启动 AI — 会产生费用`},autonomous:{name:`自主`,desc:`删除和终止 — 不可逆`},lockedTitle:`需要更高的级别`,lockedBody:`该操作需要「{{level}}」级别。你当前处于「{{current}}」。`,raiseHint:`⇧⇥ 提升级别,或换一种方式询问。`},T={title:`确认操作`,costAction:`{{action}} · ~{{cost}} · {{tier}}`,approve:`批准`,cancel:`取消`,dontAskAgain:`本次会话不再询问`,approved:`已批准`,cancelled:`已取消`},E={home:`主页`,searchPlaceholder:`与 Specrails 对话…`,recents:`最近`,allProjects:`所有项目`,searchAll:`在所有项目中搜索`,addProject:`添加项目…`,homeHint:`未选择项目 — 正在跨所有项目操作。`,askCreateOrSearch:`未选择任何项目。你想创建一个新项目,还是在所有项目中搜索?`},D={label:`切换任务`,untitled:`新任务`,new:`新任务`,searchPlaceholder:`搜索任务…`,noMatches:`没有匹配的任务`,working:`代理正在工作`,queuedBadge:`{{n}} 条排队`,delete:`删除任务 "{{title}}"`,deleteConfirm:`删除?`,deleteLiveConfirm:`代理正在工作 — 仍要删除?`,confirmDelete:`确认删除`,cancelDelete:`保留任务`,deleteFailed:`无法删除任务`},O={title:`未安装 AI 提供方`,body:`智能体需要在你的机器上安装 Claude、Codex 或 Gemini。安装其中之一后重新打开智能体即可开始对话。`,placeholder:`请安装 AI 提供方以使用智能体…`},k={title:`Specrails MCP 已关闭`,body:`智能体需要内置的 MCP 服务器来操作应用。`,enable:`启用 Specrails MCP`,enabling:`正在启用…`,enabled:`MCP 已启用`},A={live:`实时`,queued:`排队中`,running:`运行中`,done:`已完成`,failed:`失败`},j={generic:`出了点问题。请重试。`,busy:`智能体正忙。请稍后重试。`},M={kindAgent:`智能体任务`},N=`新任务`,P=`切换到任务中心`,F=`切换到看板`,I=`搜索`,L=`主页`,R=`收藏任务`,z=`未命名`,B={title:`工作区`,terminal:`终端`,files:`文件`,browser:`浏览器`,requiresProject:`请选择一个项目以使用此工具`,resizeCode:`调整代码面板`,closeFiles:`关闭代码`,browserConfirm:`添加到智能体`,browserCaptured:`已添加捕获`,uploadFailed:`上传失败`,requiresConversation:`启动任务后才能使用此工具`,jobs:`作业`,closeJobs:`关闭作业`,resizeJobs:`调整作业面板大小`,noJobs:`还没有作业——让智能体启动一个吧`},V=`附加文件`,H=`删除「{{title}}」`,U=`确认删除「{{title}}」`,W=`将「{{title}}」添加到收藏`,G=`从收藏中移除「{{title}}」`,K=`确认?`,q=`该提供商暂不支持读取图片 — 请附加文本文件`,J={label:`推理强度`,minimal:`最小`,low:`低`,medium:`中`,high:`高`,xhigh:`极高`},Y=`这次的任务是什么,Neo?`,X={rail:`Rail {{index}}`,specCount_one:`{{count}} 个 Spec`,specCount_other:`{{count}} 个 Spec`,base:`基础分支`,openPr:`打开 PR`,existingPr:`现有 PR`,title:{building:`正在隔离的 worktree 中实现…`,buildingExistingPr:`正在向现有 PR 应用更改…`,on_review:`实现已完成,待评审`,pr_draft:`已创建草稿 PR`,pr_draft_degraded:`PR 交付未完成`,pr_ready:`PR 已就绪,可合并`,pr_failed:`PR 创建失败`,merged:`PR 已合并`,discarded:`已丢弃`},buildingHint:`完成后会询问你是否创建 PR。`,buildingExistingPrHint:`Specrails 正在现有 PR 的分支上工作,并会把 review 更改推送回同一个 PR。`,createPr:`创建 PR`,publish:`发布`,retry:`重试`,retryPr:`重试 PR`,checkMerge:`检查合并`,discard:`丢弃`,confirmDiscard:`确认丢弃?`,mergedNote:`已合并 — Spec 已移至完成`,discardedNote:`已丢弃 — Spec 已退回待办`,degraded:{pushed:`分支已推送,但无法创建 PR — 请重试以完成。`,localOnly:`更改已在本地组装但未推送 — 请重试以发布 PR。`},alreadyResolved:`已在其他地方处理`,actionFailed:`操作失败`,notMergedYet:`尚未合并`,viewLog:`查看 {{ref}} 的运行日志`,runElapsedAria:`已运行 {{elapsed}}`,runCostAria:`已花费 {{cost}}`,pinned:{label:`已固定`,marker:`实现卡片 — 已固定在上方`,collapse:`最小化固定卡片`,expand:`展开固定卡片`,expandCard:`展开此卡片`,collapseCard:`最小化此卡片`,collapsed_one:`实现卡片`,collapsed_other:`{{count}} 张实现卡片`,state:{building:`构建中`,on_review:`待审阅`,pr_draft:`草稿 PR`,pr_ready:`已发布`,pr_failed:`失败`,merged:`已合并`,discarded:`已丢弃`}},mergeLocal:`本地集成`,mergeLocalTooltip:`将交付的分支合并到本地检出的 {{base}}(无需 GitHub)`,mergeLocalBlockedDirty:`无法集成:{{base}} 上的工作树有未提交的更改。请提交或暂存后重试。`,mergeLocalBlockedBranch:`无法集成:当前检出在 {{current}},而不是 {{base}}。请切换到 {{base}} 后重试。`,mergedLocally:`已在本地集成到 {{base}}`},Z={heading:`规格草稿`,drafting:`正在更新草稿…`,acceptanceCriteria:`验收标准`,untitled:`未命名规格`,expand:`显示完整描述`,collapse:`收起描述`},Q={openTicket:`打开 Spec #{{id}}`,openPullRequest:`打开 PR #{{id}}`,openJob:`打开任务 {{id}}`,openLoop:`打开循环 {{id}}`,ticketNotFound:`未找到 Spec #{{id}} — 可能已被删除`,pullRequestUrlMissing:`PR #{{id}} 被引用但没有 URL`,pullRequestNotFound:`在此项目中找不到 PR #{{id}}`,jobNotFound:`未找到任务 — 可能已被删除`,loopNotFound:`未找到循环 — 可能已被删除`,lookupFailed:`无法验证该引用 — 请重试`},$={untitled:`未命名任务`,menu:`任务菜单`,rename:`重命名`,renamePlaceholder:`任务名称`,renameHint:`双击重命名`,renameFailed:`无法重命名`,addFavorite:`添加到收藏`,removeFavorite:`从收藏中移除`,copyName:`复制任务名称`,copyId:`复制任务 ID`,copyProject:`复制项目名称`,copyProjectPath:`复制项目路径`,copyFailed:`无法复制`,delete:`删除任务`,deleteConfirm:`删除此任务?此操作无法撤销。`,deleteFailed:`无法删除任务`},ee={title:e,subtitle:t,trigger:n,composerPlaceholder:r,send:i,stop:a,copy:o,maximize:s,restore:c,minimize:l,close:u,newConversation:d,emptyTitle:f,emptyHint:p,thinking:m,connecting:h,consultingCode:g,size:_,model:v,history:y,queue:b,queueEdit:x,git:S,provider:C,tier:w,approval:T,project:E,mission:D,noProvider:O,degraded:k,toolCard:A,error:j,chip:M,newAgent:N,switchToAgent:P,switchToKanban:F,search:I,home:L,favoriteMissions:R,untitled:z,workspace:B,attachFile:V,deleteConversation:H,confirmDeleteConversation:U,addFavoriteConversation:W,removeFavoriteConversation:G,confirmShort:K,imagesUnsupported:q,effort:J,emptyTitleMatrix:Y,prCard:X,specDraft:Z,refs:Q,header:$};export{W as addFavoriteConversation,T as approval,V as attachFile,M as chip,u as close,r as composerPlaceholder,U as confirmDeleteConversation,K as confirmShort,h as connecting,g as consultingCode,o as copy,ee as default,k as degraded,H as deleteConversation,J as effort,p as emptyHint,f as emptyTitle,Y as emptyTitleMatrix,j as error,R as favoriteMissions,S as git,$ as header,y as history,L as home,q as imagesUnsupported,s as maximize,l as minimize,D as mission,v as model,N as newAgent,d as newConversation,O as noProvider,X as prCard,E as project,C as provider,b as queue,x as queueEdit,Q as refs,G as removeFavoriteConversation,c as restore,I as search,i as send,_ as size,Z as specDraft,a as stop,t as subtitle,P as switchToAgent,F as switchToKanban,m as thinking,w as tier,e as title,A as toolCard,n as trigger,z as untitled,B as workspace};
@@ -1 +0,0 @@
1
- var e=`Missionszentrale`,t=`Specrails per Chat bedienen`,n=`Missionszentrale`,r=`Bitte den Agenten um alles…`,i=`Senden`,a=`Stopp`,o=`Kopieren`,s=`Maximieren`,c=`Wiederherstellen`,l=`Minimieren`,u=`Schließen`,d=`Neue Mission`,f=`Wie lautet die Mission?`,p=`Wähle ein Projekt und frag dann. Das Board aktualisiert sich live, während der Agent arbeitet.`,m=`Denkt nach…`,h=`Verbinden…`,g=`App wird abgefragt…`,_={compact:`Kompakt`,comfortable:`Komfortabel`,max:`Maximieren`},v={label:`Modell`},y={hint:`Verlauf durchsuchen — tippen zum Bearbeiten, ↑↓ zum Navigieren`},b={queued:`In Warteschlange`,send:`In Warteschlange senden`,sendHint:`Der Agent arbeitet noch — diese Nachricht wird eingereiht und danach ausgeführt`,placeholder:`Mehr hinzufügen, während der Agent arbeitet — wird eingereiht…`},x={editing:`Bearbeite eingereihte Nachricht {{n}} von {{m}}`,hint:`↑↓ zum Navigieren · Enter speichert · Esc bricht ab`,save:`Eingereihte Nachricht speichern`,cancel:`Bearbeitung abbrechen`,dispatched:`Diese eingereihte Nachricht wurde bereits gesendet — dein Text bleibt als Entwurf erhalten`,saveFailed:`Eingereihte Nachricht konnte nicht gespeichert werden`},S={branch:`Branch`,detached:`(detached)`,dirty:`Nicht committete Änderungen`,switched:`Zu {{branch}} gewechselt`,switchFailed:`Branch-Wechsel fehlgeschlagen`,lockedWhileWorking:`Branch gesperrt, während der Agent arbeitet`,searchPlaceholder:`Branches durchsuchen…`,noMatches:`Keine passenden Branches`,worktrees:`Worktrees`,worktreePathCopied:`Worktree-Pfad kopiert`,copyWorktreePath:`Worktree-Pfad kopieren`},C={label:`Anbieter`,claude:`Claude`,codex:`Codex`,gemini:`Gemini`},w={cycleHint:`⇧⇥ zum Wechseln`,observe:{name:`Beobachten`,desc:`Nur lesen — nichts ändert sich`},edit:{name:`Bearbeiten`,desc:`Erstellen und bearbeiten (umkehrbar)`},operate:{name:`Ausführen`,desc:`KI starten — kostet Geld`},autonomous:{name:`Autonom`,desc:`Löschen und beenden — unumkehrbar`},lockedTitle:`Höhere Stufe erforderlich`,lockedBody:`Diese Aktion erfordert die Stufe „{{level}}“. Du bist auf „{{current}}“.`,raiseHint:`⇧⇥ um die Stufe zu erhöhen, oder frag anders.`},T={title:`Aktion bestätigen`,costAction:`{{action}} · ~{{cost}} · {{tier}}`,approve:`Genehmigen`,cancel:`Abbrechen`,dontAskAgain:`In dieser Sitzung nicht mehr fragen`,approved:`Genehmigt`,cancelled:`Abgebrochen`},E={home:`Start`,searchPlaceholder:`Mit Specrails sprechen…`,recents:`Zuletzt verwendet`,allProjects:`Alle Projekte`,searchAll:`In allen Projekten suchen`,addProject:`Projekt hinzufügen…`,homeHint:`Kein Projekt ausgewählt — über alle Projekte hinweg.`,askCreateOrSearch:`Es ist kein Projekt ausgewählt. Möchtest du ein neues Projekt erstellen oder über alle Projekte hinweg suchen?`},D={label:`Mission wechseln`,untitled:`Neue Mission`,new:`Neue Mission`,searchPlaceholder:`Missionen durchsuchen…`,noMatches:`Keine Mission gefunden`,working:`Agent arbeitet`,queuedBadge:`{{n}} in Warteschlange`,delete:`Mission "{{title}}" löschen`,deleteConfirm:`Löschen?`,deleteLiveConfirm:`Der Agent arbeitet — trotzdem löschen?`,confirmDelete:`Löschen bestätigen`,cancelDelete:`Mission behalten`,deleteFailed:`Mission konnte nicht gelöscht werden`},O={title:`Kein KI-Anbieter installiert`,body:`Der Agent benötigt Claude, Codex oder Gemini auf deinem Rechner. Installiere einen und öffne den Agenten erneut, um zu chatten.`,placeholder:`Installiere einen KI-Anbieter, um den Agenten zu nutzen…`},k={title:`Specrails MCP ist aus`,body:`Der Agent braucht den eingebetteten MCP-Server, um die App zu bedienen.`,enable:`Specrails MCP aktivieren`,enabling:`Wird aktiviert…`,enabled:`MCP aktiviert`},A={live:`live`,queued:`in Warteschlange`,running:`läuft`,done:`fertig`,failed:`fehlgeschlagen`},j={generic:`Etwas ist schiefgelaufen. Versuch es erneut.`,busy:`Der Agent ist beschäftigt. Versuch es gleich noch einmal.`},M={kindAgent:`Agenten-Mission`},N=`Neue Mission`,P=`Zur Missionszentrale wechseln`,F=`Zum Board wechseln`,I=`Suchen`,L=`Start`,R=`Lieblingsmissionen`,z=`Ohne Titel`,B={title:`Im Workspace`,terminal:`Terminal`,files:`Dateien`,browser:`Browser`,requiresProject:`Wähle ein Projekt, um dieses Tool zu nutzen`,resizeCode:`Code-Bereich anpassen`,closeFiles:`Code schließen`,browserConfirm:`Zum Agenten hinzufügen`,browserCaptured:`Aufnahme hinzugefügt`,uploadFailed:`Upload fehlgeschlagen`,requiresConversation:`Starte eine Mission, um dieses Werkzeug zu nutzen`,jobs:`Jobs`,closeJobs:`Jobs schließen`,resizeJobs:`Jobs-Bereich anpassen`,noJobs:`Noch keine Jobs — bitte den Agenten, einen zu starten`},V=`Datei anhängen`,H=`„{{title}}“ löschen`,U=`Löschen von „{{title}}“ bestätigen`,W=`„{{title}}“ zu Favoriten hinzufügen`,G=`„{{title}}“ aus Favoriten entfernen`,K=`bestätigen?`,q=`Dieser Anbieter kann noch keine Bilder lesen — hänge stattdessen Textdateien an`,J={label:`Aufwand`,minimal:`Minimal`,low:`Niedrig`,medium:`Mittel`,high:`Hoch`,xhigh:`Sehr hoch`},Y=`Wie lautet die Mission, Neo?`,X={rail:`Rail {{index}}`,specCount_one:`{{count}} Spec`,specCount_other:`{{count}} Specs`,base:`Basis-Branch`,openPr:`PR öffnen`,existingPr:`Bestehender PR`,title:{building:`Implementierung in einem isolierten Worktree…`,buildingExistingPr:`Änderungen werden auf einen bestehenden PR angewendet…`,on_review:`Implementierung bereit zur Prüfung`,pr_draft:`Entwurfs-PR erstellt`,pr_draft_degraded:`PR-Auslieferung unvollständig`,pr_ready:`PR bereit zum Merge`,pr_failed:`PR-Erstellung fehlgeschlagen`,merged:`PR gemergt`,discarded:`Verworfen`},buildingHint:`Nach Abschluss wirst du gefragt, ob der PR erstellt werden soll.`,buildingExistingPrHint:`Specrails arbeitet auf dem Branch des bestehenden PRs und pusht die Review-Änderungen zurück in denselben PR.`,createPr:`PR erstellen`,publish:`Veröffentlichen`,retry:`Erneut versuchen`,retryPr:`PR erneut versuchen`,checkMerge:`Merge prüfen`,discard:`Verwerfen`,confirmDiscard:`Verwerfen bestätigen?`,mergedNote:`Gemergt — Specs nach Fertig verschoben`,discardedNote:`Verworfen — Specs zurück ins Backlog`,degraded:{pushed:`Der Branch wurde gepusht, aber die PR konnte nicht erstellt werden — erneut versuchen, um abzuschließen.`,localOnly:`Die Änderungen wurden lokal zusammengeführt, aber nicht gepusht — erneut versuchen, um die PR zu veröffentlichen.`},alreadyResolved:`Bereits anderweitig erledigt`,actionFailed:`Aktion fehlgeschlagen`,notMergedYet:`Noch nicht gemergt`,viewLog:`Ausführungsprotokoll für {{ref}} anzeigen`,runElapsedAria:`{{elapsed}} vergangen`,runCostAria:`{{cost}} ausgegeben`,pinned:{label:`Angeheftet`,marker:`Implementierungskarte — oben angeheftet`,collapse:`Angeheftete Karte minimieren`,expand:`Angeheftete Karte ausklappen`,expandCard:`Diese Karte ausklappen`,collapseCard:`Diese Karte minimieren`,collapsed_one:`Implementierungskarte`,collapsed_other:`{{count}} Implementierungskarten`,state:{building:`Läuft`,on_review:`Review`,pr_draft:`Entwurfs-PR`,pr_ready:`Veröffentlicht`,pr_failed:`Fehlgeschlagen`,merged:`Gemerged`,discarded:`Verworfen`}},mergeLocal:`Lokal integrieren`,mergeLocalTooltip:`Führt die gelieferten Branches lokal in {{base}} zusammen (ohne GitHub)`,mergeLocalBlockedDirty:`Integration nicht möglich: dein Arbeitsverzeichnis auf {{base}} hat uncommittete Änderungen. Committe oder stashe sie und versuche es erneut.`,mergeLocalBlockedBranch:`Integration nicht möglich: dein Checkout steht auf {{current}}, nicht auf {{base}}. Wechsle zu {{base}} und versuche es erneut.`,mergedLocally:`Lokal in {{base}} integriert`},Z={heading:`Spec-Entwurf`,drafting:`Entwurf wird aktualisiert…`,acceptanceCriteria:`Akzeptanzkriterien`,untitled:`Spec ohne Titel`,expand:`Vollständige Beschreibung anzeigen`,collapse:`Beschreibung einklappen`},Q={openTicket:`Spec #{{id}} öffnen`,openPullRequest:`PR #{{id}} öffnen`,openJob:`Job {{id}} öffnen`,openLoop:`Loop {{id}} öffnen`,ticketNotFound:`Spec #{{id}} nicht gefunden — möglicherweise gelöscht`,pullRequestUrlMissing:`PR #{{id}} wurde ohne URL erwähnt`,pullRequestNotFound:`PR #{{id}} wurde in diesem Projekt nicht gefunden`,jobNotFound:`Job nicht gefunden — möglicherweise gelöscht`,loopNotFound:`Loop nicht gefunden — er wurde möglicherweise gelöscht`,lookupFailed:`Referenz konnte nicht geprüft werden — bitte erneut versuchen`},$={untitled:`Unbenannte Mission`,menu:`Missionsmenü`,rename:`Umbenennen`,renamePlaceholder:`Name der Mission`,renameHint:`Zum Umbenennen doppelklicken`,renameFailed:`Umbenennen fehlgeschlagen`,addFavorite:`Zu Favoriten hinzufügen`,removeFavorite:`Aus Favoriten entfernen`,copyName:`Missionsname kopieren`,copyId:`Missions-ID kopieren`,copyProject:`Projektname kopieren`,copyProjectPath:`Projektpfad kopieren`,copyFailed:`Kopieren fehlgeschlagen`,delete:`Mission löschen`,deleteConfirm:`Diese Mission löschen? Kann nicht rückgängig gemacht werden.`,deleteFailed:`Mission konnte nicht gelöscht werden`},ee={title:e,subtitle:t,trigger:n,composerPlaceholder:r,send:i,stop:a,copy:o,maximize:s,restore:c,minimize:l,close:u,newConversation:d,emptyTitle:f,emptyHint:p,thinking:m,connecting:h,consultingCode:g,size:_,model:v,history:y,queue:b,queueEdit:x,git:S,provider:C,tier:w,approval:T,project:E,mission:D,noProvider:O,degraded:k,toolCard:A,error:j,chip:M,newAgent:N,switchToAgent:P,switchToKanban:F,search:I,home:L,favoriteMissions:R,untitled:z,workspace:B,attachFile:V,deleteConversation:H,confirmDeleteConversation:U,addFavoriteConversation:W,removeFavoriteConversation:G,confirmShort:K,imagesUnsupported:q,effort:J,emptyTitleMatrix:Y,prCard:X,specDraft:Z,refs:Q,header:$};export{W as addFavoriteConversation,T as approval,V as attachFile,M as chip,u as close,r as composerPlaceholder,U as confirmDeleteConversation,K as confirmShort,h as connecting,g as consultingCode,o as copy,ee as default,k as degraded,H as deleteConversation,J as effort,p as emptyHint,f as emptyTitle,Y as emptyTitleMatrix,j as error,R as favoriteMissions,S as git,$ as header,y as history,L as home,q as imagesUnsupported,s as maximize,l as minimize,D as mission,v as model,N as newAgent,d as newConversation,O as noProvider,X as prCard,E as project,C as provider,b as queue,x as queueEdit,Q as refs,G as removeFavoriteConversation,c as restore,I as search,i as send,_ as size,Z as specDraft,a as stop,t as subtitle,P as switchToAgent,F as switchToKanban,m as thinking,w as tier,e as title,A as toolCard,n as trigger,z as untitled,B as workspace};
@@ -1 +0,0 @@
1
- var e=`Controllo missioni`,t=`Gestisci Specrails chattando`,n=`Controllo missioni`,r=`Chiedi all'agente qualsiasi cosa…`,i=`Invia`,a=`Ferma`,o=`Copia`,s=`Massimizza`,c=`Ripristina`,l=`Riduci a icona`,u=`Chiudi`,d=`Nuova missione`,f=`Qual è la missione?`,p=`Scegli un progetto, poi chiedi. La board si aggiorna in tempo reale mentre l'agente lavora.`,m=`Sto pensando…`,h=`Connessione…`,g=`Consulto l'app…`,_={compact:`Compatto`,comfortable:`Comodo`,max:`Ingrandisci`},v={label:`Modello`},y={hint:`Cronologia prompt — scrivi per modificare, ↑↓ per navigare`},b={queued:`In coda`,send:`Invia in coda`,sendHint:`L'agente sta ancora lavorando — questo messaggio verrà messo in coda ed eseguito dopo`,placeholder:`Aggiungi altro mentre l'agente lavora — verrà messo in coda…`},x={editing:`Modifica del messaggio in coda {{n}} di {{m}}`,hint:`↑↓ per navigare · Invio salva · Esc annulla`,save:`Salva messaggio in coda`,cancel:`Annulla modifica`,dispatched:`Quel messaggio in coda è già stato inviato — il tuo testo è conservato come bozza`,saveFailed:`Impossibile salvare il messaggio in coda`},S={branch:`Branch`,detached:`(detached)`,dirty:`Modifiche non committate`,switched:`Passato a {{branch}}`,switchFailed:`Impossibile cambiare branch`,lockedWhileWorking:`Branch bloccato mentre l'agente lavora`,searchPlaceholder:`Cerca branch…`,noMatches:`Nessun branch corrisponde`,worktrees:`Worktree`,worktreePathCopied:`Percorso del worktree copiato`,copyWorktreePath:`Copia percorso del worktree`},C={label:`Provider`,claude:`Claude`,codex:`Codex`,gemini:`Gemini`},w={cycleHint:`⇧⇥ per cambiare`,observe:{name:`Osserva`,desc:`Solo lettura — niente cambia`},edit:{name:`Modifica`,desc:`Crea e modifica (reversibile)`},operate:{name:`Opera`,desc:`Avvia l'IA — ha un costo`},autonomous:{name:`Autonomo`,desc:`Elimina e arresta — irreversibile`},lockedTitle:`Serve un livello superiore`,lockedBody:`Quell'azione richiede il livello «{{level}}». Sei su «{{current}}».`,raiseHint:`⇧⇥ per alzare il livello, o chiedi in un altro modo.`},T={title:`Conferma azione`,costAction:`{{action}} · ~{{cost}} · {{tier}}`,approve:`Approva`,cancel:`Annulla`,dontAskAgain:`Non chiedere più in questa sessione`,approved:`Approvato`,cancelled:`Annullato`},E={home:`Home`,searchPlaceholder:`Parla con Specrails…`,recents:`Recenti`,allProjects:`Tutti i progetti`,searchAll:`Cerca in tutti i progetti`,addProject:`Aggiungi progetto…`,homeHint:`Nessun progetto selezionato — operando su tutti i progetti.`,askCreateOrSearch:`Nessun progetto è selezionato. Vuoi creare un nuovo progetto o cercare in tutti i progetti?`},D={label:`Cambia missione`,untitled:`Nuova missione`,new:`Nuova missione`,searchPlaceholder:`Cerca missioni…`,noMatches:`Nessuna missione corrisponde`,working:`L'agente sta lavorando`,queuedBadge:`{{n}} in coda`,delete:`Elimina missione "{{title}}"`,deleteConfirm:`Eliminare?`,deleteLiveConfirm:`L'agente sta lavorando — eliminare comunque?`,confirmDelete:`Conferma eliminazione`,cancelDelete:`Mantieni missione`,deleteFailed:`Impossibile eliminare la missione`},O={title:`Nessun provider IA installato`,body:`L'agente richiede Claude, Codex o Gemini sul tuo computer. Installane uno e riapri l'agente per iniziare a chattare.`,placeholder:`Installa un provider IA per usare l'agente…`},k={title:`L'MCP di Specrails è spento`,body:`L'agente ha bisogno del server MCP integrato per gestire l'app.`,enable:`Attiva l'MCP di Specrails`,enabling:`Attivazione…`,enabled:`MCP attivato`},A={live:`in diretta`,queued:`in coda`,running:`in corso`,done:`completato`,failed:`fallito`},j={generic:`Qualcosa è andato storto. Riprova.`,busy:`L'agente è occupato. Riprova tra un momento.`},M={kindAgent:`Missione dell'agente`},N=`Nuova missione`,P=`Passa al Controllo missioni`,F=`Passa alla board`,I=`Cerca`,L=`Home`,R=`Missioni preferite`,z=`Senza titolo`,B={title:`Nel workspace`,terminal:`Terminale`,files:`File`,browser:`Browser`,requiresProject:`Seleziona un progetto per usare questo strumento`,resizeCode:`Ridimensiona pannello codice`,closeFiles:`Chiudi codice`,browserConfirm:`Aggiungi all'agente`,browserCaptured:`Cattura aggiunta`,uploadFailed:`Caricamento non riuscito`,requiresConversation:`Avvia una missione per usare questo strumento`,jobs:`Jobs`,closeJobs:`Chiudi jobs`,resizeJobs:`Ridimensiona pannello jobs`,noJobs:`Ancora nessun job — chiedi all'agente di lanciarne uno`},V=`Allega file`,H=`Elimina «{{title}}»`,U=`Conferma eliminazione di «{{title}}»`,W=`Aggiungi «{{title}}» ai preferiti`,G=`Rimuovi «{{title}}» dai preferiti`,K=`confermare?`,q=`Questo provider non legge ancora le immagini — allega file di testo`,J={label:`Sforzo`,minimal:`Minimo`,low:`Basso`,medium:`Medio`,high:`Alto`,xhigh:`Extra alto`},Y=`Qual è la missione, Neo?`,X={rail:`Rail {{index}}`,specCount_one:`{{count}} spec`,specCount_other:`{{count}} spec`,base:`Ramo base`,openPr:`Apri PR`,existingPr:`PR esistente`,title:{building:`Implementazione in un worktree isolato…`,buildingExistingPr:`Applicazione delle modifiche su una PR esistente…`,on_review:`Implementazione pronta per la revisione`,pr_draft:`PR in bozza creata`,pr_draft_degraded:`Consegna della PR incompleta`,pr_ready:`PR pronta per il merge`,pr_failed:`Creazione della PR non riuscita`,merged:`Merge della PR effettuato`,discarded:`Scartata`},buildingHint:`Al termine ti verrà chiesto se creare la PR.`,buildingExistingPrHint:`Specrails sta lavorando sul branch della PR esistente e invierà le modifiche di review a quella stessa PR.`,createPr:`Crea PR`,publish:`Pubblica`,retry:`Riprova`,retryPr:`Riprova PR`,checkMerge:`Verifica merge`,discard:`Scarta`,confirmDiscard:`Confermare lo scarto?`,mergedNote:`Merge effettuato — le spec sono passate a Completato`,discardedNote:`Scartata — le spec sono tornate nel backlog`,degraded:{pushed:`Il ramo è stato inviato ma non è stato possibile creare la PR — riprova per completare.`,localOnly:`Le modifiche sono state assemblate in locale ma non inviate — riprova per pubblicare la PR.`},alreadyResolved:`Già risolta altrove`,actionFailed:`Azione non riuscita`,notMergedYet:`Ancora nessun merge`,viewLog:`Vedi il log di esecuzione di {{ref}}`,runElapsedAria:`{{elapsed}} trascorsi`,runCostAria:`{{cost}} spesi`,pinned:{label:`Fissata`,marker:`Scheda di implementazione — fissata sopra`,collapse:`Riduci la scheda fissata`,expand:`Espandi la scheda fissata`,expandCard:`Espandi questa scheda`,collapseCard:`Riduci questa scheda`,collapsed_one:`Scheda di implementazione`,collapsed_other:`{{count}} schede di implementazione`,state:{building:`In corso`,on_review:`Revisione`,pr_draft:`PR bozza`,pr_ready:`Pubblicata`,pr_failed:`Fallita`,merged:`Unita`,discarded:`Scartata`}},mergeLocal:`Integra in locale`,mergeLocalTooltip:`Unisce i branch consegnati in {{base}} nel tuo checkout locale (senza GitHub)`,mergeLocalBlockedDirty:`Impossibile integrare: il tuo albero di lavoro su {{base}} ha modifiche non committate. Fai commit o stash e riprova.`,mergeLocalBlockedBranch:`Impossibile integrare: il tuo checkout è su {{current}}, non su {{base}}. Passa a {{base}} e riprova.`,mergedLocally:`Integrato in {{base}} in locale`},Z={heading:`Bozza della spec`,drafting:`Aggiornamento della bozza…`,acceptanceCriteria:`Criteri di accettazione`,untitled:`Spec senza titolo`,expand:`Mostra descrizione completa`,collapse:`Comprimi descrizione`},Q={openTicket:`Apri la spec #{{id}}`,openPullRequest:`Apri PR #{{id}}`,openJob:`Apri il job {{id}}`,openLoop:`Apri loop {{id}}`,ticketNotFound:`Spec #{{id}} non trovata — potrebbe essere stata eliminata`,pullRequestUrlMissing:`La PR #{{id}} è stata citata senza URL`,pullRequestNotFound:`La PR #{{id}} non è stata trovata in questo progetto`,jobNotFound:`Job non trovato — potrebbe essere stato eliminato`,loopNotFound:`Loop non trovato — potrebbe essere stato eliminato`,lookupFailed:`Impossibile verificare il riferimento — riprova`},$={untitled:`Missione senza titolo`,menu:`Menu della missione`,rename:`Rinomina`,renamePlaceholder:`Nome della missione`,renameHint:`Doppio clic per rinominare`,renameFailed:`Impossibile rinominare`,addFavorite:`Aggiungi ai preferiti`,removeFavorite:`Rimuovi dai preferiti`,copyName:`Copia nome missione`,copyId:`Copia ID missione`,copyProject:`Copia nome progetto`,copyProjectPath:`Copia percorso progetto`,copyFailed:`Impossibile copiare`,delete:`Elimina missione`,deleteConfirm:`Eliminare questa missione? Non è reversibile.`,deleteFailed:`Impossibile eliminare la missione`},ee={title:e,subtitle:t,trigger:n,composerPlaceholder:r,send:i,stop:a,copy:o,maximize:s,restore:c,minimize:l,close:u,newConversation:d,emptyTitle:f,emptyHint:p,thinking:m,connecting:h,consultingCode:g,size:_,model:v,history:y,queue:b,queueEdit:x,git:S,provider:C,tier:w,approval:T,project:E,mission:D,noProvider:O,degraded:k,toolCard:A,error:j,chip:M,newAgent:N,switchToAgent:P,switchToKanban:F,search:I,home:L,favoriteMissions:R,untitled:z,workspace:B,attachFile:V,deleteConversation:H,confirmDeleteConversation:U,addFavoriteConversation:W,removeFavoriteConversation:G,confirmShort:K,imagesUnsupported:q,effort:J,emptyTitleMatrix:Y,prCard:X,specDraft:Z,refs:Q,header:$};export{W as addFavoriteConversation,T as approval,V as attachFile,M as chip,u as close,r as composerPlaceholder,U as confirmDeleteConversation,K as confirmShort,h as connecting,g as consultingCode,o as copy,ee as default,k as degraded,H as deleteConversation,J as effort,p as emptyHint,f as emptyTitle,Y as emptyTitleMatrix,j as error,R as favoriteMissions,S as git,$ as header,y as history,L as home,q as imagesUnsupported,s as maximize,l as minimize,D as mission,v as model,N as newAgent,d as newConversation,O as noProvider,X as prCard,E as project,C as provider,b as queue,x as queueEdit,Q as refs,G as removeFavoriteConversation,c as restore,I as search,i as send,_ as size,Z as specDraft,a as stop,t as subtitle,P as switchToAgent,F as switchToKanban,m as thinking,w as tier,e as title,A as toolCard,n as trigger,z as untitled,B as workspace};
@@ -1 +0,0 @@
1
- import{r as ee}from"./chunk-BNv3lrIs.js";var te=ee({addFavoriteConversation:()=>W,approval:()=>T,attachFile:()=>V,chip:()=>M,close:()=>u,composerPlaceholder:()=>r,confirmDeleteConversation:()=>U,confirmShort:()=>K,connecting:()=>h,consultingCode:()=>g,copy:()=>o,default:()=>ne,degraded:()=>k,deleteConversation:()=>H,effort:()=>J,emptyHint:()=>p,emptyTitle:()=>f,emptyTitleMatrix:()=>Y,error:()=>j,favoriteMissions:()=>R,git:()=>S,header:()=>$,history:()=>y,home:()=>L,imagesUnsupported:()=>q,maximize:()=>s,minimize:()=>l,mission:()=>D,model:()=>v,newAgent:()=>N,newConversation:()=>d,noProvider:()=>O,prCard:()=>X,project:()=>E,provider:()=>C,queue:()=>b,queueEdit:()=>x,refs:()=>Q,removeFavoriteConversation:()=>G,restore:()=>c,search:()=>I,send:()=>i,size:()=>_,specDraft:()=>Z,stop:()=>a,subtitle:()=>t,switchToAgent:()=>P,switchToKanban:()=>F,thinking:()=>m,tier:()=>w,title:()=>e,toolCard:()=>A,trigger:()=>n,untitled:()=>z,workspace:()=>B}),e=`Mission Control`,t=`Operate Specrails by chatting`,n=`Mission Control`,r=`Ask the agent to do anything…`,i=`Send`,a=`Stop`,o=`Copy`,s=`Maximize`,c=`Restore`,l=`Minimize`,u=`Close`,d=`New mission`,f=`What's the mission?`,p=`Pick a project, then ask. The board updates live as the agent works.`,m=`Thinking…`,h=`Connecting…`,g=`Consulting the app…`,_={compact:`Compact`,comfortable:`Comfortable`,max:`Maximize`},v={label:`Model`},y={hint:`Browsing prompt history — type to edit, ↑↓ to navigate`},b={queued:`Queued`,send:`Send to queue`,sendHint:`The agent is still working — this message will queue and run next`,placeholder:`Add more while the agent works — it will queue…`},x={editing:`Editing queued message {{n}} of {{m}}`,hint:`↑↓ to navigate · Enter saves · Esc cancels`,save:`Save queued message`,cancel:`Cancel editing`,dispatched:`That queued message was already sent — your text is kept as a draft`,saveFailed:`Couldn't save the queued message`},S={branch:`Branch`,detached:`(detached)`,dirty:`Uncommitted changes`,switched:`Switched to {{branch}}`,switchFailed:`Couldn't switch branch`,lockedWhileWorking:`Branch locked while the agent works`,searchPlaceholder:`Search branches…`,noMatches:`No branches match`,worktrees:`Worktrees`,worktreePathCopied:`Worktree path copied`,copyWorktreePath:`Copy worktree path`},C={label:`Provider`,claude:`Claude`,codex:`Codex`,gemini:`Gemini`},w={cycleHint:`⇧⇥ to change`,observe:{name:`Observe`,desc:`Read only — nothing changes`},edit:{name:`Edit`,desc:`Create and edit (reversible)`},operate:{name:`Operate`,desc:`Launch AI — costs money`},autonomous:{name:`Autonomous`,desc:`Delete and kill — irreversible`},lockedTitle:`Needs a higher level`,lockedBody:`That action needs the "{{level}}" level. You're on "{{current}}".`,raiseHint:`⇧⇥ to raise the level, or ask another way.`},T={title:`Confirm action`,costAction:`{{action}} · ~{{cost}} · {{tier}}`,approve:`Approve`,cancel:`Cancel`,dontAskAgain:`Don't ask again this session`,approved:`Approved`,cancelled:`Cancelled`},E={home:`Home`,searchPlaceholder:`Talk to Specrails…`,recents:`Recents`,allProjects:`All projects`,searchAll:`Search across all projects`,addProject:`Add project…`,homeHint:`No project selected — operating across all projects.`,askCreateOrSearch:`No project is selected. Do you want to create a new project, or search across all projects?`},D={label:`Switch mission`,untitled:`New mission`,new:`New mission`,searchPlaceholder:`Search missions…`,noMatches:`No missions match`,working:`Agent working`,queuedBadge:`{{n}} queued`,delete:`Delete mission "{{title}}"`,deleteConfirm:`Delete?`,deleteLiveConfirm:`Agent is working — delete anyway?`,confirmDelete:`Confirm delete`,cancelDelete:`Keep mission`,deleteFailed:`Couldn't delete the mission`},O={title:`No AI provider installed`,body:`The agent needs Claude, Codex or Gemini on your machine. Install one, then reopen the agent to start chatting.`,placeholder:`Install an AI provider to use the agent…`},k={title:`Specrails MCP is off`,body:`The agent needs the embedded MCP server to operate the app.`,enable:`Enable Specrails MCP`,enabling:`Enabling…`,enabled:`MCP enabled`},A={live:`live`,queued:`queued`,running:`running`,done:`done`,failed:`failed`},j={generic:`Something went wrong. Try again.`,busy:`The agent is busy. Try again in a moment.`},M={kindAgent:`Agent mission`},N=`New Mission`,P=`Switch to Mission Control`,F=`Switch to Board`,I=`Search`,L=`Home`,R=`Favorite missions`,z=`Untitled`,B={title:`On workspace`,terminal:`Terminal`,files:`Files`,browser:`Browser`,requiresProject:`Select a project to use this tool`,resizeCode:`Resize code pane`,closeFiles:`Close code`,browserConfirm:`Add to agent`,browserCaptured:`Capture added`,uploadFailed:`Upload failed`,requiresConversation:`Start a mission to use this tool`,jobs:`Jobs`,closeJobs:`Close jobs`,resizeJobs:`Resize jobs pane`,noJobs:`No jobs yet — ask the agent to launch one`},V=`Attach file`,H=`Delete "{{title}}"`,U=`Confirm delete "{{title}}"`,W=`Add "{{title}}" to favorites`,G=`Remove "{{title}}" from favorites`,K=`confirm?`,q=`This provider can't read images yet — attach text files instead`,J={label:`Effort`,minimal:`Minimal`,low:`Low`,medium:`Medium`,high:`High`,xhigh:`Extra high`},Y=`What's the mission, Neo?`,X={rail:`Rail {{index}}`,specCount_one:`{{count}} spec`,specCount_other:`{{count}} specs`,base:`Base branch`,openPr:`Open PR`,existingPr:`Existing PR`,title:{building:`Implementing in an isolated worktree…`,buildingExistingPr:`Applying changes to an existing PR…`,on_review:`Implementation ready for review`,pr_draft:`Draft PR created`,pr_draft_degraded:`PR delivery incomplete`,pr_ready:`PR ready for merge`,pr_failed:`PR creation failed`,merged:`PR merged`,discarded:`Discarded`},buildingHint:`You'll be asked to create the PR when it settles.`,buildingExistingPrHint:`Specrails is working on the existing PR branch and will push the review changes back to that PR.`,createPr:`Create PR`,publish:`Publish`,retry:`Retry`,retryPr:`Retry PR`,checkMerge:`Check merge`,discard:`Discard`,confirmDiscard:`Confirm discard?`,mergedNote:`Merged — specs moved to Done`,discardedNote:`Discarded — specs returned to the backlog`,degraded:{pushed:`The branch was pushed but the PR could not be created — retry to finish.`,localOnly:`The changes were assembled locally but not pushed — retry to publish the PR.`},alreadyResolved:`Already resolved elsewhere`,actionFailed:`Action failed`,notMergedYet:`Not merged yet`,viewLog:`View run log for {{ref}}`,runElapsedAria:`{{elapsed}} elapsed`,runCostAria:`{{cost}} spent`,pinned:{label:`Pinned`,marker:`Implementation card — pinned above`,collapse:`Minimize pinned card`,expand:`Expand pinned card`,expandCard:`Expand this card`,collapseCard:`Minimize this card`,collapsed_one:`Implementation card`,collapsed_other:`{{count}} implementation cards`,state:{building:`Building`,on_review:`Review`,pr_draft:`Draft PR`,pr_ready:`Published`,pr_failed:`Failed`,merged:`Merged`,discarded:`Discarded`}},mergeLocal:`Integrate locally`,mergeLocalTooltip:`Merge the delivered branches into {{base}} in your local checkout (no GitHub needed)`,mergeLocalBlockedDirty:`Cannot integrate: your working tree on {{base}} has uncommitted changes. Commit or stash them, then retry.`,mergeLocalBlockedBranch:`Cannot integrate: your checkout is on {{current}}, not {{base}}. Check out {{base}}, then retry.`,mergedLocally:`Integrated into {{base}} locally`},Z={heading:`Spec draft`,drafting:`Updating draft…`,acceptanceCriteria:`Acceptance criteria`,untitled:`Untitled spec`,expand:`Show full description`,collapse:`Collapse description`},Q={openTicket:`Open spec #{{id}}`,openPullRequest:`Open PR #{{id}}`,openJob:`Open job {{id}}`,openLoop:`Open loop {{id}}`,ticketNotFound:`Spec #{{id}} not found — it may have been deleted`,pullRequestUrlMissing:`PR #{{id}} was referenced without a URL`,pullRequestNotFound:`PR #{{id}} could not be found in this project`,jobNotFound:`Job not found — it may have been deleted`,loopNotFound:`Loop not found — it may have been deleted`,lookupFailed:`Couldn't verify the reference — try again`},$={untitled:`Untitled mission`,menu:`Mission menu`,rename:`Rename`,renamePlaceholder:`Mission name`,renameHint:`Double-click to rename`,renameFailed:`Could not rename`,addFavorite:`Add to favorites`,removeFavorite:`Remove from favorites`,copyName:`Copy mission name`,copyId:`Copy mission ID`,copyProject:`Copy project name`,copyProjectPath:`Copy project path`,copyFailed:`Couldn't copy`,delete:`Delete mission`,deleteConfirm:`Delete this mission? This cannot be undone.`,deleteFailed:`Could not delete the mission`},ne={title:e,subtitle:t,trigger:n,composerPlaceholder:r,send:i,stop:a,copy:o,maximize:s,restore:c,minimize:l,close:u,newConversation:d,emptyTitle:f,emptyHint:p,thinking:m,connecting:h,consultingCode:g,size:_,model:v,history:y,queue:b,queueEdit:x,git:S,provider:C,tier:w,approval:T,project:E,mission:D,noProvider:O,degraded:k,toolCard:A,error:j,chip:M,newAgent:N,switchToAgent:P,switchToKanban:F,search:I,home:L,favoriteMissions:R,untitled:z,workspace:B,attachFile:V,deleteConversation:H,confirmDeleteConversation:U,addFavoriteConversation:W,removeFavoriteConversation:G,confirmShort:K,imagesUnsupported:q,effort:J,emptyTitleMatrix:Y,prCard:X,specDraft:Z,refs:Q,header:$};export{te as t};
@@ -1 +0,0 @@
1
- var e=`Contrôle des missions`,t=`Pilotez Specrails en discutant`,n=`Contrôle des missions`,r=`Demandez à l'agent ce que vous voulez…`,i=`Envoyer`,a=`Arrêter`,o=`Copier`,s=`Agrandir`,c=`Restaurer`,l=`Réduire`,u=`Fermer`,d=`Nouvelle mission`,f=`Quelle est la mission ?`,p=`Choisissez un projet, puis demandez. Le tableau se met à jour en direct pendant que l'agent travaille.`,m=`Réflexion…`,h=`Connexion…`,g=`Consultation de l'app…`,_={compact:`Compact`,comfortable:`Confortable`,max:`Agrandir`},v={label:`Modèle`},y={hint:`Parcours de l'historique — tapez pour modifier, ↑↓ pour naviguer`},b={queued:`En file`,send:`Envoyer dans la file`,sendHint:`L'agent travaille encore — ce message sera mis en file puis traité`,placeholder:`Ajoutez-en pendant que l'agent travaille — mis en file…`},x={editing:`Modification du message en file {{n}} sur {{m}}`,hint:`↑↓ pour naviguer · Entrée enregistre · Échap annule`,save:`Enregistrer le message en file`,cancel:`Annuler la modification`,dispatched:`Ce message en file a déjà été envoyé — votre texte est conservé comme brouillon`,saveFailed:`Impossible d'enregistrer le message en file`},S={branch:`Branche`,detached:`(détaché)`,dirty:`Modifications non commitées`,switched:`Basculé sur {{branch}}`,switchFailed:`Impossible de changer de branche`,lockedWhileWorking:`Branche verrouillée pendant que l'agent travaille`,searchPlaceholder:`Rechercher des branches…`,noMatches:`Aucune branche ne correspond`,worktrees:`Worktrees`,worktreePathCopied:`Chemin du worktree copié`,copyWorktreePath:`Copier le chemin du worktree`},C={label:`Fournisseur`,claude:`Claude`,codex:`Codex`,gemini:`Gemini`},w={cycleHint:`⇧⇥ pour changer`,observe:{name:`Observer`,desc:`Lecture seule — rien ne change`},edit:{name:`Modifier`,desc:`Créer et modifier (réversible)`},operate:{name:`Opérer`,desc:`Lancer l'IA — c'est payant`},autonomous:{name:`Autonome`,desc:`Supprimer et arrêter — irréversible`},lockedTitle:`Nécessite un niveau supérieur`,lockedBody:`Cette action nécessite le niveau « {{level}} ». Vous êtes sur « {{current}} ».`,raiseHint:`⇧⇥ pour augmenter le niveau, ou demandez autrement.`},T={title:`Confirmer l'action`,costAction:`{{action}} · ~{{cost}} · {{tier}}`,approve:`Approuver`,cancel:`Annuler`,dontAskAgain:`Ne plus demander durant cette session`,approved:`Approuvé`,cancelled:`Annulé`},E={home:`Accueil`,searchPlaceholder:`Parlez à Specrails…`,recents:`Récents`,allProjects:`Tous les projets`,searchAll:`Rechercher dans tous les projets`,addProject:`Ajouter un projet…`,homeHint:`Aucun projet sélectionné — opération sur tous les projets.`,askCreateOrSearch:`Aucun projet n'est sélectionné. Voulez-vous créer un nouveau projet ou rechercher dans tous les projets ?`},D={label:`Changer de mission`,untitled:`Nouvelle mission`,new:`Nouvelle mission`,searchPlaceholder:`Rechercher des missions…`,noMatches:`Aucune mission ne correspond`,working:`L'agent travaille`,queuedBadge:`{{n}} en file`,delete:`Supprimer la mission "{{title}}"`,deleteConfirm:`Supprimer ?`,deleteLiveConfirm:`L'agent travaille — supprimer quand même ?`,confirmDelete:`Confirmer la suppression`,cancelDelete:`Garder la mission`,deleteFailed:`Impossible de supprimer la mission`},O={title:`Aucun fournisseur d'IA installé`,body:`L'agent a besoin de Claude, Codex ou Gemini sur votre machine. Installez-en un, puis rouvrez l'agent pour discuter.`,placeholder:`Installez un fournisseur d'IA pour utiliser l'agent…`},k={title:`Le MCP Specrails est désactivé`,body:`L'agent a besoin du serveur MCP intégré pour piloter l'app.`,enable:`Activer le MCP Specrails`,enabling:`Activation…`,enabled:`MCP activé`},A={live:`en direct`,queued:`en file`,running:`en cours`,done:`terminé`,failed:`échoué`},j={generic:`Une erreur est survenue. Réessayez.`,busy:`L'agent est occupé. Réessayez dans un instant.`},M={kindAgent:`Mission de l'agent`},N=`Nouvelle mission`,P=`Passer au Contrôle des missions`,F=`Passer au tableau`,I=`Rechercher`,L=`Accueil`,R=`Missions favorites`,z=`Sans titre`,B={title:`Espace de travail`,terminal:`Terminal`,files:`Fichiers`,browser:`Navigateur`,requiresProject:`Sélectionnez un projet pour utiliser cet outil`,resizeCode:`Redimensionner le volet de code`,closeFiles:`Fermer le code`,browserConfirm:`Ajouter à l'agent`,browserCaptured:`Capture ajoutée`,uploadFailed:`Échec du téléversement`,requiresConversation:`Lancez une mission pour utiliser cet outil`,jobs:`Jobs`,closeJobs:`Fermer les jobs`,resizeJobs:`Redimensionner le panneau des jobs`,noJobs:`Aucun job pour l'instant — demandez à l'agent d'en lancer un`},V=`Joindre un fichier`,H=`Supprimer «\xA0{{title}}\xA0»`,U=`Confirmer la suppression de «\xA0{{title}}\xA0»`,W=`Ajouter «\xA0{{title}}\xA0» aux favorites`,G=`Retirer «\xA0{{title}}\xA0» des favorites`,K=`confirmer\xA0?`,q=`Ce fournisseur ne lit pas encore les images — joignez plutôt des fichiers texte`,J={label:`Effort`,minimal:`Minimal`,low:`Faible`,medium:`Moyen`,high:`Élevé`,xhigh:`Très élevé`},Y=`Quelle est la mission, Neo ?`,X={rail:`Rail {{index}}`,specCount_one:`{{count}} spec`,specCount_other:`{{count}} specs`,base:`Branche de base`,openPr:`Ouvrir la PR`,existingPr:`PR existante`,title:{building:`Implémentation dans un worktree isolé…`,buildingExistingPr:`Application des changements sur une PR existante…`,on_review:`Implémentation prête pour la revue`,pr_draft:`PR en brouillon créée`,pr_draft_degraded:`Livraison de la PR incomplète`,pr_ready:`PR prête à être fusionnée`,pr_failed:`Échec de la création de la PR`,merged:`PR fusionnée`,discarded:`Abandonnée`},buildingHint:`À la fin, il vous sera proposé de créer la PR.`,buildingExistingPrHint:`Specrails travaille sur la branche de la PR existante et poussera les changements de revue vers cette même PR.`,createPr:`Créer la PR`,publish:`Publier`,retry:`Réessayer`,retryPr:`Réessayer la PR`,checkMerge:`Vérifier le merge`,discard:`Abandonner`,confirmDiscard:`Confirmer l'abandon ?`,mergedNote:`Fusionnée — specs passées en Terminé`,discardedNote:`Abandonnée — specs renvoyées vers le backlog`,degraded:{pushed:`La branche a été poussée mais la PR n'a pas pu être créée — réessayez pour terminer.`,localOnly:`Les modifications ont été assemblées en local mais pas poussées — réessayez pour publier la PR.`},alreadyResolved:`Déjà résolue ailleurs`,actionFailed:`L'action a échoué`,notMergedYet:`Pas encore fusionnée`,viewLog:`Voir le journal d'exécution de {{ref}}`,runElapsedAria:`{{elapsed}} écoulées`,runCostAria:`{{cost}} dépensés`,pinned:{label:`Épinglée`,marker:`Carte d’implémentation — épinglée ci-dessus`,collapse:`Réduire la carte épinglée`,expand:`Déployer la carte épinglée`,expandCard:`Développer cette carte`,collapseCard:`Réduire cette carte`,collapsed_one:`Carte d’implémentation`,collapsed_other:`{{count}} cartes d’implémentation`,state:{building:`En cours`,on_review:`Revue`,pr_draft:`PR brouillon`,pr_ready:`Publiée`,pr_failed:`Échec`,merged:`Fusionnée`,discarded:`Abandonnée`}},mergeLocal:`Intégrer en local`,mergeLocalTooltip:`Fusionne les branches livrées dans {{base}} dans votre checkout local (sans GitHub)`,mergeLocalBlockedDirty:`Impossible d'intégrer : votre arbre de travail sur {{base}} contient des changements non commités. Commitez ou stashez-les, puis réessayez.`,mergeLocalBlockedBranch:`Impossible d'intégrer : votre checkout est sur {{current}}, pas sur {{base}}. Passez sur {{base}}, puis réessayez.`,mergedLocally:`Intégré dans {{base}} en local`},Z={heading:`Brouillon de spec`,drafting:`Mise à jour du brouillon…`,acceptanceCriteria:`Critères d'acceptation`,untitled:`Spec sans titre`,expand:`Afficher la description complète`,collapse:`Réduire la description`},Q={openTicket:`Ouvrir la spec #{{id}}`,openPullRequest:`Ouvrir la PR #{{id}}`,openJob:`Ouvrir le job {{id}}`,openLoop:`Ouvrir la boucle {{id}}`,ticketNotFound:`Spec #{{id}} introuvable — elle a peut-être été supprimée`,pullRequestUrlMissing:`La PR #{{id}} est mentionnée sans URL`,pullRequestNotFound:`PR #{{id}} introuvable dans ce projet`,jobNotFound:`Job introuvable — il a peut-être été supprimé`,loopNotFound:`Boucle introuvable — elle a peut-être été supprimée`,lookupFailed:`Impossible de vérifier la référence — réessayez`},$={untitled:`Mission sans titre`,menu:`Menu de la mission`,rename:`Renommer`,renamePlaceholder:`Nom de la mission`,renameHint:`Double-clic pour renommer`,renameFailed:`Renommage impossible`,addFavorite:`Ajouter aux favorites`,removeFavorite:`Retirer des favorites`,copyName:`Copier le nom de la mission`,copyId:`Copier l'ID de la mission`,copyProject:`Copier le nom du projet`,copyProjectPath:`Copier le chemin du projet`,copyFailed:`Copie impossible`,delete:`Supprimer la mission`,deleteConfirm:`Supprimer cette mission ? Action irréversible.`,deleteFailed:`Impossible de supprimer la mission`},ee={title:e,subtitle:t,trigger:n,composerPlaceholder:r,send:i,stop:a,copy:o,maximize:s,restore:c,minimize:l,close:u,newConversation:d,emptyTitle:f,emptyHint:p,thinking:m,connecting:h,consultingCode:g,size:_,model:v,history:y,queue:b,queueEdit:x,git:S,provider:C,tier:w,approval:T,project:E,mission:D,noProvider:O,degraded:k,toolCard:A,error:j,chip:M,newAgent:N,switchToAgent:P,switchToKanban:F,search:I,home:L,favoriteMissions:R,untitled:z,workspace:B,attachFile:V,deleteConversation:H,confirmDeleteConversation:U,addFavoriteConversation:W,removeFavoriteConversation:G,confirmShort:K,imagesUnsupported:q,effort:J,emptyTitleMatrix:Y,prCard:X,specDraft:Z,refs:Q,header:$};export{W as addFavoriteConversation,T as approval,V as attachFile,M as chip,u as close,r as composerPlaceholder,U as confirmDeleteConversation,K as confirmShort,h as connecting,g as consultingCode,o as copy,ee as default,k as degraded,H as deleteConversation,J as effort,p as emptyHint,f as emptyTitle,Y as emptyTitleMatrix,j as error,R as favoriteMissions,S as git,$ as header,y as history,L as home,q as imagesUnsupported,s as maximize,l as minimize,D as mission,v as model,N as newAgent,d as newConversation,O as noProvider,X as prCard,E as project,C as provider,b as queue,x as queueEdit,Q as refs,G as removeFavoriteConversation,c as restore,I as search,i as send,_ as size,Z as specDraft,a as stop,t as subtitle,P as switchToAgent,F as switchToKanban,m as thinking,w as tier,e as title,A as toolCard,n as trigger,z as untitled,B as workspace};
@@ -1 +0,0 @@
1
- var e=`Controle de missões`,t=`Opere o Specrails conversando`,n=`Controle de missões`,r=`Peça ao agente o que quiser…`,i=`Enviar`,a=`Parar`,o=`Copiar`,s=`Maximizar`,c=`Restaurar`,l=`Minimizar`,u=`Fechar`,d=`Nova missão`,f=`Qual é a missão?`,p=`Escolha um projeto e depois pergunte. O quadro é atualizado ao vivo enquanto o agente trabalha.`,m=`Pensando…`,h=`Conectando…`,g=`Consultando o app…`,_={compact:`Compacto`,comfortable:`Confortável`,max:`Maximizar`},v={label:`Modelo`},y={hint:`Explorando histórico — escreva para editar, ↑↓ para navegar`},b={queued:`Na fila`,send:`Enviar para a fila`,sendHint:`O agente ainda está trabalhando — esta mensagem entrará na fila e será executada em seguida`,placeholder:`Adicione mais enquanto o agente trabalha — entrará na fila…`},x={editing:`Editando mensagem na fila {{n}} de {{m}}`,hint:`↑↓ para navegar · Enter salva · Esc cancela`,save:`Salvar mensagem na fila`,cancel:`Cancelar edição`,dispatched:`Essa mensagem na fila já foi enviada — seu texto foi mantido como rascunho`,saveFailed:`Não foi possível salvar a mensagem na fila`},S={branch:`Branch`,detached:`(detached)`,dirty:`Alterações sem commit`,switched:`Mudou para {{branch}}`,switchFailed:`Não foi possível trocar de branch`,lockedWhileWorking:`Branch bloqueada enquanto o agente trabalha`,searchPlaceholder:`Buscar branches…`,noMatches:`Nenhuma branch corresponde`,worktrees:`Worktrees`,worktreePathCopied:`Caminho do worktree copiado`,copyWorktreePath:`Copiar caminho do worktree`},C={label:`Provedor`,claude:`Claude`,codex:`Codex`,gemini:`Gemini`},w={cycleHint:`⇧⇥ para mudar`,observe:{name:`Observa`,desc:`Somente leitura — nada muda`},edit:{name:`Edita`,desc:`Criar e editar (reversível)`},operate:{name:`Opera`,desc:`Lançar IA — tem custo`},autonomous:{name:`Autônomo`,desc:`Excluir e encerrar — irreversível`},lockedTitle:`Precisa de um nível superior`,lockedBody:`Essa ação precisa do nível "{{level}}". Você está no "{{current}}".`,raiseHint:`⇧⇥ para aumentar o nível, ou peça de outra forma.`},T={title:`Confirmar ação`,costAction:`{{action}} · ~{{cost}} · {{tier}}`,approve:`Aprovar`,cancel:`Cancelar`,dontAskAgain:`Não perguntar de novo nesta sessão`,approved:`Aprovado`,cancelled:`Cancelado`},E={home:`Início`,searchPlaceholder:`Fale com o Specrails…`,recents:`Recentes`,allProjects:`Todos os projetos`,searchAll:`Buscar em todos os projetos`,addProject:`Adicionar projeto…`,homeHint:`Nenhum projeto selecionado — operando em todos os projetos.`,askCreateOrSearch:`Nenhum projeto está selecionado. Você quer criar um novo projeto ou buscar em todos os projetos?`},D={label:`Trocar de missão`,untitled:`Nova missão`,new:`Nova missão`,searchPlaceholder:`Pesquisar missões…`,noMatches:`Nenhuma missão corresponde`,working:`O agente está trabalhando`,queuedBadge:`{{n}} na fila`,delete:`Excluir missão "{{title}}"`,deleteConfirm:`Excluir?`,deleteLiveConfirm:`O agente está trabalhando — excluir mesmo assim?`,confirmDelete:`Confirmar exclusão`,cancelDelete:`Manter missão`,deleteFailed:`Não foi possível excluir a missão`},O={title:`Nenhum provedor de IA instalado`,body:`O agente precisa de Claude, Codex ou Gemini na sua máquina. Instale um e reabra o agente para começar a conversar.`,placeholder:`Instale um provedor de IA para usar o agente…`},k={title:`O MCP do Specrails está desligado`,body:`O agente precisa do servidor MCP integrado para operar o app.`,enable:`Ativar o MCP do Specrails`,enabling:`Ativando…`,enabled:`MCP ativado`},A={live:`ao vivo`,queued:`na fila`,running:`em execução`,done:`concluído`,failed:`falhou`},j={generic:`Algo deu errado. Tente novamente.`,busy:`O agente está ocupado. Tente novamente em um instante.`},M={kindAgent:`Missão do agente`},N=`Nova missão`,P=`Mudar para o Controle de missões`,F=`Mudar para o quadro`,I=`Buscar`,L=`Início`,R=`Missões favoritas`,z=`Sem título`,B={title:`No workspace`,terminal:`Terminal`,files:`Arquivos`,browser:`Navegador`,requiresProject:`Selecione um projeto para usar esta ferramenta`,resizeCode:`Redimensionar painel de código`,closeFiles:`Fechar código`,browserConfirm:`Adicionar ao agente`,browserCaptured:`Captura adicionada`,uploadFailed:`Falha no upload`,requiresConversation:`Inicie uma missão para usar esta ferramenta`,jobs:`Jobs`,closeJobs:`Fechar jobs`,resizeJobs:`Redimensionar painel de jobs`,noJobs:`Ainda não há jobs — peça ao agente para lançar um`},V=`Anexar arquivo`,H=`Excluir "{{title}}"`,U=`Confirmar exclusão de "{{title}}"`,W=`Adicionar "{{title}}" aos favoritos`,G=`Remover "{{title}}" dos favoritos`,K=`confirmar?`,q=`Este provedor ainda não lê imagens — anexe arquivos de texto`,J={label:`Esforço`,minimal:`Mínimo`,low:`Baixo`,medium:`Médio`,high:`Alto`,xhigh:`Extra alto`},Y=`Qual é a missão, Neo?`,X={rail:`Rail {{index}}`,specCount_one:`{{count}} spec`,specCount_other:`{{count}} specs`,base:`Ramo base`,openPr:`Abrir PR`,existingPr:`PR existente`,title:{building:`A implementar num worktree isolado…`,buildingExistingPr:`A aplicar alterações numa PR existente…`,on_review:`Implementação pronta para revisão`,pr_draft:`PR em rascunho criada`,pr_draft_degraded:`Entrega da PR incompleta`,pr_ready:`PR pronta para merge`,pr_failed:`Falha ao criar a PR`,merged:`Merge da PR concluído`,discarded:`Descartada`},buildingHint:`Quando terminar, ser-lhe-á perguntado se quer criar a PR.`,buildingExistingPrHint:`O Specrails está a trabalhar no ramo da PR existente e irá enviar as alterações de revisão para essa mesma PR.`,createPr:`Criar PR`,publish:`Publicar`,retry:`Tentar novamente`,retryPr:`Tentar PR novamente`,checkMerge:`Verificar merge`,discard:`Descartar`,confirmDiscard:`Confirmar descarte?`,mergedNote:`Merge concluído — specs movidas para Concluído`,discardedNote:`Descartada — specs devolvidas ao backlog`,degraded:{pushed:`O ramo foi enviado mas não foi possível criar a PR — tente novamente para concluir.`,localOnly:`As alterações foram montadas localmente mas não enviadas — tente novamente para publicar a PR.`},alreadyResolved:`Já resolvida noutro lugar`,actionFailed:`A ação falhou`,notMergedYet:`Ainda sem merge`,viewLog:`Ver o registro de execução de {{ref}}`,runElapsedAria:`{{elapsed}} decorridos`,runCostAria:`{{cost}} gastos`,pinned:{label:`Fixada`,marker:`Cartão de implementação — fixado acima`,collapse:`Minimizar cartão fixado`,expand:`Expandir cartão fixado`,expandCard:`Expandir este cartão`,collapseCard:`Minimizar este cartão`,collapsed_one:`Cartão de implementação`,collapsed_other:`{{count}} cartões de implementação`,state:{building:`Em curso`,on_review:`Revisão`,pr_draft:`PR rascunho`,pr_ready:`Publicada`,pr_failed:`Falhou`,merged:`Integrada`,discarded:`Descartada`}},mergeLocal:`Integrar localmente`,mergeLocalTooltip:`Faz merge dos branches entregues em {{base}} no seu checkout local (sem GitHub)`,mergeLocalBlockedDirty:`Não é possível integrar: sua árvore de trabalho em {{base}} tem mudanças sem commit. Faça commit ou stash e tente de novo.`,mergeLocalBlockedBranch:`Não é possível integrar: seu checkout está em {{current}}, não em {{base}}. Mude para {{base}} e tente de novo.`,mergedLocally:`Integrado em {{base}} localmente`},Z={heading:`Rascunho da spec`,drafting:`Atualizando rascunho…`,acceptanceCriteria:`Critérios de aceitação`,untitled:`Spec sem título`,expand:`Ver descrição completa`,collapse:`Recolher descrição`},Q={openTicket:`Abrir spec #{{id}}`,openPullRequest:`Abrir PR #{{id}}`,openJob:`Abrir job {{id}}`,openLoop:`Abrir loop {{id}}`,ticketNotFound:`Spec #{{id}} não encontrada — pode ter sido excluída`,pullRequestUrlMissing:`A PR #{{id}} foi mencionada sem URL`,pullRequestNotFound:`A PR #{{id}} não foi encontrada neste projeto`,jobNotFound:`Job não encontrado — pode ter sido excluído`,loopNotFound:`Loop não encontrado — pode ter sido excluído`,lookupFailed:`Não foi possível verificar a referência — tente novamente`},$={untitled:`Missão sem título`,menu:`Menu da missão`,rename:`Renomear`,renamePlaceholder:`Nome da missão`,renameHint:`Duplo clique para renomear`,renameFailed:`Não foi possível renomear`,addFavorite:`Adicionar aos favoritos`,removeFavorite:`Remover dos favoritos`,copyName:`Copiar nome da missão`,copyId:`Copiar ID da missão`,copyProject:`Copiar nome do projeto`,copyProjectPath:`Copiar caminho do projeto`,copyFailed:`Não foi possível copiar`,delete:`Excluir missão`,deleteConfirm:`Excluir esta missão? Não pode ser desfeito.`,deleteFailed:`Não foi possível excluir a missão`},ee={title:e,subtitle:t,trigger:n,composerPlaceholder:r,send:i,stop:a,copy:o,maximize:s,restore:c,minimize:l,close:u,newConversation:d,emptyTitle:f,emptyHint:p,thinking:m,connecting:h,consultingCode:g,size:_,model:v,history:y,queue:b,queueEdit:x,git:S,provider:C,tier:w,approval:T,project:E,mission:D,noProvider:O,degraded:k,toolCard:A,error:j,chip:M,newAgent:N,switchToAgent:P,switchToKanban:F,search:I,home:L,favoriteMissions:R,untitled:z,workspace:B,attachFile:V,deleteConversation:H,confirmDeleteConversation:U,addFavoriteConversation:W,removeFavoriteConversation:G,confirmShort:K,imagesUnsupported:q,effort:J,emptyTitleMatrix:Y,prCard:X,specDraft:Z,refs:Q,header:$};export{W as addFavoriteConversation,T as approval,V as attachFile,M as chip,u as close,r as composerPlaceholder,U as confirmDeleteConversation,K as confirmShort,h as connecting,g as consultingCode,o as copy,ee as default,k as degraded,H as deleteConversation,J as effort,p as emptyHint,f as emptyTitle,Y as emptyTitleMatrix,j as error,R as favoriteMissions,S as git,$ as header,y as history,L as home,q as imagesUnsupported,s as maximize,l as minimize,D as mission,v as model,N as newAgent,d as newConversation,O as noProvider,X as prCard,E as project,C as provider,b as queue,x as queueEdit,Q as refs,G as removeFavoriteConversation,c as restore,I as search,i as send,_ as size,Z as specDraft,a as stop,t as subtitle,P as switchToAgent,F as switchToKanban,m as thinking,w as tier,e as title,A as toolCard,n as trigger,z as untitled,B as workspace};
@@ -1 +0,0 @@
1
- var e=`ミッションセンター`,t=`チャットで Specrails を操作`,n=`ミッションセンター`,r=`エージェントに何でも頼んでください…`,i=`送信`,a=`停止`,o=`コピー`,s=`最大化`,c=`元に戻す`,l=`最小化`,u=`閉じる`,d=`新しいミッション`,f=`ミッションは何ですか?`,p=`プロジェクトを選んでから尋ねてください。エージェントの作業中、ボードはリアルタイムで更新されます。`,m=`考え中…`,h=`接続中…`,g=`アプリを確認中…`,_={compact:`コンパクト`,comfortable:`快適`,max:`最大化`},v={label:`モデル`},y={hint:`プロンプト履歴を表示中 — 入力で編集、↑↓ で移動`},b={queued:`待機中`,send:`キューに送信`,sendHint:`エージェントは作業中です — このメッセージはキューに入り、次に実行されます`,placeholder:`エージェントの作業中に追加できます — キューに入ります…`},x={editing:`キュー内メッセージを編集中({{m}} 件中 {{n}} 件目)`,hint:`↑↓ で移動 · Enter で保存 · Esc でキャンセル`,save:`キュー内メッセージを保存`,cancel:`編集をキャンセル`,dispatched:`そのキュー内メッセージは既に送信されました — 入力したテキストは下書きとして保持されます`,saveFailed:`キュー内メッセージを保存できませんでした`},S={branch:`ブランチ`,detached:`(detached)`,dirty:`未コミットの変更あり`,switched:`{{branch}} に切り替えました`,switchFailed:`ブランチを切り替えられませんでした`,lockedWhileWorking:`エージェントの作業中はブランチをロックしています`,searchPlaceholder:`ブランチを検索…`,noMatches:`一致するブランチがありません`,worktrees:`ワークツリー`,worktreePathCopied:`ワークツリーのパスをコピーしました`,copyWorktreePath:`ワークツリーのパスをコピー`},C={label:`プロバイダー`,claude:`Claude`,codex:`Codex`,gemini:`Gemini`},w={cycleHint:`⇧⇥ で変更`,observe:{name:`観察`,desc:`読み取り専用 — 何も変更しません`},edit:{name:`編集`,desc:`作成と編集(取り消し可能)`},operate:{name:`操作`,desc:`AI を起動 — 費用がかかります`},autonomous:{name:`自律`,desc:`削除と停止 — 取り消し不可`},lockedTitle:`より高いレベルが必要です`,lockedBody:`その操作には「{{level}}」レベルが必要です。現在は「{{current}}」です。`,raiseHint:`⇧⇥ でレベルを上げるか、別の方法で尋ねてください。`},T={title:`操作を確認`,costAction:`{{action}} · ~{{cost}} · {{tier}}`,approve:`承認`,cancel:`キャンセル`,dontAskAgain:`このセッションでは今後確認しない`,approved:`承認しました`,cancelled:`キャンセルしました`},E={home:`ホーム`,searchPlaceholder:`Specrails に話しかける…`,recents:`最近`,allProjects:`すべてのプロジェクト`,searchAll:`すべてのプロジェクトを検索`,addProject:`プロジェクトを追加…`,homeHint:`プロジェクトが未選択 — すべてのプロジェクトを横断して操作中。`,askCreateOrSearch:`プロジェクトが選択されていません。新しいプロジェクトを作成しますか、それともすべてのプロジェクトを検索しますか?`},D={label:`ミッションを切り替え`,untitled:`新しいミッション`,new:`新しいミッション`,searchPlaceholder:`ミッションを検索…`,noMatches:`一致するミッションがありません`,working:`エージェントが作業中`,queuedBadge:`{{n}} 件キュー中`,delete:`ミッション "{{title}}" を削除`,deleteConfirm:`削除しますか?`,deleteLiveConfirm:`エージェントが作業中です — それでも削除しますか?`,confirmDelete:`削除を確定`,cancelDelete:`ミッションを残す`,deleteFailed:`ミッションを削除できませんでした`},O={title:`AIプロバイダーが未インストール`,body:`エージェントには Claude、Codex、Gemini のいずれかが必要です。インストールしてからエージェントを再度開いてください。`,placeholder:`AIプロバイダーをインストールしてエージェントを利用…`},k={title:`Specrails MCP がオフです`,body:`エージェントがアプリを操作するには、組み込みの MCP サーバーが必要です。`,enable:`Specrails MCP を有効化`,enabling:`有効化中…`,enabled:`MCP を有効化しました`},A={live:`ライブ`,queued:`待機中`,running:`実行中`,done:`完了`,failed:`失敗`},j={generic:`問題が発生しました。もう一度お試しください。`,busy:`エージェントは処理中です。しばらくしてからお試しください。`},M={kindAgent:`エージェントのミッション`},N=`新しいミッション`,P=`ミッションセンターに切り替え`,F=`ボードに切り替え`,I=`検索`,L=`ホーム`,R=`お気に入りミッション`,z=`無題`,B={title:`ワークスペース`,terminal:`ターミナル`,files:`ファイル`,browser:`ブラウザ`,requiresProject:`このツールを使うにはプロジェクトを選択してください`,resizeCode:`コードペインをリサイズ`,closeFiles:`コードを閉じる`,browserConfirm:`エージェントに追加`,browserCaptured:`キャプチャを追加しました`,uploadFailed:`アップロードに失敗しました`,requiresConversation:`このツールを使うにはミッションを開始してください`,jobs:`ジョブ`,closeJobs:`ジョブを閉じる`,resizeJobs:`ジョブパネルのサイズ変更`,noJobs:`まだジョブがありません — エージェントに実行を頼んでみましょう`},V=`ファイルを添付`,H=`「{{title}}」を削除`,U=`「{{title}}」の削除を確認`,W=`「{{title}}」をお気に入りに追加`,G=`「{{title}}」をお気に入りから削除`,K=`削除しますか?`,q=`このプロバイダーはまだ画像を読み取れません — テキストファイルを添付してください`,J={label:`エフォート`,minimal:`最小`,low:`低`,medium:`中`,high:`高`,xhigh:`最高`},Y=`ミッションは何ですか、ネオ?`,X={rail:`レール {{index}}`,specCount_one:`スペック {{count}} 件`,specCount_other:`スペック {{count}} 件`,base:`ベースブランチ`,openPr:`PR を開く`,existingPr:`既存の PR`,title:{building:`分離されたワークツリーで実装中…`,buildingExistingPr:`既存の PR に変更を適用中…`,on_review:`実装のレビュー準備完了`,pr_draft:`ドラフト PR を作成しました`,pr_draft_degraded:`PR の公開が未完了`,pr_ready:`PR のマージ準備完了`,pr_failed:`PR の作成に失敗しました`,merged:`PR がマージされました`,discarded:`破棄済み`},buildingHint:`完了すると PR を作成するか確認します。`,buildingExistingPrHint:`Specrails は既存 PR のブランチで作業しており、レビュー変更を同じ PR に push します。`,createPr:`PR を作成`,publish:`公開`,retry:`再試行`,retryPr:`PR を再試行`,checkMerge:`マージを確認`,discard:`破棄`,confirmDiscard:`破棄しますか?`,mergedNote:`マージ済み — スペックは完了に移動しました`,discardedNote:`破棄済み — スペックはバックログに戻されました`,degraded:{pushed:`ブランチはプッシュされましたが、PR を作成できませんでした — 再試行して完了してください。`,localOnly:`変更はローカルで組み立てられましたが、プッシュされていません — 再試行して PR を公開してください。`},alreadyResolved:`すでに他の場所で解決済み`,actionFailed:`操作に失敗しました`,notMergedYet:`まだマージされていません`,viewLog:`{{ref}} の実行ログを表示`,runElapsedAria:`経過時間 {{elapsed}}`,runCostAria:`消費コスト {{cost}}`,pinned:{label:`ピン留め`,marker:`実装カード — 上部にピン留め中`,collapse:`ピン留めカードを最小化`,expand:`ピン留めカードを展開`,expandCard:`このカードを展開`,collapseCard:`このカードを最小化`,collapsed_one:`実装カード`,collapsed_other:`{{count}} 件の実装カード`,state:{building:`実装中`,on_review:`レビュー`,pr_draft:`ドラフト PR`,pr_ready:`公開済み`,pr_failed:`失敗`,merged:`マージ済み`,discarded:`破棄済み`}},mergeLocal:`ローカルに統合`,mergeLocalTooltip:`配信されたブランチをローカルチェックアウトの {{base}} にマージします(GitHub 不要)`,mergeLocalBlockedDirty:`統合できません:{{base}} のワークツリーに未コミットの変更があります。コミットまたはスタッシュして再試行してください。`,mergeLocalBlockedBranch:`統合できません:チェックアウトは {{current}} で、{{base}} ではありません。{{base}} に切り替えて再試行してください。`,mergedLocally:`ローカルで {{base}} に統合しました`},Z={heading:`スペック下書き`,drafting:`下書きを更新中…`,acceptanceCriteria:`受け入れ基準`,untitled:`無題のスペック`,expand:`説明をすべて表示`,collapse:`説明を折りたたむ`},Q={openTicket:`スペック #{{id}} を開く`,openPullRequest:`PR #{{id}} を開く`,openJob:`ジョブ {{id}} を開く`,openLoop:`ループ {{id}} を開く`,ticketNotFound:`スペック #{{id}} が見つかりません — 削除された可能性があります`,pullRequestUrlMissing:`PR #{{id}} は URL なしで参照されました`,pullRequestNotFound:`このプロジェクトで PR #{{id}} が見つかりません`,jobNotFound:`ジョブが見つかりません — 削除された可能性があります`,loopNotFound:`ループが見つかりません — 削除された可能性があります`,lookupFailed:`参照を確認できませんでした — もう一度お試しください`},$={untitled:`無題のミッション`,menu:`ミッションメニュー`,rename:`名前を変更`,renamePlaceholder:`ミッション名`,renameHint:`ダブルクリックで名前を変更`,renameFailed:`名前を変更できませんでした`,addFavorite:`お気に入りに追加`,removeFavorite:`お気に入りから削除`,copyName:`ミッション名をコピー`,copyId:`ミッション ID をコピー`,copyProject:`プロジェクト名をコピー`,copyProjectPath:`プロジェクトパスをコピー`,copyFailed:`コピーできませんでした`,delete:`ミッションを削除`,deleteConfirm:`このミッションを削除しますか?元に戻せません。`,deleteFailed:`ミッションを削除できませんでした`},ee={title:e,subtitle:t,trigger:n,composerPlaceholder:r,send:i,stop:a,copy:o,maximize:s,restore:c,minimize:l,close:u,newConversation:d,emptyTitle:f,emptyHint:p,thinking:m,connecting:h,consultingCode:g,size:_,model:v,history:y,queue:b,queueEdit:x,git:S,provider:C,tier:w,approval:T,project:E,mission:D,noProvider:O,degraded:k,toolCard:A,error:j,chip:M,newAgent:N,switchToAgent:P,switchToKanban:F,search:I,home:L,favoriteMissions:R,untitled:z,workspace:B,attachFile:V,deleteConversation:H,confirmDeleteConversation:U,addFavoriteConversation:W,removeFavoriteConversation:G,confirmShort:K,imagesUnsupported:q,effort:J,emptyTitleMatrix:Y,prCard:X,specDraft:Z,refs:Q,header:$};export{W as addFavoriteConversation,T as approval,V as attachFile,M as chip,u as close,r as composerPlaceholder,U as confirmDeleteConversation,K as confirmShort,h as connecting,g as consultingCode,o as copy,ee as default,k as degraded,H as deleteConversation,J as effort,p as emptyHint,f as emptyTitle,Y as emptyTitleMatrix,j as error,R as favoriteMissions,S as git,$ as header,y as history,L as home,q as imagesUnsupported,s as maximize,l as minimize,D as mission,v as model,N as newAgent,d as newConversation,O as noProvider,X as prCard,E as project,C as provider,b as queue,x as queueEdit,Q as refs,G as removeFavoriteConversation,c as restore,I as search,i as send,_ as size,Z as specDraft,a as stop,t as subtitle,P as switchToAgent,F as switchToKanban,m as thinking,w as tier,e as title,A as toolCard,n as trigger,z as untitled,B as workspace};