lagora-cli 1.1.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 (52) hide show
  1. package/README.md +138 -0
  2. package/dist/help.txt +70 -0
  3. package/dist/lagora.js +342 -0
  4. package/dist/report-help.txt +5 -0
  5. package/dist/scripts/agora_playground_harness.py +263 -0
  6. package/dist/scripts/announce.js +41 -0
  7. package/dist/scripts/check-kernel-submission.py +90 -0
  8. package/dist/scripts/chunk-2EAJVB5D.js +100 -0
  9. package/dist/scripts/chunk-2KTLCUFI.js +29 -0
  10. package/dist/scripts/chunk-AZ3EEBVD.js +137 -0
  11. package/dist/scripts/chunk-NBJMYAOA.js +2128 -0
  12. package/dist/scripts/chunk-NCJMUBTG.js +125 -0
  13. package/dist/scripts/chunk-QJPQHKIO.js +23 -0
  14. package/dist/scripts/chunk-RIR5KGHC.js +33 -0
  15. package/dist/scripts/chunk-TJZVQYBL.js +8 -0
  16. package/dist/scripts/chunk-UHJXD4TG.js +18 -0
  17. package/dist/scripts/chunk-UQ6I6VTY.js +117 -0
  18. package/dist/scripts/cli-auth.js +348 -0
  19. package/dist/scripts/cli-config-IA7EOSYD.js +7 -0
  20. package/dist/scripts/install-skill.js +199 -0
  21. package/dist/scripts/issue-local-client-DZUXZOKY.js +22 -0
  22. package/dist/scripts/issue-search.js +1823 -0
  23. package/dist/scripts/issue.js +386 -0
  24. package/dist/scripts/keycloak-provision.js +986 -0
  25. package/dist/scripts/legato-fsim-runner.py +126 -0
  26. package/dist/scripts/legato-lowering-runner.py +156 -0
  27. package/dist/scripts/legato_runner_annotations.py +235 -0
  28. package/dist/scripts/legato_runner_env.py +91 -0
  29. package/dist/scripts/legato_runner_launchers.py +287 -0
  30. package/dist/scripts/legato_runner_script_wrapper.py +193 -0
  31. package/dist/scripts/notifications-EU43SIEV.js +624 -0
  32. package/dist/scripts/playground.js +408 -0
  33. package/dist/scripts/report-bundle-sync-3U7QTP4Z.js +215 -0
  34. package/dist/scripts/report.js +104 -0
  35. package/dist/scripts/resolve-sdk-package-version.py +151 -0
  36. package/dist/scripts/sdk-runtime-JE6H2PB2.js +992 -0
  37. package/dist/scripts/sdk-runtime-kubernetes-job-KOWL4ITV.js +479 -0
  38. package/dist/scripts/sdk-runtime-smoke.py +168 -0
  39. package/dist/scripts/sdk.js +256 -0
  40. package/dist/scripts/site-feedback-CAPE5MPX.js +136 -0
  41. package/dist/scripts/site-feedback-rate-limit-5BU2WSFE.js +86 -0
  42. package/dist/scripts/site-feedback.js +117 -0
  43. package/dist/scripts/storage-234FBH54.js +67 -0
  44. package/dist/scripts/submit-issue.sh +489 -0
  45. package/dist/scripts/verification-3QCY66QW.js +772 -0
  46. package/dist/scripts/verify-issue.js +144 -0
  47. package/dist/skills/legato-agora-cli/SKILL.md +556 -0
  48. package/dist/skills/legato-agora-cli/agents/openai.yaml +7 -0
  49. package/dist/skills/legato-agora-cli/reference/kernel-with-golden.py +84 -0
  50. package/dist/skills/legato-site-feedback/SKILL.md +49 -0
  51. package/dist/skills/legato-site-feedback/agents/openai.yaml +7 -0
  52. package/package.json +16 -0
@@ -0,0 +1,1823 @@
1
+ import {
2
+ LagoraCliConfigStore,
3
+ apiSession,
4
+ readJsonFromApi
5
+ } from "./chunk-AZ3EEBVD.js";
6
+ import "./chunk-TJZVQYBL.js";
7
+
8
+ // scripts/issue-search.ts
9
+ import { pathToFileURL as packageFileUrl } from "node:url";
10
+ import path from "node:path";
11
+
12
+ // lib/i18n-issue.ts
13
+ var en = {
14
+ page: {
15
+ loadingArtifacts: "Loading artifacts\u2026",
16
+ sectionShortcuts: "Issue section shortcuts",
17
+ jumpSource: "Source",
18
+ jumpReply: "Reply"
19
+ },
20
+ header: {
21
+ changeStatus: "Change issue status",
22
+ updateStatus: "Update status",
23
+ seen: "seen {count}x",
24
+ opened: "opened {value}",
25
+ noPrimaryTags: "No primary tags",
26
+ metadataTags: "Metadata tags ({count})",
27
+ mutationNotice: "Read access remains available. Choose the activity profile for this device to update this issue.",
28
+ deleteIssue: "Delete",
29
+ deleteConfirm: 'Delete issue "{title}"? This cannot be undone.',
30
+ status: {
31
+ open: "Unresolved",
32
+ investigating: "Investigating",
33
+ resolved: "Resolved",
34
+ deferred: "Deferred",
35
+ cancelled: "Cancelled"
36
+ },
37
+ tagPicker: {
38
+ unavailable: "No predefined tags available",
39
+ add: "Add predefined tag",
40
+ addHint: "Add this predefined tag"
41
+ }
42
+ },
43
+ cli: {
44
+ trigger: "CLI",
45
+ dialogLabel: "CLI commands",
46
+ eyebrow: "Personal CLI commands",
47
+ heading: "Copy commands",
48
+ close: "Close CLI commands",
49
+ apiUrl: "API URL",
50
+ issueStore: "Issue store",
51
+ author: "Author",
52
+ outDir: "Output dir",
53
+ copy: "Copy",
54
+ copied: "Copied",
55
+ copyFailed: "The command could not be copied.",
56
+ commands: {
57
+ submitReport: "Submit report",
58
+ fetchIssue: "Fetch issue",
59
+ addComment: "Add comment",
60
+ submitSuggestion: "Submit suggestion",
61
+ markInvestigating: "Mark investigating",
62
+ runLoweringPlan: "Run lowering plan"
63
+ }
64
+ },
65
+ report: {
66
+ kernelArtifactMissing: "Kernel artifact missing.",
67
+ noErrorLog: "No error log was uploaded for this issue.",
68
+ reporterRole: "reporter",
69
+ metadataLabel: "Report metadata",
70
+ notCaptured: "not captured",
71
+ unknownBranch: "unknown",
72
+ missingChecksum: "missing",
73
+ gitDirtySuffix: " + dirty",
74
+ meta: {
75
+ legato: "Legato",
76
+ kernel: "Kernel",
77
+ git: "Git",
78
+ checksum: "Checksum",
79
+ schema: "Schema",
80
+ bundle: "Bundle",
81
+ github: "GitHub"
82
+ }
83
+ },
84
+ description: {
85
+ sectionLabel: "Issue description",
86
+ edit: "Edit issue description",
87
+ cancelEdit: "Cancel issue description edit",
88
+ empty: "No description supplied.",
89
+ label: "Description",
90
+ editingAs: "Editing as {author}",
91
+ cancel: "Cancel",
92
+ save: "Save",
93
+ saving: "Saving...",
94
+ saveFailed: "Changes could not be saved. Try again."
95
+ },
96
+ viewer: {
97
+ errorLogTitle: "Error log",
98
+ kernelSourceTitle: "Kernel source",
99
+ noFile: "none",
100
+ lines: "{count} lines",
101
+ copy: "Copy",
102
+ copyFailed: "The text could not be copied."
103
+ },
104
+ kernel: {
105
+ copy: "Copy",
106
+ copyFailed: "The source could not be copied.",
107
+ title: "Kernel source",
108
+ none: "none",
109
+ selected: "{count} selected",
110
+ versionsLabel: "Kernel source versions",
111
+ original: "Original",
112
+ suggestion: "Suggestion {index}",
113
+ newSuggestionTab: "+ Suggest",
114
+ selectFile: "Select code file",
115
+ lines: "{count} lines",
116
+ edit: "Edit",
117
+ editSuggestion: "Edit suggestion",
118
+ newSuggestion: "New suggestion",
119
+ draftSaved: "draft saved locally",
120
+ saveSuggestion: "Save suggestion",
121
+ cancel: "Cancel",
122
+ runs: "Runs {count}",
123
+ runsUnavailable: "No Playground run of this source yet",
124
+ runsTitle: "Playground run logs for this source",
125
+ verdict: {
126
+ label: {
127
+ pass: "pass",
128
+ fail: "fail",
129
+ unverified: "un-verified"
130
+ },
131
+ headline: {
132
+ pass: "This source ran in the Playground and its own reference check passed.",
133
+ fail: "This source ran in the Playground and its own reference check failed.",
134
+ none: "No Playground run has executed this exact source.",
135
+ running: "A Playground run of this source is still going.",
136
+ lowered: "This source was lowered in the Playground, but never run, so no value was checked.",
137
+ unchecked: "This source ran in the Playground, but nothing checked a value \u2014 it shipped no reference to compare against."
138
+ }
139
+ }
140
+ },
141
+ runs: {
142
+ dialogLabel: "Playground runs for {filename}",
143
+ close: "Close runs",
144
+ pickerLabel: "Playground runs of this source",
145
+ empty: "Open it in the Playground to run it. A result appears here once a run of this exact source finishes.",
146
+ reportedByKernel: "Reported by the kernel:",
147
+ mode: "Mode",
148
+ sdk: "SDK",
149
+ ran: "Ran",
150
+ artifacts: "Artifacts",
151
+ supportingFiles: "{count} supporting files",
152
+ runLog: "Run log",
153
+ noLog: "No log was captured.",
154
+ openRun: "Open run",
155
+ playground: "Playground",
156
+ outcome: {
157
+ valuePass: "value pass",
158
+ valueFail: "value fail",
159
+ queued: "queued",
160
+ running: "running",
161
+ lowerFail: "lower fail",
162
+ fsimFail: "fsim fail",
163
+ lowered: "lowered",
164
+ ran: "ran"
165
+ }
166
+ },
167
+ discussion: {
168
+ empty: "No discussion comments yet.",
169
+ replyAuthor: "Reply",
170
+ replyRole: "language team",
171
+ responseType: "Response type",
172
+ message: "Message",
173
+ messagePlaceholder: "Root cause, workaround, patch direction, or next reproduction step",
174
+ postingAs: "Posting as {author}",
175
+ submit: "Push to thread",
176
+ kind: {
177
+ comment: "Comment",
178
+ analysis: "Analysis",
179
+ solution: "Solution proposal"
180
+ },
181
+ edited: "Edited {value}",
182
+ deleted: "Deleted {value}",
183
+ deletedBody: "Comment deleted.",
184
+ editingAs: "Editing as {author}",
185
+ cancel: "Cancel",
186
+ save: "Save",
187
+ saving: "Saving",
188
+ saveFailed: "Changes could not be saved. Try again.",
189
+ editComment: "Edit comment",
190
+ cancelEdit: "Cancel comment edit",
191
+ deleteComment: "Delete comment"
192
+ },
193
+ context: {
194
+ title: "Issue Context",
195
+ tracking: "Tracking",
196
+ occurrences: "Occurrences ({count})",
197
+ artifacts: "Artifacts",
198
+ noArtifacts: "No artifacts attached.",
199
+ showMore: "Show {count} more",
200
+ collapse: "Collapse",
201
+ timeUnknown: "time unknown",
202
+ noLoweringOutputs: "No lowering outputs captured.",
203
+ categories: {
204
+ code: "Kernel code",
205
+ errorLog: "Error logs",
206
+ loweringOutput: "Lowering outputs",
207
+ other: "Other artifacts"
208
+ },
209
+ occurrence: {
210
+ meta: "{reporter} via {source} \xB7 {time}",
211
+ reporter: "Reporter",
212
+ source: "Source",
213
+ created: "Created",
214
+ bundle: "Bundle",
215
+ kernelChecksum: "Kernel checksum",
216
+ branch: "Branch",
217
+ commit: "Commit",
218
+ file: "File"
219
+ },
220
+ binary: {
221
+ title: "Binary artifact",
222
+ type: "Type",
223
+ size: "Size",
224
+ checksum: "Checksum",
225
+ hint: "Open the artifact page to download it."
226
+ },
227
+ preview: {
228
+ openPage: "Open page",
229
+ openContentPage: "Open content page",
230
+ close: "Close",
231
+ closeDialog: "Close preview",
232
+ binaryTitle: "Binary artifact hex preview.",
233
+ binaryHint: "Open the artifact page to download the full file."
234
+ }
235
+ },
236
+ tracking: {
237
+ assignee: "Assignee",
238
+ blockers: "Blockers",
239
+ unassigned: "Unassigned",
240
+ none: "None",
241
+ edit: "Edit",
242
+ dialogLabel: "Edit issue tracking",
243
+ eyebrow: "Tracking",
244
+ editHeading: "Edit",
245
+ close: "Close tracking",
246
+ assign: "Assign",
247
+ namePlaceholder: "name",
248
+ remove: "Remove",
249
+ syncBlocker: "Sync blocker",
250
+ blockerPrs: "Blocker PRs",
251
+ prPlaceholder: "PR",
252
+ add: "Add"
253
+ },
254
+ activity: {
255
+ title: "System Activity"
256
+ },
257
+ verification: {
258
+ empty: "No verification runs yet.",
259
+ exit: "exit {code}",
260
+ failedStage: "failed {stage}",
261
+ completedStage: "completed {stage}",
262
+ timeUnknown: "time unknown",
263
+ tool: "tool {value}",
264
+ sdk: "SDK {value}",
265
+ runtime: "runtime {value}",
266
+ fingerprint: "fingerprint {value}",
267
+ log: "log {value}",
268
+ logMissing: "log missing",
269
+ logTitle: "Verification log",
270
+ noLogText: "No log text is available for this run."
271
+ }
272
+ };
273
+ var ko = {
274
+ page: {
275
+ loadingArtifacts: "\uC544\uD2F0\uD329\uD2B8\uB97C \uBD88\uB7EC\uC624\uB294 \uC911\uC785\uB2C8\uB2E4\u2026",
276
+ sectionShortcuts: "\uC774\uC288 \uAD6C\uC5ED \uBC14\uB85C\uAC00\uAE30",
277
+ jumpSource: "\uC18C\uC2A4",
278
+ jumpReply: "\uB2F5\uAE00"
279
+ },
280
+ header: {
281
+ changeStatus: "\uC774\uC288 \uC0C1\uD0DC \uBCC0\uACBD",
282
+ updateStatus: "\uC0C1\uD0DC \uBCC0\uACBD",
283
+ seen: "{count}\uD68C \uC811\uC218",
284
+ opened: "\uB4F1\uB85D\uC77C {value}",
285
+ noPrimaryTags: "\uB4F1\uB85D\uB41C \uC8FC\uC694 \uD0DC\uADF8\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4",
286
+ metadataTags: "\uBA54\uD0C0\uB370\uC774\uD130 \uD0DC\uADF8 {count}\uAC1C",
287
+ mutationNotice: "\uC77D\uAE30 \uAD8C\uD55C\uC740 \uADF8\uB300\uB85C \uC720\uC9C0\uB429\uB2C8\uB2E4. \uC774 \uC774\uC288\uB97C \uC218\uC815\uD558\uB824\uBA74 \uC774 \uAE30\uAE30\uC5D0\uC11C \uC0AC\uC6A9\uD560 \uD65C\uB3D9 \uD504\uB85C\uD544\uC744 \uC120\uD0DD\uD574 \uC8FC\uC138\uC694.",
288
+ deleteIssue: "\uC0AD\uC81C",
289
+ deleteConfirm: '"{title}" \uC774\uC288\uB97C \uC0AD\uC81C\uD560\uAE4C\uC694? \uC0AD\uC81C\uD55C \uB4A4\uC5D0\uB294 \uB418\uB3CC\uB9B4 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.',
290
+ status: {
291
+ open: "\uBBF8\uD574\uACB0",
292
+ investigating: "\uC870\uC0AC \uC911",
293
+ resolved: "\uD574\uACB0\uB428",
294
+ deferred: "\uBCF4\uB958",
295
+ cancelled: "\uCDE8\uC18C\uB428"
296
+ },
297
+ tagPicker: {
298
+ unavailable: "\uCD94\uAC00\uD560 \uC218 \uC788\uB294 \uC0AC\uC804 \uC815\uC758 \uD0DC\uADF8\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4",
299
+ add: "\uC0AC\uC804 \uC815\uC758 \uD0DC\uADF8 \uCD94\uAC00",
300
+ addHint: "\uC774 \uC0AC\uC804 \uC815\uC758 \uD0DC\uADF8\uB97C \uCD94\uAC00\uD569\uB2C8\uB2E4"
301
+ }
302
+ },
303
+ cli: {
304
+ trigger: "CLI",
305
+ dialogLabel: "CLI \uBA85\uB839",
306
+ eyebrow: "\uAC1C\uC778 CLI \uBA85\uB839",
307
+ heading: "\uBA85\uB839 \uBCF5\uC0AC\uD558\uAE30",
308
+ close: "CLI \uBA85\uB839 \uB2EB\uAE30",
309
+ apiUrl: "API URL",
310
+ issueStore: "\uC774\uC288 \uC800\uC7A5\uC18C",
311
+ author: "\uC791\uC131\uC790",
312
+ outDir: "\uCD9C\uB825 \uB514\uB809\uD130\uB9AC",
313
+ copy: "\uBCF5\uC0AC",
314
+ copied: "\uBCF5\uC0AC\uB428",
315
+ copyFailed: "\uBA85\uB839\uC744 \uBCF5\uC0AC\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.",
316
+ commands: {
317
+ submitReport: "\uC774\uC288 \uB4F1\uB85D",
318
+ fetchIssue: "\uC774\uC288 \uB0B4\uB824\uBC1B\uAE30",
319
+ addComment: "\uB313\uAE00 \uB4F1\uB85D",
320
+ submitSuggestion: "\uC218\uC815\uC548 \uC81C\uCD9C",
321
+ markInvestigating: "\uC870\uC0AC \uC911\uC73C\uB85C \uBCC0\uACBD",
322
+ runLoweringPlan: "lowering \uACC4\uD68D \uC2E4\uD589"
323
+ }
324
+ },
325
+ report: {
326
+ kernelArtifactMissing: "\uCEE4\uB110 \uC544\uD2F0\uD329\uD2B8\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.",
327
+ noErrorLog: "\uC774 \uC774\uC288\uC5D0 \uC5C5\uB85C\uB4DC\uB41C \uC624\uB958 \uB85C\uADF8\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.",
328
+ reporterRole: "\uB4F1\uB85D\uC790",
329
+ metadataLabel: "\uC811\uC218 \uC815\uBCF4",
330
+ notCaptured: "\uAE30\uB85D \uC5C6\uC74C",
331
+ unknownBranch: "\uC54C \uC218 \uC5C6\uC74C",
332
+ missingChecksum: "\uC5C6\uC74C",
333
+ gitDirtySuffix: " + dirty",
334
+ meta: {
335
+ legato: "Legato",
336
+ kernel: "\uCEE4\uB110",
337
+ git: "Git",
338
+ checksum: "\uCCB4\uD06C\uC12C",
339
+ schema: "\uC2A4\uD0A4\uB9C8",
340
+ bundle: "\uBC88\uB4E4",
341
+ github: "GitHub"
342
+ }
343
+ },
344
+ description: {
345
+ sectionLabel: "\uC774\uC288 \uC124\uBA85",
346
+ edit: "\uC774\uC288 \uC124\uBA85 \uC218\uC815",
347
+ cancelEdit: "\uC774\uC288 \uC124\uBA85 \uC218\uC815 \uCDE8\uC18C",
348
+ empty: "\uB4F1\uB85D\uB41C \uC124\uBA85\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.",
349
+ label: "\uC124\uBA85",
350
+ editingAs: "{author} \uC774\uB984\uC73C\uB85C \uC218\uC815\uD569\uB2C8\uB2E4",
351
+ cancel: "\uCDE8\uC18C",
352
+ save: "\uC800\uC7A5",
353
+ saving: "\uC800\uC7A5\uD558\uB294 \uC911...",
354
+ saveFailed: "\uBCC0\uACBD \uC0AC\uD56D\uC744 \uC800\uC7A5\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694."
355
+ },
356
+ viewer: {
357
+ errorLogTitle: "\uC624\uB958 \uB85C\uADF8",
358
+ kernelSourceTitle: "\uCEE4\uB110 \uC18C\uC2A4",
359
+ noFile: "\uD30C\uC77C \uC5C6\uC74C",
360
+ lines: "{count}\uC904",
361
+ copy: "\uBCF5\uC0AC",
362
+ copyFailed: "\uD14D\uC2A4\uD2B8\uB97C \uBCF5\uC0AC\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4."
363
+ },
364
+ kernel: {
365
+ copy: "\uBCF5\uC0AC",
366
+ copyFailed: "\uC18C\uC2A4\uB97C \uBCF5\uC0AC\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.",
367
+ title: "\uCEE4\uB110 \uC18C\uC2A4",
368
+ none: "\uC120\uD0DD\uD55C \uD30C\uC77C \uC5C6\uC74C",
369
+ selected: "{count}\uAC1C \uC120\uD0DD",
370
+ versionsLabel: "\uCEE4\uB110 \uC18C\uC2A4 \uBC84\uC804",
371
+ original: "\uC6D0\uBCF8",
372
+ suggestion: "\uC218\uC815\uC548 {index}",
373
+ newSuggestionTab: "+ \uC218\uC815\uC548 \uC791\uC131",
374
+ selectFile: "\uCF54\uB4DC \uD30C\uC77C\uC744 \uC120\uD0DD\uD574 \uC8FC\uC138\uC694",
375
+ lines: "{count}\uC904",
376
+ edit: "\uC218\uC815",
377
+ editSuggestion: "\uC218\uC815\uC548 \uD3B8\uC9D1",
378
+ newSuggestion: "\uC0C8 \uC218\uC815\uC548",
379
+ draftSaved: "\uC784\uC2DC \uC800\uC7A5\uB428",
380
+ saveSuggestion: "\uC218\uC815\uC548 \uC800\uC7A5",
381
+ cancel: "\uCDE8\uC18C",
382
+ runs: "\uC2E4\uD589 \uAE30\uB85D {count}\uAC74",
383
+ runsUnavailable: "\uC774 \uC18C\uC2A4\uB97C Playground\uC5D0\uC11C \uC2E4\uD589\uD55C \uAE30\uB85D\uC774 \uC544\uC9C1 \uC5C6\uC2B5\uB2C8\uB2E4",
384
+ runsTitle: "\uC774 \uC18C\uC2A4\uC758 Playground \uC2E4\uD589 \uB85C\uADF8\uB97C \uD655\uC778\uD569\uB2C8\uB2E4",
385
+ verdict: {
386
+ label: {
387
+ pass: "\uD1B5\uACFC",
388
+ fail: "\uC2E4\uD328",
389
+ unverified: "\uBBF8\uAC80\uC99D"
390
+ },
391
+ headline: {
392
+ pass: "\uC774 \uC18C\uC2A4\uB97C Playground\uC5D0\uC11C \uC2E4\uD589\uD588\uACE0, \uCEE4\uB110\uC774 \uC790\uCCB4 \uAE30\uC900\uAC12\uACFC \uBE44\uAD50\uD55C \uACB0\uACFC\uB294 \uD1B5\uACFC\uC600\uC2B5\uB2C8\uB2E4.",
393
+ fail: "\uC774 \uC18C\uC2A4\uB97C Playground\uC5D0\uC11C \uC2E4\uD589\uD588\uACE0, \uCEE4\uB110\uC774 \uC790\uCCB4 \uAE30\uC900\uAC12\uACFC \uBE44\uAD50\uD55C \uACB0\uACFC\uB294 \uC2E4\uD328\uC600\uC2B5\uB2C8\uB2E4.",
394
+ none: "\uC774 \uC18C\uC2A4\uB97C \uADF8\uB300\uB85C \uC2E4\uD589\uD55C Playground \uAE30\uB85D\uC774 \uC544\uC9C1 \uC5C6\uC2B5\uB2C8\uB2E4.",
395
+ running: "\uC774 \uC18C\uC2A4\uB97C \uC2E4\uD589\uD558\uB294 Playground \uC791\uC5C5\uC774 \uC544\uC9C1 \uC9C4\uD589 \uC911\uC785\uB2C8\uB2E4.",
396
+ lowered: "\uC774 \uC18C\uC2A4\uB294 Playground\uC5D0\uC11C lowering\uB9CC \uB9C8\uCCE4\uACE0 \uC2E4\uD589\uD558\uC9C0\uB294 \uC54A\uC544\uC11C, \uAC80\uC0AC\uB41C \uAC12\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.",
397
+ unchecked: "\uC774 \uC18C\uC2A4\uB97C Playground\uC5D0\uC11C \uC2E4\uD589\uD588\uC9C0\uB9CC, \uBE44\uAD50\uD560 \uAE30\uC900\uAC12\uC774 \uC5C6\uC5B4\uC11C \uC5B4\uB5A4 \uAC12\uB3C4 \uAC80\uC0AC\uD558\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4."
398
+ }
399
+ }
400
+ },
401
+ runs: {
402
+ dialogLabel: "{filename}\uC758 Playground \uC2E4\uD589 \uAE30\uB85D",
403
+ close: "\uC2E4\uD589 \uAE30\uB85D \uB2EB\uAE30",
404
+ pickerLabel: "\uC774 \uC18C\uC2A4\uC758 Playground \uC2E4\uD589 \uBAA9\uB85D",
405
+ empty: "Playground\uC5D0\uC11C \uC774 \uC18C\uC2A4\uB97C \uC2E4\uD589\uD558\uBA74 \uADF8 \uACB0\uACFC\uAC00 \uC5EC\uAE30\uC5D0 \uD45C\uC2DC\uB429\uB2C8\uB2E4.",
406
+ reportedByKernel: "\uCEE4\uB110\uC774 \uBCF4\uACE0\uD55C \uAC12:",
407
+ mode: "\uC2E4\uD589 \uBC29\uC2DD",
408
+ sdk: "SDK",
409
+ ran: "\uC2E4\uD589 \uC2DC\uAC01",
410
+ artifacts: "\uC544\uD2F0\uD329\uD2B8",
411
+ supportingFiles: "\uBCF4\uC870 \uD30C\uC77C {count}\uAC1C",
412
+ runLog: "\uC2E4\uD589 \uB85C\uADF8",
413
+ noLog: "\uAE30\uB85D\uB41C \uB85C\uADF8\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.",
414
+ openRun: "\uC2E4\uD589 \uAE30\uB85D \uC5F4\uAE30",
415
+ playground: "Playground",
416
+ outcome: {
417
+ valuePass: "\uAC12 \uD1B5\uACFC",
418
+ valueFail: "\uAC12 \uC2E4\uD328",
419
+ queued: "\uB300\uAE30 \uC911",
420
+ running: "\uC2E4\uD589 \uC911",
421
+ lowerFail: "lowering \uC2E4\uD328",
422
+ fsimFail: "fSIM \uC2E4\uD328",
423
+ lowered: "lowering \uC644\uB8CC",
424
+ ran: "\uC2E4\uD589 \uC644\uB8CC"
425
+ }
426
+ },
427
+ discussion: {
428
+ empty: "\uC544\uC9C1 \uB4F1\uB85D\uB41C \uB313\uAE00\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.",
429
+ replyAuthor: "\uB2F5\uAE00",
430
+ replyRole: "\uC5B8\uC5B4 \uD300",
431
+ responseType: "\uC751\uB2F5 \uC720\uD615",
432
+ message: "\uB0B4\uC6A9",
433
+ messagePlaceholder: "\uC6D0\uC778 \uBD84\uC11D, \uC6B0\uD68C \uBC29\uBC95, \uD328\uCE58 \uBC29\uD5A5, \uB2E4\uC74C \uC7AC\uD604 \uC808\uCC28 \uAC00\uC6B4\uB370 \uD558\uB098\uB97C \uB0A8\uACA8 \uC8FC\uC138\uC694",
434
+ postingAs: "{author} \uC774\uB984\uC73C\uB85C \uB4F1\uB85D\uD569\uB2C8\uB2E4",
435
+ submit: "\uC2A4\uB808\uB4DC\uC5D0 \uB4F1\uB85D",
436
+ kind: {
437
+ comment: "\uB313\uAE00",
438
+ analysis: "\uC6D0\uC778 \uBD84\uC11D",
439
+ solution: "\uD574\uACB0 \uBC29\uC548 \uC81C\uC548"
440
+ },
441
+ edited: "{value} \uC218\uC815\uB428",
442
+ deleted: "{value} \uC0AD\uC81C\uB428",
443
+ deletedBody: "\uC0AD\uC81C\uB41C \uB313\uAE00\uC785\uB2C8\uB2E4.",
444
+ editingAs: "{author} \uC774\uB984\uC73C\uB85C \uC218\uC815\uD569\uB2C8\uB2E4",
445
+ cancel: "\uCDE8\uC18C",
446
+ save: "\uC800\uC7A5",
447
+ saving: "\uC800\uC7A5\uD558\uB294 \uC911",
448
+ saveFailed: "\uBCC0\uACBD \uC0AC\uD56D\uC744 \uC800\uC7A5\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694.",
449
+ editComment: "\uB313\uAE00 \uC218\uC815",
450
+ cancelEdit: "\uB313\uAE00 \uC218\uC815 \uCDE8\uC18C",
451
+ deleteComment: "\uB313\uAE00 \uC0AD\uC81C"
452
+ },
453
+ context: {
454
+ title: "\uC774\uC288 \uC815\uBCF4",
455
+ tracking: "\uC9C4\uD589 \uAD00\uB9AC",
456
+ occurrences: "\uC811\uC218 \uAE30\uB85D {count}\uAC74",
457
+ artifacts: "\uC544\uD2F0\uD329\uD2B8",
458
+ noArtifacts: "\uCCA8\uBD80\uB41C \uC544\uD2F0\uD329\uD2B8\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.",
459
+ showMore: "{count}\uAC1C \uB354 \uBCF4\uAE30",
460
+ collapse: "\uC811\uAE30",
461
+ timeUnknown: "\uC2DC\uAC01 \uC815\uBCF4 \uC5C6\uC74C",
462
+ noLoweringOutputs: "\uAE30\uB85D\uB41C lowering \uC0B0\uCD9C\uBB3C\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.",
463
+ categories: {
464
+ code: "\uCEE4\uB110 \uCF54\uB4DC",
465
+ errorLog: "\uC624\uB958 \uB85C\uADF8",
466
+ loweringOutput: "lowering \uC0B0\uCD9C\uBB3C",
467
+ other: "\uAE30\uD0C0 \uC544\uD2F0\uD329\uD2B8"
468
+ },
469
+ occurrence: {
470
+ meta: "{reporter} \xB7 {source} \uC811\uC218 \xB7 {time}",
471
+ reporter: "\uB4F1\uB85D\uC790",
472
+ source: "\uC811\uC218 \uACBD\uB85C",
473
+ created: "\uB4F1\uB85D \uC2DC\uAC01",
474
+ bundle: "\uBC88\uB4E4",
475
+ kernelChecksum: "\uCEE4\uB110 \uCCB4\uD06C\uC12C",
476
+ branch: "\uBE0C\uB79C\uCE58",
477
+ commit: "\uCEE4\uBC0B",
478
+ file: "\uD30C\uC77C"
479
+ },
480
+ binary: {
481
+ title: "\uBC14\uC774\uB108\uB9AC \uC544\uD2F0\uD329\uD2B8",
482
+ type: "\uD615\uC2DD",
483
+ size: "\uD06C\uAE30",
484
+ checksum: "\uCCB4\uD06C\uC12C",
485
+ hint: "\uC544\uD2F0\uD329\uD2B8 \uD398\uC774\uC9C0\uC5D0\uC11C \uD30C\uC77C\uC744 \uB0B4\uB824\uBC1B\uC744 \uC218 \uC788\uC2B5\uB2C8\uB2E4."
486
+ },
487
+ preview: {
488
+ openPage: "\uD398\uC774\uC9C0 \uC5F4\uAE30",
489
+ openContentPage: "\uB0B4\uC6A9 \uD398\uC774\uC9C0 \uC5F4\uAE30",
490
+ close: "\uB2EB\uAE30",
491
+ closeDialog: "\uBBF8\uB9AC\uBCF4\uAE30 \uB2EB\uAE30",
492
+ binaryTitle: "\uBC14\uC774\uB108\uB9AC \uC544\uD2F0\uD329\uD2B8\uC758 16\uC9C4\uC218 \uBBF8\uB9AC\uBCF4\uAE30\uC785\uB2C8\uB2E4.",
493
+ binaryHint: "\uC804\uCCB4 \uD30C\uC77C\uC740 \uC544\uD2F0\uD329\uD2B8 \uD398\uC774\uC9C0\uC5D0\uC11C \uB0B4\uB824\uBC1B\uC744 \uC218 \uC788\uC2B5\uB2C8\uB2E4."
494
+ }
495
+ },
496
+ tracking: {
497
+ assignee: "\uB2F4\uB2F9\uC790",
498
+ blockers: "PR \uCC28\uB2E8 \uD56D\uBAA9",
499
+ unassigned: "\uC9C0\uC815\uB418\uC9C0 \uC54A\uC74C",
500
+ none: "\uC5C6\uC74C",
501
+ edit: "\uC218\uC815",
502
+ dialogLabel: "\uC774\uC288 \uC9C4\uD589 \uAD00\uB9AC \uC218\uC815",
503
+ eyebrow: "\uC9C4\uD589 \uAD00\uB9AC",
504
+ editHeading: "\uC218\uC815",
505
+ close: "\uC9C4\uD589 \uAD00\uB9AC \uB2EB\uAE30",
506
+ assign: "\uC9C0\uC815",
507
+ namePlaceholder: "\uC774\uB984",
508
+ remove: "\uC0AD\uC81C",
509
+ syncBlocker: "\uCC28\uB2E8 \uD56D\uBAA9 \uB3D9\uAE30\uD654",
510
+ blockerPrs: "PR \uCC28\uB2E8 \uD56D\uBAA9",
511
+ prPlaceholder: "PR \uBC88\uD638",
512
+ add: "\uCD94\uAC00"
513
+ },
514
+ activity: {
515
+ title: "\uC2DC\uC2A4\uD15C \uD65C\uB3D9"
516
+ },
517
+ verification: {
518
+ empty: "\uC544\uC9C1 \uC2E4\uD589\uB41C \uAC80\uC99D\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.",
519
+ exit: "\uC885\uB8CC \uCF54\uB4DC {code}",
520
+ failedStage: "{stage} \uB2E8\uACC4 \uC2E4\uD328",
521
+ completedStage: "{stage} \uB2E8\uACC4 \uC644\uB8CC",
522
+ timeUnknown: "\uC2DC\uAC01 \uC815\uBCF4 \uC5C6\uC74C",
523
+ tool: "\uB3C4\uAD6C {value}",
524
+ sdk: "SDK {value}",
525
+ runtime: "\uB7F0\uD0C0\uC784 {value}",
526
+ fingerprint: "\uC9C0\uBB38 {value}",
527
+ log: "\uB85C\uADF8 {value}",
528
+ logMissing: "\uB85C\uADF8 \uC5C6\uC74C",
529
+ logTitle: "\uAC80\uC99D \uB85C\uADF8",
530
+ noLogText: "\uC774 \uC2E4\uD589\uC5D0\uB294 \uD45C\uC2DC\uD560 \uB85C\uADF8 \uD14D\uC2A4\uD2B8\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4."
531
+ }
532
+ };
533
+ var issueMessages = { en, ko };
534
+
535
+ // lib/i18n-settings.ts
536
+ var en2 = {
537
+ nav: {
538
+ label: "Settings sections",
539
+ overview: "Overview",
540
+ accounts: "Credentials",
541
+ runtimes: "Runtimes",
542
+ posts: "Posts",
543
+ notifications: "Notifications",
544
+ tags: "Tags"
545
+ },
546
+ value: {
547
+ none: "none",
548
+ never: "never",
549
+ unknown: "unknown",
550
+ configured: "configured",
551
+ notConfigured: "not configured",
552
+ issued: "issued",
553
+ notIssued: "not issued",
554
+ set: "set",
555
+ notSet: "not set",
556
+ enabled: "enabled",
557
+ disabled: "disabled"
558
+ },
559
+ overview: {
560
+ eyebrow: "Admin settings",
561
+ title: "Overview",
562
+ lead: "What the site is running on and holding right now. Each section is managed on its own page.",
563
+ runtimes: "Runtimes",
564
+ autoLowering: "Auto lowering {state}",
565
+ notifications: "Notifications",
566
+ deliveryError: "delivery error",
567
+ stored: "{count} stored",
568
+ unread: "{count} unread",
569
+ accounts: "Profiles",
570
+ accountsCaption: "Activity profiles",
571
+ posts: "Posts",
572
+ postsCaption: "Reported issues",
573
+ tags: "Tags",
574
+ tagsCaption: "{count} system",
575
+ prepareFailed: "The last runtime prepare failed. Until one succeeds, a run can only use a runtime that is already installed.",
576
+ openRuntimes: "Open runtimes"
577
+ },
578
+ accounts: {
579
+ eyebrow: "Site credentials",
580
+ title: "Credentials",
581
+ lead: "Manage the encrypted credentials the site needs to reach private repositories.",
582
+ credentialsTitle: "Stored credentials",
583
+ credentialsDescription: "Secrets are held encrypted on the settings volume. Values are never read back into this page: only whether one is set, and when it was last written.",
584
+ encryptionKey: "Encryption key",
585
+ githubToken: "GitHub token",
586
+ updated: "Updated",
587
+ sdkCliToken: "SDK CLI token",
588
+ announcementToken: "Announcement token",
589
+ noEncryptionKey: "No encryption key is configured, so secrets cannot be stored. Set {key} before writing one.",
590
+ githubTokenHelp: "Used to clone the private SDK repository when a runtime is built from source.",
591
+ replaceToken: "Replace token",
592
+ storeToken: "Store token",
593
+ deleteToken: "Delete token"
594
+ },
595
+ notifications: {
596
+ eyebrow: "Notification store",
597
+ title: "Notifications",
598
+ lead: "The indefinitely retained in-app notification store, the last delivery failure, and the token that lets a terminal publish a site-wide announcement.",
599
+ healthTitle: "Store health",
600
+ total: "Total",
601
+ unread: "Unread",
602
+ retention: "Retention",
603
+ retentionValue: "Indefinite",
604
+ newest: "Newest",
605
+ path: "Path",
606
+ lastError: "Last error",
607
+ clearError: "Clear error",
608
+ compactStore: "Compact store",
609
+ compactNote: "Compacting rewrites the store without the entries it no longer needs. Nothing a reader can still see is removed; retention stays indefinite.",
610
+ testTitle: "Send a test notification",
611
+ testDescription: "Delivers one notification to a chosen account, to check the store and the live stream end to end.",
612
+ recipient: "Recipient",
613
+ sendTest: "Send test",
614
+ announcementTitle: "Announcement token",
615
+ announcementDescription: "Lets `lagora announce` publish a site-wide announcement from a terminal. Kept separate from the SDK token on purpose: publishing to every user and rebuilding the SDK are different powers."
616
+ },
617
+ posts: {
618
+ eyebrow: "Reported issues",
619
+ title: "Posts",
620
+ lead: "Find a report and remove it with its attached artifacts. Deletion is permanent and restricted to the admin session.",
621
+ search: "Search",
622
+ searchPlaceholder: "Title, description, kernel, reporter",
623
+ noDescription: "No description supplied.",
624
+ sort: "Sort",
625
+ searchRelevance: "Search relevance",
626
+ defaultOrder: "Default",
627
+ apply: "Apply",
628
+ clear: "Clear",
629
+ totalCount: "{count} issues",
630
+ matchedCount: "{matched} of {total} issues match",
631
+ pageOf: " \xB7 page {current} of {total}",
632
+ rowMeta: "Kernel {kernel} \xB7 {status} \xB7 Updated {date}",
633
+ deleteTitle: "Delete issues",
634
+ noIssues: "No issues are stored.",
635
+ selectAll: "Select all on this page",
636
+ selectedCount: "{count} selected",
637
+ deleteSelected: "Delete selected",
638
+ deleting: "Deleting",
639
+ deleteFailed: "{failed} of {total} deletes failed: {reason}",
640
+ unknownError: "unknown error",
641
+ confirmTitle: "Delete {count} issues?",
642
+ confirmTitleOne: "Delete 1 issue?",
643
+ confirmDescription: "Each report is removed with every artifact attached to it \u2014 logs, kernels, and reproduction bundles. Nothing here can be restored afterwards.",
644
+ confirmLabel: "Delete {count} issues",
645
+ confirmLabelOne: "Delete 1 issue",
646
+ pagesLabel: "Pages",
647
+ previous: "Previous",
648
+ next: "Next"
649
+ },
650
+ runtimes: {
651
+ eyebrow: "Playground tooling",
652
+ title: "Runtimes",
653
+ lead: "A runtime is two release lines: the Legato that lowers a kernel, and the SDK support packages it runs on. They are versioned independently, so a reported failure can be reproduced on exactly the pair it happened on.",
654
+ availableTitle: "Available runtimes",
655
+ availableDescription: "What the Playground can select right now, and what it would cost to add a version it cannot. Deleting a prepared runtime reclaims its {venv}; deleting the active one forces a fresh prepare before the next lowering.",
656
+ loadingRuntimes: "Loading runtimes\u2026",
657
+ loadingVersions: "Loading published versions\u2026",
658
+ cacheTitle: "Cache policy",
659
+ cacheDescription: "Runtimes are installed when a run asks for a version that is not here yet, and dropped least recently used first. Anything still preparing, serving, or under an unfinished run is never dropped.",
660
+ prepared: "Prepared",
661
+ onDisk: "On disk",
662
+ budget: "Budget",
663
+ evicts: "Evicts",
664
+ evictsBudget: "past the budget",
665
+ evictsRetain: "past the {count} most recently used",
666
+ noBudgetNote: "With no budget set only {count} runtimes are kept, which thrashes once versions are installed on demand: each new pair evicts one that is likely to be asked for again within minutes. Set {key} to the share of the runtime volume this cache may occupy \u2014 it is deliberately unset, because the right number is a property of that volume and nothing here can measure it.",
667
+ prepareTitle: "Prepare",
668
+ progressTitle: "Prepare progress",
669
+ progressDescription: "The running prepare, whichever started it. Re-preparing verifies index or GitHub access, installs or builds the runtime, and writes its metadata. In-flight verification runs are not restarted.",
670
+ accessTitle: "Access",
671
+ cliTokenTitle: "CLI access token",
672
+ cliTokenDescription: "Lets `lagora sdk` read prepare state and start an SDK update from a terminal, without an admin browser session. Issuing a token replaces the previous one, so this is also how a leaked token is revoked.",
673
+ sourceTitle: "Source build fallback",
674
+ sourceDescription: "Only used when the package index is unreachable, or when a commit has no published wheel yet. Building every package from the checkout takes about an hour, against a couple of minutes for wheels, so this is the exception rather than the normal path.",
675
+ sourceSummary: "Source runtime configuration",
676
+ repoUrl: "Repository URL",
677
+ repoUrlHelp: "Private SDK repository cloned when a build from source is needed.",
678
+ sdkRef: "SDK ref",
679
+ sdkRefHelp: "Branch name or commit SHA. Branches resolve to latest; commit SHAs stay pinned.",
680
+ autoPrepare: "Prepare runtime when the server starts",
681
+ autoPrepareHelp: "Deployment starts preparation immediately. Lowering waits for the runtime to become ready.",
682
+ autoLoweringToggle: "Run lowering automatically for new issues",
683
+ autoLoweringHelp: "Each new report starts a backend lowering run once stored. Disable during SDK outages.",
684
+ ref: "Ref",
685
+ commit: "Commit",
686
+ runtime: "Runtime",
687
+ autoLowering: "Auto lowering",
688
+ preparedAt: "Prepared",
689
+ notReady: "not ready",
690
+ saveNote: "Saving updates configuration only. Prepare a runtime to apply the selected ref.",
691
+ save: "Save source settings"
692
+ },
693
+ matrix: {
694
+ selectAll: "Select all prepared",
695
+ selectedCount: "{count} selected",
696
+ deleteSelected: "Delete selected",
697
+ empty: "No runtimes are prepared and no published versions are visible. The package index may be unreachable from the site, in which case a prepare falls back to building the checkout from source.",
698
+ select: "Select",
699
+ action: "Action",
700
+ legato: "Legato",
701
+ sdkPackages: "SDK packages",
702
+ source: "Source",
703
+ status: "Status",
704
+ disk: "Disk",
705
+ prepared: "Prepared",
706
+ sourceIndex: "index",
707
+ sourceCheckout: "checkout",
708
+ active: "active",
709
+ deleting: "deleting",
710
+ delete: "Delete",
711
+ prepare: "Prepare",
712
+ selectRow: "Select {runtime}",
713
+ runtimeName: "legato {legato} \xB7 SDK {sdk}",
714
+ unknownVersion: "unknown",
715
+ confirmTitleOne: "Delete this runtime?",
716
+ confirmTitleMany: "Delete {count} runtimes?",
717
+ confirmActive: "This includes the runtime the site is currently serving. Deleting it forces a fresh install before the next lowering. Each runtime loses its source checkout and its .venv, and this cannot be undone.",
718
+ confirmDescription: "Each runtime loses its source checkout and its .venv. A version that is still published can be installed again, in a couple of minutes. This cannot be undone.",
719
+ confirmLabelOne: "Delete runtime",
720
+ confirmLabelMany: "Delete {count} runtimes",
721
+ deleteFailed: "The delete failed."
722
+ },
723
+ prepare: {
724
+ title: "Prepare a version pair",
725
+ description: "Installs the chosen wheels into a runtime of their own, keyed by the pair. It needs no checkout and takes a couple of minutes rather than the hour a source build needs, and it leaves the runtime the site is currently serving untouched. Once ready, the pair becomes selectable in the Playground, so a reported failure can be reproduced on exactly the versions it happened on.",
726
+ unreachable: "No published versions are visible. The package index may be unreachable from the site; a prepare would fall back to building the checkout from source.",
727
+ legato: "Legato",
728
+ legatoHelp: "Lowers the kernel. Released on its own line; releases are listed ahead of nightlies.",
729
+ sdkPackages: "SDK packages",
730
+ sdkPackagesHelp: "What the kernel runs on: halogger, hart and torch_ha, which share one version.",
731
+ latestPublished: "Latest published",
732
+ pairNote: "Not every pair is installable. A combination the index cannot resolve fails the prepare rather than quietly installing something else, and the reason lands in the prepare log below.",
733
+ submit: "Prepare this pair"
734
+ },
735
+ progress: {
736
+ start: "Prepare / update runtime",
737
+ starting: "Starting",
738
+ meterLabel: "SDK prepare progress",
739
+ run: "run {id}",
740
+ commitUnknown: "commit unknown",
741
+ logTitle: "Prepare command log",
742
+ copyLog: "Copy full log",
743
+ copied: "Copied",
744
+ emptyLog: "No prepare command output has been written yet.",
745
+ failed: "Prepare failed.",
746
+ failedWithExit: "Prepare failed with exit {code}.",
747
+ checkLog: "Check the live log below for the command output.",
748
+ statusNotPrepared: "not prepared",
749
+ statusPreparing: "preparing",
750
+ statusReady: "ready",
751
+ statusFailed: "failed",
752
+ sourceNotPrepared: "SDK source worktree has not been prepared yet.",
753
+ refreshFailed: "Progress refresh failed.",
754
+ prepareRequestFailed: "Prepare request failed.",
755
+ copyLogFailed: "Copying the log failed."
756
+ },
757
+ token: {
758
+ noEncryptionKey: "`AGORA_SETTINGS_ENCRYPTION_KEY` is not configured.",
759
+ noEncryptionKeyDetail: "Tokens are stored encrypted at rest, so issuing one needs that key set on the deployment first.",
760
+ status: "Status",
761
+ issued: "issued",
762
+ notIssued: "not issued",
763
+ never: "never",
764
+ issuedAt: "Issued",
765
+ reveal: "Reveal token",
766
+ revealWarning: "Treat it like a password. Never paste it into an issue, a log, or a commit.",
767
+ rotate: "Rotate token",
768
+ issue: "Issue token",
769
+ revoke: "Revoke"
770
+ },
771
+ tags: {
772
+ eyebrow: "Issue metadata",
773
+ title: "Tags",
774
+ lead: "The predefined tags shown on ticket pages. System tags are derived from reports; custom tags are for triaging regressions, questions, and ownership.",
775
+ tag: "Tag",
776
+ description: "Description",
777
+ color: "Color",
778
+ action: "Action",
779
+ system: " \xB7 system",
780
+ locked: "Locked",
781
+ delete: "Delete",
782
+ addTitle: "Add tag",
783
+ addNote: "New tags become selectable from issue pages immediately after save.",
784
+ idLabel: "ID",
785
+ idHelp: "Stable machine id stored in issue metadata. Use lowercase words, dashes, or prefixes like area:compile.",
786
+ idPlaceholder: "regression",
787
+ labelLabel: "Label",
788
+ labelHelp: "Short display name used in forms and tag menus.",
789
+ labelPlaceholder: "Regression",
790
+ descriptionLabel: "Description",
791
+ descriptionHelp: "One-line purpose shown when language developers choose the tag.",
792
+ descriptionPlaceholder: "Previously working behavior regressed",
793
+ colorLabel: "Color",
794
+ colorHelp: "Visual priority cue for scanning issue pages.",
795
+ colorRed: "Red",
796
+ colorOrange: "Orange",
797
+ colorGreen: "Green",
798
+ colorBlue: "Blue",
799
+ colorGray: "Gray",
800
+ systemDescriptionLowering: "Lowering pipeline issue",
801
+ systemDescriptionFsim: "Functional simulation or verification issue",
802
+ systemDescriptionCompile: "Compilation or build issue",
803
+ systemDescriptionRuntime: "Runtime behavior issue",
804
+ systemDescriptionDiagnostics: "Error message or diagnostic quality issue",
805
+ defaultDescriptionRegression: "Previously working behavior regressed",
806
+ defaultDescriptionNeedsRepro: "More reproduction details are needed",
807
+ defaultDescriptionQuestion: "Needs language-team clarification",
808
+ submit: "Add predefined tag"
809
+ }
810
+ };
811
+ var ko2 = {
812
+ nav: {
813
+ label: "\uC124\uC815 \uD56D\uBAA9",
814
+ overview: "\uC694\uC57D",
815
+ accounts: "\uC790\uACA9 \uC99D\uBA85",
816
+ runtimes: "\uB7F0\uD0C0\uC784",
817
+ posts: "\uAC8C\uC2DC\uBB3C",
818
+ notifications: "\uC54C\uB9BC",
819
+ tags: "\uD0DC\uADF8"
820
+ },
821
+ value: {
822
+ none: "\uC5C6\uC74C",
823
+ never: "\uC5C6\uC74C",
824
+ unknown: "\uC54C \uC218 \uC5C6\uC74C",
825
+ configured: "\uC124\uC815\uB428",
826
+ notConfigured: "\uC124\uC815\uB418\uC9C0 \uC54A\uC74C",
827
+ issued: "\uBC1C\uAE09\uB428",
828
+ notIssued: "\uBC1C\uAE09\uB418\uC9C0 \uC54A\uC74C",
829
+ set: "\uC800\uC7A5\uB428",
830
+ notSet: "\uC800\uC7A5\uB418\uC9C0 \uC54A\uC74C",
831
+ enabled: "\uCF1C\uC9D0",
832
+ disabled: "\uAEBC\uC9D0"
833
+ },
834
+ overview: {
835
+ eyebrow: "\uAD00\uB9AC\uC790 \uC124\uC815",
836
+ title: "\uC694\uC57D",
837
+ lead: "\uC0AC\uC774\uD2B8\uAC00 \uC9C0\uAE08 \uBB34\uC5C7\uC73C\uB85C \uB3D9\uC791\uD558\uACE0 \uBB34\uC5C7\uC744 \uBCF4\uAD00\uD558\uACE0 \uC788\uB294\uC9C0 \uBCF4\uC5EC \uC90D\uB2C8\uB2E4. \uAC01 \uD56D\uBAA9\uC740 \uC800\uB9C8\uB2E4\uC758 \uD398\uC774\uC9C0\uC5D0\uC11C \uAD00\uB9AC\uD569\uB2C8\uB2E4.",
838
+ runtimes: "\uB7F0\uD0C0\uC784",
839
+ autoLowering: "\uC790\uB3D9 \uB85C\uC6CC\uB9C1 {state}",
840
+ notifications: "\uC54C\uB9BC",
841
+ deliveryError: "\uC804\uB2EC \uC2E4\uD328",
842
+ stored: "{count}\uAC74 \uBCF4\uAD00",
843
+ unread: "\uC77D\uC9C0 \uC54A\uC74C {count}\uAC74",
844
+ accounts: "\uD504\uB85C\uD544",
845
+ accountsCaption: "\uD65C\uB3D9 \uD504\uB85C\uD544",
846
+ posts: "\uAC8C\uC2DC\uBB3C",
847
+ postsCaption: "\uC811\uC218\uB41C \uC774\uC288",
848
+ tags: "\uD0DC\uADF8",
849
+ tagsCaption: "\uC2DC\uC2A4\uD15C \uD0DC\uADF8 {count}\uAC1C",
850
+ prepareFailed: "\uB9C8\uC9C0\uB9C9 \uB7F0\uD0C0\uC784 \uC900\uBE44\uAC00 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4. \uC900\uBE44\uAC00 \uD55C \uBC88\uC774\uB77C\uB3C4 \uC131\uACF5\uD558\uAE30 \uC804\uAE4C\uC9C0\uB294 \uC774\uBBF8 \uC124\uCE58\uB41C \uB7F0\uD0C0\uC784\uC73C\uB85C\uB9CC \uC2E4\uD589\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.",
851
+ openRuntimes: "\uB7F0\uD0C0\uC784 \uC5F4\uAE30"
852
+ },
853
+ accounts: {
854
+ eyebrow: "\uC0AC\uC774\uD2B8 \uC790\uACA9 \uC99D\uBA85",
855
+ title: "\uC790\uACA9 \uC99D\uBA85",
856
+ lead: "\uBE44\uACF5\uAC1C \uC800\uC7A5\uC18C\uC5D0 \uC811\uADFC\uD560 \uB54C \uC0AC\uC774\uD2B8\uAC00 \uC0AC\uC6A9\uD558\uB294 \uC554\uD638\uD654\uB41C \uC790\uACA9 \uC99D\uBA85\uC744 \uAD00\uB9AC\uD569\uB2C8\uB2E4.",
857
+ credentialsTitle: "\uBCF4\uAD00\uB41C \uC790\uACA9 \uC99D\uBA85",
858
+ credentialsDescription: "\uBE44\uBC00 \uAC12\uC740 \uC124\uC815 \uBCFC\uB968\uC5D0 \uC554\uD638\uD654\uB418\uC5B4 \uBCF4\uAD00\uB429\uB2C8\uB2E4. \uAC12 \uC790\uCCB4\uB294 \uC774 \uD654\uBA74\uC73C\uB85C \uB2E4\uC2DC \uC77D\uC5B4 \uC624\uC9C0 \uC54A\uC73C\uBA70, \uC800\uC7A5 \uC5EC\uBD80\uC640 \uB9C8\uC9C0\uB9C9\uC73C\uB85C \uAE30\uB85D\uB41C \uC2DC\uAC01\uB9CC \uD45C\uC2DC\uD569\uB2C8\uB2E4.",
859
+ encryptionKey: "\uC554\uD638\uD654 \uD0A4",
860
+ githubToken: "GitHub \uD1A0\uD070",
861
+ updated: "\uAC31\uC2E0",
862
+ sdkCliToken: "SDK CLI \uD1A0\uD070",
863
+ announcementToken: "\uACF5\uC9C0 \uD1A0\uD070",
864
+ noEncryptionKey: "\uC554\uD638\uD654 \uD0A4\uAC00 \uC124\uC815\uB418\uC9C0 \uC54A\uC544 \uBE44\uBC00 \uAC12\uC744 \uC800\uC7A5\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \uAC12\uC744 \uAE30\uB85D\uD558\uAE30 \uC804\uC5D0 {key}\uB97C \uBA3C\uC800 \uC124\uC815\uD558\uC2ED\uC2DC\uC624.",
865
+ githubTokenHelp: "\uB7F0\uD0C0\uC784\uC744 \uC18C\uC2A4\uC5D0\uC11C \uBE4C\uB4DC\uD560 \uB54C \uBE44\uACF5\uAC1C SDK \uC800\uC7A5\uC18C\uB97C \uBCF5\uC81C\uD558\uB294 \uB370 \uC0AC\uC6A9\uD569\uB2C8\uB2E4.",
866
+ replaceToken: "\uD1A0\uD070 \uAD50\uCCB4",
867
+ storeToken: "\uD1A0\uD070 \uC800\uC7A5",
868
+ deleteToken: "\uD1A0\uD070 \uC0AD\uC81C"
869
+ },
870
+ notifications: {
871
+ eyebrow: "\uC54C\uB9BC \uC800\uC7A5\uC18C",
872
+ title: "\uC54C\uB9BC",
873
+ lead: "\uAE30\uAC04 \uC81C\uD55C \uC5C6\uC774 \uBCF4\uAD00\uB418\uB294 \uC0AC\uC774\uD2B8 \uB0B4 \uC54C\uB9BC\uACFC \uB9C8\uC9C0\uB9C9 \uC804\uB2EC \uC2E4\uD328, \uADF8\uB9AC\uACE0 \uD130\uBBF8\uB110\uC5D0\uC11C \uC0AC\uC774\uD2B8 \uC804\uCCB4 \uACF5\uC9C0\uB97C \uC62C\uB9B4 \uC218 \uC788\uAC8C \uD558\uB294 \uD1A0\uD070\uC744 \uAD00\uB9AC\uD569\uB2C8\uB2E4.",
874
+ healthTitle: "\uC800\uC7A5\uC18C \uC0C1\uD0DC",
875
+ total: "\uC804\uCCB4",
876
+ unread: "\uC77D\uC9C0 \uC54A\uC74C",
877
+ retention: "\uBCF4\uAD00 \uAE30\uAC04",
878
+ retentionValue: "\uC81C\uD55C \uC5C6\uC74C",
879
+ newest: "\uCD5C\uC2E0",
880
+ path: "\uACBD\uB85C",
881
+ lastError: "\uB9C8\uC9C0\uB9C9 \uC624\uB958",
882
+ clearError: "\uC624\uB958 \uC9C0\uC6B0\uAE30",
883
+ compactStore: "\uC800\uC7A5\uC18C \uC815\uB9AC",
884
+ compactNote: "\uC815\uB9AC\uB294 \uB354 \uC774\uC0C1 \uD544\uC694\uD558\uC9C0 \uC54A\uC740 \uD56D\uBAA9\uC744 \uBE80 \uCC44\uB85C \uC800\uC7A5\uC18C\uB97C \uB2E4\uC2DC \uC501\uB2C8\uB2E4. \uC0AC\uC6A9\uC790\uAC00 \uC544\uC9C1 \uBCFC \uC218 \uC788\uB294 \uC54C\uB9BC\uC740 \uC9C0\uC6CC\uC9C0\uC9C0 \uC54A\uC73C\uBA70 \uBCF4\uAD00 \uAE30\uAC04\uB3C4 \uADF8\uB300\uB85C \uC720\uC9C0\uB429\uB2C8\uB2E4.",
885
+ testTitle: "\uD14C\uC2A4\uD2B8 \uC54C\uB9BC \uBCF4\uB0B4\uAE30",
886
+ testDescription: "\uC120\uD0DD\uD55C \uACC4\uC815\uC73C\uB85C \uC54C\uB9BC\uC744 \uD558\uB098 \uBCF4\uB0B4\uC11C \uC800\uC7A5\uC18C\uC640 \uC2E4\uC2DC\uAC04 \uC804\uB2EC\uC774 \uB05D\uAE4C\uC9C0 \uB3D9\uC791\uD558\uB294\uC9C0 \uD655\uC778\uD569\uB2C8\uB2E4.",
887
+ recipient: "\uBC1B\uB294 \uC0AC\uB78C",
888
+ sendTest: "\uD14C\uC2A4\uD2B8 \uBC1C\uC1A1",
889
+ announcementTitle: "\uACF5\uC9C0 \uD1A0\uD070",
890
+ announcementDescription: "\uD130\uBBF8\uB110\uC5D0\uC11C `lagora announce` \uBA85\uB839\uC73C\uB85C \uC0AC\uC774\uD2B8 \uC804\uCCB4 \uACF5\uC9C0\uB97C \uC62C\uB9B4 \uC218 \uC788\uAC8C \uD569\uB2C8\uB2E4. SDK \uD1A0\uD070\uACFC \uC77C\uBD80\uB7EC \uBD84\uB9AC\uD574 \uB450\uC5C8\uC2B5\uB2C8\uB2E4. \uBAA8\uB4E0 \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uACF5\uC9C0\uB97C \uBCF4\uB0B4\uB294 \uC77C\uACFC SDK\uB97C \uB2E4\uC2DC \uBE4C\uB4DC\uD558\uB294 \uC77C\uC740 \uC11C\uB85C \uB2E4\uB978 \uAD8C\uD55C\uC774\uAE30 \uB54C\uBB38\uC785\uB2C8\uB2E4."
891
+ },
892
+ posts: {
893
+ eyebrow: "\uC811\uC218\uB41C \uC774\uC288",
894
+ title: "\uAC8C\uC2DC\uBB3C",
895
+ lead: "\uBCF4\uACE0\uC11C\uB97C \uCC3E\uC544 \uCCA8\uBD80\uB41C \uC544\uD2F0\uD329\uD2B8\uC640 \uD568\uAED8 \uC0AD\uC81C\uD569\uB2C8\uB2E4. \uC0AD\uC81C\uB294 \uB418\uB3CC\uB9B4 \uC218 \uC5C6\uC73C\uBA70 \uAD00\uB9AC\uC790 \uC138\uC158\uC5D0\uC11C\uB9CC \uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.",
896
+ search: "\uAC80\uC0C9",
897
+ searchPlaceholder: "\uC81C\uBAA9, \uC124\uBA85, \uCEE4\uB110, \uBCF4\uACE0\uC790",
898
+ noDescription: "\uC124\uBA85\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.",
899
+ sort: "\uC815\uB82C",
900
+ searchRelevance: "\uAC80\uC0C9 \uC801\uD569\uB3C4",
901
+ defaultOrder: "\uAE30\uBCF8",
902
+ apply: "\uC801\uC6A9",
903
+ clear: "\uC9C0\uC6B0\uAE30",
904
+ totalCount: "\uC774\uC288 {count}\uAC74",
905
+ matchedCount: "\uC804\uCCB4 {total}\uAC74 \uAC00\uC6B4\uB370 {matched}\uAC74 \uC77C\uCE58",
906
+ pageOf: " \xB7 {total}\uCABD \uC911 {current}\uCABD",
907
+ rowMeta: "\uCEE4\uB110 {kernel} \xB7 {status} \xB7 \uAC31\uC2E0 {date}",
908
+ deleteTitle: "\uC774\uC288 \uC0AD\uC81C",
909
+ noIssues: "\uBCF4\uAD00\uB41C \uC774\uC288\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.",
910
+ selectAll: "\uC774 \uCABD \uC804\uCCB4 \uC120\uD0DD",
911
+ selectedCount: "{count}\uAC74 \uC120\uD0DD\uB428",
912
+ deleteSelected: "\uC120\uD0DD \uD56D\uBAA9 \uC0AD\uC81C",
913
+ deleting: "\uC0AD\uC81C \uC911",
914
+ deleteFailed: "{total}\uAC74 \uAC00\uC6B4\uB370 {failed}\uAC74\uC774 \uC0AD\uC81C\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4: {reason}",
915
+ unknownError: "\uC54C \uC218 \uC5C6\uB294 \uC624\uB958",
916
+ confirmTitle: "\uC774\uC288 {count}\uAC74\uC744 \uC0AD\uC81C\uD560\uAE4C\uC694?",
917
+ confirmTitleOne: "\uC774\uC288 1\uAC74\uC744 \uC0AD\uC81C\uD560\uAE4C\uC694?",
918
+ confirmDescription: "\uAC01 \uBCF4\uACE0\uC11C\uB294 \uCCA8\uBD80\uB41C \uBAA8\uB4E0 \uC544\uD2F0\uD329\uD2B8\uC640 \uD568\uAED8 \uC0AD\uC81C\uB429\uB2C8\uB2E4. \uB85C\uADF8\uC640 \uCEE4\uB110, \uC7AC\uD604 \uBC88\uB4E4\uC774 \uBAA8\uB450 \uD3EC\uD568\uB418\uBA70 \uC0AD\uC81C\uD55C \uB4A4\uC5D0\uB294 \uB418\uB3CC\uB9B4 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.",
919
+ confirmLabel: "\uC774\uC288 {count}\uAC74 \uC0AD\uC81C",
920
+ confirmLabelOne: "\uC774\uC288 1\uAC74 \uC0AD\uC81C",
921
+ pagesLabel: "\uCABD \uC774\uB3D9",
922
+ previous: "\uC774\uC804",
923
+ next: "\uB2E4\uC74C"
924
+ },
925
+ runtimes: {
926
+ eyebrow: "Playground \uB3C4\uAD6C",
927
+ title: "\uB7F0\uD0C0\uC784",
928
+ lead: "\uB7F0\uD0C0\uC784\uC740 \uB450 \uAC1C\uC758 \uB9B4\uB9AC\uC2A4 \uACC4\uC5F4\uB85C \uC774\uB8E8\uC5B4\uC9D1\uB2C8\uB2E4. \uCEE4\uB110\uC744 \uB85C\uC6CC\uB9C1\uD558\uB294 Legato\uC640 \uADF8 \uCEE4\uB110\uC774 \uC2E4\uD589\uB418\uB294 SDK \uC9C0\uC6D0 \uD328\uD0A4\uC9C0\uC785\uB2C8\uB2E4. \uB450 \uACC4\uC5F4\uC758 \uBC84\uC804\uC774 \uB530\uB85C \uAD00\uB9AC\uB418\uBBC0\uB85C, \uBCF4\uACE0\uB41C \uC2E4\uD328\uB97C \uADF8 \uC2E4\uD328\uAC00 \uBC1C\uC0DD\uD55C \uC870\uD569 \uADF8\uB300\uB85C \uC7AC\uD604\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.",
929
+ availableTitle: "\uC0AC\uC6A9 \uAC00\uB2A5\uD55C \uB7F0\uD0C0\uC784",
930
+ availableDescription: "Playground\uAC00 \uC9C0\uAE08 \uC120\uD0DD\uD560 \uC218 \uC788\uB294 \uB7F0\uD0C0\uC784\uACFC, \uC120\uD0DD\uD560 \uC218 \uC5C6\uB294 \uBC84\uC804\uC744 \uCD94\uAC00\uD560 \uB54C \uB4DC\uB294 \uBE44\uC6A9\uC744 \uBCF4\uC5EC \uC90D\uB2C8\uB2E4. \uC900\uBE44\uB41C \uB7F0\uD0C0\uC784\uC744 \uC0AD\uC81C\uD558\uBA74 \uADF8 {venv}\uAC00 \uD68C\uC218\uB418\uACE0, \uC0AC\uC6A9 \uC911\uC778 \uB7F0\uD0C0\uC784\uC744 \uC0AD\uC81C\uD558\uBA74 \uB2E4\uC74C \uB85C\uC6CC\uB9C1 \uC804\uC5D0 \uC900\uBE44\uB97C \uC0C8\uB85C \uD574\uC57C \uD569\uB2C8\uB2E4.",
931
+ loadingRuntimes: "\uB7F0\uD0C0\uC784\uC744 \uBD88\uB7EC\uC624\uB294 \uC911\uC785\uB2C8\uB2E4",
932
+ loadingVersions: "\uBC30\uD3EC\uB41C \uBC84\uC804\uC744 \uBD88\uB7EC\uC624\uB294 \uC911\uC785\uB2C8\uB2E4",
933
+ cacheTitle: "\uCE90\uC2DC \uC815\uCC45",
934
+ cacheDescription: "\uC544\uC9C1 \uC5C6\uB294 \uBC84\uC804\uC744 \uC2E4\uD589\uC774 \uC694\uCCAD\uD558\uBA74 \uADF8\uB54C \uC124\uCE58\uD558\uACE0, \uAC00\uC7A5 \uC624\uB798 \uC4F0\uC774\uC9C0 \uC54A\uC740 \uAC83\uBD80\uD130 \uBC84\uB9BD\uB2C8\uB2E4. \uC900\uBE44 \uC911\uC774\uAC70\uB098 \uC11C\uBE44\uC2A4 \uC911\uC774\uAC70\uB098 \uB05D\uB098\uC9C0 \uC54A\uC740 \uC2E4\uD589\uC774 \uCC38\uC870\uD558\uB294 \uB7F0\uD0C0\uC784\uC740 \uBC84\uB9AC\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.",
935
+ prepared: "\uC900\uBE44\uB428",
936
+ onDisk: "\uB514\uC2A4\uD06C \uC0AC\uC6A9\uB7C9",
937
+ budget: "\uD55C\uB3C4",
938
+ evicts: "\uC815\uB9AC \uAE30\uC900",
939
+ evictsBudget: "\uD55C\uB3C4\uB97C \uB118\uC73C\uBA74 \uC815\uB9AC",
940
+ evictsRetain: "\uCD5C\uADFC \uC0AC\uC6A9 {count}\uAC1C\uB97C \uB118\uC73C\uBA74 \uC815\uB9AC",
941
+ noBudgetNote: "\uD55C\uB3C4\uB97C \uC124\uC815\uD558\uC9C0 \uC54A\uC73C\uBA74 \uB7F0\uD0C0\uC784\uC744 {count}\uAC1C\uB9CC \uC720\uC9C0\uD569\uB2C8\uB2E4. \uBC84\uC804\uC744 \uC694\uCCAD\uC5D0 \uB530\uB77C \uC124\uCE58\uD558\uB294 \uC0C1\uD669\uC5D0\uC11C\uB294 \uC774 \uAC12\uC774 \uB108\uBB34 \uC791\uC544, \uC0C8 \uC870\uD569\uC774 \uB4E4\uC5B4\uC62C \uB54C\uB9C8\uB2E4 \uACE7 \uB2E4\uC2DC \uD544\uC694\uD574\uC9C8 \uB7F0\uD0C0\uC784\uC744 \uBC00\uC5B4\uB0C5\uB2C8\uB2E4. \uC774 \uCE90\uC2DC\uAC00 \uB7F0\uD0C0\uC784 \uBCFC\uB968\uC5D0\uC11C \uCC28\uC9C0\uD574\uB3C4 \uB418\uB294 \uBE44\uC728\uC744 {key}\uC5D0 \uC124\uC815\uD558\uC2ED\uC2DC\uC624. \uC801\uC808\uD55C \uAC12\uC740 \uADF8 \uBCFC\uB968\uC758 \uC0AC\uC815\uC5D0 \uB2EC\uB824 \uC788\uACE0 \uC0AC\uC774\uD2B8\uAC00 \uCE21\uC815\uD560 \uC218 \uC5C6\uAE30 \uB54C\uBB38\uC5D0 \uAE30\uBCF8\uAC12\uC744 \uB450\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4.",
942
+ prepareTitle: "\uC900\uBE44",
943
+ progressTitle: "\uC900\uBE44 \uC9C4\uD589 \uC0C1\uD669",
944
+ progressDescription: "\uB204\uAC00 \uC2DC\uC791\uD588\uB4E0 \uD604\uC7AC \uC9C4\uD589 \uC911\uC778 \uC900\uBE44 \uC791\uC5C5\uC744 \uBCF4\uC5EC \uC90D\uB2C8\uB2E4. \uB2E4\uC2DC \uC900\uBE44\uD558\uBA74 \uD328\uD0A4\uC9C0 \uC0C9\uC778\uC774\uB098 GitHub \uC811\uADFC\uC744 \uD655\uC778\uD558\uACE0 \uB7F0\uD0C0\uC784\uC744 \uC124\uCE58\uD558\uAC70\uB098 \uBE4C\uB4DC\uD55C \uB4A4 \uBA54\uD0C0\uB370\uC774\uD130\uB97C \uAE30\uB85D\uD569\uB2C8\uB2E4. \uC9C4\uD589 \uC911\uC778 \uAC80\uC99D \uC2E4\uD589\uC740 \uB2E4\uC2DC \uC2DC\uC791\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.",
945
+ accessTitle: "\uC811\uADFC \uAD8C\uD55C",
946
+ cliTokenTitle: "CLI \uC811\uADFC \uD1A0\uD070",
947
+ cliTokenDescription: "\uAD00\uB9AC\uC790 \uBE0C\uB77C\uC6B0\uC800 \uC138\uC158 \uC5C6\uC774\uB3C4 \uD130\uBBF8\uB110\uC5D0\uC11C `lagora sdk` \uBA85\uB839\uC73C\uB85C \uC900\uBE44 \uC0C1\uD0DC\uB97C \uC870\uD68C\uD558\uACE0 SDK \uAC31\uC2E0\uC744 \uC2DC\uC791\uD560 \uC218 \uC788\uAC8C \uD569\uB2C8\uB2E4. \uD1A0\uD070\uC744 \uC0C8\uB85C \uBC1C\uAE09\uD558\uBA74 \uC774\uC804 \uD1A0\uD070\uC740 \uBB34\uD6A8\uAC00 \uB418\uBBC0\uB85C, \uC720\uCD9C\uB41C \uD1A0\uD070\uC744 \uD68C\uC218\uD558\uB294 \uBC29\uBC95\uC774\uAE30\uB3C4 \uD569\uB2C8\uB2E4.",
948
+ sourceTitle: "\uC18C\uC2A4 \uBE4C\uB4DC \uB300\uCCB4 \uACBD\uB85C",
949
+ sourceDescription: "\uD328\uD0A4\uC9C0 \uC0C9\uC778\uC5D0 \uC5F0\uACB0\uD560 \uC218 \uC5C6\uAC70\uB098 \uD574\uB2F9 \uCEE4\uBC0B\uC758 \uD720\uC774 \uC544\uC9C1 \uBC30\uD3EC\uB418\uC9C0 \uC54A\uC558\uC744 \uB54C\uC5D0\uB9CC \uC0AC\uC6A9\uD569\uB2C8\uB2E4. \uCCB4\uD06C\uC544\uC6C3\uC5D0\uC11C \uBAA8\uB4E0 \uD328\uD0A4\uC9C0\uB97C \uBE4C\uB4DC\uD558\uBA74 \uD55C \uC2DC\uAC04\uCBE4 \uAC78\uB9AC\uACE0 \uD720 \uC124\uCE58\uB294 \uBA87 \uBD84\uC774\uBA74 \uB05D\uB098\uBBC0\uB85C, \uC774 \uACBD\uB85C\uB294 \uC608\uC678\uC801\uC778 \uC218\uB2E8\uC785\uB2C8\uB2E4.",
950
+ sourceSummary: "\uC18C\uC2A4 \uB7F0\uD0C0\uC784 \uC124\uC815",
951
+ repoUrl: "\uC800\uC7A5\uC18C \uC8FC\uC18C",
952
+ repoUrlHelp: "\uC18C\uC2A4\uC5D0\uC11C \uBE4C\uB4DC\uD574\uC57C \uD560 \uB54C \uBCF5\uC81C\uD558\uB294 \uBE44\uACF5\uAC1C SDK \uC800\uC7A5\uC18C\uC785\uB2C8\uB2E4.",
953
+ sdkRef: "SDK \uCC38\uC870",
954
+ sdkRefHelp: "\uBE0C\uB79C\uCE58 \uC774\uB984\uC774\uB098 \uCEE4\uBC0B \uD574\uC2DC\uB97C \uC801\uC2B5\uB2C8\uB2E4. \uBE0C\uB79C\uCE58\uB294 \uCD5C\uC2E0 \uCEE4\uBC0B\uC744 \uB530\uB77C\uAC00\uACE0, \uCEE4\uBC0B \uD574\uC2DC\uB294 \uADF8 \uC2DC\uC810\uC5D0 \uACE0\uC815\uB429\uB2C8\uB2E4.",
955
+ autoPrepare: "\uC11C\uBC84\uAC00 \uC2DC\uC791\uD560 \uB54C \uB7F0\uD0C0\uC784 \uC900\uBE44",
956
+ autoPrepareHelp: "\uBC30\uD3EC\uC640 \uB3D9\uC2DC\uC5D0 \uC900\uBE44\uB97C \uC2DC\uC791\uD569\uB2C8\uB2E4. \uB85C\uC6CC\uB9C1\uC740 \uB7F0\uD0C0\uC784\uC774 \uC900\uBE44\uB420 \uB54C\uAE4C\uC9C0 \uAE30\uB2E4\uB9BD\uB2C8\uB2E4.",
957
+ autoLoweringToggle: "\uC0C8 \uC774\uC288\uC5D0 \uB300\uD574 \uB85C\uC6CC\uB9C1 \uC790\uB3D9 \uC2E4\uD589",
958
+ autoLoweringHelp: "\uC0C8 \uBCF4\uACE0\uC11C\uAC00 \uC800\uC7A5\uB418\uBA74 \uBC31\uC5D4\uB4DC \uB85C\uC6CC\uB9C1\uC744 \uBC14\uB85C \uC2DC\uC791\uD569\uB2C8\uB2E4. SDK\uC5D0 \uC7A5\uC560\uAC00 \uC788\uB294 \uB3D9\uC548\uC5D0\uB294 \uAEBC \uB450\uC2ED\uC2DC\uC624.",
959
+ ref: "\uCC38\uC870",
960
+ commit: "\uCEE4\uBC0B",
961
+ runtime: "\uB7F0\uD0C0\uC784",
962
+ autoLowering: "\uC790\uB3D9 \uB85C\uC6CC\uB9C1",
963
+ preparedAt: "\uC900\uBE44 \uC644\uB8CC",
964
+ notReady: "\uC900\uBE44\uB418\uC9C0 \uC54A\uC74C",
965
+ saveNote: "\uC800\uC7A5\uC740 \uC124\uC815\uB9CC \uBC14\uAFC9\uB2C8\uB2E4. \uC120\uD0DD\uD55C \uCC38\uC870\uB97C \uC2E4\uC81C\uB85C \uC801\uC6A9\uD558\uB824\uBA74 \uB7F0\uD0C0\uC784\uC744 \uC900\uBE44\uD558\uC2ED\uC2DC\uC624.",
966
+ save: "\uC18C\uC2A4 \uC124\uC815 \uC800\uC7A5"
967
+ },
968
+ matrix: {
969
+ selectAll: "\uC900\uBE44\uB41C \uB7F0\uD0C0\uC784 \uC804\uCCB4 \uC120\uD0DD",
970
+ selectedCount: "{count}\uAC1C \uC120\uD0DD\uB428",
971
+ deleteSelected: "\uC120\uD0DD \uD56D\uBAA9 \uC0AD\uC81C",
972
+ empty: "\uC900\uBE44\uB41C \uB7F0\uD0C0\uC784\uC774 \uC5C6\uACE0 \uBC30\uD3EC\uB41C \uBC84\uC804\uB3C4 \uBCF4\uC774\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uC0AC\uC774\uD2B8\uC5D0\uC11C \uD328\uD0A4\uC9C0 \uC0C9\uC778\uC5D0 \uC5F0\uACB0\uD558\uC9C0 \uBABB\uD558\uB294 \uC0C1\uD0DC\uC77C \uC218 \uC788\uC73C\uBA70, \uC774 \uACBD\uC6B0 \uC900\uBE44\uB294 \uCCB4\uD06C\uC544\uC6C3\uC744 \uC18C\uC2A4\uC5D0\uC11C \uBE4C\uB4DC\uD558\uB294 \uBC29\uC2DD\uC73C\uB85C \uB118\uC5B4\uAC11\uB2C8\uB2E4.",
973
+ select: "\uC120\uD0DD",
974
+ action: "\uC791\uC5C5",
975
+ legato: "Legato",
976
+ sdkPackages: "SDK \uD328\uD0A4\uC9C0",
977
+ source: "\uCD9C\uCC98",
978
+ status: "\uC0C1\uD0DC",
979
+ disk: "\uB514\uC2A4\uD06C",
980
+ prepared: "\uC900\uBE44 \uC2DC\uAC01",
981
+ sourceIndex: "\uC0C9\uC778",
982
+ sourceCheckout: "\uCCB4\uD06C\uC544\uC6C3",
983
+ active: "\uC0AC\uC6A9 \uC911",
984
+ deleting: "\uC0AD\uC81C \uC911",
985
+ delete: "\uC0AD\uC81C",
986
+ prepare: "\uC900\uBE44",
987
+ selectRow: "{runtime} \uC120\uD0DD",
988
+ runtimeName: "legato {legato} \xB7 SDK {sdk}",
989
+ unknownVersion: "\uC54C \uC218 \uC5C6\uC74C",
990
+ confirmTitleOne: "\uC774 \uB7F0\uD0C0\uC784\uC744 \uC0AD\uC81C\uD560\uAE4C\uC694?",
991
+ confirmTitleMany: "\uB7F0\uD0C0\uC784 {count}\uAC1C\uB97C \uC0AD\uC81C\uD560\uAE4C\uC694?",
992
+ confirmActive: "\uC0AC\uC774\uD2B8\uAC00 \uC9C0\uAE08 \uC0AC\uC6A9 \uC911\uC778 \uB7F0\uD0C0\uC784\uC774 \uD3EC\uD568\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4. \uC0AD\uC81C\uD558\uBA74 \uB2E4\uC74C \uB85C\uC6CC\uB9C1 \uC804\uC5D0 \uC0C8\uB85C \uC124\uCE58\uD574\uC57C \uD569\uB2C8\uB2E4. \uAC01 \uB7F0\uD0C0\uC784\uC740 \uC18C\uC2A4 \uCCB4\uD06C\uC544\uC6C3\uACFC .venv\uB97C \uD568\uAED8 \uC783\uC73C\uBA70 \uB418\uB3CC\uB9B4 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.",
993
+ confirmDescription: "\uAC01 \uB7F0\uD0C0\uC784\uC740 \uC18C\uC2A4 \uCCB4\uD06C\uC544\uC6C3\uACFC .venv\uB97C \uD568\uAED8 \uC783\uC2B5\uB2C8\uB2E4. \uC544\uC9C1 \uBC30\uD3EC\uB418\uC5B4 \uC788\uB294 \uBC84\uC804\uC774\uB77C\uBA74 \uBA87 \uBD84 \uB9CC\uC5D0 \uB2E4\uC2DC \uC124\uCE58\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4. \uC774 \uC791\uC5C5\uC740 \uB418\uB3CC\uB9B4 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.",
994
+ confirmLabelOne: "\uB7F0\uD0C0\uC784 \uC0AD\uC81C",
995
+ confirmLabelMany: "\uB7F0\uD0C0\uC784 {count}\uAC1C \uC0AD\uC81C",
996
+ deleteFailed: "\uC0AD\uC81C\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4."
997
+ },
998
+ prepare: {
999
+ title: "\uBC84\uC804 \uC870\uD569 \uC900\uBE44",
1000
+ description: "\uC120\uD0DD\uD55C \uD720\uC744 \uADF8 \uC870\uD569\uB9CC\uC758 \uB7F0\uD0C0\uC784\uC73C\uB85C \uC124\uCE58\uD569\uB2C8\uB2E4. \uCCB4\uD06C\uC544\uC6C3\uC774 \uD544\uC694 \uC5C6\uACE0 \uC18C\uC2A4 \uBE4C\uB4DC\uC5D0 \uAC78\uB9AC\uB294 \uD55C \uC2DC\uAC04 \uB300\uC2E0 \uBA87 \uBD84\uC774\uBA74 \uB05D\uB098\uBA70, \uC0AC\uC774\uD2B8\uAC00 \uC9C0\uAE08 \uC0AC\uC6A9 \uC911\uC778 \uB7F0\uD0C0\uC784\uC740 \uAC74\uB4DC\uB9AC\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uC900\uBE44\uAC00 \uB05D\uB098\uBA74 \uADF8 \uC870\uD569\uC744 Playground\uC5D0\uC11C \uC120\uD0DD\uD560 \uC218 \uC788\uC73C\uBBC0\uB85C, \uBCF4\uACE0\uB41C \uC2E4\uD328\uB97C \uADF8 \uC2E4\uD328\uAC00 \uBC1C\uC0DD\uD55C \uBC84\uC804 \uADF8\uB300\uB85C \uC7AC\uD604\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.",
1001
+ unreachable: "\uBC30\uD3EC\uB41C \uBC84\uC804\uC774 \uBCF4\uC774\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uC0AC\uC774\uD2B8\uC5D0\uC11C \uD328\uD0A4\uC9C0 \uC0C9\uC778\uC5D0 \uC5F0\uACB0\uD558\uC9C0 \uBABB\uD558\uB294 \uC0C1\uD0DC\uC77C \uC218 \uC788\uC73C\uBA70, \uC774 \uACBD\uC6B0 \uC900\uBE44\uB294 \uCCB4\uD06C\uC544\uC6C3\uC744 \uC18C\uC2A4\uC5D0\uC11C \uBE4C\uB4DC\uD558\uB294 \uBC29\uC2DD\uC73C\uB85C \uB118\uC5B4\uAC11\uB2C8\uB2E4.",
1002
+ legato: "Legato",
1003
+ legatoHelp: "\uCEE4\uB110\uC744 \uB85C\uC6CC\uB9C1\uD569\uB2C8\uB2E4. \uC790\uCCB4 \uB9B4\uB9AC\uC2A4 \uACC4\uC5F4\uC744 \uAC00\uC9C0\uBA70, \uC815\uC2DD \uB9B4\uB9AC\uC2A4\uAC00 \uB098\uC774\uD2C0\uB9AC\uBCF4\uB2E4 \uC55E\uC5D0 \uD45C\uC2DC\uB429\uB2C8\uB2E4.",
1004
+ sdkPackages: "SDK \uD328\uD0A4\uC9C0",
1005
+ sdkPackagesHelp: "\uCEE4\uB110\uC774 \uC2E4\uD589\uB418\uB294 \uAE30\uBC18\uC785\uB2C8\uB2E4. halogger\uC640 hart, torch_ha\uAC00 \uD558\uB098\uC758 \uBC84\uC804\uC744 \uACF5\uC720\uD569\uB2C8\uB2E4.",
1006
+ latestPublished: "\uCD5C\uC2E0 \uBC30\uD3EC\uBCF8",
1007
+ pairNote: "\uBAA8\uB4E0 \uC870\uD569\uC744 \uC124\uCE58\uD560 \uC218 \uC788\uB294 \uAC83\uC740 \uC544\uB2D9\uB2C8\uB2E4. \uC0C9\uC778\uC774 \uD574\uACB0\uD558\uC9C0 \uBABB\uD558\uB294 \uC870\uD569\uC740 \uB2E4\uB978 \uBC84\uC804\uC744 \uB300\uC2E0 \uC124\uCE58\uD558\uC9C0 \uC54A\uACE0 \uC900\uBE44\uB97C \uC2E4\uD328\uC2DC\uD0A4\uBA70, \uADF8 \uC774\uC720\uB294 \uC544\uB798 \uC900\uBE44 \uAE30\uB85D\uC5D0 \uB0A8\uC2B5\uB2C8\uB2E4.",
1008
+ submit: "\uC774 \uC870\uD569 \uC900\uBE44"
1009
+ },
1010
+ progress: {
1011
+ start: "\uB7F0\uD0C0\uC784 \uC900\uBE44 \uB610\uB294 \uAC31\uC2E0",
1012
+ starting: "\uC2DC\uC791\uD558\uB294 \uC911",
1013
+ meterLabel: "SDK \uC900\uBE44 \uC9C4\uD589\uB960",
1014
+ run: "\uC2E4\uD589 {id}",
1015
+ commitUnknown: "\uCEE4\uBC0B \uC54C \uC218 \uC5C6\uC74C",
1016
+ logTitle: "\uC900\uBE44 \uBA85\uB839 \uAE30\uB85D",
1017
+ copyLog: "\uC804\uCCB4 \uAE30\uB85D \uBCF5\uC0AC",
1018
+ copied: "\uBCF5\uC0AC\uB428",
1019
+ emptyLog: "\uC544\uC9C1 \uC900\uBE44 \uBA85\uB839\uC758 \uCD9C\uB825\uC774 \uAE30\uB85D\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4.",
1020
+ failed: "\uC900\uBE44\uAC00 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4.",
1021
+ failedWithExit: "\uC900\uBE44\uAC00 \uC885\uB8CC \uCF54\uB4DC {code}\uC73C\uB85C \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4.",
1022
+ checkLog: "\uC544\uB798 \uC2E4\uC2DC\uAC04 \uAE30\uB85D\uC5D0\uC11C \uBA85\uB839 \uCD9C\uB825\uC744 \uD655\uC778\uD558\uC2ED\uC2DC\uC624.",
1023
+ statusNotPrepared: "\uC900\uBE44\uB418\uC9C0 \uC54A\uC74C",
1024
+ statusPreparing: "\uC900\uBE44 \uC911",
1025
+ statusReady: "\uC900\uBE44\uB428",
1026
+ statusFailed: "\uC2E4\uD328",
1027
+ sourceNotPrepared: "SDK \uC18C\uC2A4 \uC791\uC5C5 \uD2B8\uB9AC\uAC00 \uC544\uC9C1 \uC900\uBE44\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4.",
1028
+ refreshFailed: "\uC9C4\uD589 \uC0C1\uD669\uC744 \uC0C8\uB85C \uBD88\uB7EC\uC624\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.",
1029
+ prepareRequestFailed: "\uC900\uBE44 \uC694\uCCAD\uC744 \uBCF4\uB0B4\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.",
1030
+ copyLogFailed: "\uAE30\uB85D\uC744 \uBCF5\uC0AC\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4."
1031
+ },
1032
+ token: {
1033
+ noEncryptionKey: "`AGORA_SETTINGS_ENCRYPTION_KEY`\uAC00 \uC124\uC815\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4.",
1034
+ noEncryptionKeyDetail: "\uD1A0\uD070\uC740 \uC554\uD638\uD654\uB41C \uC0C1\uD0DC\uB85C \uBCF4\uAD00\uB418\uBBC0\uB85C, \uD1A0\uD070\uC744 \uBC1C\uAE09\uD558\uB824\uBA74 \uBC30\uD3EC \uD658\uACBD\uC5D0 \uADF8 \uD0A4\uAC00 \uBA3C\uC800 \uC124\uC815\uB418\uC5B4 \uC788\uC5B4\uC57C \uD569\uB2C8\uB2E4.",
1035
+ status: "\uC0C1\uD0DC",
1036
+ issued: "\uBC1C\uAE09\uB428",
1037
+ notIssued: "\uBC1C\uAE09\uB418\uC9C0 \uC54A\uC74C",
1038
+ never: "\uC5C6\uC74C",
1039
+ issuedAt: "\uBC1C\uAE09 \uC2DC\uAC01",
1040
+ reveal: "\uD1A0\uD070 \uBCF4\uAE30",
1041
+ revealWarning: "\uBE44\uBC00\uBC88\uD638\uC640 \uAC19\uC774 \uB2E4\uB8E8\uC2ED\uC2DC\uC624. \uC774\uC288\uB098 \uB85C\uADF8, \uCEE4\uBC0B\uC5D0 \uBD99\uC5EC \uB123\uC9C0 \uB9C8\uC2ED\uC2DC\uC624.",
1042
+ rotate: "\uD1A0\uD070 \uAD50\uCCB4",
1043
+ issue: "\uD1A0\uD070 \uBC1C\uAE09",
1044
+ revoke: "\uD68C\uC218"
1045
+ },
1046
+ tags: {
1047
+ eyebrow: "\uC774\uC288 \uBA54\uD0C0\uB370\uC774\uD130",
1048
+ title: "\uD0DC\uADF8",
1049
+ lead: "\uC774\uC288 \uD398\uC774\uC9C0\uC5D0 \uD45C\uC2DC\uB418\uB294 \uBBF8\uB9AC \uC815\uC758\uB41C \uD0DC\uADF8\uC785\uB2C8\uB2E4. \uC2DC\uC2A4\uD15C \uD0DC\uADF8\uB294 \uBCF4\uACE0 \uB0B4\uC6A9\uC5D0\uC11C \uC790\uB3D9\uC73C\uB85C \uBD99\uACE0, \uC0AC\uC6A9\uC790 \uD0DC\uADF8\uB294 \uD68C\uADC0\uC640 \uC9C8\uBB38, \uB2F4\uB2F9 \uBC94\uC704\uB97C \uBD84\uB958\uD558\uB294 \uB370 \uC501\uB2C8\uB2E4.",
1050
+ tag: "\uD0DC\uADF8",
1051
+ description: "\uC124\uBA85",
1052
+ color: "\uC0C9\uC0C1",
1053
+ action: "\uC791\uC5C5",
1054
+ system: " \xB7 \uC2DC\uC2A4\uD15C",
1055
+ locked: "\uACE0\uC815\uB428",
1056
+ delete: "\uC0AD\uC81C",
1057
+ addTitle: "\uD0DC\uADF8 \uCD94\uAC00",
1058
+ addNote: "\uCD94\uAC00\uD55C \uD0DC\uADF8\uB294 \uC800\uC7A5 \uC989\uC2DC \uC774\uC288 \uD398\uC774\uC9C0\uC5D0\uC11C \uC120\uD0DD\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.",
1059
+ idLabel: "\uC2DD\uBCC4\uC790",
1060
+ idHelp: "\uC774\uC288 \uBA54\uD0C0\uB370\uC774\uD130\uC5D0 \uC800\uC7A5\uB418\uB294 \uACE0\uC815 \uC2DD\uBCC4\uC790\uC785\uB2C8\uB2E4. \uC18C\uBB38\uC790 \uB2E8\uC5B4\uB098 \uBD99\uC784\uD45C, area:compile \uAC19\uC740 \uC811\uB450\uC0AC\uB97C \uC0AC\uC6A9\uD558\uC2ED\uC2DC\uC624.",
1061
+ idPlaceholder: "regression",
1062
+ labelLabel: "\uC774\uB984",
1063
+ labelHelp: "\uC591\uC2DD\uACFC \uD0DC\uADF8 \uBA54\uB274\uC5D0 \uD45C\uC2DC\uB418\uB294 \uC9E7\uC740 \uC774\uB984\uC785\uB2C8\uB2E4.",
1064
+ labelPlaceholder: "\uD68C\uADC0",
1065
+ descriptionLabel: "\uC124\uBA85",
1066
+ descriptionHelp: "\uC5B8\uC5B4 \uAC1C\uBC1C\uC790\uAC00 \uD0DC\uADF8\uB97C \uACE0\uB97C \uB54C \uBCF4\uC774\uB294 \uD55C \uC904 \uC124\uBA85\uC785\uB2C8\uB2E4.",
1067
+ descriptionPlaceholder: "\uC774\uC804\uC5D0 \uB3D9\uC791\uD558\uB358 \uAE30\uB2A5\uC774 \uD68C\uADC0\uD588\uC2B5\uB2C8\uB2E4",
1068
+ colorLabel: "\uC0C9\uC0C1",
1069
+ colorHelp: "\uC774\uC288 \uD398\uC774\uC9C0\uB97C \uD6D1\uC5B4\uBCFC \uB54C \uC6B0\uC120\uC21C\uC704\uB97C \uAC00\uB2A0\uD558\uB294 \uC2DC\uAC01 \uD45C\uC2DC\uC785\uB2C8\uB2E4.",
1070
+ colorRed: "\uBE68\uAC15",
1071
+ colorOrange: "\uC8FC\uD669",
1072
+ colorGreen: "\uCD08\uB85D",
1073
+ colorBlue: "\uD30C\uB791",
1074
+ colorGray: "\uD68C\uC0C9",
1075
+ systemDescriptionLowering: "\uB85C\uC6CC\uB9C1 \uD30C\uC774\uD504\uB77C\uC778 \uBB38\uC81C",
1076
+ systemDescriptionFsim: "\uAE30\uB2A5 \uC2DC\uBBAC\uB808\uC774\uC158 \uB610\uB294 \uAC80\uC99D \uBB38\uC81C",
1077
+ systemDescriptionCompile: "\uCEF4\uD30C\uC77C \uB610\uB294 \uBE4C\uB4DC \uBB38\uC81C",
1078
+ systemDescriptionRuntime: "\uB7F0\uD0C0\uC784 \uB3D9\uC791 \uBB38\uC81C",
1079
+ systemDescriptionDiagnostics: "\uC624\uB958 \uBA54\uC2DC\uC9C0 \uB610\uB294 \uC9C4\uB2E8 \uD488\uC9C8 \uBB38\uC81C",
1080
+ defaultDescriptionRegression: "\uC774\uC804\uC5D0 \uB3D9\uC791\uD558\uB358 \uAE30\uB2A5\uC774 \uD68C\uADC0\uD588\uC2B5\uB2C8\uB2E4",
1081
+ defaultDescriptionNeedsRepro: "\uC7AC\uD604\uC5D0 \uD544\uC694\uD55C \uC815\uBCF4\uAC00 \uB354 \uD544\uC694\uD569\uB2C8\uB2E4",
1082
+ defaultDescriptionQuestion: "\uC5B8\uC5B4 \uD300\uC758 \uD655\uC778\uC774 \uD544\uC694\uD569\uB2C8\uB2E4",
1083
+ submit: "\uD0DC\uADF8 \uCD94\uAC00"
1084
+ }
1085
+ };
1086
+ var settingsMessages = { en: en2, ko: ko2 };
1087
+
1088
+ // lib/i18n.ts
1089
+ var messages = {
1090
+ en: {
1091
+ common: {
1092
+ language: "Language",
1093
+ playground: "Playground",
1094
+ board: "Board",
1095
+ backToBoard: "Back to board",
1096
+ loadingIdentity: "Loading identity",
1097
+ userLogin: "User Login",
1098
+ logout: "Log out",
1099
+ adminSettings: "Admin settings",
1100
+ switchToLightTheme: "Switch to light theme",
1101
+ switchToDarkTheme: "Switch to dark theme"
1102
+ },
1103
+ identity: {
1104
+ setUpProfile: "Set up your activity profile",
1105
+ currentProfileMarker: "Current profile",
1106
+ deviceHistoryHeading: "Browsers using this profile",
1107
+ loading: "Loading device history...",
1108
+ empty: "No browser is remembered for this profile yet.",
1109
+ error: "Device history could not be loaded.",
1110
+ retry: "Try again",
1111
+ currentDevice: "This browser",
1112
+ remembered: "Remembered",
1113
+ firstUsed: "First use",
1114
+ lastUsed: "Last use",
1115
+ switchProfile: "Switch profile",
1116
+ companyLogout: "Company account logout",
1117
+ forgetDevice: "Forget this browser",
1118
+ forgetCurrentNote: "This browser stops being remembered, and its profile session ends here.",
1119
+ forgetCurrentAdminNote: "Admin settings become unavailable on this browser until a profile is set up again.",
1120
+ forgetRemoteNote: "That browser stops restoring this profile and stops being recognized as it. Its company sign-in stays as it is.",
1121
+ forgetPending: "Forgetting",
1122
+ forgetFailed: "This browser could not be forgotten."
1123
+ },
1124
+ feedback: {
1125
+ triggerLabel: "Send site feedback",
1126
+ dialogLabel: "Site feedback",
1127
+ heading: "Send a note",
1128
+ close: "Close site feedback",
1129
+ signInRequired: "Sign in with your company account, then choose the activity profile for this browser to send feedback.",
1130
+ sentUnderProfile: "Feedback is sent under an activity profile.",
1131
+ openLogin: "Open login",
1132
+ fieldLabel: "Feedback",
1133
+ placeholder: "What should be improved on this page?",
1134
+ sent: "Submitted.",
1135
+ failed: "Feedback submission failed.",
1136
+ sessionInvalid: "Your session is no longer valid. Sign in again before sending feedback.",
1137
+ from: (author) => `From ${author}`,
1138
+ sending: "Sending",
1139
+ send: "Send"
1140
+ },
1141
+ login: {
1142
+ regionLabel: "Login",
1143
+ previewRegionLabel: "Product feature preview",
1144
+ foxRegionLabel: "Fox",
1145
+ featurePreviewLabel: "Product features",
1146
+ replayFeature: "Play {feature} animation",
1147
+ foxAction: "Wag fox tail",
1148
+ organizationNavLabel: "Login and site information",
1149
+ organizationLogin: "Continue with organization account",
1150
+ help: "About this site",
1151
+ account: {
1152
+ profileHeading: "Choose your activity profile",
1153
+ profileDescription: "This browser remembers the profile you pick.",
1154
+ profileDescriptionDetail: "It names you on issues and notifications.",
1155
+ profileNameLabel: "Activity name",
1156
+ profileNameHint: "Use a name your organization already has, or type a new one.",
1157
+ profileContinue: "Continue",
1158
+ profileNameRequired: "Enter an activity name.",
1159
+ profileNameTaken: "That activity name is already in use. Pick it from the list or choose another.",
1160
+ profileUnavailable: "Unable to set up this profile. Try again.",
1161
+ confirmHeading: "Use this profile on this browser?",
1162
+ confirmExisting: "{name} already exists in your organization.",
1163
+ confirmNew: "{name} is a new activity profile.",
1164
+ confirmActivate: "Use it on this browser",
1165
+ confirmBack: "Back",
1166
+ activating: "Setting up...",
1167
+ switchHeading: "Switch activity profile",
1168
+ switchDescription: "Pick the profile this browser should use.",
1169
+ switchDescriptionDetail: "The current one stays active until you confirm.",
1170
+ switchCurrent: "Current",
1171
+ switchCreate: "Create a new profile",
1172
+ switchCancel: "Cancel",
1173
+ loadingProfiles: "Loading profiles...",
1174
+ redirecting: "Continuing..."
1175
+ }
1176
+ },
1177
+ playground: {
1178
+ editorsLabel: "Playground editors",
1179
+ closeTab: "Close {filename}",
1180
+ newTab: "New editor tab",
1181
+ file: "File",
1182
+ legatoTooltip: "Legato lowers the kernel. It is released separately, so choose its version independently from the runtime packages. A version that is not installed yet is installed when the run starts.",
1183
+ sdkTooltip: "halogger, hart, and torch_ha share one version and provide fSIM and the simulator. They are published only as nightlies, so there are no releases to pin.",
1184
+ runMode: "Run",
1185
+ lowerOnly: "Lower only",
1186
+ fsimValueCheck: "fSIM value check",
1187
+ fsimProfile: "fSIM {profile}",
1188
+ unavailable: "(unavailable)",
1189
+ installing: "Installing",
1190
+ running: "Running",
1191
+ run: "Run",
1192
+ openedFromIssue: "Opened from an issue.",
1193
+ sending: "Sending",
1194
+ suggestToIssue: "Suggest to issue",
1195
+ openIssue: "Open issue",
1196
+ suggestionSaved: "Registered as a suggestion on the issue.",
1197
+ suggestionFailed: "The suggestion could not be sent.",
1198
+ noVersions: "No versions are available. The package index is unreachable and no runtime is installed.",
1199
+ installingPrefix: "Installing the selected versions:",
1200
+ installingSuffix: "The run starts automatically when the runtime is ready. This can take a few minutes.",
1201
+ stopWaiting: "Stop waiting",
1202
+ unavailableChoice: "Unavailable run mode:",
1203
+ sourceLabel: "Python launcher source",
1204
+ resultsLabel: "Run results and history",
1205
+ latestExecution: "Latest execution",
1206
+ noRunSelected: "No run selected",
1207
+ reportedByKernel: "Reported by the kernel:",
1208
+ compiledWith: "Compiled with",
1209
+ executedOn: "executed on",
1210
+ logsPlaceholder: "Execution logs will appear here.",
1211
+ artifacts: "Artifacts",
1212
+ artifactDialogLabel: "Artifact {artifact}",
1213
+ truncated: "truncated",
1214
+ trace: "Trace",
1215
+ traceShowingTitle: "Showing where operations came from. Click to stop.",
1216
+ traceHiddenTitle: "Not tracing. Click to show where operations came from.",
1217
+ wrap: "Wrap",
1218
+ wrapShowingTitle: "Folding long lines. Click to scroll them instead.",
1219
+ wrapHiddenTitle: "Scrolling long lines. Click to fold them.",
1220
+ open: "Open",
1221
+ download: "Download",
1222
+ closePreview: "Close preview",
1223
+ previewFailed: "Artifact preview could not be loaded.",
1224
+ previewLoading: "Loading preview\u2026",
1225
+ definedOnLine: "defined on line {line}",
1226
+ inferred: "inferred",
1227
+ supportingFiles: "{count} supporting files",
1228
+ runHistory: "Run history",
1229
+ refreshRuns: "Refresh runs",
1230
+ noRuns: "No retained runs yet.",
1231
+ releases: "Releases",
1232
+ nightlies: "Nightlies",
1233
+ installed: "installed",
1234
+ runCouldNotStart: "Playground run could not be started.",
1235
+ status: {
1236
+ queued: "queued",
1237
+ running: "running",
1238
+ complete: "complete",
1239
+ error: "error"
1240
+ },
1241
+ stageStatus: {
1242
+ pending: "\u2014",
1243
+ running: "running",
1244
+ pass: "pass",
1245
+ fail: "fail"
1246
+ },
1247
+ profile: {
1248
+ none: { label: "Value check", reason: "" },
1249
+ cycle: {
1250
+ label: "Cycle check",
1251
+ reason: "The simulator supports its cycle model only on ISA_V2 (EVT1), while kernels here target EVT0."
1252
+ },
1253
+ hapti: {
1254
+ label: "HAPTI profile",
1255
+ reason: "HAPTI profiles a physical device, but this deployment uses the simulator."
1256
+ },
1257
+ full: {
1258
+ label: "Full device trace",
1259
+ reason: "Full device tracing is a manual capability and is disabled on this deployment."
1260
+ }
1261
+ }
1262
+ },
1263
+ home: {
1264
+ hero: {
1265
+ title: "Kernel Issues"
1266
+ },
1267
+ working: {
1268
+ eyebrow: "Live issue response",
1269
+ title: "Working on",
1270
+ investigating: "Investigating",
1271
+ emptyDescription: "No issues are currently under investigation.",
1272
+ missingDescription: "No description supplied.",
1273
+ viewAll: (count) => `View all ${count}`,
1274
+ updated: (value) => `Updated ${value}`,
1275
+ tagsLabel: (title) => `${title} tags`,
1276
+ previous: "Previous working issues",
1277
+ next: "Next working issues"
1278
+ },
1279
+ unread: {
1280
+ eyebrow: "Unread updates",
1281
+ open: (title) => `Open unread update: ${title}`,
1282
+ summary: (count) => `${count} unread`,
1283
+ previous: "Previous unread updates",
1284
+ next: "Next unread updates"
1285
+ },
1286
+ filters: {
1287
+ ariaLabel: "Issue filters",
1288
+ activityTitle: "Activity",
1289
+ statusTitle: "Status",
1290
+ kernelsTitle: "Kernels",
1291
+ tagsTitle: "Tags",
1292
+ all: "All",
1293
+ unresolved: "Unresolved",
1294
+ allKernels: "All kernels",
1295
+ allTags: "All tags",
1296
+ manageTags: "Manage tags",
1297
+ settings: "Settings",
1298
+ activity: {
1299
+ "90d": "Active in 90 days",
1300
+ "1y": "Active in a year",
1301
+ all: "All time"
1302
+ }
1303
+ },
1304
+ status: {
1305
+ open: "Unresolved",
1306
+ investigating: "Investigating",
1307
+ resolved: "Resolved",
1308
+ deferred: "Deferred",
1309
+ cancelled: "Cancelled"
1310
+ },
1311
+ sort: {
1312
+ "recent-activity": "Recent activity",
1313
+ "issue-number-desc": "Issue number descending",
1314
+ "issue-number-asc": "Issue number ascending",
1315
+ newest: "Newest",
1316
+ oldest: "Oldest",
1317
+ status: "Status",
1318
+ reporter: "Reporter",
1319
+ assignee: "Assignee",
1320
+ "most-seen": "Most seen",
1321
+ "search-relevance": "Search relevance"
1322
+ },
1323
+ board: {
1324
+ number: "No.",
1325
+ topic: "Topic",
1326
+ meta: "Meta",
1327
+ searchPlaceholder: "Search all issues by symptom, stage, diagnostic, tag, or artifact",
1328
+ search: "Search",
1329
+ sort: "Sort",
1330
+ sortIssues: (activeLabel) => `Sort issues: ${activeLabel}`,
1331
+ activeFilters: "Active filters",
1332
+ clearAll: "Clear all",
1333
+ noReports: "No reports yet. Create one from the CLI to preserve local reproduction metadata.",
1334
+ noMatches: "No reports match these filters.",
1335
+ clearFilters: "Clear filters",
1336
+ noDescription: "No description supplied.",
1337
+ openIssue: (title) => `Open ${title}`,
1338
+ seen: (count) => `Seen ${count}x`,
1339
+ kernel: "Kernel",
1340
+ reporter: "Reporter",
1341
+ activity: "Activity",
1342
+ hiddenMeta: (count) => `+${count} meta`,
1343
+ hiddenClosedIssues: (count) => `${count} closed issue${count === 1 ? "" : "s"} hidden`,
1344
+ filterLabel: (kind, value) => `${kind}: ${value}`
1345
+ }
1346
+ },
1347
+ issue: issueMessages.en,
1348
+ settings: settingsMessages.en
1349
+ },
1350
+ ko: {
1351
+ common: {
1352
+ language: "\uC5B8\uC5B4",
1353
+ playground: "\uD50C\uB808\uC774\uADF8\uB77C\uC6B4\uB4DC",
1354
+ board: "\uBCF4\uB4DC",
1355
+ backToBoard: "\uBCF4\uB4DC\uB85C \uB3CC\uC544\uAC00\uAE30",
1356
+ loadingIdentity: "\uC0AC\uC6A9\uC790 \uC815\uBCF4\uB97C \uBD88\uB7EC\uC624\uB294 \uC911\uC785\uB2C8\uB2E4",
1357
+ userLogin: "\uC0AC\uC6A9\uC790 \uB85C\uADF8\uC778",
1358
+ logout: "\uB85C\uADF8\uC544\uC6C3",
1359
+ adminSettings: "\uAD00\uB9AC\uC790 \uC124\uC815",
1360
+ switchToLightTheme: "\uB77C\uC774\uD2B8 \uD14C\uB9C8\uB85C \uC804\uD658",
1361
+ switchToDarkTheme: "\uB2E4\uD06C \uD14C\uB9C8\uB85C \uC804\uD658"
1362
+ },
1363
+ identity: {
1364
+ setUpProfile: "\uD65C\uB3D9 \uD504\uB85C\uD544 \uC124\uC815\uD558\uAE30",
1365
+ currentProfileMarker: "\uD604\uC7AC \uD504\uB85C\uD544",
1366
+ deviceHistoryHeading: "\uC774 \uD504\uB85C\uD544\uC744 \uC0AC\uC6A9\uD55C \uAE30\uAE30",
1367
+ loading: "\uAE30\uAE30 \uAE30\uB85D\uC744 \uBD88\uB7EC\uC624\uB294 \uC911\uC785\uB2C8\uB2E4.",
1368
+ empty: "\uC544\uC9C1 \uC774 \uD504\uB85C\uD544\uC744 \uAE30\uC5B5\uD558\uB294 \uAE30\uAE30\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.",
1369
+ error: "\uAE30\uAE30 \uAE30\uB85D\uC744 \uBD88\uB7EC\uC624\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.",
1370
+ retry: "\uB2E4\uC2DC \uBD88\uB7EC\uC624\uAE30",
1371
+ currentDevice: "\uD604\uC7AC \uAE30\uAE30",
1372
+ remembered: "\uAE30\uC5B5\uB428",
1373
+ firstUsed: "\uCC98\uC74C \uC0AC\uC6A9",
1374
+ lastUsed: "\uB9C8\uC9C0\uB9C9 \uC0AC\uC6A9",
1375
+ switchProfile: "\uD504\uB85C\uD544 \uC804\uD658",
1376
+ companyLogout: "\uD68C\uC0AC \uACC4\uC815 \uB85C\uADF8\uC544\uC6C3",
1377
+ forgetDevice: "\uAE30\uAE30 \uAE30\uC5B5 \uD574\uC81C",
1378
+ forgetCurrentNote: "\uC774 \uAE30\uAE30\uB294 \uB354 \uC774\uC0C1 \uAE30\uC5B5\uB418\uC9C0 \uC54A\uACE0, \uC774 \uAE30\uAE30\uC758 \uD504\uB85C\uD544 \uC138\uC158\uB3C4 \uC5EC\uAE30\uC11C \uC885\uB8CC\uB429\uB2C8\uB2E4.",
1379
+ forgetCurrentAdminNote: "\uC774\xA0\uAE30\uAE30\uC5D0\uC11C\uB294 \uD504\uB85C\uD544\uC744 \uB2E4\uC2DC \uC124\uC815\uD560 \uB54C\uAE4C\uC9C0 \uAD00\uB9AC\uC790 \uC124\uC815\uC744 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.",
1380
+ forgetRemoteNote: "\uADF8 \uAE30\uAE30\uB294 \uC774 \uD504\uB85C\uD544\uC744 \uC790\uB3D9\uC73C\uB85C \uBCF5\uC6D0\uD558\uC9C0 \uC54A\uACE0, \uC774 \uD504\uB85C\uD544\uB85C \uC778\uC2DD\uB418\uC9C0\uB3C4 \uC54A\uC2B5\uB2C8\uB2E4. \uD68C\uC0AC \uB85C\uADF8\uC778\uC740 \uADF8\uB300\uB85C \uB0A8\uC2B5\uB2C8\uB2E4.",
1381
+ forgetPending: "\uD574\uC81C\uD558\uB294 \uC911",
1382
+ forgetFailed: "\uAE30\uAE30 \uAE30\uC5B5\uC744 \uD574\uC81C\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4."
1383
+ },
1384
+ feedback: {
1385
+ triggerLabel: "\uC0AC\uC774\uD2B8 \uD53C\uB4DC\uBC31 \uBCF4\uB0B4\uAE30",
1386
+ dialogLabel: "\uC0AC\uC774\uD2B8 \uD53C\uB4DC\uBC31",
1387
+ heading: "\uC758\uACAC \uB0A8\uAE30\uAE30",
1388
+ close: "\uC0AC\uC774\uD2B8 \uD53C\uB4DC\uBC31 \uB2EB\uAE30",
1389
+ signInRequired: "\uD68C\uC0AC \uACC4\uC815\uC73C\uB85C \uB85C\uADF8\uC778\uD55C \uB4A4 \uC774 \uAE30\uAE30\uC5D0\uC11C \uC0AC\uC6A9\uD560 \uD65C\uB3D9 \uD504\uB85C\uD544\uC744 \uC120\uD0DD\uD558\uBA74 \uD53C\uB4DC\uBC31\uC744 \uBCF4\uB0BC \uC218 \uC788\uC2B5\uB2C8\uB2E4.",
1390
+ sentUnderProfile: "\uD53C\uB4DC\uBC31\uC740 \uD65C\uB3D9 \uD504\uB85C\uD544 \uC774\uB984\uC73C\uB85C \uC804\uC1A1\uB429\uB2C8\uB2E4.",
1391
+ openLogin: "\uB85C\uADF8\uC778 \uC5F4\uAE30",
1392
+ fieldLabel: "\uD53C\uB4DC\uBC31",
1393
+ placeholder: "\uC774 \uD398\uC774\uC9C0\uC5D0\uC11C \uAC1C\uC120\uD588\uC73C\uBA74 \uD558\uB294 \uC810\uC744 \uC801\uC5B4 \uC8FC\uC138\uC694.",
1394
+ sent: "\uC804\uC1A1\uD588\uC2B5\uB2C8\uB2E4.",
1395
+ failed: "\uD53C\uB4DC\uBC31\uC744 \uC804\uC1A1\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.",
1396
+ sessionInvalid: "\uC138\uC158\uC774 \uB354 \uC774\uC0C1 \uC720\uD6A8\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uB85C\uADF8\uC778\uD55C \uB4A4 \uD53C\uB4DC\uBC31\uC744 \uBCF4\uB0B4 \uC8FC\uC138\uC694.",
1397
+ from: (author) => `${author} \uC774\uB984\uC73C\uB85C \uC804\uC1A1`,
1398
+ sending: "\uC804\uC1A1 \uC911",
1399
+ send: "\uC804\uC1A1"
1400
+ },
1401
+ login: {
1402
+ regionLabel: "\uB85C\uADF8\uC778",
1403
+ previewRegionLabel: "\uC81C\uD488 \uAE30\uB2A5 \uBBF8\uB9AC\uBCF4\uAE30",
1404
+ foxRegionLabel: "\uC5EC\uC6B0",
1405
+ featurePreviewLabel: "\uC81C\uD488 \uAE30\uB2A5",
1406
+ replayFeature: "{feature} \uC560\uB2C8\uBA54\uC774\uC158 \uC7AC\uC0DD",
1407
+ foxAction: "\uC5EC\uC6B0\xA0\uAF2C\uB9AC \uD754\uB4E4\uAE30",
1408
+ organizationNavLabel: "\uB85C\uADF8\uC778 \uBC0F \uC0AC\uC774\uD2B8 \uC815\uBCF4",
1409
+ organizationLogin: "\uC870\uC9C1 \uACC4\uC815\uC73C\uB85C \uACC4\uC18D\uD558\uAE30",
1410
+ help: "\uC0AC\uC774\uD2B8 \uC815\uBCF4",
1411
+ account: {
1412
+ profileHeading: "\uD65C\uB3D9 \uD504\uB85C\uD544 \uC120\uD0DD",
1413
+ profileDescription: "\uC774 \uAE30\uAE30\uB294 \uC120\uD0DD\uD55C \uD504\uB85C\uD544\uC744 \uAE30\uC5B5\uD569\uB2C8\uB2E4.",
1414
+ profileDescriptionDetail: "\uC774\uC288\uC640 \uC54C\uB9BC\uC5D0 \uD45C\uC2DC\uB418\uB294 \uC774\uB984\uC785\uB2C8\uB2E4.",
1415
+ profileNameLabel: "\uD65C\uB3D9 \uC774\uB984",
1416
+ profileNameHint: "\uC870\uC9C1\uC5D0 \uC774\uBBF8 \uC788\uB294 \uC774\uB984\uC744 \uC4F0\uAC70\uB098 \uC0C8\xA0\uC774\uB984\uC744 \uC785\uB825\uD558\uC138\uC694.",
1417
+ profileContinue: "\uACC4\uC18D",
1418
+ profileNameRequired: "\uD65C\uB3D9 \uC774\uB984\uC744 \uC785\uB825\uD574 \uC8FC\uC138\uC694.",
1419
+ profileNameTaken: "\uC774\uBBF8 \uC0AC\uC6A9 \uC911\uC778 \uD65C\uB3D9 \uC774\uB984\uC785\uB2C8\uB2E4. \uBAA9\uB85D\uC5D0\uC11C \uACE0\uB974\uAC70\uB098 \uB2E4\uB978 \uC774\uB984\uC744 \uC785\uB825\uD574 \uC8FC\uC138\uC694.",
1420
+ profileUnavailable: "\uD504\uB85C\uD544\uC744 \uC124\uC815\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694.",
1421
+ confirmHeading: "\uC774 \uD504\uB85C\uD544\uC744 \uC774\xA0\uAE30\uAE30\uC5D0\uC11C \uC0AC\uC6A9\uD560\uAE4C\uC694?",
1422
+ confirmExisting: "{name} \uD504\uB85C\uD544\uC774 \uC870\uC9C1\uC5D0 \uC774\uBBF8 \uC788\uC2B5\uB2C8\uB2E4.",
1423
+ confirmNew: "{name} \uD504\uB85C\uD544\uC744 \uC0C8\uB85C \uB9CC\uB4ED\uB2C8\uB2E4.",
1424
+ confirmActivate: "\uC774 \uAE30\uAE30\uC5D0\uC11C \uC0AC\uC6A9",
1425
+ confirmBack: "\uB4A4\uB85C",
1426
+ activating: "\uC124\uC815\uD558\uB294 \uC911...",
1427
+ switchHeading: "\uD65C\uB3D9 \uD504\uB85C\uD544 \uC804\uD658",
1428
+ switchDescription: "\uC774 \uAE30\uAE30\uC5D0\uC11C \uC0AC\uC6A9\uD560 \uD504\uB85C\uD544\uC744 \uACE0\uB974\uC138\uC694.",
1429
+ switchDescriptionDetail: "\uC120\uD0DD\uC744 \uD655\uC778\uD574\uC57C \uD504\uB85C\uD544\uC774 \uBC14\uB01D\uB2C8\uB2E4.",
1430
+ switchCurrent: "\uD604\uC7AC",
1431
+ switchCreate: "\uC0C8\xA0\uD504\uB85C\uD544 \uB9CC\uB4E4\uAE30",
1432
+ switchCancel: "\uCDE8\uC18C",
1433
+ loadingProfiles: "\uD504\uB85C\uD544\uC744 \uBD88\uB7EC\uC624\uB294 \uC911...",
1434
+ redirecting: "\uC774\uB3D9\uD558\uB294 \uC911..."
1435
+ }
1436
+ },
1437
+ playground: {
1438
+ editorsLabel: "Playground \uD3B8\uC9D1\uAE30",
1439
+ closeTab: "{filename} \uD0ED \uB2EB\uAE30",
1440
+ newTab: "\uC0C8 \uD3B8\uC9D1\uAE30 \uD0ED",
1441
+ file: "\uD30C\uC77C",
1442
+ legatoTooltip: "Legato\uB294 \uCEE4\uB110\uC744 lowering\uD569\uB2C8\uB2E4. \uB7F0\uD0C0\uC784 \uD328\uD0A4\uC9C0\uC640 \uBCC4\uB3C4\uB85C \uB9B4\uB9AC\uC2A4\uB418\uBBC0\uB85C \uBC84\uC804\uC744 \uB530\uB85C \uC120\uD0DD\uD569\uB2C8\uB2E4. \uC124\uCE58\uB418\uC9C0 \uC54A\uC740 \uBC84\uC804\uC740 \uC2E4\uD589\uC744 \uC2DC\uC791\uD560 \uB54C \uC790\uB3D9\uC73C\uB85C \uC124\uCE58\uB429\uB2C8\uB2E4.",
1443
+ sdkTooltip: "halogger, hart, torch_ha\uB294 \uAC19\uC740 \uBC84\uC804\uC73C\uB85C \uBC30\uD3EC\uB418\uBA70 fSIM\uACFC \uC2DC\uBBAC\uB808\uC774\uD130\uB97C \uC81C\uACF5\uD569\uB2C8\uB2E4. \uB098\uC774\uD2C0\uB9AC\uB85C\uB9CC \uBC30\uD3EC\uB418\uBBC0\uB85C \uC120\uD0DD\uD560 \uC815\uC2DD \uB9B4\uB9AC\uC2A4\uB294 \uC5C6\uC2B5\uB2C8\uB2E4.",
1444
+ runMode: "\uC2E4\uD589 \uBC29\uC2DD",
1445
+ lowerOnly: "Lowering\uB9CC \uC2E4\uD589",
1446
+ fsimValueCheck: "fSIM \uAC12 \uAC80\uC0AC",
1447
+ fsimProfile: "fSIM {profile}",
1448
+ unavailable: "(\uC0AC\uC6A9 \uBD88\uAC00)",
1449
+ installing: "\uC124\uCE58 \uC911",
1450
+ running: "\uC2E4\uD589 \uC911",
1451
+ run: "\uC2E4\uD589",
1452
+ openedFromIssue: "\uC774\uC288\uC5D0\uC11C \uC5F4\uC5C8\uC2B5\uB2C8\uB2E4.",
1453
+ sending: "\uC804\uC1A1 \uC911",
1454
+ suggestToIssue: "\uC774\uC288\uC5D0 \uC218\uC815\uC548 \uC81C\uC548",
1455
+ openIssue: "\uC774\uC288 \uC5F4\uAE30",
1456
+ suggestionSaved: "\uC218\uC815\uC548\uC744 \uC774\uC288\uC5D0 \uB4F1\uB85D\uD588\uC2B5\uB2C8\uB2E4.",
1457
+ suggestionFailed: "\uC218\uC815\uC548\uC744 \uC804\uC1A1\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.",
1458
+ noVersions: "\uC0AC\uC6A9\uD560 \uC218 \uC788\uB294 \uBC84\uC804\uC774 \uC5C6\uC2B5\uB2C8\uB2E4. \uD328\uD0A4\uC9C0 \uC778\uB371\uC2A4\uC5D0 \uC5F0\uACB0\uD560 \uC218 \uC5C6\uACE0 \uC124\uCE58\uB41C \uB7F0\uD0C0\uC784\uB3C4 \uC5C6\uC2B5\uB2C8\uB2E4.",
1459
+ installingPrefix: "\uC120\uD0DD\uD55C \uBC84\uC804\uC744 \uC124\uCE58\uD558\uB294 \uC911\uC785\uB2C8\uB2E4:",
1460
+ installingSuffix: "\uB7F0\uD0C0\uC784\uC774 \uC900\uBE44\uB418\uBA74 \uC790\uB3D9\uC73C\uB85C \uC2E4\uD589\uD569\uB2C8\uB2E4. \uBA87 \uBD84 \uC815\uB3C4 \uAC78\uB9B4 \uC218 \uC788\uC2B5\uB2C8\uB2E4.",
1461
+ stopWaiting: "\uB300\uAE30 \uC911\uC9C0",
1462
+ unavailableChoice: "\uC0AC\uC6A9\uD560 \uC218 \uC5C6\uB294 \uC2E4\uD589 \uBC29\uC2DD:",
1463
+ sourceLabel: "Python \uB7F0\uCC98 \uC18C\uC2A4",
1464
+ resultsLabel: "\uC2E4\uD589 \uACB0\uACFC \uBC0F \uAE30\uB85D",
1465
+ latestExecution: "\uCD5C\uADFC \uC2E4\uD589",
1466
+ noRunSelected: "\uC120\uD0DD\uD55C \uC2E4\uD589 \uC5C6\uC74C",
1467
+ reportedByKernel: "\uCEE4\uB110\uC774 \uBCF4\uACE0\uD55C \uAC12:",
1468
+ compiledWith: "\uCEF4\uD30C\uC77C",
1469
+ executedOn: "\uC2E4\uD589",
1470
+ logsPlaceholder: "\uC2E4\uD589 \uB85C\uADF8\uAC00 \uC5EC\uAE30\uC5D0 \uD45C\uC2DC\uB429\uB2C8\uB2E4.",
1471
+ artifacts: "\uC544\uD2F0\uD329\uD2B8",
1472
+ artifactDialogLabel: "\uC544\uD2F0\uD329\uD2B8 {artifact}",
1473
+ truncated: "\uC77C\uBD80\uB9CC \uD45C\uC2DC",
1474
+ trace: "\uCD94\uC801",
1475
+ traceShowingTitle: "\uC5F0\uC0B0\uC758 \uC6D0\uBCF8 \uC704\uCE58\uB97C \uD45C\uC2DC\uD558\uACE0 \uC788\uC2B5\uB2C8\uB2E4. \uC911\uC9C0\uD558\uB824\uBA74 \uD074\uB9AD\uD558\uC138\uC694.",
1476
+ traceHiddenTitle: "\uD604\uC7AC \uC6D0\uBCF8 \uC704\uCE58\uB97C \uCD94\uC801\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uD45C\uC2DC\uD558\uB824\uBA74 \uD074\uB9AD\uD558\uC138\uC694.",
1477
+ wrap: "\uC904 \uBC14\uAFC8",
1478
+ wrapShowingTitle: "\uAE34 \uC904\uC744 \uC811\uC5B4 \uD45C\uC2DC\uD558\uACE0 \uC788\uC2B5\uB2C8\uB2E4. \uAC00\uB85C \uC2A4\uD06C\uB864\uB85C \uBCF4\uB824\uBA74 \uD074\uB9AD\uD558\uC138\uC694.",
1479
+ wrapHiddenTitle: "\uAE34 \uC904\uC744 \uAC00\uB85C \uC2A4\uD06C\uB864\uB85C \uD45C\uC2DC\uD558\uACE0 \uC788\uC2B5\uB2C8\uB2E4. \uC811\uC5B4\uC11C \uBCF4\uB824\uBA74 \uD074\uB9AD\uD558\uC138\uC694.",
1480
+ open: "\uC5F4\uAE30",
1481
+ download: "\uB2E4\uC6B4\uB85C\uB4DC",
1482
+ closePreview: "\uBBF8\uB9AC\uBCF4\uAE30 \uB2EB\uAE30",
1483
+ previewFailed: "\uC544\uD2F0\uD329\uD2B8 \uBBF8\uB9AC\uBCF4\uAE30\uB97C \uBD88\uB7EC\uC624\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.",
1484
+ previewLoading: "\uBBF8\uB9AC\uBCF4\uAE30\uB97C \uBD88\uB7EC\uC624\uB294 \uC911\u2026",
1485
+ definedOnLine: "{line}\uD589\uC5D0 \uC815\uC758\uB428",
1486
+ inferred: "\uCD94\uB860\uB428",
1487
+ supportingFiles: "\uBCF4\uC870 \uD30C\uC77C {count}\uAC1C",
1488
+ runHistory: "\uC2E4\uD589 \uAE30\uB85D",
1489
+ refreshRuns: "\uC2E4\uD589 \uAE30\uB85D \uC0C8\uB85C\uACE0\uCE68",
1490
+ noRuns: "\uC544\uC9C1 \uBCF4\uAD00\uB41C \uC2E4\uD589 \uAE30\uB85D\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.",
1491
+ releases: "\uB9B4\uB9AC\uC2A4",
1492
+ nightlies: "\uB098\uC774\uD2C0\uB9AC",
1493
+ installed: "\uC124\uCE58\uB428",
1494
+ runCouldNotStart: "Playground \uC2E4\uD589\uC744 \uC2DC\uC791\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.",
1495
+ status: {
1496
+ queued: "\uB300\uAE30 \uC911",
1497
+ running: "\uC2E4\uD589 \uC911",
1498
+ complete: "\uC644\uB8CC",
1499
+ error: "\uC624\uB958"
1500
+ },
1501
+ stageStatus: {
1502
+ pending: "\u2014",
1503
+ running: "\uC2E4\uD589 \uC911",
1504
+ pass: "\uD1B5\uACFC",
1505
+ fail: "\uC2E4\uD328"
1506
+ },
1507
+ profile: {
1508
+ none: { label: "\uAC12 \uAC80\uC0AC", reason: "" },
1509
+ cycle: {
1510
+ label: "\uC0AC\uC774\uD074 \uAC80\uC0AC",
1511
+ reason: "\uC2DC\uBBAC\uB808\uC774\uD130\uC758 \uC0AC\uC774\uD074 \uBAA8\uB378\uC740 ISA_V2(EVT1)\uB9CC \uC9C0\uC6D0\uD558\uC9C0\uB9CC, \uC774 Playground\uC758 \uCEE4\uB110\uC740 EVT0\uC744 \uB300\uC0C1\uC73C\uB85C lowering\uD569\uB2C8\uB2E4."
1512
+ },
1513
+ hapti: {
1514
+ label: "HAPTI \uD504\uB85C\uD30C\uC77C",
1515
+ reason: "HAPTI\uB294 \uC2E4\uC81C \uC7A5\uCE58\uB97C \uD504\uB85C\uD30C\uC77C\uB9C1\uD558\uC9C0\uB9CC, \uD604\uC7AC \uBC30\uD3EC \uD658\uACBD\uC740 \uC2DC\uBBAC\uB808\uC774\uD130\uB97C \uC0AC\uC6A9\uD569\uB2C8\uB2E4."
1516
+ },
1517
+ full: {
1518
+ label: "\uC804\uCCB4 \uC7A5\uCE58 \uCD94\uC801",
1519
+ reason: "\uC804\uCCB4 \uC7A5\uCE58 \uCD94\uC801\uC740 \uC218\uB3D9\uC73C\uB85C \uD65C\uC131\uD654\uD574\uC57C \uD558\uBA70 \uD604\uC7AC \uBC30\uD3EC \uD658\uACBD\uC5D0\uC11C\uB294 \uBE44\uD65C\uC131\uD654\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4."
1520
+ }
1521
+ }
1522
+ },
1523
+ home: {
1524
+ hero: {
1525
+ title: "\uCEE4\uB110 \uC774\uC288"
1526
+ },
1527
+ working: {
1528
+ eyebrow: "\uC2E4\uC2DC\uAC04 \uC9C4\uD589 \uD604\uD669",
1529
+ title: "\uC9C0\uAE08 \uC870\uC0AC \uC911\uC778 \uC774\uC288",
1530
+ investigating: "\uC870\uC0AC \uC911",
1531
+ emptyDescription: "\uD604\uC7AC \uC870\uC0AC \uC911\uC778 \uC774\uC288\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.",
1532
+ missingDescription: "\uB4F1\uB85D\uB41C \uC124\uBA85\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.",
1533
+ viewAll: (count) => `\uC804\uCCB4 ${count}\uAC74 \uBCF4\uAE30`,
1534
+ updated: (value) => `\uCD5C\uADFC \uAC31\uC2E0 ${value}`,
1535
+ tagsLabel: (title) => `${title} \uD0DC\uADF8`,
1536
+ previous: "\uC774\uC804 \uC774\uC288 \uBCF4\uAE30",
1537
+ next: "\uB2E4\uC74C \uC774\uC288 \uBCF4\uAE30"
1538
+ },
1539
+ unread: {
1540
+ eyebrow: "\uC77D\uC9C0 \uC54A\uC740 \uC54C\uB9BC",
1541
+ open: (title) => `\uC77D\uC9C0 \uC54A\uC740 \uC54C\uB9BC \uC5F4\uAE30: ${title}`,
1542
+ summary: (count) => `\uC77D\uC9C0 \uC54A\uC740 \uC54C\uB9BC ${count}\uAC74`,
1543
+ previous: "\uC774\uC804 \uC77D\uC9C0 \uC54A\uC740 \uC54C\uB9BC",
1544
+ next: "\uB2E4\uC74C \uC77D\uC9C0 \uC54A\uC740 \uC54C\uB9BC"
1545
+ },
1546
+ filters: {
1547
+ ariaLabel: "\uC774\uC288 \uD544\uD130",
1548
+ activityTitle: "\uD65C\uB3D9",
1549
+ statusTitle: "\uC0C1\uD0DC",
1550
+ kernelsTitle: "\uCEE4\uB110",
1551
+ tagsTitle: "\uD0DC\uADF8",
1552
+ all: "\uC804\uCCB4",
1553
+ unresolved: "\uBBF8\uD574\uACB0",
1554
+ allKernels: "\uBAA8\uB4E0 \uCEE4\uB110",
1555
+ allTags: "\uBAA8\uB4E0 \uD0DC\uADF8",
1556
+ manageTags: "\uD0DC\uADF8 \uAD00\uB9AC",
1557
+ settings: "\uAD00\uB9AC",
1558
+ activity: {
1559
+ "90d": "\uCD5C\uADFC 90\uC77C \uD65C\uB3D9",
1560
+ "1y": "\uCD5C\uADFC 1\uB144 \uD65C\uB3D9",
1561
+ all: "\uC804\uCCB4 \uAE30\uAC04"
1562
+ }
1563
+ },
1564
+ status: {
1565
+ open: "\uBBF8\uD574\uACB0",
1566
+ investigating: "\uC870\uC0AC \uC911",
1567
+ resolved: "\uD574\uACB0\uB428",
1568
+ deferred: "\uBCF4\uB958",
1569
+ cancelled: "\uCDE8\uC18C\uB428"
1570
+ },
1571
+ sort: {
1572
+ "recent-activity": "\uCD5C\uADFC \uD65C\uB3D9\uC21C",
1573
+ "issue-number-desc": "\uBC88\uD638 \uB192\uC740\uC21C",
1574
+ "issue-number-asc": "\uBC88\uD638 \uB0AE\uC740\uC21C",
1575
+ newest: "\uB4F1\uB85D \uCD5C\uC2E0\uC21C",
1576
+ oldest: "\uB4F1\uB85D \uC624\uB798\uB41C\uC21C",
1577
+ status: "\uC0C1\uD0DC\uC21C",
1578
+ reporter: "\uB4F1\uB85D\uC790\uC21C",
1579
+ assignee: "\uB2F4\uB2F9\uC790\uC21C",
1580
+ "most-seen": "\uC811\uC218 \uD69F\uC218\uC21C",
1581
+ "search-relevance": "\uAC80\uC0C9 \uAD00\uB828\uB3C4\uC21C"
1582
+ },
1583
+ board: {
1584
+ number: "\uBC88\uD638",
1585
+ topic: "\uC8FC\uC81C",
1586
+ meta: "\uC815\uBCF4",
1587
+ searchPlaceholder: "\uC99D\uC0C1, \uC7AC\uD604 \uB2E8\uACC4, \uC9C4\uB2E8 \uB85C\uADF8, \uD0DC\uADF8, \uC544\uD2F0\uD329\uD2B8\uB85C \uC774\uC288 \uAC80\uC0C9",
1588
+ search: "\uAC80\uC0C9",
1589
+ sort: "\uC815\uB82C",
1590
+ sortIssues: (activeLabel) => `\uC774\uC288 \uC815\uB82C: ${activeLabel}`,
1591
+ activeFilters: "\uC801\uC6A9\uB41C \uD544\uD130",
1592
+ clearAll: "\uBAA8\uB4E0 \uD544\uD130 \uD574\uC81C",
1593
+ noReports: "\uC544\uC9C1 \uB4F1\uB85D\uB41C \uC774\uC288\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4. \uB85C\uCEEC \uC7AC\uD604 \uC815\uBCF4\uAE4C\uC9C0 \uD568\uAED8 \uB0A8\uAE30\uB824\uBA74 CLI\uB85C \uB4F1\uB85D\uD574 \uC8FC\uC138\uC694.",
1594
+ noMatches: "\uC801\uC6A9\uD55C \uD544\uD130\uC5D0 \uD574\uB2F9\uD558\uB294 \uC774\uC288\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.",
1595
+ clearFilters: "\uAC80\uC0C9 \uC870\uAC74 \uCD08\uAE30\uD654",
1596
+ noDescription: "\uC124\uBA85\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.",
1597
+ openIssue: (title) => `${title} \uC5F4\uAE30`,
1598
+ seen: (count) => `${count}\uD68C \uC811\uC218`,
1599
+ kernel: "\uCEE4\uB110",
1600
+ reporter: "\uB4F1\uB85D\uC790",
1601
+ activity: "\uCD5C\uADFC \uD65C\uB3D9",
1602
+ hiddenMeta: (count) => `\uD0DC\uADF8 ${count}\uAC1C \uB354 \uBCF4\uAE30`,
1603
+ hiddenClosedIssues: (count) => `\uC885\uB8CC\uB41C \uC774\uC288 ${count}\uAC74\uC774 \uAE30\uAC04 \uD544\uD130\uB85C \uAC00\uB824\uC838 \uC788\uC2B5\uB2C8\uB2E4`,
1604
+ filterLabel: (kind, value) => `${kind}: ${value}`
1605
+ }
1606
+ },
1607
+ issue: issueMessages.ko,
1608
+ settings: settingsMessages.ko
1609
+ }
1610
+ };
1611
+
1612
+ // lib/format.ts
1613
+ function statusLabel(status) {
1614
+ if (status === "open") return "Unresolved";
1615
+ if (status === "investigating") return "Investigating";
1616
+ if (status === "resolved") return "Resolved";
1617
+ if (status === "deferred") return "Deferred";
1618
+ if (status === "cancelled") return "Cancelled";
1619
+ return status;
1620
+ }
1621
+ function issueSummary(markdown, maxLength = 180) {
1622
+ const firstUsefulLine = markdown.split(/\r?\n/).map((line) => line.trim()).find((line) => line && !line.startsWith("#") && !line.startsWith("```") && !line.startsWith("- "));
1623
+ const summary = (firstUsefulLine ?? markdown).replace(/[`*_>#\[\]()]/g, "").replace(/\s+/g, " ").trim();
1624
+ if (summary.length <= maxLength) return summary;
1625
+ return `${summary.slice(0, maxLength - 1).trim()}\u2026`;
1626
+ }
1627
+
1628
+ // lib/issue-search.ts
1629
+ var MIN_TOKEN_LENGTH = 2;
1630
+ function searchIssueRecords(records, query) {
1631
+ const queryTokens = tokenize(query);
1632
+ if (queryTokens.length === 0) {
1633
+ return records.map((record) => ({ record, score: 0, reasons: [] }));
1634
+ }
1635
+ return records.map((record) => scoreRecord(record, query, queryTokens)).filter((result) => result.score > 0).sort((left, right) => right.score - left.score || new Date(right.record.issue.updatedAt).getTime() - new Date(left.record.issue.updatedAt).getTime());
1636
+ }
1637
+ function scoreRecord(record, query, queryTokens) {
1638
+ const fields = searchableFields(record);
1639
+ const reasons = [];
1640
+ let score = 0;
1641
+ for (const field of fields) {
1642
+ const fieldTokens = tokenize(field.text);
1643
+ const tokenScore = overlapScore(queryTokens, fieldTokens) * field.weight;
1644
+ const phraseScore = normalized(field.text).includes(normalized(query).slice(0, 80)) ? field.weight * 2 : 0;
1645
+ const fuzzyScore = fuzzyTokenHits(queryTokens, fieldTokens) * field.weight * 0.35;
1646
+ const fieldScore = tokenScore + phraseScore + fuzzyScore;
1647
+ if (fieldScore > 0) {
1648
+ score += fieldScore;
1649
+ if (reasons.length < 3) reasons.push(`${field.label}: ${matchingTokens(queryTokens, fieldTokens).join(", ") || "similar text"}`);
1650
+ }
1651
+ }
1652
+ return { record, score, reasons };
1653
+ }
1654
+ function searchableFields(record) {
1655
+ const assignees = [...record.issue.assignees ?? [], ...record.issue.assignee ? [record.issue.assignee] : []];
1656
+ return [
1657
+ { label: "title", text: record.issue.title, weight: 4 },
1658
+ { label: "description", text: record.issue.description, weight: 2 },
1659
+ { label: "reporter", text: record.issue.creator, weight: 3 },
1660
+ { label: "occurrence reporter", text: record.occurrences.map((occurrence) => occurrence.reporter).join(" "), weight: 2.5 },
1661
+ { label: "comment author", text: record.comments.map((comment) => comment.author).join(" "), weight: 2.5 },
1662
+ { label: "assignee", text: assignees.map((assignee) => assignee.name).join(" "), weight: 2.5 },
1663
+ { label: "tags", text: record.issue.tags.join(" "), weight: 3 },
1664
+ { label: "comments", text: record.comments.map((comment) => comment.body).join("\n"), weight: 1.25 },
1665
+ { label: "artifacts", text: record.artifacts.map((artifact) => artifact.filename).join(" "), weight: 1.5 }
1666
+ ];
1667
+ }
1668
+ function overlapScore(queryTokens, fieldTokens) {
1669
+ const fieldSet = new Set(fieldTokens);
1670
+ return queryTokens.filter((token) => fieldSet.has(token)).length / queryTokens.length;
1671
+ }
1672
+ function fuzzyTokenHits(queryTokens, fieldTokens) {
1673
+ const fieldSet = new Set(fieldTokens);
1674
+ return queryTokens.filter((token) => {
1675
+ if (fieldSet.has(token)) return false;
1676
+ return fieldTokens.some((candidate) => candidate.includes(token) || token.includes(candidate));
1677
+ }).length / queryTokens.length;
1678
+ }
1679
+ function matchingTokens(queryTokens, fieldTokens) {
1680
+ const fieldSet = new Set(fieldTokens);
1681
+ return queryTokens.filter((token) => fieldSet.has(token)).slice(0, 5);
1682
+ }
1683
+ function tokenize(text) {
1684
+ const tokens = normalized(text).split(" ").filter((token) => token.length >= MIN_TOKEN_LENGTH);
1685
+ return [...new Set(tokens)];
1686
+ }
1687
+ function normalized(text) {
1688
+ return text.toLowerCase().replace(/[^a-z0-9가-힣_./:-]+/g, " ").replace(/\s+/g, " ").trim();
1689
+ }
1690
+
1691
+ // scripts/issue-search-api-client.ts
1692
+ async function searchIssuesFromApi(input) {
1693
+ const endpoint = new URL(`${input.session.apiUrl}/api/issues/search`);
1694
+ endpoint.searchParams.set("q", input.query);
1695
+ endpoint.searchParams.set("limit", String(input.limit));
1696
+ const payload = await readJsonFromApi(endpoint.toString(), input.session);
1697
+ return readSearchResults(payload);
1698
+ }
1699
+ function readSearchResults(payload) {
1700
+ if (!payload || typeof payload !== "object" || Array.isArray(payload)) {
1701
+ throw new Error("Search response has an unsupported shape");
1702
+ }
1703
+ const results = Reflect.get(payload, "results");
1704
+ if (!Array.isArray(results) || !results.every(isIssueSearchApiResult)) {
1705
+ throw new Error("Search response has an unsupported shape");
1706
+ }
1707
+ return results;
1708
+ }
1709
+ function isIssueSearchApiResult(value) {
1710
+ if (!value || typeof value !== "object" || Array.isArray(value)) return false;
1711
+ return typeof Reflect.get(value, "id") === "string" && typeof Reflect.get(value, "title") === "string" && isIssueStatus(Reflect.get(value, "status")) && typeof Reflect.get(value, "summary") === "string" && typeof Reflect.get(value, "score") === "number" && Array.isArray(Reflect.get(value, "reasons")) && typeof Reflect.get(value, "href") === "string";
1712
+ }
1713
+ function isIssueStatus(value) {
1714
+ return value === "open" || value === "investigating" || value === "resolved" || value === "deferred" || value === "cancelled";
1715
+ }
1716
+
1717
+ // scripts/issue-search.ts
1718
+ function parseArgs(argv) {
1719
+ const args = {};
1720
+ for (let index = 0; index < argv.length; index += 1) {
1721
+ const token = argv[index];
1722
+ const value = argv[index + 1];
1723
+ if (token === "--query" || token === "-q") {
1724
+ if (!value || value.startsWith("--")) throw new Error(`${token} requires a value`);
1725
+ args.query = value;
1726
+ index += 1;
1727
+ continue;
1728
+ }
1729
+ if (token === "--api-url") {
1730
+ if (!value || value.startsWith("--")) throw new Error(`${token} requires a value`);
1731
+ args.apiUrl = value;
1732
+ index += 1;
1733
+ continue;
1734
+ }
1735
+ if (token === "--limit") {
1736
+ if (!value || value.startsWith("--")) throw new Error(`${token} requires a value`);
1737
+ args.limit = value;
1738
+ index += 1;
1739
+ continue;
1740
+ }
1741
+ if (token === "--store") {
1742
+ if (!value || value.startsWith("--")) throw new Error(`${token} requires a value`);
1743
+ args.store = value;
1744
+ index += 1;
1745
+ }
1746
+ }
1747
+ return args;
1748
+ }
1749
+ async function main() {
1750
+ const args = parseArgs(process.argv.slice(2));
1751
+ const query = requireArg(args.query, "--query");
1752
+ const limit = readLimit(args.limit);
1753
+ if (args.store?.trim()) process.env.AGORA_ISSUE_STORE = path.resolve(args.store.trim());
1754
+ const appPathPrefix = readAppPathPrefix(args.apiUrl);
1755
+ const stored = args.store?.trim() ? void 0 : await new LagoraCliConfigStore().apiSession(args.apiUrl);
1756
+ const results = stored ? await searchIssuesFromApi({
1757
+ session: apiSession(stored.apiUrl, { cookie: stored.cookie, token: stored.token }),
1758
+ query,
1759
+ limit
1760
+ }) : await searchLocalIssues(query, limit);
1761
+ printResults(results, appPathPrefix);
1762
+ }
1763
+ async function searchLocalIssues(query, limit) {
1764
+ const { listIssues } = await import("./storage-234FBH54.js");
1765
+ return searchIssueRecords(await listIssues(), query).slice(0, limit).map((result) => ({
1766
+ id: result.record.issue.id,
1767
+ title: result.record.issue.title,
1768
+ status: result.record.issue.status,
1769
+ summary: issueSummary(result.record.issue.description),
1770
+ score: result.score,
1771
+ reasons: result.reasons,
1772
+ href: `/issues/${result.record.issue.id}`
1773
+ }));
1774
+ }
1775
+ function printResults(results, appPathPrefix) {
1776
+ if (results.length === 0) {
1777
+ console.log("No matching issues.");
1778
+ return;
1779
+ }
1780
+ for (const result of results) {
1781
+ console.log(`${result.id} [${statusLabel(result.status)}] score=${result.score.toFixed(2)}`);
1782
+ console.log(result.title);
1783
+ console.log(`link: ${renderLink(result.href, appPathPrefix)}`);
1784
+ if (result.reasons.length > 0) console.log(`matches: ${result.reasons.join(" \xB7 ")}`);
1785
+ if (result.summary) console.log(result.summary);
1786
+ console.log("");
1787
+ }
1788
+ }
1789
+ function renderLink(rawHref, appPathPrefix) {
1790
+ if (!rawHref.startsWith("/")) return rawHref;
1791
+ if (!appPathPrefix || appPathPrefix === "/") return rawHref;
1792
+ if (rawHref === appPathPrefix || rawHref.startsWith(`${appPathPrefix}/`)) return rawHref;
1793
+ return `${appPathPrefix}${rawHref}`;
1794
+ }
1795
+ function readAppPathPrefix(apiUrl) {
1796
+ const raw = apiUrl?.trim();
1797
+ if (!raw) return void 0;
1798
+ const url = new URL(raw);
1799
+ let basePath = url.pathname.replace(/\/+$/, "");
1800
+ if (!basePath || basePath === "/") return void 0;
1801
+ if (basePath.endsWith("/api")) basePath = basePath.slice(0, -4);
1802
+ return basePath || "/";
1803
+ }
1804
+ function readLimit(value) {
1805
+ const parsed = Number.parseInt(value ?? "", 10);
1806
+ if (!Number.isInteger(parsed) || parsed <= 0) return 10;
1807
+ return Math.min(parsed, 50);
1808
+ }
1809
+ function requireArg(value, name) {
1810
+ if (!value?.trim()) throw new Error(`${name} is required`);
1811
+ return value.trim();
1812
+ }
1813
+ if (import.meta.url === packageFileUrl(process.argv[1]).href) {
1814
+ main().catch((error) => {
1815
+ console.error(error instanceof Error ? error.message : error);
1816
+ process.exit(1);
1817
+ });
1818
+ }
1819
+ export {
1820
+ printResults,
1821
+ readAppPathPrefix,
1822
+ renderLink
1823
+ };