specrails-desktop 2.51.0 → 2.52.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/client/dist/assets/{ActivityFeedPage-Bu6_Fxfa.js → ActivityFeedPage-D5SgrQ1d.js} +1 -1
  2. package/client/dist/assets/{AgentBrowserCapture-ChIVaQ4N.js → AgentBrowserCapture-CPlLRjEa.js} +1 -1
  3. package/client/dist/assets/{AgentModeAnalyticsPane-Dq59o2ZO.js → AgentModeAnalyticsPane-Bbjm_pXJ.js} +2 -2
  4. package/client/dist/assets/{AgentModeCodePane-VjaDQOAZ.js → AgentModeCodePane-ztxpF9TK.js} +2 -2
  5. package/client/dist/assets/{AgentModeJobsPane-DQST3Y8L.js → AgentModeJobsPane-BBu2fvg5.js} +1 -1
  6. package/client/dist/assets/{AgentsPage-9ajYQTPV.js → AgentsPage-CaRT3M2I.js} +1 -1
  7. package/client/dist/assets/{AnalyticsPage-DgHAcKnO.js → AnalyticsPage-DlGDLOmL.js} +1 -1
  8. package/client/dist/assets/{CodePage-tDBdWNkc.js → CodePage-CPkmVMlr.js} +1 -1
  9. package/client/dist/assets/{DesktopAnalyticsPage-fxggfmsY.js → DesktopAnalyticsPage-DNdi9fl_.js} +1 -1
  10. package/client/dist/assets/{DocsDialog-0J6gUakl.js → DocsDialog-CeiMTUDg.js} +1 -1
  11. package/client/dist/assets/{DocsPage-bQ6h2xx0.js → DocsPage-o8Mhhegc.js} +1 -1
  12. package/client/dist/assets/{ExportDropdown-y2k4CoRJ.js → ExportDropdown-ClahJdDn.js} +1 -1
  13. package/client/dist/assets/{InteractiveJobComposer-BI-y4fFH.js → InteractiveJobComposer-C4VsJQgJ.js} +1 -1
  14. package/client/dist/assets/{JobDetailModal-B4cur32x.js → JobDetailModal-q-Bww00p.js} +1 -1
  15. package/client/dist/assets/{JobDetailPage--VZYZ76E.js → JobDetailPage-BJf1NNOD.js} +1 -1
  16. package/client/dist/assets/{JobsPage-K4wj2mXV.js → JobsPage-X9-RWsEc.js} +1 -1
  17. package/client/dist/assets/{LoopBuilderPage-Cu9bNaZf.js → LoopBuilderPage-oa5Vc7dx.js} +1 -1
  18. package/client/dist/assets/{LoopPreviewModal-DmwboMLZ.js → LoopPreviewModal-CxnDbTaN.js} +1 -1
  19. package/client/dist/assets/{LoopsPage-Db8wSZSW.js → LoopsPage-BrE1t-wP.js} +1 -1
  20. package/client/dist/assets/{MinimizedChatsContext-CoRyZxu4.js → MinimizedChatsContext-BGtEjWsc.js} +1 -1
  21. package/client/dist/assets/{PluginsPage-A4dSzbGE.js → PluginsPage-BJURs5Pq.js} +1 -1
  22. package/client/dist/assets/{ProjectSettingsDialog-DLrka37M.js → ProjectSettingsDialog-BITpMM9V.js} +1 -1
  23. package/client/dist/assets/{RepositoryDeliveries-FYr8nbCo.js → RepositoryDeliveries-DrcrxLe0.js} +1 -1
  24. package/client/dist/assets/{RepositoryScopeSelector-CBkDsqpz.js → RepositoryScopeSelector-CAGY3xW6.js} +1 -1
  25. package/client/dist/assets/{ReviewPacketPage-BGsesCFL.js → ReviewPacketPage-B2giDzSQ.js} +1 -1
  26. package/client/dist/assets/{TemplatePreviewModal-uGbE-mTU.js → TemplatePreviewModal-Cb1A4Va0.js} +1 -1
  27. package/client/dist/assets/{TicketDetailModalContext-lmkauO0-.js → TicketDetailModalContext-C0jQ5yOk.js} +1 -1
  28. package/client/dist/assets/{Trans-92vqs9mz.js → Trans-DtWlCJN9.js} +1 -1
  29. package/client/dist/assets/{formatDistanceToNow-Cuoagaiu.js → formatDistanceToNow-DYmvOA3R.js} +1 -1
  30. package/client/dist/assets/{getTimezoneOffsetInMilliseconds-BLaUfsdD.js → getTimezoneOffsetInMilliseconds-BAhW5E6V.js} +1 -1
  31. package/client/dist/assets/{index-Cxdhikml.js → index-Cii2IlCD.js} +28 -28
  32. package/client/dist/assets/{jira-api-DqYxW5BY.js → jira-api-B27Za5FP.js} +1 -1
  33. package/client/dist/assets/nav-B-tpjyc2.js +1 -0
  34. package/client/dist/assets/nav-BJNXGg29.js +1 -0
  35. package/client/dist/assets/nav-BdhtRLP7.js +1 -0
  36. package/client/dist/assets/nav-ByYgyN5T.js +1 -0
  37. package/client/dist/assets/nav-DA0Mva2c.js +1 -0
  38. package/client/dist/assets/nav-DcJm_Jg_.js +1 -0
  39. package/client/dist/assets/nav-DhMPtAXc.js +1 -0
  40. package/client/dist/assets/nav-DhPb-Isc.js +1 -0
  41. package/client/dist/assets/{project-repositories-DbVfkVQJ.js → project-repositories-DixIZHTA.js} +1 -1
  42. package/client/dist/assets/{spending-ul_XBA3M.js → spending-BGmZBX5B.js} +1 -1
  43. package/client/dist/assets/{useDesktop-BC_4XGnf.js → useDesktop-CPB4cnwI.js} +1 -1
  44. package/client/dist/assets/{useRuntimeRuns-B_YsBTsN.js → useRuntimeRuns-DEQ9HdAM.js} +1 -1
  45. package/client/dist/assets/{useSharedWebSocket-8NyZpT6v.js → useSharedWebSocket-DcPRKR8R.js} +2 -2
  46. package/client/dist/index.html +15 -15
  47. package/package.json +1 -1
  48. package/server/dist/loop-run-manager.js +69 -3
  49. package/server/dist/loop-templates.js +3 -1
  50. package/server/dist/mobile/mobile-signal-reconnect.js +55 -12
  51. package/server/dist/rail-isolated-launch.js +1 -1
  52. package/client/dist/assets/nav-1-Hh2kOz.js +0 -1
  53. package/client/dist/assets/nav-B34QkESm.js +0 -1
  54. package/client/dist/assets/nav-Bap_UXAq.js +0 -1
  55. package/client/dist/assets/nav-BwxXIB24.js +0 -1
  56. package/client/dist/assets/nav-Ch-zHBG5.js +0 -1
  57. package/client/dist/assets/nav-CygC_WN-.js +0 -1
  58. package/client/dist/assets/nav-KnnLQtOQ.js +0 -1
  59. package/client/dist/assets/nav-m00uxYUG.js +0 -1
@@ -204,7 +204,7 @@
204
204
  .specrails-splash__mark .pill { opacity: 1; }
205
205
  }
206
206
  </style>
207
- <script type="module" crossorigin src="/assets/index-Cxdhikml.js"></script>
207
+ <script type="module" crossorigin src="/assets/index-Cii2IlCD.js"></script>
208
208
  <link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-CNC7AqOf.js">
209
209
  <link rel="modulepreload" crossorigin href="/assets/jsx-runtime-zu2_FqZY.js">
210
210
  <link rel="modulepreload" crossorigin href="/assets/react-dom-DiWzBDP9.js">
@@ -233,7 +233,7 @@
233
233
  <link rel="modulepreload" crossorigin href="/assets/loops-B7YpGizO.js">
234
234
  <link rel="modulepreload" crossorigin href="/assets/mcp-CUAN6ORK.js">
235
235
  <link rel="modulepreload" crossorigin href="/assets/narration-n3hOA7LY.js">
236
- <link rel="modulepreload" crossorigin href="/assets/nav-Ch-zHBG5.js">
236
+ <link rel="modulepreload" crossorigin href="/assets/nav-DhPb-Isc.js">
237
237
  <link rel="modulepreload" crossorigin href="/assets/packet-DwPtJoDz.js">
238
238
  <link rel="modulepreload" crossorigin href="/assets/settings-HZSu-K4l.js">
239
239
  <link rel="modulepreload" crossorigin href="/assets/setup-DpqzaEEA.js">
@@ -241,15 +241,15 @@
241
241
  <link rel="modulepreload" crossorigin href="/assets/terminal-BAzpHtpY.js">
242
242
  <link rel="modulepreload" crossorigin href="/assets/tickets-D41ZMQpf.js">
243
243
  <link rel="modulepreload" crossorigin href="/assets/createLucideIcon-Bjbbp_KS.js">
244
- <link rel="modulepreload" crossorigin href="/assets/useSharedWebSocket-8NyZpT6v.js">
245
- <link rel="modulepreload" crossorigin href="/assets/Trans-92vqs9mz.js">
246
- <link rel="modulepreload" crossorigin href="/assets/useDesktop-BC_4XGnf.js">
244
+ <link rel="modulepreload" crossorigin href="/assets/useSharedWebSocket-DcPRKR8R.js">
245
+ <link rel="modulepreload" crossorigin href="/assets/Trans-DtWlCJN9.js">
246
+ <link rel="modulepreload" crossorigin href="/assets/useDesktop-CPB4cnwI.js">
247
247
  <link rel="modulepreload" crossorigin href="/assets/provider-capabilities-Vi1ZGvAK.js">
248
248
  <link rel="modulepreload" crossorigin href="/assets/save-B6wGWwBR.js">
249
- <link rel="modulepreload" crossorigin href="/assets/spending-ul_XBA3M.js">
249
+ <link rel="modulepreload" crossorigin href="/assets/spending-BGmZBX5B.js">
250
250
  <link rel="modulepreload" crossorigin href="/assets/sparkles-DrY8hb0X.js">
251
251
  <link rel="modulepreload" crossorigin href="/assets/x-CBMI9ejn.js">
252
- <link rel="modulepreload" crossorigin href="/assets/MinimizedChatsContext-CoRyZxu4.js">
252
+ <link rel="modulepreload" crossorigin href="/assets/MinimizedChatsContext-BGtEjWsc.js">
253
253
  <link rel="modulepreload" crossorigin href="/assets/zap-CUOlvtT1.js">
254
254
  <link rel="modulepreload" crossorigin href="/assets/circle-x-CMYsN4ZH.js">
255
255
  <link rel="modulepreload" crossorigin href="/assets/download-CFHyyHcw.js">
@@ -269,16 +269,16 @@
269
269
  <link rel="modulepreload" crossorigin href="/assets/utils-BC4DHlz2.js">
270
270
  <link rel="modulepreload" crossorigin href="/assets/dialog-xXB2q5HJ.js">
271
271
  <link rel="modulepreload" crossorigin href="/assets/lib-CGdyxIWg.js">
272
- <link rel="modulepreload" crossorigin href="/assets/getTimezoneOffsetInMilliseconds-BLaUfsdD.js">
273
- <link rel="modulepreload" crossorigin href="/assets/formatDistanceToNow-Cuoagaiu.js">
272
+ <link rel="modulepreload" crossorigin href="/assets/getTimezoneOffsetInMilliseconds-BAhW5E6V.js">
273
+ <link rel="modulepreload" crossorigin href="/assets/formatDistanceToNow-DYmvOA3R.js">
274
274
  <link rel="modulepreload" crossorigin href="/assets/button-Ccc9Dc-D.js">
275
- <link rel="modulepreload" crossorigin href="/assets/jira-api-DqYxW5BY.js">
276
- <link rel="modulepreload" crossorigin href="/assets/project-repositories-DbVfkVQJ.js">
277
- <link rel="modulepreload" crossorigin href="/assets/RepositoryScopeSelector-CBkDsqpz.js">
278
- <link rel="modulepreload" crossorigin href="/assets/TicketDetailModalContext-lmkauO0-.js">
275
+ <link rel="modulepreload" crossorigin href="/assets/jira-api-B27Za5FP.js">
276
+ <link rel="modulepreload" crossorigin href="/assets/project-repositories-DixIZHTA.js">
277
+ <link rel="modulepreload" crossorigin href="/assets/RepositoryScopeSelector-CAGY3xW6.js">
278
+ <link rel="modulepreload" crossorigin href="/assets/TicketDetailModalContext-C0jQ5yOk.js">
279
279
  <link rel="modulepreload" crossorigin href="/assets/core-B3mKBIh5.js">
280
- <link rel="modulepreload" crossorigin href="/assets/RepositoryDeliveries-FYr8nbCo.js">
281
- <link rel="modulepreload" crossorigin href="/assets/useRuntimeRuns-B_YsBTsN.js">
280
+ <link rel="modulepreload" crossorigin href="/assets/RepositoryDeliveries-DrcrxLe0.js">
281
+ <link rel="modulepreload" crossorigin href="/assets/useRuntimeRuns-DEQ9HdAM.js">
282
282
  <link rel="modulepreload" crossorigin href="/assets/event-Bt7f3wXe.js">
283
283
  <link rel="stylesheet" crossorigin href="/assets/index-BAtqmAZR.css">
284
284
  </head>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "specrails-desktop",
3
- "version": "2.51.0",
3
+ "version": "2.52.0",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -1,10 +1,17 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  exports.LoopRunManager = void 0;
4
7
  exports.truncate = truncate;
5
8
  exports.resolveRunVars = resolveRunVars;
9
+ exports.seedChangeId = seedChangeId;
10
+ exports.openspecChangeState = openspecChangeState;
6
11
  exports.extractChangeId = extractChangeId;
7
12
  exports.recoverOrphanLoopStepAccounting = recoverOrphanLoopStepAccounting;
13
+ const path_1 = __importDefault(require("path"));
14
+ const fs_1 = __importDefault(require("fs"));
8
15
  const agent_runtime_events_1 = require("./agent-runtime-events");
9
16
  const agent_runtime_settings_1 = require("./agent-runtime-settings");
10
17
  const multi_repo_execution_store_1 = require("./multi-repo-execution-store");
@@ -133,6 +140,40 @@ const CHANGE_ID_RE = /openspec[\\/]+changes[\\/]+(?!archive(?:[\\/]|$))([A-Za-z0
133
140
  function resolveRunVars(text, vars) {
134
141
  return text.replace(RUN_TOKEN_RE, (_m, key) => vars[key] ?? '');
135
142
  }
143
+ const CHANGE_NAME_RE = /^[a-z0-9][a-z0-9._-]{0,99}$/i;
144
+ /** The durable OpenSpec change name a launch already carries, if any: the
145
+ * follow-up's declared name wins, else the spec's `openspecChangeName`. */
146
+ function seedChangeId(req) {
147
+ const fromFollowUp = typeof req.followUp?.openspecChangeName === 'string' ? req.followUp.openspecChangeName.trim() : '';
148
+ if (fromFollowUp && CHANGE_NAME_RE.test(fromFollowUp))
149
+ return { id: fromFollowUp, source: 'followUp' };
150
+ const direct = typeof req.spec?.openspecChangeName === 'string' ? req.spec.openspecChangeName.trim() : '';
151
+ const fromMetadata = typeof req.spec?.metadata?.openspecChangeName === 'string' ? req.spec.metadata.openspecChangeName.trim() : '';
152
+ const fromSpec = direct || fromMetadata;
153
+ if (fromSpec && CHANGE_NAME_RE.test(fromSpec))
154
+ return { id: fromSpec, source: 'spec' };
155
+ return undefined;
156
+ }
157
+ /** Where an OpenSpec change currently lives under `cwd`: an ACTIVE
158
+ * `openspec/changes/<id>` dir, an ARCHIVED `openspec/changes/archive/<…-id>`
159
+ * dir, or nowhere. Read-only, never throws (an unreadable tree ⇒ 'missing'). */
160
+ function openspecChangeState(cwd, changeId) {
161
+ if (!cwd || !changeId)
162
+ return 'missing';
163
+ try {
164
+ const changes = path_1.default.join(cwd, 'openspec', 'changes');
165
+ if (fs_1.default.existsSync(path_1.default.join(changes, changeId)))
166
+ return 'active';
167
+ const archive = path_1.default.join(changes, 'archive');
168
+ if (!fs_1.default.existsSync(archive))
169
+ return 'missing';
170
+ const hit = fs_1.default.readdirSync(archive, { withFileTypes: true }).some((entry) => entry.isDirectory() && (entry.name === changeId || entry.name.endsWith(`-${changeId}`)));
171
+ return hit ? 'archived' : 'missing';
172
+ }
173
+ catch {
174
+ return 'missing';
175
+ }
176
+ }
136
177
  /** Extract the OpenSpec change id from a step's output (first match wins), or
137
178
  * undefined when none is present. */
138
179
  function extractChangeId(text) {
@@ -854,6 +895,18 @@ class LoopRunManager {
854
895
  // (e.g. `changeId` from the first opsx:ff step's output) and resolved in later
855
896
  // ai-step prompts and shell commands. Empty until something is captured.
856
897
  const runVars = {};
898
+ // Seed `changeId` from the DURABLE sources a launch already knows — the
899
+ // follow-up's declared OpenSpec change name, else the spec's
900
+ // `openspecChangeName` metadata. Capturing it from a step's prose was the
901
+ // only source before, and a step that created, implemented AND archived the
902
+ // change in one go (run 644eb404) never mentioned an active path, so the
903
+ // validate/archive shell steps refused to run and a green implementation
904
+ // settled `failed`. A step's own capture still wins when nothing is seeded.
905
+ const seededChangeId = seedChangeId(req);
906
+ if (seededChangeId) {
907
+ runVars.changeId = seededChangeId.id;
908
+ logLine(`↪ OpenSpec change id seeded from ${seededChangeId.source}: ${seededChangeId.id}`);
909
+ }
857
910
  // Backstop against a cycle with no Decider (would otherwise never increment
858
911
  // `iteration`): cap total node executions well above any honest run.
859
912
  const stepCap = (maxIterations + 1) * (req.graph.nodes.length + 2) + 16;
@@ -1395,11 +1448,24 @@ class LoopRunManager {
1395
1448
  settled = true;
1396
1449
  break;
1397
1450
  }
1398
- const command = (0, loop_constants_1.resolveConstants)(resolveRunVars((0, loop_graph_1.interpolateSpec)(String(node.data?.command ?? ''), req.spec), runVars), constMap);
1451
+ const rawCommand = String(node.data?.command ?? '');
1452
+ const command = (0, loop_constants_1.resolveConstants)(resolveRunVars((0, loop_graph_1.interpolateSpec)(rawCommand, req.spec), runVars), constMap);
1399
1453
  emitStep('shell', `⚡ ${nodeLabel || 'Shell'}`, node.id, iteration + 1);
1400
- logLine(`$ ${command}`);
1401
1454
  const shellRepo = req.executionManifest?.repositories.find((repo) => repo.repositoryId === node.data?.repositoryId)?.worktreePath ?? req.repoDir;
1402
- const sh = await this.executors.runShell({ command, cwd: req.executionManifest ? shellRepo ?? req.cwd : req.cwd, repoDir: shellRepo, timeoutMs: Math.min(10 * 60_000, Math.max(1, deadline - this.now())), onLine: logLine, onSpawn: (c) => this._activeChild.set(runId, c) });
1455
+ const shellCwd = req.executionManifest ? shellRepo ?? req.cwd : req.cwd;
1456
+ // An OpenSpec change the AI step already archived (despite the
1457
+ // prompt) is finished work, not a failure: validating or archiving
1458
+ // it again would fail against the missing active dir and throw a
1459
+ // green implementation away. Short-circuit as a successful no-op.
1460
+ if (runVars.changeId && /\{\{\s*run\.changeId\s*\}\}/.test(rawCommand) && /\bopenspec\s+(validate|archive)\b/.test(rawCommand)
1461
+ && openspecChangeState(shellCwd, runVars.changeId) === 'archived') {
1462
+ logLine(`Skipped: OpenSpec change ${runVars.changeId} is already archived (openspec/changes/archive) — nothing left to ${/\barchive\b/.test(rawCommand) ? 'archive' : 'validate'}.`);
1463
+ emitStepEnd({ status: 'ok', exitCode: 0, durationMs: 0 });
1464
+ nodeId = succs[0]?.id;
1465
+ break;
1466
+ }
1467
+ logLine(`$ ${command}`);
1468
+ const sh = await this.executors.runShell({ command, cwd: shellCwd, repoDir: shellRepo, timeoutMs: Math.min(10 * 60_000, Math.max(1, deadline - this.now())), onLine: logLine, onSpawn: (c) => this._activeChild.set(runId, c) });
1403
1469
  if (this._disposed)
1404
1470
  return neverAfterDispose();
1405
1471
  this._activeChild.delete(runId);
@@ -141,6 +141,8 @@ const OPSX_FF_PROMPT = [
141
141
  '',
142
142
  'OpenSpec artifacts are authoritative. If the requested implementation changes requirements, acceptance criteria, design decisions, APIs, states, data models, or invariants, amend the relevant OpenSpec artifacts before any code changes.',
143
143
  '',
144
+ 'Do NOT run `openspec archive` in this step, even if the implementation is complete: this loop validates and archives the change itself in later CLI steps, and an archived change makes those steps fail. Leave the change ACTIVE under openspec/changes/<name>/ and name that path in your final reply.',
145
+ '',
144
146
  'Run fully unattended: make reasonable decisions to keep momentum and NEVER stop to ask — there is no human to answer. When something is unclear, pick the most sensible option, proceed, and note the assumption.',
145
147
  ].join('\n');
146
148
  const OPSX_APPLY_PROMPT = [
@@ -150,7 +152,7 @@ const OPSX_APPLY_PROMPT = [
150
152
  '',
151
153
  'Before editing code, confirm the active OpenSpec artifacts already describe the contract being implemented. If implementation requires changing requirements, acceptance criteria, design decisions, APIs, states, data models, or invariants, stop code work and amend the OpenSpec artifacts first.',
152
154
  '',
153
- 'Run the relevant tests and configured checks for the changed behavior, correct failures, and confirm every required task and acceptance criterion is implemented. This step owns code verification; the later CLI validate only checks OpenSpec artifacts. Do not archive here.',
155
+ 'Run the relevant tests and configured checks for the changed behavior, correct failures, and confirm every required task and acceptance criterion is implemented. This step owns code verification; the later CLI validate only checks OpenSpec artifacts. Do not archive here — never run `openspec archive`; the loop archives the change in a later CLI step.',
154
156
  'Finish with exactly `{{const:VERIFICATION_PASS}}` only after implementation and relevant checks succeed. Otherwise finish with `{{const:VERIFICATION_FAIL}} — <remaining work or failed checks>`.',
155
157
  'Run fully unattended: decide and keep momentum, never pause to ask. If you hit an ambiguity or blocker, make the most reasonable choice, implement it, and continue.',
156
158
  ].join('\n');
@@ -20,10 +20,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
20
20
  exports.MobileSignalReconnect = void 0;
21
21
  class MobileSignalReconnect {
22
22
  _deps;
23
+ _timeoutMs;
23
24
  _timer = null;
24
25
  _busy = false;
25
- constructor(_deps) {
26
+ _epoch = 0;
27
+ _requests = new Set();
28
+ constructor(_deps, _timeoutMs = 8000) {
26
29
  this._deps = _deps;
30
+ this._timeoutMs = _timeoutMs;
27
31
  }
28
32
  start(intervalMs = 3000) {
29
33
  if (this._timer)
@@ -32,6 +36,10 @@ class MobileSignalReconnect {
32
36
  this._timer.unref?.();
33
37
  }
34
38
  stop() {
39
+ this._epoch++;
40
+ for (const controller of this._requests)
41
+ controller.abort();
42
+ this._requests.clear();
35
43
  if (this._timer) {
36
44
  clearInterval(this._timer);
37
45
  this._timer = null;
@@ -42,13 +50,20 @@ class MobileSignalReconnect {
42
50
  if (this._busy)
43
51
  return; // never overlap cycles (a slow makeOffer must not stack)
44
52
  this._busy = true;
45
- try {
46
- for (const room of this._deps.rooms()) {
53
+ const epoch = this._epoch;
54
+ const rooms = [...this._deps.rooms()];
55
+ const worker = async () => {
56
+ while (rooms.length && epoch === this._epoch) {
57
+ const room = rooms.shift();
47
58
  try {
48
59
  // A phone asking to reconnect? → answer with a fresh offer.
49
60
  const req = await this._get(room, 'req');
61
+ if (epoch !== this._epoch)
62
+ return;
50
63
  if (req !== null) {
51
64
  const offer = await this._deps.makeOffer(room);
65
+ if (epoch !== this._epoch)
66
+ return;
52
67
  if (offer) {
53
68
  // BUG-AUTH-01: never publish `offer.secret` to the public mailbox.
54
69
  // The reconnecting companion authenticates with its existing device
@@ -57,7 +72,11 @@ class MobileSignalReconnect {
57
72
  }
58
73
  }
59
74
  // A phone's answer waiting? → complete the connection.
75
+ if (epoch !== this._epoch)
76
+ return;
60
77
  const ans = await this._get(room, 'answer');
78
+ if (epoch !== this._epoch)
79
+ return;
61
80
  if (ans) {
62
81
  try {
63
82
  const parsed = JSON.parse(ans);
@@ -73,22 +92,46 @@ class MobileSignalReconnect {
73
92
  /* transient per-room network error — retry next cycle */
74
93
  }
75
94
  }
95
+ };
96
+ try {
97
+ await Promise.all(Array.from({ length: Math.min(4, rooms.length) }, worker));
76
98
  }
77
99
  finally {
78
100
  this._busy = false;
79
101
  }
80
102
  }
81
- async _get(room, slot) {
82
- const res = await this._deps.doFetch(`${this._deps.signalBase}?room=${encodeURIComponent(room)}&slot=${slot}`);
83
- if (res.status !== 200)
84
- return null;
85
- return res.text();
103
+ async _request(room, slot, body) {
104
+ const controller = new AbortController();
105
+ this._requests.add(controller);
106
+ let timer;
107
+ const aborted = new Promise((_, reject) => {
108
+ controller.signal.addEventListener('abort', () => reject(new Error('Signaling request canceled or timed out')), { once: true });
109
+ timer = setTimeout(() => controller.abort(), this._timeoutMs);
110
+ });
111
+ try {
112
+ return await Promise.race([aborted, (async () => {
113
+ const res = await this._deps.doFetch(`${this._deps.signalBase}?room=${encodeURIComponent(room)}&slot=${slot}`, {
114
+ signal: controller.signal,
115
+ ...(body === undefined ? {} : { method: 'POST', body }),
116
+ });
117
+ if (body !== undefined) {
118
+ if (res.status < 200 || res.status >= 300)
119
+ throw new Error('Signaling write failed');
120
+ return null;
121
+ }
122
+ return res.status === 200 ? await res.text() : null;
123
+ })()]);
124
+ }
125
+ finally {
126
+ clearTimeout(timer);
127
+ this._requests.delete(controller);
128
+ }
129
+ }
130
+ _get(room, slot) {
131
+ return this._request(room, slot);
86
132
  }
87
133
  async _post(room, slot, body) {
88
- await this._deps.doFetch(`${this._deps.signalBase}?room=${encodeURIComponent(room)}&slot=${slot}`, {
89
- method: 'POST',
90
- body,
91
- });
134
+ await this._request(room, slot, body);
92
135
  }
93
136
  }
94
137
  exports.MobileSignalReconnect = MobileSignalReconnect;
@@ -1254,7 +1254,7 @@ async function launchIsolatedRail(input, io = {}) {
1254
1254
  deferTerminalOutcome: true,
1255
1255
  constants, provider, model, effort, ...(deciderEngine ? { deciderEngine } : {}),
1256
1256
  profileName: input.profileName,
1257
- ...(input.followUp ? { followUp: { id: input.followUp.id, version: input.followUp.version, hash: input.followUp.hash, briefing: (0, pr_follow_up_1.renderFollowUpBriefing)(input.followUp, { prNumber: launchContinuation?.prNumber ?? input.explicitPrTarget?.prNumber ?? null, ticketIds }) } } : {}),
1257
+ ...(input.followUp ? { followUp: { id: input.followUp.id, version: input.followUp.version, hash: input.followUp.hash, openspecChangeName: input.followUp.openspecChangeName ?? null, briefing: (0, pr_follow_up_1.renderFollowUpBriefing)(input.followUp, { prNumber: launchContinuation?.prNumber ?? input.explicitPrTarget?.prNumber ?? null, ticketIds }) } } : {}),
1258
1258
  ...(claimedAddenda.briefing ? { addenda: { ids: claimedAddenda.snapshot.map((e) => e.id), briefing: claimedAddenda.briefing } } : {}),
1259
1259
  });
1260
1260
  runPromises.push(settleAllocatedRun(a, enginePromise));
@@ -1 +0,0 @@
1
- var e={withShortcut:`{{label}}({{shortcut}})`,left:{pinnedOpen:`收起左侧边栏(保持固定)`,pinnedCollapsed:`取消固定左侧边栏`,unpinned:`固定并展开左侧边栏`},right:{pinnedOpen:`收起右侧边栏(保持固定)`,pinnedCollapsed:`取消固定右侧边栏`,unpinned:`固定并展开右侧边栏`}},t={addProject:`添加项目`,remove:`移除 {{name}}`,confirmRemove:`确认移除 {{name}}`,confirmShort:`确认?`,added:`已添加项目:{{name}}`,removed:`项目已移除`,expand:`展开 {{name}}`,collapse:`折叠 {{name}}`,settings:`{{name}} 的设置`,assembling:`正在准备工作区…`,assembleFailed:`工作区准备失败 — 点击重试`},n={desktopTitle:`Desktop`,loops:`Loops`,docs:`文档`,analytics:`分析`,settings:`设置`,plugins:`插件`,review:`审阅`},r={loopsDescription:`Loops 已作为 Mission 模态窗口打开。`,pluginsDescription:`Plugins 已作为 Mission 模态窗口打开。`,reviewDescription:`审阅包已作为任务模态窗口打开。`},i={projectTitle:`项目`,dashboard:`仪表盘`,jobs:`任务`,analytics:`分析`,agents:`Agent`,code:`代码`,integrations:`集成`,settings:`设置`},a={home:`首页`,analytics:`分析`,docs:`文档`,settings:`设置`,noCli:`无 AI CLI`,noCliTooltip:`未检测到 AI CLI。请安装 Claude Code、Codex CLI、Gemini CLI 或 Kimi Code。`,activeCli:`当前 CLI:{{label}}`},o={connected:`已连接`,syncing:`同步中...`,reconnecting:`重新连接中...`,disconnected:`已断开`,connectionRestored:`连接已恢复`},s={searchShortcut:`搜索 (⌘K)`,searchPlaceholder:`搜索…`,minimizeWindow:`最小化窗口`,maximizeWindow:`最大化窗口`,closeWindow:`关闭窗口`,restoreWindow:`还原窗口`},c={costAlertTitle:`成本警报`,costAlertDescription:"任务成本 ${{cost}} — 阈值为 ${{threshold}}",dailyBudgetTitle:`已超出每日预算`,dailyBudgetDescription:"今日已花费 ${{spent}},预算 ${{budget}}。队列已暂停。",desktopBudgetTitle:`已超出 Desktop 每日预算`,desktopBudgetDescription:"Desktop 总花费 ${{spent}},预算 ${{budget}}。队列已暂停。",bannerMessage:"已超出每日预算 — 已花费 ${{spent}},预算 ${{budget}}。队列已暂停。",dismiss:`忽略`},l={title:`出错了`,occurredIn:`<strong>{{name}}</strong> 中发生了错误`},u={healthLabel:`健康度`,notAvailable:`无`,factorCoverageAvailable:`有覆盖率数据`,factorCoverageGood:`覆盖率 ≥ 70%`,factorPipelineGreen:`最近一次流水线通过`,factorActiveWeek:`本周活跃`,noJobsYet:`暂无任务`,recurringFailures:`检测到反复失败`,failurePattern:`<cmd>{{command}}</cmd> 本周已失败 <times>{{count}}×</times> — 可能存在项目问题。`,coverage:`覆盖率`,lines:`行`,functions:`函数`,branches:`分支`,lastPipeline:`最近流水线`,recentCommits:`最近提交`,noGitHistory:`未找到 git 历史`,minutesAgo:`{{count}} 分钟前`,hoursAgo:`{{count}} 小时前`,daysAgo:`{{count}} 天前`},d={dragToReorder:`拖动以重新排序`,unpinAria:`取消固定该区块(默认折叠)`,pinAria:`固定该区块(保持展开)`,unpinTooltip:`取消固定(默认折叠)`,pinTooltip:`固定展开(保持展开)`},f={sidebarPin:e,projects:t,arcSidebar:n,globalSurfaceModal:r,rightSidebar:i,navbar:a,statusBar:o,titleBar:s,costAlerts:c,errorBoundary:l,healthWidget:u,collapsibleSection:d};export{n as arcSidebar,d as collapsibleSection,c as costAlerts,f as default,l as errorBoundary,r as globalSurfaceModal,u as healthWidget,a as navbar,t as projects,i as rightSidebar,e as sidebarPin,o as statusBar,s as titleBar};
@@ -1 +0,0 @@
1
- var e={withShortcut:`{{label}} ({{shortcut}})`,left:{pinnedOpen:`Contraer barra lateral izquierda (mantener anclada)`,pinnedCollapsed:`Desanclar barra lateral izquierda`,unpinned:`Anclar barra lateral izquierda abierta`},right:{pinnedOpen:`Contraer barra lateral derecha (mantener anclada)`,pinnedCollapsed:`Desanclar barra lateral derecha`,unpinned:`Anclar barra lateral derecha abierta`}},t={addProject:`Añadir proyecto`,remove:`Eliminar {{name}}`,confirmRemove:`Confirmar eliminación de {{name}}`,confirmShort:`¿confirmar?`,added:`Proyecto añadido: {{name}}`,removed:`Proyecto eliminado`,expand:`Expandir {{name}}`,collapse:`Contraer {{name}}`,settings:`Ajustes de {{name}}`,assembling:`Preparando workspace…`,assembleFailed:`Fallo al preparar el workspace — clic para reintentar`},n={desktopTitle:`Desktop`,loops:`Loops`,docs:`Docs`,analytics:`Analíticas`,settings:`Ajustes`,plugins:`Plugins`,review:`Revisión`},r={loopsDescription:`Loops está abierto como modal de Mission.`,pluginsDescription:`Plugins está abierto como modal de Mission.`,reviewDescription:`El paquete de revisión está abierto como modal de misión.`},i={projectTitle:`Proyecto`,dashboard:`Dashboard`,jobs:`Jobs`,analytics:`Analíticas`,agents:`Agentes`,code:`Código`,integrations:`Integraciones`,settings:`Ajustes`},a={home:`Inicio`,analytics:`Analíticas`,docs:`Docs`,settings:`Ajustes`,noCli:`Sin CLI de IA`,noCliTooltip:`No se ha detectado ningún CLI de IA. Instala Claude Code, Codex CLI, Gemini CLI o Kimi Code.`,activeCli:`CLI activo: {{label}}`},o={connected:`conectado`,syncing:`sincronizando...`,reconnecting:`reconectando...`,disconnected:`desconectado`,connectionRestored:`Conexión restablecida`},s={searchShortcut:`Buscar (⌘K)`,searchPlaceholder:`Buscar…`,minimizeWindow:`Minimizar ventana`,maximizeWindow:`Maximizar ventana`,closeWindow:`Cerrar ventana`,restoreWindow:`Restaurar ventana`},c={costAlertTitle:`Alerta de coste`,costAlertDescription:"El job ha costado ${{cost}} — el umbral es ${{threshold}}",dailyBudgetTitle:`Presupuesto diario superado`,dailyBudgetDescription:"Gastados ${{spent}} de ${{budget}} hoy. Cola pausada.",desktopBudgetTitle:`Presupuesto diario de Desktop superado`,desktopBudgetDescription:"Gasto total de Desktop: ${{spent}} de ${{budget}}. Cola pausada.",bannerMessage:"Presupuesto diario superado — gastados ${{spent}} de ${{budget}}. La cola está pausada.",dismiss:`Descartar`},l={title:`Algo ha salido mal`,occurredIn:`Se ha producido un error en <strong>{{name}}</strong>`},u={healthLabel:`salud`,notAvailable:`n/d`,factorCoverageAvailable:`Cobertura disponible`,factorCoverageGood:`Cobertura ≥ 70%`,factorPipelineGreen:`Último pipeline en verde`,factorActiveWeek:`Activo esta semana`,noJobsYet:`Aún no hay jobs`,recurringFailures:`Fallos recurrentes detectados`,failurePattern:`<cmd>{{command}}</cmd> ha fallado <times>{{count}}×</times> esta semana — posible problema del proyecto.`,coverage:`Cobertura`,lines:`Líneas`,functions:`Funciones`,branches:`Ramas`,lastPipeline:`Último pipeline`,recentCommits:`Commits recientes`,noGitHistory:`No se ha encontrado historial de git`,minutesAgo:`hace {{count}}m`,hoursAgo:`hace {{count}}h`,daysAgo:`hace {{count}}d`},d={dragToReorder:`Arrastra para reordenar`,unpinAria:`Desanclar sección (se contraerá por defecto)`,pinAria:`Anclar sección (permanecerá expandida)`,unpinTooltip:`Desanclar (contraída por defecto)`,pinTooltip:`Anclar abierta (permanece expandida)`},f={sidebarPin:e,projects:t,arcSidebar:n,globalSurfaceModal:r,rightSidebar:i,navbar:a,statusBar:o,titleBar:s,costAlerts:c,errorBoundary:l,healthWidget:u,collapsibleSection:d};export{n as arcSidebar,d as collapsibleSection,c as costAlerts,f as default,l as errorBoundary,r as globalSurfaceModal,u as healthWidget,a as navbar,t as projects,i as rightSidebar,e as sidebarPin,o as statusBar,s as titleBar};
@@ -1 +0,0 @@
1
- var e={withShortcut:`{{label}} ({{shortcut}})`,left:{pinnedOpen:`Comprimi barra laterale sinistra (mantieni fissata)`,pinnedCollapsed:`Sblocca barra laterale sinistra`,unpinned:`Fissa aperta la barra laterale sinistra`},right:{pinnedOpen:`Comprimi barra laterale destra (mantieni fissata)`,pinnedCollapsed:`Sblocca barra laterale destra`,unpinned:`Fissa aperta la barra laterale destra`}},t={addProject:`Aggiungi progetto`,remove:`Rimuovi {{name}}`,confirmRemove:`Conferma rimozione di {{name}}`,confirmShort:`confermare?`,added:`Progetto aggiunto: {{name}}`,removed:`Progetto rimosso`,expand:`Espandi {{name}}`,collapse:`Comprimi {{name}}`,settings:`Impostazioni di {{name}}`,assembling:`Preparazione del workspace…`,assembleFailed:`Preparazione del workspace non riuscita — clicca per riprovare`},n={desktopTitle:`Desktop`,loops:`Loops`,docs:`Docs`,analytics:`Analytics`,settings:`Impostazioni`,plugins:`Plugin`,review:`Revisione`},r={loopsDescription:`Loops è aperto come modale Mission.`,pluginsDescription:`Plugins è aperto come modale Mission.`,reviewDescription:`Il pacchetto di revisione è aperto come modale di missione.`},i={projectTitle:`Progetto`,dashboard:`Dashboard`,jobs:`Job`,analytics:`Analytics`,agents:`Agenti`,code:`Codice`,integrations:`Integrazioni`,settings:`Impostazioni`},a={home:`Home`,analytics:`Analytics`,docs:`Docs`,settings:`Impostazioni`,noCli:`Nessuna CLI AI`,noCliTooltip:`Nessuna CLI AI rilevata. Installa Claude Code, Codex CLI, Gemini CLI o Kimi Code.`,activeCli:`CLI attiva: {{label}}`},o={connected:`connesso`,syncing:`sincronizzazione...`,reconnecting:`riconnessione...`,disconnected:`disconnesso`,connectionRestored:`Connessione ripristinata`},s={searchShortcut:`Cerca (⌘K)`,searchPlaceholder:`Cerca…`,minimizeWindow:`Riduci a icona`,maximizeWindow:`Ingrandisci finestra`,closeWindow:`Chiudi finestra`,restoreWindow:`Ripristina finestra`},c={costAlertTitle:`Avviso di costo`,costAlertDescription:"Costo del job ${{cost}} — la soglia è ${{threshold}}",dailyBudgetTitle:`Budget giornaliero superato`,dailyBudgetDescription:"Spesi ${{spent}} su ${{budget}} oggi. Coda in pausa.",desktopBudgetTitle:`Budget giornaliero di Desktop superato`,desktopBudgetDescription:"Spesa totale di Desktop ${{spent}} su ${{budget}}. Coda in pausa.",bannerMessage:"Budget giornaliero superato — spesi ${{spent}} su ${{budget}}. La coda è in pausa.",dismiss:`Ignora`},l={title:`Qualcosa è andato storto`,occurredIn:`Si è verificato un errore in <strong>{{name}}</strong>`},u={healthLabel:`salute`,notAvailable:`n/d`,factorCoverageAvailable:`Copertura disponibile`,factorCoverageGood:`Copertura ≥ 70%`,factorPipelineGreen:`Ultima pipeline verde`,factorActiveWeek:`Attivo questa settimana`,noJobsYet:`Ancora nessun job`,recurringFailures:`Rilevati errori ricorrenti`,failurePattern:`<cmd>{{command}}</cmd> è fallito <times>{{count}}×</times> questa settimana — possibile problema del progetto.`,coverage:`Copertura`,lines:`Righe`,functions:`Funzioni`,branches:`Branch`,lastPipeline:`Ultima pipeline`,recentCommits:`Commit recenti`,noGitHistory:`Nessuna cronologia git trovata`,minutesAgo:`{{count}}m fa`,hoursAgo:`{{count}}h fa`,daysAgo:`{{count}}g fa`},d={dragToReorder:`Trascina per riordinare`,unpinAria:`Sblocca sezione (compressa per impostazione predefinita)`,pinAria:`Fissa sezione (resterà espansa)`,unpinTooltip:`Sblocca (compressa per impostazione predefinita)`,pinTooltip:`Fissa aperta (resta espansa)`},f={sidebarPin:e,projects:t,arcSidebar:n,globalSurfaceModal:r,rightSidebar:i,navbar:a,statusBar:o,titleBar:s,costAlerts:c,errorBoundary:l,healthWidget:u,collapsibleSection:d};export{n as arcSidebar,d as collapsibleSection,c as costAlerts,f as default,l as errorBoundary,r as globalSurfaceModal,u as healthWidget,a as navbar,t as projects,i as rightSidebar,e as sidebarPin,o as statusBar,s as titleBar};
@@ -1 +0,0 @@
1
- var e={withShortcut:`{{label}} ({{shortcut}})`,left:{pinnedOpen:`Recolher barra lateral esquerda (manter afixada)`,pinnedCollapsed:`Desafixar barra lateral esquerda`,unpinned:`Afixar barra lateral esquerda aberta`},right:{pinnedOpen:`Recolher barra lateral direita (manter afixada)`,pinnedCollapsed:`Desafixar barra lateral direita`,unpinned:`Afixar barra lateral direita aberta`}},t={addProject:`Adicionar projeto`,remove:`Remover {{name}}`,confirmRemove:`Confirmar remoção de {{name}}`,confirmShort:`confirmar?`,added:`Projeto adicionado: {{name}}`,removed:`Projeto removido`,expand:`Expandir {{name}}`,collapse:`Recolher {{name}}`,settings:`Configurações de {{name}}`,assembling:`A preparar o workspace…`,assembleFailed:`Falha ao preparar o workspace — clique para tentar novamente`},n={desktopTitle:`Desktop`,loops:`Loops`,docs:`Docs`,analytics:`Análises`,settings:`Definições`,plugins:`Plugins`,review:`Revisão`},r={loopsDescription:`Loops está aberto como modal de Mission.`,pluginsDescription:`Plugins está aberto como modal de Mission.`,reviewDescription:`O pacote de revisão está aberto como modal de missão.`},i={projectTitle:`Projeto`,dashboard:`Dashboard`,jobs:`Jobs`,analytics:`Análises`,agents:`Agentes`,code:`Código`,integrations:`Integrações`,settings:`Definições`},a={home:`Início`,analytics:`Análises`,docs:`Docs`,settings:`Definições`,noCli:`Sem CLI de IA`,noCliTooltip:`Nenhuma CLI de IA detetada. Instale Claude Code, Codex CLI, Gemini CLI ou Kimi Code.`,activeCli:`CLI ativa: {{label}}`},o={connected:`ligado`,syncing:`a sincronizar...`,reconnecting:`a religar...`,disconnected:`desligado`,connectionRestored:`Ligação restaurada`},s={searchShortcut:`Pesquisar (⌘K)`,searchPlaceholder:`Pesquisar…`,minimizeWindow:`Minimizar janela`,maximizeWindow:`Maximizar janela`,closeWindow:`Fechar janela`,restoreWindow:`Restaurar janela`},c={costAlertTitle:`Alerta de custo`,costAlertDescription:"Custo do job ${{cost}} — o limite é ${{threshold}}",dailyBudgetTitle:`Orçamento diário excedido`,dailyBudgetDescription:"Gastos ${{spent}} de ${{budget}} hoje. Fila em pausa.",desktopBudgetTitle:`Orçamento diário do Desktop excedido`,desktopBudgetDescription:"Gasto total do Desktop ${{spent}} de ${{budget}}. Fila em pausa.",bannerMessage:"Orçamento diário excedido — gastos ${{spent}} de ${{budget}}. A fila está em pausa.",dismiss:`Dispensar`},l={title:`Ocorreu um erro`,occurredIn:`Ocorreu um erro em <strong>{{name}}</strong>`},u={healthLabel:`saúde`,notAvailable:`n/d`,factorCoverageAvailable:`Cobertura disponível`,factorCoverageGood:`Cobertura ≥ 70%`,factorPipelineGreen:`Última pipeline verde`,factorActiveWeek:`Ativo esta semana`,noJobsYet:`Ainda não há jobs`,recurringFailures:`Falhas recorrentes detetadas`,failurePattern:`<cmd>{{command}}</cmd> falhou <times>{{count}}×</times> esta semana — possível problema do projeto.`,coverage:`Cobertura`,lines:`Linhas`,functions:`Funções`,branches:`Ramos`,lastPipeline:`Última pipeline`,recentCommits:`Commits recentes`,noGitHistory:`Sem histórico git`,minutesAgo:`há {{count}}m`,hoursAgo:`há {{count}}h`,daysAgo:`há {{count}}d`},d={dragToReorder:`Arraste para reordenar`,unpinAria:`Desafixar secção (ficará recolhida por predefinição)`,pinAria:`Afixar secção (ficará expandida)`,unpinTooltip:`Desafixar (recolhida por predefinição)`,pinTooltip:`Afixar aberta (manter expandida)`},f={sidebarPin:e,projects:t,arcSidebar:n,globalSurfaceModal:r,rightSidebar:i,navbar:a,statusBar:o,titleBar:s,costAlerts:c,errorBoundary:l,healthWidget:u,collapsibleSection:d};export{n as arcSidebar,d as collapsibleSection,c as costAlerts,f as default,l as errorBoundary,r as globalSurfaceModal,u as healthWidget,a as navbar,t as projects,i as rightSidebar,e as sidebarPin,o as statusBar,s as titleBar};
@@ -1 +0,0 @@
1
- import{r as e}from"./rolldown-runtime-CNC7AqOf.js";var t=e({arcSidebar:()=>i,collapsibleSection:()=>p,costAlerts:()=>u,default:()=>m,errorBoundary:()=>d,globalSurfaceModal:()=>a,healthWidget:()=>f,navbar:()=>s,projects:()=>r,rightSidebar:()=>o,sidebarPin:()=>n,statusBar:()=>c,titleBar:()=>l}),n={withShortcut:`{{label}} ({{shortcut}})`,left:{pinnedOpen:`Collapse left sidebar (keep pinned)`,pinnedCollapsed:`Unpin left sidebar`,unpinned:`Pin left sidebar open`},right:{pinnedOpen:`Collapse right sidebar (keep pinned)`,pinnedCollapsed:`Unpin right sidebar`,unpinned:`Pin right sidebar open`}},r={addProject:`Add project`,remove:`Remove {{name}}`,confirmRemove:`Confirm remove {{name}}`,confirmShort:`confirm?`,added:`Project added: {{name}}`,removed:`Project removed`,expand:`Expand {{name}}`,collapse:`Collapse {{name}}`,settings:`Settings for {{name}}`,assembling:`Setting up workspace…`,assembleFailed:`Workspace setup failed — click to retry`},i={desktopTitle:`Desktop`,loops:`Loops`,docs:`Docs`,analytics:`Analytics`,settings:`Settings`,plugins:`Plugins`,review:`Review`},a={loopsDescription:`Loops are open as a Mission modal.`,pluginsDescription:`Plugins are open as a Mission modal.`,reviewDescription:`The review packet is open as a Mission modal.`},o={projectTitle:`Project`,dashboard:`Dashboard`,jobs:`Jobs`,analytics:`Analytics`,agents:`Agents`,code:`Code`,integrations:`Integrations`,settings:`Settings`},s={home:`Home`,analytics:`Analytics`,docs:`Docs`,settings:`Settings`,noCli:`No AI CLI`,noCliTooltip:`No AI CLI detected. Install Claude Code, Codex CLI, Gemini CLI or Kimi Code.`,activeCli:`Active CLI: {{label}}`},c={connected:`connected`,syncing:`syncing...`,reconnecting:`reconnecting...`,disconnected:`disconnected`,connectionRestored:`Connection restored`},l={searchShortcut:`Search (⌘K)`,searchPlaceholder:`Search…`,minimizeWindow:`Minimize window`,maximizeWindow:`Maximize window`,closeWindow:`Close window`,restoreWindow:`Restore window`},u={costAlertTitle:`Cost alert`,costAlertDescription:"Job cost ${{cost}} — threshold is ${{threshold}}",dailyBudgetTitle:`Daily budget exceeded`,dailyBudgetDescription:"Spent ${{spent}} of ${{budget}} today. Queue paused.",desktopBudgetTitle:`Desktop daily budget exceeded`,desktopBudgetDescription:"Total Desktop spend ${{spent}} of ${{budget}}. Queue paused.",bannerMessage:"Daily budget exceeded — spent ${{spent}} of ${{budget}}. Queue is paused.",dismiss:`Dismiss`},d={title:`Something went wrong`,occurredIn:`An error occurred in <strong>{{name}}</strong>`},f={healthLabel:`health`,notAvailable:`n/a`,factorCoverageAvailable:`Coverage available`,factorCoverageGood:`Coverage ≥ 70%`,factorPipelineGreen:`Last pipeline green`,factorActiveWeek:`Active this week`,noJobsYet:`No jobs yet`,recurringFailures:`Recurring failures detected`,failurePattern:`<cmd>{{command}}</cmd> has failed <times>{{count}}×</times> this week — possible project issue.`,coverage:`Coverage`,lines:`Lines`,functions:`Functions`,branches:`Branches`,lastPipeline:`Last pipeline`,recentCommits:`Recent commits`,noGitHistory:`No git history found`,minutesAgo:`{{count}}m ago`,hoursAgo:`{{count}}h ago`,daysAgo:`{{count}}d ago`},p={dragToReorder:`Drag to reorder`,unpinAria:`Unpin section (will collapse by default)`,pinAria:`Pin section (will stay expanded)`,unpinTooltip:`Unpin (collapse by default)`,pinTooltip:`Pin open (stay expanded)`},m={sidebarPin:n,projects:r,arcSidebar:i,globalSurfaceModal:a,rightSidebar:o,navbar:s,statusBar:c,titleBar:l,costAlerts:u,errorBoundary:d,healthWidget:f,collapsibleSection:p};export{t};
@@ -1 +0,0 @@
1
- var e={withShortcut:`{{label}} ({{shortcut}})`,left:{pinnedOpen:`左サイドバーを折りたたむ (ピン留めは維持)`,pinnedCollapsed:`左サイドバーのピン留めを解除`,unpinned:`左サイドバーを開いた状態でピン留め`},right:{pinnedOpen:`右サイドバーを折りたたむ (ピン留めは維持)`,pinnedCollapsed:`右サイドバーのピン留めを解除`,unpinned:`右サイドバーを開いた状態でピン留め`}},t={addProject:`プロジェクトを追加`,remove:`{{name}} を削除`,confirmRemove:`{{name}} の削除を確認`,confirmShort:`削除しますか?`,added:`プロジェクトを追加しました: {{name}}`,removed:`プロジェクトを削除しました`,expand:`{{name}} を展開`,collapse:`{{name}} を折りたたむ`,settings:`{{name}} の設定`,assembling:`ワークスペースを準備中…`,assembleFailed:`ワークスペースの準備に失敗 — クリックして再試行`},n={desktopTitle:`Desktop`,loops:`Loops`,docs:`ドキュメント`,analytics:`分析`,settings:`設定`,plugins:`プラグイン`,review:`レビュー`},r={loopsDescription:`Loops は Mission のモーダルとして開いています。`,pluginsDescription:`Plugins は Mission のモーダルとして開いています。`,reviewDescription:`レビューパケットはミッションのモーダルとして開いています。`},i={projectTitle:`プロジェクト`,dashboard:`ダッシュボード`,jobs:`ジョブ`,analytics:`分析`,agents:`エージェント`,code:`コード`,integrations:`インテグレーション`,settings:`設定`},a={home:`ホーム`,analytics:`分析`,docs:`ドキュメント`,settings:`設定`,noCli:`AI CLI なし`,noCliTooltip:`AI CLI が見つかりません。Claude Code、Codex CLI、Gemini CLI、Kimi Code のいずれかをインストールしてください。`,activeCli:`使用中の CLI: {{label}}`},o={connected:`接続済み`,syncing:`同期中...`,reconnecting:`再接続中...`,disconnected:`切断`,connectionRestored:`接続が回復しました`},s={searchShortcut:`検索 (⌘K)`,searchPlaceholder:`検索…`,minimizeWindow:`ウィンドウを最小化`,maximizeWindow:`ウィンドウを最大化`,closeWindow:`ウィンドウを閉じる`,restoreWindow:`ウィンドウを元のサイズに戻す`},c={costAlertTitle:`コストアラート`,costAlertDescription:"ジョブのコストが ${{cost}} — しきい値は ${{threshold}} です",dailyBudgetTitle:`1 日の予算を超過しました`,dailyBudgetDescription:"本日 ${{budget}} のうち ${{spent}} を消費しました。キューを一時停止しました。",desktopBudgetTitle:`Desktop の 1 日の予算を超過しました`,desktopBudgetDescription:"Desktop 全体で ${{budget}} のうち ${{spent}} を消費。キューを一時停止しました。",bannerMessage:"1 日の予算を超過しました — ${{budget}} のうち ${{spent}} を消費。キューは一時停止中です。",dismiss:`閉じる`},l={title:`問題が発生しました`,occurredIn:`<strong>{{name}}</strong> でエラーが発生しました`},u={healthLabel:`ヘルス`,notAvailable:`n/a`,factorCoverageAvailable:`カバレッジあり`,factorCoverageGood:`カバレッジ ≥ 70%`,factorPipelineGreen:`直近のパイプラインが成功`,factorActiveWeek:`今週アクティブ`,noJobsYet:`ジョブはまだありません`,recurringFailures:`繰り返し発生する失敗を検出しました`,failurePattern:`<cmd>{{command}}</cmd> が今週 <times>{{count}}×</times> 失敗しました — プロジェクト側の問題の可能性があります。`,coverage:`カバレッジ`,lines:`行`,functions:`関数`,branches:`分岐`,lastPipeline:`直近のパイプライン`,recentCommits:`最近のコミット`,noGitHistory:`git 履歴が見つかりません`,minutesAgo:`{{count}}分前`,hoursAgo:`{{count}}時間前`,daysAgo:`{{count}}日前`},d={dragToReorder:`ドラッグで並べ替え`,unpinAria:`セクションのピン留めを解除 (デフォルトで折りたたみ)`,pinAria:`セクションをピン留め (常に展開)`,unpinTooltip:`ピン留め解除 (デフォルトで折りたたみ)`,pinTooltip:`ピン留めして開く (常に展開)`},f={sidebarPin:e,projects:t,arcSidebar:n,globalSurfaceModal:r,rightSidebar:i,navbar:a,statusBar:o,titleBar:s,costAlerts:c,errorBoundary:l,healthWidget:u,collapsibleSection:d};export{n as arcSidebar,d as collapsibleSection,c as costAlerts,f as default,l as errorBoundary,r as globalSurfaceModal,u as healthWidget,a as navbar,t as projects,i as rightSidebar,e as sidebarPin,o as statusBar,s as titleBar};
@@ -1 +0,0 @@
1
- var e={withShortcut:`{{label}} ({{shortcut}})`,left:{pinnedOpen:`Linke Seitenleiste einklappen (angepinnt lassen)`,pinnedCollapsed:`Linke Seitenleiste lösen`,unpinned:`Linke Seitenleiste offen anpinnen`},right:{pinnedOpen:`Rechte Seitenleiste einklappen (angepinnt lassen)`,pinnedCollapsed:`Rechte Seitenleiste lösen`,unpinned:`Rechte Seitenleiste offen anpinnen`}},t={addProject:`Projekt hinzufügen`,remove:`{{name}} entfernen`,confirmRemove:`Entfernen von {{name}} bestätigen`,confirmShort:`bestätigen?`,added:`Projekt hinzugefügt: {{name}}`,removed:`Projekt entfernt`,expand:`{{name}} aufklappen`,collapse:`{{name}} einklappen`,settings:`Einstellungen für {{name}}`,assembling:`Workspace wird eingerichtet…`,assembleFailed:`Workspace-Einrichtung fehlgeschlagen — zum Wiederholen klicken`},n={desktopTitle:`Desktop`,loops:`Loops`,docs:`Doku`,analytics:`Analytics`,settings:`Einstellungen`,plugins:`Plugins`,review:`Review`},r={loopsDescription:`Loops ist als Mission-Modal geöffnet.`,pluginsDescription:`Plugins ist als Mission-Modal geöffnet.`,reviewDescription:`Das Review-Paket ist als Missions-Modal geöffnet.`},i={projectTitle:`Projekt`,dashboard:`Dashboard`,jobs:`Jobs`,analytics:`Analytics`,agents:`Agenten`,code:`Code`,integrations:`Integrationen`,settings:`Einstellungen`},a={home:`Start`,analytics:`Analytics`,docs:`Doku`,settings:`Einstellungen`,noCli:`Keine AI-CLI`,noCliTooltip:`Keine AI-CLI gefunden. Installiere Claude Code, Codex CLI, Gemini CLI oder Kimi Code.`,activeCli:`Aktive CLI: {{label}}`},o={connected:`verbunden`,syncing:`synchronisiere...`,reconnecting:`verbinde neu...`,disconnected:`getrennt`,connectionRestored:`Verbindung wiederhergestellt`},s={searchShortcut:`Suchen (⌘K)`,searchPlaceholder:`Suchen…`,minimizeWindow:`Fenster minimieren`,maximizeWindow:`Fenster maximieren`,closeWindow:`Fenster schließen`,restoreWindow:`Fenster wiederherstellen`},c={costAlertTitle:`Kostenwarnung`,costAlertDescription:"Job-Kosten ${{cost}} – Schwellenwert ist ${{threshold}}",dailyBudgetTitle:`Tagesbudget überschritten`,dailyBudgetDescription:"Heute ${{spent}} von ${{budget}} ausgegeben. Warteschlange pausiert.",desktopBudgetTitle:`Desktop-Tagesbudget überschritten`,desktopBudgetDescription:"Desktop-Gesamtausgaben ${{spent}} von ${{budget}}. Warteschlange pausiert.",bannerMessage:"Tagesbudget überschritten – ${{spent}} von ${{budget}} ausgegeben. Warteschlange ist pausiert.",dismiss:`Schließen`},l={title:`Etwas ist schiefgelaufen`,occurredIn:`In <strong>{{name}}</strong> ist ein Fehler aufgetreten`},u={healthLabel:`Health`,notAvailable:`n. v.`,factorCoverageAvailable:`Coverage verfügbar`,factorCoverageGood:`Coverage ≥ 70 %`,factorPipelineGreen:`Letzte Pipeline grün`,factorActiveWeek:`Diese Woche aktiv`,noJobsYet:`Noch keine Jobs`,recurringFailures:`Wiederkehrende Fehler erkannt`,failurePattern:`<cmd>{{command}}</cmd> ist diese Woche <times>{{count}}×</times> fehlgeschlagen – mögliches Projektproblem.`,coverage:`Coverage`,lines:`Zeilen`,functions:`Funktionen`,branches:`Branches`,lastPipeline:`Letzte Pipeline`,recentCommits:`Letzte Commits`,noGitHistory:`Keine Git-Historie gefunden`,minutesAgo:`vor {{count}}m`,hoursAgo:`vor {{count}}h`,daysAgo:`vor {{count}}d`},d={dragToReorder:`Zum Neuanordnen ziehen`,unpinAria:`Abschnitt lösen (wird standardmäßig eingeklappt)`,pinAria:`Abschnitt anpinnen (bleibt ausgeklappt)`,unpinTooltip:`Lösen (standardmäßig einklappen)`,pinTooltip:`Offen anpinnen (bleibt ausgeklappt)`},f={sidebarPin:e,projects:t,arcSidebar:n,globalSurfaceModal:r,rightSidebar:i,navbar:a,statusBar:o,titleBar:s,costAlerts:c,errorBoundary:l,healthWidget:u,collapsibleSection:d};export{n as arcSidebar,d as collapsibleSection,c as costAlerts,f as default,l as errorBoundary,r as globalSurfaceModal,u as healthWidget,a as navbar,t as projects,i as rightSidebar,e as sidebarPin,o as statusBar,s as titleBar};
@@ -1 +0,0 @@
1
- var e={withShortcut:`{{label}} ({{shortcut}})`,left:{pinnedOpen:`Replier la barre latérale gauche (garder épinglée)`,pinnedCollapsed:`Désépingler la barre latérale gauche`,unpinned:`Épingler la barre latérale gauche ouverte`},right:{pinnedOpen:`Replier la barre latérale droite (garder épinglée)`,pinnedCollapsed:`Désépingler la barre latérale droite`,unpinned:`Épingler la barre latérale droite ouverte`}},t={addProject:`Ajouter un projet`,remove:`Supprimer {{name}}`,confirmRemove:`Confirmer la suppression de {{name}}`,confirmShort:`confirmer ?`,added:`Projet ajouté : {{name}}`,removed:`Projet supprimé`,expand:`Développer {{name}}`,collapse:`Réduire {{name}}`,settings:`Paramètres de {{name}}`,assembling:`Préparation du workspace…`,assembleFailed:`Échec de préparation du workspace — cliquer pour réessayer`},n={desktopTitle:`Desktop`,loops:`Loops`,docs:`Docs`,analytics:`Analytics`,settings:`Paramètres`,plugins:`Plugins`,review:`Revue`},r={loopsDescription:`Loops est ouvert comme modal Mission.`,pluginsDescription:`Plugins est ouvert comme modal Mission.`,reviewDescription:`Le dossier de revue est ouvert en modal de mission.`},i={projectTitle:`Projet`,dashboard:`Tableau de bord`,jobs:`Jobs`,analytics:`Analytics`,agents:`Agents`,code:`Code`,integrations:`Intégrations`,settings:`Paramètres`},a={home:`Accueil`,analytics:`Analytics`,docs:`Docs`,settings:`Paramètres`,noCli:`Aucune CLI IA`,noCliTooltip:`Aucune CLI IA détectée. Installez Claude Code, Codex CLI, Gemini CLI ou Kimi Code.`,activeCli:`CLI active : {{label}}`},o={connected:`connecté`,syncing:`synchronisation...`,reconnecting:`reconnexion...`,disconnected:`déconnecté`,connectionRestored:`Connexion rétablie`},s={searchShortcut:`Rechercher (⌘K)`,searchPlaceholder:`Rechercher…`,minimizeWindow:`Réduire la fenêtre`,maximizeWindow:`Agrandir la fenêtre`,closeWindow:`Fermer la fenêtre`,restoreWindow:`Restaurer la fenêtre`},c={costAlertTitle:`Alerte de coût`,costAlertDescription:`Coût du job : {{cost}} $ — le seuil est de {{threshold}} $`,dailyBudgetTitle:`Budget quotidien dépassé`,dailyBudgetDescription:`{{spent}} $ dépensés sur {{budget}} $ aujourd'hui. File d'attente en pause.`,desktopBudgetTitle:`Budget quotidien de Desktop dépassé`,desktopBudgetDescription:`Dépense totale de Desktop : {{spent}} $ sur {{budget}} $. File d'attente en pause.`,bannerMessage:`Budget quotidien dépassé — {{spent}} $ dépensés sur {{budget}} $. La file d'attente est en pause.`,dismiss:`Ignorer`},l={title:`Une erreur est survenue`,occurredIn:`Une erreur s'est produite dans <strong>{{name}}</strong>`},u={healthLabel:`santé`,notAvailable:`n/d`,factorCoverageAvailable:`Couverture disponible`,factorCoverageGood:`Couverture ≥ 70 %`,factorPipelineGreen:`Dernier pipeline au vert`,factorActiveWeek:`Actif cette semaine`,noJobsYet:`Aucun job pour l'instant`,recurringFailures:`Échecs récurrents détectés`,failurePattern:`<cmd>{{command}}</cmd> a échoué <times>{{count}}×</times> cette semaine — possible problème du projet.`,coverage:`Couverture`,lines:`Lignes`,functions:`Fonctions`,branches:`Branches`,lastPipeline:`Dernier pipeline`,recentCommits:`Commits récents`,noGitHistory:`Aucun historique git trouvé`,minutesAgo:`il y a {{count}} min`,hoursAgo:`il y a {{count}} h`,daysAgo:`il y a {{count}} j`},d={dragToReorder:`Glisser pour réorganiser`,unpinAria:`Désépingler la section (repliée par défaut)`,pinAria:`Épingler la section (restera dépliée)`,unpinTooltip:`Désépingler (repliée par défaut)`,pinTooltip:`Épingler ouverte (rester dépliée)`},f={sidebarPin:e,projects:t,arcSidebar:n,globalSurfaceModal:r,rightSidebar:i,navbar:a,statusBar:o,titleBar:s,costAlerts:c,errorBoundary:l,healthWidget:u,collapsibleSection:d};export{n as arcSidebar,d as collapsibleSection,c as costAlerts,f as default,l as errorBoundary,r as globalSurfaceModal,u as healthWidget,a as navbar,t as projects,i as rightSidebar,e as sidebarPin,o as statusBar,s as titleBar};