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.
- package/client/dist/assets/{ActivityFeedPage-BGRTOOhT.js → ActivityFeedPage-C1LftFSE.js} +1 -1
- package/client/dist/assets/{AgentBrowserCapture-DvDLxsUy.js → AgentBrowserCapture-B5prW-V0.js} +1 -1
- package/client/dist/assets/{AgentModeCodePane-DfwctjzN.js → AgentModeCodePane-b6UmdjwB.js} +2 -2
- package/client/dist/assets/{AgentModeJobsPane-G3WrS-sE.js → AgentModeJobsPane-DW3Wj5oi.js} +1 -1
- package/client/dist/assets/{AgentsPage-DGFFijMC.js → AgentsPage-DBMnhdlq.js} +3 -3
- package/client/dist/assets/{AnalyticsPage-hoJmlEpk.js → AnalyticsPage-DjFf1OxU.js} +1 -1
- package/client/dist/assets/{BarChart-BEhAXVK-.js → BarChart-nmDbbUiR.js} +1 -1
- package/client/dist/assets/{CodePage-B4zB9DVC.js → CodePage-DHd46Sm7.js} +1 -1
- package/client/dist/assets/{DesktopAnalyticsPage-CBX-Qpxd.js → DesktopAnalyticsPage-ee0bpk-F.js} +1 -1
- package/client/dist/assets/{DocsDialog-lTsnNdAM.js → DocsDialog-CGUzB1zX.js} +1 -1
- package/client/dist/assets/{DocsPage-CkvdGroT.js → DocsPage-96iws84I.js} +1 -1
- package/client/dist/assets/{ExportDropdown-Da98gR-P.js → ExportDropdown-Dzk2Lkxw.js} +1 -1
- package/client/dist/assets/{IntegrationsPage-Cf9o4eZq.js → IntegrationsPage-Bta2lAhq.js} +1 -1
- package/client/dist/assets/{InteractiveJobComposer-C8N-Bbnn.js → InteractiveJobComposer-B9S_ZGJS.js} +5 -5
- package/client/dist/assets/{JobDetailModal-BZVwIIEx.js → JobDetailModal-DhrwU2z0.js} +1 -1
- package/client/dist/assets/{JobDetailPage-CQewQ1zy.js → JobDetailPage-BnhoXkql.js} +1 -1
- package/client/dist/assets/{JobsPage-CB4wOxmE.js → JobsPage-BBT9fyhg.js} +1 -1
- package/client/dist/assets/{LoopBuilderPage-B9Y5gt08.js → LoopBuilderPage-5ucN9Hq9.js} +2 -2
- package/client/dist/assets/{LoopPreviewModal-kxQ5kV1t.js → LoopPreviewModal-wKAts-Wf.js} +1 -1
- package/client/dist/assets/{LoopsPage-RysW-6sC.js → LoopsPage-COyxf6Pa.js} +1 -1
- package/client/dist/assets/{ProjectSettingsDialog-BHN5qsGT.js → ProjectSettingsDialog-CcToBI-Z.js} +1 -1
- package/client/dist/assets/{TemplatePreviewModal-DW6lZCIs.js → TemplatePreviewModal-_Dy6ceXg.js} +1 -1
- package/client/dist/assets/agent-BmH52J4j.js +1 -0
- package/client/dist/assets/agent-Bxb9RRNW.js +1 -0
- package/client/dist/assets/agent-Cg49-TGZ.js +1 -0
- package/client/dist/assets/agent-DgDtg-0Y2.js +1 -0
- package/client/dist/assets/agent-DolxzTol.js +1 -0
- package/client/dist/assets/agent-DwDR2Exf2.js +1 -0
- package/client/dist/assets/agent-_tfCgFUk.js +1 -0
- package/client/dist/assets/agent-gFi-qvxO2.js +1 -0
- package/client/dist/assets/{brain-B9dkGuAN.js → brain-BJ2Gd98j.js} +1 -1
- package/client/dist/assets/code-CwnBPPyA.js +1 -0
- package/client/dist/assets/dashboard-90r0QcUc2.js +1 -0
- package/client/dist/assets/dashboard-B0C6mJP-.js +1 -0
- package/client/dist/assets/dashboard-BOx0FR1L2.js +1 -0
- package/client/dist/assets/dashboard-BcjUOLJr.js +1 -0
- package/client/dist/assets/dashboard-C27kNpjn.js +1 -0
- package/client/dist/assets/dashboard-DJAj2EbH.js +1 -0
- package/client/dist/assets/dashboard-DNd1Gobs.js +1 -0
- package/client/dist/assets/dashboard-DZWrDAYm2.js +1 -0
- package/client/dist/assets/{dist-js-Bbd7Wzdw.js → dist-js-CXAsO0Z8.js} +1 -1
- package/client/dist/assets/{dist-js-BW5-IZTP.js → dist-js-D7smLA35.js} +1 -1
- package/client/dist/assets/index-B3ejvKSt.js +156 -0
- package/client/dist/assets/index-C695aPdV.css +2 -0
- package/client/dist/assets/{lib-EIkIPf26.js → lib-BIHmUkcn.js} +1 -1
- package/client/dist/assets/{loops-YYV2bwjd.js → loops-Brnx4Fji.js} +1 -1
- package/client/dist/assets/{loops-hXgncEpF2.js → loops-BvqQ-bHR2.js} +1 -1
- package/client/dist/assets/{loops-BvEenWBy.js → loops-CvOWsi5r.js} +1 -1
- package/client/dist/assets/{loops-DjOtVXRo.js → loops-D6D3XHjj.js} +1 -1
- package/client/dist/assets/{loops-HTHf-xu32.js → loops-DJNhp17p2.js} +1 -1
- package/client/dist/assets/{loops-kYbydDyN.js → loops-K5_HXfJa.js} +1 -1
- package/client/dist/assets/loops-LIgO_-eM.js +1 -0
- package/client/dist/assets/{loops-DNGiYKll2.js → loops-vhJdbcz92.js} +1 -1
- package/client/dist/assets/{settings-BsJMsWGc.js → settings-BHdPchJP.js} +1 -1
- package/client/dist/assets/{settings-lFoaYT-s2.js → settings-BeCczBFS2.js} +1 -1
- package/client/dist/assets/{settings-DZJeXoRV.js → settings-BlLi719f.js} +1 -1
- package/client/dist/assets/{settings-BOHOmHkb.js → settings-C_nY14Yz.js} +1 -1
- package/client/dist/assets/{settings-D6qY9_UI.js → settings-CaZ26a0S.js} +1 -1
- package/client/dist/assets/{settings-BlEA_7h02.js → settings-D54_cgl12.js} +1 -1
- package/client/dist/assets/settings-D9bDDe2O.js +1 -0
- package/client/dist/assets/{settings-TNga5gIF2.js → settings-cn0tbve62.js} +1 -1
- package/client/dist/assets/{setup-iY8vH8pB.js → setup-7J8TjG4O.js} +1 -1
- package/client/dist/assets/{setup-D674kWQH.js → setup-BXpw07r-.js} +1 -1
- package/client/dist/assets/{setup-B590KsTX.js → setup-BiduSX9d.js} +1 -1
- package/client/dist/assets/{setup-CmU6bTCV2.js → setup-BuQNKztt2.js} +1 -1
- package/client/dist/assets/{setup-CEj6uY3-2.js → setup-BwMovM9z2.js} +1 -1
- package/client/dist/assets/{setup-BkyGoby6.js → setup-D84y3wx-.js} +1 -1
- package/client/dist/assets/{setup-CbIerFGf2.js → setup-DU0ULX8q2.js} +1 -1
- package/client/dist/assets/{setup-VNqXyB6Y.js → setup-RiUHzq7E.js} +1 -1
- package/client/dist/assets/{upload-BCMl-nCg.js → upload-xdQuJvXN.js} +1 -1
- package/client/dist/assets/{value-CG-amSq1.js → value-Bk2f9AUg.js} +1 -1
- package/client/dist/index.html +22 -9
- package/docs/agy-cli-provider-study.md +1 -1
- package/docs/codex.md +2 -2
- package/docs/gemini-cli-provider-study.md +2 -2
- package/docs/guide/de/pipeline/3-batch-implement-and-multi-feature.md +1 -1
- package/docs/guide/en/pipeline/3-batch-implement-and-multi-feature.md +1 -1
- package/docs/guide/es/pipeline/3-batch-implement-and-multi-feature.md +1 -1
- package/docs/guide/fr/pipeline/3-batch-implement-and-multi-feature.md +1 -1
- package/docs/guide/it/pipeline/3-batch-implement-and-multi-feature.md +1 -1
- package/docs/guide/ja/pipeline/3-batch-implement-and-multi-feature.md +1 -1
- package/docs/guide/pt/pipeline/3-batch-implement-and-multi-feature.md +1 -1
- package/docs/guide/pt/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/zh/pipeline/3-batch-implement-and-multi-feature.md +1 -1
- package/docs/internals/api-reference.md +3 -3
- package/docs/internals/companion-rails-as-loops-contract.md +6 -6
- package/docs/internals/configuration.md +1 -1
- package/docs/internals/interactive-jobs.md +3 -3
- package/docs/internals/safe-pr-review-flow.md +1 -1
- package/docs/internals/visual-design-audit.md +2 -2
- package/docs/running-pipelines.md +1 -1
- package/package.json +1 -1
- package/server/dist/agent-chat-manager.js +16 -2
- package/server/dist/agent-chat-router.js +66 -1
- package/server/dist/agent-context-resolver.js +301 -0
- package/server/dist/agent-operator-prompt.js +58 -11
- package/server/dist/agent-store.js +24 -12
- package/server/dist/db.js +17 -17
- package/server/dist/desktop-db.js +6 -0
- package/server/dist/desktop-router.js +9 -2
- package/server/dist/feature-flags.js +2 -2
- package/server/dist/index.js +1 -1
- package/server/dist/interactive-job-session.js +3 -3
- package/server/dist/loop-command-catalog.js +11 -11
- package/server/dist/loop-factory.js +7 -7
- package/server/dist/loop-graph.js +2 -2
- package/server/dist/loop-run-manager.js +1 -1
- package/server/dist/mcp/guide.js +41 -10
- package/server/dist/mcp/tools/app-settings.js +18 -2
- package/server/dist/mcp/tools/catalog.js +2 -0
- package/server/dist/mcp/tools/rails.js +29 -9
- package/server/dist/mcp/tools/support.js +324 -0
- package/server/dist/mobile/mobile-router.js +1 -1
- package/server/dist/project-router-jobs.js +1 -1
- package/server/dist/project-router-loop-runs.js +1 -1
- package/server/dist/project-router-settings.js +5 -5
- package/server/dist/queue-manager.js +27 -27
- package/server/dist/rail-isolated-launch.js +5 -1
- package/server/dist/rails-router.js +76 -27
- package/client/dist/assets/agent-4ARs0uac2.js +0 -1
- package/client/dist/assets/agent-C55wwsUX.js +0 -1
- package/client/dist/assets/agent-C_kqyrXo.js +0 -1
- package/client/dist/assets/agent-Df3lnHMu.js +0 -1
- package/client/dist/assets/agent-G6Zn2gpr.js +0 -1
- package/client/dist/assets/agent-MQhun7cv.js +0 -1
- package/client/dist/assets/agent-NqlER4Yh2.js +0 -1
- package/client/dist/assets/agent-OTGI6t7e2.js +0 -1
- package/client/dist/assets/code-CqCcRThR.js +0 -1
- package/client/dist/assets/dashboard-4WX7agHF2.js +0 -1
- package/client/dist/assets/dashboard-5Z_esXIB.js +0 -1
- package/client/dist/assets/dashboard-DQ-po1MG2.js +0 -1
- package/client/dist/assets/dashboard-IbEztmJ52.js +0 -1
- package/client/dist/assets/dashboard-nc-Raovv.js +0 -1
- package/client/dist/assets/dashboard-ojWdDq6S.js +0 -1
- package/client/dist/assets/dashboard-oqS7VRrK.js +0 -1
- package/client/dist/assets/dashboard-zfoJcdFW.js +0 -1
- package/client/dist/assets/index-BtAks9nm.css +0 -2
- package/client/dist/assets/index-DC-REAcL.js +0 -155
- package/client/dist/assets/loops-CBiWd9Hf.js +0 -1
- 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.
|
|
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
|
|
180
|
-
exports.
|
|
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.
|
|
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
|
-
*
|
|
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
|
|
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:
|
|
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
|
-
|
|
948
|
-
const pre = this._db ? (0, db_1.
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
//
|
|
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 =
|
|
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
|
-
//
|
|
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
|
|
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
|
-
// (`
|
|
1585
|
-
const railPrompt =
|
|
1586
|
-
? this.
|
|
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
|
-
//
|
|
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.
|
|
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
|
-
//
|
|
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-
|
|
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:
|
|
1831
|
+
systemPrompt: isFreestyle ? (systemAppend || undefined) : undefined,
|
|
1832
1832
|
model: railModel,
|
|
1833
|
-
extraArgs: !
|
|
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
|
-
|
|
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
|
|
29
|
-
|
|
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
|
|
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", "
|
|
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
|
-
//
|
|
369
|
-
// Ignored for non-
|
|
370
|
-
if (mode === '
|
|
371
|
-
if (typeof model !== 'string' || !
|
|
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
|
-
//
|
|
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 === '
|
|
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 === '
|
|
426
|
-
//
|
|
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
|
|
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
|
|
525
|
-
//
|
|
526
|
-
//
|
|
527
|
-
//
|
|
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
|
-
|
|
531
|
-
|
|
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/
|
|
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 === '
|
|
655
|
-
//
|
|
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
|
|
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:
|
|
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
|
-
...(
|
|
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
|
|
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};
|