specrails-desktop 2.34.0 → 2.35.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 (209) hide show
  1. package/client/dist/assets/ActivityFeedPage-LCBJ5WiD.js +1 -0
  2. package/client/dist/assets/AgentBrowserCapture-B-xQpyZr.js +1 -0
  3. package/client/dist/assets/AgentModeAnalyticsPane-BI1Vcf3T.js +2 -0
  4. package/client/dist/assets/AgentModeCodePane-BTRwCl9h.js +2 -0
  5. package/client/dist/assets/AgentModeJobsPane-VzeBJLqP.js +1 -0
  6. package/client/dist/assets/AgentsPage-CJj1K24O.js +87 -0
  7. package/client/dist/assets/AnalyticsPage-CQpV5_fX.js +1 -0
  8. package/client/dist/assets/CodePage-9-tFh0jB.js +2 -0
  9. package/client/dist/assets/DesktopAnalyticsPage-BcZ0_O_C.js +1 -0
  10. package/client/dist/assets/DocsDialog-BPAzDICW.js +11 -0
  11. package/client/dist/assets/DocsPage-Dqo4Hn6G.js +11 -0
  12. package/client/dist/assets/IntegrationsPage-Bhy58lnQ.js +1 -0
  13. package/client/dist/assets/InteractiveJobComposer-D36fZWai.js +19 -0
  14. package/client/dist/assets/JobDetailModal-BxsktbkQ.js +1 -0
  15. package/client/dist/assets/JobDetailPage-WWyCy6Sp.js +1 -0
  16. package/client/dist/assets/JobsPage-CEbM7uxU.js +1 -0
  17. package/client/dist/assets/{LoopBuilderPage-WeiofeL6.js → LoopBuilderPage-CYsSN8io.js} +2 -2
  18. package/client/dist/assets/LoopPreviewModal-BJhgX5wY.js +1 -0
  19. package/client/dist/assets/LoopsPage-DB4OqMot.js +1 -0
  20. package/client/dist/assets/MinimizedChatsContext-CcjBHMHd.js +1 -0
  21. package/client/dist/assets/PluginsPage-CR8K4nM_.js +2 -0
  22. package/client/dist/assets/{ProjectSettingsDialog-BkCXBQWk.js → ProjectSettingsDialog-C45-qhF4.js} +1 -1
  23. package/client/dist/assets/ReviewPacketPage-Cz_QQeC3.js +1 -0
  24. package/client/dist/assets/TemplatePreviewModal-wFBd2vQP.js +1 -0
  25. package/client/dist/assets/TicketDetailModal-BvZoyDAL.js +14 -0
  26. package/client/dist/assets/{Trans-CTqw6rr9.js → Trans-DXZ-BLXb.js} +1 -1
  27. package/client/dist/assets/agent-BQgKv_2F.js +1 -0
  28. package/client/dist/assets/agent-C1NRDJqL.js +1 -0
  29. package/client/dist/assets/agent-CLNleiy6.js +1 -0
  30. package/client/dist/assets/agent-CmceArkQ.js +1 -0
  31. package/client/dist/assets/agent-D3UxQ3SR.js +1 -0
  32. package/client/dist/assets/agent-DB1JeE64.js +1 -0
  33. package/client/dist/assets/agent-DXkHcQ-D.js +1 -0
  34. package/client/dist/assets/agent-DjJJJ2M8.js +1 -0
  35. package/client/dist/assets/ban-E4EaZe3a.js +1 -0
  36. package/client/dist/assets/bot-DzuuuC5R.js +1 -0
  37. package/client/dist/assets/{browser-DxP-alBK.js → browser-BgqHDMXP.js} +1 -1
  38. package/client/dist/assets/{browser-CyR1Kp3m.js → browser-CsKJtrpv.js} +1 -1
  39. package/client/dist/assets/browser-Cu58EpZU.js +1 -0
  40. package/client/dist/assets/{browser-rRCwi7Y7.js → browser-CvXOJm-j.js} +1 -1
  41. package/client/dist/assets/{browser-CvgDySd9.js → browser-DOrFh1c7.js} +1 -1
  42. package/client/dist/assets/{browser-DwZljcRh.js → browser-DQv_Jo7x.js} +1 -1
  43. package/client/dist/assets/{browser-C25DkQiO.js → browser-LPgxvJu2.js} +1 -1
  44. package/client/dist/assets/{browser-CiJ7-L32.js → browser-eL-3MIEI.js} +1 -1
  45. package/client/dist/assets/button-CJqFnUOL.js +1 -0
  46. package/client/dist/assets/{chunk-KS7C4IRE-Cx5sqopX.js → chunk-KS7C4IRE-DEKu087k.js} +1 -1
  47. package/client/dist/assets/{commands-DyUZQ1FI.js → commands-6tYQih5m.js} +1 -1
  48. package/client/dist/assets/{commands-B9RZO4qS.js → commands-BK2QinXN.js} +1 -1
  49. package/client/dist/assets/{commands-Bbxu8kLU.js → commands-C2Nca76h.js} +1 -1
  50. package/client/dist/assets/{commands-CDU3qv68.js → commands-CKdLihNX.js} +1 -1
  51. package/client/dist/assets/{commands-DTQBF_q5.js → commands-CYIBTAlc.js} +1 -1
  52. package/client/dist/assets/{commands-hOtKuOXc.js → commands-CjUtYJIM.js} +1 -1
  53. package/client/dist/assets/{commands-BEwbAjtD.js → commands-Cq_u_8y9.js} +1 -1
  54. package/client/dist/assets/{commands-CzezgtQj.js → commands-D_ZHYQug.js} +1 -1
  55. package/client/dist/assets/core-B3mKBIh5.js +1 -0
  56. package/client/dist/assets/dashboard-B9GhC5ku.js +1 -0
  57. package/client/dist/assets/dashboard-C8WOEiPu.js +1 -0
  58. package/client/dist/assets/dashboard-CBnv6zOI.js +1 -0
  59. package/client/dist/assets/dashboard-CaP0fU87.js +1 -0
  60. package/client/dist/assets/dashboard-D4ZZ4x84.js +1 -0
  61. package/client/dist/assets/dashboard-DmuTQBX8.js +1 -0
  62. package/client/dist/assets/dashboard-DynLYj3d.js +1 -0
  63. package/client/dist/assets/dashboard-zj4gGFJ1.js +1 -0
  64. package/client/dist/assets/dialog-CdWCb02j.js +45 -0
  65. package/client/dist/assets/dist-js-CWeUdf5Z.js +1 -0
  66. package/client/dist/assets/dist-js-Rlh4FLH5.js +1 -0
  67. package/client/dist/assets/event-Bt7f3wXe.js +1 -0
  68. package/client/dist/assets/file-text-BcLCfcWZ.js +1 -0
  69. package/client/dist/assets/{formatDistanceToNow-BOuXgebD.js → formatDistanceToNow-C0ImhVKp.js} +1 -1
  70. package/client/dist/assets/{getTimezoneOffsetInMilliseconds-EjGOpn4b.js → getTimezoneOffsetInMilliseconds-owhDdTXs.js} +1 -1
  71. package/client/dist/assets/git-refresh-wTW0rO0Z.js +1 -0
  72. package/client/dist/assets/i18n-DwgvwTnx.js +2 -0
  73. package/client/dist/assets/index-DhjjFyU5.js +66 -0
  74. package/client/dist/assets/index-xBFsOEiJ.css +2 -0
  75. package/client/dist/assets/jira-api-CcZMcEN5.js +1 -0
  76. package/client/dist/assets/loops-B7YpGizO.js +1 -0
  77. package/client/dist/assets/{loops-CMMQOw2P.js → loops-BomD2J-h.js} +1 -1
  78. package/client/dist/assets/{loops-B2_97D26.js → loops-BrQHSQw3.js} +1 -1
  79. package/client/dist/assets/{loops-BwxCndZk.js → loops-BvBwvTPA.js} +1 -1
  80. package/client/dist/assets/{loops-BISOkuCu.js → loops-CODk6Slz.js} +1 -1
  81. package/client/dist/assets/{loops-CD19kEzq.js → loops-DC6k-Ym-.js} +1 -1
  82. package/client/dist/assets/{loops-aEb4RxN2.js → loops-DSEg8-uY.js} +1 -1
  83. package/client/dist/assets/{loops-Bo6w_peZ.js → loops-DhCoXD_v.js} +1 -1
  84. package/client/dist/assets/narration-4Z2VUhZw.js +1 -0
  85. package/client/dist/assets/narration-BGuiEDj3.js +1 -0
  86. package/client/dist/assets/narration-BuSoqRmv.js +1 -0
  87. package/client/dist/assets/narration-CB9t29fy.js +1 -0
  88. package/client/dist/assets/narration-CU3x8FHD.js +1 -0
  89. package/client/dist/assets/narration-CWeXhfP5.js +1 -0
  90. package/client/dist/assets/narration-DRaDnhT5.js +1 -0
  91. package/client/dist/assets/narration-DtEbQgCw.js +1 -0
  92. package/client/dist/assets/packet-B1IxaL5f.js +1 -0
  93. package/client/dist/assets/packet-Bh5kkbiB.js +1 -0
  94. package/client/dist/assets/packet-By8fqYxW.js +1 -0
  95. package/client/dist/assets/packet-CZdvA44E.js +1 -0
  96. package/client/dist/assets/packet-CrjHRQCP.js +1 -0
  97. package/client/dist/assets/packet-Dwi2pTtx.js +1 -0
  98. package/client/dist/assets/packet-_-ZIa0IR.js +1 -0
  99. package/client/dist/assets/packet-n0W6E1Hn.js +1 -0
  100. package/client/dist/assets/save-B6wGWwBR.js +1 -0
  101. package/client/dist/assets/settings-Bd0x4TBa.js +1 -0
  102. package/client/dist/assets/settings-C1-7cXzC.js +1 -0
  103. package/client/dist/assets/settings-CAFaT38b.js +1 -0
  104. package/client/dist/assets/settings-Ct3v1nW2.js +1 -0
  105. package/client/dist/assets/settings-DHh7_IF5.js +1 -0
  106. package/client/dist/assets/settings-DQXAmdcv.js +1 -0
  107. package/client/dist/assets/settings-guzlhpup.js +1 -0
  108. package/client/dist/assets/settings-sZfTPMEH.js +1 -0
  109. package/client/dist/assets/{spending-BpYPsevQ.js → spending-BQX3P7Cq.js} +1 -1
  110. package/client/dist/assets/useDesktop-BzX769yH.js +1 -0
  111. package/client/dist/index.html +29 -31
  112. package/docs/internals/embedded-browser-native-webview-evaluation.md +161 -0
  113. package/docs/internals/review-packet.md +212 -0
  114. package/package.json +1 -1
  115. package/server/dist/accept-ladder.js +61 -0
  116. package/server/dist/agent-chat-manager.js +22 -1
  117. package/server/dist/agent-defaults.js +359 -0
  118. package/server/dist/agent-operator-prompt.js +13 -5
  119. package/server/dist/browser-playwright.js +39 -2
  120. package/server/dist/db.js +38 -0
  121. package/server/dist/delivery-evidence.js +242 -0
  122. package/server/dist/desktop-router.js +23 -0
  123. package/server/dist/feature-flags.js +23 -0
  124. package/server/dist/loop-command-catalog.js +33 -0
  125. package/server/dist/loop-executors.js +12 -2
  126. package/server/dist/loop-factory.js +16 -1
  127. package/server/dist/loops-router.js +2 -0
  128. package/server/dist/mcp/tools/rails.js +16 -0
  129. package/server/dist/project-registry.js +33 -1
  130. package/server/dist/project-router-loop-runs.js +27 -2
  131. package/server/dist/providers/claude-adapter.js +60 -3
  132. package/server/dist/queue-manager.js +47 -4
  133. package/server/dist/rail-isolated-launch.js +119 -5
  134. package/server/dist/rail-pr-store.js +40 -3
  135. package/server/dist/rail-worktree-release.js +17 -1
  136. package/server/dist/rails-router.js +124 -3
  137. package/server/dist/review-packet.js +327 -0
  138. package/server/dist/revision-seed.js +73 -0
  139. package/server/dist/run-duration-stats.js +71 -0
  140. package/server/dist/stuck-run-detector.js +153 -0
  141. package/server/dist/telemetry-receiver.js +22 -0
  142. package/server/dist/worktree-node-modules.js +138 -16
  143. package/client/dist/assets/ActivityFeedPage-DIDxNsDj.js +0 -1
  144. package/client/dist/assets/AgentBrowserCapture-7pJ2G5VY.js +0 -1
  145. package/client/dist/assets/AgentModeAnalyticsPane-BSSyTnTM.js +0 -2
  146. package/client/dist/assets/AgentModeCodePane-DzW6gvDw.js +0 -2
  147. package/client/dist/assets/AgentModeJobsPane-9wJff15f.js +0 -1
  148. package/client/dist/assets/AgentsPage-CIA67psb.js +0 -87
  149. package/client/dist/assets/AnalyticsPage-C0LwYELz.js +0 -1
  150. package/client/dist/assets/CodePage-RtKvHmAO.js +0 -2
  151. package/client/dist/assets/DesktopAnalyticsPage-BU8Y_Ts1.js +0 -1
  152. package/client/dist/assets/DocsDialog-DIpoaGlQ.js +0 -11
  153. package/client/dist/assets/DocsPage-ME47KZpK.js +0 -11
  154. package/client/dist/assets/IntegrationsPage-Bs00_tl4.js +0 -1
  155. package/client/dist/assets/InteractiveJobComposer-BGjIe9R6.js +0 -19
  156. package/client/dist/assets/JobDetailModal-1UZkqH4I.js +0 -1
  157. package/client/dist/assets/JobDetailPage-CN65sAf1.js +0 -1
  158. package/client/dist/assets/JobsPage-f-4dqys7.js +0 -1
  159. package/client/dist/assets/LoopPreviewModal-DDTnTyH0.js +0 -1
  160. package/client/dist/assets/LoopsPage-BVNchIex.js +0 -1
  161. package/client/dist/assets/MinimizedChatsContext-CHsu3NCX.js +0 -1
  162. package/client/dist/assets/PluginsPage-CdFzGEfQ.js +0 -2
  163. package/client/dist/assets/TemplatePreviewModal-RDi0khFG.js +0 -1
  164. package/client/dist/assets/TicketDetailModal-MhJzrqbi.js +0 -14
  165. package/client/dist/assets/agent-Bd-q3Wqp.js +0 -1
  166. package/client/dist/assets/agent-BlvdW4Hv.js +0 -1
  167. package/client/dist/assets/agent-C-KQhxeM.js +0 -1
  168. package/client/dist/assets/agent-Ca15w5eu.js +0 -1
  169. package/client/dist/assets/agent-D6fKaoMd.js +0 -1
  170. package/client/dist/assets/agent-HFMYMTbB.js +0 -1
  171. package/client/dist/assets/agent-QIEbkBjg.js +0 -1
  172. package/client/dist/assets/agent-mTCsAbCl.js +0 -1
  173. package/client/dist/assets/api-B2M7CtDw.js +0 -1
  174. package/client/dist/assets/arrow-left-CpIR4j7G.js +0 -1
  175. package/client/dist/assets/arrow-up-right-9DoMn7fD.js +0 -1
  176. package/client/dist/assets/browser-CXUcnTMI.js +0 -1
  177. package/client/dist/assets/button-BUIIBQPT.js +0 -1
  178. package/client/dist/assets/chevron-right-CViMxucY.js +0 -1
  179. package/client/dist/assets/dashboard-BHRqsGCV.js +0 -1
  180. package/client/dist/assets/dashboard-Bfr90vOl.js +0 -1
  181. package/client/dist/assets/dashboard-CTsM8x3m.js +0 -1
  182. package/client/dist/assets/dashboard-CqC6wX0h.js +0 -1
  183. package/client/dist/assets/dashboard-CuZtAszc.js +0 -1
  184. package/client/dist/assets/dashboard-DAcqIc-n.js +0 -1
  185. package/client/dist/assets/dashboard-DekiV-86.js +0 -1
  186. package/client/dist/assets/dashboard-DoDczc5S.js +0 -1
  187. package/client/dist/assets/dialog-CzIekCw0.js +0 -45
  188. package/client/dist/assets/dist-Cez5CRkX.js +0 -1
  189. package/client/dist/assets/dist-js-BmsFWRly.js +0 -1
  190. package/client/dist/assets/dist-js-J5W_N5ng.js +0 -1
  191. package/client/dist/assets/external-link-BcU5EWZp.js +0 -1
  192. package/client/dist/assets/file-text-CFT-xXKN.js +0 -1
  193. package/client/dist/assets/i18n-nJQvD5zJ.js +0 -2
  194. package/client/dist/assets/index-C_sdsSZt.js +0 -63
  195. package/client/dist/assets/index-DCN5QbDm.css +0 -2
  196. package/client/dist/assets/jira-api-Bhixwn-d.js +0 -1
  197. package/client/dist/assets/loops-CnxqL8IL.js +0 -1
  198. package/client/dist/assets/save-28sIlCdr.js +0 -1
  199. package/client/dist/assets/settings-BveOJoaI.js +0 -1
  200. package/client/dist/assets/settings-Cj1C6F5k.js +0 -1
  201. package/client/dist/assets/settings-CuVwOpe0.js +0 -1
  202. package/client/dist/assets/settings-D5X4DfRc.js +0 -1
  203. package/client/dist/assets/settings-DXwxe-BW.js +0 -1
  204. package/client/dist/assets/settings-Di81Ba_V.js +0 -1
  205. package/client/dist/assets/settings-jbLjCYC_.js +0 -1
  206. package/client/dist/assets/settings-wIZNPFnn.js +0 -1
  207. package/client/dist/assets/useBrowserCaptureSession-BBXBN0Na.js +0 -1
  208. package/client/dist/assets/useDesktop-B6Du2N83.js +0 -1
  209. package/client/dist/assets/useSharedWebSocket-DK96ctb7.js +0 -1
@@ -1 +1 @@
1
- var e=`Loops`,t=`Loop di automazione riutilizzabili — condivisi tra tutti i tuoi progetti.`,n=`Nuovo loop`,r={drafts:`Bozze`,published:`Pubblicati`,templates:`Modelli`,builtIn:`Integrati`},i={search:`Cerca modelli…`,noResults:`Nessun modello corrisponde ai filtri.`,clearFilter:`Cancella filtri`,resultCount_one:`{{count}} modello`,resultCount_other:`{{count}} modelli`,needsSpec:`Richiede spec`,standalone:`Autonoma`,needsSpecHint:`Gira su una rail con una spec trascinata`,standaloneHint:`Gira da sola — basta scegliere un progetto`},a={API:`API`,Automation:`Automazione`,CI:`CI`,Database:`Database`,Debugging:`Debug`,DevOps:`DevOps`,Docs:`Docs`,Git:`Git`,Maintenance:`Manutenzione`,Performance:`Prestazioni`,Planning:`Pianificazione`,Quality:`Qualità`,Review:`Revisione`,Security:`Sicurezza`,Testing:`Test`},o={draft:`Bozza`,published:`Pubblicato`,running:`In esecuzione`},s={title:`Ancora nessun loop`,body:`Creane uno da zero o parti da un modello.`},c={edit:`Modifica`,delete:`Elimina`,publish:`Pubblica`,unpublish:`Annulla pubblicazione`,duplicate:`Duplica`,use:`Usa modello`,preview:`Anteprima`,fork:`Fork per modificare`,run:`Esegui`,export:`Esporta`,import:`Importa`,select:`Seleziona {{name}}`},l={nodes_one:`{{count}} nodo`,nodes_other:`{{count}} nodi`,usedIn:`In uso · {{project}}`},u=`Eliminare questo loop? Scomparirà da ogni selettore di rail.`,d=`Nuovo loop`,f={load:`Impossibile caricare i loop`,save:`Impossibile salvare il loop`,publishInvalid:`Questo loop non può ancora essere pubblicato — correggi i problemi evidenziati.`},p={back:`Torna ai loop`,save:`Salva`,saved:`Loop salvato`,publish:`Pubblica`,published:`Loop pubblicato`,addNode:`Aggiungi nodo`,deleteNode:`Elimina nodo`,config:{maxIterations:`Iterazioni massime`,timeout:`Timeout (min)`,maxIterationsHint:`Limite massimo di iterazioni del Loop Decider — il loop si ferma al raggiungimento anche se l'obiettivo non è soddisfatto. Evita loop infiniti.`,timeoutHint:`Limite di tempo reale per l'intera esecuzione, in minuti. Se superato, l'esecuzione viene interrotta e segnata come fallita — una rete di sicurezza insieme alle iterazioni massime.`,maxCost:`Costo max ($)`,maxCostHint:`Budget USD opzionale per l’intera esecuzione. Controllato TRA i passi (il costo di un passo si conosce solo al termine), il loop si ferma prima del passo successivo quando il totale lo supera — può sforare di un passo. Per i provider non-Claude il costo è stimato. Vuoto = nessun limite.`},nodes:{start:`Inizio`,"ai-step":`Passo IA`,shell:`Shell`,decider:`Decisore del loop`,condition:`Condizione`,end:`Fine`},inspector:{selectNode:`Seleziona un nodo per modificarlo.`,prompt:`Prompt`,provider:`Provider`,model:`Modello`,effort:`Sforzo di ragionamento`,command:`Comando`,goal:`Obiettivo / criteri di arresto`,join:`Unione`,outcome:`Esito`,startNote:`Il punto di ingresso del loop. Collegalo al primo passo.`,promptHint:`Clicca o trascina un token per inserirlo nel prompt.`,tokensSpec:`Campi della spec`,tokensJira:`Jira`,tokensCommands:`Comandi`,label:`Nome`},branch:{continue:`↻ Continua`,stop:`✓ Ferma`},edgesHelp:{label:`Come si collegano i passaggi`,body:`Le frecce definiscono l'ORDINE di esecuzione, non i dati — i box non hanno porte di input e gli archi non trasportano parametri. Ogni AI Step riprende automaticamente la propria sessione (intero contesto precedente) più un breve riepilogo dei passaggi precedenti; nulla viene collegato a mano. Il Loop Decider ha due uscite: ↻ Continua (obiettivo non raggiunto → torna al ciclo) e ✓ Ferma (obiettivo raggiunto → esci).`},arrange:{label:`Disponi`,vertical:`Verticale`,horizontal:`Orizzontale`,grid:`Griglia`,reset:`Reimposta`},constants:{label:`Costanti`,manage:`Gestisci costanti`,title:`Costanti del loop`,empty:`Ancora nessuna costante personalizzata.`,name:`NOME`,value:`valore`,add:`Aggiungi`,builtinBadge:`Integrate`},paste:{done_one:`{{count}} passo incollato`,done_other:`{{count}} passi incollati`},problems:{count_one:`{{count}} problema`,count_other:`{{count}} problemi`,NO_START:`Aggiungi un nodo di Avvio.`,MULTIPLE_START:`È consentito un solo nodo di Avvio.`,NO_END:`Aggiungi almeno un nodo di Fine.`,ORPHAN:`Questo passo non è raggiungibile dall'Avvio.`,DECIDER_BRANCHES:`Il Loop Decider richiede un ramo Continua e uno Ferma.`,EMPTY_PROMPT:`L'AI Step ha il prompt vuoto.`,EMPTY_COMMAND:`Il passo Shell ha il comando vuoto.`,EMPTY_GOAL:`Il Loop Decider non ha un obiettivo.`,DEAD_END:`Questo passo non ha connessioni in uscita.`},preview:{label:`Anteprima`,title:`Anteprima (dry-run)`,sampleNote:`I valori dello spec sono di esempio; comandi e costanti si risolvono come a runtime.`,empty:`Nessun passo da visualizzare.`,error:`Anteprima non riuscita`}},m={steps:`Passi`,limits:`max {{iterations}} iterazioni · {{timeout}} min di timeout`,limitsNoTimeout:`max {{iterations}} iterazioni · nessun timeout`,openInBuilder:`Apri nel builder`,builtin:`Integrato`},h=`Integrato`,g={title:`Esegui {{name}}`,subtitle:`Avvia questo loop su un progetto (senza ticket).`,project:`Progetto`,provider:`Provider`,model:`Modello`,effort:`Sforzo di ragionamento`,execute:`Esegui`,noProjects:`Nessun progetto disponibile.`,launched:`Esecuzione di {{name}}`},_=JSON.parse(`{"ship-and-green":{"name":"Ship & Green","description":"Completamente autonomo: implementa la spec, verifica e affina (corregge) in caso di fallimento — ripetendo il ciclo verifica → correggi → verifica finché tutto è verde. Nessun intervento umano."},"verify-pass":{"name":"Verify Pass","description":"Verifica e correzione autonome: rileva ed esegue build/lint/test del progetto, poi affina in caso di fallimento — verifica → correggi → verifica finché è verde."},"ci-watch":{"name":"CI Watch","description":"Controlla i check di CI sulla PR aperta (l'agente usa gli strumenti di CI del repository) finché ogni check non è verde."},"lint-and-fix":{"name":"Lint & Fix","description":"L'agente rileva ed esegue il linter del progetto e corregge ogni problema, iterando finché il codice non è pulito."},"type-safe":{"name":"Type Safe","description":"L'agente rileva ed esegue il type checker del progetto e risolve ogni errore, iterando finché non passa senza errori."},"coverage-climb":{"name":"Coverage Climb","description":"L'agente esegue gli strumenti di copertura del progetto e aggiunge test mirati finché le soglie non vengono superate."},"build-fix":{"name":"Build Fix","description":"L'agente rileva ed esegue il build di produzione del progetto e corregge gli errori di compilazione/bundle finché non è verde."},"deploy-check":{"name":"Deploy Check","description":"L'agente controlla lo stato di deploy/salute (usando gli strumenti di deploy del progetto) finché il servizio non risulta integro."},"factory_implement":{"name":"Implementa","description":"Completamente autonomo: implementa la spec, verifica e affina (corregge) in caso di fallimento — ripetendo il ciclo finché tutti i test non passano."},"factory_batch":{"name":"Implementa in batch","description":"Implementa in batch tutti i ticket del rail in una sola volta, poi verifica + affina in caso di fallimento finché non è verde."},"factory_freestyle":{"name":"Freestyle","description":"Consegna la spec direttamente al modello con piena libertà — senza pipeline, lavora come un normale coding agent, poi verifica + rifinisce fino al verde. Solo Claude."},"autoloop-tdd":{"name":"Autoloop TDD","description":"Un ciclo rigoroso red-green-refactor per {{spec.title}}: fissa ogni comportamento con un test che prima fallisce, scrivi solo il codice necessario a farlo passare, poi rifinisci — ripetendo finché la spec non è coperta del tutto."},"e2e-until-green":{"name":"E2E fino al verde","description":"Esegui la suite end-to-end per {{spec.title}}, diagnostica ogni flusso utente che fallisce, correggi il difetto di UI o integrazione alla radice e ripeti finché ogni spec E2E non passa."},"flaky-test-triage":{"name":"Triage test instabili","description":"Riesegui più volte i test che falliscono attorno a {{spec.title}} per distinguere le vere regressioni dai fallimenti intermittenti, poi correggi i problemi reali e stabilizza o documenta quelli instabili."},"independent-verifier-pass":{"name":"Verifica indipendente","description":"Una verifica avversariale di {{spec.title}}: riesegui da zero build, lint e test, fidati solo dell'output grezzo dei comandi (non delle dichiarazioni 'funziona') e individua o correggi ogni lacuna."},"post-edit-test-guard":{"name":"Guardia test post-modifica","description":"Dopo ogni gruppo di modifiche per {{spec.title}}, esegui subito il set di test più ristretto che tocca i file cambiati — cogliendo le regressioni nel momento in cui appaiono, non alla fine."},"post-merge-regression-guard":{"name":"Guardia post-merge","description":"Subito dopo che un merge o un rebase porta il lavoro altrui in {{spec.title}}, esegui lo smoke test rapido per cogliere subito le rotture di integrazione — prima di costruirci sopra qualunque nuova funzionalità."},"pre-commit-guard":{"name":"Guardia pre-commit","description":"Un cancello di sicurezza per {{spec.title}} che intercetta ogni commit: esegue prima la suite di test e rifiuta il commit finché è rossa, così il codice rotto non entra mai nella storia."},"visual-regression-until-match":{"name":"Regressione visiva fino al match","description":"Cattura snapshot visivi della UI modificata, scova ogni differenza di pixel non voluta e correggi finché la suite visiva non è verde, con approvate solo le modifiche di design intenzionali."},"format-until-clean":{"name":"Formatta fino a pulito","description":"Applica il formatter del progetto, sistema i pochi problemi di stile che non riesce a correggere da solo e prosegui finché una nuova formattazione non lascia il working tree intatto."},"lint-typecheck-fix":{"name":"Correggi lint e tipi","description":"Esegui il lint e il type checker, risolvi ogni problema segnalato con la modifica più piccola possibile e ripeti finché entrambi i controlli non tornano del tutto puliti."},"a11y-audit-until-clean":{"name":"Audit a11y fino a pulito","description":"Esegui i controlli automatici di accessibilità sulle schermate modificate, correggi le violazioni una categoria alla volta e ripeti finché l'audit non torna senza alcun problema."},"de-sloppify-pass":{"name":"Passata di pulizia","description":"Dopo che la funzionalità è pronta, setaccia il diff per residui di sciatteria — output di debug, rami morti, nomi approssimativi, funzioni gonfie — ripuliscili e dimostra che la pulizia non ha rotto nulla."},"fix-ci-until-green":{"name":"Correggi la CI fino al verde","description":"Recupera l'ultima esecuzione CI rossa su questo branch, riproduci la rottura sulla tua macchina, correggi la vera causa, fai push e ripeti finché ogni check non riporta successo."},"pr-babysitter":{"name":"Babysitter PR","description":"A intervalli regolari, passa in rassegna le pull request che segui e mantieni ognuna mergeabile: rianima la CI rossa, fai il rebase di quelle rimaste indietro rispetto al branch base e sollecita quelle ferme — escalando tutto ciò che deve decidere una persona."},"pr-watch-loop":{"name":"Loop di monitoraggio PR","description":"Controlla a cadenza costante le pull request nella tua watch list, riassumi lo stato di CI e review di ognuna e risolvi i blocchi banali o evidenzia ciò che richiede un proprietario."},"pr-self-review":{"name":"Auto-review della PR","description":"Critica il tuo diff di lavoro come farebbe un reviewer senior esigente, risolvi ciò che trovi e ripeti la review finché una passata pulita non rivela nulla di critico — prima ancora che la PR lasci le tue mani."},"spec-first-ship":{"name":"Prima la spec","description":"Porta a termine una checklist di requisiti scritti un elemento alla volta — ogni passata implementa un singolo requisito non spuntato, lo dimostra e lo segna fatto — così la spec è il contratto del 'completato'."},"dependency-audit-weekly":{"name":"Audit dipendenze settimanale","description":"Ogni settimana fai il punto su quali pacchetti sono rimasti indietro, dividili tra sicuri da aggiornare e rischiosi e restituisci un piano di upgrade chiaro e attuabile."},"dependency-upgrade-one-by-one":{"name":"Aggiorna le dipendenze una alla volta","description":"Aggiorna esattamente un pacchetto obsoleto per passata, ripara ciò che l'aggiornamento rompe, dimostra che il progetto funziona ancora e fai commit — molto più sicuro che aggiornare tutto insieme."},"knip-until-clean":{"name":"Elimina il codice morto","description":"Scova export non referenziati, file orfani e dipendenze che nessuno importa, rimuovili in sicurezza e prosegui finché lo scanner del codice morto non ha più nulla da segnalare."},"docs-sync-after-edits":{"name":"Allinea i doc al codice","description":"Dopo un giro di modifiche al codice, rintraccia ogni documento toccato dai cambiamenti — README, riferimento API, commenti inline — e riallinealo a come il codice si comporta davvero ora."},"security-audit-weekly":{"name":"Audit sicurezza settimanale","description":"Esegui ogni settimana una scansione delle vulnerabilità sull'albero delle dipendenze, fai il triage di ciò che emerge per gravità ed esposizione reale e restituisci un piano di remediation prioritizzato."},"npm-audit-fix-loop":{"name":"Correggi le vulnerabilità una alla volta","description":"Risolvi gli advisory critici e ad alta gravità delle dipendenze in modo deliberato — una correzione per passata, ognuna verificata contro la suite di test — invece di un force-fix alla cieca che può rompere la build di nascosto."},"api-contract-until-match":{"name":"Contratto API fino al match","description":"Porta avanti l'implementazione finché le sue risposte non rispettano il contratto API pubblicato, colmando ogni divario tra ciò che lo schema promette e ciò che gli handler restituiscono davvero."},"openapi-sync-until-valid":{"name":"Sync OpenAPI fino a valido","description":"Mantieni il documento OpenAPI ben formato e fedele agli handler delle route reali, riparando errori di spec e divergenze codice-doc a ogni passata finché il lint non è soddisfatto."},"migration-until-applied":{"name":"Migrazione fino ad applicata","description":"Porta avanti lo schema del database in modo pulito: esegui le migrazioni pendenti, ripara eventuali errori di schema o SQL che emergono e verifica che la storia delle migrazioni resti coerente."},"bundle-size-budget":{"name":"Budget dimensione bundle","description":"Rilascia la funzionalità senza gonfiare il bundle client oltre il suo budget — misura a ogni passata e taglia, fai code-split o lazy-load finché il controllo sulla dimensione non è verde."},"changelog-sync-after-ship":{"name":"Sync changelog dopo il rilascio","description":"Dopo il rilascio, assicurati che il changelog racconti la storia rivolta all'utente: rivedi cosa è stato rilasciato, scrivi le voci in stile Keep a Changelog e verifica che nulla di visibile sia stato omesso."},"guardrails-learning-loop":{"name":"Loop con guardrail","description":"Continua a iterare sui controlli finché non diventano verdi, ma ogni volta che un check fallisce allo stesso modo due volte, scrivi prima una nota guardrail così il loop non spreca mai iterazioni ritentando un approccio già fallito."},"ralph-story-executor":{"name":"Esecutore di story","description":"Lavora un backlog di user story una alla volta con un contesto fresco a ogni passata: scegli la prossima story incompiuta, costruisci solo quella, dimostra che i controlli del progetto restano verdi, fai commit e segnala completata prima di proseguire."},"investigation-script-loop":{"name":"Loop di script d'indagine","description":"Individua empiricamente la vera causa di un bug: scrivi un piccolo script usa e getta che esercita il comportamento sospetto, eseguilo, leggi l'output reale e affina la sonda finché l'output stesso non prova la causa radice."},"reflexion-debug-loop":{"name":"Loop di debug riflessivo","description":"Fai diventare verde un test che fallisce senza girare a vuoto: ogni volta che un tentativo fallisce, registra una breve riflessione su disco e consultala prima del tentativo successivo, così il loop non ripete mai una correzione già esclusa."},"merge-conflict-resolver":{"name":"Risolutore di conflitti merge","description":"Aggiorna il branch rispetto al suo target con un rebase, poi risolvi ogni conflitto file per file preservando l'intento di entrambe le parti e dimostra che il risultato passa ancora prima di dichiarare il branch aggiornato."},"staging-smoke-test":{"name":"Smoke test su staging","description":"Dopo un deploy su staging, percorri una checklist di smoke fissa — auth, i percorsi utente principali e le integrazioni chiave — correggendo il problema più piccolo ogni volta che qualcosa si rompe e rieseguendo finché tutta la checklist non torna pulita."},"deploy-verification-loop":{"name":"Loop di verifica deploy","description":"Dopo che un deploy è andato in produzione, interroga a intervalli gli endpoint di health e smoke, indaga e correggi o esegui escalation per ogni risposta non sana, e continua a controllare finché ogni endpoint configurato non riporta successo."},"factory_openspec":{"name":"OpenSpec Lifecycle","description":"Ciclo OpenSpec dal ticket all'archivio: genera artefatti (opsx:ff) → implementa (opsx:apply) → verifica (opsx:verify); con FAIL torna indietro ed emenda lo stesso change, con PASS lo archivia senza intervento."}}`),v={title:e,subtitle:t,newLoop:n,sections:r,gallery:i,categories:a,status:o,empty:s,actions:c,card:l,confirmDelete:u,newLoopName:d,errors:f,builder:p,preview:m,builtInBadge:h,run:g,catalog:_,import:{done_one:`{{count}} loop importato`,done_other:`{{count}} loop importati`,skipped_one:`{{count}} duplicato saltato: {{names}}`,skipped_other:`{{count}} duplicati saltati: {{names}}`,invalid:`Quel file non è un export di loop valido.`}};export{c as actions,p as builder,h as builtInBadge,l as card,_ as catalog,a as categories,u as confirmDelete,v as default,s as empty,f as errors,i as gallery,n as newLoop,d as newLoopName,m as preview,g as run,r as sections,o as status,t as subtitle,e as title};
1
+ var e=`Loops`,t=`Loop di automazione riutilizzabili — condivisi tra tutti i tuoi progetti.`,n=`Nuovo loop`,r={drafts:`Bozze`,published:`Pubblicati`,templates:`Modelli`,builtIn:`Integrati`},i={search:`Cerca modelli…`,noResults:`Nessun modello corrisponde ai filtri.`,clearFilter:`Cancella filtri`,resultCount_one:`{{count}} modello`,resultCount_other:`{{count}} modelli`,needsSpec:`Richiede spec`,standalone:`Autonoma`,needsSpecHint:`Gira su una rail con una spec trascinata`,standaloneHint:`Gira da sola — basta scegliere un progetto`},a={API:`API`,Automation:`Automazione`,CI:`CI`,Database:`Database`,Debugging:`Debug`,DevOps:`DevOps`,Docs:`Docs`,Git:`Git`,Maintenance:`Manutenzione`,Performance:`Prestazioni`,Planning:`Pianificazione`,Quality:`Qualità`,Review:`Revisione`,Security:`Sicurezza`,Testing:`Test`},o={draft:`Bozza`,published:`Pubblicato`,running:`In esecuzione`},s={title:`Ancora nessun loop`,body:`Creane uno da zero o parti da un modello.`},c={edit:`Modifica`,delete:`Elimina`,publish:`Pubblica`,unpublish:`Annulla pubblicazione`,duplicate:`Duplica`,use:`Usa modello`,preview:`Anteprima`,fork:`Fork per modificare`,run:`Esegui`,export:`Esporta`,import:`Importa`,select:`Seleziona {{name}}`},l={nodes_one:`{{count}} nodo`,nodes_other:`{{count}} nodi`,usedIn:`In uso · {{project}}`},u=`Eliminare questo loop? Scomparirà da ogni selettore di rail.`,d=`Nuovo loop`,f={load:`Impossibile caricare i loop`,save:`Impossibile salvare il loop`,publishInvalid:`Questo loop non può ancora essere pubblicato — correggi i problemi evidenziati.`},p={back:`Torna ai loop`,save:`Salva`,saved:`Loop salvato`,publish:`Pubblica`,published:`Loop pubblicato`,addNode:`Aggiungi nodo`,deleteNode:`Elimina nodo`,config:{maxIterations:`Iterazioni massime`,timeout:`Timeout (min)`,maxIterationsHint:`Limite massimo di iterazioni del Loop Decider — il loop si ferma al raggiungimento anche se l'obiettivo non è soddisfatto. Evita loop infiniti.`,timeoutHint:`Limite di tempo reale per l'intera esecuzione, in minuti. Se superato, l'esecuzione viene interrotta e segnata come fallita — una rete di sicurezza insieme alle iterazioni massime.`,maxCost:`Costo max ($)`,maxCostHint:`Budget USD opzionale per l’intera esecuzione. Controllato TRA i passi (il costo di un passo si conosce solo al termine), il loop si ferma prima del passo successivo quando il totale lo supera — può sforare di un passo. Per i provider non-Claude il costo è stimato. Vuoto = nessun limite.`},nodes:{start:`Inizio`,"ai-step":`Passo IA`,shell:`Shell`,decider:`Decisore del loop`,condition:`Condizione`,end:`Fine`},inspector:{selectNode:`Seleziona un nodo per modificarlo.`,prompt:`Prompt`,provider:`Provider`,model:`Modello`,effort:`Sforzo di ragionamento`,command:`Comando`,goal:`Obiettivo / criteri di arresto`,join:`Unione`,outcome:`Esito`,startNote:`Il punto di ingresso del loop. Collegalo al primo passo.`,promptHint:`Clicca o trascina un token per inserirlo nel prompt.`,tokensSpec:`Campi della spec`,tokensJira:`Jira`,tokensCommands:`Comandi`,label:`Nome`},branch:{continue:`↻ Continua`,stop:`✓ Ferma`},edgesHelp:{label:`Come si collegano i passaggi`,body:`Le frecce definiscono l'ORDINE di esecuzione, non i dati — i box non hanno porte di input e gli archi non trasportano parametri. Ogni AI Step riprende automaticamente la propria sessione (intero contesto precedente) più un breve riepilogo dei passaggi precedenti; nulla viene collegato a mano. Il Loop Decider ha due uscite: ↻ Continua (obiettivo non raggiunto → torna al ciclo) e ✓ Ferma (obiettivo raggiunto → esci).`},arrange:{label:`Disponi`,vertical:`Verticale`,horizontal:`Orizzontale`,grid:`Griglia`,reset:`Reimposta`},constants:{label:`Costanti`,manage:`Gestisci costanti`,title:`Costanti del loop`,empty:`Ancora nessuna costante personalizzata.`,name:`NOME`,value:`valore`,add:`Aggiungi`,builtinBadge:`Integrate`},paste:{done_one:`{{count}} passo incollato`,done_other:`{{count}} passi incollati`},problems:{count_one:`{{count}} problema`,count_other:`{{count}} problemi`,NO_START:`Aggiungi un nodo di Avvio.`,MULTIPLE_START:`È consentito un solo nodo di Avvio.`,NO_END:`Aggiungi almeno un nodo di Fine.`,ORPHAN:`Questo passo non è raggiungibile dall'Avvio.`,DECIDER_BRANCHES:`Il Loop Decider richiede un ramo Continua e uno Ferma.`,EMPTY_PROMPT:`L'AI Step ha il prompt vuoto.`,EMPTY_COMMAND:`Il passo Shell ha il comando vuoto.`,EMPTY_GOAL:`Il Loop Decider non ha un obiettivo.`,DEAD_END:`Questo passo non ha connessioni in uscita.`},preview:{label:`Anteprima`,title:`Anteprima (dry-run)`,sampleNote:`I valori dello spec sono di esempio; comandi e costanti si risolvono come a runtime.`,empty:`Nessun passo da visualizzare.`,error:`Anteprima non riuscita`}},m={steps:`Passi`,limits:`max {{iterations}} iterazioni · {{timeout}} min di timeout`,limitsNoTimeout:`max {{iterations}} iterazioni · nessun timeout`,openInBuilder:`Apri nel builder`,builtin:`Integrato`},h=`Integrato`,g={title:`Esegui {{name}}`,subtitle:`Avvia questo loop su un progetto (senza ticket).`,project:`Progetto`,provider:`Provider`,model:`Modello`,effort:`Sforzo di ragionamento`,execute:`Esegui`,noProjects:`Nessun progetto disponibile.`,launched:`Esecuzione di {{name}}`},_=JSON.parse(`{"ship-and-green":{"name":"Ship & Green","description":"Completamente autonomo: implementa la spec, verifica e affina (corregge) in caso di fallimento — ripetendo il ciclo verifica → correggi → verifica finché tutto è verde. Nessun intervento umano."},"verify-pass":{"name":"Verify Pass","description":"Verifica e correzione autonome: rileva ed esegue build/lint/test del progetto, poi affina in caso di fallimento — verifica → correggi → verifica finché è verde."},"ci-watch":{"name":"CI Watch","description":"Controlla i check di CI sulla PR aperta (l'agente usa gli strumenti di CI del repository) finché ogni check non è verde."},"lint-and-fix":{"name":"Lint & Fix","description":"L'agente rileva ed esegue il linter del progetto e corregge ogni problema, iterando finché il codice non è pulito."},"type-safe":{"name":"Type Safe","description":"L'agente rileva ed esegue il type checker del progetto e risolve ogni errore, iterando finché non passa senza errori."},"coverage-climb":{"name":"Coverage Climb","description":"L'agente esegue gli strumenti di copertura del progetto e aggiunge test mirati finché le soglie non vengono superate."},"build-fix":{"name":"Build Fix","description":"L'agente rileva ed esegue il build di produzione del progetto e corregge gli errori di compilazione/bundle finché non è verde."},"deploy-check":{"name":"Deploy Check","description":"L'agente controlla lo stato di deploy/salute (usando gli strumenti di deploy del progetto) finché il servizio non risulta integro."},"factory_implement":{"name":"Implementa","description":"Completamente autonomo: implementa la spec, verifica e affina (corregge) in caso di fallimento — ripetendo il ciclo finché tutti i test non passano."},"factory_batch":{"name":"Implementa in batch","description":"Implementa in batch tutti i ticket del rail in una sola volta, poi verifica + affina in caso di fallimento finché non è verde."},"factory_freestyle":{"name":"Freestyle","description":"Consegna la spec direttamente al modello con piena libertà — senza pipeline, lavora come un normale coding agent, poi verifica + rifinisce fino al verde. Solo Claude."},"autoloop-tdd":{"name":"Autoloop TDD","description":"Un ciclo rigoroso red-green-refactor per {{spec.title}}: fissa ogni comportamento con un test che prima fallisce, scrivi solo il codice necessario a farlo passare, poi rifinisci — ripetendo finché la spec non è coperta del tutto."},"e2e-until-green":{"name":"E2E fino al verde","description":"Esegui la suite end-to-end per {{spec.title}}, diagnostica ogni flusso utente che fallisce, correggi il difetto di UI o integrazione alla radice e ripeti finché ogni spec E2E non passa."},"flaky-test-triage":{"name":"Triage test instabili","description":"Riesegui più volte i test che falliscono attorno a {{spec.title}} per distinguere le vere regressioni dai fallimenti intermittenti, poi correggi i problemi reali e stabilizza o documenta quelli instabili."},"independent-verifier-pass":{"name":"Verifica indipendente","description":"Una verifica avversariale di {{spec.title}}: riesegui da zero build, lint e test, fidati solo dell'output grezzo dei comandi (non delle dichiarazioni 'funziona') e individua o correggi ogni lacuna."},"post-edit-test-guard":{"name":"Guardia test post-modifica","description":"Dopo ogni gruppo di modifiche per {{spec.title}}, esegui subito il set di test più ristretto che tocca i file cambiati — cogliendo le regressioni nel momento in cui appaiono, non alla fine."},"post-merge-regression-guard":{"name":"Guardia post-merge","description":"Subito dopo che un merge o un rebase porta il lavoro altrui in {{spec.title}}, esegui lo smoke test rapido per cogliere subito le rotture di integrazione — prima di costruirci sopra qualunque nuova funzionalità."},"pre-commit-guard":{"name":"Guardia pre-commit","description":"Un cancello di sicurezza per {{spec.title}} che intercetta ogni commit: esegue prima la suite di test e rifiuta il commit finché è rossa, così il codice rotto non entra mai nella storia."},"visual-regression-until-match":{"name":"Regressione visiva fino al match","description":"Cattura snapshot visivi della UI modificata, scova ogni differenza di pixel non voluta e correggi finché la suite visiva non è verde, con approvate solo le modifiche di design intenzionali."},"format-until-clean":{"name":"Formatta fino a pulito","description":"Applica il formatter del progetto, sistema i pochi problemi di stile che non riesce a correggere da solo e prosegui finché una nuova formattazione non lascia il working tree intatto."},"lint-typecheck-fix":{"name":"Correggi lint e tipi","description":"Esegui il lint e il type checker, risolvi ogni problema segnalato con la modifica più piccola possibile e ripeti finché entrambi i controlli non tornano del tutto puliti."},"a11y-audit-until-clean":{"name":"Audit a11y fino a pulito","description":"Esegui i controlli automatici di accessibilità sulle schermate modificate, correggi le violazioni una categoria alla volta e ripeti finché l'audit non torna senza alcun problema."},"de-sloppify-pass":{"name":"Passata di pulizia","description":"Dopo che la funzionalità è pronta, setaccia il diff per residui di sciatteria — output di debug, rami morti, nomi approssimativi, funzioni gonfie — ripuliscili e dimostra che la pulizia non ha rotto nulla."},"fix-ci-until-green":{"name":"Correggi la CI fino al verde","description":"Recupera l'ultima esecuzione CI rossa su questo branch, riproduci la rottura sulla tua macchina, correggi la vera causa, fai push e ripeti finché ogni check non riporta successo."},"pr-babysitter":{"name":"Babysitter PR","description":"A intervalli regolari, passa in rassegna le pull request che segui e mantieni ognuna mergeabile: rianima la CI rossa, fai il rebase di quelle rimaste indietro rispetto al branch base e sollecita quelle ferme — escalando tutto ciò che deve decidere una persona."},"pr-watch-loop":{"name":"Loop di monitoraggio PR","description":"Controlla a cadenza costante le pull request nella tua watch list, riassumi lo stato di CI e review di ognuna e risolvi i blocchi banali o evidenzia ciò che richiede un proprietario."},"pr-self-review":{"name":"Auto-review della PR","description":"Critica il tuo diff di lavoro come farebbe un reviewer senior esigente, risolvi ciò che trovi e ripeti la review finché una passata pulita non rivela nulla di critico — prima ancora che la PR lasci le tue mani."},"spec-first-ship":{"name":"Prima la spec","description":"Porta a termine una checklist di requisiti scritti un elemento alla volta — ogni passata implementa un singolo requisito non spuntato, lo dimostra e lo segna fatto — così la spec è il contratto del 'completato'."},"dependency-audit-weekly":{"name":"Audit dipendenze settimanale","description":"Ogni settimana fai il punto su quali pacchetti sono rimasti indietro, dividili tra sicuri da aggiornare e rischiosi e restituisci un piano di upgrade chiaro e attuabile."},"dependency-upgrade-one-by-one":{"name":"Aggiorna le dipendenze una alla volta","description":"Aggiorna esattamente un pacchetto obsoleto per passata, ripara ciò che l'aggiornamento rompe, dimostra che il progetto funziona ancora e fai commit — molto più sicuro che aggiornare tutto insieme."},"knip-until-clean":{"name":"Elimina il codice morto","description":"Scova export non referenziati, file orfani e dipendenze che nessuno importa, rimuovili in sicurezza e prosegui finché lo scanner del codice morto non ha più nulla da segnalare."},"docs-sync-after-edits":{"name":"Allinea i doc al codice","description":"Dopo un giro di modifiche al codice, rintraccia ogni documento toccato dai cambiamenti — README, riferimento API, commenti inline — e riallinealo a come il codice si comporta davvero ora."},"security-audit-weekly":{"name":"Audit sicurezza settimanale","description":"Esegui ogni settimana una scansione delle vulnerabilità sull'albero delle dipendenze, fai il triage di ciò che emerge per gravità ed esposizione reale e restituisci un piano di remediation prioritizzato."},"npm-audit-fix-loop":{"name":"Correggi le vulnerabilità una alla volta","description":"Risolvi gli advisory critici e ad alta gravità delle dipendenze in modo deliberato — una correzione per passata, ognuna verificata contro la suite di test — invece di un force-fix alla cieca che può rompere la build di nascosto."},"api-contract-until-match":{"name":"Contratto API fino al match","description":"Porta avanti l'implementazione finché le sue risposte non rispettano il contratto API pubblicato, colmando ogni divario tra ciò che lo schema promette e ciò che gli handler restituiscono davvero."},"openapi-sync-until-valid":{"name":"Sync OpenAPI fino a valido","description":"Mantieni il documento OpenAPI ben formato e fedele agli handler delle route reali, riparando errori di spec e divergenze codice-doc a ogni passata finché il lint non è soddisfatto."},"migration-until-applied":{"name":"Migrazione fino ad applicata","description":"Porta avanti lo schema del database in modo pulito: esegui le migrazioni pendenti, ripara eventuali errori di schema o SQL che emergono e verifica che la storia delle migrazioni resti coerente."},"bundle-size-budget":{"name":"Budget dimensione bundle","description":"Rilascia la funzionalità senza gonfiare il bundle client oltre il suo budget — misura a ogni passata e taglia, fai code-split o lazy-load finché il controllo sulla dimensione non è verde."},"changelog-sync-after-ship":{"name":"Sync changelog dopo il rilascio","description":"Dopo il rilascio, assicurati che il changelog racconti la storia rivolta all'utente: rivedi cosa è stato rilasciato, scrivi le voci in stile Keep a Changelog e verifica che nulla di visibile sia stato omesso."},"guardrails-learning-loop":{"name":"Loop con guardrail","description":"Continua a iterare sui controlli finché non diventano verdi, ma ogni volta che un check fallisce allo stesso modo due volte, scrivi prima una nota guardrail così il loop non spreca mai iterazioni ritentando un approccio già fallito."},"ralph-story-executor":{"name":"Esecutore di story","description":"Lavora un backlog di user story una alla volta con un contesto fresco a ogni passata: scegli la prossima story incompiuta, costruisci solo quella, dimostra che i controlli del progetto restano verdi, fai commit e segnala completata prima di proseguire."},"investigation-script-loop":{"name":"Loop di script d'indagine","description":"Individua empiricamente la vera causa di un bug: scrivi un piccolo script usa e getta che esercita il comportamento sospetto, eseguilo, leggi l'output reale e affina la sonda finché l'output stesso non prova la causa radice."},"reflexion-debug-loop":{"name":"Loop di debug riflessivo","description":"Fai diventare verde un test che fallisce senza girare a vuoto: ogni volta che un tentativo fallisce, registra una breve riflessione su disco e consultala prima del tentativo successivo, così il loop non ripete mai una correzione già esclusa."},"merge-conflict-resolver":{"name":"Risolutore di conflitti merge","description":"Aggiorna il branch rispetto al suo target con un rebase, poi risolvi ogni conflitto file per file preservando l'intento di entrambe le parti e dimostra che il risultato passa ancora prima di dichiarare il branch aggiornato."},"staging-smoke-test":{"name":"Smoke test su staging","description":"Dopo un deploy su staging, percorri una checklist di smoke fissa — auth, i percorsi utente principali e le integrazioni chiave — correggendo il problema più piccolo ogni volta che qualcosa si rompe e rieseguendo finché tutta la checklist non torna pulita."},"deploy-verification-loop":{"name":"Loop di verifica deploy","description":"Dopo che un deploy è andato in produzione, interroga a intervalli gli endpoint di health e smoke, indaga e correggi o esegui escalation per ogni risposta non sana, e continua a controllare finché ogni endpoint configurato non riporta successo."},"factory_openspec":{"name":"OpenSpec Lifecycle","description":"Ciclo OpenSpec dal ticket all'archivio: genera artefatti (opsx:ff) → implementa (opsx:apply) → verifica (opsx:verify); con FAIL torna indietro ed emenda lo stesso change, con PASS lo archivia senza intervento."},"factory_revision":{"name":"Revisione","description":"Applica l'unica modifica richiesta sopra il lavoro già consegnato, fa rivalutare dal revisore e verifica fino al verde. Non ripianifica da zero."}}`),v=`Si avvia automaticamente quando chiedi modifiche in una revisione — questo non lo lanci tu.`,y={title:e,subtitle:t,newLoop:n,sections:r,gallery:i,categories:a,status:o,empty:s,actions:c,card:l,confirmDelete:u,newLoopName:d,errors:f,builder:p,preview:m,builtInBadge:h,run:g,catalog:_,import:{done_one:`{{count}} loop importato`,done_other:`{{count}} loop importati`,skipped_one:`{{count}} duplicato saltato: {{names}}`,skipped_other:`{{count}} duplicati saltati: {{names}}`,invalid:`Quel file non è un export di loop valido.`},automaticOnly:v};export{c as actions,v as automaticOnly,p as builder,h as builtInBadge,l as card,_ as catalog,a as categories,u as confirmDelete,y as default,s as empty,f as errors,i as gallery,n as newLoop,d as newLoopName,m as preview,g as run,r as sections,o as status,t as subtitle,e as title};
@@ -1 +1 @@
1
- var e=`Loops`,t=`可复用的自动化循环——在你所有项目间共享。`,n=`新建循环`,r={drafts:`草稿`,published:`已发布`,templates:`模板`,builtIn:`内置`},i={search:`搜索模板…`,noResults:`没有模板符合筛选条件。`,clearFilter:`清除筛选`,resultCount_one:`{{count}} 个模板`,resultCount_other:`{{count}} 个模板`,needsSpec:`需要规格`,standalone:`独立运行`,needsSpecHint:`在 rail 上运行,需拖入一个规格`,standaloneHint:`独立运行——只需选择一个项目`},a={API:`API`,Automation:`自动化`,CI:`CI`,Database:`数据库`,Debugging:`调试`,DevOps:`DevOps`,Docs:`文档`,Git:`Git`,Maintenance:`维护`,Performance:`性能`,Planning:`规划`,Quality:`质量`,Review:`评审`,Security:`安全`,Testing:`测试`},o={draft:`草稿`,published:`已发布`,running:`运行中`},s={title:`暂无循环`,body:`从零创建一个,或从模板开始。`},c={edit:`编辑`,delete:`删除`,publish:`发布`,unpublish:`取消发布`,duplicate:`复制`,use:`使用模板`,preview:`预览`,fork:`复刻以编辑`,run:`运行`,export:`导出`,import:`导入`,select:`选择 {{name}}`},l={nodes_one:`{{count}} 个节点`,nodes_other:`{{count}} 个节点`,usedIn:`使用中 · {{project}}`},u=`删除此循环?它将从所有 rail 选择器中消失。`,d=`新建循环`,f={load:`加载循环失败`,save:`保存循环失败`,publishInvalid:`此循环暂时无法发布——请修复高亮显示的问题。`},p={back:`返回循环列表`,save:`保存`,saved:`循环已保存`,publish:`发布`,published:`循环已发布`,addNode:`添加节点`,deleteNode:`删除节点`,config:{maxIterations:`最大迭代次数`,timeout:`超时(分钟)`,maxIterationsHint:`Loop Decider 迭代次数上限——达到后即使目标未达成也会停止循环。防止无限循环。`,timeoutHint:`整个运行的实际时间上限(分钟)。超过后运行将停止并标记为失败——与最大迭代次数一起作为安全网。`,maxCost:`最大费用 ($)`,maxCostHint:`整个运行的可选美元预算。在步骤之间检查(每步费用只有在该步结束后才知道),因此当总额超过时循环会在下一步之前停止——可能超出一步。非 Claude 提供方的费用为估算。留空 = 不限制。`},nodes:{start:`开始`,"ai-step":`AI 步骤`,shell:`Shell`,decider:`循环决策器`,condition:`条件`,end:`结束`},inspector:{selectNode:`选择一个节点进行编辑。`,prompt:`提示词`,provider:`提供方`,model:`模型`,effort:`推理强度`,command:`命令`,goal:`目标 / 停止条件`,join:`合并`,outcome:`结果`,startNote:`循环的入口点。将其连接到第一个步骤。`,promptHint:`点击或拖动令牌将其插入提示词。`,tokensSpec:`Spec 字段`,tokensJira:`Jira`,tokensCommands:`命令`,label:`名称`},branch:{continue:`↻ 继续`,stop:`✓ 停止`},edgesHelp:{label:`步骤如何连接`,body:`箭头设定的是运行顺序,而非数据——节点没有输入端口,连线也不携带任何参数。每个 AI Step 都会自动恢复其会话(完整的先前上下文),并附带前序步骤的简短摘要;无需手动连线。Loop Decider 有两个输出:↻ 继续(目标未达成 → 循环返回)和 ✓ 停止(目标达成 → 退出)。`},arrange:{label:`排列`,vertical:`垂直`,horizontal:`水平`,grid:`网格`,reset:`重置`},constants:{label:`常量`,manage:`管理常量`,title:`循环常量`,empty:`还没有自定义常量。`,name:`名称`,value:`值`,add:`添加`,builtinBadge:`内置`},paste:{done_one:`已粘贴 {{count}} 个步骤`,done_other:`已粘贴 {{count}} 个步骤`},problems:{count_one:`{{count}} 个问题`,count_other:`{{count}} 个问题`,NO_START:`添加一个开始节点。`,MULTIPLE_START:`只允许一个开始节点。`,NO_END:`至少添加一个结束节点。`,ORPHAN:`该步骤无法从开始到达。`,DECIDER_BRANCHES:`Loop Decider 需要一个继续分支和一个停止分支。`,EMPTY_PROMPT:`AI 步骤的提示词为空。`,EMPTY_COMMAND:`Shell 步骤的命令为空。`,EMPTY_GOAL:`Loop Decider 没有目标。`,DEAD_END:`该步骤没有出向连接。`},preview:{label:`预览`,title:`试运行预览`,sampleNote:`Spec 值为示例数据;命令和常量按运行时的实际值解析。`,empty:`没有可预览的步骤。`,error:`预览失败`}},m={steps:`步骤`,limits:`最多 {{iterations}} 次迭代 · {{timeout}} 分钟超时`,limitsNoTimeout:`最多 {{iterations}} 次迭代 · 无超时`,openInBuilder:`在构建器中打开`,builtin:`内置`},h=`内置`,g={title:`运行 {{name}}`,subtitle:`在某个项目上启动此循环(无需工单)。`,project:`项目`,provider:`提供方`,model:`模型`,effort:`推理强度`,execute:`执行`,noProjects:`没有可用的项目。`,launched:`正在运行 {{name}}`},_=JSON.parse(`{"ship-and-green":{"name":"交付并通过","description":"全自动:实现 spec、验证,失败时自动修正(fix)——循环执行 验证 → 修复 → 验证,直到全部通过。无需人工干预。"},"verify-pass":{"name":"验证通过","description":"自动验证并修复:检测并运行项目的 build/lint/测试,失败时自动修正——验证 → 修复 → 验证,直到全部通过。"},"ci-watch":{"name":"CI 监视","description":"轮询当前已打开 PR 的 CI 检查(由 agent 使用仓库的 CI 工具),直到每一项检查都通过。"},"lint-and-fix":{"name":"Lint 修复","description":"agent 检测并运行项目的 linter,修复每一个问题,持续迭代直到代码库干净无误。"},"type-safe":{"name":"类型安全","description":"agent 检测并运行项目的类型检查器,解决每一个错误,持续迭代直到顺利通过。"},"coverage-climb":{"name":"覆盖率提升","description":"agent 运行项目的覆盖率工具并补充针对性测试,直到达到阈值。"},"build-fix":{"name":"构建修复","description":"agent 检测并运行项目的生产 build,修复编译/打包错误,直到顺利通过。"},"deploy-check":{"name":"部署检查","description":"agent 轮询部署/健康状态(使用项目的 deploy 工具),直到服务报告健康。"},"factory_implement":{"name":"实现","description":"全自动:实现 spec、验证,失败时自动修正(fix)——循环直到所有测试通过。"},"factory_batch":{"name":"批量实现","description":"一次性批量实现该 rail 的全部工单,然后验证 + 失败时修正,直到全部通过。"},"factory_freestyle":{"name":"Freestyle","description":"将 spec 直接交给模型, 给予完全自由 — 无管线, 像普通编码智能体一样工作, 然后验证+改进直到全部通过。仅限 Claude。"},"autoloop-tdd":{"name":"自动循环 TDD","description":"针对 {{spec.title}} 严格执行红-绿-重构循环:先用失败的测试锁定每个行为,再写刚好够让它变绿的代码,然后整理代码——如此反复,直到完整覆盖该规格。"},"e2e-until-green":{"name":"E2E 直到通过","description":"运行 {{spec.title}} 的 E2E 测试套件,逐一诊断失败的用户流程,修复底层的 UI 或集成缺陷,持续循环直到每条 E2E 用例都通过。"},"flaky-test-triage":{"name":"不稳定测试分诊","description":"多次重跑 {{spec.title}} 相关的失败测试,区分真正的回归与偶发的不稳定,然后修复真正的故障,并稳定或记录那些不稳定的用例。"},"independent-verifier-pass":{"name":"独立验证一遍","description":"对 {{spec.title}} 做对抗式验证:从零重新运行构建、lint 和测试,只信任命令的原始输出(不信任此前任何「能用」的说法),并暴露或修复每个缺口。"},"post-edit-test-guard":{"name":"改后测试守卫","description":"针对 {{spec.title}} 每改完一批代码,立刻运行覆盖改动文件的最小测试集——在回归出现的当下就捕获,而非拖到最后。"},"post-merge-regression-guard":{"name":"合并后回归守卫","description":"在合并或变基把他人的工作引入 {{spec.title}} 后,立即运行快速 smoke test 套件以第一时间发现集成破坏——在新功能开发动工之前。"},"pre-commit-guard":{"name":"提交前守卫","description":"为 {{spec.title}} 把守每次提交:先运行测试套件,只要测试为红就拒绝提交,让坏代码永远进不了历史记录。"},"visual-regression-until-match":{"name":"视觉回归直到匹配","description":"对改动的 UI 截取视觉快照,揪出每一处非预期的像素差异并自我修正,直到视觉套件全部通过、且只保留经审批的有意设计变更。"},"format-until-clean":{"name":"格式化直到干净","description":"运行项目格式化工具,手动收拾它无法自动修复的少量风格问题,持续进行直到再次格式化不再改动工作区。"},"lint-typecheck-fix":{"name":"Lint 与类型检查修复","description":"运行 lint 工具和类型检查器,以尽可能小的改动逐一解决每个报告的问题,循环直到两道关卡都彻底通过。"},"a11y-audit-until-clean":{"name":"无障碍审计直到干净","description":"对改动的页面运行自动化无障碍检查,按类别逐项修复违规,反复进行直到审计返回零问题。"},"de-sloppify-pass":{"name":"清理杂乱一遍","description":"功能落地后,把改动从头扫一遍清除残留杂乱——调试输出、死分支、随意命名、臃肿函数——清理干净,并证明清理没有破坏任何东西。"},"fix-ci-until-green":{"name":"修复 CI 直到通过","description":"拉取本分支最近一次失败的 CI 运行,在本地复现故障,修复真正的根因并推送,持续循环直到每项检查都报告成功。"},"pr-babysitter":{"name":"PR 看护","description":"按固定间隔巡查你关注的开放 PR,让每个都保持可合并状态:救活失败的 CI,对落后于基线分支的进行变基,催促停滞的——并把需要人来决策的事项上报。"},"pr-watch-loop":{"name":"PR 监视循环","description":"以稳定节奏轮询监视列表中的 PR,汇总各自的 CI 与评审健康度,要么顺手解决琐碎的阻塞项,要么标记出需要负责人处理的事项。"},"pr-self-review":{"name":"PR 自审","description":"像挑剔的资深评审者那样审视自己的工作改动,逐一修复发现的问题,反复自审直到一遍下来再无关键问题——赶在 PR 离手之前。"},"spec-first-ship":{"name":"规格优先交付","description":"逐项推进一份书面需求清单直至全部完成——每一遍只实现一条未勾选的需求、验证它、再打勾——让规格成为「完成」的契约。"},"dependency-audit-weekly":{"name":"每周依赖审计","description":"每周盘点哪些依赖包已落后,将其分为可安全升级与有风险两类,并交还一份你可直接执行的清晰升级计划。"},"dependency-upgrade-one-by-one":{"name":"逐个升级依赖","description":"每一遍只升级一个过时的依赖包,修好升级带来的破坏,证明项目仍可正常运行后再提交——远比一次性全部升级更安全。"},"knip-until-clean":{"name":"清除死代码直到干净","description":"揪出无人引用的导出、孤立文件和没人导入的依赖,安全地移除它们,持续进行直到死代码扫描工具再无可报告的内容。"},"docs-sync-after-edits":{"name":"文档同步代码改动","description":"在一轮代码改动之后,找出每一份被改动波及的文档——README、API 参考、内联注释——让它们与代码现在的实际行为重新对齐。"},"security-audit-weekly":{"name":"每周安全审计","description":"每周对依赖树运行一次漏洞扫描,按严重程度和真实暴露面对结果分诊,并交还一份按优先级排序的修复计划。"},"npm-audit-fix-loop":{"name":"逐个修补漏洞","description":"有条不紊地清除高危和严重的依赖告警——每一遍只修一个,并用测试套件逐一验证——而非可能悄悄弄坏构建的盲目强制修复。"},"api-contract-until-match":{"name":"API 契约直到匹配","description":"推动实现直到其响应符合已发布的 API 契约,弥合 schema 承诺与处理函数实际返回之间的任何差距。"},"openapi-sync-until-valid":{"name":"OpenAPI 同步直到有效","description":"保持 OpenAPI 文档格式良好且忠实于真实的路由处理函数,每一遍修复规格错误和代码与文档的偏差,直到 lint 工具满意为止。"},"migration-until-applied":{"name":"迁移直到生效","description":"干净地推进数据库 schema:运行待执行的迁移,修复其暴露出的任何 schema 或 SQL 错误,并确认迁移历史保持一致。"},"bundle-size-budget":{"name":"打包体积预算","description":"在不让客户端打包体积超出预算的前提下交付功能——每一遍测量并精简、代码拆分或懒加载,直到体积关卡通过。"},"changelog-sync-after-ship":{"name":"交付后同步变更日志","description":"交付后确保变更日志讲清面向用户的来龙去脉:回顾落地的内容,按 Keep a Changelog 规范撰写条目,并确认没有遗漏任何可见变更。"},"guardrails-learning-loop":{"name":"护栏学习循环","description":"持续迭代直到各项关卡通过,但每当某项检查以同样的方式失败两次,先记下一条护栏笔记,让循环不再浪费迭代去重试一个已经失败的方案。"},"ralph-story-executor":{"name":"待办故事执行器","description":"以每遍全新上下文逐个处理用户故事待办:挑出下一个未完成的故事,只构建它,证明项目各项关卡保持通过,提交并标记完成,再继续下一个。"},"investigation-script-loop":{"name":"探查脚本循环","description":"凭实证锁定 bug 的真正根因:写一个一次性的小脚本来触发可疑行为,运行它、读取真实输出,并不断打磨探针,直到输出本身证明根因所在。"},"reflexion-debug-loop":{"name":"反思调试循环","description":"不靠瞎试就让失败的测试变绿:每次尝试失败时把一段简短反思写入磁盘,并在下次尝试前查阅它,让循环不再重复已被排除的修法。"},"merge-conflict-resolver":{"name":"合并冲突解决器","description":"通过变基把分支更新到与目标一致,然后逐个文件解决每处冲突、保留双方意图,并在宣布分支已同步前证明结果仍然通过。"},"staging-smoke-test":{"name":"预发布 Smoke Test","description":"在预发布部署后,走一遍固定的 smoke test 清单——认证、核心用户路径和关键集成——每次出问题就修复最小的那个并重跑,直到整份清单全部通过。"},"deploy-verification-loop":{"name":"部署验证循环","description":"部署上线后,按间隔轮询健康检查和 smoke test 端点,对任何非健康响应进行排查、修复或上报,并持续检查直到每个配置的端点都报告成功。"},"factory_openspec":{"name":"OpenSpec Lifecycle","description":"从 ticket 到归档的 OpenSpec 生命周期: 生成工件 (opsx:ff) → 实现 (opsx:apply) → 验证 (opsx:verify); FAIL 则回环修正同一 change, PASS 则无人值守归档。"}}`),v={title:e,subtitle:t,newLoop:n,sections:r,gallery:i,categories:a,status:o,empty:s,actions:c,card:l,confirmDelete:u,newLoopName:d,errors:f,builder:p,preview:m,builtInBadge:h,run:g,catalog:_,import:{done_one:`已导入 {{count}} 个循环`,done_other:`已导入 {{count}} 个循环`,skipped_one:`已跳过 {{count}} 个重复项:{{names}}`,skipped_other:`已跳过 {{count}} 个重复项:{{names}}`,invalid:`该文件不是有效的循环导出。`}};export{c as actions,p as builder,h as builtInBadge,l as card,_ as catalog,a as categories,u as confirmDelete,v as default,s as empty,f as errors,i as gallery,n as newLoop,d as newLoopName,m as preview,g as run,r as sections,o as status,t as subtitle,e as title};
1
+ var e=`Loops`,t=`可复用的自动化循环——在你所有项目间共享。`,n=`新建循环`,r={drafts:`草稿`,published:`已发布`,templates:`模板`,builtIn:`内置`},i={search:`搜索模板…`,noResults:`没有模板符合筛选条件。`,clearFilter:`清除筛选`,resultCount_one:`{{count}} 个模板`,resultCount_other:`{{count}} 个模板`,needsSpec:`需要规格`,standalone:`独立运行`,needsSpecHint:`在 rail 上运行,需拖入一个规格`,standaloneHint:`独立运行——只需选择一个项目`},a={API:`API`,Automation:`自动化`,CI:`CI`,Database:`数据库`,Debugging:`调试`,DevOps:`DevOps`,Docs:`文档`,Git:`Git`,Maintenance:`维护`,Performance:`性能`,Planning:`规划`,Quality:`质量`,Review:`评审`,Security:`安全`,Testing:`测试`},o={draft:`草稿`,published:`已发布`,running:`运行中`},s={title:`暂无循环`,body:`从零创建一个,或从模板开始。`},c={edit:`编辑`,delete:`删除`,publish:`发布`,unpublish:`取消发布`,duplicate:`复制`,use:`使用模板`,preview:`预览`,fork:`复刻以编辑`,run:`运行`,export:`导出`,import:`导入`,select:`选择 {{name}}`},l={nodes_one:`{{count}} 个节点`,nodes_other:`{{count}} 个节点`,usedIn:`使用中 · {{project}}`},u=`删除此循环?它将从所有 rail 选择器中消失。`,d=`新建循环`,f={load:`加载循环失败`,save:`保存循环失败`,publishInvalid:`此循环暂时无法发布——请修复高亮显示的问题。`},p={back:`返回循环列表`,save:`保存`,saved:`循环已保存`,publish:`发布`,published:`循环已发布`,addNode:`添加节点`,deleteNode:`删除节点`,config:{maxIterations:`最大迭代次数`,timeout:`超时(分钟)`,maxIterationsHint:`Loop Decider 迭代次数上限——达到后即使目标未达成也会停止循环。防止无限循环。`,timeoutHint:`整个运行的实际时间上限(分钟)。超过后运行将停止并标记为失败——与最大迭代次数一起作为安全网。`,maxCost:`最大费用 ($)`,maxCostHint:`整个运行的可选美元预算。在步骤之间检查(每步费用只有在该步结束后才知道),因此当总额超过时循环会在下一步之前停止——可能超出一步。非 Claude 提供方的费用为估算。留空 = 不限制。`},nodes:{start:`开始`,"ai-step":`AI 步骤`,shell:`Shell`,decider:`循环决策器`,condition:`条件`,end:`结束`},inspector:{selectNode:`选择一个节点进行编辑。`,prompt:`提示词`,provider:`提供方`,model:`模型`,effort:`推理强度`,command:`命令`,goal:`目标 / 停止条件`,join:`合并`,outcome:`结果`,startNote:`循环的入口点。将其连接到第一个步骤。`,promptHint:`点击或拖动令牌将其插入提示词。`,tokensSpec:`Spec 字段`,tokensJira:`Jira`,tokensCommands:`命令`,label:`名称`},branch:{continue:`↻ 继续`,stop:`✓ 停止`},edgesHelp:{label:`步骤如何连接`,body:`箭头设定的是运行顺序,而非数据——节点没有输入端口,连线也不携带任何参数。每个 AI Step 都会自动恢复其会话(完整的先前上下文),并附带前序步骤的简短摘要;无需手动连线。Loop Decider 有两个输出:↻ 继续(目标未达成 → 循环返回)和 ✓ 停止(目标达成 → 退出)。`},arrange:{label:`排列`,vertical:`垂直`,horizontal:`水平`,grid:`网格`,reset:`重置`},constants:{label:`常量`,manage:`管理常量`,title:`循环常量`,empty:`还没有自定义常量。`,name:`名称`,value:`值`,add:`添加`,builtinBadge:`内置`},paste:{done_one:`已粘贴 {{count}} 个步骤`,done_other:`已粘贴 {{count}} 个步骤`},problems:{count_one:`{{count}} 个问题`,count_other:`{{count}} 个问题`,NO_START:`添加一个开始节点。`,MULTIPLE_START:`只允许一个开始节点。`,NO_END:`至少添加一个结束节点。`,ORPHAN:`该步骤无法从开始到达。`,DECIDER_BRANCHES:`Loop Decider 需要一个继续分支和一个停止分支。`,EMPTY_PROMPT:`AI 步骤的提示词为空。`,EMPTY_COMMAND:`Shell 步骤的命令为空。`,EMPTY_GOAL:`Loop Decider 没有目标。`,DEAD_END:`该步骤没有出向连接。`},preview:{label:`预览`,title:`试运行预览`,sampleNote:`Spec 值为示例数据;命令和常量按运行时的实际值解析。`,empty:`没有可预览的步骤。`,error:`预览失败`}},m={steps:`步骤`,limits:`最多 {{iterations}} 次迭代 · {{timeout}} 分钟超时`,limitsNoTimeout:`最多 {{iterations}} 次迭代 · 无超时`,openInBuilder:`在构建器中打开`,builtin:`内置`},h=`内置`,g={title:`运行 {{name}}`,subtitle:`在某个项目上启动此循环(无需工单)。`,project:`项目`,provider:`提供方`,model:`模型`,effort:`推理强度`,execute:`执行`,noProjects:`没有可用的项目。`,launched:`正在运行 {{name}}`},_=JSON.parse(`{"ship-and-green":{"name":"交付并通过","description":"全自动:实现 spec、验证,失败时自动修正(fix)——循环执行 验证 → 修复 → 验证,直到全部通过。无需人工干预。"},"verify-pass":{"name":"验证通过","description":"自动验证并修复:检测并运行项目的 build/lint/测试,失败时自动修正——验证 → 修复 → 验证,直到全部通过。"},"ci-watch":{"name":"CI 监视","description":"轮询当前已打开 PR 的 CI 检查(由 agent 使用仓库的 CI 工具),直到每一项检查都通过。"},"lint-and-fix":{"name":"Lint 修复","description":"agent 检测并运行项目的 linter,修复每一个问题,持续迭代直到代码库干净无误。"},"type-safe":{"name":"类型安全","description":"agent 检测并运行项目的类型检查器,解决每一个错误,持续迭代直到顺利通过。"},"coverage-climb":{"name":"覆盖率提升","description":"agent 运行项目的覆盖率工具并补充针对性测试,直到达到阈值。"},"build-fix":{"name":"构建修复","description":"agent 检测并运行项目的生产 build,修复编译/打包错误,直到顺利通过。"},"deploy-check":{"name":"部署检查","description":"agent 轮询部署/健康状态(使用项目的 deploy 工具),直到服务报告健康。"},"factory_implement":{"name":"实现","description":"全自动:实现 spec、验证,失败时自动修正(fix)——循环直到所有测试通过。"},"factory_batch":{"name":"批量实现","description":"一次性批量实现该 rail 的全部工单,然后验证 + 失败时修正,直到全部通过。"},"factory_freestyle":{"name":"Freestyle","description":"将 spec 直接交给模型, 给予完全自由 — 无管线, 像普通编码智能体一样工作, 然后验证+改进直到全部通过。仅限 Claude。"},"autoloop-tdd":{"name":"自动循环 TDD","description":"针对 {{spec.title}} 严格执行红-绿-重构循环:先用失败的测试锁定每个行为,再写刚好够让它变绿的代码,然后整理代码——如此反复,直到完整覆盖该规格。"},"e2e-until-green":{"name":"E2E 直到通过","description":"运行 {{spec.title}} 的 E2E 测试套件,逐一诊断失败的用户流程,修复底层的 UI 或集成缺陷,持续循环直到每条 E2E 用例都通过。"},"flaky-test-triage":{"name":"不稳定测试分诊","description":"多次重跑 {{spec.title}} 相关的失败测试,区分真正的回归与偶发的不稳定,然后修复真正的故障,并稳定或记录那些不稳定的用例。"},"independent-verifier-pass":{"name":"独立验证一遍","description":"对 {{spec.title}} 做对抗式验证:从零重新运行构建、lint 和测试,只信任命令的原始输出(不信任此前任何「能用」的说法),并暴露或修复每个缺口。"},"post-edit-test-guard":{"name":"改后测试守卫","description":"针对 {{spec.title}} 每改完一批代码,立刻运行覆盖改动文件的最小测试集——在回归出现的当下就捕获,而非拖到最后。"},"post-merge-regression-guard":{"name":"合并后回归守卫","description":"在合并或变基把他人的工作引入 {{spec.title}} 后,立即运行快速 smoke test 套件以第一时间发现集成破坏——在新功能开发动工之前。"},"pre-commit-guard":{"name":"提交前守卫","description":"为 {{spec.title}} 把守每次提交:先运行测试套件,只要测试为红就拒绝提交,让坏代码永远进不了历史记录。"},"visual-regression-until-match":{"name":"视觉回归直到匹配","description":"对改动的 UI 截取视觉快照,揪出每一处非预期的像素差异并自我修正,直到视觉套件全部通过、且只保留经审批的有意设计变更。"},"format-until-clean":{"name":"格式化直到干净","description":"运行项目格式化工具,手动收拾它无法自动修复的少量风格问题,持续进行直到再次格式化不再改动工作区。"},"lint-typecheck-fix":{"name":"Lint 与类型检查修复","description":"运行 lint 工具和类型检查器,以尽可能小的改动逐一解决每个报告的问题,循环直到两道关卡都彻底通过。"},"a11y-audit-until-clean":{"name":"无障碍审计直到干净","description":"对改动的页面运行自动化无障碍检查,按类别逐项修复违规,反复进行直到审计返回零问题。"},"de-sloppify-pass":{"name":"清理杂乱一遍","description":"功能落地后,把改动从头扫一遍清除残留杂乱——调试输出、死分支、随意命名、臃肿函数——清理干净,并证明清理没有破坏任何东西。"},"fix-ci-until-green":{"name":"修复 CI 直到通过","description":"拉取本分支最近一次失败的 CI 运行,在本地复现故障,修复真正的根因并推送,持续循环直到每项检查都报告成功。"},"pr-babysitter":{"name":"PR 看护","description":"按固定间隔巡查你关注的开放 PR,让每个都保持可合并状态:救活失败的 CI,对落后于基线分支的进行变基,催促停滞的——并把需要人来决策的事项上报。"},"pr-watch-loop":{"name":"PR 监视循环","description":"以稳定节奏轮询监视列表中的 PR,汇总各自的 CI 与评审健康度,要么顺手解决琐碎的阻塞项,要么标记出需要负责人处理的事项。"},"pr-self-review":{"name":"PR 自审","description":"像挑剔的资深评审者那样审视自己的工作改动,逐一修复发现的问题,反复自审直到一遍下来再无关键问题——赶在 PR 离手之前。"},"spec-first-ship":{"name":"规格优先交付","description":"逐项推进一份书面需求清单直至全部完成——每一遍只实现一条未勾选的需求、验证它、再打勾——让规格成为「完成」的契约。"},"dependency-audit-weekly":{"name":"每周依赖审计","description":"每周盘点哪些依赖包已落后,将其分为可安全升级与有风险两类,并交还一份你可直接执行的清晰升级计划。"},"dependency-upgrade-one-by-one":{"name":"逐个升级依赖","description":"每一遍只升级一个过时的依赖包,修好升级带来的破坏,证明项目仍可正常运行后再提交——远比一次性全部升级更安全。"},"knip-until-clean":{"name":"清除死代码直到干净","description":"揪出无人引用的导出、孤立文件和没人导入的依赖,安全地移除它们,持续进行直到死代码扫描工具再无可报告的内容。"},"docs-sync-after-edits":{"name":"文档同步代码改动","description":"在一轮代码改动之后,找出每一份被改动波及的文档——README、API 参考、内联注释——让它们与代码现在的实际行为重新对齐。"},"security-audit-weekly":{"name":"每周安全审计","description":"每周对依赖树运行一次漏洞扫描,按严重程度和真实暴露面对结果分诊,并交还一份按优先级排序的修复计划。"},"npm-audit-fix-loop":{"name":"逐个修补漏洞","description":"有条不紊地清除高危和严重的依赖告警——每一遍只修一个,并用测试套件逐一验证——而非可能悄悄弄坏构建的盲目强制修复。"},"api-contract-until-match":{"name":"API 契约直到匹配","description":"推动实现直到其响应符合已发布的 API 契约,弥合 schema 承诺与处理函数实际返回之间的任何差距。"},"openapi-sync-until-valid":{"name":"OpenAPI 同步直到有效","description":"保持 OpenAPI 文档格式良好且忠实于真实的路由处理函数,每一遍修复规格错误和代码与文档的偏差,直到 lint 工具满意为止。"},"migration-until-applied":{"name":"迁移直到生效","description":"干净地推进数据库 schema:运行待执行的迁移,修复其暴露出的任何 schema 或 SQL 错误,并确认迁移历史保持一致。"},"bundle-size-budget":{"name":"打包体积预算","description":"在不让客户端打包体积超出预算的前提下交付功能——每一遍测量并精简、代码拆分或懒加载,直到体积关卡通过。"},"changelog-sync-after-ship":{"name":"交付后同步变更日志","description":"交付后确保变更日志讲清面向用户的来龙去脉:回顾落地的内容,按 Keep a Changelog 规范撰写条目,并确认没有遗漏任何可见变更。"},"guardrails-learning-loop":{"name":"护栏学习循环","description":"持续迭代直到各项关卡通过,但每当某项检查以同样的方式失败两次,先记下一条护栏笔记,让循环不再浪费迭代去重试一个已经失败的方案。"},"ralph-story-executor":{"name":"待办故事执行器","description":"以每遍全新上下文逐个处理用户故事待办:挑出下一个未完成的故事,只构建它,证明项目各项关卡保持通过,提交并标记完成,再继续下一个。"},"investigation-script-loop":{"name":"探查脚本循环","description":"凭实证锁定 bug 的真正根因:写一个一次性的小脚本来触发可疑行为,运行它、读取真实输出,并不断打磨探针,直到输出本身证明根因所在。"},"reflexion-debug-loop":{"name":"反思调试循环","description":"不靠瞎试就让失败的测试变绿:每次尝试失败时把一段简短反思写入磁盘,并在下次尝试前查阅它,让循环不再重复已被排除的修法。"},"merge-conflict-resolver":{"name":"合并冲突解决器","description":"通过变基把分支更新到与目标一致,然后逐个文件解决每处冲突、保留双方意图,并在宣布分支已同步前证明结果仍然通过。"},"staging-smoke-test":{"name":"预发布 Smoke Test","description":"在预发布部署后,走一遍固定的 smoke test 清单——认证、核心用户路径和关键集成——每次出问题就修复最小的那个并重跑,直到整份清单全部通过。"},"deploy-verification-loop":{"name":"部署验证循环","description":"部署上线后,按间隔轮询健康检查和 smoke test 端点,对任何非健康响应进行排查、修复或上报,并持续检查直到每个配置的端点都报告成功。"},"factory_openspec":{"name":"OpenSpec Lifecycle","description":"从 ticket 到归档的 OpenSpec 生命周期: 生成工件 (opsx:ff) → 实现 (opsx:apply) → 验证 (opsx:verify); FAIL 则回环修正同一 change, PASS 则无人值守归档。"},"factory_revision":{"name":"修订","description":"在已交付的成果之上应用你要求的那一处修改,让审阅者重新评分,然后验证到通过。不会从头重新规划。"}}`),v=`当你在审阅中要求修改时自动运行 —— 这个不由你启动。`,y={title:e,subtitle:t,newLoop:n,sections:r,gallery:i,categories:a,status:o,empty:s,actions:c,card:l,confirmDelete:u,newLoopName:d,errors:f,builder:p,preview:m,builtInBadge:h,run:g,catalog:_,import:{done_one:`已导入 {{count}} 个循环`,done_other:`已导入 {{count}} 个循环`,skipped_one:`已跳过 {{count}} 个重复项:{{names}}`,skipped_other:`已跳过 {{count}} 个重复项:{{names}}`,invalid:`该文件不是有效的循环导出。`},automaticOnly:v};export{c as actions,v as automaticOnly,p as builder,h as builtInBadge,l as card,_ as catalog,a as categories,u as confirmDelete,y as default,s as empty,f as errors,i as gallery,n as newLoop,d as newLoopName,m as preview,g as run,r as sections,o as status,t as subtitle,e as title};
@@ -0,0 +1 @@
1
+ var e=`経過`,t=`ログ`,n=`まだ何も起きていません。`,r=`この実行では活動が記録されませんでした。`,i={range:`同種の実行は {{low}}〜{{high}} 分かかっています(直近 {{count}} 件)`,elapsed:`実行中 {{minutes}} 分`},a=`実行中に実際に起きたことから作成しています。`,o={start:`ステップ {{step}}:{{title}}`,startRetry:`ステップ {{step}}:{{title}} — {{iteration}} 回目`,done:`ステップ {{step}} 完了`,doneTimed:`ステップ {{step}} を {{seconds}} 秒で完了`,failed:`ステップ {{step}} は成功しませんでした`,interrupted:`ステップ {{step}} は完了前に中断されました`,doneTimedMin:`ステップ {{step}} を {{minutes}} 分で完了`,role:{work:`変更を加えています`,verify:`動作を確認しています`,decide:`完了かどうか判断しています`,fix:`失敗した箇所を修正しています`}},s={another:`まだ未達 — もう一周`,satisfied:`目標達成 — 次へ`},c={reading:`{{target}} を読んでいます`,readingBare:`コードを読んでいます`,editing:`{{target}} を変更しています`,editingBare:`コードを変更しています`,writing:`{{target}} を書いています`,writingBare:`新しいコードを書いています`,searching:`{{target}} を検索しています`,searchingBare:`コードを検索しています`,running:`{{target}} を実行しています`,runningBare:`コマンドを実行しています`,working:`{{target}} を進めています`,workingBare:`作業中`,exploring:`コードを見ています`,exploringBare:`コードを見ています`,testing:`テストを実行しています`,building:`プロジェクトをビルドしています`,typechecking:`型を確認しています`,linting:`コードスタイルを確認しています`,installing:`依存関係をインストールしています`,savingWork:`作業を保存しています`,checkingSpec:`仕様を確認しています`,bookkeeping:`自分用のメモを記録しています`,bookkeepingBare:`自分用のメモを記録しています`,writingSpec:`計画を書いています`,writingSpecBare:`計画を書いています`,writingFiles:`{{files}} 個のファイルを書いています({{names}}…)`,readingFiles:`{{files}} 個のファイルを読んでいます({{names}}…)`,editingFiles:`{{files}} 個のファイルを変更しています({{names}}…)`,delegating:`{{target}} に引き継いでいます`,delegatingBare:`担当に引き継いでいます`},l=`×{{count}}`,u={modeNarrated:e,modeLog:t,emptyLive:n,emptySettled:r,waiting:i,aiNote:a,step:o,decision:s,activity:c,repeats:l};export{c as activity,a as aiNote,s as decision,u as default,n as emptyLive,r as emptySettled,t as modeLog,e as modeNarrated,l as repeats,o as step,i as waiting};
@@ -0,0 +1 @@
1
+ var e=`Relato`,t=`Registro`,n=`Todavía no ha pasado nada.`,r=`No se registró actividad en esta ejecución.`,i={range:`Ejecuciones como esta han tardado {{low}}–{{high}} min (últimas {{count}})`,elapsed:`Lleva {{minutes}} min`},a=`Construido a partir de lo que realmente ocurrió durante la ejecución.`,o={start:`Paso {{step}}: {{title}}`,startRetry:`Paso {{step}}: {{title}} — intento {{iteration}}`,done:`Paso {{step}} terminado`,doneTimed:`Paso {{step}} terminado en {{seconds}} s`,failed:`El paso {{step}} no salió bien`,interrupted:`El paso {{step}} se interrumpió antes de terminar`,doneTimedMin:`Paso {{step}} terminado en {{minutes}} min`,role:{work:`haciendo los cambios`,verify:`comprobando que funciona`,decide:`decidiendo si está terminado`,fix:`arreglando lo que falló`}},s={another:`Aún no está — otra vuelta`,satisfied:`Objetivo cumplido — seguimos`},c={reading:`Leyendo {{target}}`,readingBare:`Leyendo el código`,editing:`Cambiando {{target}}`,editingBare:`Cambiando el código`,writing:`Escribiendo {{target}}`,writingBare:`Escribiendo código nuevo`,searching:`Buscando {{target}}`,searchingBare:`Buscando en el código`,running:`Ejecutando {{target}}`,runningBare:`Ejecutando un comando`,working:`Trabajando en {{target}}`,workingBare:`Trabajando`,exploring:`Revisando el código`,exploringBare:`Revisando el código`,testing:`Ejecutando los tests`,building:`Compilando el proyecto`,typechecking:`Comprobando los tipos`,linting:`Revisando el estilo del código`,installing:`Instalando dependencias`,savingWork:`Guardando el trabajo`,checkingSpec:`Comprobando la spec`,bookkeeping:`Anotando sus propias notas`,bookkeepingBare:`Anotando sus propias notas`,writingSpec:`Escribiendo el plan`,writingSpecBare:`Escribiendo el plan`,writingFiles:`Escribiendo {{files}} archivos ({{names}}…)`,readingFiles:`Leyendo {{files}} archivos ({{names}}…)`,editingFiles:`Cambiando {{files}} archivos ({{names}}…)`,delegating:`Pasando el trabajo al {{target}}`,delegatingBare:`Pasando el trabajo a un especialista`},l=`×{{count}}`,u={modeNarrated:e,modeLog:t,emptyLive:n,emptySettled:r,waiting:i,aiNote:a,step:o,decision:s,activity:c,repeats:l};export{c as activity,a as aiNote,s as decision,u as default,n as emptyLive,r as emptySettled,t as modeLog,e as modeNarrated,l as repeats,o as step,i as waiting};
@@ -0,0 +1 @@
1
+ var e=`过程`,t=`日志`,n=`还没有发生任何事。`,r=`本次运行没有记录到活动。`,i={range:`同类运行耗时 {{low}}–{{high}} 分钟(最近 {{count}} 次)`,elapsed:`已运行 {{minutes}} 分钟`},a=`根据运行期间真实发生的事情生成。`,o={start:`第 {{step}} 步:{{title}}`,startRetry:`第 {{step}} 步:{{title}} — 第 {{iteration}} 次尝试`,done:`第 {{step}} 步完成`,doneTimed:`第 {{step}} 步用 {{seconds}} 秒完成`,failed:`第 {{step}} 步未成功`,interrupted:`第 {{step}} 步在完成前被中断`,doneTimedMin:`第 {{step}} 步用 {{minutes}} 分钟完成`,role:{work:`进行修改`,verify:`验证是否可用`,decide:`判断是否完成`,fix:`修复失败的部分`}},s={another:`还没完成 — 再来一轮`,satisfied:`目标达成 — 继续`},c={reading:`正在读取 {{target}}`,readingBare:`正在读取代码`,editing:`正在修改 {{target}}`,editingBare:`正在修改代码`,writing:`正在编写 {{target}}`,writingBare:`正在编写新代码`,searching:`正在搜索 {{target}}`,searchingBare:`正在搜索代码`,running:`正在运行 {{target}}`,runningBare:`正在运行命令`,working:`正在处理 {{target}}`,workingBare:`正在工作`,exploring:`正在查看代码`,exploringBare:`正在查看代码`,testing:`正在运行测试`,building:`正在构建项目`,typechecking:`正在检查类型`,linting:`正在检查代码风格`,installing:`正在安装依赖`,savingWork:`正在保存工作`,checkingSpec:`正在检查规格`,bookkeeping:`正在记录自己的笔记`,bookkeepingBare:`正在记录自己的笔记`,writingSpec:`正在编写计划`,writingSpecBare:`正在编写计划`,writingFiles:`正在写入 {{files}} 个文件({{names}}…)`,readingFiles:`正在读取 {{files}} 个文件({{names}}…)`,editingFiles:`正在修改 {{files}} 个文件({{names}}…)`,delegating:`移交给 {{target}}`,delegatingBare:`移交给专家`},l=`×{{count}}`,u={modeNarrated:e,modeLog:t,emptyLive:n,emptySettled:r,waiting:i,aiNote:a,step:o,decision:s,activity:c,repeats:l};export{c as activity,a as aiNote,s as decision,u as default,n as emptyLive,r as emptySettled,t as modeLog,e as modeNarrated,l as repeats,o as step,i as waiting};
@@ -0,0 +1 @@
1
+ var e=`Récit`,t=`Journal`,n=`Rien ne s'est encore passé.`,r=`Aucune activité enregistrée pour cette exécution.`,i={range:`Les exécutions de ce type ont pris {{low}}–{{high}} min (dernières {{count}})`,elapsed:`En cours depuis {{minutes}} min`},a=`Construit à partir de ce qui s'est réellement passé pendant l'exécution.`,o={start:`Étape {{step}} : {{title}}`,startRetry:`Étape {{step}} : {{title}} — tentative {{iteration}}`,done:`Étape {{step}} terminée`,doneTimed:`Étape {{step}} terminée en {{seconds}} s`,failed:`L'étape {{step}} n'a pas abouti`,interrupted:`L'étape {{step}} a été interrompue avant la fin`,doneTimedMin:`Étape {{step}} terminée en {{minutes}} min`,role:{work:`réalisation des changements`,verify:`vérification du fonctionnement`,decide:`décision : est-ce terminé ?`,fix:`correction de ce qui a échoué`}},s={another:`Pas encore fini — nouveau tour`,satisfied:`Objectif atteint — on continue`},c={reading:`Lecture de {{target}}`,readingBare:`Lecture du code`,editing:`Modification de {{target}}`,editingBare:`Modification du code`,writing:`Écriture de {{target}}`,writingBare:`Écriture de nouveau code`,searching:`Recherche de {{target}}`,searchingBare:`Recherche dans le code`,running:`Exécution de {{target}}`,runningBare:`Exécution d'une commande`,working:`Travail sur {{target}}`,workingBare:`Travail en cours`,exploring:`Exploration du code`,exploringBare:`Exploration du code`,testing:`Exécution des tests`,building:`Compilation du projet`,typechecking:`Vérification des types`,linting:`Vérification du style`,installing:`Installation des dépendances`,savingWork:`Enregistrement du travail`,checkingSpec:`Vérification de la spec`,bookkeeping:`Prise de ses propres notes`,bookkeepingBare:`Prise de ses propres notes`,writingSpec:`Rédaction du plan`,writingSpecBare:`Rédaction du plan`,writingFiles:`Écriture de {{files}} fichiers ({{names}}…)`,readingFiles:`Lecture de {{files}} fichiers ({{names}}…)`,editingFiles:`Modification de {{files}} fichiers ({{names}}…)`,delegating:`Transmission au {{target}}`,delegatingBare:`Transmission à un spécialiste`},l=`×{{count}}`,u={modeNarrated:e,modeLog:t,emptyLive:n,emptySettled:r,waiting:i,aiNote:a,step:o,decision:s,activity:c,repeats:l};export{c as activity,a as aiNote,s as decision,u as default,n as emptyLive,r as emptySettled,t as modeLog,e as modeNarrated,l as repeats,o as step,i as waiting};
@@ -0,0 +1 @@
1
+ var e=`Relato`,t=`Registo`,n=`Ainda não aconteceu nada.`,r=`Não foi registada atividade nesta execução.`,i={range:`Execuções como esta levaram {{low}}–{{high}} min (últimas {{count}})`,elapsed:`A correr há {{minutes}} min`},a=`Construído a partir do que realmente aconteceu durante a execução.`,o={start:`Passo {{step}}: {{title}}`,startRetry:`Passo {{step}}: {{title}} — tentativa {{iteration}}`,done:`Passo {{step}} concluído`,doneTimed:`Passo {{step}} concluído em {{seconds}} s`,failed:`O passo {{step}} não correu bem`,interrupted:`O passo {{step}} foi interrompido antes de terminar`,doneTimedMin:`Passo {{step}} concluído em {{minutes}} min`,role:{work:`a fazer as alterações`,verify:`a comprovar que funciona`,decide:`a decidir se está terminado`,fix:`a corrigir o que falhou`}},s={another:`Ainda não está — outra volta`,satisfied:`Objetivo cumprido — a seguir`},c={reading:`A ler {{target}}`,readingBare:`A ler o código`,editing:`A alterar {{target}}`,editingBare:`A alterar o código`,writing:`A escrever {{target}}`,writingBare:`A escrever código novo`,searching:`A procurar {{target}}`,searchingBare:`A procurar no código`,running:`A executar {{target}}`,runningBare:`A executar um comando`,working:`A trabalhar em {{target}}`,workingBare:`A trabalhar`,exploring:`A percorrer o código`,exploringBare:`A percorrer o código`,testing:`A executar os testes`,building:`A compilar o projeto`,typechecking:`A verificar os tipos`,linting:`A verificar o estilo do código`,installing:`A instalar dependências`,savingWork:`A guardar o trabalho`,checkingSpec:`A verificar a spec`,bookkeeping:`A registar as suas notas`,bookkeepingBare:`A registar as suas notas`,writingSpec:`A escrever o plano`,writingSpecBare:`A escrever o plano`,writingFiles:`A escrever {{files}} ficheiros ({{names}}…)`,readingFiles:`A ler {{files}} ficheiros ({{names}}…)`,editingFiles:`A alterar {{files}} ficheiros ({{names}}…)`,delegating:`A passar o trabalho ao {{target}}`,delegatingBare:`A passar o trabalho a um especialista`},l=`×{{count}}`,u={modeNarrated:e,modeLog:t,emptyLive:n,emptySettled:r,waiting:i,aiNote:a,step:o,decision:s,activity:c,repeats:l};export{c as activity,a as aiNote,s as decision,u as default,n as emptyLive,r as emptySettled,t as modeLog,e as modeNarrated,l as repeats,o as step,i as waiting};
@@ -0,0 +1 @@
1
+ var e=`Verlauf`,t=`Protokoll`,n=`Bisher ist nichts passiert.`,r=`Für diesen Lauf wurde keine Aktivität erfasst.`,i={range:`Solche Läufe dauerten {{low}}–{{high}} min (letzte {{count}})`,elapsed:`Läuft seit {{minutes}} min`},a=`Aus dem erstellt, was während des Laufs tatsächlich passiert ist.`,o={start:`Schritt {{step}}: {{title}}`,startRetry:`Schritt {{step}}: {{title}} — Versuch {{iteration}}`,done:`Schritt {{step}} abgeschlossen`,doneTimed:`Schritt {{step}} in {{seconds}} s abgeschlossen`,failed:`Schritt {{step}} war nicht erfolgreich`,interrupted:`Schritt {{step}} wurde vor dem Ende abgebrochen`,doneTimedMin:`Schritt {{step}} in {{minutes}} min abgeschlossen`,role:{work:`nimmt die Änderungen vor`,verify:`prüft, ob es funktioniert`,decide:`entscheidet, ob es fertig ist`,fix:`behebt, was fehlschlug`}},s={another:`Noch nicht fertig — nächste Runde`,satisfied:`Ziel erreicht — weiter`},c={reading:`Liest {{target}}`,readingBare:`Liest den Code`,editing:`Ändert {{target}}`,editingBare:`Ändert den Code`,writing:`Schreibt {{target}}`,writingBare:`Schreibt neuen Code`,searching:`Sucht nach {{target}}`,searchingBare:`Sucht im Code`,running:`Führt {{target}} aus`,runningBare:`Führt einen Befehl aus`,working:`Arbeitet an {{target}}`,workingBare:`Arbeitet`,exploring:`Sieht den Code durch`,exploringBare:`Sieht den Code durch`,testing:`Führt die Tests aus`,building:`Baut das Projekt`,typechecking:`Prüft die Typen`,linting:`Prüft den Codestil`,installing:`Installiert Abhängigkeiten`,savingWork:`Sichert die Arbeit`,checkingSpec:`Prüft die Spec`,bookkeeping:`Notiert eigene Aufzeichnungen`,bookkeepingBare:`Notiert eigene Aufzeichnungen`,writingSpec:`Schreibt den Plan`,writingSpecBare:`Schreibt den Plan`,writingFiles:`Schreibt {{files}} Dateien ({{names}}…)`,readingFiles:`Liest {{files}} Dateien ({{names}}…)`,editingFiles:`Ändert {{files}} Dateien ({{names}}…)`,delegating:`Übergibt an {{target}}`,delegatingBare:`Übergibt an einen Spezialisten`},l=`×{{count}}`,u={modeNarrated:e,modeLog:t,emptyLive:n,emptySettled:r,waiting:i,aiNote:a,step:o,decision:s,activity:c,repeats:l};export{c as activity,a as aiNote,s as decision,u as default,n as emptyLive,r as emptySettled,t as modeLog,e as modeNarrated,l as repeats,o as step,i as waiting};
@@ -0,0 +1 @@
1
+ import{r as e}from"./rolldown-runtime-CNC7AqOf.js";var t=e({activity:()=>l,aiNote:()=>o,decision:()=>c,default:()=>d,emptyLive:()=>r,emptySettled:()=>i,modeLog:()=>`Log`,modeNarrated:()=>n,repeats:()=>u,step:()=>s,waiting:()=>a}),n=`Story`,r=`Nothing has happened yet.`,i=`No activity was recorded for this run.`,a={range:`Runs like this have taken {{low}}–{{high}} min (last {{count}})`,elapsed:`Running for {{minutes}} min`},o=`Built from what actually happened during the run.`,s={start:`Step {{step}}: {{title}}`,startRetry:`Step {{step}}: {{title}} — attempt {{iteration}}`,done:`Finished step {{step}}`,doneTimed:`Finished step {{step}} in {{seconds}}s`,failed:`Step {{step}} did not succeed`,interrupted:`Step {{step}} was interrupted before it finished`,doneTimedMin:`Finished step {{step}} in {{minutes}} min`,role:{work:`making the changes`,verify:`checking it works`,decide:`deciding whether it's done`,fix:`fixing what failed`}},c={another:`Not done yet — going round again`,satisfied:`Goal met — moving on`},l={reading:`Reading {{target}}`,readingBare:`Reading the code`,editing:`Changing {{target}}`,editingBare:`Changing the code`,writing:`Writing {{target}}`,writingBare:`Writing new code`,searching:`Searching for {{target}}`,searchingBare:`Searching the code`,running:`Running {{target}}`,runningBare:`Running a command`,working:`Working on {{target}}`,workingBare:`Working`,exploring:`Looking through the code`,exploringBare:`Looking through the code`,testing:`Running the tests`,building:`Building the project`,typechecking:`Checking the types`,linting:`Checking code style`,installing:`Installing dependencies`,savingWork:`Saving the work`,checkingSpec:`Checking the spec`,bookkeeping:`Recording its own notes`,bookkeepingBare:`Recording its own notes`,writingSpec:`Writing the plan`,writingSpecBare:`Writing the plan`,writingFiles:`Writing {{files}} files ({{names}}…)`,readingFiles:`Reading {{files}} files ({{names}}…)`,editingFiles:`Changing {{files}} files ({{names}}…)`,delegating:`Handing off to the {{target}}`,delegatingBare:`Handing off to a specialist`},u=`×{{count}}`,d={modeNarrated:n,modeLog:`Log`,emptyLive:r,emptySettled:i,waiting:a,aiNote:o,step:s,decision:c,activity:l,repeats:u};export{t};
@@ -0,0 +1 @@
1
+ var e=`Racconto`,t=`Registro`,n=`Non è ancora successo nulla.`,r=`Nessuna attività registrata per questa esecuzione.`,i={range:`Esecuzioni come questa hanno richiesto {{low}}–{{high}} min (ultime {{count}})`,elapsed:`In corso da {{minutes}} min`},a=`Costruito da ciò che è realmente accaduto durante l'esecuzione.`,o={start:`Passo {{step}}: {{title}}`,startRetry:`Passo {{step}}: {{title}} — tentativo {{iteration}}`,done:`Passo {{step}} completato`,doneTimed:`Passo {{step}} completato in {{seconds}} s`,failed:`Il passo {{step}} non è riuscito`,interrupted:`Il passo {{step}} è stato interrotto prima di finire`,doneTimedMin:`Passo {{step}} completato in {{minutes}} min`,role:{work:`sta applicando le modifiche`,verify:`sta verificando che funzioni`,decide:`sta decidendo se è finito`,fix:`sta correggendo ciò che è fallito`}},s={another:`Non ancora — un altro giro`,satisfied:`Obiettivo raggiunto — si procede`},c={reading:`Sta leggendo {{target}}`,readingBare:`Sta leggendo il codice`,editing:`Sta modificando {{target}}`,editingBare:`Sta modificando il codice`,writing:`Sta scrivendo {{target}}`,writingBare:`Sta scrivendo nuovo codice`,searching:`Sta cercando {{target}}`,searchingBare:`Sta cercando nel codice`,running:`Sta eseguendo {{target}}`,runningBare:`Sta eseguendo un comando`,working:`Sta lavorando su {{target}}`,workingBare:`Al lavoro`,exploring:`Sta esaminando il codice`,exploringBare:`Sta esaminando il codice`,testing:`Sta eseguendo i test`,building:`Sta compilando il progetto`,typechecking:`Sta verificando i tipi`,linting:`Sta verificando lo stile del codice`,installing:`Sta installando le dipendenze`,savingWork:`Sta salvando il lavoro`,checkingSpec:`Sta verificando la spec`,bookkeeping:`Sta annotando i propri appunti`,bookkeepingBare:`Sta annotando i propri appunti`,writingSpec:`Sta scrivendo il piano`,writingSpecBare:`Sta scrivendo il piano`,writingFiles:`Sta scrivendo {{files}} file ({{names}}…)`,readingFiles:`Sta leggendo {{files}} file ({{names}}…)`,editingFiles:`Sta modificando {{files}} file ({{names}}…)`,delegating:`Passa il lavoro al {{target}}`,delegatingBare:`Passa il lavoro a uno specialista`},l=`×{{count}}`,u={modeNarrated:e,modeLog:t,emptyLive:n,emptySettled:r,waiting:i,aiNote:a,step:o,decision:s,activity:c,repeats:l};export{c as activity,a as aiNote,s as decision,u as default,n as emptyLive,r as emptySettled,t as modeLog,e as modeNarrated,l as repeats,o as step,i as waiting};
@@ -0,0 +1 @@
1
+ var e=`Voltar ao painel`,t=`Ainda a trabalhar nisto…`,n=`Isto já foi resolvido.`,r=`Esta entrega precisa de uma decisão técnica. Use os controlos detalhados do painel.`,i=`Abrir pull request #{{number}}`,a=`Nenhum resumo foi registado.`,o={success:`A sua alteração está pronta para revisão`,successMany:`As {{count}} alterações estão prontas para revisão`,partial:`{{succeeded}} de {{total}} alterações estão prontas`,noChanges:`Não era preciso alterar nada`,failed:`Isto não pôde ser concluído`,failedPartial:`Só parte pôde ser concluída`},s={pill:`Confiança do revisor IA {{overall}}/100`,unavailable:`Sem pontuação do revisor`,tooltip:`A pontuação que o revisor IA dá a si mesmo — não é uma verificação independente.`},c={thisBuild:`Este trabalho custou {{amount}}`,allVersions:`Todas as versões juntas: {{amount}}`},l={"create-pr":`Aceitar e abrir um pull request`,publish:`Aceitar e enviar para revisão`,"merge-local":`Aceitar no meu projeto`,"mark-done":`Aceitar — nada a alterar`,generic:`Aceitar`,irreversibleWarning:`Isto escreve as alterações diretamente no seu projeto, no seu computador. Não há cópia de revisão separada e não pode ser desfeito.`,irreversibleConfirm:`Sim, escrever no meu projeto`},u={label:`Pedir alterações`,comingSoon:`Em breve: descreva a alteração numa frase.`,prompt:`O que quer alterar?`,placeholder:`p. ex. pôr o botão de login azul`,submit:`Enviar a alteração`,hint:`Continua de onde o trabalho ficou — não começa do zero.`},d={label:`Descartar isto`},f={title:`Vale a pena ver antes de aceitar`},p={whatYouAsked:`O que pediu`,whatIDid:`O que foi feito`,howItWasChecked:`Como foi verificado`},m={line:`{{files}} ficheiros alterados · +{{added}} / −{{removed}} linhas`,batchNotSplittable:`As alterações de ficheiros referem-se a toda a entrega, não a cada pedido.`},h={"app-verified":{title:`Medido pelo Specrails`,caveat:`Factos retirados das alterações reais.`},"ai-reported":{title:`Reportado pela IA`,caveat:`Palavras da própria IA. O Specrails não executou estas verificações.`},"reviewer-score":{title:`Autoavaliação do revisor IA`,caveat:`A IA a avaliar o seu próprio trabalho — útil, mas não é uma revisão independente.`}},g={filesChanged:`{{files}} ficheiros alterados (+{{added}} / −{{removed}} linhas)`,testFilesChanged:`{{count}} ficheiros de teste alterados`,noTestFilesChanged:`Nenhum ficheiro de teste alterado.`,commitsRecorded:`O trabalho foi registado em {{branches}} ramo(s)`,verificationPassed:`A IA reportou que as suas verificações passaram ({{count}})`,verificationFailed:`A IA reportou que as suas verificações FALHARAM ({{count}})`,noVerificationReported:`A IA não reportou qualquer verificação.`,verifyOutput:`Saída de verificação da IA:`,reviewerScore:`Pontuação global {{overall}}/100`,reviewerAspect:`{{aspect}}: {{score}}/100`,reviewerScoreUnavailable:`Não foi gerada pontuação do revisor.`,evidenceUnavailable:`sem evidência`},_={humanReviewRecommended:`O revisor IA pontuou {{overall}}/100 e recomenda que uma pessoa veja.`,lowConfidence:`O revisor IA pontuou apenas {{overall}}/100.`,reviewerFlag:`O revisor sinalizou:`,noTestsForChangedCode:`{{files}} ficheiros de código alterados sem alterações em testes.`},v={notFound:`Esta revisão não foi encontrada.`,loadFailed:`Não foi possível carregar a revisão.`,alreadyResolved:`Alguém já respondeu a isto.`,actionFailed:`Essa ação não foi concluída.`,revisionStale:`Isto acabou de ser resolvido noutro lugar — recarregue para ver o estado.`,revisionFailed:`Não foi possível iniciar a alteração. O seu texto foi guardado.`},y={title:`Versões anteriores ({{count}})`,label:`Versão {{version}}`,current:`está a ver esta`,originalBuild:`O trabalho original.`},b={title:`Isto pode ter ultrapassado o que pediu`,advisory:`É apenas uma sugestão — pode continuar a pedir alterações.`,costShare:`{{revisions}} alteração(ões) custaram {{revisionCost}} — {{share}}% dos {{originalCost}} do trabalho original.`,outOfScopeChurn:`{{files}} de {{total}} ficheiros alterados não faziam parte do pedido original.`,revisionCount:`Já pediu {{revisions}} rondas de alterações. Reescrever o pedido pode ser mais rápido.`},x={backToBoard:e,stillWorking:t,alreadyResolved:n,fineControlOnly:r,openPr:i,noSolutionRecorded:a,headline:o,confidence:s,cost:c,accept:l,requestChanges:u,discard:d,watchOut:f,sections:p,churn:m,tier:h,proof:g,watch:_,error:v,versions:y,drift:b};export{l as accept,n as alreadyResolved,e as backToBoard,m as churn,s as confidence,c as cost,x as default,d as discard,b as drift,v as error,r as fineControlOnly,o as headline,a as noSolutionRecorded,i as openPr,g as proof,u as requestChanges,p as sections,t as stillWorking,h as tier,y as versions,_ as watch,f as watchOut};
@@ -0,0 +1 @@
1
+ import{r as e}from"./rolldown-runtime-CNC7AqOf.js";var t=e({accept:()=>d,alreadyResolved:()=>i,backToBoard:()=>n,churn:()=>g,confidence:()=>l,cost:()=>u,default:()=>C,discard:()=>p,drift:()=>S,error:()=>b,fineControlOnly:()=>a,headline:()=>c,noSolutionRecorded:()=>s,openPr:()=>o,proof:()=>v,requestChanges:()=>f,sections:()=>h,stillWorking:()=>r,tier:()=>_,versions:()=>x,watch:()=>y,watchOut:()=>m}),n=`Back to the board`,r=`Still working on this…`,i=`This has already been resolved.`,a=`This delivery needs a technical decision. Use the detailed controls on the board.`,o=`Open pull request #{{number}}`,s=`No summary was recorded.`,c={success:`Your change is ready for review`,successMany:`All {{count}} changes are ready for review`,partial:`{{succeeded}} of {{total}} changes are ready`,noChanges:`Nothing needed changing`,failed:`This could not be completed`,failedPartial:`Only part of this could be completed`},l={pill:`AI reviewer confidence {{overall}}/100`,unavailable:`No reviewer score`,tooltip:`The AI reviewer's own score for its work — not an independent check.`},u={thisBuild:`This build cost {{amount}}`,allVersions:`All versions together: {{amount}}`},d={"create-pr":`Accept and open a pull request`,publish:`Accept and send for review`,"merge-local":`Accept into my project`,"mark-done":`Accept — nothing to change`,generic:`Accept`,irreversibleWarning:`This writes the changes directly into your project on your computer. There is no separate review copy and this cannot be undone.`,irreversibleConfirm:`Yes, write it into my project`},f={label:`Ask for changes`,comingSoon:`Coming next: describe the change in one sentence.`,prompt:`What would you like changed?`,placeholder:`e.g. make the login button blue`,submit:`Send the change`,hint:`This picks up where the work left off — it does not start over.`},p={label:`Throw this away`},m={title:`Worth a look before you accept`},h={whatYouAsked:`What you asked for`,whatIDid:`What was done`,howItWasChecked:`How it was checked`},g={line:`{{files}} files changed · +{{added}} / −{{removed}} lines`,batchNotSplittable:`File changes are reported for the whole delivery, not per request.`},_={"app-verified":{title:`Measured by Specrails`,caveat:`Facts taken from the actual changes.`},"ai-reported":{title:`Reported by the AI`,caveat:`The AI's own words. Specrails did not run these checks itself.`},"reviewer-score":{title:`AI reviewer's self-assessment`,caveat:`The AI grading its own work — useful, but not an independent review.`}},v={filesChanged:`{{files}} files changed (+{{added}} / −{{removed}} lines)`,testFilesChanged:`{{count}} test files were changed`,noTestFilesChanged:`No test files were changed.`,commitsRecorded:`Work was recorded on {{branches}} branch(es)`,verificationPassed:`The AI reported its checks passed ({{count}})`,verificationFailed:`The AI reported its checks FAILED ({{count}})`,noVerificationReported:`The AI did not report any verification.`,verifyOutput:`The AI's verification output:`,reviewerScore:`Overall score {{overall}}/100`,reviewerAspect:`{{aspect}}: {{score}}/100`,reviewerScoreUnavailable:`No reviewer score was produced.`,evidenceUnavailable:`evidence unavailable`},y={humanReviewRecommended:`The AI reviewer scored this {{overall}}/100 and recommends a person look at it.`,lowConfidence:`The AI reviewer scored this only {{overall}}/100.`,reviewerFlag:`The reviewer flagged:`,noTestsForChangedCode:`{{files}} code files changed with no test changes.`},b={notFound:`This review could not be found.`,loadFailed:`The review could not be loaded.`,alreadyResolved:`Someone already answered this.`,actionFailed:`That action did not go through.`,revisionStale:`This was just resolved elsewhere — reload to see where it stands.`,revisionFailed:`The change could not be started. Your text was kept.`},x={title:`Earlier versions ({{count}})`,label:`Version {{version}}`,current:`you're looking at this one`,originalBuild:`The original build.`},S={title:`This may have outgrown its original request`,advisory:`Only a suggestion — you can keep asking for changes.`,costShare:`{{revisions}} change(s) have cost {{revisionCost}} — {{share}}% of the {{originalCost}} original build.`,outOfScopeChurn:`{{files}} of {{total}} changed files were never part of the original request.`,revisionCount:`You've asked for {{revisions}} rounds of changes. Rewriting the request may be quicker.`},C={backToBoard:n,stillWorking:r,alreadyResolved:i,fineControlOnly:a,openPr:o,noSolutionRecorded:s,headline:c,confidence:l,cost:u,accept:d,requestChanges:f,discard:p,watchOut:m,sections:h,churn:g,tier:_,proof:v,watch:y,error:b,versions:x,drift:S};export{t};
@@ -0,0 +1 @@
1
+ var e=`Torna alla bacheca`,t=`Ancora al lavoro…`,n=`È già stato risolto.`,r=`Questa consegna richiede una decisione tecnica. Usa i controlli dettagliati nella bacheca.`,i=`Apri la pull request #{{number}}`,a=`Nessun riepilogo registrato.`,o={success:`La tua modifica è pronta per la revisione`,successMany:`Tutte le {{count}} modifiche sono pronte per la revisione`,partial:`{{succeeded}} modifiche su {{total}} sono pronte`,noChanges:`Non c'era nulla da cambiare`,failed:`Non è stato possibile completarlo`,failedPartial:`È stato completato solo in parte`},s={pill:`Fiducia del revisore IA {{overall}}/100`,unavailable:`Nessun punteggio del revisore`,tooltip:`Il punteggio che il revisore IA assegna a sé stesso — non è un controllo indipendente.`},c={thisBuild:`Questo lavoro è costato {{amount}}`,allVersions:`Tutte le versioni insieme: {{amount}}`},l={"create-pr":`Accetta e apri una pull request`,publish:`Accetta e invia in revisione`,"merge-local":`Accetta nel mio progetto`,"mark-done":`Accetta — nulla da cambiare`,generic:`Accetta`,irreversibleWarning:`Questo scrive le modifiche direttamente nel tuo progetto, sul tuo computer. Non esiste una copia di revisione separata e non è annullabile.`,irreversibleConfirm:`Sì, scrivi nel mio progetto`},u={label:`Chiedi modifiche`,comingSoon:`Prossimamente: descrivi la modifica in una frase.`,prompt:`Cosa vuoi cambiare?`,placeholder:`es. rendi blu il pulsante di accesso`,submit:`Invia la modifica`,hint:`Riprende da dove il lavoro si è fermato — non ricomincia.`},d={label:`Butta via`},f={title:`Da guardare prima di accettare`},p={whatYouAsked:`Cosa hai chiesto`,whatIDid:`Cosa è stato fatto`,howItWasChecked:`Come è stato verificato`},m={line:`{{files}} file modificati · +{{added}} / −{{removed}} righe`,batchNotSplittable:`Le modifiche ai file riguardano tutta la consegna, non ogni richiesta.`},h={"app-verified":{title:`Misurato da Specrails`,caveat:`Fatti presi dalle modifiche reali.`},"ai-reported":{title:`Riferito dall'IA`,caveat:`Parole dell'IA stessa. Specrails non ha eseguito questi controlli.`},"reviewer-score":{title:`Autovalutazione del revisore IA`,caveat:`L'IA valuta il proprio lavoro — utile, ma non è una revisione indipendente.`}},g={filesChanged:`{{files}} file modificati (+{{added}} / −{{removed}} righe)`,testFilesChanged:`{{count}} file di test modificati`,noTestFilesChanged:`Nessun file di test modificato.`,commitsRecorded:`Il lavoro è stato registrato su {{branches}} ramo/i`,verificationPassed:`L'IA ha riferito che i suoi controlli sono passati ({{count}})`,verificationFailed:`L'IA ha riferito che i suoi controlli sono FALLITI ({{count}})`,noVerificationReported:`L'IA non ha riferito alcuna verifica.`,verifyOutput:`Output di verifica dell'IA:`,reviewerScore:`Punteggio complessivo {{overall}}/100`,reviewerAspect:`{{aspect}}: {{score}}/100`,reviewerScoreUnavailable:`Nessun punteggio del revisore prodotto.`,evidenceUnavailable:`prove non disponibili`},_={humanReviewRecommended:`Il revisore IA ha dato {{overall}}/100 e consiglia che una persona lo guardi.`,lowConfidence:`Il revisore IA ha dato solo {{overall}}/100.`,reviewerFlag:`Il revisore ha segnalato:`,noTestsForChangedCode:`{{files}} file di codice modificati senza modifiche ai test.`},v={notFound:`Questa revisione non è stata trovata.`,loadFailed:`Non è stato possibile caricare la revisione.`,alreadyResolved:`Qualcuno ha già risposto.`,actionFailed:`L'azione non è andata a buon fine.`,revisionStale:`È stato appena risolto altrove — ricarica per vedere lo stato.`,revisionFailed:`Non è stato possibile avviare la modifica. Il tuo testo è stato conservato.`},y={title:`Versioni precedenti ({{count}})`,label:`Versione {{version}}`,current:`stai guardando questa`,originalBuild:`Il lavoro originale.`},b={title:`Questo potrebbe essere andato oltre la richiesta iniziale`,advisory:`Solo un suggerimento — puoi continuare a chiedere modifiche.`,costShare:`{{revisions}} modifica/che sono costate {{revisionCost}} — il {{share}}% dei {{originalCost}} del lavoro originale.`,outOfScopeChurn:`{{files}} su {{total}} file modificati non facevano parte della richiesta iniziale.`,revisionCount:`Hai chiesto {{revisions}} giri di modifiche. Riscrivere la richiesta potrebbe essere più rapido.`},x={backToBoard:e,stillWorking:t,alreadyResolved:n,fineControlOnly:r,openPr:i,noSolutionRecorded:a,headline:o,confidence:s,cost:c,accept:l,requestChanges:u,discard:d,watchOut:f,sections:p,churn:m,tier:h,proof:g,watch:_,error:v,versions:y,drift:b};export{l as accept,n as alreadyResolved,e as backToBoard,m as churn,s as confidence,c as cost,x as default,d as discard,b as drift,v as error,r as fineControlOnly,o as headline,a as noSolutionRecorded,i as openPr,g as proof,u as requestChanges,p as sections,t as stillWorking,h as tier,y as versions,_ as watch,f as watchOut};
@@ -0,0 +1 @@
1
+ var e=`Retour au tableau`,t=`Toujours en cours…`,n=`Cela a déjà été résolu.`,r=`Cette livraison nécessite une décision technique. Utilisez les contrôles détaillés du tableau.`,i=`Ouvrir la pull request #{{number}}`,a=`Aucun résumé n'a été enregistré.`,o={success:`Votre changement est prêt à être relu`,successMany:`Les {{count}} changements sont prêts à être relus`,partial:`{{succeeded}} changements sur {{total}} sont prêts`,noChanges:`Rien n'avait besoin d'être changé`,failed:`Cela n'a pas pu être terminé`,failedPartial:`Seule une partie a pu être terminée`},s={pill:`Confiance du relecteur IA {{overall}}/100`,unavailable:`Pas de score du relecteur`,tooltip:`Le score que le relecteur IA s'attribue — ce n'est pas une vérification indépendante.`},c={thisBuild:`Ce travail a coûté {{amount}}`,allVersions:`Toutes les versions cumulées : {{amount}}`},l={"create-pr":`Accepter et ouvrir une pull request`,publish:`Accepter et envoyer en relecture`,"merge-local":`Accepter dans mon projet`,"mark-done":`Accepter — rien à changer`,generic:`Accepter`,irreversibleWarning:`Cela écrit les changements directement dans votre projet, sur votre ordinateur. Il n'y a pas de copie de relecture et c'est irréversible.`,irreversibleConfirm:`Oui, écrire dans mon projet`},u={label:`Demander des changements`,comingSoon:`Bientôt : décrivez le changement en une phrase.`,prompt:`Que voulez-vous changer ?`,placeholder:`ex. mettre le bouton de connexion en bleu`,submit:`Envoyer le changement`,hint:`Reprend là où le travail s'est arrêté — sans repartir de zéro.`},d={label:`Jeter ceci`},f={title:`À regarder avant d'accepter`},p={whatYouAsked:`Ce que vous avez demandé`,whatIDid:`Ce qui a été fait`,howItWasChecked:`Comment cela a été vérifié`},m={line:`{{files}} fichiers modifiés · +{{added}} / −{{removed}} lignes`,batchNotSplittable:`Les modifications de fichiers concernent toute la livraison, pas chaque demande.`},h={"app-verified":{title:`Mesuré par Specrails`,caveat:`Faits tirés des modifications réelles.`},"ai-reported":{title:`Rapporté par l'IA`,caveat:`Les mots de l'IA. Specrails n'a pas exécuté ces vérifications.`},"reviewer-score":{title:`Auto-évaluation du relecteur IA`,caveat:`L'IA note son propre travail — utile, mais pas une relecture indépendante.`}},g={filesChanged:`{{files}} fichiers modifiés (+{{added}} / −{{removed}} lignes)`,testFilesChanged:`{{count}} fichiers de test modifiés`,noTestFilesChanged:`Aucun fichier de test modifié.`,commitsRecorded:`Le travail a été enregistré sur {{branches}} branche(s)`,verificationPassed:`L'IA a rapporté que ses vérifications ont réussi ({{count}})`,verificationFailed:`L'IA a rapporté que ses vérifications ont ÉCHOUÉ ({{count}})`,noVerificationReported:`L'IA n'a rapporté aucune vérification.`,verifyOutput:`Sortie de vérification de l'IA :`,reviewerScore:`Score global {{overall}}/100`,reviewerAspect:`{{aspect}} : {{score}}/100`,reviewerScoreUnavailable:`Aucun score de relecteur produit.`,evidenceUnavailable:`preuves indisponibles`},_={humanReviewRecommended:`Le relecteur IA a noté {{overall}}/100 et recommande une relecture humaine.`,lowConfidence:`Le relecteur IA n'a noté que {{overall}}/100.`,reviewerFlag:`Le relecteur a signalé :`,noTestsForChangedCode:`{{files}} fichiers de code modifiés sans changement de test.`},v={notFound:`Cette relecture est introuvable.`,loadFailed:`La relecture n'a pas pu être chargée.`,alreadyResolved:`Quelqu'un a déjà répondu.`,actionFailed:`Cette action n'a pas abouti.`,revisionStale:`Cela vient d'être résolu ailleurs — rechargez pour voir l'état.`,revisionFailed:`Le changement n'a pas pu démarrer. Votre texte a été conservé.`},y={title:`Versions précédentes ({{count}})`,label:`Version {{version}}`,current:`vous consultez celle-ci`,originalBuild:`Le travail initial.`},b={title:`Cela dépasse peut-être votre demande initiale`,advisory:`Simple suggestion — vous pouvez continuer à demander des changements.`,costShare:`{{revisions}} changement(s) ont coûté {{revisionCost}} — {{share}} % des {{originalCost}} du travail initial.`,outOfScopeChurn:`{{files}} des {{total}} fichiers modifiés ne faisaient pas partie de la demande initiale.`,revisionCount:`Vous avez demandé {{revisions}} séries de changements. Réécrire la demande sera peut-être plus rapide.`},x={backToBoard:e,stillWorking:t,alreadyResolved:n,fineControlOnly:r,openPr:i,noSolutionRecorded:a,headline:o,confidence:s,cost:c,accept:l,requestChanges:u,discard:d,watchOut:f,sections:p,churn:m,tier:h,proof:g,watch:_,error:v,versions:y,drift:b};export{l as accept,n as alreadyResolved,e as backToBoard,m as churn,s as confidence,c as cost,x as default,d as discard,b as drift,v as error,r as fineControlOnly,o as headline,a as noSolutionRecorded,i as openPr,g as proof,u as requestChanges,p as sections,t as stillWorking,h as tier,y as versions,_ as watch,f as watchOut};
@@ -0,0 +1 @@
1
+ var e=`返回面板`,t=`仍在处理…`,n=`此项已处理完毕。`,r=`这次交付需要技术决策。请使用面板上的详细控件。`,i=`打开 pull request #{{number}}`,a=`未记录摘要。`,o={success:`你的更改已可供审阅`,successMany:`全部 {{count}} 项更改已可供审阅`,partial:`{{total}} 项更改中有 {{succeeded}} 项已就绪`,noChanges:`无需改动`,failed:`未能完成`,failedPartial:`仅完成了一部分`},s={pill:`AI 审阅者信心 {{overall}}/100`,unavailable:`没有审阅者评分`,tooltip:`AI 审阅者给自己的评分 — 不是独立检查。`},c={thisBuild:`本次花费 {{amount}}`,allVersions:`所有版本合计:{{amount}}`},l={"create-pr":`接受并创建 pull request`,publish:`接受并送交审阅`,"merge-local":`接受到我的项目`,"mark-done":`接受 — 无需改动`,generic:`接受`,irreversibleWarning:`这会把更改直接写入你电脑上的项目。没有单独的审阅副本,且无法撤销。`,irreversibleConfirm:`是的,写入我的项目`},u={label:`要求修改`,comingSoon:`即将推出:用一句话描述要改什么。`,prompt:`你想改什么?`,placeholder:`例如:把登录按钮改成蓝色`,submit:`发送修改`,hint:`从现有成果继续 — 不会重新开始。`},d={label:`丢弃`},f={title:`接受前值得一看`},p={whatYouAsked:`你要求的`,whatIDid:`已完成的`,howItWasChecked:`如何检查的`},m={line:`{{files}} 个文件改动 · +{{added}} / −{{removed}} 行`,batchNotSplittable:`文件改动按整次交付统计,不按单个请求。`},h={"app-verified":{title:`由 Specrails 测量`,caveat:`取自实际改动的事实。`},"ai-reported":{title:`由 AI 报告`,caveat:`AI 自己的说法。Specrails 并未运行这些检查。`},"reviewer-score":{title:`AI 审阅者自评`,caveat:`AI 给自己的工作打分 — 有用,但不是独立审阅。`}},g={filesChanged:`{{files}} 个文件改动(+{{added}} / −{{removed}} 行)`,testFilesChanged:`改动了 {{count}} 个测试文件`,noTestFilesChanged:`没有改动测试文件。`,commitsRecorded:`工作已记录在 {{branches}} 个分支上`,verificationPassed:`AI 报告其检查通过({{count}})`,verificationFailed:`AI 报告其检查失败({{count}})`,noVerificationReported:`AI 未报告任何验证。`,verifyOutput:`AI 的验证输出:`,reviewerScore:`总分 {{overall}}/100`,reviewerAspect:`{{aspect}}:{{score}}/100`,reviewerScoreUnavailable:`未生成审阅者评分。`,evidenceUnavailable:`无证据`},_={humanReviewRecommended:`AI 审阅者给出 {{overall}}/100,建议由人来查看。`,lowConfidence:`AI 审阅者仅给出 {{overall}}/100。`,reviewerFlag:`审阅者标记:`,noTestsForChangedCode:`{{files}} 个代码文件有改动但测试无改动。`},v={notFound:`找不到此审阅。`,loadFailed:`无法加载审阅。`,alreadyResolved:`已有人回应过。`,actionFailed:`该操作未成功。`,revisionStale:`此项刚在别处被处理 — 请重新加载查看状态。`,revisionFailed:`无法开始修改。你的文字已保留。`},y={title:`早前的版本({{count}})`,label:`版本 {{version}}`,current:`你正在查看这个`,originalBuild:`最初的成果。`},b={title:`这可能已超出你最初的要求`,advisory:`只是建议 — 你仍可以继续要求修改。`,costShare:`{{revisions}} 次修改已花费 {{revisionCost}} — 是最初 {{originalCost}} 的 {{share}}%。`,outOfScopeChurn:`{{total}} 个改动文件中有 {{files}} 个不属于最初的要求。`,revisionCount:`你已经要求了 {{revisions}} 轮修改。重写需求可能更快。`},x={backToBoard:e,stillWorking:t,alreadyResolved:n,fineControlOnly:r,openPr:i,noSolutionRecorded:a,headline:o,confidence:s,cost:c,accept:l,requestChanges:u,discard:d,watchOut:f,sections:p,churn:m,tier:h,proof:g,watch:_,error:v,versions:y,drift:b};export{l as accept,n as alreadyResolved,e as backToBoard,m as churn,s as confidence,c as cost,x as default,d as discard,b as drift,v as error,r as fineControlOnly,o as headline,a as noSolutionRecorded,i as openPr,g as proof,u as requestChanges,p as sections,t as stillWorking,h as tier,y as versions,_ as watch,f as watchOut};
@@ -0,0 +1 @@
1
+ var e=`Zurück zum Board`,t=`Läuft noch…`,n=`Das wurde bereits entschieden.`,r=`Diese Lieferung braucht eine technische Entscheidung. Nutze die Detailsteuerung im Board.`,i=`Pull Request #{{number}} öffnen`,a=`Keine Zusammenfassung erfasst.`,o={success:`Deine Änderung ist bereit zur Prüfung`,successMany:`Alle {{count}} Änderungen sind bereit zur Prüfung`,partial:`{{succeeded}} von {{total}} Änderungen sind fertig`,noChanges:`Es musste nichts geändert werden`,failed:`Das konnte nicht abgeschlossen werden`,failedPartial:`Nur ein Teil konnte abgeschlossen werden`},s={pill:`Sicherheit des KI-Reviewers {{overall}}/100`,unavailable:`Keine Reviewer-Bewertung`,tooltip:`Die Bewertung, die sich der KI-Reviewer selbst gibt — keine unabhängige Prüfung.`},c={thisBuild:`Diese Arbeit kostete {{amount}}`,allVersions:`Alle Versionen zusammen: {{amount}}`},l={"create-pr":`Annehmen und Pull Request öffnen`,publish:`Annehmen und zur Prüfung senden`,"merge-local":`In mein Projekt übernehmen`,"mark-done":`Annehmen — nichts zu ändern`,generic:`Annehmen`,irreversibleWarning:`Damit werden die Änderungen direkt in dein Projekt auf deinem Rechner geschrieben. Es gibt keine separate Prüfkopie und es ist nicht rückgängig zu machen.`,irreversibleConfirm:`Ja, in mein Projekt schreiben`},u={label:`Änderungen erbitten`,comingSoon:`Kommt als Nächstes: Änderung in einem Satz beschreiben.`,prompt:`Was soll geändert werden?`,placeholder:`z. B. den Login-Button blau machen`,submit:`Änderung senden`,hint:`Setzt dort an, wo die Arbeit aufgehört hat — kein Neuanfang.`},d={label:`Verwerfen`},f={title:`Vor dem Annehmen ansehen`},p={whatYouAsked:`Was du wolltest`,whatIDid:`Was getan wurde`,howItWasChecked:`Wie es geprüft wurde`},m={line:`{{files}} Dateien geändert · +{{added}} / −{{removed}} Zeilen`,batchNotSplittable:`Dateiänderungen gelten für die gesamte Lieferung, nicht pro Anfrage.`},h={"app-verified":{title:`Von Specrails gemessen`,caveat:`Fakten aus den tatsächlichen Änderungen.`},"ai-reported":{title:`Von der KI berichtet`,caveat:`Worte der KI selbst. Specrails hat diese Prüfungen nicht ausgeführt.`},"reviewer-score":{title:`Selbsteinschätzung des KI-Reviewers`,caveat:`Die KI bewertet ihre eigene Arbeit — nützlich, aber keine unabhängige Prüfung.`}},g={filesChanged:`{{files}} Dateien geändert (+{{added}} / −{{removed}} Zeilen)`,testFilesChanged:`{{count}} Testdateien geändert`,noTestFilesChanged:`Keine Testdateien geändert.`,commitsRecorded:`Arbeit wurde auf {{branches}} Branch(es) festgehalten`,verificationPassed:`Die KI berichtete, ihre Prüfungen seien bestanden ({{count}})`,verificationFailed:`Die KI berichtete, ihre Prüfungen seien FEHLGESCHLAGEN ({{count}})`,noVerificationReported:`Die KI berichtete keine Verifizierung.`,verifyOutput:`Verifizierungsausgabe der KI:`,reviewerScore:`Gesamtbewertung {{overall}}/100`,reviewerAspect:`{{aspect}}: {{score}}/100`,reviewerScoreUnavailable:`Keine Reviewer-Bewertung erzeugt.`,evidenceUnavailable:`Belege nicht verfügbar`},_={humanReviewRecommended:`Der KI-Reviewer gab {{overall}}/100 und empfiehlt eine menschliche Prüfung.`,lowConfidence:`Der KI-Reviewer gab nur {{overall}}/100.`,reviewerFlag:`Der Reviewer merkte an:`,noTestsForChangedCode:`{{files}} Code-Dateien geändert, ohne Teständerungen.`},v={notFound:`Diese Prüfung wurde nicht gefunden.`,loadFailed:`Die Prüfung konnte nicht geladen werden.`,alreadyResolved:`Jemand hat das schon beantwortet.`,actionFailed:`Diese Aktion ist nicht durchgegangen.`,revisionStale:`Das wurde gerade anderswo entschieden — neu laden, um den Stand zu sehen.`,revisionFailed:`Die Änderung konnte nicht gestartet werden. Dein Text wurde behalten.`},y={title:`Frühere Versionen ({{count}})`,label:`Version {{version}}`,current:`diese siehst du gerade`,originalBuild:`Die ursprüngliche Arbeit.`},b={title:`Das geht möglicherweise über die ursprüngliche Anfrage hinaus`,advisory:`Nur ein Hinweis — du kannst weiter Änderungen erbitten.`,costShare:`{{revisions}} Änderung(en) kosteten {{revisionCost}} — {{share}}% der {{originalCost}} der ursprünglichen Arbeit.`,outOfScopeChurn:`{{files}} von {{total}} geänderten Dateien gehörten nie zur ursprünglichen Anfrage.`,revisionCount:`Du hast {{revisions}} Änderungsrunden erbeten. Die Anfrage neu zu formulieren geht vielleicht schneller.`},x={backToBoard:e,stillWorking:t,alreadyResolved:n,fineControlOnly:r,openPr:i,noSolutionRecorded:a,headline:o,confidence:s,cost:c,accept:l,requestChanges:u,discard:d,watchOut:f,sections:p,churn:m,tier:h,proof:g,watch:_,error:v,versions:y,drift:b};export{l as accept,n as alreadyResolved,e as backToBoard,m as churn,s as confidence,c as cost,x as default,d as discard,b as drift,v as error,r as fineControlOnly,o as headline,a as noSolutionRecorded,i as openPr,g as proof,u as requestChanges,p as sections,t as stillWorking,h as tier,y as versions,_ as watch,f as watchOut};
@@ -0,0 +1 @@
1
+ var e=`Volver al tablero`,t=`Todavía trabajando en esto…`,n=`Esto ya se ha resuelto.`,r=`Esta entrega necesita una decisión técnica. Usa los controles detallados del tablero.`,i=`Abrir pull request #{{number}}`,a=`No se registró ningún resumen.`,o={success:`Tu cambio está listo para revisar`,successMany:`Los {{count}} cambios están listos para revisar`,partial:`{{succeeded}} de {{total}} cambios están listos`,noChanges:`No hacía falta cambiar nada`,failed:`Esto no se pudo completar`,failedPartial:`Solo se pudo completar una parte`},s={pill:`Confianza del revisor IA {{overall}}/100`,unavailable:`Sin puntuación del revisor`,tooltip:`La puntuación que el revisor IA se da a sí mismo — no es una comprobación independiente.`},c={thisBuild:`Este trabajo costó {{amount}}`,allVersions:`Todas las versiones juntas: {{amount}}`},l={"create-pr":`Aceptar y abrir un pull request`,publish:`Aceptar y enviar a revisión`,"merge-local":`Aceptar en mi proyecto`,"mark-done":`Aceptar — nada que cambiar`,generic:`Aceptar`,irreversibleWarning:`Esto escribe los cambios directamente en tu proyecto, en tu ordenador. No hay copia de revisión aparte y no se puede deshacer.`,irreversibleConfirm:`Sí, escríbelo en mi proyecto`},u={label:`Pedir cambios`,comingSoon:`Muy pronto: describe el cambio en una frase.`,prompt:`¿Qué quieres cambiar?`,placeholder:`p. ej. pon el botón de login en azul`,submit:`Enviar el cambio`,hint:`Continúa desde donde quedó el trabajo — no empieza de cero.`},d={label:`Tirar esto`},f={title:`Merece un vistazo antes de aceptar`},p={whatYouAsked:`Lo que pediste`,whatIDid:`Lo que se hizo`,howItWasChecked:`Cómo se comprobó`},m={line:`{{files}} archivos cambiados · +{{added}} / −{{removed}} líneas`,batchNotSplittable:`Los cambios de archivos se informan para toda la entrega, no por petición.`},h={"app-verified":{title:`Medido por Specrails`,caveat:`Datos tomados de los cambios reales.`},"ai-reported":{title:`Informado por la IA`,caveat:`Palabras de la propia IA. Specrails no ejecutó estas comprobaciones.`},"reviewer-score":{title:`Autoevaluación del revisor IA`,caveat:`La IA calificando su propio trabajo — útil, pero no es una revisión independiente.`}},g={filesChanged:`{{files}} archivos cambiados (+{{added}} / −{{removed}} líneas)`,testFilesChanged:`Se cambiaron {{count}} archivos de test`,noTestFilesChanged:`No se cambió ningún archivo de test.`,commitsRecorded:`El trabajo se registró en {{branches}} rama(s)`,verificationPassed:`La IA informó de que sus comprobaciones pasaron ({{count}})`,verificationFailed:`La IA informó de que sus comprobaciones FALLARON ({{count}})`,noVerificationReported:`La IA no informó de ninguna verificación.`,verifyOutput:`Salida de verificación de la IA:`,reviewerScore:`Puntuación global {{overall}}/100`,reviewerAspect:`{{aspect}}: {{score}}/100`,reviewerScoreUnavailable:`No se generó puntuación del revisor.`,evidenceUnavailable:`sin evidencia`},_={humanReviewRecommended:`El revisor IA puntuó esto {{overall}}/100 y recomienda que lo mire una persona.`,lowConfidence:`El revisor IA puntuó esto solo {{overall}}/100.`,reviewerFlag:`El revisor señaló:`,noTestsForChangedCode:`{{files}} archivos de código cambiados sin cambios en tests.`},v={notFound:`No se encontró esta revisión.`,loadFailed:`No se pudo cargar la revisión.`,alreadyResolved:`Alguien ya respondió a esto.`,actionFailed:`Esa acción no se completó.`,revisionStale:`Esto se acaba de resolver en otro sitio — recarga para ver cómo está.`,revisionFailed:`No se pudo iniciar el cambio. Tu texto se ha conservado.`},y={title:`Versiones anteriores ({{count}})`,label:`Versión {{version}}`,current:`estás viendo esta`,originalBuild:`El trabajo original.`},b={title:`Esto puede haberse salido de lo que pediste`,advisory:`Solo es una sugerencia — puedes seguir pidiendo cambios.`,costShare:`{{revisions}} cambio(s) han costado {{revisionCost}} — el {{share}}% de los {{originalCost}} del trabajo original.`,outOfScopeChurn:`{{files}} de {{total}} archivos cambiados no formaban parte de la petición original.`,revisionCount:`Ya has pedido {{revisions}} rondas de cambios. Reescribir la petición puede ser más rápido.`},x={backToBoard:e,stillWorking:t,alreadyResolved:n,fineControlOnly:r,openPr:i,noSolutionRecorded:a,headline:o,confidence:s,cost:c,accept:l,requestChanges:u,discard:d,watchOut:f,sections:p,churn:m,tier:h,proof:g,watch:_,error:v,versions:y,drift:b};export{l as accept,n as alreadyResolved,e as backToBoard,m as churn,s as confidence,c as cost,x as default,d as discard,b as drift,v as error,r as fineControlOnly,o as headline,a as noSolutionRecorded,i as openPr,g as proof,u as requestChanges,p as sections,t as stillWorking,h as tier,y as versions,_ as watch,f as watchOut};
@@ -0,0 +1 @@
1
+ var e=`ボードに戻る`,t=`まだ作業中です…`,n=`これはすでに解決済みです。`,r=`この納品には技術的な判断が必要です。ボードの詳細操作を使ってください。`,i=`プルリクエスト #{{number}} を開く`,a=`要約は記録されていません。`,o={success:`変更のレビュー準備ができました`,successMany:`{{count}} 件すべての変更がレビュー可能です`,partial:`{{total}} 件のうち {{succeeded}} 件が完了`,noChanges:`変更は不要でした`,failed:`完了できませんでした`,failedPartial:`一部しか完了できませんでした`},s={pill:`AI レビュアーの確信度 {{overall}}/100`,unavailable:`レビュアースコアなし`,tooltip:`AI レビュアーが自分に付けたスコアです — 独立した検証ではありません。`},c={thisBuild:`この作業の費用 {{amount}}`,allVersions:`全バージョン合計:{{amount}}`},l={"create-pr":`承認してプルリクエストを作成`,publish:`承認してレビューに出す`,"merge-local":`自分のプロジェクトに取り込む`,"mark-done":`承認 — 変更なし`,generic:`承認`,irreversibleWarning:`変更をあなたのパソコンのプロジェクトへ直接書き込みます。別のレビュー用コピーはなく、取り消せません。`,irreversibleConfirm:`はい、プロジェクトに書き込む`},u={label:`修正を依頼`,comingSoon:`近日公開:修正内容を一文で伝えられます。`,prompt:`何を変更しますか?`,placeholder:`例:ログインボタンを青にする`,submit:`変更を送る`,hint:`これまでの成果から続けます — やり直しではありません。`},d={label:`破棄する`},f={title:`承認する前に確認したい点`},p={whatYouAsked:`依頼した内容`,whatIDid:`行われた作業`,howItWasChecked:`確認の方法`},m={line:`{{files}} ファイル変更 · +{{added}} / −{{removed}} 行`,batchNotSplittable:`ファイル変更は納品全体の集計で、依頼ごとではありません。`},h={"app-verified":{title:`Specrails が計測`,caveat:`実際の変更から得た事実です。`},"ai-reported":{title:`AI の報告`,caveat:`AI 自身の言葉です。Specrails はこれらの検査を実行していません。`},"reviewer-score":{title:`AI レビュアーの自己評価`,caveat:`AI が自分の作業を採点したもの — 参考にはなりますが独立したレビューではありません。`}},g={filesChanged:`{{files}} ファイル変更(+{{added}} / −{{removed}} 行)`,testFilesChanged:`テストファイル {{count}} 件を変更`,noTestFilesChanged:`テストファイルの変更はありません。`,commitsRecorded:`作業は {{branches}} 本のブランチに記録されました`,verificationPassed:`AI は検査に合格したと報告しました({{count}})`,verificationFailed:`AI は検査が失敗したと報告しました({{count}})`,noVerificationReported:`AI は検証を報告しませんでした。`,verifyOutput:`AI の検証出力:`,reviewerScore:`総合スコア {{overall}}/100`,reviewerAspect:`{{aspect}}:{{score}}/100`,reviewerScoreUnavailable:`レビュアースコアは生成されませんでした。`,evidenceUnavailable:`証跡なし`},_={humanReviewRecommended:`AI レビュアーは {{overall}}/100 と評価し、人による確認を推奨しています。`,lowConfidence:`AI レビュアーの評価は {{overall}}/100 にとどまりました。`,reviewerFlag:`レビュアーの指摘:`,noTestsForChangedCode:`コード {{files}} ファイルが変更されましたが、テストの変更はありません。`},v={notFound:`このレビューは見つかりませんでした。`,loadFailed:`レビューを読み込めませんでした。`,alreadyResolved:`すでに誰かが回答しています。`,actionFailed:`その操作は完了しませんでした。`,revisionStale:`これは別の場所で解決済みです — 再読み込みして状態を確認してください。`,revisionFailed:`変更を開始できませんでした。入力した文章は保持されています。`},y={title:`以前のバージョン({{count}})`,label:`バージョン {{version}}`,current:`いま見ているもの`,originalBuild:`最初の成果。`},b={title:`当初の依頼から広がっているようです`,advisory:`あくまで提案です — 修正を続けて依頼できます。`,costShare:`{{revisions}} 件の変更で {{revisionCost}} かかりました — 当初 {{originalCost}} の {{share}}% です。`,outOfScopeChurn:`変更された {{total}} ファイルのうち {{files}} 件は当初の依頼に含まれていませんでした。`,revisionCount:`すでに {{revisions}} 回の修正を依頼しています。依頼を書き直したほうが早いかもしれません。`},x={backToBoard:e,stillWorking:t,alreadyResolved:n,fineControlOnly:r,openPr:i,noSolutionRecorded:a,headline:o,confidence:s,cost:c,accept:l,requestChanges:u,discard:d,watchOut:f,sections:p,churn:m,tier:h,proof:g,watch:_,error:v,versions:y,drift:b};export{l as accept,n as alreadyResolved,e as backToBoard,m as churn,s as confidence,c as cost,x as default,d as discard,b as drift,v as error,r as fineControlOnly,o as headline,a as noSolutionRecorded,i as openPr,g as proof,u as requestChanges,p as sections,t as stillWorking,h as tier,y as versions,_ as watch,f as watchOut};
@@ -0,0 +1 @@
1
+ import{t as e}from"./createLucideIcon-Bjbbp_KS.js";var t=e(`arrow-left`,[[`path`,{d:`m12 19-7-7 7-7`,key:`1l729n`}],[`path`,{d:`M19 12H5`,key:`x3x0zl`}]]),n=e(`save`,[[`path`,{d:`M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z`,key:`1c8476`}],[`path`,{d:`M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7`,key:`1ydtos`}],[`path`,{d:`M7 3v4a1 1 0 0 0 1 1h7`,key:`t51u73`}]]);export{t as n,n as t};
@@ -0,0 +1 @@
1
+ var e={title:`言語`,description:`Desktop 全体の UI 言語。即座に適用され、再起動は不要です。`,selectLabel:`インターフェース言語`,updateFailed:`言語設定を保存できませんでした`},t={title:`プロジェクト設定`},n={saveFailed:`保存に失敗しました: {{message}}`},r={title:`パイプラインテレメトリ`,description:`診断エクスポート用にトークン使用量、フェーズ時間、サブエージェントの活動を記録します。デフォルトはオフです。`,toggleLabel:`パイプラインテレメトリを有効化`,toggleDescription:`オンにすると、パイプラインジョブの OTEL データがローカルに記録されます。ジョブカードの <mono>診断をエクスポート</mono> ボタンからダウンロードできます。`,enabled:`パイプラインテレメトリを有効にしました`,disabled:`パイプラインテレメトリを無効にしました`,saveFailed:`テレメトリ設定の保存に失敗しました`},i={title:`レールのプレプロンプト`,description:`implement と batch-implement のレールジョブで、チケットコンテキストの後・実行前に追加されるプロジェクト固有の指示です。`,label:`プレプロンプト`,placeholder:`例: 段階的な変更を優先し、マイグレーションの後方互換性を保ち、レールの変更ごとにテストを追加すること。`,helper:`すべてのレール実装の実行に常に添えたい、安定したプロジェクト指針に使用してください。`,saveButton:`プレプロンプトを保存`,cleared:`プレプロンプトをクリアしました`,saved:`プレプロンプトを保存しました`,saveFailed:`プレプロンプトの保存に失敗しました`},a={title:`Freestyle プレプロンプト`,description:`Freestyle で選択したプロバイダーに送られる指示です。Freestyle は OpenSpec パイプラインをスキップし、このプレプロンプトとスペックテキストをプロバイダーに渡して自律的に実装させます。空欄の場合は組み込みのデフォルトを使用します。`,label:`Freestyle プレプロンプト`,placeholder:`空欄の場合はデフォルトの Freestyle 指示を使用します。`,helper:`スペックテキストはこのプレプロンプトの後に自動で追加されます。空欄 = デフォルト。`,saveButton:`Freestyle プレプロンプトを保存`,resetToDefault:`Freestyle プレプロンプトをデフォルトにリセットしました`,saved:`Freestyle プレプロンプトを保存しました`,saveFailed:`Freestyle プレプロンプトの保存に失敗しました`},o={title:`予算`,description:`このプロジェクトの1日あたりの支出上限を設定します。上限に達するとキューは自動で一時停止します。`,dailyLabel:`日次予算(USD)`,dailyHelper:`無効にするには空欄のままにします。支出は過去24時間で計算されます。`,dailyPlaceholder:`例: 5.00`,perJobLabel:`ジョブ単位のコストアラート(USD)`,perJobHelper:`このプロジェクトの単一ジョブがこの金額を超えたときにアラートします。`,perJobPlaceholder:`例: 0.50`,invalidNumber:`正の数値を入力するか、無効にするには空欄のままにしてください`,dailyRemoved:`日次予算を削除しました`,dailySet:"日次予算を ${{amount}} に設定しました",perJobAlertDisabled:`ジョブ単位のコストアラートを無効にしました`,alertSet:"${{amount}} を超えるジョブにアラートを設定しました",saveBudgetFailed:`予算の保存に失敗しました`,saveThresholdFailed:`しきい値の保存に失敗しました`},s={nav:{appearance:`外観`,specrailsAgents:`Specrails Agents`,code:`コード`,terminal:`ターミナル`,updates:`更新`,mobile:`モバイル`,mcp:`MCP`,projects:`プロジェクト`,advanced:`詳細`,webhooks:`Webhooks`,about:`概要`},title:`Desktop 設定`,description:`登録済みプロジェクトの管理と Desktop 情報の表示。`,registeredProjects:`登録済みプロジェクト`,noProjects:`登録されたプロジェクトはまだありません`,techUrlDescription:`specrails-tech API のベース URL(デフォルト: http://localhost:3000)`,techUrlSaved:`specrails-tech の URL を保存しました`,techUrlSaveFailed:`URL の保存に失敗しました`,budgetAlertsHeading:`予算とアラート`,dailyBudgetLabel:`Desktop 日次予算(USD)`,dailyBudgetHelper:`全プロジェクト共通のグローバルな日次支出上限。超過するとキューは自動で一時停止します。`,dailyBudgetPlaceholder:`例: 10.00`,perJobHelper:`単一ジョブがこの金額を超えたときにアラートします。無効にするには空欄のままにします。`,costAlertsDisabled:`コストアラートを無効にしました`,dailyBudgetRemoved:`Desktop の日次予算を削除しました`,dailyBudgetSet:"Desktop の日次予算を ${{amount}} に設定しました",dailyBudgetSaveFailed:`Desktop の日次予算の保存に失敗しました`,projectRemoved:`プロジェクトを削除しました`,projectRemoveFailed:`プロジェクトの削除に失敗しました`,onboardingHeading:`オンボーディング`,platformTour:`プラットフォームツアー`,platformTourDescription:`ウェルカムウィザードを再生して主要機能を確認します。`,replayTour:`ツアーを再生`,terminalPanelHeading:`ターミナルパネル`,infoHeading:`Desktop 情報`,infoPort:`ポート`,infoProjects:`プロジェクト`,infoDb:`Desktop DB`},c={heading:`OS 通知`,description:`ジョブの完了・失敗時にネイティブのデスクトップ通知を表示します。通知はタブがフォーカスされていないときのみ表示されます。`,enableLabel:`OS 通知を有効化`,notifyOn:`通知の対象:`,filterAll:`すべて(完了と失敗)`,filterCompleted:`完了のみ`,filterFailed:`失敗のみ`,enabledToast:`OS 通知を有効にしました`,disabledToast:`OS 通知を無効にしました`},l={heading:`アウトバウンド Webhook`,description:`Desktop のイベントを外部ツール(Slack、Zapier、CI/CD)に通知します。シークレットが設定されている場合、リクエストは <code>X-Specrails-Signature</code> で署名されます。`,eventJobCompleted:`ジョブ完了`,eventJobFailed:`ジョブ失敗`,eventDailyBudgetExceeded:`日次予算超過`,statusOn:`オン`,statusOff:`オフ`,disable:`無効化`,enable:`有効化`,sendTestPing:`テスト ping を送信`,addHeading:`Webhook を追加`,secretPlaceholder:`署名シークレット(任意)`,addButton:`Webhook を追加`,urlRequired:`URL は必須です`,selectEvent:`イベントを1つ以上選択してください`,added:`Webhook を追加しました`,addFailed:`Webhook の追加に失敗しました`,updateFailed:`Webhook の更新に失敗しました`,removed:`Webhook を削除しました`,removeFailed:`Webhook の削除に失敗しました`,testPingSent:`テスト ping を送信しました`,testPingFailed:`テスト ping の送信に失敗しました`},u={title:`ターミナルパネル`,desktopDescription:`プロジェクト別のオーバーライドがない限り、すべてのプロジェクトに適用される Desktop 全体のデフォルトです。`,projectDescription:`ターミナルパネルのプロジェクト別オーバーライド。Desktop のデフォルトを継承するには、フィールドを変更しないでください。`,fontFamily:`フォントファミリー`,fontSize:`フォントサイズ({{min}}–{{max}})`,renderMode:`レンダリングモード`,copyOnSelect:`選択時にコピー`,shellIntegration:`シェル統合(OSC 133 マーク)`,notifyLongRunning:`長時間実行コマンドの通知`,longCommandThreshold:`長時間コマンドのしきい値(ms)`,imageRendering:`インライン画像レンダリング(Sixel + iTerm2)`,browserShortcutUrl:`ブラウザショートカット URL`,quickScript:`クイックスクリプト(アクティブなターミナルに貼り付け — Enter は手動)`,reset:`リセット`,unsavedChanges:`未保存の変更`,clearOverride:`オーバーライドをクリア`,clear:`クリア`,inheritingDefault:`Desktop のデフォルトを継承中`,nothingToSave:`保存する変更はありません`,saved:`ターミナル設定を保存しました`},d={heading:`Code セクション`,summaryLanguage:`要約の言語`,monthlyBudget:`月次予算(USD)`,budgetHelper:"暦月ごとの `surface=file-summary` 支出の上限。ユーザーが開始した再生成は上限を超えられます。"},f={taglines:{dracula:`オリジナル — 紫がかったダークにネオンのアクセント`,"aurora-light":`プレミアムライト — Linear風のインディゴと温かみのあるオフホワイト`,"obsidian-dark":`プレミアムダーク — 青みがかった漆黒にエレクトリックなアクセント`,specrails:`ブランドテーマ — 深いネイビーインディゴに鮮やかなシアン`,"code-rain":`蛍光ターミナル — 緑がかった漆黒にソフトミント`,galaxy:`深宇宙のブルーと輝くブレードの軌跡`},heading:`外観`,themeGroupLabel:`テーマ`,currentlyActive:`現在アクティブ`,updateFailed:`テーマの更新に失敗しました`},p={heading:`モバイルコンパニオン`,description:`スマートフォンの SpecRails Companion アプリから Specrails を操作します。通信は 100% ローカルネットワーク経由です。デフォルトはオフです。`,accessOn:`モバイルアクセス オン`,accessOff:`モバイルアクセス オフ`,listeningOnPort:`ポート {{port}} で待機中`,notListening:`待機していません`,turnOn:`オンにする`,turnOff:`オフにする`,pairWebDevice:`Web コンパニオンをペアリング`,reset:`リセット`,resetConfirm:`モバイル ID をリセットしますか?ペアリング済みのすべてのデバイスが無効化され、再ペアリングが必要になります。`,identityReset:`モバイル ID をリセットしました`,enableFailed:`モバイルアクセスを有効にできませんでした: {{message}}`,disableFailed:`モバイルアクセスを無効にできませんでした: {{message}}`,windowsFirewall:`初回有効化時に Windows ファイアウォールが SpecRails サーバーの許可を求めます — 「プライベートネットワークで許可」を選択してください。`,pairedDevices:`ペアリング済みデバイス`,noDevices:`ペアリングされたデバイスはまだありません。`,revokeDevice:`{{name}} を無効化`},m={title:`Web コンパニオンをペアリング`,description:`スマートフォンで specrails.dev/companion-app を開き、それでこのコードをスキャンしてください。`,startFailed:`ペアリングを開始できませんでした: {{error}}`,showThenScan:`スマートフォンでこれをスキャンしたら、「スマートフォンのコードをスキャン」をタップし、カメラをスマートフォンに向けてください。`,scanAnswer:`スマートフォンのコードをスキャン`,scanning:`カメラをスマートフォンのコードに向けてください…`,cameraFailed:`カメラを利用できません: {{message}}`,notAnswer:`その QR はペアリング応答ではありません。`,connecting:`接続中…`,paired:`✓ ペアリング済み`,pairedToast:`Web コンパニオンをペアリングしました`,answerRejected:`デスクトップがそのコードを拒否しました。新しいコードを生成して再試行してください。`,copyCode:`コードをコピー`,codeCopied:`コードをコピーしました`,cancel:`キャンセル`},h={heading:`Specrails Core`,installed:`インストール済み:`,updateAvailable:`アップデートあり: {{version}}`,upToDate:`最新です`,neverChecked:`未確認`,check:`アップデートを確認`,checking:`確認中…`,update:`{{version}} に更新`,downloading:`ダウンロード中…`,materializing:`インストール中…`,affectsAll:`すべてのプロジェクトに適用 — 再起動不要。`,unavailable:`このビルドではコアの更新は利用できません。`,toastDone:`Specrails Core を {{version}} に更新しました`,toastError:`コアの更新に失敗しました: {{message}}`,toastUpToDate:`Specrails Core は最新です`,toastCheckFailed:`更新の確認に失敗しました: {{message}}`},g={heading:`Specrails Desktop`,installed:`インストール済み:`,check:`アップデートを確認`,checking:`確認中…`,upToDate:`最新バージョンです`,updateAvailable:`アップデートあり: {{version}}`,autoHint:`起動時と6時間ごとに自動確認します。`,unavailable:`アップデートはデスクトップアプリでのみ利用できます。`,toastUpToDate:`Specrails Desktop は最新です`,toastCheckFailed:`アップデートの確認に失敗しました: {{message}}`},_={title:`{{name}} — 設定`,description:`プロジェクト設定:プロンプト、ブランチ、環境、予算、テレメトリ、ターミナル。`,nav:{general:`一般`,branch:`ブランチ`,environment:`環境`,budget:`予算`,telemetry:`テレメトリ`,terminal:`ターミナル`}},v={title:`統合ブランチ`,description:`並列レールが分岐し、ドラフト PR の対象となるブランチです。空欄にするとリポジトリのデフォルトブランチに自動解決されます。`,placeholder:`自動(リポジトリのデフォルト)`,resolved:`レールは <mono>{{branch}}</mono> から分岐します`,save:`ブランチを保存`,saved:`統合ブランチを保存しました`,saveFailed:`統合ブランチを保存できませんでした`},y={title:`Worktree 環境`,description:`このプロジェクトが rail ジョブと分離された loop worktree に渡す環境変数名を選びます。保存されるのは名前だけで、値は実行開始時に読み取られ、Desktop プロセスにない場合は login shell から復元を試みます。`,label:`環境変数`,placeholder:`NODE_AUTH_TOKEN`,helper:`Enter または追加を押します。カンマやスペース区切りで複数の名前を貼り付けられます。`,add:`追加`,empty:`このプロジェクト固有の変数はまだ設定されていません。`,remove:`{{name}} を削除`,save:`環境を保存`,saved:`Worktree 環境を保存しました`,saveFailed:`Worktree 環境を保存できませんでした`,invalidName:`{{name}} は有効な環境変数名ではありません`,noValues:`ここには変数名だけを追加してください。KEY=value のシークレットは入力しないでください。`},b={heading:`Specrails Agents`,description:`AI プロバイダーごとに specrails-core パイプラインのエージェントをカスタマイズ — モデルと推論エフォート。変更は次回の実行から適用され、再起動は不要です。`,loadFailed:`エージェント設定を読み込めませんでした。`,modeDefault:`デフォルト`,modeCustom:`カスタム`,notDetected:`未検出`,notSignedIn:`未サインイン`,pipeline:`パイプライン`,pipelineHint:`実行全体のモデルとエフォート — 下で上書きしない限りサブエージェントに継承されます。`,model:`モデル`,effort:`エフォート`,defaultModel:`デフォルト({{model}})`,defaultEffort:`デフォルトのエフォート`,agentsTitle:`パイプラインエージェント`,agentsHint:`このプロバイダーのエージェント別モデル上書き。`,inheritNote:`Codex のサブエージェントは設計上、パイプラインのモデルとエフォートを継承します。`,noPerAgentNote:`このプロバイダーはエージェント別モデルに対応していません。`,reset:`デフォルトに戻す`,agentNames:{"sr-architect":`アーキテクト`,"sr-developer":`デベロッパー`,"sr-reviewer":`レビュアー`}},x={language:e,page:t,errors:n,telemetry:r,prePrompt:i,freestylePrePrompt:a,budget:o,desktop:s,notifications:c,webhooks:l,terminal:u,codeSection:d,appearance:f,mobile:p,pairWeb:m,coreUpdate:h,appUpdate:g,projectDialog:_,integrationBranch:v,worktreeEnv:y,specrailsAgents:b};export{g as appUpdate,f as appearance,o as budget,d as codeSection,h as coreUpdate,x as default,s as desktop,n as errors,a as freestylePrePrompt,v as integrationBranch,e as language,p as mobile,c as notifications,t as page,m as pairWeb,i as prePrompt,_ as projectDialog,b as specrailsAgents,r as telemetry,u as terminal,l as webhooks,y as worktreeEnv};
@@ -0,0 +1 @@
1
+ var e={title:`Langue`,description:`Langue de l'interface pour tout Desktop. S'applique instantanément — aucun redémarrage requis.`,selectLabel:`Langue de l'interface`,updateFailed:`Impossible d'enregistrer la préférence de langue`},t={title:`Paramètres du projet`},n={saveFailed:`Échec de l'enregistrement : {{message}}`},r={title:`Télémétrie du pipeline`,description:`Capture l'usage des tokens, la durée des phases et l'activité des sous-agents pour l'export de diagnostic. Désactivé par défaut.`,toggleLabel:`Activer la télémétrie du pipeline`,toggleDescription:`Quand elle est activée, les données OTEL des jobs du pipeline sont capturées localement. Utilisez le bouton <mono>Exporter le diagnostic</mono> sur n'importe quelle carte de job pour les télécharger.`,enabled:`Télémétrie du pipeline activée`,disabled:`Télémétrie du pipeline désactivée`,saveFailed:`Échec de l'enregistrement du réglage de télémétrie`},i={title:`Pré-prompt de rail`,description:`Instructions supplémentaires propres au projet, ajoutées aux jobs de rail implement et batch-implement après le contexte du ticket et avant l'exécution.`,label:`Pré-prompt`,placeholder:`Exemple : privilégier les changements incrémentaux, garder les migrations rétrocompatibles et ajouter des tests pour chaque changement de rail.`,helper:`À utiliser pour des consignes projet stables qui doivent accompagner chaque exécution d'implémentation sur rail.`,saveButton:`Enregistrer le pré-prompt`,cleared:`Pré-prompt effacé`,saved:`Pré-prompt enregistré`,saveFailed:`Échec de l'enregistrement du pré-prompt`},a={title:`Pré-prompt Freestyle`,description:`Instruction envoyée au fournisseur sélectionné en mode Freestyle. Freestyle saute le pipeline OpenSpec — il transmet au fournisseur ce pré-prompt plus le texte de la spec et le laisse implémenter en autonomie. Laissez vide pour utiliser la valeur par défaut intégrée.`,label:`Pré-prompt Freestyle`,placeholder:`Laissez vide pour utiliser l'instruction Freestyle par défaut.`,helper:`Le texte de la spec est ajouté automatiquement après ce pré-prompt. Vide = défaut.`,saveButton:`Enregistrer le pré-prompt Freestyle`,resetToDefault:`Pré-prompt Freestyle réinitialisé à la valeur par défaut`,saved:`Pré-prompt Freestyle enregistré`,saveFailed:`Échec de l'enregistrement du pré-prompt Freestyle`},o={title:`Budget`,description:`Définissez un plafond de dépense quotidien pour ce projet. La file se met automatiquement en pause quand la limite est atteinte.`,dailyLabel:`Budget quotidien (USD)`,dailyHelper:`Laissez vide pour désactiver. La dépense est calculée sur les dernières 24 heures.`,dailyPlaceholder:`ex. 5.00`,perJobLabel:`Alerte de coût par job (USD)`,perJobHelper:`Alerte quand un seul job de ce projet dépasse ce montant.`,perJobPlaceholder:`ex. 0.50`,invalidNumber:`Saisissez un nombre positif ou laissez vide pour désactiver`,dailyRemoved:`Budget quotidien supprimé`,dailySet:`Budget quotidien défini à {{amount}} $`,perJobAlertDisabled:`Alerte de coût par job désactivée`,alertSet:`Alerte définie pour les jobs dépassant {{amount}} $`,saveBudgetFailed:`Échec de l'enregistrement du budget`,saveThresholdFailed:`Échec de l'enregistrement du seuil`},s={nav:{appearance:`Apparence`,specrailsAgents:`Specrails Agents`,code:`Code`,terminal:`Terminal`,updates:`Mises à jour`,mobile:`Mobile`,mcp:`MCP`,projects:`Projets`,advanced:`Avancé`,webhooks:`Webhooks`,about:`À propos`},title:`Paramètres de Desktop`,description:`Gérez les projets enregistrés et consultez les informations de Desktop.`,registeredProjects:`Projets enregistrés`,noProjects:`Aucun projet enregistré pour l'instant`,techUrlDescription:`URL de base de l'API specrails-tech (par défaut : http://localhost:3000)`,techUrlSaved:`URL specrails-tech enregistrée`,techUrlSaveFailed:`Échec de l'enregistrement de l'URL`,budgetAlertsHeading:`Budget & alertes`,dailyBudgetLabel:`Budget quotidien de Desktop (USD)`,dailyBudgetHelper:`Limite de dépense quotidienne globale pour tous les projets. Les files se mettent automatiquement en pause en cas de dépassement.`,dailyBudgetPlaceholder:`ex. 10.00`,perJobHelper:`Alerte quand un seul job dépasse ce montant. Laissez vide pour désactiver.`,costAlertsDisabled:`Alertes de coût désactivées`,dailyBudgetRemoved:`Budget quotidien de Desktop supprimé`,dailyBudgetSet:`Budget quotidien de Desktop défini à {{amount}} $`,dailyBudgetSaveFailed:`Échec de l'enregistrement du budget quotidien de Desktop`,projectRemoved:`Projet supprimé`,projectRemoveFailed:`Échec de la suppression du projet`,onboardingHeading:`Onboarding`,platformTour:`Visite de la plateforme`,platformTourDescription:`Rejouez l'assistant de bienvenue pour revoir les fonctionnalités clés.`,replayTour:`Rejouer la visite`,terminalPanelHeading:`Panneau de terminal`,infoHeading:`Informations de Desktop`,infoPort:`Port`,infoProjects:`Projets`,infoDb:`BD de Desktop`},c={heading:`Notifications système`,description:`Affiche des notifications de bureau natives quand des jobs se terminent ou échouent. Les notifications n'apparaissent que lorsque l'onglet n'a pas le focus.`,enableLabel:`Activer les notifications système`,notifyOn:`Notifier pour :`,filterAll:`Tout (terminés & échoués)`,filterCompleted:`Terminés uniquement`,filterFailed:`Échoués uniquement`,enabledToast:`Notifications système activées`,disabledToast:`Notifications système désactivées`},l={heading:`Webhooks sortants`,description:`Notifiez des outils externes (Slack, Zapier, CI/CD) lors des événements de Desktop. Les requêtes sont signées via <code>X-Specrails-Signature</code> quand un secret est défini.`,eventJobCompleted:`Job terminé`,eventJobFailed:`Job en échec`,eventDailyBudgetExceeded:`Budget quotidien dépassé`,statusOn:`actif`,statusOff:`inactif`,disable:`Désactiver`,enable:`Activer`,sendTestPing:`Envoyer un ping de test`,addHeading:`Ajouter un webhook`,secretPlaceholder:`Secret de signature (facultatif)`,addButton:`Ajouter le webhook`,urlRequired:`L'URL est requise`,selectEvent:`Sélectionnez au moins un événement`,added:`Webhook ajouté`,addFailed:`Échec de l'ajout du webhook`,updateFailed:`Échec de la mise à jour du webhook`,removed:`Webhook supprimé`,removeFailed:`Échec de la suppression du webhook`,testPingSent:`Ping de test envoyé`,testPingFailed:`Échec de l'envoi du ping de test`},u={title:`Panneau de terminal`,desktopDescription:`Valeurs par défaut de Desktop, appliquées à chaque projet sauf surcharge par projet.`,projectDescription:`Surcharges par projet pour le panneau de terminal. Laissez un champ inchangé pour hériter de la valeur par défaut de Desktop.`,fontFamily:`Police`,fontSize:`Taille de police ({{min}}–{{max}})`,renderMode:`Mode de rendu`,copyOnSelect:`Copier à la sélection`,shellIntegration:`Intégration shell (marques OSC 133)`,notifyLongRunning:`Notifier les commandes de longue durée`,longCommandThreshold:`Seuil de commande longue (ms)`,imageRendering:`Rendu d'images inline (Sixel + iTerm2)`,browserShortcutUrl:`URL du raccourci navigateur`,quickScript:`Script rapide (collé dans le terminal actif — Entrée manuelle)`,reset:`Réinitialiser`,unsavedChanges:`Modifications non enregistrées`,clearOverride:`Effacer la surcharge`,clear:`Effacer`,inheritingDefault:`Hérite de la valeur par défaut de Desktop`,nothingToSave:`Rien à enregistrer`,saved:`Paramètres du terminal enregistrés`},d={heading:`Section Code`,summaryLanguage:`Langue des résumés`,monthlyBudget:`Budget mensuel (USD)`,budgetHelper:"Plafond de dépense `surface=file-summary` par mois calendaire. Les régénérations lancées par l'utilisateur peuvent le dépasser."},f={taglines:{dracula:`L'original — sombre teinté de violet aux accents néon éclatants`,"aurora-light":`Clair premium — indigo inspiré de Linear sur blanc cassé chaleureux`,"obsidian-dark":`Sombre premium — presque noir teinté de bleu aux accents électriques`,specrails:`Thème de la marque — bleu marine-indigo profond aux accents cyan saturés`,"code-rain":`Terminal phosphore — menthe douce sur fond presque noir verdâtre`,galaxy:`Bleu spatial profond avec une traînée de lame lumineuse`},heading:`Apparence`,themeGroupLabel:`Thème`,currentlyActive:`Actuellement actif`,updateFailed:`Échec de la mise à jour du thème`},p={heading:`Compagnon mobile`,description:`Contrôlez Specrails depuis l'application SpecRails Companion sur votre téléphone, 100 % via votre réseau local. Désactivé par défaut.`,accessOn:`Accès mobile activé`,accessOff:`Accès mobile désactivé`,listeningOnPort:`À l'écoute sur le port {{port}}`,notListening:`Pas à l'écoute`,turnOn:`Activer`,turnOff:`Désactiver`,pairWebDevice:`Appairer le compagnon web`,reset:`Réinitialiser`,resetConfirm:`Réinitialiser l'identité mobile ? Tous les appareils appairés seront révoqués et devront s'appairer à nouveau.`,identityReset:`Identité mobile réinitialisée`,enableFailed:`Impossible d'activer l'accès mobile : {{message}}`,disableFailed:`Impossible de désactiver l'accès mobile : {{message}}`,windowsFirewall:`Le Pare-feu Windows demandera d'autoriser le serveur SpecRails à la première activation — choisissez « Autoriser sur les réseaux privés ».`,pairedDevices:`Appareils appairés`,noDevices:`Aucun appareil appairé pour l'instant.`,revokeDevice:`Révoquer {{name}}`},m={title:`Appairer le compagnon web`,description:`Ouvrez specrails.dev/companion-app sur votre téléphone, puis scannez ce code avec.`,startFailed:`Impossible de démarrer l'appairage : {{error}}`,showThenScan:`Une fois que votre téléphone l'a scanné, appuyez sur « Scanner le code du téléphone » et pointez la caméra vers votre téléphone.`,scanAnswer:`Scanner le code du téléphone`,scanning:`Pointez la caméra vers le code sur votre téléphone…`,cameraFailed:`Caméra indisponible : {{message}}`,notAnswer:`Ce QR code n'est pas une réponse d'appairage.`,connecting:`Connexion…`,paired:`✓ Appairé`,pairedToast:`Compagnon web appairé`,answerRejected:`Le bureau a rejeté ce code. Générez-en un nouveau et réessayez.`,copyCode:`Copier le code`,codeCopied:`Code copié`,cancel:`Annuler`},h={heading:`Specrails Core`,installed:`Installé :`,updateAvailable:`Mise à jour disponible : {{version}}`,upToDate:`À jour`,neverChecked:`Non vérifié`,check:`Rechercher des mises à jour`,checking:`Vérification…`,update:`Mettre à jour vers {{version}}`,downloading:`Téléchargement…`,materializing:`Installation…`,affectsAll:`S'applique à tous les projets — aucun redémarrage requis.`,unavailable:`Les mises à jour du core ne sont pas disponibles dans cette version.`,toastDone:`Specrails Core mis à jour vers {{version}}`,toastError:`Échec de la mise à jour du core : {{message}}`,toastUpToDate:`Specrails Core est à jour`,toastCheckFailed:`Échec de la vérification : {{message}}`},g={heading:`Specrails Desktop`,installed:`Installée :`,check:`Rechercher des mises à jour`,checking:`Vérification…`,upToDate:`Vous avez la dernière version`,updateAvailable:`Mise à jour disponible : {{version}}`,autoHint:`Vérification automatique au lancement et toutes les 6 heures.`,unavailable:`Les mises à jour ne sont disponibles que dans l'app de bureau.`,toastUpToDate:`Specrails Desktop est à jour`,toastCheckFailed:`Échec de la recherche de mises à jour : {{message}}`},_={title:`{{name}} — Paramètres`,description:`Configuration du projet : prompts, branche, environnement, budget, télémétrie et terminal.`,nav:{general:`Général`,branch:`Branche`,environment:`Environnement`,budget:`Budget`,telemetry:`Télémétrie`,terminal:`Terminal`}},v={title:`Branche d'intégration`,description:`La branche depuis laquelle les rails parallèles se ramifient et que ciblent leurs PR en brouillon. Laissez vide pour résoudre automatiquement vers la branche par défaut du dépôt.`,placeholder:`automatique (branche par défaut)`,resolved:`Les rails partent de <mono>{{branch}}</mono>`,save:`Enregistrer la branche`,saved:`Branche d'intégration enregistrée`,saveFailed:`Impossible d'enregistrer la branche d'intégration`},y={title:`Environnement des worktrees`,description:`Choisissez les noms de variables d'environnement que ce projet transmet aux jobs de rail et aux worktrees isolés des loops. Seuls les noms sont enregistrés ; les valeurs sont lues au démarrage, avec récupération depuis le login shell si le processus Desktop ne les a pas.`,label:`Variable d'environnement`,placeholder:`NODE_AUTH_TOKEN`,helper:`Appuyez sur Entrée ou Ajouter. Vous pouvez coller plusieurs noms séparés par des virgules ou des espaces.`,add:`Ajouter`,empty:`Aucune variable propre à ce projet n'est encore configurée.`,remove:`Supprimer {{name}}`,save:`Enregistrer l'environnement`,saved:`Environnement des worktrees enregistré`,saveFailed:`Impossible d'enregistrer l'environnement des worktrees`,invalidName:`{{name}} n'est pas un nom de variable d'environnement valide`,noValues:`Ajoutez uniquement des noms de variables, pas de secrets KEY=value.`},b={heading:`Specrails Agents`,description:`Personnalisez les agents du pipeline specrails-core par fournisseur d'IA — modèle et effort de raisonnement. Les changements s'appliquent à la prochaine exécution, sans redémarrage.`,loadFailed:`Impossible de charger les réglages des agents.`,modeDefault:`Par défaut`,modeCustom:`Personnalisé`,notDetected:`Non détecté`,notSignedIn:`Non connecté`,pipeline:`Pipeline`,pipelineHint:`Modèle et effort pour toute l'exécution — les sous-agents en héritent sauf réglage ci-dessous.`,model:`Modèle`,effort:`Effort`,defaultModel:`Par défaut ({{model}})`,defaultEffort:`Effort par défaut`,agentsTitle:`Agents du pipeline`,agentsHint:`Modèle par agent pour ce fournisseur.`,inheritNote:`Les sous-agents Codex héritent du modèle et de l'effort du pipeline, par conception.`,noPerAgentNote:`Ce fournisseur ne prend pas en charge les modèles par agent.`,reset:`Restaurer les valeurs par défaut`,agentNames:{"sr-architect":`Architecte`,"sr-developer":`Développeur`,"sr-reviewer":`Réviseur`}},x={language:e,page:t,errors:n,telemetry:r,prePrompt:i,freestylePrePrompt:a,budget:o,desktop:s,notifications:c,webhooks:l,terminal:u,codeSection:d,appearance:f,mobile:p,pairWeb:m,coreUpdate:h,appUpdate:g,projectDialog:_,integrationBranch:v,worktreeEnv:y,specrailsAgents:b};export{g as appUpdate,f as appearance,o as budget,d as codeSection,h as coreUpdate,x as default,s as desktop,n as errors,a as freestylePrePrompt,v as integrationBranch,e as language,p as mobile,c as notifications,t as page,m as pairWeb,i as prePrompt,_ as projectDialog,b as specrailsAgents,r as telemetry,u as terminal,l as webhooks,y as worktreeEnv};
@@ -0,0 +1 @@
1
+ var e={title:`Sprache`,description:`Desktop-weite UI-Sprache. Wird sofort angewendet – kein Neustart nötig.`,selectLabel:`Oberflächensprache`,updateFailed:`Spracheinstellung konnte nicht gespeichert werden`},t={title:`Projekteinstellungen`},n={saveFailed:`Speichern fehlgeschlagen: {{message}}`},r={title:`Pipeline-Telemetrie`,description:`Erfasst Token-Verbrauch, Phasendauern und Subagent-Aktivität für den Diagnose-Export. Standardmäßig aus.`,toggleLabel:`Pipeline-Telemetrie aktivieren`,toggleDescription:`Wenn aktiviert, werden OTEL-Daten aus Pipeline-Jobs lokal erfasst. Verwenden Sie zum Herunterladen die Schaltfläche <mono>Diagnose exportieren</mono> auf einer beliebigen Job-Karte.`,enabled:`Pipeline-Telemetrie aktiviert`,disabled:`Pipeline-Telemetrie deaktiviert`,saveFailed:`Telemetrie-Einstellung konnte nicht gespeichert werden`},i={title:`Rail-Pre-Prompt`,description:`Zusätzliche projektspezifische Anweisungen, die an implement- und batch-implement-Rail-Jobs angehängt werden – nach dem Ticket-Kontext und vor der Ausführung.`,label:`Pre-Prompt`,placeholder:`Beispiel: Bevorzuge inkrementelle Änderungen, halte Migrationen abwärtskompatibel und füge Tests für jede Rail-Änderung hinzu.`,helper:`Für stabile Projektleitlinien, die jeden Rail-Implementierungslauf begleiten sollen.`,saveButton:`Pre-Prompt speichern`,cleared:`Pre-Prompt gelöscht`,saved:`Pre-Prompt gespeichert`,saveFailed:`Pre-Prompt konnte nicht gespeichert werden`},a={title:`Freestyle-Pre-Prompt`,description:`Anweisung, die in Freestyle an den ausgewählten Anbieter gesendet wird. Freestyle überspringt die OpenSpec-Pipeline – der Anbieter erhält diesen Pre-Prompt plus den Spec-Text und implementiert autonom. Leer lassen, um den eingebauten Standard zu verwenden.`,label:`Freestyle-Pre-Prompt`,placeholder:`Leer lassen, um die Standard-Freestyle-Anweisung zu verwenden.`,helper:`Der Spec-Text wird automatisch nach diesem Pre-Prompt angehängt. Leer = Standard.`,saveButton:`Freestyle-Pre-Prompt speichern`,resetToDefault:`Freestyle-Pre-Prompt auf Standard zurückgesetzt`,saved:`Freestyle-Pre-Prompt gespeichert`,saveFailed:`Freestyle-Pre-Prompt konnte nicht gespeichert werden`},o={title:`Budget`,description:`Tagesausgabenlimit für dieses Projekt festlegen. Die Queue pausiert automatisch, wenn das Limit erreicht ist.`,dailyLabel:`Tagesbudget (USD)`,dailyHelper:`Leer lassen zum Deaktivieren. Ausgaben werden über die letzten 24 Stunden berechnet.`,dailyPlaceholder:`z. B. 5.00`,perJobLabel:`Kostenalarm pro Job (USD)`,perJobHelper:`Alarm, wenn ein einzelner Job in diesem Projekt diesen Betrag überschreitet.`,perJobPlaceholder:`z. B. 0.50`,invalidNumber:`Positive Zahl eingeben oder leer lassen zum Deaktivieren`,dailyRemoved:`Tagesbudget entfernt`,dailySet:"Tagesbudget auf ${{amount}} gesetzt",perJobAlertDisabled:`Kostenalarm pro Job deaktiviert`,alertSet:"Alarm für Jobs über ${{amount}} gesetzt",saveBudgetFailed:`Budget konnte nicht gespeichert werden`,saveThresholdFailed:`Schwellenwert konnte nicht gespeichert werden`},s={nav:{appearance:`Darstellung`,specrailsAgents:`Specrails Agents`,code:`Code`,terminal:`Terminal`,updates:`Updates`,mobile:`Mobil`,mcp:`MCP`,projects:`Projekte`,advanced:`Erweitert`,webhooks:`Webhooks`,about:`Info`},title:`Desktop-Einstellungen`,description:`Registrierte Projekte verwalten und Desktop-Informationen einsehen.`,registeredProjects:`Registrierte Projekte`,noProjects:`Noch keine Projekte registriert`,techUrlDescription:`Basis-URL für die specrails-tech-API (Standard: http://localhost:3000)`,techUrlSaved:`specrails-tech-URL gespeichert`,techUrlSaveFailed:`URL konnte nicht gespeichert werden`,budgetAlertsHeading:`Budget & Alarme`,dailyBudgetLabel:`Desktop-Tagesbudget (USD)`,dailyBudgetHelper:`Globales Tagesausgabenlimit über alle Projekte. Queues pausieren automatisch bei Überschreitung.`,dailyBudgetPlaceholder:`z. B. 10.00`,perJobHelper:`Alarm, wenn ein einzelner Job diesen Betrag überschreitet. Leer lassen zum Deaktivieren.`,costAlertsDisabled:`Kostenalarme deaktiviert`,dailyBudgetRemoved:`Desktop-Tagesbudget entfernt`,dailyBudgetSet:"Desktop-Tagesbudget auf ${{amount}} gesetzt",dailyBudgetSaveFailed:`Desktop-Tagesbudget konnte nicht gespeichert werden`,projectRemoved:`Projekt entfernt`,projectRemoveFailed:`Projekt konnte nicht entfernt werden`,onboardingHeading:`Onboarding`,platformTour:`Plattform-Tour`,platformTourDescription:`Den Willkommensassistenten erneut abspielen, um die wichtigsten Funktionen zu sehen.`,replayTour:`Tour erneut abspielen`,terminalPanelHeading:`Terminal-Panel`,infoHeading:`Desktop-Informationen`,infoPort:`Port`,infoProjects:`Projekte`,infoDb:`Desktop-DB`},c={heading:`OS-Benachrichtigungen`,description:`Native Desktop-Benachrichtigungen anzeigen, wenn Jobs abgeschlossen werden oder fehlschlagen. Benachrichtigungen erscheinen nur, wenn der Tab nicht fokussiert ist.`,enableLabel:`OS-Benachrichtigungen aktivieren`,notifyOn:`Benachrichtigen bei:`,filterAll:`Alle (abgeschlossen & fehlgeschlagen)`,filterCompleted:`Nur abgeschlossen`,filterFailed:`Nur fehlgeschlagen`,enabledToast:`OS-Benachrichtigungen aktiviert`,disabledToast:`OS-Benachrichtigungen deaktiviert`},l={heading:`Ausgehende Webhooks`,description:`Externe Tools (Slack, Zapier, CI/CD) bei Desktop-Ereignissen benachrichtigen. Anfragen werden über <code>X-Specrails-Signature</code> signiert, wenn ein Secret gesetzt ist.`,eventJobCompleted:`Job abgeschlossen`,eventJobFailed:`Job fehlgeschlagen`,eventDailyBudgetExceeded:`Tagesbudget überschritten`,statusOn:`an`,statusOff:`aus`,disable:`Deaktivieren`,enable:`Aktivieren`,sendTestPing:`Test-Ping senden`,addHeading:`Webhook hinzufügen`,secretPlaceholder:`Signatur-Secret (optional)`,addButton:`Webhook hinzufügen`,urlRequired:`URL ist erforderlich`,selectEvent:`Mindestens ein Ereignis auswählen`,added:`Webhook hinzugefügt`,addFailed:`Webhook konnte nicht hinzugefügt werden`,updateFailed:`Webhook konnte nicht aktualisiert werden`,removed:`Webhook entfernt`,removeFailed:`Webhook konnte nicht entfernt werden`,testPingSent:`Test-Ping gesendet`,testPingFailed:`Test-Ping konnte nicht gesendet werden`},u={title:`Terminal-Panel`,desktopDescription:`Desktop-weite Standardwerte für alle Projekte, sofern kein projektspezifischer Override gesetzt ist.`,projectDescription:`Projektspezifische Overrides für das Terminal-Panel. Lassen Sie ein Feld unverändert, um den Desktop-Standard zu erben.`,fontFamily:`Schriftfamilie`,fontSize:`Schriftgröße ({{min}}–{{max}})`,renderMode:`Render-Modus`,copyOnSelect:`Beim Auswählen kopieren`,shellIntegration:`Shell-Integration (OSC-133-Marken)`,notifyLongRunning:`Bei lang laufenden Befehlen benachrichtigen`,longCommandThreshold:`Schwellenwert für lange Befehle (ms)`,imageRendering:`Inline-Bilddarstellung (Sixel + iTerm2)`,browserShortcutUrl:`Browser-Shortcut-URL`,quickScript:`Quick-Skript (wird ins aktive Terminal eingefügt – Enter manuell drücken)`,reset:`Zurücksetzen`,unsavedChanges:`Ungespeicherte Änderungen`,clearOverride:`Override entfernen`,clear:`Entfernen`,inheritingDefault:`Erbt Desktop-Standard`,nothingToSave:`Nichts zu speichern`,saved:`Terminal-Einstellungen gespeichert`},d={heading:`Code-Bereich`,summaryLanguage:`Sprache der Zusammenfassungen`,monthlyBudget:`Monatsbudget (USD)`,budgetHelper:"Obergrenze für `surface=file-summary`-Ausgaben pro Kalendermonat. Von Nutzern angestoßene Neugenerierungen können sie überschreiten."},f={taglines:{dracula:`Das Original — dunkel mit Violettstich und lebhaften Neon-Akzenten`,"aurora-light":`Premium hell — Linear-inspiriertes Indigo auf warmem Cremeweiß`,"obsidian-dark":`Premium dunkel — fast schwarz mit Blaustich und elektrischen Akzenten`,specrails:`Marken-Theme — tiefes Marine-Indigo mit satten Cyan-Akzenten`,"code-rain":`Phosphor-Terminal — sanftes Mint auf grünlichem Fast-Schwarz`,galaxy:`Tiefraum-Blau mit einer leuchtenden Klingenspur`},heading:`Erscheinungsbild`,themeGroupLabel:`Theme`,currentlyActive:`Derzeit aktiv`,updateFailed:`Theme konnte nicht aktualisiert werden`},p={heading:`Mobile Companion`,description:`Steuern Sie Specrails über die SpecRails Companion-App auf Ihrem Smartphone – zu 100 % über Ihr lokales Netzwerk. Standardmäßig aus.`,accessOn:`Mobilzugriff an`,accessOff:`Mobilzugriff aus`,listeningOnPort:`Lauscht auf Port {{port}}`,notListening:`Lauscht nicht`,turnOn:`Einschalten`,turnOff:`Ausschalten`,pairWebDevice:`Web-Companion koppeln`,reset:`Zurücksetzen`,resetConfirm:`Mobile Identität zurücksetzen? Alle gekoppelten Geräte werden widerrufen und müssen neu gekoppelt werden.`,identityReset:`Mobile Identität zurückgesetzt`,enableFailed:`Mobilzugriff konnte nicht aktiviert werden: {{message}}`,disableFailed:`Mobilzugriff konnte nicht deaktiviert werden: {{message}}`,windowsFirewall:`Die Windows-Firewall fragt beim ersten Aktivieren, ob der SpecRails-Server zugelassen werden soll – wählen Sie „In privaten Netzwerken zulassen“.`,pairedDevices:`Gekoppelte Geräte`,noDevices:`Noch keine Geräte gekoppelt.`,revokeDevice:`{{name}} widerrufen`},m={title:`Web-Companion koppeln`,description:`Öffnen Sie specrails.dev/companion-app auf Ihrem Smartphone und scannen Sie damit diesen Code.`,startFailed:`Koppeln konnte nicht gestartet werden: {{error}}`,showThenScan:`Nachdem Ihr Smartphone dies gescannt hat, tippen Sie auf „Code des Smartphones scannen“ und richten Sie die Kamera auf Ihr Smartphone.`,scanAnswer:`Code des Smartphones scannen`,scanning:`Richten Sie die Kamera auf den Code auf Ihrem Smartphone…`,cameraFailed:`Kamera nicht verfügbar: {{message}}`,notAnswer:`Dieser QR-Code ist keine Kopplungsantwort.`,connecting:`Verbinden…`,paired:`✓ Gekoppelt`,pairedToast:`Web-Companion gekoppelt`,answerRejected:`Der Desktop hat diesen Code abgelehnt. Erzeugen Sie einen neuen und versuchen Sie es erneut.`,copyCode:`Code kopieren`,codeCopied:`Code kopiert`,cancel:`Abbrechen`},h={heading:`Specrails Core`,installed:`Installiert:`,updateAvailable:`Update verfügbar: {{version}}`,upToDate:`Aktuell`,neverChecked:`Nicht geprüft`,check:`Nach Updates suchen`,checking:`Wird geprüft…`,update:`Auf {{version}} aktualisieren`,downloading:`Wird heruntergeladen…`,materializing:`Wird installiert…`,affectsAll:`Gilt für alle Projekte — kein Neustart nötig.`,unavailable:`Core-Updates sind in diesem Build nicht verfügbar.`,toastDone:`Specrails Core auf {{version}} aktualisiert`,toastError:`Core-Update fehlgeschlagen: {{message}}`,toastUpToDate:`Specrails Core ist aktuell`,toastCheckFailed:`Update-Prüfung fehlgeschlagen: {{message}}`},g={heading:`Specrails Desktop`,installed:`Installiert:`,check:`Nach Updates suchen`,checking:`Wird geprüft…`,upToDate:`Du hast die neueste Version`,updateAvailable:`Update verfügbar: {{version}}`,autoHint:`Wird beim Start und alle 6 Stunden automatisch geprüft.`,unavailable:`App-Updates sind nur in der Desktop-App verfügbar.`,toastUpToDate:`Specrails Desktop ist aktuell`,toastCheckFailed:`Update-Prüfung fehlgeschlagen: {{message}}`},_={title:`{{name}} — Einstellungen`,description:`Projektkonfiguration: Prompts, Branch, Umgebung, Budget, Telemetrie und Terminal.`,nav:{general:`Allgemein`,branch:`Branch`,environment:`Umgebung`,budget:`Budget`,telemetry:`Telemetrie`,terminal:`Terminal`}},v={title:`Integrationszweig`,description:`Der Branch, von dem parallele Rails abzweigen und auf den ihre Entwurfs-PRs zielen. Leer lassen, um automatisch den Standard-Branch des Repositorys zu verwenden.`,placeholder:`automatisch (Standard-Branch)`,resolved:`Rails zweigen von <mono>{{branch}}</mono> ab`,save:`Branch speichern`,saved:`Integrationszweig gespeichert`,saveFailed:`Integrationszweig konnte nicht gespeichert werden`},y={title:`Worktree-Umgebung`,description:`Wählen Sie die Namen der Umgebungsvariablen, die dieses Projekt an Rail-Jobs und isolierte Loop-Worktrees weitergibt. Gespeichert werden nur Namen; Werte werden beim Start gelesen und bei Bedarf aus der Login-Shell nachgeladen.`,label:`Umgebungsvariable`,placeholder:`NODE_AUTH_TOKEN`,helper:`Drücken Sie Enter oder Hinzufügen. Mehrere Namen können durch Kommas oder Leerzeichen getrennt eingefügt werden.`,add:`Hinzufügen`,empty:`Für dieses Projekt sind noch keine eigenen Variablen konfiguriert.`,remove:`{{name}} entfernen`,save:`Umgebung speichern`,saved:`Worktree-Umgebung gespeichert`,saveFailed:`Worktree-Umgebung konnte nicht gespeichert werden`,invalidName:`{{name}} ist kein gültiger Name für eine Umgebungsvariable`,noValues:`Fügen Sie hier nur Variablennamen hinzu, keine KEY=value-Geheimnisse.`},b={heading:`Specrails Agents`,description:`Passe die specrails-core-Pipeline-Agenten pro KI-Anbieter an — Modell und Reasoning-Aufwand. Änderungen gelten ab dem nächsten Lauf, ohne Neustart.`,loadFailed:`Agent-Einstellungen konnten nicht geladen werden.`,modeDefault:`Standard`,modeCustom:`Angepasst`,notDetected:`Nicht erkannt`,notSignedIn:`Nicht angemeldet`,pipeline:`Pipeline`,pipelineHint:`Modell und Aufwand für den gesamten Lauf — Subagenten erben sie, sofern unten nichts anderes gesetzt ist.`,model:`Modell`,effort:`Aufwand`,defaultModel:`Standard ({{model}})`,defaultEffort:`Standard-Aufwand`,agentsTitle:`Pipeline-Agenten`,agentsHint:`Modell-Override pro Agent für diesen Anbieter.`,inheritNote:`Codex-Subagenten erben Modell und Aufwand der Pipeline — by design.`,noPerAgentNote:`Dieser Anbieter unterstützt keine Modelle pro Agent.`,reset:`Standardwerte wiederherstellen`,agentNames:{"sr-architect":`Architekt`,"sr-developer":`Entwickler`,"sr-reviewer":`Reviewer`}},x={language:e,page:t,errors:n,telemetry:r,prePrompt:i,freestylePrePrompt:a,budget:o,desktop:s,notifications:c,webhooks:l,terminal:u,codeSection:d,appearance:f,mobile:p,pairWeb:m,coreUpdate:h,appUpdate:g,projectDialog:_,integrationBranch:v,worktreeEnv:y,specrailsAgents:b};export{g as appUpdate,f as appearance,o as budget,d as codeSection,h as coreUpdate,x as default,s as desktop,n as errors,a as freestylePrePrompt,v as integrationBranch,e as language,p as mobile,c as notifications,t as page,m as pairWeb,i as prePrompt,_ as projectDialog,b as specrailsAgents,r as telemetry,u as terminal,l as webhooks,y as worktreeEnv};
@@ -0,0 +1 @@
1
+ var e={title:`Lingua`,description:`Lingua della UI per tutto Desktop. Si applica all'istante — nessun riavvio necessario.`,selectLabel:`Lingua dell'interfaccia`,updateFailed:`Impossibile salvare la preferenza di lingua`},t={title:`Impostazioni progetto`},n={saveFailed:`Salvataggio non riuscito: {{message}}`},r={title:`Telemetria della pipeline`,description:`Cattura l'uso dei token, le durate delle fasi e l'attività dei subagent per l'export diagnostico. Disattivata per impostazione predefinita.`,toggleLabel:`Abilita la telemetria della pipeline`,toggleDescription:`Quando attiva, i dati OTEL dei job della pipeline vengono catturati localmente. Usa il pulsante <mono>Esporta diagnostica</mono> su qualsiasi card di job per scaricarli.`,enabled:`Telemetria della pipeline abilitata`,disabled:`Telemetria della pipeline disabilitata`,saveFailed:`Salvataggio dell'impostazione di telemetria non riuscito`},i={title:`Pre-prompt dei rail`,description:`Istruzioni extra specifiche del progetto aggiunte ai job rail di implement e batch-implement dopo il contesto del ticket e prima dell'esecuzione.`,label:`Pre-prompt`,placeholder:`Esempio: preferisci modifiche incrementali, mantieni le migrazioni retrocompatibili e aggiungi test per ogni modifica del rail.`,helper:`Usalo per indicazioni stabili di progetto che devono accompagnare ogni run di implementazione su rail.`,saveButton:`Salva pre-prompt`,cleared:`Pre-prompt rimosso`,saved:`Pre-prompt salvato`,saveFailed:`Salvataggio del pre-prompt non riuscito`},a={title:`Pre-prompt Freestyle`,description:`Istruzione inviata al provider selezionato in Freestyle. Freestyle salta la pipeline OpenSpec — consegna al provider questo pre-prompt più il testo della spec e lo lascia implementare in autonomia. Lascia vuoto per usare il default integrato.`,label:`Pre-prompt Freestyle`,placeholder:`Lascia vuoto per usare l'istruzione Freestyle predefinita.`,helper:`Il testo della spec viene aggiunto automaticamente dopo questo pre-prompt. Vuoto = default.`,saveButton:`Salva pre-prompt Freestyle`,resetToDefault:`Pre-prompt Freestyle ripristinato al default`,saved:`Pre-prompt Freestyle salvato`,saveFailed:`Salvataggio del pre-prompt Freestyle non riuscito`},o={title:`Budget`,description:`Imposta un tetto di spesa giornaliero per questo progetto. La coda si mette in pausa automaticamente al raggiungimento del limite.`,dailyLabel:`Budget giornaliero (USD)`,dailyHelper:`Lascia vuoto per disabilitare. La spesa è calcolata sulle ultime 24 ore.`,dailyPlaceholder:`es. 5.00`,perJobLabel:`Avviso di costo per job (USD)`,perJobHelper:`Avvisa quando un singolo job di questo progetto supera questo importo.`,perJobPlaceholder:`es. 0.50`,invalidNumber:`Inserisci un numero positivo o lascia vuoto per disabilitare`,dailyRemoved:`Budget giornaliero rimosso`,dailySet:"Budget giornaliero impostato a ${{amount}}",perJobAlertDisabled:`Avviso di costo per job disabilitato`,alertSet:"Avviso impostato per i job oltre ${{amount}}",saveBudgetFailed:`Salvataggio del budget non riuscito`,saveThresholdFailed:`Salvataggio della soglia non riuscito`},s={nav:{appearance:`Aspetto`,specrailsAgents:`Specrails Agents`,code:`Codice`,terminal:`Terminale`,updates:`Aggiornamenti`,mobile:`Mobile`,mcp:`MCP`,projects:`Progetti`,advanced:`Avanzate`,webhooks:`Webhooks`,about:`Info`},title:`Impostazioni Desktop`,description:`Gestisci i progetti registrati e visualizza le informazioni di Desktop.`,registeredProjects:`Progetti registrati`,noProjects:`Nessun progetto ancora registrato`,techUrlDescription:`URL base per l'API specrails-tech (default: http://localhost:3000)`,techUrlSaved:`URL di specrails-tech salvato`,techUrlSaveFailed:`Salvataggio dell'URL non riuscito`,budgetAlertsHeading:`Budget e avvisi`,dailyBudgetLabel:`Budget giornaliero di Desktop (USD)`,dailyBudgetHelper:`Limite di spesa giornaliero globale su tutti i progetti. Le code si mettono in pausa automaticamente al superamento.`,dailyBudgetPlaceholder:`es. 10.00`,perJobHelper:`Avvisa quando un singolo job supera questo importo. Lascia vuoto per disabilitare.`,costAlertsDisabled:`Avvisi di costo disabilitati`,dailyBudgetRemoved:`Budget giornaliero di Desktop rimosso`,dailyBudgetSet:"Budget giornaliero di Desktop impostato a ${{amount}}",dailyBudgetSaveFailed:`Salvataggio del budget giornaliero di Desktop non riuscito`,projectRemoved:`Progetto rimosso`,projectRemoveFailed:`Rimozione del progetto non riuscita`,onboardingHeading:`Onboarding`,platformTour:`Tour della piattaforma`,platformTourDescription:`Rivedi il wizard di benvenuto per ripassare le funzionalità principali.`,replayTour:`Rivedi il tour`,terminalPanelHeading:`Pannello terminale`,infoHeading:`Informazioni Desktop`,infoPort:`Porta`,infoProjects:`Progetti`,infoDb:`DB di Desktop`},c={heading:`Notifiche di sistema`,description:`Mostra notifiche desktop native quando i job vengono completati o falliscono. Le notifiche appaiono solo quando la scheda non è in primo piano.`,enableLabel:`Abilita le notifiche di sistema`,notifyOn:`Notifica per:`,filterAll:`Tutti (completati e falliti)`,filterCompleted:`Solo completati`,filterFailed:`Solo falliti`,enabledToast:`Notifiche di sistema abilitate`,disabledToast:`Notifiche di sistema disabilitate`},l={heading:`Webhook in uscita`,description:`Notifica strumenti esterni (Slack, Zapier, CI/CD) sugli eventi di Desktop. Le richieste sono firmate via <code>X-Specrails-Signature</code> quando è impostato un secret.`,eventJobCompleted:`Job completato`,eventJobFailed:`Job fallito`,eventDailyBudgetExceeded:`Budget giornaliero superato`,statusOn:`on`,statusOff:`off`,disable:`Disabilita`,enable:`Abilita`,sendTestPing:`Invia ping di test`,addHeading:`Aggiungi webhook`,secretPlaceholder:`Secret di firma (facoltativo)`,addButton:`Aggiungi webhook`,urlRequired:`L'URL è obbligatorio`,selectEvent:`Seleziona almeno un evento`,added:`Webhook aggiunto`,addFailed:`Aggiunta del webhook non riuscita`,updateFailed:`Aggiornamento del webhook non riuscito`,removed:`Webhook rimosso`,removeFailed:`Rimozione del webhook non riuscita`,testPingSent:`Ping di test inviato`,testPingFailed:`Invio del ping di test non riuscito`},u={title:`Pannello terminale`,desktopDescription:`Default a livello di Desktop applicati a ogni progetto, salvo override per progetto.`,projectDescription:`Override per progetto del pannello terminale. Lascia un campo invariato per ereditare il default di Desktop.`,fontFamily:`Famiglia di font`,fontSize:`Dimensione font ({{min}}–{{max}})`,renderMode:`Modalità di rendering`,copyOnSelect:`Copia alla selezione`,shellIntegration:`Integrazione shell (marcatori OSC 133)`,notifyLongRunning:`Notifica per comandi a lunga esecuzione`,longCommandThreshold:`Soglia comandi lunghi (ms)`,imageRendering:`Rendering immagini inline (Sixel + iTerm2)`,browserShortcutUrl:`URL scorciatoia browser`,quickScript:`Script rapido (incollato nel terminale attivo — premi Invio manualmente)`,reset:`Reimposta`,unsavedChanges:`Modifiche non salvate`,clearOverride:`Rimuovi override`,clear:`Rimuovi`,inheritingDefault:`Eredita il default di Desktop`,nothingToSave:`Niente da salvare`,saved:`Impostazioni del terminale salvate`},d={heading:`Sezione Code`,summaryLanguage:`Lingua dei riassunti`,monthlyBudget:`Budget mensile (USD)`,budgetHelper:"Tetto alla spesa `surface=file-summary` per mese di calendario. Le rigenerazioni avviate dall'utente possono superarlo."},f={taglines:{dracula:`L'originale — scuro con sfumature viola e vividi accenti neon`,"aurora-light":`Chiaro premium — indaco ispirato a Linear su bianco caldo`,"obsidian-dark":`Scuro premium — quasi nero con sfumature blu e accenti elettrici`,specrails:`Tema del brand — blu navy-indaco profondo con accenti ciano saturi`,"code-rain":`Terminale al fosforo — menta tenue su quasi nero verdastro`,galaxy:`Blu spazio profondo con una scia luminosa a lama`},heading:`Aspetto`,themeGroupLabel:`Tema`,currentlyActive:`Attualmente attivo`,updateFailed:`Aggiornamento del tema non riuscito`},p={heading:`Companion mobile`,description:`Controlla Specrails dall'app SpecRails Companion sul tuo telefono, 100% sulla tua rete locale. Disattivato per impostazione predefinita.`,accessOn:`Accesso mobile attivo`,accessOff:`Accesso mobile disattivato`,listeningOnPort:`In ascolto sulla porta {{port}}`,notListening:`Non in ascolto`,turnOn:`Attiva`,turnOff:`Disattiva`,pairWebDevice:`Associa companion web`,reset:`Reimposta`,resetConfirm:`Reimpostare l'identità mobile? Ogni dispositivo associato verrà revocato e dovrà associarsi di nuovo.`,identityReset:`Identità mobile reimpostata`,enableFailed:`Impossibile abilitare l'accesso mobile: {{message}}`,disableFailed:`Impossibile disabilitare l'accesso mobile: {{message}}`,windowsFirewall:`Alla prima attivazione Windows Firewall chiederà di consentire il server SpecRails — scegli “Consenti su reti private”.`,pairedDevices:`Dispositivi associati`,noDevices:`Nessun dispositivo ancora associato.`,revokeDevice:`Revoca {{name}}`},m={title:`Associa companion web`,description:`Apri specrails.dev/companion-app sul telefono, poi scansiona questo codice con esso.`,startFailed:`Impossibile avviare l'associazione: {{error}}`,showThenScan:`Dopo che il telefono ha scansionato questo, tocca “Scansiona il codice del telefono” e punta la fotocamera verso il telefono.`,scanAnswer:`Scansiona il codice del telefono`,scanning:`Punta la fotocamera sul codice del telefono…`,cameraFailed:`Fotocamera non disponibile: {{message}}`,notAnswer:`Quel QR non è una risposta di associazione.`,connecting:`Connessione…`,paired:`✓ Associato`,pairedToast:`Companion web associato`,answerRejected:`Il desktop ha rifiutato quel codice. Generane uno nuovo e riprova.`,copyCode:`Copia codice`,codeCopied:`Codice copiato`,cancel:`Annulla`},h={heading:`Specrails Core`,installed:`Installato:`,updateAvailable:`Aggiornamento disponibile: {{version}}`,upToDate:`Aggiornato`,neverChecked:`Non verificato`,check:`Cerca aggiornamenti`,checking:`Verifica…`,update:`Aggiorna a {{version}}`,downloading:`Download…`,materializing:`Installazione…`,affectsAll:`Si applica a tutti i progetti — nessun riavvio necessario.`,unavailable:`Gli aggiornamenti del core non sono disponibili in questa build.`,toastDone:`Specrails Core aggiornato a {{version}}`,toastError:`Aggiornamento del core non riuscito: {{message}}`,toastUpToDate:`Specrails Core è aggiornato`,toastCheckFailed:`Verifica aggiornamenti non riuscita: {{message}}`},g={heading:`Specrails Desktop`,installed:`Installata:`,check:`Cerca aggiornamenti`,checking:`Verifica…`,upToDate:`Hai l'ultima versione`,updateAvailable:`Aggiornamento disponibile: {{version}}`,autoHint:`Controllo automatico all'avvio e ogni 6 ore.`,unavailable:`Gli aggiornamenti sono disponibili solo nell'app desktop.`,toastUpToDate:`Specrails Desktop è aggiornato`,toastCheckFailed:`Ricerca aggiornamenti non riuscita: {{message}}`},_={title:`{{name}} — Impostazioni`,description:`Configurazione del progetto: prompt, branch, ambiente, budget, telemetria e terminale.`,nav:{general:`Generale`,branch:`Branch`,environment:`Ambiente`,budget:`Budget`,telemetry:`Telemetria`,terminal:`Terminale`}},v={title:`Ramo di integrazione`,description:`Il ramo da cui i rail paralleli si diramano e a cui puntano le loro PR in bozza. Lascia vuoto per risolvere automaticamente al ramo predefinito del repository.`,placeholder:`automatico (ramo predefinito)`,resolved:`I rail si diramano da <mono>{{branch}}</mono>`,save:`Salva ramo`,saved:`Ramo di integrazione salvato`,saveFailed:`Impossibile salvare il ramo di integrazione`},y={title:`Ambiente dei worktree`,description:`Scegli i nomi delle variabili d'ambiente che questo progetto passa ai job dei rail e ai worktree isolati dei loop. Vengono salvati solo i nomi; i valori vengono letti all'avvio dell'esecuzione, recuperandoli dalla login shell se mancano nel processo Desktop.`,label:`Variabile d'ambiente`,placeholder:`NODE_AUTH_TOKEN`,helper:`Premi Invio o Aggiungi. Puoi incollare più nomi separati da virgole o spazi.`,add:`Aggiungi`,empty:`Non ci sono ancora variabili specifiche per questo progetto.`,remove:`Rimuovi {{name}}`,save:`Salva ambiente`,saved:`Ambiente dei worktree salvato`,saveFailed:`Impossibile salvare l'ambiente dei worktree`,invalidName:`{{name}} non è un nome valido per una variabile d'ambiente`,noValues:`Aggiungi solo nomi di variabili, non segreti KEY=value.`},b={heading:`Specrails Agents`,description:`Personalizza gli agenti della pipeline specrails-core per provider IA — modello e sforzo di ragionamento. Le modifiche valgono dalla prossima esecuzione, senza riavvio.`,loadFailed:`Impossibile caricare le impostazioni degli agenti.`,modeDefault:`Predefinito`,modeCustom:`Personalizzato`,notDetected:`Non rilevato`,notSignedIn:`Accesso non effettuato`,pipeline:`Pipeline`,pipelineHint:`Modello e sforzo dell'intera esecuzione — i sub-agenti li ereditano salvo override qui sotto.`,model:`Modello`,effort:`Sforzo`,defaultModel:`Predefinito ({{model}})`,defaultEffort:`Sforzo predefinito`,agentsTitle:`Agenti della pipeline`,agentsHint:`Override del modello per agente per questo provider.`,inheritNote:`I sub-agenti Codex ereditano modello e sforzo della pipeline per progettazione.`,noPerAgentNote:`Questo provider non supporta modelli per agente.`,reset:`Ripristina predefiniti`,agentNames:{"sr-architect":`Architetto`,"sr-developer":`Sviluppatore`,"sr-reviewer":`Revisore`}},x={language:e,page:t,errors:n,telemetry:r,prePrompt:i,freestylePrePrompt:a,budget:o,desktop:s,notifications:c,webhooks:l,terminal:u,codeSection:d,appearance:f,mobile:p,pairWeb:m,coreUpdate:h,appUpdate:g,projectDialog:_,integrationBranch:v,worktreeEnv:y,specrailsAgents:b};export{g as appUpdate,f as appearance,o as budget,d as codeSection,h as coreUpdate,x as default,s as desktop,n as errors,a as freestylePrePrompt,v as integrationBranch,e as language,p as mobile,c as notifications,t as page,m as pairWeb,i as prePrompt,_ as projectDialog,b as specrailsAgents,r as telemetry,u as terminal,l as webhooks,y as worktreeEnv};
@@ -0,0 +1 @@
1
+ import{r as e}from"./rolldown-runtime-CNC7AqOf.js";var t=e({appUpdate:()=>v,appearance:()=>m,budget:()=>c,codeSection:()=>p,coreUpdate:()=>_,default:()=>C,desktop:()=>l,errors:()=>i,freestylePrePrompt:()=>s,integrationBranch:()=>b,language:()=>n,mobile:()=>h,notifications:()=>u,page:()=>r,pairWeb:()=>g,prePrompt:()=>o,projectDialog:()=>y,specrailsAgents:()=>S,telemetry:()=>a,terminal:()=>f,webhooks:()=>d,worktreeEnv:()=>x}),n={title:`Language`,description:`Desktop-wide UI language. Applies instantly — no restart needed.`,selectLabel:`Interface language`,updateFailed:`Could not save the language preference`},r={title:`Project Settings`},i={saveFailed:`Failed to save: {{message}}`},a={title:`Pipeline Telemetry`,description:`Capture token usage, phase durations, and subagent activity for diagnostic export. Off by default.`,toggleLabel:`Enable pipeline telemetry`,toggleDescription:`When on, OTEL data from pipeline jobs is captured locally. Use the <mono>Export diagnostic</mono> button on any job card to download.`,enabled:`Pipeline telemetry enabled`,disabled:`Pipeline telemetry disabled`,saveFailed:`Failed to save telemetry setting`},o={title:`Rail Pre-prompt`,description:`Extra project-specific instructions appended to implement and batch-implement rail jobs after the ticket context and before execution.`,label:`Pre-prompt`,placeholder:`Example: Prefer incremental changes, keep migrations backward compatible, and add tests for every rail change.`,helper:`Use this for stable project guidance that should accompany every rail implementation run.`,saveButton:`Save pre-prompt`,cleared:`Pre-prompt cleared`,saved:`Pre-prompt saved`,saveFailed:`Failed to save pre-prompt`},s={title:`Freestyle pre-prompt`,description:`Instruction sent to the selected provider in Freestyle. Freestyle skips the OpenSpec pipeline — it hands the provider this pre-prompt plus the spec text and lets it implement autonomously. Leave blank to use the built-in default.`,label:`Freestyle pre-prompt`,placeholder:`Leave blank to use the default Freestyle instruction.`,helper:`The spec text is appended automatically after this pre-prompt. Empty = default.`,saveButton:`Save Freestyle pre-prompt`,resetToDefault:`Freestyle pre-prompt reset to default`,saved:`Freestyle pre-prompt saved`,saveFailed:`Failed to save Freestyle pre-prompt`},c={title:`Budget`,description:`Set a daily spend cap for this project. The queue auto-pauses when the limit is hit.`,dailyLabel:`Daily budget (USD)`,dailyHelper:`Leave blank to disable. Spend is calculated over the last 24 hours.`,dailyPlaceholder:`e.g. 5.00`,perJobLabel:`Per-job cost alert (USD)`,perJobHelper:`Alert when a single job in this project exceeds this amount.`,perJobPlaceholder:`e.g. 0.50`,invalidNumber:`Enter a positive number or leave blank to disable`,dailyRemoved:`Daily budget removed`,dailySet:"Daily budget set to ${{amount}}",perJobAlertDisabled:`Per-job cost alert disabled`,alertSet:"Alert set for jobs over ${{amount}}",saveBudgetFailed:`Failed to save budget`,saveThresholdFailed:`Failed to save threshold`},l={nav:{appearance:`Appearance`,specrailsAgents:`Specrails Agents`,code:`Code`,terminal:`Terminal`,updates:`Updates`,mobile:`Mobile`,mcp:`MCP`,projects:`Projects`,advanced:`Advanced`,webhooks:`Webhooks`,about:`About`},title:`Desktop Settings`,description:`Manage registered projects and view Desktop information.`,registeredProjects:`Registered Projects`,noProjects:`No projects registered yet`,techUrlDescription:`Base URL for the specrails-tech API (default: http://localhost:3000)`,techUrlSaved:`specrails-tech URL saved`,techUrlSaveFailed:`Failed to save URL`,budgetAlertsHeading:`Budget & Alerts`,dailyBudgetLabel:`Desktop daily budget (USD)`,dailyBudgetHelper:`Global daily spend limit across all projects. Queues auto-pause when exceeded.`,dailyBudgetPlaceholder:`e.g. 10.00`,perJobHelper:`Alert when a single job exceeds this amount. Leave blank to disable.`,costAlertsDisabled:`Cost alerts disabled`,dailyBudgetRemoved:`Desktop daily budget removed`,dailyBudgetSet:"Desktop daily budget set to ${{amount}}",dailyBudgetSaveFailed:`Failed to save Desktop daily budget`,projectRemoved:`Project removed`,projectRemoveFailed:`Failed to remove project`,onboardingHeading:`Onboarding`,platformTour:`Platform Tour`,platformTourDescription:`Replay the welcome wizard to review key features.`,replayTour:`Replay Tour`,terminalPanelHeading:`Terminal Panel`,infoHeading:`Desktop Information`,infoPort:`Port`,infoProjects:`Projects`,infoDb:`Desktop DB`},u={heading:`OS Notifications`,description:`Show native desktop notifications when jobs complete or fail. Notifications only appear when the tab is not focused.`,enableLabel:`Enable OS Notifications`,notifyOn:`Notify on:`,filterAll:`All (completed & failed)`,filterCompleted:`Completed only`,filterFailed:`Failed only`,enabledToast:`OS notifications enabled`,disabledToast:`OS notifications disabled`},d={heading:`Outbound Webhooks`,description:`Notify external tools (Slack, Zapier, CI/CD) on Desktop events. Requests are signed via <code>X-Specrails-Signature</code> when a secret is set.`,eventJobCompleted:`Job completed`,eventJobFailed:`Job failed`,eventDailyBudgetExceeded:`Daily budget exceeded`,statusOn:`on`,statusOff:`off`,disable:`Disable`,enable:`Enable`,sendTestPing:`Send test ping`,addHeading:`Add webhook`,secretPlaceholder:`Signing secret (optional)`,addButton:`Add Webhook`,urlRequired:`URL is required`,selectEvent:`Select at least one event`,added:`Webhook added`,addFailed:`Failed to add webhook`,updateFailed:`Failed to update webhook`,removed:`Webhook removed`,removeFailed:`Failed to remove webhook`,testPingSent:`Test ping sent`,testPingFailed:`Failed to send test ping`},f={title:`Terminal panel`,desktopDescription:`Desktop-wide defaults applied to every project unless a per-project override is set.`,projectDescription:`Per-project overrides for the terminal panel. Leave a field unchanged to inherit the Desktop default.`,fontFamily:`Font family`,fontSize:`Font size ({{min}}–{{max}})`,renderMode:`Render mode`,copyOnSelect:`Copy on select`,shellIntegration:`Shell integration (OSC 133 marks)`,notifyLongRunning:`Notify on long-running commands`,longCommandThreshold:`Long-command threshold (ms)`,imageRendering:`Inline image rendering (Sixel + iTerm2)`,browserShortcutUrl:`Browser shortcut URL`,quickScript:`Quick script (pasted into active terminal — Enter manually)`,reset:`Reset`,unsavedChanges:`Unsaved changes`,clearOverride:`Clear override`,clear:`Clear`,inheritingDefault:`Inheriting Desktop default`,nothingToSave:`Nothing to save`,saved:`Terminal settings saved`},p={heading:`Code section`,summaryLanguage:`Summary language`,monthlyBudget:`Monthly budget (USD)`,budgetHelper:"Cap on `surface=file-summary` spend per calendar month. User-initiated regenerations can override."},m={taglines:{dracula:`The original — dark purple-tinted with vivid neon accents`,"aurora-light":`Premium light — Linear-inspired indigo on warm off-white`,"obsidian-dark":`Premium dark — near-black blue-tinted with electric accents`,specrails:`Brand theme — deep navy-indigo with saturated cyan accents`,"code-rain":`Phosphor terminal — soft mint on green-tinted near-black`,galaxy:`Deep-space blue with a glowing blade trail`},heading:`Appearance`,themeGroupLabel:`Theme`,currentlyActive:`Currently active`,updateFailed:`Failed to update theme`},h={heading:`Mobile companion`,description:`Control Specrails from the SpecRails Companion app on your phone, 100% over your local network. Off by default.`,accessOn:`Mobile access on`,accessOff:`Mobile access off`,listeningOnPort:`Listening on port {{port}}`,notListening:`Not listening`,turnOn:`Turn on`,turnOff:`Turn off`,pairWebDevice:`Pair web companion`,reset:`Reset`,resetConfirm:`Reset the mobile identity? Every paired device will be revoked and must pair again.`,identityReset:`Mobile identity reset`,enableFailed:`Could not enable mobile access: {{message}}`,disableFailed:`Could not disable mobile access: {{message}}`,windowsFirewall:`Windows Firewall will ask to allow the SpecRails server on first enable — choose “Allow on private networks”.`,pairedDevices:`Paired devices`,noDevices:`No devices paired yet.`,revokeDevice:`Revoke {{name}}`},g={title:`Pair web companion`,description:`Open specrails.dev/companion-app on your phone, then scan this code with it.`,startFailed:`Could not start pairing: {{error}}`,showThenScan:`After your phone scans this, tap “Scan phone's code” and point the camera at your phone.`,scanAnswer:`Scan phone's code`,scanning:`Point the camera at the code on your phone…`,cameraFailed:`Camera unavailable: {{message}}`,notAnswer:`That QR isn't a pairing answer.`,connecting:`Connecting…`,paired:`✓ Paired`,pairedToast:`Web companion paired`,answerRejected:`The desktop rejected that code. Generate a fresh one and retry.`,copyCode:`Copy code`,codeCopied:`Code copied`,cancel:`Cancel`},_={heading:`Specrails Core`,installed:`Installed:`,updateAvailable:`Update available: {{version}}`,upToDate:`Up to date`,neverChecked:`Not checked yet`,check:`Check for updates`,checking:`Checking…`,update:`Update to {{version}}`,downloading:`Downloading…`,materializing:`Installing…`,affectsAll:`Applies to all projects — no restart needed.`,unavailable:`Core updates aren't available in this build.`,toastDone:`Specrails Core updated to {{version}}`,toastError:`Core update failed: {{message}}`,toastUpToDate:`Specrails Core is up to date`,toastCheckFailed:`Update check failed: {{message}}`},v={heading:`Specrails Desktop`,installed:`Installed:`,check:`Check for updates`,checking:`Checking…`,upToDate:`You're on the latest version`,updateAvailable:`Update available: {{version}}`,autoHint:`Checks automatically at launch and every 6 hours.`,unavailable:`App updates are only available in the desktop app.`,toastUpToDate:`Specrails Desktop is up to date`,toastCheckFailed:`Update check failed: {{message}}`},y={title:`{{name}} — Settings`,description:`Project-level configuration: prompts, branch, environment, budget, telemetry and terminal.`,nav:{general:`General`,branch:`Branch`,environment:`Environment`,budget:`Budget`,telemetry:`Telemetry`,terminal:`Terminal`}},b={title:`Integration branch`,description:`The branch parallel rails branch from and target their draft PRs at. Leave empty to auto-resolve to the repository's default branch.`,placeholder:`auto (repository default)`,resolved:`Rails branch off <mono>{{branch}}</mono>`,save:`Save branch`,saved:`Integration branch saved`,saveFailed:`Could not save the integration branch`},x={title:`Worktree environment`,description:`Choose environment variable names this project passes to rail jobs and isolated loop worktrees. Only names are saved; values are read when a run starts, with login-shell recovery when the desktop process is missing them.`,label:`Environment variable`,placeholder:`NODE_AUTH_TOKEN`,helper:`Press Enter or Add. You can paste several names separated by commas or spaces.`,add:`Add`,empty:`No project-specific variables configured yet.`,remove:`Remove {{name}}`,save:`Save environment`,saved:`Worktree environment saved`,saveFailed:`Could not save the worktree environment`,invalidName:`{{name}} is not a valid environment variable name`,noValues:`Add only variable names here, not KEY=value secrets.`},S={heading:`Specrails Agents`,description:`Customize the specrails-core pipeline agents per AI provider — model and reasoning effort. Changes apply to the next run, no restart needed.`,loadFailed:`Could not load the agent defaults.`,modeDefault:`Default`,modeCustom:`Custom`,notDetected:`Not detected`,notSignedIn:`Not signed in`,pipeline:`Pipeline`,pipelineHint:`Model and effort for the whole run — sub-agents inherit them unless overridden below.`,model:`Model`,effort:`Effort`,defaultModel:`Default ({{model}})`,defaultEffort:`Default effort`,agentsTitle:`Pipeline agents`,agentsHint:`Per-agent model override for this provider.`,inheritNote:`Codex sub-agents inherit the pipeline model and effort by design.`,noPerAgentNote:`This provider does not support per-agent model overrides.`,reset:`Restore defaults`,agentNames:{"sr-architect":`Architect`,"sr-developer":`Developer`,"sr-reviewer":`Reviewer`}},C={language:n,page:r,errors:i,telemetry:a,prePrompt:o,freestylePrePrompt:s,budget:c,desktop:l,notifications:u,webhooks:d,terminal:f,codeSection:p,appearance:m,mobile:h,pairWeb:g,coreUpdate:_,appUpdate:v,projectDialog:y,integrationBranch:b,worktreeEnv:x,specrailsAgents:S};export{t};