@jonsoc/app 1.1.34

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 (139) hide show
  1. package/AGENTS.md +30 -0
  2. package/README.md +51 -0
  3. package/bunfig.toml +2 -0
  4. package/e2e/context.spec.ts +45 -0
  5. package/e2e/file-open.spec.ts +23 -0
  6. package/e2e/file-viewer.spec.ts +35 -0
  7. package/e2e/fixtures.ts +40 -0
  8. package/e2e/home.spec.ts +21 -0
  9. package/e2e/model-picker.spec.ts +43 -0
  10. package/e2e/navigation.spec.ts +9 -0
  11. package/e2e/palette.spec.ts +15 -0
  12. package/e2e/prompt-mention.spec.ts +26 -0
  13. package/e2e/prompt-slash-open.spec.ts +22 -0
  14. package/e2e/prompt.spec.ts +62 -0
  15. package/e2e/session.spec.ts +21 -0
  16. package/e2e/settings.spec.ts +44 -0
  17. package/e2e/sidebar.spec.ts +21 -0
  18. package/e2e/terminal-init.spec.ts +25 -0
  19. package/e2e/terminal.spec.ts +16 -0
  20. package/e2e/tsconfig.json +8 -0
  21. package/e2e/utils.ts +38 -0
  22. package/happydom.ts +75 -0
  23. package/index.html +23 -0
  24. package/package.json +72 -0
  25. package/playwright.config.ts +43 -0
  26. package/public/_headers +17 -0
  27. package/public/apple-touch-icon-v3.png +1 -0
  28. package/public/apple-touch-icon.png +1 -0
  29. package/public/favicon-96x96-v3.png +1 -0
  30. package/public/favicon-96x96.png +1 -0
  31. package/public/favicon-v3.ico +1 -0
  32. package/public/favicon-v3.svg +1 -0
  33. package/public/favicon.ico +1 -0
  34. package/public/favicon.svg +1 -0
  35. package/public/oc-theme-preload.js +28 -0
  36. package/public/site.webmanifest +1 -0
  37. package/public/social-share-zen.png +1 -0
  38. package/public/social-share.png +1 -0
  39. package/public/web-app-manifest-192x192.png +1 -0
  40. package/public/web-app-manifest-512x512.png +1 -0
  41. package/script/e2e-local.ts +143 -0
  42. package/src/addons/serialize.test.ts +319 -0
  43. package/src/addons/serialize.ts +591 -0
  44. package/src/app.tsx +150 -0
  45. package/src/components/dialog-connect-provider.tsx +428 -0
  46. package/src/components/dialog-edit-project.tsx +259 -0
  47. package/src/components/dialog-fork.tsx +104 -0
  48. package/src/components/dialog-manage-models.tsx +59 -0
  49. package/src/components/dialog-select-directory.tsx +208 -0
  50. package/src/components/dialog-select-file.tsx +196 -0
  51. package/src/components/dialog-select-mcp.tsx +96 -0
  52. package/src/components/dialog-select-model-unpaid.tsx +130 -0
  53. package/src/components/dialog-select-model.tsx +162 -0
  54. package/src/components/dialog-select-provider.tsx +70 -0
  55. package/src/components/dialog-select-server.tsx +249 -0
  56. package/src/components/dialog-settings.tsx +112 -0
  57. package/src/components/file-tree.tsx +112 -0
  58. package/src/components/link.tsx +17 -0
  59. package/src/components/model-tooltip.tsx +91 -0
  60. package/src/components/prompt-input.tsx +2076 -0
  61. package/src/components/session/index.ts +5 -0
  62. package/src/components/session/session-context-tab.tsx +428 -0
  63. package/src/components/session/session-header.tsx +343 -0
  64. package/src/components/session/session-new-view.tsx +93 -0
  65. package/src/components/session/session-sortable-tab.tsx +56 -0
  66. package/src/components/session/session-sortable-terminal-tab.tsx +187 -0
  67. package/src/components/session-context-usage.tsx +113 -0
  68. package/src/components/session-lsp-indicator.tsx +42 -0
  69. package/src/components/session-mcp-indicator.tsx +34 -0
  70. package/src/components/settings-agents.tsx +15 -0
  71. package/src/components/settings-commands.tsx +15 -0
  72. package/src/components/settings-general.tsx +306 -0
  73. package/src/components/settings-keybinds.tsx +437 -0
  74. package/src/components/settings-mcp.tsx +15 -0
  75. package/src/components/settings-models.tsx +15 -0
  76. package/src/components/settings-permissions.tsx +234 -0
  77. package/src/components/settings-providers.tsx +15 -0
  78. package/src/components/terminal.tsx +315 -0
  79. package/src/components/titlebar.tsx +156 -0
  80. package/src/context/command.tsx +308 -0
  81. package/src/context/comments.tsx +140 -0
  82. package/src/context/file.tsx +409 -0
  83. package/src/context/global-sdk.tsx +106 -0
  84. package/src/context/global-sync.tsx +898 -0
  85. package/src/context/language.tsx +161 -0
  86. package/src/context/layout-scroll.test.ts +73 -0
  87. package/src/context/layout-scroll.ts +118 -0
  88. package/src/context/layout.tsx +648 -0
  89. package/src/context/local.tsx +578 -0
  90. package/src/context/notification.tsx +173 -0
  91. package/src/context/permission.tsx +167 -0
  92. package/src/context/platform.tsx +59 -0
  93. package/src/context/prompt.tsx +245 -0
  94. package/src/context/sdk.tsx +48 -0
  95. package/src/context/server.tsx +214 -0
  96. package/src/context/settings.tsx +166 -0
  97. package/src/context/sync.tsx +320 -0
  98. package/src/context/terminal.tsx +267 -0
  99. package/src/custom-elements.d.ts +17 -0
  100. package/src/entry.tsx +76 -0
  101. package/src/env.d.ts +8 -0
  102. package/src/hooks/use-providers.ts +31 -0
  103. package/src/i18n/ar.ts +656 -0
  104. package/src/i18n/br.ts +667 -0
  105. package/src/i18n/da.ts +582 -0
  106. package/src/i18n/de.ts +591 -0
  107. package/src/i18n/en.ts +665 -0
  108. package/src/i18n/es.ts +585 -0
  109. package/src/i18n/fr.ts +592 -0
  110. package/src/i18n/ja.ts +579 -0
  111. package/src/i18n/ko.ts +580 -0
  112. package/src/i18n/no.ts +602 -0
  113. package/src/i18n/pl.ts +661 -0
  114. package/src/i18n/ru.ts +664 -0
  115. package/src/i18n/zh.ts +574 -0
  116. package/src/i18n/zht.ts +570 -0
  117. package/src/index.css +57 -0
  118. package/src/index.ts +2 -0
  119. package/src/pages/directory-layout.tsx +57 -0
  120. package/src/pages/error.tsx +290 -0
  121. package/src/pages/home.tsx +125 -0
  122. package/src/pages/layout.tsx +2599 -0
  123. package/src/pages/session.tsx +2505 -0
  124. package/src/sst-env.d.ts +10 -0
  125. package/src/utils/dom.ts +51 -0
  126. package/src/utils/id.ts +99 -0
  127. package/src/utils/index.ts +1 -0
  128. package/src/utils/perf.ts +135 -0
  129. package/src/utils/persist.ts +377 -0
  130. package/src/utils/prompt.ts +203 -0
  131. package/src/utils/same.ts +6 -0
  132. package/src/utils/solid-dnd.tsx +55 -0
  133. package/src/utils/sound.ts +110 -0
  134. package/src/utils/speech.ts +302 -0
  135. package/src/utils/worktree.ts +58 -0
  136. package/sst-env.d.ts +9 -0
  137. package/tsconfig.json +26 -0
  138. package/vite.config.ts +15 -0
  139. package/vite.js +26 -0
package/src/i18n/en.ts ADDED
@@ -0,0 +1,665 @@
1
+ export const dict = {
2
+ "command.category.suggested": "Suggested",
3
+ "command.category.view": "View",
4
+ "command.category.project": "Project",
5
+ "command.category.provider": "Provider",
6
+ "command.category.server": "Server",
7
+ "command.category.session": "Session",
8
+ "command.category.theme": "Theme",
9
+ "command.category.language": "Language",
10
+ "command.category.file": "File",
11
+ "command.category.terminal": "Terminal",
12
+ "command.category.model": "Model",
13
+ "command.category.mcp": "MCP",
14
+ "command.category.agent": "Agent",
15
+ "command.category.permissions": "Permissions",
16
+ "command.category.workspace": "Workspace",
17
+ "command.category.settings": "Settings",
18
+
19
+ "theme.scheme.system": "System",
20
+ "theme.scheme.light": "Light",
21
+ "theme.scheme.dark": "Dark",
22
+
23
+ "command.sidebar.toggle": "Toggle sidebar",
24
+ "command.project.open": "Open project",
25
+ "command.provider.connect": "Connect provider",
26
+ "command.server.switch": "Switch server",
27
+ "command.settings.open": "Open settings",
28
+ "command.session.previous": "Previous session",
29
+ "command.session.next": "Next session",
30
+ "command.session.archive": "Archive session",
31
+
32
+ "command.palette": "Command palette",
33
+
34
+ "command.theme.cycle": "Cycle theme",
35
+ "command.theme.set": "Use theme: {{theme}}",
36
+ "command.theme.scheme.cycle": "Cycle color scheme",
37
+ "command.theme.scheme.set": "Use color scheme: {{scheme}}",
38
+
39
+ "command.language.cycle": "Cycle language",
40
+ "command.language.set": "Use language: {{language}}",
41
+
42
+ "command.session.new": "New session",
43
+ "command.file.open": "Open file",
44
+ "command.file.open.description": "Search files and commands",
45
+ "command.terminal.toggle": "Toggle terminal",
46
+ "command.review.toggle": "Toggle review",
47
+ "command.terminal.new": "New terminal",
48
+ "command.terminal.new.description": "Create a new terminal tab",
49
+ "command.steps.toggle": "Toggle steps",
50
+ "command.steps.toggle.description": "Show or hide steps for the current message",
51
+ "command.message.previous": "Previous message",
52
+ "command.message.previous.description": "Go to the previous user message",
53
+ "command.message.next": "Next message",
54
+ "command.message.next.description": "Go to the next user message",
55
+ "command.model.choose": "Choose model",
56
+ "command.model.choose.description": "Select a different model",
57
+ "command.mcp.toggle": "Toggle MCPs",
58
+ "command.mcp.toggle.description": "Toggle MCPs",
59
+ "command.agent.cycle": "Cycle agent",
60
+ "command.agent.cycle.description": "Switch to the next agent",
61
+ "command.agent.cycle.reverse": "Cycle agent backwards",
62
+ "command.agent.cycle.reverse.description": "Switch to the previous agent",
63
+ "command.model.variant.cycle": "Cycle thinking effort",
64
+ "command.model.variant.cycle.description": "Switch to the next effort level",
65
+ "command.permissions.autoaccept.enable": "Auto-accept edits",
66
+ "command.permissions.autoaccept.disable": "Stop auto-accepting edits",
67
+ "command.session.undo": "Undo",
68
+ "command.session.undo.description": "Undo the last message",
69
+ "command.session.redo": "Redo",
70
+ "command.session.redo.description": "Redo the last undone message",
71
+ "command.session.compact": "Compact session",
72
+ "command.session.compact.description": "Summarize the session to reduce context size",
73
+ "command.session.fork": "Fork from message",
74
+ "command.session.fork.description": "Create a new session from a previous message",
75
+ "command.session.share": "Share session",
76
+ "command.session.share.description": "Share this session and copy the URL to clipboard",
77
+ "command.session.unshare": "Unshare session",
78
+ "command.session.unshare.description": "Stop sharing this session",
79
+
80
+ "palette.search.placeholder": "Search files and commands",
81
+ "palette.empty": "No results found",
82
+ "palette.group.commands": "Commands",
83
+ "palette.group.files": "Files",
84
+
85
+ "dialog.provider.search.placeholder": "Search providers",
86
+ "dialog.provider.empty": "No providers found",
87
+ "dialog.provider.group.popular": "Popular",
88
+ "dialog.provider.group.other": "Other",
89
+ "dialog.provider.tag.recommended": "Recommended",
90
+ "dialog.provider.anthropic.note": "Connect with Claude Pro/Max or API key",
91
+ "dialog.provider.openai.note": "Connect with ChatGPT Pro/Plus or API key",
92
+ "dialog.provider.copilot.note": "Connect with Copilot or API key",
93
+
94
+ "dialog.model.select.title": "Select model",
95
+ "dialog.model.search.placeholder": "Search models",
96
+ "dialog.model.empty": "No model results",
97
+ "dialog.model.manage": "Manage models",
98
+ "dialog.model.manage.description": "Customize which models appear in the model selector.",
99
+
100
+ "dialog.model.unpaid.freeModels.title": "Free models provided by JonsOC",
101
+ "dialog.model.unpaid.addMore.title": "Add more models from popular providers",
102
+
103
+ "dialog.provider.viewAll": "View all providers",
104
+
105
+ "provider.connect.title": "Connect {{provider}}",
106
+ "provider.connect.title.anthropicProMax": "Login with Claude Pro/Max",
107
+ "provider.connect.selectMethod": "Select login method for {{provider}}.",
108
+ "provider.connect.method.apiKey": "API key",
109
+ "provider.connect.status.inProgress": "Authorization in progress...",
110
+ "provider.connect.status.waiting": "Waiting for authorization...",
111
+ "provider.connect.status.failed": "Authorization failed: {{error}}",
112
+ "provider.connect.apiKey.description":
113
+ "Enter your {{provider}} API key to connect your account and use {{provider}} models in JonsOC.",
114
+ "provider.connect.apiKey.label": "{{provider}} API key",
115
+ "provider.connect.apiKey.placeholder": "API key",
116
+ "provider.connect.apiKey.required": "API key is required",
117
+ "provider.connect.jonsocZen.line1":
118
+ "JonsOC Zen gives you access to a curated set of reliable optimized models for coding agents.",
119
+ "provider.connect.jonsocZen.line2":
120
+ "With a single API key you'll get access to models such as Claude, GPT, Gemini, GLM and more.",
121
+ "provider.connect.jonsocZen.visit.prefix": "Visit ",
122
+ "provider.connect.jonsocZen.visit.link": "jonsoc.com/zen",
123
+ "provider.connect.jonsocZen.visit.suffix": " to collect your API key.",
124
+ "provider.connect.oauth.code.visit.prefix": "Visit ",
125
+ "provider.connect.oauth.code.visit.link": "this link",
126
+ "provider.connect.oauth.code.visit.suffix":
127
+ " to collect your authorization code to connect your account and use {{provider}} models in JonsOC.",
128
+ "provider.connect.oauth.code.label": "{{method}} authorization code",
129
+ "provider.connect.oauth.code.placeholder": "Authorization code",
130
+ "provider.connect.oauth.code.required": "Authorization code is required",
131
+ "provider.connect.oauth.code.invalid": "Invalid authorization code",
132
+ "provider.connect.oauth.auto.visit.prefix": "Visit ",
133
+ "provider.connect.oauth.auto.visit.link": "this link",
134
+ "provider.connect.oauth.auto.visit.suffix":
135
+ " and enter the code below to connect your account and use {{provider}} models in JonsOC.",
136
+ "provider.connect.oauth.auto.confirmationCode": "Confirmation code",
137
+ "provider.connect.toast.connected.title": "{{provider}} connected",
138
+ "provider.connect.toast.connected.description": "{{provider}} models are now available to use.",
139
+
140
+ "model.tag.free": "Free",
141
+ "model.tag.latest": "Latest",
142
+ "model.provider.anthropic": "Anthropic",
143
+ "model.provider.openai": "OpenAI",
144
+ "model.provider.google": "Google",
145
+ "model.provider.xai": "xAI",
146
+ "model.provider.meta": "Meta",
147
+ "model.input.text": "text",
148
+ "model.input.image": "image",
149
+ "model.input.audio": "audio",
150
+ "model.input.video": "video",
151
+ "model.input.pdf": "pdf",
152
+ "model.tooltip.allows": "Allows: {{inputs}}",
153
+ "model.tooltip.reasoning.allowed": "Allows reasoning",
154
+ "model.tooltip.reasoning.none": "No reasoning",
155
+ "model.tooltip.context": "Context limit {{limit}}",
156
+
157
+ "common.search.placeholder": "Search",
158
+ "common.goBack": "Go back",
159
+ "common.loading": "Loading",
160
+ "common.loading.ellipsis": "...",
161
+ "common.cancel": "Cancel",
162
+ "common.submit": "Submit",
163
+ "common.save": "Save",
164
+ "common.saving": "Saving...",
165
+ "common.default": "Default",
166
+ "common.attachment": "attachment",
167
+
168
+ "prompt.placeholder.shell": "Enter shell command...",
169
+ "prompt.placeholder.normal": 'Ask anything... "{{example}}"',
170
+ "prompt.mode.shell": "Shell",
171
+ "prompt.mode.shell.exit": "esc to exit",
172
+
173
+ "prompt.example.1": "Fix a TODO in the codebase",
174
+ "prompt.example.2": "What is the tech stack of this project?",
175
+ "prompt.example.3": "Fix broken tests",
176
+ "prompt.example.4": "Explain how authentication works",
177
+ "prompt.example.5": "Find and fix security vulnerabilities",
178
+ "prompt.example.6": "Add unit tests for the user service",
179
+ "prompt.example.7": "Refactor this function to be more readable",
180
+ "prompt.example.8": "What does this error mean?",
181
+ "prompt.example.9": "Help me debug this issue",
182
+ "prompt.example.10": "Generate API documentation",
183
+ "prompt.example.11": "Optimize database queries",
184
+ "prompt.example.12": "Add input validation",
185
+ "prompt.example.13": "Create a new component for...",
186
+ "prompt.example.14": "How do I deploy this project?",
187
+ "prompt.example.15": "Review my code for best practices",
188
+ "prompt.example.16": "Add error handling to this function",
189
+ "prompt.example.17": "Explain this regex pattern",
190
+ "prompt.example.18": "Convert this to TypeScript",
191
+ "prompt.example.19": "Add logging throughout the codebase",
192
+ "prompt.example.20": "What dependencies are outdated?",
193
+ "prompt.example.21": "Help me write a migration script",
194
+ "prompt.example.22": "Implement caching for this endpoint",
195
+ "prompt.example.23": "Add pagination to this list",
196
+ "prompt.example.24": "Create a CLI command for...",
197
+ "prompt.example.25": "How do environment variables work here?",
198
+
199
+ "prompt.popover.emptyResults": "No matching results",
200
+ "prompt.popover.emptyCommands": "No matching commands",
201
+ "prompt.dropzone.label": "Drop images or PDFs here",
202
+ "prompt.slash.badge.custom": "custom",
203
+ "prompt.context.active": "active",
204
+ "prompt.context.includeActiveFile": "Include active file",
205
+ "prompt.context.removeActiveFile": "Remove active file from context",
206
+ "prompt.context.removeFile": "Remove file from context",
207
+ "prompt.action.attachFile": "Attach file",
208
+ "prompt.attachment.remove": "Remove attachment",
209
+ "prompt.action.send": "Send",
210
+ "prompt.action.stop": "Stop",
211
+
212
+ "prompt.toast.pasteUnsupported.title": "Unsupported paste",
213
+ "prompt.toast.pasteUnsupported.description": "Only images or PDFs can be pasted here.",
214
+ "prompt.toast.modelAgentRequired.title": "Select an agent and model",
215
+ "prompt.toast.modelAgentRequired.description": "Choose an agent and model before sending a prompt.",
216
+ "prompt.toast.worktreeCreateFailed.title": "Failed to create worktree",
217
+ "prompt.toast.sessionCreateFailed.title": "Failed to create session",
218
+ "prompt.toast.shellSendFailed.title": "Failed to send shell command",
219
+ "prompt.toast.commandSendFailed.title": "Failed to send command",
220
+ "prompt.toast.promptSendFailed.title": "Failed to send prompt",
221
+
222
+ "dialog.mcp.title": "MCPs",
223
+ "dialog.mcp.description": "{{enabled}} of {{total}} enabled",
224
+ "dialog.mcp.empty": "No MCPs configured",
225
+
226
+ "mcp.status.connected": "connected",
227
+ "mcp.status.failed": "failed",
228
+ "mcp.status.needs_auth": "needs auth",
229
+ "mcp.status.disabled": "disabled",
230
+
231
+ "dialog.fork.empty": "No messages to fork from",
232
+
233
+ "dialog.directory.search.placeholder": "Search folders",
234
+ "dialog.directory.empty": "No folders found",
235
+
236
+ "dialog.server.title": "Servers",
237
+ "dialog.server.description": "Switch which JonsOC server this app connects to.",
238
+ "dialog.server.search.placeholder": "Search servers",
239
+ "dialog.server.empty": "No servers yet",
240
+ "dialog.server.add.title": "Add a server",
241
+ "dialog.server.add.url": "Server URL",
242
+ "dialog.server.add.placeholder": "http://localhost:4096",
243
+ "dialog.server.add.error": "Could not connect to server",
244
+ "dialog.server.add.checking": "Checking...",
245
+ "dialog.server.add.button": "Add",
246
+ "dialog.server.default.title": "Default server",
247
+ "dialog.server.default.description":
248
+ "Connect to this server on app launch instead of starting a local server. Requires restart.",
249
+ "dialog.server.default.none": "No server selected",
250
+ "dialog.server.default.set": "Set current server as default",
251
+ "dialog.server.default.clear": "Clear",
252
+ "dialog.server.action.remove": "Remove server",
253
+
254
+ "dialog.project.edit.title": "Edit project",
255
+ "dialog.project.edit.name": "Name",
256
+ "dialog.project.edit.icon": "Icon",
257
+ "dialog.project.edit.icon.alt": "Project icon",
258
+ "dialog.project.edit.icon.hint": "Click or drag an image",
259
+ "dialog.project.edit.icon.recommended": "Recommended: 128x128px",
260
+ "dialog.project.edit.color": "Color",
261
+ "dialog.project.edit.color.select": "Select {{color}} color",
262
+ "dialog.project.edit.worktree.startup": "Workspace startup script",
263
+ "dialog.project.edit.worktree.startup.description": "Runs after creating a new workspace (worktree).",
264
+ "dialog.project.edit.worktree.startup.placeholder": "e.g. bun install",
265
+
266
+ "context.breakdown.title": "Context Breakdown",
267
+ "context.breakdown.note": 'Approximate breakdown of input tokens. "Other" includes tool definitions and overhead.',
268
+ "context.breakdown.system": "System",
269
+ "context.breakdown.user": "User",
270
+ "context.breakdown.assistant": "Assistant",
271
+ "context.breakdown.tool": "Tool Calls",
272
+ "context.breakdown.other": "Other",
273
+
274
+ "context.systemPrompt.title": "System Prompt",
275
+ "context.rawMessages.title": "Raw messages",
276
+
277
+ "context.stats.session": "Session",
278
+ "context.stats.messages": "Messages",
279
+ "context.stats.provider": "Provider",
280
+ "context.stats.model": "Model",
281
+ "context.stats.limit": "Context Limit",
282
+ "context.stats.totalTokens": "Total Tokens",
283
+ "context.stats.usage": "Usage",
284
+ "context.stats.inputTokens": "Input Tokens",
285
+ "context.stats.outputTokens": "Output Tokens",
286
+ "context.stats.reasoningTokens": "Reasoning Tokens",
287
+ "context.stats.cacheTokens": "Cache Tokens (read/write)",
288
+ "context.stats.userMessages": "User Messages",
289
+ "context.stats.assistantMessages": "Assistant Messages",
290
+ "context.stats.totalCost": "Total Cost",
291
+ "context.stats.sessionCreated": "Session Created",
292
+ "context.stats.lastActivity": "Last Activity",
293
+
294
+ "context.usage.tokens": "Tokens",
295
+ "context.usage.usage": "Usage",
296
+ "context.usage.cost": "Cost",
297
+ "context.usage.clickToView": "Click to view context",
298
+ "context.usage.view": "View context usage",
299
+
300
+ "language.en": "English",
301
+ "language.zh": "Chinese (Simplified)",
302
+ "language.zht": "Chinese (Traditional)",
303
+ "language.ko": "Korean",
304
+ "language.de": "German",
305
+ "language.es": "Spanish",
306
+ "language.fr": "French",
307
+ "language.ja": "Japanese",
308
+ "language.da": "Danish",
309
+ "language.ru": "Russian",
310
+ "language.pl": "Polish",
311
+ "language.ar": "Arabic",
312
+ "language.no": "Norwegian",
313
+ "language.br": "Portuguese (Brazil)",
314
+
315
+ "toast.language.title": "Language",
316
+ "toast.language.description": "Switched to {{language}}",
317
+
318
+ "toast.theme.title": "Theme switched",
319
+ "toast.scheme.title": "Color scheme",
320
+
321
+ "toast.permissions.autoaccept.on.title": "Auto-accepting edits",
322
+ "toast.permissions.autoaccept.on.description": "Edit and write permissions will be automatically approved",
323
+ "toast.permissions.autoaccept.off.title": "Stopped auto-accepting edits",
324
+ "toast.permissions.autoaccept.off.description": "Edit and write permissions will require approval",
325
+
326
+ "toast.model.none.title": "No model selected",
327
+ "toast.model.none.description": "Connect a provider to summarize this session",
328
+
329
+ "toast.file.loadFailed.title": "Failed to load file",
330
+
331
+ "toast.session.share.copyFailed.title": "Failed to copy URL to clipboard",
332
+ "toast.session.share.success.title": "Session shared",
333
+ "toast.session.share.success.description": "Share URL copied to clipboard!",
334
+ "toast.session.share.failed.title": "Failed to share session",
335
+ "toast.session.share.failed.description": "An error occurred while sharing the session",
336
+
337
+ "toast.session.unshare.success.title": "Session unshared",
338
+ "toast.session.unshare.success.description": "Session unshared successfully!",
339
+ "toast.session.unshare.failed.title": "Failed to unshare session",
340
+ "toast.session.unshare.failed.description": "An error occurred while unsharing the session",
341
+
342
+ "toast.session.listFailed.title": "Failed to load sessions for {{project}}",
343
+
344
+ "toast.update.title": "Update available",
345
+ "toast.update.description": "A new version of JonsOC ({{version}}) is now available to install.",
346
+ "toast.update.action.installRestart": "Install and restart",
347
+ "toast.update.action.notYet": "Not yet",
348
+
349
+ "error.page.title": "Something went wrong",
350
+ "error.page.description": "An error occurred while loading the application.",
351
+ "error.page.details.label": "Error Details",
352
+ "error.page.action.restart": "Restart",
353
+ "error.page.action.checking": "Checking...",
354
+ "error.page.action.checkUpdates": "Check for updates",
355
+ "error.page.action.updateTo": "Update to {{version}}",
356
+ "error.page.report.prefix": "Please report this error to the JonsOC team",
357
+ "error.page.report.discord": "on Discord",
358
+ "error.page.version": "Version: {{version}}",
359
+
360
+ "error.dev.rootNotFound":
361
+ "Root element not found. Did you forget to add it to your index.html? Or maybe the id attribute got misspelled?",
362
+
363
+ "error.globalSync.connectFailed": "Could not connect to server. Is there a server running at `{{url}}`?",
364
+
365
+ "error.chain.unknown": "Unknown error",
366
+ "error.chain.causedBy": "Caused by:",
367
+ "error.chain.apiError": "API error",
368
+ "error.chain.status": "Status: {{status}}",
369
+ "error.chain.retryable": "Retryable: {{retryable}}",
370
+ "error.chain.responseBody": "Response body:\n{{body}}",
371
+ "error.chain.didYouMean": "Did you mean: {{suggestions}}",
372
+ "error.chain.modelNotFound": "Model not found: {{provider}}/{{model}}",
373
+ "error.chain.checkConfig": "Check your config (jonsoc.json) provider/model names",
374
+ "error.chain.mcpFailed": 'MCP server "{{name}}" failed. Note, JonsOC does not support MCP authentication yet.',
375
+ "error.chain.providerAuthFailed": "Provider authentication failed ({{provider}}): {{message}}",
376
+ "error.chain.providerInitFailed":
377
+ 'Failed to initialize provider "{{provider}}". Check credentials and configuration.',
378
+ "error.chain.configJsonInvalid": "Config file at {{path}} is not valid JSON(C)",
379
+ "error.chain.configJsonInvalidWithMessage": "Config file at {{path}} is not valid JSON(C): {{message}}",
380
+ "error.chain.configDirectoryTypo":
381
+ 'Directory "{{dir}}" in {{path}} is not valid. Rename the directory to "{{suggestion}}" or remove it. This is a common typo.',
382
+ "error.chain.configFrontmatterError": "Failed to parse frontmatter in {{path}}:\n{{message}}",
383
+ "error.chain.configInvalid": "Config file at {{path}} is invalid",
384
+ "error.chain.configInvalidWithMessage": "Config file at {{path}} is invalid: {{message}}",
385
+
386
+ "notification.permission.title": "Permission required",
387
+ "notification.permission.description": "{{sessionTitle}} in {{projectName}} needs permission",
388
+ "notification.question.title": "Question",
389
+ "notification.question.description": "{{sessionTitle}} in {{projectName}} has a question",
390
+ "notification.action.goToSession": "Go to session",
391
+
392
+ "notification.session.responseReady.title": "Response ready",
393
+ "notification.session.error.title": "Session error",
394
+ "notification.session.error.fallbackDescription": "An error occurred",
395
+
396
+ "home.recentProjects": "Recent projects",
397
+ "home.empty.title": "No recent projects",
398
+ "home.empty.description": "Get started by opening a local project",
399
+
400
+ "session.tab.session": "Session",
401
+ "session.tab.review": "Review",
402
+ "session.tab.context": "Context",
403
+ "session.panel.reviewAndFiles": "Review and files",
404
+ "session.review.filesChanged": "{{count}} Files Changed",
405
+ "session.review.loadingChanges": "Loading changes...",
406
+ "session.review.empty": "No changes in this session yet",
407
+ "session.messages.renderEarlier": "Render earlier messages",
408
+ "session.messages.loadingEarlier": "Loading earlier messages...",
409
+ "session.messages.loadEarlier": "Load earlier messages",
410
+ "session.messages.loading": "Loading messages...",
411
+ "session.messages.jumpToLatest": "Jump to latest",
412
+
413
+ "session.context.addToContext": "Add {{selection}} to context",
414
+
415
+ "session.new.worktree.main": "Main branch",
416
+ "session.new.worktree.mainWithBranch": "Main branch ({{branch}})",
417
+ "session.new.worktree.create": "Create new worktree",
418
+ "session.new.lastModified": "Last modified",
419
+
420
+ "session.header.search.placeholder": "Search {{project}}",
421
+ "session.header.searchFiles": "Search files",
422
+
423
+ "session.share.popover.title": "Publish on web",
424
+ "session.share.popover.description.shared":
425
+ "This session is public on the web. It is accessible to anyone with the link.",
426
+ "session.share.popover.description.unshared":
427
+ "Share session publicly on the web. It will be accessible to anyone with the link.",
428
+ "session.share.action.share": "Share",
429
+ "session.share.action.publish": "Publish",
430
+ "session.share.action.publishing": "Publishing...",
431
+ "session.share.action.unpublish": "Unpublish",
432
+ "session.share.action.unpublishing": "Unpublishing...",
433
+ "session.share.action.view": "View",
434
+ "session.share.copy.copied": "Copied",
435
+ "session.share.copy.copyLink": "Copy link",
436
+
437
+ "lsp.tooltip.none": "No LSP servers",
438
+ "lsp.label.connected": "{{count}} LSP",
439
+
440
+ "prompt.loading": "Loading prompt...",
441
+ "terminal.loading": "Loading terminal...",
442
+ "terminal.title": "Terminal",
443
+ "terminal.title.numbered": "Terminal {{number}}",
444
+ "terminal.close": "Close terminal",
445
+ "terminal.connectionLost.title": "Connection Lost",
446
+ "terminal.connectionLost.description":
447
+ "The terminal connection was interrupted. This can happen when the server restarts.",
448
+
449
+ "common.closeTab": "Close tab",
450
+ "common.dismiss": "Dismiss",
451
+ "common.requestFailed": "Request failed",
452
+ "common.moreOptions": "More options",
453
+ "common.learnMore": "Learn more",
454
+ "common.rename": "Rename",
455
+ "common.reset": "Reset",
456
+ "common.archive": "Archive",
457
+ "common.delete": "Delete",
458
+ "common.close": "Close",
459
+ "common.edit": "Edit",
460
+ "common.loadMore": "Load more",
461
+ "common.key.esc": "ESC",
462
+
463
+ "sidebar.menu.toggle": "Toggle menu",
464
+ "sidebar.nav.projectsAndSessions": "Projects and sessions",
465
+ "sidebar.settings": "Settings",
466
+ "sidebar.help": "Help",
467
+ "sidebar.workspaces.enable": "Enable workspaces",
468
+ "sidebar.workspaces.disable": "Disable workspaces",
469
+ "sidebar.gettingStarted.title": "Getting started",
470
+ "sidebar.gettingStarted.line1": "JonsOC includes free models so you can start immediately.",
471
+ "sidebar.gettingStarted.line2": "Connect any provider to use models, inc. Claude, GPT, Gemini etc.",
472
+ "sidebar.project.recentSessions": "Recent sessions",
473
+ "sidebar.project.viewAllSessions": "View all sessions",
474
+
475
+ "settings.section.desktop": "Desktop",
476
+ "settings.tab.general": "General",
477
+ "settings.tab.shortcuts": "Shortcuts",
478
+
479
+ "settings.general.section.appearance": "Appearance",
480
+ "settings.general.section.notifications": "System notifications",
481
+ "settings.general.section.sounds": "Sound effects",
482
+
483
+ "settings.general.row.language.title": "Language",
484
+ "settings.general.row.language.description": "Change the display language for JonsOC",
485
+ "settings.general.row.appearance.title": "Appearance",
486
+ "settings.general.row.appearance.description": "Customise how JonsOC looks on your device",
487
+ "settings.general.row.theme.title": "Theme",
488
+ "settings.general.row.theme.description": "Customise how JonsOC is themed.",
489
+ "settings.general.row.font.title": "Font",
490
+ "settings.general.row.font.description": "Customise mono font used in code blocks",
491
+ "settings.general.row.navigatorAlwaysOpen.title": "Always show navigator",
492
+ "settings.general.row.navigatorAlwaysOpen.description": "Keep the file navigator always visible",
493
+ "font.option.ibmPlexMono": "IBM Plex Mono",
494
+ "font.option.cascadiaCode": "Cascadia Code",
495
+ "font.option.firaCode": "Fira Code",
496
+ "font.option.hack": "Hack",
497
+ "font.option.inconsolata": "Inconsolata",
498
+ "font.option.intelOneMono": "Intel One Mono",
499
+ "font.option.jetbrainsMono": "JetBrains Mono",
500
+ "font.option.mesloLgs": "Meslo LGS",
501
+ "font.option.robotoMono": "Roboto Mono",
502
+ "font.option.sourceCodePro": "Source Code Pro",
503
+ "font.option.ubuntuMono": "Ubuntu Mono",
504
+ "sound.option.alert01": "Alert 01",
505
+ "sound.option.alert02": "Alert 02",
506
+ "sound.option.alert03": "Alert 03",
507
+ "sound.option.alert04": "Alert 04",
508
+ "sound.option.alert05": "Alert 05",
509
+ "sound.option.alert06": "Alert 06",
510
+ "sound.option.alert07": "Alert 07",
511
+ "sound.option.alert08": "Alert 08",
512
+ "sound.option.alert09": "Alert 09",
513
+ "sound.option.alert10": "Alert 10",
514
+ "sound.option.bipbop01": "Bip-bop 01",
515
+ "sound.option.bipbop02": "Bip-bop 02",
516
+ "sound.option.bipbop03": "Bip-bop 03",
517
+ "sound.option.bipbop04": "Bip-bop 04",
518
+ "sound.option.bipbop05": "Bip-bop 05",
519
+ "sound.option.bipbop06": "Bip-bop 06",
520
+ "sound.option.bipbop07": "Bip-bop 07",
521
+ "sound.option.bipbop08": "Bip-bop 08",
522
+ "sound.option.bipbop09": "Bip-bop 09",
523
+ "sound.option.bipbop10": "Bip-bop 10",
524
+ "sound.option.staplebops01": "Staplebops 01",
525
+ "sound.option.staplebops02": "Staplebops 02",
526
+ "sound.option.staplebops03": "Staplebops 03",
527
+ "sound.option.staplebops04": "Staplebops 04",
528
+ "sound.option.staplebops05": "Staplebops 05",
529
+ "sound.option.staplebops06": "Staplebops 06",
530
+ "sound.option.staplebops07": "Staplebops 07",
531
+ "sound.option.nope01": "Nope 01",
532
+ "sound.option.nope02": "Nope 02",
533
+ "sound.option.nope03": "Nope 03",
534
+ "sound.option.nope04": "Nope 04",
535
+ "sound.option.nope05": "Nope 05",
536
+ "sound.option.nope06": "Nope 06",
537
+ "sound.option.nope07": "Nope 07",
538
+ "sound.option.nope08": "Nope 08",
539
+ "sound.option.nope09": "Nope 09",
540
+ "sound.option.nope10": "Nope 10",
541
+ "sound.option.nope11": "Nope 11",
542
+ "sound.option.nope12": "Nope 12",
543
+ "sound.option.yup01": "Yup 01",
544
+ "sound.option.yup02": "Yup 02",
545
+ "sound.option.yup03": "Yup 03",
546
+ "sound.option.yup04": "Yup 04",
547
+ "sound.option.yup05": "Yup 05",
548
+ "sound.option.yup06": "Yup 06",
549
+
550
+ "settings.general.notifications.agent.title": "Agent",
551
+ "settings.general.notifications.agent.description":
552
+ "Show system notification when the agent is complete or needs attention",
553
+ "settings.general.notifications.permissions.title": "Permissions",
554
+ "settings.general.notifications.permissions.description": "Show system notification when a permission is required",
555
+ "settings.general.notifications.errors.title": "Errors",
556
+ "settings.general.notifications.errors.description": "Show system notification when an error occurs",
557
+
558
+ "settings.general.sounds.agent.title": "Agent",
559
+ "settings.general.sounds.agent.description": "Play sound when the agent is complete or needs attention",
560
+ "settings.general.sounds.permissions.title": "Permissions",
561
+ "settings.general.sounds.permissions.description": "Play sound when a permission is required",
562
+ "settings.general.sounds.errors.title": "Errors",
563
+ "settings.general.sounds.errors.description": "Play sound when an error occurs",
564
+
565
+ "settings.shortcuts.title": "Keyboard shortcuts",
566
+ "settings.shortcuts.reset.button": "Reset to defaults",
567
+ "settings.shortcuts.reset.toast.title": "Shortcuts reset",
568
+ "settings.shortcuts.reset.toast.description": "Keyboard shortcuts have been reset to defaults.",
569
+ "settings.shortcuts.conflict.title": "Shortcut already in use",
570
+ "settings.shortcuts.conflict.description": "{{keybind}} is already assigned to {{titles}}.",
571
+ "settings.shortcuts.unassigned": "Unassigned",
572
+ "settings.shortcuts.pressKeys": "Press keys",
573
+ "settings.shortcuts.search.placeholder": "Search shortcuts",
574
+ "settings.shortcuts.search.empty": "No shortcuts found",
575
+
576
+ "settings.shortcuts.group.general": "General",
577
+ "settings.shortcuts.group.session": "Session",
578
+ "settings.shortcuts.group.navigation": "Navigation",
579
+ "settings.shortcuts.group.modelAndAgent": "Model and agent",
580
+ "settings.shortcuts.group.terminal": "Terminal",
581
+ "settings.shortcuts.group.prompt": "Prompt",
582
+
583
+ "settings.providers.title": "Providers",
584
+ "settings.providers.description": "Provider settings will be configurable here.",
585
+ "settings.models.title": "Models",
586
+ "settings.models.description": "Model settings will be configurable here.",
587
+ "settings.agents.title": "Agents",
588
+ "settings.agents.description": "Agent settings will be configurable here.",
589
+ "settings.commands.title": "Commands",
590
+ "settings.commands.description": "Command settings will be configurable here.",
591
+ "settings.mcp.title": "MCP",
592
+ "settings.mcp.description": "MCP settings will be configurable here.",
593
+
594
+ "settings.permissions.title": "Permissions",
595
+ "settings.permissions.description": "Control what tools the server can use by default.",
596
+ "settings.permissions.section.tools": "Tools",
597
+ "settings.permissions.toast.updateFailed.title": "Failed to update permissions",
598
+
599
+ "settings.permissions.action.allow": "Allow",
600
+ "settings.permissions.action.ask": "Ask",
601
+ "settings.permissions.action.deny": "Deny",
602
+
603
+ "settings.permissions.tool.read.title": "Read",
604
+ "settings.permissions.tool.read.description": "Reading a file (matches the file path)",
605
+ "settings.permissions.tool.edit.title": "Edit",
606
+ "settings.permissions.tool.edit.description": "Modify files, including edits, writes, patches, and multi-edits",
607
+ "settings.permissions.tool.glob.title": "Glob",
608
+ "settings.permissions.tool.glob.description": "Match files using glob patterns",
609
+ "settings.permissions.tool.grep.title": "Grep",
610
+ "settings.permissions.tool.grep.description": "Search file contents using regular expressions",
611
+ "settings.permissions.tool.list.title": "List",
612
+ "settings.permissions.tool.list.description": "List files within a directory",
613
+ "settings.permissions.tool.bash.title": "Bash",
614
+ "settings.permissions.tool.bash.description": "Run shell commands",
615
+ "settings.permissions.tool.task.title": "Task",
616
+ "settings.permissions.tool.task.description": "Launch sub-agents",
617
+ "settings.permissions.tool.skill.title": "Skill",
618
+ "settings.permissions.tool.skill.description": "Load a skill by name",
619
+ "settings.permissions.tool.lsp.title": "LSP",
620
+ "settings.permissions.tool.lsp.description": "Run language server queries",
621
+ "settings.permissions.tool.todoread.title": "Todo Read",
622
+ "settings.permissions.tool.todoread.description": "Read the todo list",
623
+ "settings.permissions.tool.todowrite.title": "Todo Write",
624
+ "settings.permissions.tool.todowrite.description": "Update the todo list",
625
+ "settings.permissions.tool.webfetch.title": "Web Fetch",
626
+ "settings.permissions.tool.webfetch.description": "Fetch content from a URL",
627
+ "settings.permissions.tool.websearch.title": "Web Search",
628
+ "settings.permissions.tool.websearch.description": "Search the web",
629
+ "settings.permissions.tool.codesearch.title": "Code Search",
630
+ "settings.permissions.tool.codesearch.description": "Search code on the web",
631
+ "settings.permissions.tool.external_directory.title": "External Directory",
632
+ "settings.permissions.tool.external_directory.description": "Access files outside the project directory",
633
+ "settings.permissions.tool.doom_loop.title": "Doom Loop",
634
+ "settings.permissions.tool.doom_loop.description": "Detect repeated tool calls with identical input",
635
+
636
+ "session.delete.failed.title": "Failed to delete session",
637
+ "session.delete.title": "Delete session",
638
+ "session.delete.confirm": 'Delete session "{{name}}"?',
639
+ "session.delete.button": "Delete session",
640
+
641
+ "workspace.new": "New workspace",
642
+ "workspace.type.local": "local",
643
+ "workspace.type.sandbox": "sandbox",
644
+ "workspace.create.failed.title": "Failed to create workspace",
645
+ "workspace.delete.failed.title": "Failed to delete workspace",
646
+ "workspace.resetting.title": "Resetting workspace",
647
+ "workspace.resetting.description": "This may take a minute.",
648
+ "workspace.reset.failed.title": "Failed to reset workspace",
649
+ "workspace.reset.success.title": "Workspace reset",
650
+ "workspace.reset.success.description": "Workspace now matches the default branch.",
651
+ "workspace.status.checking": "Checking for unmerged changes...",
652
+ "workspace.status.error": "Unable to verify git status.",
653
+ "workspace.status.clean": "No unmerged changes detected.",
654
+ "workspace.status.dirty": "Unmerged changes detected in this workspace.",
655
+ "workspace.delete.title": "Delete workspace",
656
+ "workspace.delete.confirm": 'Delete workspace "{{name}}"?',
657
+ "workspace.delete.button": "Delete workspace",
658
+ "workspace.reset.title": "Reset workspace",
659
+ "workspace.reset.confirm": 'Reset workspace "{{name}}"?',
660
+ "workspace.reset.button": "Reset workspace",
661
+ "workspace.reset.archived.none": "No active sessions will be archived.",
662
+ "workspace.reset.archived.one": "1 session will be archived.",
663
+ "workspace.reset.archived.many": "{{count}} sessions will be archived.",
664
+ "workspace.reset.note": "This will reset the workspace to match the default branch.",
665
+ }